ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGM4Mzg2MDAuLjkwZmZjZDMgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTEwLDcgKzExMCw5IEBACiAJY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya01hbmFnZW1lbnRFdmVudE9ic2VydmVyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25ldC9JVGhyb3R0bGVNYW5hZ2VyLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1BvbGljeUxpc3RlbmVyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1BvbGljeU1hbmFnZXIuYWlkbCBcCisJY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lOZXR3b3JrU3RhdHNTZXJ2aWNlLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25mYy9JTGxjcENvbm5lY3Rpb25sZXNzU29ja2V0LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25mYy9JTGxjcFNlcnZpY2VTb2NrZXQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lMbGNwU29ja2V0LmFpZGwgXApAQCAtMTIzLDE0ICsxMjUsMTUgQEAKIAljb3JlL2phdmEvYW5kcm9pZC9vcy9JSGFyZHdhcmVTZXJ2aWNlLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL29zL0lNZXNzZW5nZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvb3MvSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5haWRsIFwKLQljb3JlL2phdmEvYW5kcm9pZC9vcy9JTmV0U3RhdFNlcnZpY2UuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvb3MvSVBlcm1pc3Npb25Db250cm9sbGVyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL29zL0lQb3dlck1hbmFnZXIuYWlkbCBcCi0gICAgY29yZS9qYXZhL2FuZHJvaWQvb3MvSVJlbW90ZUNhbGxiYWNrLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL29zL0lSZW1vdGVDYWxsYmFjay5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9vcy9JVmlicmF0b3JTZXJ2aWNlLmFpZGwgXAotICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJDb25uZWN0aW9uLmFpZGwgXAotICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJFbmdpbmUuYWlkbCBcCi0gICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlclNlcnZpY2UuYWlkbCBcCisJY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckNvbm5lY3Rpb24uYWlkbCBcCisJY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckVuZ2luZS5haWRsIFwKKwljb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyU2VydmljZS5haWRsIFwKKwljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24uYWlkbFwKKwljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjay5haWRsXAogCWNvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC92aWV3L0lBcHBsaWNhdGlvblRva2VuLmFpZGwgXApkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IGIxOWJlZDAuLjFlNTlmZjYgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTk4LDYgKzk4LDcgQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL2NvcmUvamF2YS9hbmRyb2lkL25mYykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMpCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJzdGFnZWZyaWdodF9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvY29yZS9qYXZhL2FuZHJvaWQvb3MpCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcGkvMTMueG1sIGIvYXBpLzEzLnhtbAppbmRleCBiOGIxMWZlLi5mZjI3OWUxIDEwMDY0NAotLS0gYS9hcGkvMTMueG1sCisrKyBiL2FwaS8xMy54bWwKQEAgLTExNzUyNyw2ICsxMTc1MjcsMTczIEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJIdHRwUmVzcG9uc2VDYWNoZSIKKyBleHRlbmRzPSJqYXZhLm5ldC5SZXNwb25zZUNhY2hlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uQ2xvc2VhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iY2xvc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZWxldGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmbHVzaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0IgorIHJldHVybj0iamF2YS5uZXQuQ2FjaGVSZXNwb25zZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RNZXRob2QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RIZWFkZXJzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Jmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SGl0Q291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW5zdGFsbGVkIgorIHJldHVybj0iYW5kcm9pZC5uZXQuaHR0cC5IdHRwUmVzcG9uc2VDYWNoZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5ldHdvcmtDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXF1ZXN0Q291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5zdGFsbCIKKyByZXR1cm49ImFuZHJvaWQubmV0Lmh0dHAuSHR0cFJlc3BvbnNlQ2FjaGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGlyZWN0b3J5IiB0eXBlPSJqYXZhLmlvLkZpbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1heFNpemUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im1heFNpemUiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dCIKKyByZXR1cm49ImphdmEubmV0LkNhY2hlUmVxdWVzdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVybENvbm5lY3Rpb24iIHR5cGU9ImphdmEubmV0LlVSTENvbm5lY3Rpb24iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNpemUiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNzbENlcnRpZmljYXRlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpkaWZmIC0tZ2l0IGEvYXBpLzE0LnR4dCBiL2FwaS8xNC50eHQKaW5kZXggYjA4MGQyNS4uYWM5M2FmYiAxMDA2NDQKLS0tIGEvYXBpLzE0LnR4dAorKysgYi9hcGkvMTQudHh0CkBAIC02MjczLDYgKzYyNzMsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEN1cnNvckpvaW5lci5SZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JKb2luZXIuUmVzdWx0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JKb2luZXIuUmVzdWx0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyLlJlc3VsdCBCT1RIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lci5SZXN1bHQgTEVGVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JKb2luZXIuUmVzdWx0IFJJR0hUOwogICB9CiAKICAgcHVibGljIGNsYXNzIEN1cnNvcldpbmRvdyBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKQEAgLTcxOTEsNiArNzE5NCw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQXZvaWRYZmVybW9kZS5Nb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQXZvaWRYZmVybW9kZS5Nb2RlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlLk1vZGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlLk1vZGUgQVZPSUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQXZvaWRYZmVybW9kZS5Nb2RlIFRBUkdFVDsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBCaXRtYXAgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewpAQCAtNzI0MywxMSArNzI0OCwxNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJpdG1hcC5Db21wcmVzc0Zvcm1hdCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db21wcmVzc0Zvcm1hdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0IEpQRUc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0IFBORzsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQml0bWFwLkNvbmZpZyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWdbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnIEFMUEhBXzg7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnIEFSR0JfNDQ0NDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnIEFSR0JfODg4ODsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnIFJHQl81NjU7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQml0bWFwRmFjdG9yeSB7CkBAIC03MzExLDYgKzczMjIsMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCbHVyTWFza0ZpbHRlci5CbHVyIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1ciB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1cltdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJsdXJNYXNrRmlsdGVyLkJsdXIgSU5ORVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1ciBOT1JNQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1ciBPVVRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyIFNPTElEOwogICB9CiAKICAgcHVibGljIGNsYXNzIENhbWVyYSB7CkBAIC03NDI0LDExICs3NDM5LDE2IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2FudmFzLkVkZ2VUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLkVkZ2VUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuRWRnZVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuRWRnZVR5cGUgQUE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLkVkZ2VUeXBlIEJXOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYW52YXMuVmVydGV4TW9kZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5WZXJ0ZXhNb2RlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuVmVydGV4TW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5WZXJ0ZXhNb2RlIFRSSUFOR0xFUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuVmVydGV4TW9kZSBUUklBTkdMRV9GQU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLlZlcnRleE1vZGUgVFJJQU5HTEVfU1RSSVA7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQ29sb3IgewpAQCAtNzU0Myw2ICs3NTYzLDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnRlcnBvbGF0b3IuUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yLlJlc3VsdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yLlJlc3VsdFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvci5SZXN1bHQgRlJFRVpFX0VORDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IuUmVzdWx0IEZSRUVaRV9TVEFSVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IuUmVzdWx0IE5PUk1BTDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBMYXllclJhc3Rlcml6ZXIgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLlJhc3Rlcml6ZXIgewpAQCAtNzYyNiw2ICs3NjQ5LDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWF0cml4LlNjYWxlVG9GaXQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdCBDRU5URVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXQgRU5EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeC5TY2FsZVRvRml0IEZJTEw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXQgU1RBUlQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgTW92aWUgewpAQCAtNzc1NSwxMSArNzc4MiwxNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhaW50LkFsaWduIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ24gdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkFsaWduW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ24gQ0VOVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkFsaWduIExFRlQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ24gUklHSFQ7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhaW50LkNhcCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkNhcCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwIEJVVFQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwIFJPVU5EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkNhcCBTUVVBUkU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhaW50LkZvbnRNZXRyaWNzIHsKQEAgLTc3ODMsMTEgKzc4MTYsMTcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQYWludC5Kb2luIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuSm9pbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuSm9pbltdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkpvaW4gQkVWRUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuSm9pbiBNSVRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Kb2luIFJPVU5EOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQYWludC5TdHlsZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LlN0eWxlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5TdHlsZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LlN0eWxlIEZJTEw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGUgRklMTF9BTkRfU1RST0tFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LlN0eWxlIFNUUk9LRTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBQYWludEZsYWdzRHJhd0ZpbHRlciBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlciB7CkBAIC03ODM5LDExICs3ODc4LDE3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aC5EaXJlY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkRpcmVjdGlvbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5EaXJlY3Rpb25bXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkRpcmVjdGlvbiBDQ1c7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5EaXJlY3Rpb24gQ1c7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGguRmlsbFR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5GaWxsVHlwZSBFVkVOX09ERDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIElOVkVSU0VfRVZFTl9PREQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5GaWxsVHlwZSBJTlZFUlNFX1dJTkRJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5GaWxsVHlwZSBXSU5ESU5HOwogICB9CiAKICAgcHVibGljIGNsYXNzIFBhdGhEYXNoUGF0aEVmZmVjdCBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdCB7CkBAIC03ODUzLDYgKzc4OTgsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGhEYXNoUGF0aEVmZmVjdC5TdHlsZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdC5TdHlsZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIE1PUlBIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdC5TdHlsZSBST1RBVEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIFRSQU5TTEFURTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBQYXRoRWZmZWN0IHsKQEAgLTc5NDksNiArNzk5NywyNCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBvcnRlckR1ZmYuTW9kZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIEFERDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgQ0xFQVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIERBUktFTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgRFNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1RfQVRPUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgRFNUX0lOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1RfT1VUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1RfT1ZFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgTElHSFRFTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgTVVMVElQTFk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIE9WRVJMQVk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIFNDUkVFTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgU1JDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkNfQVRPUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgU1JDX0lOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkNfT1VUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkNfT1ZFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgWE9SOwogICB9CiAKICAgcHVibGljIGNsYXNzIFBvcnRlckR1ZmZDb2xvckZpbHRlciBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXIgewpAQCAtODA5MCw2ICs4MTU2LDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVnaW9uLk9wIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3BbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3AgRElGRkVSRU5DRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3AgSU5URVJTRUNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBSRVBMQUNFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBSRVZFUlNFX0RJRkZFUkVOQ0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIFVOSU9OOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBYT1I7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUmVnaW9uSXRlcmF0b3IgewpAQCAtODEwNiw2ICs4MTc4LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTaGFkZXIuVGlsZU1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIuVGlsZU1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZSBDTEFNUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIuVGlsZU1vZGUgTUlSUk9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZSBSRVBFQVQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU3VtUGF0aEVmZmVjdCBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdCB7CkBAIC04MzgwLDYgKzg0NTUsMTQgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbltdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gQkxfVFI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBCT1RUT01fVE9QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gQlJfVEw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBMRUZUX1JJR0hUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gUklHSFRfTEVGVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIFRMX0JSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gVE9QX0JPVFRPTTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIFRSX0JMOwogICB9CiAKICAgcHVibGljIGNsYXNzIEluc2V0RHJhd2FibGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGltcGxlbWVudHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5DYWxsYmFjayB7CkBAIC0xMDgxMiw2ICsxMDg5NSw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTG9jYWxTb2NrZXRBZGRyZXNzLk5hbWVzcGFjZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzLk5hbWVzcGFjZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlIEFCU1RSQUNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlIEZJTEVTWVNURU07CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcy5OYW1lc3BhY2UgUkVTRVJWRUQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgTWFpbFRvIHsKQEAgLTEwODQ2LDExICsxMDkzMiwyNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBBVVRIRU5USUNBVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBDT05ORUNURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgQ09OTkVDVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBESVNDT05ORUNURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgRElTQ09OTkVDVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBGQUlMRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgSURMRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBPQlRBSU5JTkdfSVBBRERSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIFNDQU5OSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIFNVU1BFTkRFRDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTmV0d29ya0luZm8uU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSBDT05ORUNURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlIENPTk5FQ1RJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlIERJU0NPTk5FQ1RFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGUgRElTQ09OTkVDVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGUgU1VTUEVOREVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSBVTktOT1dOOwogICB9CiAKICAgcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gewpAQCAtMTEzNjMsNiArMTE0NjUsMTcgQEAKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlW10gdmFsdWVzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIEFTU09DSUFURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIEFTU09DSUFUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBDT01QTEVURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIERJU0NPTk5FQ1RFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgRE9STUFOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgRk9VUl9XQVlfSEFORFNIQUtFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBHUk9VUF9IQU5EU0hBS0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIElOQUNUSVZFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBJTlZBTElEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBTQ0FOTklORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgVU5JTklUSUFMSVpFRDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBXaWZpQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CkBAIC0xMzE4NCw2ICsxMzI5Nyw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQXN5bmNUYXNrLlN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5Bc3luY1Rhc2suU3RhdHVzIEZJTklTSEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXMgUEVORElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5Bc3luY1Rhc2suU3RhdHVzIFJVTk5JTkc7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbiB7CkBAIC0xNjE1OSw2ICsxNjI3NSw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24uTWlwbWFwQ29udHJvbCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24uTWlwbWFwQ29udHJvbFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uLk1pcG1hcENvbnRyb2wgTUlQTUFQX0ZVTEw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24uTWlwbWFwQ29udHJvbCBNSVBNQVBfTk9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sIE1JUE1BUF9PTl9TWU5DX1RPX1RFWFRVUkU7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQWxsb2NhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uIHsKQEAgLTE2MjU2LDExICsxNjM3NSw0NSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVsZW1lbnQuRGF0YUtpbmQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCBQSVhFTF9BOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX0RFUFRIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX0w7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgUElYRUxfTEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgUElYRUxfUkdCOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX1JHQkE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgVVNFUjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRWxlbWVudC5EYXRhVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIEJPT0xFQU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgRkxPQVRfMzI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgRkxPQVRfNjQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgTUFUUklYXzJYMjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBNQVRSSVhfM1gzOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIE1BVFJJWF80WDQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfQUxMT0NBVElPTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19FTEVNRU5UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX01FU0g7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19QUk9HUkFNX1JBU1RFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19QUk9HUkFNX1NUT1JFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1BST0dSQU1fVkVSVEVYOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1NBTVBMRVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfU0NSSVBUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1RZUEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgU0lHTkVEXzE2OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFNJR05FRF8zMjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBTSUdORURfNjQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgU0lHTkVEXzg7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfMTY7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfMzI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfNF80XzRfNDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBVTlNJR05FRF81XzVfNV8xOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzVfNl81OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzY0OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzg7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgRmllbGRQYWNrZXIgewpAQCAtMTYzMjAsNiArMTY0NzMsOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVBM0QuRW50cnlUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZpbGVBM0QuRW50cnlUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmlsZUEzRC5FbnRyeVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmlsZUEzRC5FbnRyeVR5cGUgTUVTSDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmlsZUEzRC5FbnRyeVR5cGUgVU5LTk9XTjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZUEzRC5JbmRleEVudHJ5IHsKQEAgLTE2MzY0LDYgKzE2NTE5LDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRm9udC5TdHlsZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRm9udC5TdHlsZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIEJPTEQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZvbnQuU3R5bGUgQk9MRF9JVEFMSUM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZvbnQuU3R5bGUgSVRBTElDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIE5PUk1BTDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBJbnQyIHsKQEAgLTE2NTA3LDYgKzE2NjY2LDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWVzaC5QcmltaXRpdmUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBMSU5FOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBMSU5FX1NUUklQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBQT0lOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgVFJJQU5HTEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2guUHJpbWl0aXZlIFRSSUFOR0xFX0ZBTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgVFJJQU5HTEVfU1RSSVA7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlciB7CkBAIC0xNjU0Myw2ICsxNjcwOCw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbS5UZXh0dXJlVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtLlRleHR1cmVUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbS5UZXh0dXJlVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtLlRleHR1cmVUeXBlIFRFWFRVUkVfMkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW0uVGV4dHVyZVR5cGUgVEVYVFVSRV9DVUJFOwogICB9CiAKICAgcHVibGljIGNsYXNzIFByb2dyYW1GcmFnbWVudCBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW0gewpAQCAtMTY1NjgsMTEgKzE2NzM1LDE4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRW52TW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRW52TW9kZSBERUNBTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgTU9EVUxBVEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5FbnZNb2RlIFJFUExBQ0U7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCBBTFBIQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCBMVU1JTkFOQ0VfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQgUkdCOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRm9ybWF0IFJHQkE7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUHJvZ3JhbVJhc3RlciBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LkJhc2VPYmogewpAQCAtMTY1OTEsNiArMTY3NjUsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1SYXN0ZXIuQ3VsbE1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVJhc3Rlci5DdWxsTW9kZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1SYXN0ZXIuQ3VsbE1vZGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVJhc3Rlci5DdWxsTW9kZSBCQUNLOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtUmFzdGVyLkN1bGxNb2RlIEZST05UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtUmFzdGVyLkN1bGxNb2RlIE5PTkU7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUHJvZ3JhbVN0b3JlIGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQmFzZU9iaiB7CkBAIC0xNjYwMywxMSArMTY3ODAsMjggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIE9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBPTkVfTUlOVVNfRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIE9ORV9NSU5VU19TUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgT05FX01JTlVTX1NSQ19DT0xPUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBTUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgU1JDX0NPTE9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIFpFUk87CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBEU1RfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgRFNUX0NPTE9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIE9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBPTkVfTUlOVVNfRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIE9ORV9NSU5VU19EU1RfQ09MT1I7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgT05FX01JTlVTX1NSQ19BTFBIQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBTUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgU1JDX0FMUEhBX1NBVFVSQVRFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIFpFUk87CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2dyYW1TdG9yZS5CdWlsZGVyIHsKQEAgLTE2NjIzLDYgKzE2ODE3LDEzIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuY1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIEFMV0FZUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBFUVVBTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBHUkVBVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIEdSRUFURVJfT1JfRVFVQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmMgTEVTUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBMRVNTX09SX0VRVUFMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIE5PVF9FUVVBTDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtVmVydGV4IGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbSB7CkBAIC0xNjY5OCw2ICsxNjg5OSw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVuZGVyU2NyaXB0LlByaW9yaXR5IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdC5Qcmlvcml0eSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdC5Qcmlvcml0eVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUHJpb3JpdHkgTE9XOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUHJpb3JpdHkgTk9STUFMOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZW5kZXJTY3JpcHQuUlNFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUgewpAQCAtMTY3NjAsNiArMTY5NjMsMTIgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTYW1wbGVyLlZhbHVlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgQ0xBTVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgTElORUFSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIExJTkVBUl9NSVBfTElORUFSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIExJTkVBUl9NSVBfTkVBUkVTVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZSBORUFSRVNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIFdSQVA7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU2NyaXB0IGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQmFzZU9iaiB7CkBAIC0xNjgzOSw2ICsxNzA0OCwxMiBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFR5cGUuQ3ViZW1hcEZhY2UgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2VbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSBORUdBVElWRV9YOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIE5FR0FUSVZFX1k7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2UgTkVHQVRJVkVfWjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSBQT1NJVFZFX1g7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2UgUE9TSVRWRV9ZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIFBPU0lUVkVfWjsKICAgfQogCiB9CkBAIC0xNzI4Nyw2ICsxNzUwMiwxMSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3NbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgVU5LTk9XTjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU21zTWVzc2FnZS5TdWJtaXRQZHUgewpAQCAtMTc0NTgsNiArMTc2NzgsMTEgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGNsYXNzIFNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzc1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyBDTEFTU18yOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIFVOS05PV047CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGRlcHJlY2F0ZWQgY2xhc3MgU21zTWVzc2FnZS5TdWJtaXRQZHUgewpAQCAtMTgyOTIsNiArMTg1MTcsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIExheW91dC5BbGlnbm1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudCBBTElHTl9DRU5URVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQuQWxpZ25tZW50IEFMSUdOX05PUk1BTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQgQUxJR05fT1BQT1NJVEU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIExheW91dC5EaXJlY3Rpb25zIHsKQEAgLTE4NTQ5LDYgKzE4Nzc3LDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGV4dFV0aWxzLlRydW5jYXRlQXQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdCBFTkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdCBNQVJRVUVFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQgTUlERExFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQgU1RBUlQ7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIFRleHRXYXRjaGVyIGltcGxlbWVudHMgYW5kcm9pZC50ZXh0Lk5vQ29weVNwYW4gewpAQCAtMTg5MzQsNiArMTkxNjYsMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplIENIQVJBQ1RFUlM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemUgTk9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZSBTRU5URU5DRVM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemUgV09SRFM7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgVGltZUtleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5OdW1iZXJLZXlMaXN0ZW5lciB7CkBAIC0xOTQ4Myw2ICsxOTcxOSwxNiBAQAogICBwdWJsaWMgZmluYWwgY2xhc3MgSnNvblRva2VuIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gQkVHSU5fQVJSQVk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gQkVHSU5fT0JKRUNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIEJPT0xFQU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gRU5EX0FSUkFZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIEVORF9ET0NVTUVOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBFTkRfT0JKRUNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIE5BTUU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gTlVMTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBOVU1CRVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gU1RSSU5HOwogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIEpzb25Xcml0ZXIgaW1wbGVtZW50cyBqYXZhLmlvLkNsb3NlYWJsZSB7CkBAIC0xOTc3Miw2ICsyMDAxOCwxMCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFhtbC5FbmNvZGluZyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnV0aWwuWG1sLkVuY29kaW5nIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlhtbC5FbmNvZGluZ1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sLkVuY29kaW5nIElTT184ODU5XzE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5YbWwuRW5jb2RpbmcgVVNfQVNDSUk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5YbWwuRW5jb2RpbmcgVVRGXzE2OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sLkVuY29kaW5nIFVURl84OwogICB9CiAKIH0KQEAgLTIxNDI0LDYgKzIxNjc0LDE0IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIEJVSUxEX0NBQ0hFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBEUkFXOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBJTlZBTElEQVRFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBJTlZBTElEQVRFX0NISUxEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBJTlZBTElEQVRFX0NISUxEX0lOX1BBUkVOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgT05fTEFZT1VUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBPTl9NRUFTVVJFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBSRVFVRVNUX0xBWU9VVDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVmlld0RlYnVnLkludFRvU3RyaW5nIGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiB7CkBAIC0yMTQzMiw2ICsyMTY5MCwxMiBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIEJJTkRfVklFVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZSBNT1ZFX0ZST01fQUNUSVZFX1RPX1NDUkFQX0hFQVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgTU9WRV9UT19TQ1JBUF9IRUFQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIE5FV19WSUVXOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIFJFQ1lDTEVfRlJPTV9BQ1RJVkVfSEVBUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZSBSRUNZQ0xFX0ZST01fU0NSQVBfSEVBUDsKICAgfQogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaWV3R3JvdXAgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlldyBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3TWFuYWdlciBhbmRyb2lkLnZpZXcuVmlld1BhcmVudCB7CkBAIC0yMTk4NiwxMCArMjIyNTAsOCBAQAogCiAgIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5UmVjb3JkIHsKICAgICBjdG9yIHByb3RlY3RlZCBBY2Nlc3NpYmlsaXR5UmVjb3JkKCk7Ci0gICAgbWV0aG9kIHByb3RlY3RlZCB2b2lkIGNsZWFyKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0QWRkZWRDb3VudCgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRCZWZvcmVUZXh0KCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDbGFzc05hbWUoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEl0ZW1JbmRleCgpOwpAQCAtMjI2NDAsNiArMjI5MDIsMTEgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCBERUJVRzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsIEVSUk9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgTE9HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgVElQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgV0FSTklORzsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBDb29raWVNYW5hZ2VyIHsKQEAgLTIyOTIyLDI2ICsyMzE4OSw0MyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgY2xhc3MgV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0gTkFSUk9XX0NPTFVNTlM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSBOT1JNQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSBTSU5HTEVfQ09MVU1OOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXZWJTZXR0aW5ncy5QbHVnaW5TdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5QbHVnaW5TdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlIE9GRjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUGx1Z2luU3RhdGUgT047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlIE9OX0RFTUFORDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV2ViU2V0dGluZ3MuUmVuZGVyUHJpb3JpdHkgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUmVuZGVyUHJpb3JpdHkgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eSBISUdIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eSBMT1c7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlJlbmRlclByaW9yaXR5IE5PUk1BTDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV2ViU2V0dGluZ3MuVGV4dFNpemUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZSBMQVJHRVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplIExBUkdFU1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplIE5PUk1BTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgU01BTExFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgU01BTExFU1Q7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFdlYlNldHRpbmdzLlpvb21EZW5zaXR5IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlpvb21EZW5zaXR5IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuWm9vbURlbnNpdHlbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuWm9vbURlbnNpdHkgQ0xPU0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlpvb21EZW5zaXR5IEZBUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuWm9vbURlbnNpdHkgTUVESVVNOwogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIFdlYlN0b3JhZ2UgewpAQCAtMjQwMDgsNiArMjQyOTIsMTQgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbWFnZVZpZXcuU2NhbGVUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgQ0VOVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIENFTlRFUl9DUk9QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIENFTlRFUl9JTlNJREU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgRklUX0NFTlRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBGSVRfRU5EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIEZJVF9TVEFSVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBGSVRfWFk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgTUFUUklYOwogICB9CiAKICAgcHVibGljIGNsYXNzIExpbmVhckxheW91dCBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAgewpAQCAtMjUwNjQsNiArMjUzNTYsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRleHRWaWV3LkJ1ZmZlclR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZSBFRElUQUJMRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZSBOT1JNQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGUgU1BBTk5BQkxFOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgVGV4dFZpZXcuT25FZGl0b3JBY3Rpb25MaXN0ZW5lciB7CkBAIC0yODA1Miw2ICsyODM0NywxMiBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRocmVhZC5TdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZC5TdGF0ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIEJMT0NLRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQuU3RhdGUgTkVXOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIFJVTk5BQkxFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIFRFUk1JTkFURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQuU3RhdGUgVElNRURfV0FJVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZC5TdGF0ZSBXQUlUSU5HOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgVGhyZWFkLlVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlciB7CkBAIC0yODE4NSw2ICsyODQ4NiwxNCBAQAogICBwdWJsaWMgZmluYWwgY2xhc3MgRWxlbWVudFR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBBTk5PVEFUSU9OX1RZUEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIENPTlNUUlVDVE9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBGSUVMRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgTE9DQUxfVkFSSUFCTEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIE1FVEhPRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgUEFDS0FHRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgUEFSQU1FVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBUWVBFOwogICB9CiAKICAgcHVibGljIGNsYXNzIEluY29tcGxldGVBbm5vdGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gewpAQCAtMjgyMDIsNiArMjg1MTEsOSBAQAogICBwdWJsaWMgZmluYWwgY2xhc3MgUmV0ZW50aW9uUG9saWN5IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kgQ0xBU1M7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeSBSVU5USU1FOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kgU09VUkNFOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRhcmdldCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24gewpAQCAtMjg2MTUsNiArMjg5MjcsMTQgQEAKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLm1hdGguUm91bmRpbmdNb2RlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSB2YWx1ZU9mKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIENFSUxJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgRE9XTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBGTE9PUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBIQUxGX0RPV047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgSEFMRl9FVkVOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIEhBTEZfVVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgVU5ORUNFU1NBUlk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgVVA7CiAgIH0KIAogfQpAQCAtMjg2NDEsNiArMjg5NjEsOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEF1dGhlbnRpY2F0b3IuUmVxdWVzdG9yVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuQXV0aGVudGljYXRvci5SZXF1ZXN0b3JUeXBlIFBST1hZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUgU0VSVkVSOwogICB9CiAKICAgcHVibGljIGNsYXNzIEJpbmRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24gewpAQCAtMjkwNTUsNiArMjkzNzcsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3h5LlR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5uZXQuUHJveHkuVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5LlR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkuVHlwZSBESVJFQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5LlR5cGUgSFRUUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkuVHlwZSBTT0NLUzsKICAgfQogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm94eVNlbGVjdG9yIHsKQEAgLTMwNDUxLDYgKzMwNzc2LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBLZXlSZXAuVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVJlcC5UeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5LZXlSZXAuVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LktleVJlcC5UeXBlIFBSSVZBVEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5UmVwLlR5cGUgUFVCTElDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LktleVJlcC5UeXBlIFNFQ1JFVDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBLZXlTdG9yZSB7CkBAIC0zMTgyNCw2ICszMjE1MiwxMCBAQAogICBwdWJsaWMgZmluYWwgY2xhc3MgQ2xpZW50SW5mb1N0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1c1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIFJFQVNPTl9VTktOT1dOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIFJFQVNPTl9VTktOT1dOX1BST1BFUlRZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIFJFQVNPTl9WQUxVRV9JTlZBTElEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIFJFQVNPTl9WQUxVRV9UUlVOQ0FURUQ7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIENsb2IgewpAQCAtMzI1MDgsNiArMzI4NDAsMTEgQEAKICAgcHVibGljIGZpbmFsIGNsYXNzIFJvd0lkTGlmZXRpbWUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5zcWwuUm93SWRMaWZldGltZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLlJvd0lkTGlmZXRpbWVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuUm93SWRMaWZldGltZSBST1dJRF9VTlNVUFBPUlRFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuUm93SWRMaWZldGltZSBST1dJRF9WQUxJRF9GT1JFVkVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIFJPV0lEX1ZBTElEX09USEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIFJPV0lEX1ZBTElEX1NFU1NJT047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLlJvd0lkTGlmZXRpbWUgUk9XSURfVkFMSURfVFJBTlNBQ1RJT047CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiBleHRlbmRzIGphdmEuc3FsLlNRTEV4Y2VwdGlvbiB7CkBAIC0zMzI5Nyw2ICszMzYzNCwxMCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE5vcm1hbGl6ZXIuRm9ybSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtIE5GQzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybSBORkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm0gTkZLQzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybSBORktEOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGNsYXNzIE51bWJlckZvcm1hdCBleHRlbmRzIGphdmEudGV4dC5Gb3JtYXQgewpAQCAtMzQwMzgsNiArMzQzNzksOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZvcm1hdHRlci5CaWdEZWNpbWFsTGF5b3V0Rm9ybSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRm9ybWF0dGVyLkJpZ0RlY2ltYWxMYXlvdXRGb3JtIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkZvcm1hdHRlci5CaWdEZWNpbWFsTGF5b3V0Rm9ybVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuRm9ybWF0dGVyLkJpZ0RlY2ltYWxMYXlvdXRGb3JtIERFQ0lNQUxfRkxPQVQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIuQmlnRGVjaW1hbExheW91dEZvcm0gU0NJRU5USUZJQzsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewpAQCAtMzU0ODQsNiArMzU4MjcsMTMgQEAKICAgICBtZXRob2QgcHVibGljIGxvbmcgdG9TZWNvbmRzKGxvbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgREFZUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgSE9VUlM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IE1JQ1JPU0VDT05EUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgTUlMTElTRUNPTkRTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBNSU5VVEVTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBOQU5PU0VDT05EUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgU0VDT05EUzsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBUaW1lb3V0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CkBAIC0zODE0MCwxMSArMzg0OTAsMjAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1c1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgRklOSVNIRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBORUVEX1RBU0s7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBORUVEX1VOV1JBUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIE5FRURfV1JBUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIE5PVF9IQU5EU0hBS0lORzsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5TdGF0dXNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuU3RhdHVzIEJVRkZFUl9PVkVSRkxPVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuU3RhdHVzIEJVRkZFUl9VTkRFUkZMT1c7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBDTE9TRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBPSzsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBTU0xFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKQEAgLTQwNjU4LDExICs0MTAxNywxNSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mby5MYXllclR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uTGF5ZXJUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uTGF5ZXJUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLkxheWVyVHlwZSBMQVlFUkVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5MYXllclR5cGUgUExBSU47CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mby5UdW5uZWxUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLlR1bm5lbFR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5UdW5uZWxUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLlR1bm5lbFR5cGUgUExBSU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLlR1bm5lbFR5cGUgVFVOTkVMTEVEOwogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIFJvdXRlVHJhY2tlciBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8gewpkaWZmIC0tZ2l0IGEvYXBpL2N1cnJlbnQudHh0IGIvYXBpL2N1cnJlbnQudHh0CmluZGV4IGZkZWYyMGYuLjg1MmE1MzMgMTAwNjQ0Ci0tLSBhL2FwaS9jdXJyZW50LnR4dAorKysgYi9hcGkvY3VycmVudC50eHQKQEAgLTkwLDYgKzkwLDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVNT1ZFX1RBU0tTID0gImFuZHJvaWQucGVybWlzc2lvbi5SRU1PVkVfVEFTS1MiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRU9SREVSX1RBU0tTID0gImFuZHJvaWQucGVybWlzc2lvbi5SRU9SREVSX1RBU0tTIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgamF2YS5sYW5nLlN0cmluZyBSRVNUQVJUX1BBQ0tBR0VTID0gImFuZHJvaWQucGVybWlzc2lvbi5SRVNUQVJUX1BBQ0tBR0VTIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVUUklFVkVfV0lORE9XX0NPTlRFTlQgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFVFJJRVZFX1dJTkRPV19DT05URU5UIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VORF9TTVMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlNFTkRfU01TIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX0FDVElWSVRZX1dBVENIRVIgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BQ1RJVklUWV9XQVRDSEVSIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX0FMQVJNID0gImNvbS5hbmRyb2lkLmFsYXJtLnBlcm1pc3Npb24uU0VUX0FMQVJNIjsKQEAgLTk3LDYgKzk4LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX0FOSU1BVElPTl9TQ0FMRSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX0FOSU1BVElPTl9TQ0FMRSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVF9ERUJVR19BUFAgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9ERUJVR19BUFAiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRfT1JJRU5UQVRJT04gPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9PUklFTlRBVElPTiI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVF9QT0lOVEVSX1NQRUVEID0gImFuZHJvaWQucGVybWlzc2lvbi5TRVRfUE9JTlRFUl9TUEVFRCI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGphdmEubGFuZy5TdHJpbmcgU0VUX1BSRUZFUlJFRF9BUFBMSUNBVElPTlMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9QUkVGRVJSRURfQVBQTElDQVRJT05TIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX1BST0NFU1NfTElNSVQgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9QUk9DRVNTX0xJTUlUIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX1RJTUUgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9USU1FIjsKQEAgLTE3OSw2ICsxODEsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFIuYXR0ciB7CiAgICAgY3RvciBwdWJsaWMgUi5hdHRyKCk7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWJzTGlzdFZpZXdTdHlsZSA9IDE2ODQyODU4OyAvLyAweDEwMTAwNmEKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY2Nlc3NpYmlsaXR5RXZlbnRUeXBlcyA9IDE2ODQzNjQ3OyAvLyAweDEwMTAzN2YKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY2Nlc3NpYmlsaXR5RmVlZGJhY2tUeXBlID0gMTY4NDM2NDk7IC8vIDB4MTAxMDM4MQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjY2Vzc2liaWxpdHlGbGFncyA9IDE2ODQzNjUxOyAvLyAweDEwMTAzODMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY2NvdW50UHJlZmVyZW5jZXMgPSAxNjg0MzQyMzsgLy8gMHgxMDEwMjlmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWNjb3VudFR5cGUgPSAxNjg0MzQwNzsgLy8gMHgxMDEwMjhmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uID0gMTY4NDI3OTc7IC8vIDB4MTAxMDAyZApAQCAtMTk4LDYgKzIwMyw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uTW9kZUNvcHlEcmF3YWJsZSA9IDE2ODQzNTM4OyAvLyAweDEwMTAzMTIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY3Rpb25Nb2RlQ3V0RHJhd2FibGUgPSAxNjg0MzUzNzsgLy8gMHgxMDEwMzExCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uTW9kZVBhc3RlRHJhd2FibGUgPSAxNjg0MzUzOTsgLy8gMHgxMDEwMzEzCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uTW9kZVNlbGVjdEFsbERyYXdhYmxlID0gMTY4NDM2NDU7IC8vIDB4MTAxMDM3ZAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUgPSAxNjg0MzUxMDsgLy8gMHgxMDEwMmY2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uVmlld0NsYXNzID0gMTY4NDM1MTY7IC8vIDB4MTAxMDJmYwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IgPSAxNjg0MzUxNzsgLy8gMHgxMDEwMmZkCkBAIC0yNjksNiArMjc1LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjYWNoZUNvbG9ySGludCA9IDE2ODQzMDA5OyAvLyAweDEwMTAxMDEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjYWxlbmRhclZpZXdTaG93biA9IDE2ODQzNTk2OyAvLyAweDEwMTAzNGMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjYWxlbmRhclZpZXdTdHlsZSA9IDE2ODQzNjEzOyAvLyAweDEwMTAzNWQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQgPSAxNjg0MzY1MjsgLy8gMHgxMDEwMzg0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2FuZGlkYXRlc1RleHRTdHlsZVNwYW5zID0gMTY4NDMzMTI7IC8vIDB4MTAxMDIzMAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBpbnQgY2FwaXRhbGl6ZSA9IDE2ODQzMTEzOyAvLyAweDEwMTAxNjkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjZW50ZXJCcmlnaHQgPSAxNjg0Mjk1NjsgLy8gMHgxMDEwMGNjCkBAIC0zMDEsMTAgKzMwOCwxMSBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbG9yQmFja2dyb3VuZENhY2hlSGludCA9IDE2ODQzNDM1OyAvLyAweDEwMTAyYWIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2xvckZvcmVncm91bmQgPSAxNjg0MjgwMDsgLy8gMHgxMDEwMDMwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sb3JGb3JlZ3JvdW5kSW52ZXJzZSA9IDE2ODQzMjcwOyAvLyAweDEwMTAyMDYKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5Db3VudCA9IDE2ODQzNjMzOyAvLyAweDEwMTAzNzEKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5Db3VudCA9IDE2ODQzNjM2OyAvLyAweDEwMTAzNzQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5EZWxheSA9IDE2ODQzMjE1OyAvLyAweDEwMTAxY2YKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5PcmRlclByZXNlcnZlZCA9IDE2ODQzNjM0OyAvLyAweDEwMTAzNzIKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5PcmRlclByZXNlcnZlZCA9IDE2ODQzNjM3OyAvLyAweDEwMTAzNzUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5XaWR0aCA9IDE2ODQzMDMxOyAvLyAweDEwMTAxMTcKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wYXRpYmxlV2lkdGhMaW1pdERwID0gMTY4NDM2MjE7IC8vIDB4MTAxMDM2NQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBsZXRpb25IaW50ID0gMTY4NDMxMjI7IC8vIDB4MTAxMDE3MgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBsZXRpb25IaW50VmlldyA9IDE2ODQzMTIzOyAvLyAweDEwMTAxNzMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wbGV0aW9uVGhyZXNob2xkID0gMTY4NDMxMjQ7IC8vIDB4MTAxMDE3NApAQCAtNDQ3LDcgKzQ1NSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnJvbVhTY2FsZSA9IDE2ODQzMjAyOyAvLyAweDEwMTAxYzIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcm9tWURlbHRhID0gMTY4NDMyMDg7IC8vIDB4MTAxMDFjOAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZyb21ZU2NhbGUgPSAxNjg0MzIwNDsgLy8gMHgxMDEwMWM0Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnVsbEJhY2t1cEFnZW50ID0gMTY4NDM2Mjk7IC8vIDB4MTAxMDM2ZAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZ1bGxCYWNrdXBBZ2VudCA9IDE2ODQzNjMyOyAvLyAweDEwMTAzNzAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmdWxsQnJpZ2h0ID0gMTY4NDI5NTQ7IC8vIDB4MTAxMDBjYQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZ1bGxEYXJrID0gMTY4NDI5NTA7IC8vIDB4MTAxMDBjNgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZ1bmN0aW9uYWxUZXN0ID0gMTY4NDI3ODc7IC8vIDB4MTAxMDAyMwpAQCAtNDc4LDcgKzQ4Niw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGludCA9IDE2ODQzMDg4OyAvLyAweDEwMTAxNTAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBob21lQXNVcEluZGljYXRvciA9IDE2ODQzNTMxOyAvLyAweDEwMTAzMGIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBob21lTGF5b3V0ID0gMTY4NDM1NDk7IC8vIDB4MTAxMDMxZAotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhvcml6b250YWxEaXJlY3Rpb24gPSAxNjg0MzYyODsgLy8gMHgxMDEwMzZjCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9yaXpvbnRhbERpcmVjdGlvbiA9IDE2ODQzNjMxOyAvLyAweDEwMTAzNmYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBob3Jpem9udGFsRGl2aWRlciA9IDE2ODQzMDUzOyAvLyAweDEwMTAxMmQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBob3Jpem9udGFsR2FwID0gMTY4NDMzMjc7IC8vIDB4MTAxMDIzZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhvcml6b250YWxTY3JvbGxWaWV3U3R5bGUgPSAxNjg0MzYwMzsgLy8gMHgxMDEwMzUzCkBAIC01MjYsNiArNTM0LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbnN0YWxsTG9jYXRpb24gPSAxNjg0MzQ0NzsgLy8gMHgxMDEwMmI3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW50ZXJwb2xhdG9yID0gMTY4NDMwNzM7IC8vIDB4MTAxMDE0MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlzQWx3YXlzU3luY2FibGUgPSAxNjg0MzU3MTsgLy8gMHgxMDEwMzMzCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaXNBdXhpbGlhcnkgPSAxNjg0MzY0NjsgLy8gMHgxMDEwMzdlCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaXNEZWZhdWx0ID0gMTY4NDMyOTc7IC8vIDB4MTAxMDIyMQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlzSW5kaWNhdG9yID0gMTY4NDMwNzk7IC8vIDB4MTAxMDE0NwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlzTW9kaWZpZXIgPSAxNjg0MzMzNDsgLy8gMHgxMDEwMjQ2CkBAIC01NTcsNiArNTY2LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYWJlbFRleHRTaXplID0gMTY4NDMzMTc7IC8vIDB4MTAxMDIzNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhcmdlSGVhcCA9IDE2ODQzNjEwOyAvLyAweDEwMTAzNWEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXJnZVNjcmVlbnMgPSAxNjg0MzM5ODsgLy8gMHgxMDEwMjg2CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGFyZ2VzdFdpZHRoTGltaXREcCA9IDE2ODQzNjIyOyAvLyAweDEwMTAzNjYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXVuY2hNb2RlID0gMTY4NDI3ODE7IC8vIDB4MTAxMDAxZAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheWVyVHlwZSA9IDE2ODQzNjA0OyAvLyAweDEwMTAzNTQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXQgPSAxNjg0Mjk5NDsgLy8gMHgxMDEwMGYyCkBAIC01NzcsOCArNTg3LDggQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfY2VudGVySW5QYXJlbnQgPSAxNjg0MzE1MTsgLy8gMHgxMDEwMThmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2NlbnRlclZlcnRpY2FsID0gMTY4NDMxNTM7IC8vIDB4MTAxMDE5MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9jb2x1bW4gPSAxNjg0MzA4NDsgLy8gMHgxMDEwMTRjCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2NvbHVtblNwYW4gPSAxNjg0MzYzOTsgLy8gMHgxMDEwMzc3Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2NvbHVtbldlaWdodCA9IDE2ODQzNjQwOyAvLyAweDEwMTAzNzgKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfY29sdW1uU3BhbiA9IDE2ODQzNjQzOyAvLyAweDEwMTAzN2IKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfY29sdW1uV2VpZ2h0ID0gMTY4NDM2NDQ7IC8vIDB4MTAxMDM3YwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9ncmF2aXR5ID0gMTY4NDI5MzE7IC8vIDB4MTAxMDBiMwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9oZWlnaHQgPSAxNjg0Mjk5NzsgLy8gMHgxMDEwMGY1CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X21hcmdpbiA9IDE2ODQyOTk4OyAvLyAweDEwMTAwZjYKQEAgLTU4Niw5ICs1OTYsOSBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9tYXJnaW5MZWZ0ID0gMTY4NDI5OTk7IC8vIDB4MTAxMDBmNwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9tYXJnaW5SaWdodCA9IDE2ODQzMDAxOyAvLyAweDEwMTAwZjkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfbWFyZ2luVG9wID0gMTY4NDMwMDA7IC8vIDB4MTAxMDBmOAotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9yb3cgPSAxNjg0MzYzNjsgLy8gMHgxMDEwMzc0Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X3Jvd1NwYW4gPSAxNjg0MzYzNzsgLy8gMHgxMDEwMzc1Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X3Jvd1dlaWdodCA9IDE2ODQzNjM4OyAvLyAweDEwMTAzNzYKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfcm93ID0gMTY4NDM2NDA7IC8vIDB4MTAxMDM3OAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9yb3dTcGFuID0gMTY4NDM2NDE7IC8vIDB4MTAxMDM3OQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9yb3dXZWlnaHQgPSAxNjg0MzY0MjsgLy8gMHgxMDEwMzdhCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X3NjYWxlID0gMTY4NDMxNTU7IC8vIDB4MTAxMDE5MwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9zcGFuID0gMTY4NDMwODU7IC8vIDB4MTAxMDE0ZAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF90b0xlZnRPZiA9IDE2ODQzMTM4OyAvLyAweDEwMTAxODIKQEAgLTYxOCw2ICs2MjgsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvb3BWaWV3cyA9IDE2ODQzNTI3OyAvLyAweDEwMTAzMDcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYW5hZ2VTcGFjZUFjdGl2aXR5ID0gMTY4NDI3NTY7IC8vIDB4MTAxMDAwNAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1hcFZpZXdTdHlsZSA9IDE2ODQyODkwOyAvLyAweDEwMTAwOGEKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudCA9IDE2ODQzNjM5OyAvLyAweDEwMTAzNzcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXJxdWVlUmVwZWF0TGltaXQgPSAxNjg0MzI5MzsgLy8gMHgxMDEwMjFkCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF4ID0gMTY4NDMwNjI7IC8vIDB4MTAxMDEzNgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1heERhdGUgPSAxNjg0MzU4NDsgLy8gMHgxMDEwMzQwCkBAIC02NTQsNiArNjY1LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0Rm9jdXNVcCA9IDE2ODQyOTc5OyAvLyAweDEwMTAwZTMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBub0hpc3RvcnkgPSAxNjg0MzMwOTsgLy8gMHgxMDEwMjJkCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbm9ybWFsU2NyZWVucyA9IDE2ODQzMzk3OyAvLyAweDEwMTAyODUKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBub3RpZmljYXRpb25UaW1lb3V0ID0gMTY4NDM2NTA7IC8vIDB4MTAxMDM4MgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bUNvbHVtbnMgPSAxNjg0MzAzMjsgLy8gMHgxMDEwMTE4CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtU3RhcnMgPSAxNjg0MzA3NjsgLy8gMHgxMDEwMTQ0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGludCBudW1lcmljID0gMTY4NDMxMDk7IC8vIDB4MTAxMDE2NQpAQCAtNjcwLDYgKzY4Miw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3ZlclNjcm9sbEZvb3RlciA9IDE2ODQzNDU5OyAvLyAweDEwMTAyYzMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBvdmVyU2Nyb2xsSGVhZGVyID0gMTY4NDM0NTg7IC8vIDB4MTAxMDJjMgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG92ZXJTY3JvbGxNb2RlID0gMTY4NDM0NTc7IC8vIDB4MTAxMDJjMQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhY2thZ2VOYW1lcyA9IDE2ODQzNjQ4OyAvLyAweDEwMTAzODAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYWRkaW5nID0gMTY4NDI5NjU7IC8vIDB4MTAxMDBkNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhZGRpbmdCb3R0b20gPSAxNjg0Mjk2OTsgLy8gMHgxMDEwMGQ5CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFkZGluZ0xlZnQgPSAxNjg0Mjk2NjsgLy8gMHgxMDEwMGQ2CkBAIC03NDcsNiArNzYwLDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByZXFOYXZpZ2F0aW9uID0gMTY4NDMzMDY7IC8vIDB4MTAxMDIyYQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcVRvdWNoU2NyZWVuID0gMTY4NDMzMDM7IC8vIDB4MTAxMDIyNwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcXVpcmVkID0gMTY4NDM0MDY7IC8vIDB4MTAxMDI4ZQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcXVpcmVzU21hbGxlc3RXaWR0aERwID0gMTY4NDM2MjA7IC8vIDB4MTAxMDM2NAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlc2l6ZU1vZGUgPSAxNjg0MzYxOTsgLy8gMHgxMDEwMzYzCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmVzaXplYWJsZSA9IDE2ODQzNDA1OyAvLyAweDEwMTAyOGQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByZXNvdXJjZSA9IDE2ODQyNzg5OyAvLyAweDEwMTAwMjUKQEAgLTc1OCwxMSArNzcyLDExIEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcm90YXRpb24gPSAxNjg0MzU1ODsgLy8gMHgxMDEwMzI2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcm90YXRpb25YID0gMTY4NDM1NTk7IC8vIDB4MTAxMDMyNwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvdGF0aW9uWSA9IDE2ODQzNTYwOyAvLyAweDEwMTAzMjgKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByb3dDb3VudCA9IDE2ODQzNjMxOyAvLyAweDEwMTAzNmYKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByb3dDb3VudCA9IDE2ODQzNjM0OyAvLyAweDEwMTAzNzIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByb3dEZWxheSA9IDE2ODQzMjE2OyAvLyAweDEwMTAxZDAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByb3dFZGdlRmxhZ3MgPSAxNjg0MzMyOTsgLy8gMHgxMDEwMjQxCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcm93SGVpZ2h0ID0gMTY4NDMwNTg7IC8vIDB4MTAxMDEzMgotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd09yZGVyUHJlc2VydmVkID0gMTY4NDM2MzI7IC8vIDB4MTAxMDM3MAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd09yZGVyUHJlc2VydmVkID0gMTY4NDM2MzU7IC8vIDB4MTAxMDM3MwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhdmVFbmFibGVkID0gMTY4NDI5ODM7IC8vIDB4MTAxMDBlNwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjYWxlR3Jhdml0eSA9IDE2ODQzMjYyOyAvLyAweDEwMTAxZmUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY2FsZUhlaWdodCA9IDE2ODQzMjYxOyAvLyAweDEwMTAxZmQKQEAgLTg0OSwxNCArODYzLDE0IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfYWN0aXZlID0gMTY4NDI5MTQ7IC8vIDB4MTAxMDBhMgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2NoZWNrYWJsZSA9IDE2ODQyOTExOyAvLyAweDEwMTAwOWYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9jaGVja2VkID0gMTY4NDI5MTI7IC8vIDB4MTAxMDBhMAotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2RyYWdfY2FuX2FjY2VwdCA9IDE2ODQzNjIxOyAvLyAweDEwMTAzNjUKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9kcmFnX2hvdmVyZWQgPSAxNjg0MzYyMjsgLy8gMHgxMDEwMzY2CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZHJhZ19jYW5fYWNjZXB0ID0gMTY4NDM2MjQ7IC8vIDB4MTAxMDM2OAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2RyYWdfaG92ZXJlZCA9IDE2ODQzNjI1OyAvLyAweDEwMTAzNjkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9lbXB0eSA9IDE2ODQyOTIxOyAvLyAweDEwMTAwYTkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9lbmFibGVkID0gMTY4NDI5MTA7IC8vIDB4MTAxMDA5ZQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2V4cGFuZGVkID0gMTY4NDI5MjA7IC8vIDB4MTAxMDBhOAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2ZpcnN0ID0gMTY4NDI5MTY7IC8vIDB4MTAxMDBhNAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2ZvY3VzZWQgPSAxNjg0MjkwODsgLy8gMHgxMDEwMDljCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfaG92ZXJlZCA9IDE2ODQzNjIwOyAvLyAweDEwMTAzNjQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9ob3ZlcmVkID0gMTY4NDM2MjM7IC8vIDB4MTAxMDM2NwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2xhc3QgPSAxNjg0MjkxODsgLy8gMHgxMDEwMGE2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfbG9uZ19wcmVzc2FibGUgPSAxNjg0MzMyNDsgLy8gMHgxMDEwMjNjCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfbWlkZGxlID0gMTY4NDI5MTc7IC8vIDB4MTAxMDBhNQpAQCAtODY3LDcgKzg4MSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfd2luZG93X2ZvY3VzZWQgPSAxNjg0MjkwOTsgLy8gMHgxMDEwMDlkCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGljV2FsbHBhcGVyUHJldmlldyA9IDE2ODQzNTY5OyAvLyAweDEwMTAzMzEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGVwU2l6ZSA9IDE2ODQzMDc4OyAvLyAweDEwMTAxNDYKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdG9wV2l0aFRhc2sgPSAxNjg0MzYyMzsgLy8gMHgxMDEwMzY3CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RvcFdpdGhUYXNrID0gMTY4NDM2MjY7IC8vIDB4MTAxMDM2YQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0cmVhbVR5cGUgPSAxNjg0MzI3MzsgLy8gMHgxMDEwMjA5CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RyZXRjaENvbHVtbnMgPSAxNjg0MzA4MTsgLy8gMHgxMDEwMTQ5CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RyZXRjaE1vZGUgPSAxNjg0MzAzMDsgLy8gMHgxMDEwMTE2CkBAIC04NzUsNyArODg5LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdWJ0aXRsZVRleHRTdHlsZSA9IDE2ODQzNTEzOyAvLyAweDEwMTAyZjkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdWdnZXN0QWN0aW9uTXNnID0gMTY4NDMyMjg7IC8vIDB4MTAxMDFkYwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1Z2dlc3RBY3Rpb25Nc2dDb2x1bW4gPSAxNjg0MzIyOTsgLy8gMHgxMDEwMWRkCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VnZ2VzdGlvbnNFbmFibGVkID0gMTY4NDM2MzA7IC8vIDB4MTAxMDM2ZQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1Z2dlc3Rpb25zRW5hYmxlZCA9IDE2ODQzNjMzOyAvLyAweDEwMTAzNzEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdW1tYXJ5ID0gMTY4NDMyNDE7IC8vIDB4MTAxMDFlOQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1bW1hcnlDb2x1bW4gPSAxNjg0MzQyNjsgLy8gMHgxMDEwMmEyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VtbWFyeU9mZiA9IDE2ODQzMjQ4OyAvLyAweDEwMTAxZjAKQEAgLTk0Myw5ICs5NTcsOSBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRFZGl0UGFzdGVXaW5kb3dMYXlvdXQgPSAxNjg0MzU0MDsgLy8gMHgxMDEwMzE0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dEVkaXRTaWRlTm9QYXN0ZVdpbmRvd0xheW91dCA9IDE2ODQzNjE1OyAvLyAweDEwMTAzNWYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0RWRpdFNpZGVQYXN0ZVdpbmRvd0xheW91dCA9IDE2ODQzNjE0OyAvLyAweDEwMTAzNWUKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0RWRpdFN1Z2dlc3Rpb25JdGVtTGF5b3V0ID0gMTY4NDM2Mjc7IC8vIDB4MTAxMDM2YgotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRFZGl0U3VnZ2VzdGlvbnNCb3R0b21XaW5kb3dMYXlvdXQgPSAxNjg0MzYyNTsgLy8gMHgxMDEwMzY5Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dEVkaXRTdWdnZXN0aW9uc1RvcFdpbmRvd0xheW91dCA9IDE2ODQzNjI2OyAvLyAweDEwMTAzNmEKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0RWRpdFN1Z2dlc3Rpb25JdGVtTGF5b3V0ID0gMTY4NDM2MzA7IC8vIDB4MTAxMDM2ZQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRFZGl0U3VnZ2VzdGlvbnNCb3R0b21XaW5kb3dMYXlvdXQgPSAxNjg0MzYyODsgLy8gMHgxMDEwMzZjCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dEVkaXRTdWdnZXN0aW9uc1RvcFdpbmRvd0xheW91dCA9IDE2ODQzNjI5OyAvLyAweDEwMTAzNmQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0RmlsdGVyRW5hYmxlZCA9IDE2ODQzMDA3OyAvLyAweDEwMTAwZmYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0SXNTZWxlY3RhYmxlID0gMTY4NDM1NDI7IC8vIDB4MTAxMDMxNgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRPZmYgPSAxNjg0MzA0NTsgLy8gMHgxMDEwMTI1CkBAIC05NTcsNyArOTcxLDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0U2VsZWN0SGFuZGxlV2luZG93U3R5bGUgPSAxNjg0MzQ2NDsgLy8gMHgxMDEwMmM4CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dFNpemUgPSAxNjg0MjkwMTsgLy8gMHgxMDEwMDk1CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dFN0eWxlID0gMTY4NDI5MDM7IC8vIDB4MTAxMDA5NwotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRTdWdnZXN0aW9uc1dpbmRvd1N0eWxlID0gMTY4NDM2MjQ7IC8vIDB4MTAxMDM2OAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRTdWdnZXN0aW9uc1dpbmRvd1N0eWxlID0gMTY4NDM2Mjc7IC8vIDB4MTAxMDM2YgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRWaWV3U3R5bGUgPSAxNjg0Mjg4NDsgLy8gMHgxMDEwMDg0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGhlbWUgPSAxNjg0Mjc1MjsgLy8gMHgxMDEwMDAwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGhpY2tuZXNzID0gMTY4NDMzNjA7IC8vIDB4MTAxMDI2MApAQCAtOTkzLDcgKzEwMDcsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHVuZm9jdXNlZE1vbnRoRGF0ZUNvbG9yID0gMTY4NDM1ODg7IC8vIDB4MTAxMDM0NAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHVuc2VsZWN0ZWRBbHBoYSA9IDE2ODQzMjc4OyAvLyAweDEwMTAyMGUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB1cGRhdGVQZXJpb2RNaWxsaXMgPSAxNjg0MzM0NDsgLy8gMHgxMDEwMjUwCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdXNlRGVmYXVsdE1hcmdpbnMgPSAxNjg0MzYzNTsgLy8gMHgxMDEwMzczCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdXNlRGVmYXVsdE1hcmdpbnMgPSAxNjg0MzYzODsgLy8gMHgxMDEwMzc2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdXNlSW50cmluc2ljU2l6ZUFzTWluaW11bSA9IDE2ODQzNTM2OyAvLyAweDEwMTAzMTAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB1c2VMZXZlbCA9IDE2ODQzMTY3OyAvLyAweDEwMTAxOWYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB1c2VyVmlzaWJsZSA9IDE2ODQzNDA5OyAvLyAweDEwMTAyOTEKQEAgLTE2OTIsMTEgKzE3MDYsMTggQEAKICAgICBtZXRob2QgcHJvdGVjdGVkIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNlcnZpY2VJbmZvKGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSAiYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFUlZJQ0VfTUVUQV9EQVRBID0gImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UiOwogICB9CiAKICAgcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgICAgY3RvciBwdWJsaWMgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZmVlZGJhY2tUeXBlVG9TdHJpbmcoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGZsYWdUb1N0cmluZyhpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBnZXRDYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKTsKKyAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbyBnZXRSZXNvbHZlSW5mbygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXR0aW5nc0FjdGl2aXR5TmFtZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsLCBpbnQpOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IgQ1JFQVRPUjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gMTsgLy8gMHgxCkBAIC0yODczLDYgKzI4OTQsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCByZWdpc3RlckZvckNvbnRleHRNZW51KGFuZHJvaWQudmlldy5WaWV3KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0QXJndW1lbnRzKGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uc01lbnUoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTYXZlZFN0YXRlKGFuZHJvaWQuYXBwLkZyYWdtZW50LlNhdmVkU3RhdGUpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRSZXRhaW5JbnN0YW5jZShib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VGFyZ2V0RnJhZ21lbnQoYW5kcm9pZC5hcHAuRnJhZ21lbnQsIGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoYW5kcm9pZC5jb250ZW50LkludGVudCk7CkBAIC0yODg0LDYgKzI5MDYsMTIgQEAKICAgICBjdG9yIHB1YmxpYyBGcmFnbWVudC5JbnN0YW50aWF0aW9uRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGcmFnbWVudC5TYXZlZFN0YXRlIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKKyAgICBtZXRob2QgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ2xhc3NMb2FkZXJDcmVhdG9yIENSRUFUT1I7CisgIH0KKwogICBwdWJsaWMgY2xhc3MgRnJhZ21lbnRCcmVhZENydW1icyBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIuT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIgewogICAgIGN0b3IgcHVibGljIEZyYWdtZW50QnJlYWRDcnVtYnMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwogICAgIGN0b3IgcHVibGljIEZyYWdtZW50QnJlYWRDcnVtYnMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpOwpAQCAtMjkyMSw2ICsyOTQ5LDcgQEAKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcG9wQmFja1N0YWNrSW1tZWRpYXRlKGludCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0RnJhZ21lbnQoYW5kcm9pZC5vcy5CdW5kbGUsIGphdmEubGFuZy5TdHJpbmcsIGFuZHJvaWQuYXBwLkZyYWdtZW50KTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIoYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyLk9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyKTsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQuYXBwLkZyYWdtZW50LlNhdmVkU3RhdGUgc2F2ZUZyYWdtZW50SW5zdGFuY2VTdGF0ZShhbmRyb2lkLmFwcC5GcmFnbWVudCk7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFID0gMTsgLy8gMHgxCiAgIH0KIApAQCAtNDExNiw2ICs0MTQ1LDcgQEAKICAgICBtZXRob2QgcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKICAgICBtZXRob2QgcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlIGdldFJlbW90ZURldmljZSgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpOwogICB9CiAKIH0KQEAgLTU0ODQsMTUgKzU1MTQsMTggQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1ZNX1NBRkVfTU9ERSA9IDE2Mzg0OyAvLyAweDQwMDAKICAgICBmaWVsZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBiYWNrdXBBZ2VudE5hbWU7CiAgICAgZmllbGQgcHVibGljIGphdmEubGFuZy5TdHJpbmcgY2xhc3NOYW1lOworICAgIGZpZWxkIHB1YmxpYyBpbnQgY29tcGF0aWJsZVdpZHRoTGltaXREcDsKICAgICBmaWVsZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkYXRhRGlyOwogICAgIGZpZWxkIHB1YmxpYyBpbnQgZGVzY3JpcHRpb25SZXM7CiAgICAgZmllbGQgcHVibGljIGJvb2xlYW4gZW5hYmxlZDsKICAgICBmaWVsZCBwdWJsaWMgaW50IGZsYWdzOworICAgIGZpZWxkIHB1YmxpYyBpbnQgbGFyZ2VzdFdpZHRoTGltaXREcDsKICAgICBmaWVsZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtYW5hZ2VTcGFjZUFjdGl2aXR5TmFtZTsKICAgICBmaWVsZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVMaWJyYXJ5RGlyOwogICAgIGZpZWxkIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHBlcm1pc3Npb247CiAgICAgZmllbGQgcHVibGljIGphdmEubGFuZy5TdHJpbmcgcHJvY2Vzc05hbWU7CiAgICAgZmllbGQgcHVibGljIGphdmEubGFuZy5TdHJpbmcgcHVibGljU291cmNlRGlyOworICAgIGZpZWxkIHB1YmxpYyBpbnQgcmVxdWlyZXNTbWFsbGVzdFdpZHRoRHA7CiAgICAgZmllbGQgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBzaGFyZWRMaWJyYXJ5RmlsZXM7CiAgICAgZmllbGQgcHVibGljIGphdmEubGFuZy5TdHJpbmcgc291cmNlRGlyOwogICAgIGZpZWxkIHB1YmxpYyBpbnQgdGFyZ2V0U2RrVmVyc2lvbjsKQEAgLTYzMjEsNiArNjM1NCw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ3Vyc29ySm9pbmVyLlJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lci5SZXN1bHQgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lci5SZXN1bHRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JKb2luZXIuUmVzdWx0IEJPVEg7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyLlJlc3VsdCBMRUZUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lci5SZXN1bHQgUklHSFQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQ3Vyc29yV2luZG93IGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2xvc2FibGUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewpAQCAtNjc5NSw2ICs2ODMxLDcgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q3Vyc29yRmFjdG9yeShhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RGlzdGluY3QoYm9vbGVhbik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFByb2plY3Rpb25NYXAoamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nPik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN0cmljdChib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VGFibGVzKGphdmEubGFuZy5TdHJpbmcpOwogICB9CiAKQEAgLTcyMzksNiArNzI3Niw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQXZvaWRYZmVybW9kZS5Nb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQXZvaWRYZmVybW9kZS5Nb2RlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlLk1vZGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlLk1vZGUgQVZPSUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQXZvaWRYZmVybW9kZS5Nb2RlIFRBUkdFVDsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBCaXRtYXAgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewpAQCAtNzI5MSwxMSArNzMzMCwxNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJpdG1hcC5Db21wcmVzc0Zvcm1hdCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db21wcmVzc0Zvcm1hdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0IEpQRUc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0IFBORzsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQml0bWFwLkNvbmZpZyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWdbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnIEFMUEhBXzg7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnIEFSR0JfNDQ0NDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnIEFSR0JfODg4ODsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnIFJHQl81NjU7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQml0bWFwRmFjdG9yeSB7CkBAIC03MzU5LDYgKzc0MDQsMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCbHVyTWFza0ZpbHRlci5CbHVyIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1ciB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1cltdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJsdXJNYXNrRmlsdGVyLkJsdXIgSU5ORVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1ciBOT1JNQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1ciBPVVRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyIFNPTElEOwogICB9CiAKICAgcHVibGljIGNsYXNzIENhbWVyYSB7CkBAIC03NDcyLDExICs3NTIxLDE2IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2FudmFzLkVkZ2VUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLkVkZ2VUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuRWRnZVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuRWRnZVR5cGUgQUE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLkVkZ2VUeXBlIEJXOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYW52YXMuVmVydGV4TW9kZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5WZXJ0ZXhNb2RlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuVmVydGV4TW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5WZXJ0ZXhNb2RlIFRSSUFOR0xFUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuVmVydGV4TW9kZSBUUklBTkdMRV9GQU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLlZlcnRleE1vZGUgVFJJQU5HTEVfU1RSSVA7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQ29sb3IgewpAQCAtNzU5MSw2ICs3NjQ1LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnRlcnBvbGF0b3IuUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yLlJlc3VsdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yLlJlc3VsdFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvci5SZXN1bHQgRlJFRVpFX0VORDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IuUmVzdWx0IEZSRUVaRV9TVEFSVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IuUmVzdWx0IE5PUk1BTDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBMYXllclJhc3Rlcml6ZXIgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLlJhc3Rlcml6ZXIgewpAQCAtNzY3NCw2ICs3NzMxLDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWF0cml4LlNjYWxlVG9GaXQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdCBDRU5URVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXQgRU5EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeC5TY2FsZVRvRml0IEZJTEw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXQgU1RBUlQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgTW92aWUgewpAQCAtNzgwMywxMSArNzg2NCwxNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhaW50LkFsaWduIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ24gdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkFsaWduW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ24gQ0VOVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkFsaWduIExFRlQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ24gUklHSFQ7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhaW50LkNhcCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkNhcCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwIEJVVFQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwIFJPVU5EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkNhcCBTUVVBUkU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhaW50LkZvbnRNZXRyaWNzIHsKQEAgLTc4MzEsMTEgKzc4OTgsMTcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQYWludC5Kb2luIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuSm9pbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuSm9pbltdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkpvaW4gQkVWRUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuSm9pbiBNSVRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Kb2luIFJPVU5EOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQYWludC5TdHlsZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LlN0eWxlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5TdHlsZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LlN0eWxlIEZJTEw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGUgRklMTF9BTkRfU1RST0tFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LlN0eWxlIFNUUk9LRTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBQYWludEZsYWdzRHJhd0ZpbHRlciBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlciB7CkBAIC03ODg3LDExICs3OTYwLDE3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aC5EaXJlY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkRpcmVjdGlvbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5EaXJlY3Rpb25bXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkRpcmVjdGlvbiBDQ1c7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5EaXJlY3Rpb24gQ1c7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGguRmlsbFR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5GaWxsVHlwZSBFVkVOX09ERDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIElOVkVSU0VfRVZFTl9PREQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5GaWxsVHlwZSBJTlZFUlNFX1dJTkRJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5GaWxsVHlwZSBXSU5ESU5HOwogICB9CiAKICAgcHVibGljIGNsYXNzIFBhdGhEYXNoUGF0aEVmZmVjdCBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdCB7CkBAIC03OTAxLDYgKzc5ODAsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGhEYXNoUGF0aEVmZmVjdC5TdHlsZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdC5TdHlsZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIE1PUlBIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdC5TdHlsZSBST1RBVEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIFRSQU5TTEFURTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBQYXRoRWZmZWN0IHsKQEAgLTgwMDUsNiArODA4NywyNCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBvcnRlckR1ZmYuTW9kZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIEFERDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgQ0xFQVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIERBUktFTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgRFNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1RfQVRPUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgRFNUX0lOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1RfT1VUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1RfT1ZFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgTElHSFRFTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgTVVMVElQTFk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIE9WRVJMQVk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIFNDUkVFTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgU1JDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkNfQVRPUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgU1JDX0lOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkNfT1VUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkNfT1ZFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgWE9SOwogICB9CiAKICAgcHVibGljIGNsYXNzIFBvcnRlckR1ZmZDb2xvckZpbHRlciBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXIgewpAQCAtODE0Niw2ICs4MjQ2LDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVnaW9uLk9wIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3BbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3AgRElGRkVSRU5DRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3AgSU5URVJTRUNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBSRVBMQUNFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBSRVZFUlNFX0RJRkZFUkVOQ0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIFVOSU9OOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBYT1I7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUmVnaW9uSXRlcmF0b3IgewpAQCAtODE2Miw2ICs4MjY4LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTaGFkZXIuVGlsZU1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIuVGlsZU1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZSBDTEFNUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIuVGlsZU1vZGUgTUlSUk9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZSBSRVBFQVQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU3VtUGF0aEVmZmVjdCBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdCB7CkBAIC04MzMxLDYgKzg0NDAsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24gZ2V0VHJhbnNwYXJlbnRSZWdpb24oKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgaW5mbGF0ZShhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcywgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlciwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGludmFsaWRhdGVTZWxmKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UnRsU2VsZigpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlZnVsKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzVmlzaWJsZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBqdW1wVG9DdXJyZW50U3RhdGUoKTsKQEAgLTgzNjEsNiArODQ3MSwxMCBAQAogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnNjaGVkdWxlRHJhd2FibGUoYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSwgamF2YS5sYW5nLlJ1bm5hYmxlKTsKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIERyYXdhYmxlLkNhbGxiYWNrMiBpbXBsZW1lbnRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUuQ2FsbGJhY2sgeworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0xheW91dFJ0bChhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSB7CiAgICAgY3RvciBwdWJsaWMgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgaW50IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKQEAgLTg0MzcsNiArODU1MSwxNCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBCTF9UUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIEJPVFRPTV9UT1A7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBCUl9UTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIExFRlRfUklHSFQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBSSUdIVF9MRUZUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gVExfQlI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBUT1BfQk9UVE9NOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gVFJfQkw7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgSW5zZXREcmF3YWJsZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgaW1wbGVtZW50cyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNhbGxiYWNrIHsKQEAgLTEwODk5LDYgKzExMDIxLDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcy5OYW1lc3BhY2UgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcy5OYW1lc3BhY2UgQUJTVFJBQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcy5OYW1lc3BhY2UgRklMRVNZU1RFTTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzLk5hbWVzcGFjZSBSRVNFUlZFRDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBNYWlsVG8gewpAQCAtMTA5MzMsMTEgKzExMDU4LDI4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIEFVVEhFTlRJQ0FUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIEJMT0NLRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgQ09OTkVDVEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIENPTk5FQ1RJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgRElTQ09OTkVDVEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIERJU0NPTk5FQ1RJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgRkFJTEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIElETEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgT0JUQUlOSU5HX0lQQUREUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBTQ0FOTklORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBTVVNQRU5ERUQ7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE5ldHdvcmtJbmZvLlN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGUgQ09OTkVDVEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSBDT05ORUNUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSBESVNDT05ORUNURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlIERJU0NPTk5FQ1RJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlIFNVU1BFTkRFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGUgVU5LTk9XTjsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHsKQEAgLTExMTY0LDYgKzExMzA2LDIxIEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBsb25nIERFRkFVTFRfU1lOQ19NSU5fR1pJUF9CWVRFUzsKICAgfQogCisgIHB1YmxpYyBmaW5hbCBjbGFzcyBIdHRwUmVzcG9uc2VDYWNoZSBleHRlbmRzIGphdmEubmV0LlJlc3BvbnNlQ2FjaGUgaW1wbGVtZW50cyBqYXZhLmlvLkNsb3NlYWJsZSB7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBmbHVzaCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS5uZXQuQ2FjaGVSZXNwb25zZSBnZXQoamF2YS5uZXQuVVJJLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+PikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0SGl0Q291bnQoKTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5odHRwLkh0dHBSZXNwb25zZUNhY2hlIGdldEluc3RhbGxlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE5ldHdvcmtDb3VudCgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFJlcXVlc3RDb3VudCgpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0Lmh0dHAuSHR0cFJlc3BvbnNlQ2FjaGUgaW5zdGFsbChqYXZhLmlvLkZpbGUsIGxvbmcpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOworICAgIG1ldGhvZCBwdWJsaWMgbG9uZyBtYXhTaXplKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLm5ldC5DYWNoZVJlcXVlc3QgcHV0KGphdmEubmV0LlVSSSwgamF2YS5uZXQuVVJMQ29ubmVjdGlvbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CisgICAgbWV0aG9kIHB1YmxpYyBsb25nIHNpemUoKTsKKyAgfQorCiAgIHB1YmxpYyBjbGFzcyBTc2xDZXJ0aWZpY2F0ZSB7CiAgICAgY3RvciBwdWJsaWMgZGVwcmVjYXRlZCBTc2xDZXJ0aWZpY2F0ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBjdG9yIHB1YmxpYyBkZXByZWNhdGVkIFNzbENlcnRpZmljYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5EYXRlLCBqYXZhLnV0aWwuRGF0ZSk7CkBAIC0xMTQ1NCw2ICsxMTYxMSwxOSBAQAogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGVbXSB2YWx1ZXMoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgQVNTT0NJQVRFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgQVNTT0NJQVRJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIEFVVEhFTlRJQ0FUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBDT01QTEVURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIERJU0NPTk5FQ1RFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgRE9STUFOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgRk9VUl9XQVlfSEFORFNIQUtFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBHUk9VUF9IQU5EU0hBS0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIElOQUNUSVZFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBJTlRFUkZBQ0VfRElTQUJMRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIElOVkFMSUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIFNDQU5OSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBVTklOSVRJQUxJWkVEOwogICB9CiAKICAgcHVibGljIGNsYXNzIFdpZmlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKQEAgLTEzMjgyLDYgKzEzNDUyLDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBc3luY1Rhc2suU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuQXN5bmNUYXNrLlN0YXR1cyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuQXN5bmNUYXNrLlN0YXR1c1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXMgRklOSVNIRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuQXN5bmNUYXNrLlN0YXR1cyBQRU5ESU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXMgUlVOTklORzsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBCYWRQYXJjZWxhYmxlRXhjZXB0aW9uIGV4dGVuZHMgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uIHsKQEAgLTE0MDAwLDYgKzE0MTczLDEwIEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUgPSAxOyAvLyAweDEKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIFBhcmNlbGFibGUuQ2xhc3NMb2FkZXJDcmVhdG9yIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IgeworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgVCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsLCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIpOworICB9CisKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgUGFyY2VsYWJsZS5DcmVhdG9yIHsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IFQgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBUW10gbmV3QXJyYXkoaW50KTsKQEAgLTE2MjYyLDYgKzE2NDM5LDcgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RnJvbUZpZWxkUGFja2VyKGludCwgaW50LCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5GaWVsZFBhY2tlcik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN5bmNBbGwoaW50KTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0FHRV9HUkFQSElDU19DT05TVEFOVFMgPSA4OyAvLyAweDgKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0FHRV9HUkFQSElDU19SRU5ERVJfVEFSR0VUID0gMTY7IC8vIDB4MTAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0FHRV9HUkFQSElDU19URVhUVVJFID0gMjsgLy8gMHgyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNBR0VfR1JBUEhJQ1NfVkVSVEVYID0gNDsgLy8gMHg0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNBR0VfU0NSSVBUID0gMTsgLy8gMHgxCkBAIC0xNjI3MCw2ICsxNjQ0OCw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24uTWlwbWFwQ29udHJvbCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24uTWlwbWFwQ29udHJvbFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uLk1pcG1hcENvbnRyb2wgTUlQTUFQX0ZVTEw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24uTWlwbWFwQ29udHJvbCBNSVBNQVBfTk9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sIE1JUE1BUF9PTl9TWU5DX1RPX1RFWFRVUkU7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQWxsb2NhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uIHsKQEAgLTE2Mzk0LDExICsxNjU3NSw0NSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVsZW1lbnQuRGF0YUtpbmQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCBQSVhFTF9BOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX0RFUFRIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX0w7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgUElYRUxfTEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgUElYRUxfUkdCOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX1JHQkE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgVVNFUjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRWxlbWVudC5EYXRhVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIEJPT0xFQU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgRkxPQVRfMzI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgRkxPQVRfNjQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgTUFUUklYXzJYMjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBNQVRSSVhfM1gzOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIE1BVFJJWF80WDQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfQUxMT0NBVElPTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19FTEVNRU5UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX01FU0g7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19QUk9HUkFNX1JBU1RFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19QUk9HUkFNX1NUT1JFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1BST0dSQU1fVkVSVEVYOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1NBTVBMRVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfU0NSSVBUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1RZUEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgU0lHTkVEXzE2OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFNJR05FRF8zMjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBTSUdORURfNjQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgU0lHTkVEXzg7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfMTY7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfMzI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfNF80XzRfNDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBVTlNJR05FRF81XzVfNV8xOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzVfNl81OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzY0OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzg7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgRmllbGRQYWNrZXIgewpAQCAtMTY0NTgsNiArMTY2NzMsOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVBM0QuRW50cnlUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZpbGVBM0QuRW50cnlUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmlsZUEzRC5FbnRyeVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmlsZUEzRC5FbnRyeVR5cGUgTUVTSDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmlsZUEzRC5FbnRyeVR5cGUgVU5LTk9XTjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZUEzRC5JbmRleEVudHJ5IHsKQEAgLTE2NTAyLDYgKzE2NzE5LDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRm9udC5TdHlsZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRm9udC5TdHlsZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIEJPTEQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZvbnQuU3R5bGUgQk9MRF9JVEFMSUM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZvbnQuU3R5bGUgSVRBTElDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIE5PUk1BTDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBJbnQyIHsKQEAgLTE2NjUxLDYgKzE2ODcyLDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWVzaC5QcmltaXRpdmUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBMSU5FOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBMSU5FX1NUUklQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBQT0lOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgVFJJQU5HTEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2guUHJpbWl0aXZlIFRSSUFOR0xFX0ZBTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgVFJJQU5HTEVfU1RSSVA7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlciB7CkBAIC0xNjY4Nyw2ICsxNjkxNCw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbS5UZXh0dXJlVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtLlRleHR1cmVUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbS5UZXh0dXJlVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtLlRleHR1cmVUeXBlIFRFWFRVUkVfMkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW0uVGV4dHVyZVR5cGUgVEVYVFVSRV9DVUJFOwogICB9CiAKICAgcHVibGljIGNsYXNzIFByb2dyYW1GcmFnbWVudCBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW0gewpAQCAtMTY3MTIsMTEgKzE2OTQxLDE4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRW52TW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRW52TW9kZSBERUNBTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgTU9EVUxBVEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5FbnZNb2RlIFJFUExBQ0U7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCBBTFBIQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCBMVU1JTkFOQ0VfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQgUkdCOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRm9ybWF0IFJHQkE7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUHJvZ3JhbVJhc3RlciBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LkJhc2VPYmogewpAQCAtMTY3MzUsNiArMTY5NzEsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1SYXN0ZXIuQ3VsbE1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVJhc3Rlci5DdWxsTW9kZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1SYXN0ZXIuQ3VsbE1vZGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVJhc3Rlci5DdWxsTW9kZSBCQUNLOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtUmFzdGVyLkN1bGxNb2RlIEZST05UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtUmFzdGVyLkN1bGxNb2RlIE5PTkU7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUHJvZ3JhbVN0b3JlIGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQmFzZU9iaiB7CkBAIC0xNjc0NywxMSArMTY5ODYsMjggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIE9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBPTkVfTUlOVVNfRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIE9ORV9NSU5VU19TUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgT05FX01JTlVTX1NSQ19DT0xPUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBTUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgU1JDX0NPTE9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIFpFUk87CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBEU1RfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgRFNUX0NPTE9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIE9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBPTkVfTUlOVVNfRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIE9ORV9NSU5VU19EU1RfQ09MT1I7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgT05FX01JTlVTX1NSQ19BTFBIQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBTUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgU1JDX0FMUEhBX1NBVFVSQVRFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIFpFUk87CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2dyYW1TdG9yZS5CdWlsZGVyIHsKQEAgLTE2NzY3LDYgKzE3MDIzLDEzIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuY1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIEFMV0FZUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBFUVVBTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBHUkVBVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIEdSRUFURVJfT1JfRVFVQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmMgTEVTUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBMRVNTX09SX0VRVUFMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIE5PVF9FUVVBTDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtVmVydGV4IGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbSB7CkBAIC0xNjg0Miw2ICsxNzEwNSw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVuZGVyU2NyaXB0LlByaW9yaXR5IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdC5Qcmlvcml0eSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdC5Qcmlvcml0eVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUHJpb3JpdHkgTE9XOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUHJpb3JpdHkgTk9STUFMOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZW5kZXJTY3JpcHQuUlNFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUgewpAQCAtMTY5MDQsNiArMTcxNjksMTIgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTYW1wbGVyLlZhbHVlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgQ0xBTVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgTElORUFSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIExJTkVBUl9NSVBfTElORUFSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIExJTkVBUl9NSVBfTkVBUkVTVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZSBORUFSRVNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIFdSQVA7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU2NyaXB0IGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQmFzZU9iaiB7CkBAIC0xNjk4Niw2ICsxNzI1NywxMiBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFR5cGUuQ3ViZW1hcEZhY2UgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2VbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSBORUdBVElWRV9YOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIE5FR0FUSVZFX1k7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2UgTkVHQVRJVkVfWjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSBQT1NJVFZFX1g7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2UgUE9TSVRWRV9ZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIFBPU0lUVkVfWjsKICAgfQogCiB9CkBAIC0xNzQ3NCw2ICsxNzc1MSwxMSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3NbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgVU5LTk9XTjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU21zTWVzc2FnZS5TdWJtaXRQZHUgewpAQCAtMTc2NDUsNiArMTc5MjcsMTEgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGNsYXNzIFNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzc1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyBDTEFTU18yOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIFVOS05PV047CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGRlcHJlY2F0ZWQgY2xhc3MgU21zTWVzc2FnZS5TdWJtaXRQZHUgewpAQCAtMTg0NzksNiArMTg3NjYsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIExheW91dC5BbGlnbm1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudCBBTElHTl9DRU5URVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQuQWxpZ25tZW50IEFMSUdOX05PUk1BTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQgQUxJR05fT1BQT1NJVEU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIExheW91dC5EaXJlY3Rpb25zIHsKQEAgLTE4NzM2LDYgKzE5MDI2LDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGV4dFV0aWxzLlRydW5jYXRlQXQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdCBFTkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdCBNQVJRVUVFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQgTUlERExFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQgU1RBUlQ7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIFRleHRXYXRjaGVyIGltcGxlbWVudHMgYW5kcm9pZC50ZXh0Lk5vQ29weVNwYW4gewpAQCAtMTkxMjEsNiArMTk0MTUsMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplIENIQVJBQ1RFUlM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemUgTk9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZSBTRU5URU5DRVM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemUgV09SRFM7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgVGltZUtleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5OdW1iZXJLZXlMaXN0ZW5lciB7CkBAIC0xOTYxOCw2ICsxOTkxNiw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVOU0lUWV9ISUdIID0gMjQwOyAvLyAweGYwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVOU0lUWV9MT1cgPSAxMjA7IC8vIDB4NzgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX01FRElVTSA9IDE2MDsgLy8gMHhhMAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTlNJVFlfVFYgPSAyMTM7IC8vIDB4ZDUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX1hISUdIID0gMzIwOyAvLyAweDE0MAogICAgIGZpZWxkIHB1YmxpYyBmbG9hdCBkZW5zaXR5OwogICAgIGZpZWxkIHB1YmxpYyBpbnQgZGVuc2l0eURwaTsKQEAgLTE5NjkwLDYgKzE5OTg5LDE2IEBACiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBKc29uVG9rZW4gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW5bXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBCRUdJTl9BUlJBWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBCRUdJTl9PQkpFQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gQk9PTEVBTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBFTkRfQVJSQVk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gRU5EX0RPQ1VNRU5UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIEVORF9PQkpFQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gTkFNRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBOVUxMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIE5VTUJFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBTVFJJTkc7CiAgIH0KIAogICBwdWJsaWMgZmluYWwgY2xhc3MgSnNvbldyaXRlciBpbXBsZW1lbnRzIGphdmEuaW8uQ2xvc2VhYmxlIHsKQEAgLTE5OTc5LDYgKzIwMjg4LDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgWG1sLkVuY29kaW5nIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5YbWwuRW5jb2RpbmcgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sLkVuY29kaW5nW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5YbWwuRW5jb2RpbmcgSVNPXzg4NTlfMTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlhtbC5FbmNvZGluZyBVU19BU0NJSTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlhtbC5FbmNvZGluZyBVVEZfMTY7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5YbWwuRW5jb2RpbmcgVVRGXzg7CiAgIH0KIAogfQpAQCAtMjAxMjEsNiArMjA0MzQsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHkoaW50LCBpbnQsIGludCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0LCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHkoaW50LCBpbnQsIGludCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0LCBpbnQsIGludCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0KTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5RGlzcGxheShpbnQsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0KTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBpbnQgZ2V0QWJzb2x1dGVHcmF2aXR5KGludCwgYm9vbGVhbik7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hvcml6b250YWwoaW50KTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVydGljYWwoaW50KTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBWElTX0NMSVAgPSA4OyAvLyAweDgKQEAgLTIwMTM3LDEzICsyMDQ1MSwxNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSVBfVkVSVElDQUwgPSAxMjg7IC8vIDB4ODAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX0NMSVBfSE9SSVpPTlRBTCA9IDE2Nzc3MjE2OyAvLyAweDEwMDAwMDAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX0NMSVBfVkVSVElDQUwgPSAyNjg0MzU0NTY7IC8vIDB4MTAwMDAwMDAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkQgPSA4Mzg4NjEzOyAvLyAweDgwMDAwNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEwgPSAxMTk7IC8vIDB4NzcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMX0hPUklaT05UQUwgPSA3OyAvLyAweDcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMX1ZFUlRJQ0FMID0gMTEyOyAvLyAweDcwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTF9HUkFWSVRZX01BU0sgPSA3OyAvLyAweDcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUID0gMzsgLy8gMHgzCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fR1JBVklUWSA9IDA7IC8vIDB4MAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSVZFX0hPUklaT05UQUxfRElSRUNUSU9OID0gODM4ODYwODsgLy8gMHg4MDAwMDAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElWRV9IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSyA9IDgzODg2MTU7IC8vIDB4ODAwMDA3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFQgPSA1OyAvLyAweDUKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IDgzODg2MTE7IC8vIDB4ODAwMDAzCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QID0gNDg7IC8vIDB4MzAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJUSUNBTF9HUkFWSVRZX01BU0sgPSAxMTI7IC8vIDB4NzAKICAgfQpAQCAtMjA2NzksNiArMjA5OTcsOCBAQAogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBNZW51SXRlbSB7CisgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbGxhcHNlQWN0aW9uVmlldygpOworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBleHBhbmRBY3Rpb25WaWV3KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuVmlldyBnZXRBY3Rpb25WaWV3KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBjaGFyIGdldEFscGhhYmV0aWNTaG9ydGN1dCgpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEdyb3VwSWQoKTsKQEAgLTIwNjkyLDYgKzIxMDEyLDcgQEAKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VGl0bGVDb25kZW5zZWQoKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzU3ViTWVudSgpOworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0FjdGlvblZpZXdFeHBhbmRlZCgpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NoZWNrYWJsZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NoZWNrZWQoKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmFibGVkKCk7CkBAIC0yMDcwNiwxOSArMjEwMjcsMjcgQEAKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRJY29uKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0SW50ZW50KGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldE51bWVyaWNTaG9ydGN1dChjaGFyKTsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRPbkFjdGlvbkV4cGFuZExpc3RlbmVyKGFuZHJvaWQudmlldy5NZW51SXRlbS5PbkFjdGlvbkV4cGFuZExpc3RlbmVyKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihhbmRyb2lkLnZpZXcuTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldFNob3J0Y3V0KGNoYXIsIGNoYXIpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50KTsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRTaG93QXNBY3Rpb25GbGFncyhpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldFRpdGxlKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldFRpdGxlKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0VGl0bGVDb25kZW5zZWQoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0VmlzaWJsZShib29sZWFuKTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9BTFdBWVMgPSAyOyAvLyAweDIKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9DT0xMQVBTRV9BQ1RJT05fVklFVyA9IDg7IC8vIDB4OAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX0lGX1JPT00gPSAxOyAvLyAweDEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9ORVZFUiA9IDA7IC8vIDB4MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX1dJVEhfVEVYVCA9IDQ7IC8vIDB4NAogICB9CiAKKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgTWVudUl0ZW0uT25BY3Rpb25FeHBhbmRMaXN0ZW5lciB7CisgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uTWVudUl0ZW1BY3Rpb25Db2xsYXBzZShhbmRyb2lkLnZpZXcuTWVudUl0ZW0pOworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbk1lbnVJdGVtQWN0aW9uRXhwYW5kKGFuZHJvaWQudmlldy5NZW51SXRlbSk7CisgIH0KKwogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGludGVyZmFjZSBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uTWVudUl0ZW1DbGljayhhbmRyb2lkLnZpZXcuTWVudUl0ZW0pOwogICB9CkBAIC0yMTEyMSw3ICsyMTQ1MCw3IEBACiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHJlY3ljbGUoKTsKICAgfQogCi0gIHB1YmxpYyBjbGFzcyBWaWV3IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50U291cmNlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUuQ2FsbGJhY2sgYW5kcm9pZC52aWV3LktleUV2ZW50LkNhbGxiYWNrIHsKKyAgcHVibGljIGNsYXNzIFZpZXcgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnRTb3VyY2UgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5DYWxsYmFjazIgYW5kcm9pZC52aWV3LktleUV2ZW50LkNhbGxiYWNrIHsKICAgICBjdG9yIHB1YmxpYyBWaWV3KGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKICAgICBjdG9yIHB1YmxpYyBWaWV3KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KTsKICAgICBjdG9yIHB1YmxpYyBWaWV3KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0LCBpbnQpOwpAQCAtMjExNTAsNiArMjE0NzksNyBAQAogICAgIG1ldGhvZCBwcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbE9mZnNldCgpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8gY3JlYXRlQWNjZXNzaWJpbGl0eU5vZGVJbmZvKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KGFuZHJvaWQudmlldy5Db250ZXh0TWVudSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGRlc3Ryb3lEcmF3aW5nQ2FjaGUoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgZGlzcGF0Y2hDb25maWd1cmF0aW9uQ2hhbmdlZChhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24pOwpAQCAtMjExNzgsNiArMjE1MDgsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZmluZEZvY3VzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlldyBmaW5kVmlld0J5SWQoaW50KTsKICAgICBtZXRob2QgcHVibGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3IGZpbmRWaWV3V2l0aFRhZyhqYXZhLmxhbmcuT2JqZWN0KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgZmluZFZpZXdzV2l0aFRleHQoamF2YS51dGlsLkFycmF5TGlzdDxhbmRyb2lkLnZpZXcuVmlldz4sIGphdmEubGFuZy5DaGFyU2VxdWVuY2UpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgYm9vbGVhbiBmaXRTeXN0ZW1XaW5kb3dzKGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBmb2N1c1NlYXJjaChpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBmb3JjZUxheW91dCgpOwpAQCAtMjEzMDcsNiArMjE2MzgsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0luVG91Y2hNb2RlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UmVxdWVzdGVkKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UnRsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UnRsKGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0xvbmdDbGlja2FibGUoKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKTsKICAgICBtZXRob2QgcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWRkaW5nT2Zmc2V0UmVxdWlyZWQoKTsKQEAgLTIxMzQ1LDYgKzIxNjc3LDcgQEAKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gb25HZW5lcmljTW90aW9uRXZlbnQoYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gb25Ib3ZlckV2ZW50KGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlFdmVudChhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBvbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCwgYW5kcm9pZC52aWV3LktleUV2ZW50KTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gb25LZXlMb25nUHJlc3MoaW50LCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBvbktleU11bHRpcGxlKGludCwgaW50LCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQpOwpAQCAtMjE2OTEsNiArMjIwMjQsMTQgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBWaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgQlVJTERfQ0FDSEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIERSQVc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIElOVkFMSURBVEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIElOVkFMSURBVEVfQ0hJTEQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIElOVkFMSURBVEVfQ0hJTERfSU5fUEFSRU5UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBPTl9MQVlPVVQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIE9OX01FQVNVUkU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIFJFUVVFU1RfTEFZT1VUOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBWaWV3RGVidWcuSW50VG9TdHJpbmcgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIHsKQEAgLTIxNjk5LDYgKzIyMDQwLDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgQklORF9WSUVXOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIE1PVkVfRlJPTV9BQ1RJVkVfVE9fU0NSQVBfSEVBUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZSBNT1ZFX1RPX1NDUkFQX0hFQVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgTkVXX1ZJRVc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgUkVDWUNMRV9GUk9NX0FDVElWRV9IRUFQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIFJFQ1lDTEVfRlJPTV9TQ1JBUF9IRUFQOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdHcm91cCBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXdNYW5hZ2VyIGFuZHJvaWQudmlldy5WaWV3UGFyZW50IHsKQEAgLTIyMjIzLDE3ICsyMjU3MCwyMiBAQAogICBwdWJsaWMgZmluYWwgY2xhc3MgQWNjZXNzaWJpbGl0eUV2ZW50IGV4dGVuZHMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVJlY29yZCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGFwcGVuZFJlY29yZChhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5UmVjb3JkKTsKICAgICBtZXRob2QgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBldmVudFR5cGVUb1N0cmluZyhpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldEFjY2Vzc2liaWxpdHlXaW5kb3dJZCgpOwogICAgIG1ldGhvZCBwdWJsaWMgbG9uZyBnZXRFdmVudFRpbWUoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRFdmVudFR5cGUoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0UGFja2FnZU5hbWUoKTsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlSZWNvcmQgZ2V0UmVjb3JkKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0UmVjb3JkQ291bnQoKTsKKyAgICBtZXRob2QgcHVibGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbyBnZXRTb3VyY2UoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgaW5pdEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCBvYnRhaW4oaW50KTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQgb2J0YWluKGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50IG9idGFpbigpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRFdmVudFRpbWUobG9uZyk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEV2ZW50VHlwZShpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlTmFtZShqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U291cmNlKGFuZHJvaWQudmlldy5WaWV3KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIENSRUFUT1I7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QT1NJVElPTiA9IC0xOyAvLyAweGZmZmZmZmZmCkBAIC0yMjI1OCwxOSArMjI2MTAsNzUgQEAKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFuYWdlciB7Ci0gICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8+IGdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOwotICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvPiBnZXRFbmFibGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KGludCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGFkZEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyLkFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKTsKKyAgICBtZXRob2QgcHVibGljIGRlcHJlY2F0ZWQgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvPiBnZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPiBnZXRFbmFibGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KGludCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gZ2V0SW5zdGFsbGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGludGVycnVwdCgpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIoYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXIuQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCk7CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGludGVyZmFjZSBBY2Nlc3NpYmlsaXR5TWFuYWdlci5BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lciB7CisgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlZChib29sZWFuKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgeworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBhZGRBY3Rpb24oaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgYWRkQ2hpbGQoYW5kcm9pZC52aWV3LlZpZXcpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRBY2Nlc3NpYmlsaXR5V2luZG93SWQoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRBY3Rpb25zKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGdldEJvdW5kcyhhbmRyb2lkLmdyYXBoaWNzLlJlY3QpOworICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGdldENoaWxkKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDbGFzc05hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFBhY2thZ2VOYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0UGFyZW50KCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRleHQoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNDaGVja2FibGUoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzQ2xpY2thYmxlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzYWJsZSgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzZWQoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNMb25nQ2xpY2thYmxlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzUGFzc3dvcmQoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbyBvYnRhaW4oYW5kcm9pZC52aWV3LlZpZXcpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbyBvYnRhaW4oKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjdGlvbihpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCByZWN5Y2xlKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEJvdW5kcyhhbmRyb2lkLmdyYXBoaWNzLlJlY3QpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDaGVja2FibGUoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q2xpY2thYmxlKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDb250ZW50RGVzY3JpcHRpb24oamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZShib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Rm9jdXNlZChib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TG9uZ0NsaWNrYWJsZShib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UGFja2FnZU5hbWUoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFBhcmVudChhbmRyb2lkLnZpZXcuVmlldyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U291cmNlKGFuZHJvaWQudmlldy5WaWV3KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VGV4dChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ0xFQVJfRk9DVVMgPSAyOyAvLyAweDIKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ0xFQVJfU0VMRUNUSU9OID0gODsgLy8gMHg4CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0ZPQ1VTID0gMTsgLy8gMHgxCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NFTEVDVCA9IDQ7IC8vIDB4NAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IgQ1JFQVRPUjsKKyAgfQorCiAgIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5UmVjb3JkIHsKICAgICBjdG9yIHByb3RlY3RlZCBBY2Nlc3NpYmlsaXR5UmVjb3JkKCk7Ci0gICAgbWV0aG9kIHByb3RlY3RlZCB2b2lkIGNsZWFyKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0QWRkZWRDb3VudCgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRCZWZvcmVUZXh0KCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDbGFzc05hbWUoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEl0ZW1JbmRleCgpOwpAQCAtMjIyODMsNiArMjI2OTEsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNGdWxsU2NyZWVuKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzUGFzc3dvcmQoKTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5UmVjb3JkIG9idGFpbihhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5UmVjb3JkKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5UmVjb3JkIG9idGFpbigpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCByZWN5Y2xlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEFkZGVkQ291bnQoaW50KTsKQEAgLTIyODY5LDYgKzIzMjc4LDcgQEAKICAgcHVibGljIGZpbmFsIGNsYXNzIElucHV0TWV0aG9kU3VidHlwZSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRXh0cmFWYWx1ZUtleShqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldERpc3BsYXlOYW1lKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBqYXZhLmxhbmcuU3RyaW5nLCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvKTsKICAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXh0cmFWYWx1ZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFeHRyYVZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0SWNvblJlc0lkKCk7CkBAIC0yMjkyNCw2ICsyMzMzNCwxMSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWxbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsIERFQlVHOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgRVJST1I7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCBMT0c7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCBUSVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCBXQVJOSU5HOwogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIENvb2tpZU1hbmFnZXIgewpAQCAtMjMwNjQsNiArMjM0NzksNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBvblJlY2VpdmVkVG91Y2hJY29uVXJsKGFuZHJvaWQud2Via2l0LldlYlZpZXcsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBvblJlcXVlc3RGb2N1cyhhbmRyb2lkLndlYmtpdC5XZWJWaWV3KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgb25TaG93Q3VzdG9tVmlldyhhbmRyb2lkLnZpZXcuVmlldywgYW5kcm9pZC53ZWJraXQuV2ViQ2hyb21lQ2xpZW50LkN1c3RvbVZpZXdDYWxsYmFjayk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uU2hvd0N1c3RvbVZpZXcoYW5kcm9pZC52aWV3LlZpZXcsIGludCwgYW5kcm9pZC53ZWJraXQuV2ViQ2hyb21lQ2xpZW50LkN1c3RvbVZpZXdDYWxsYmFjayk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGludGVyZmFjZSBXZWJDaHJvbWVDbGllbnQuQ3VzdG9tVmlld0NhbGxiYWNrIHsKQEAgLTIzMjA2LDI2ICsyMzYyMiw0MyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgY2xhc3MgV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0gTkFSUk9XX0NPTFVNTlM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSBOT1JNQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSBTSU5HTEVfQ09MVU1OOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXZWJTZXR0aW5ncy5QbHVnaW5TdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5QbHVnaW5TdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlIE9GRjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUGx1Z2luU3RhdGUgT047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlIE9OX0RFTUFORDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV2ViU2V0dGluZ3MuUmVuZGVyUHJpb3JpdHkgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUmVuZGVyUHJpb3JpdHkgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eSBISUdIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eSBMT1c7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlJlbmRlclByaW9yaXR5IE5PUk1BTDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV2ViU2V0dGluZ3MuVGV4dFNpemUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZSBMQVJHRVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplIExBUkdFU1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplIE5PUk1BTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgU01BTExFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgU01BTExFU1Q7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFdlYlNldHRpbmdzLlpvb21EZW5zaXR5IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlpvb21EZW5zaXR5IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuWm9vbURlbnNpdHlbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuWm9vbURlbnNpdHkgQ0xPU0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlpvb21EZW5zaXR5IEZBUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuWm9vbURlbnNpdHkgTUVESVVNOwogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIFdlYlN0b3JhZ2UgewpAQCAtMjQxODIsNiArMjQ2MTUsNyBAQAogICAgIGN0b3IgcHVibGljIEdyaWRMYXlvdXQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQsIGludCk7CiAgICAgY3RvciBwdWJsaWMgR3JpZExheW91dChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gZ2V0TWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRPcmllbnRhdGlvbigpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFJvd0NvdW50KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldFVzZURlZmF1bHRNYXJnaW5zKCk7CkBAIC0yNDE5MCw2ICsyNDYyNCw3IEBACiAgICAgbWV0aG9kIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4sIGludCwgaW50LCBpbnQsIGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENvbHVtbkNvdW50KGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENvbHVtbk9yZGVyUHJlc2VydmVkKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudChib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0T3JpZW50YXRpb24oaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Um93Q291bnQoaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Um93T3JkZXJQcmVzZXJ2ZWQoYm9vbGVhbik7CkBAIC0yNDIwMiw2ICsyNDYzNyw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0LkFsaWdubWVudCBMRUZUOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC5BbGlnbm1lbnQgUklHSFQ7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0LkFsaWdubWVudCBUT1A7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gLTIxNDc0ODM2NDg7IC8vIDB4ODAwMDAwMDAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJUSUNBTCA9IDE7IC8vIDB4MQogICB9CiAKQEAgLTI0MjExLDE3ICsyNDY0Nyw5IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyaWRMYXlvdXQuR3JvdXAgewotICAgIGN0b3IgcHVibGljIEdyaWRMYXlvdXQuR3JvdXAoYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC5JbnRlcnZhbCwgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC5BbGlnbm1lbnQpOwogICAgIGN0b3IgcHVibGljIEdyaWRMYXlvdXQuR3JvdXAoaW50LCBpbnQsIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuQWxpZ25tZW50KTsKICAgICBjdG9yIHB1YmxpYyBHcmlkTGF5b3V0Lkdyb3VwKGludCwgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC5BbGlnbm1lbnQpOwogICAgIGZpZWxkIHB1YmxpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0LkFsaWdubWVudCBhbGlnbm1lbnQ7Ci0gICAgZmllbGQgcHVibGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuSW50ZXJ2YWwgc3BhbjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JpZExheW91dC5JbnRlcnZhbCB7Ci0gICAgY3RvciBwdWJsaWMgR3JpZExheW91dC5JbnRlcnZhbChpbnQsIGludCk7Ci0gICAgZmllbGQgcHVibGljIGZpbmFsIGludCBtYXg7Ci0gICAgZmllbGQgcHVibGljIGZpbmFsIGludCBtaW47CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyaWRMYXlvdXQuTGF5b3V0UGFyYW1zIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5NYXJnaW5MYXlvdXRQYXJhbXMgewpAQCAtMjQzNTUsNiArMjQ3ODMsMTQgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbWFnZVZpZXcuU2NhbGVUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgQ0VOVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIENFTlRFUl9DUk9QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIENFTlRFUl9JTlNJREU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgRklUX0NFTlRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBGSVRfRU5EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIEZJVF9TVEFSVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBGSVRfWFk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgTUFUUklYOwogICB9CiAKICAgcHVibGljIGNsYXNzIExpbmVhckxheW91dCBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAgewpAQCAtMjU0MjQsNiArMjU4NjAsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRleHRWaWV3LkJ1ZmZlclR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZSBFRElUQUJMRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZSBOT1JNQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGUgU1BBTk5BQkxFOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgVGV4dFZpZXcuT25FZGl0b3JBY3Rpb25MaXN0ZW5lciB7CkBAIC0yODQxNSw2ICsyODg1NCwxMiBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRocmVhZC5TdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZC5TdGF0ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIEJMT0NLRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQuU3RhdGUgTkVXOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIFJVTk5BQkxFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIFRFUk1JTkFURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQuU3RhdGUgVElNRURfV0FJVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZC5TdGF0ZSBXQUlUSU5HOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgVGhyZWFkLlVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlciB7CkBAIC0yODU0OCw2ICsyODk5MywxNCBAQAogICBwdWJsaWMgZmluYWwgY2xhc3MgRWxlbWVudFR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBBTk5PVEFUSU9OX1RZUEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIENPTlNUUlVDVE9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBGSUVMRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgTE9DQUxfVkFSSUFCTEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIE1FVEhPRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgUEFDS0FHRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgUEFSQU1FVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBUWVBFOwogICB9CiAKICAgcHVibGljIGNsYXNzIEluY29tcGxldGVBbm5vdGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gewpAQCAtMjg1NjUsNiArMjkwMTgsOSBAQAogICBwdWJsaWMgZmluYWwgY2xhc3MgUmV0ZW50aW9uUG9saWN5IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kgQ0xBU1M7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeSBSVU5USU1FOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kgU09VUkNFOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRhcmdldCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24gewpAQCAtMjg5ODEsNiArMjk0MzcsMTQgQEAKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLm1hdGguUm91bmRpbmdNb2RlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSB2YWx1ZU9mKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIENFSUxJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgRE9XTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBGTE9PUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBIQUxGX0RPV047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgSEFMRl9FVkVOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIEhBTEZfVVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgVU5ORUNFU1NBUlk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgVVA7CiAgIH0KIAogfQpAQCAtMjkwMDcsNiArMjk0NzEsOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEF1dGhlbnRpY2F0b3IuUmVxdWVzdG9yVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuQXV0aGVudGljYXRvci5SZXF1ZXN0b3JUeXBlIFBST1hZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUgU0VSVkVSOwogICB9CiAKICAgcHVibGljIGNsYXNzIEJpbmRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24gewpAQCAtMjk0MjEsNiArMjk4ODcsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3h5LlR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5uZXQuUHJveHkuVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5LlR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkuVHlwZSBESVJFQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5LlR5cGUgSFRUUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkuVHlwZSBTT0NLUzsKICAgfQogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm94eVNlbGVjdG9yIHsKQEAgLTMwODE3LDYgKzMxMjg2LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBLZXlSZXAuVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVJlcC5UeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5LZXlSZXAuVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LktleVJlcC5UeXBlIFBSSVZBVEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5UmVwLlR5cGUgUFVCTElDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LktleVJlcC5UeXBlIFNFQ1JFVDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBLZXlTdG9yZSB7CkBAIC0zMjE5MCw2ICszMjY2MiwxMCBAQAogICBwdWJsaWMgZmluYWwgY2xhc3MgQ2xpZW50SW5mb1N0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1c1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIFJFQVNPTl9VTktOT1dOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIFJFQVNPTl9VTktOT1dOX1BST1BFUlRZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIFJFQVNPTl9WQUxVRV9JTlZBTElEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzIFJFQVNPTl9WQUxVRV9UUlVOQ0FURUQ7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIENsb2IgewpAQCAtMzI4NzQsNiArMzMzNTAsMTEgQEAKICAgcHVibGljIGZpbmFsIGNsYXNzIFJvd0lkTGlmZXRpbWUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5zcWwuUm93SWRMaWZldGltZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLlJvd0lkTGlmZXRpbWVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuUm93SWRMaWZldGltZSBST1dJRF9VTlNVUFBPUlRFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuUm93SWRMaWZldGltZSBST1dJRF9WQUxJRF9GT1JFVkVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIFJPV0lEX1ZBTElEX09USEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIFJPV0lEX1ZBTElEX1NFU1NJT047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLlJvd0lkTGlmZXRpbWUgUk9XSURfVkFMSURfVFJBTlNBQ1RJT047CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiBleHRlbmRzIGphdmEuc3FsLlNRTEV4Y2VwdGlvbiB7CkBAIC0zMzY2Myw2ICszNDE0NCwxMCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE5vcm1hbGl6ZXIuRm9ybSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtIE5GQzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybSBORkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm0gTkZLQzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybSBORktEOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGNsYXNzIE51bWJlckZvcm1hdCBleHRlbmRzIGphdmEudGV4dC5Gb3JtYXQgewpAQCAtMzQ0MDQsNiArMzQ4ODksOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZvcm1hdHRlci5CaWdEZWNpbWFsTGF5b3V0Rm9ybSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRm9ybWF0dGVyLkJpZ0RlY2ltYWxMYXlvdXRGb3JtIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkZvcm1hdHRlci5CaWdEZWNpbWFsTGF5b3V0Rm9ybVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuRm9ybWF0dGVyLkJpZ0RlY2ltYWxMYXlvdXRGb3JtIERFQ0lNQUxfRkxPQVQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIuQmlnRGVjaW1hbExheW91dEZvcm0gU0NJRU5USUZJQzsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBGb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewpAQCAtMzU4NTAsNiArMzYzMzcsMTMgQEAKICAgICBtZXRob2QgcHVibGljIGxvbmcgdG9TZWNvbmRzKGxvbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgREFZUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgSE9VUlM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IE1JQ1JPU0VDT05EUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgTUlMTElTRUNPTkRTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBNSU5VVEVTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBOQU5PU0VDT05EUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgU0VDT05EUzsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBUaW1lb3V0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CkBAIC0zODUwNiwxMSArMzkwMDAsMjAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1c1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgRklOSVNIRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBORUVEX1RBU0s7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBORUVEX1VOV1JBUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIE5FRURfV1JBUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIE5PVF9IQU5EU0hBS0lORzsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5TdGF0dXNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuU3RhdHVzIEJVRkZFUl9PVkVSRkxPVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuU3RhdHVzIEJVRkZFUl9VTkRFUkZMT1c7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBDTE9TRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBPSzsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBTU0xFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKQEAgLTQxMDI0LDExICs0MTUyNywxNSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mby5MYXllclR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uTGF5ZXJUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uTGF5ZXJUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLkxheWVyVHlwZSBMQVlFUkVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5MYXllclR5cGUgUExBSU47CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mby5UdW5uZWxUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLlR1bm5lbFR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5UdW5uZWxUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLlR1bm5lbFR5cGUgUExBSU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLlR1bm5lbFR5cGUgVFVOTkVMTEVEOwogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIFJvdXRlVHJhY2tlciBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8gewpkaWZmIC0tZ2l0IGEvY21kcy9idS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYnUvQmFja3VwLmphdmEgYi9jbWRzL2J1L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9idS9CYWNrdXAuamF2YQppbmRleCBmM2YwNDMyLi5lODFmNzk5IDEwMDY0NAotLS0gYS9jbWRzL2J1L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9idS9CYWNrdXAuamF2YQorKysgYi9jbWRzL2J1L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9idS9CYWNrdXAuamF2YQpAQCAtMzQsMTEgKzM0LDEyIEBACiAgICAgSUJhY2t1cE1hbmFnZXIgbUJhY2t1cE1hbmFnZXI7CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIExvZy5kKFRBRywgIkJlZ2lubmluZzogIiArIGFyZ3NbMF0pOwogICAgICAgICBtQXJncyA9IGFyZ3M7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuZXcgQmFja3VwKCkucnVuKCk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBydW5uaW5nIGJhY2t1cCIsIGUpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgcnVubmluZyBiYWNrdXAvcmVzdG9yZSIsIGUpOwogICAgICAgICB9CiAgICAgICAgIExvZy5kKFRBRywgIkZpbmlzaGVkLiIpOwogICAgIH0KQEAgLTQ2LDcgKzQ3LDcgQEAKICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIG1CYWNrdXBNYW5hZ2VyID0gSUJhY2t1cE1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJiYWNrdXAiKSk7CiAgICAgICAgIGlmIChtQmFja3VwTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVSUk9SOiBjb3VsZCBub3QgY29udGFjdCBiYWNrdXAgbWFuYWdlciIpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2FuJ3Qgb2J0YWluIEJhY2t1cCBNYW5hZ2VyIGJpbmRlciIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTU2LDcgKzU3LDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCJyZXN0b3JlIikpIHsKICAgICAgICAgICAgIGRvRnVsbFJlc3RvcmUoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRVJST1I6IGludmFsaWQgb3BlcmF0aW9uICciICsgYXJnICsgIiciKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgb3BlcmF0aW9uICciICsgYXJnICsgIiciKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODAsNyArODEsNiBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1hbGwiLmVxdWFscyhhcmcpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRvRXZlcnl0aGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiB1bmtub3duIGJhY2t1cCBmbGFnICIgKyBhcmcpOwogICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmtub3duIGJhY2t1cCBmbGFnICIgKyBhcmcpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CkBAIC05MSwxMyArOTEsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChkb0V2ZXJ5dGhpbmcgJiYgcGFja2FnZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiAtYWxsIHVzZWQgd2l0aCBleHBsaWNpdCBiYWNrdXAgcGFja2FnZSBzZXQiKTsKICAgICAgICAgICAgIExvZy53KFRBRywgIi1hbGwgcGFzc2VkIGZvciBiYWNrdXAgYWxvbmcgd2l0aCBzcGVjaWZpYyBwYWNrYWdlIG5hbWVzIik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIWRvRXZlcnl0aGluZyAmJiAhc2F2ZVNoYXJlZCAmJiBwYWNrYWdlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAiRVJST1I6IG5vIHBhY2thZ2VzIHN1cHBsaWVkIGZvciBiYWNrdXAgYW5kIG5laXRoZXIgLXNoYXJlZCBub3IgLWFsbCBnaXZlbiIpOwogICAgICAgICAgICAgTG9nLmUoVEFHLCAibm8gYmFja3VwIHBhY2thZ2VzIHN1cHBsaWVkIGFuZCBuZWl0aGVyIC1zaGFyZWQgbm9yIC1hbGwgZ2l2ZW4iKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTA4LDEzICsxMDUsMjIgQEAKICAgICAgICAgICAgIG1CYWNrdXBNYW5hZ2VyLmZ1bGxCYWNrdXAoZmQsIHNhdmVBcGtzLCBzYXZlU2hhcmVkLCBkb0V2ZXJ5dGhpbmcsCiAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnRvQXJyYXkocGFja0FycmF5KSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRVJST1I6IGNhbm5vdCBkdXAgU3lzdGVtLm91dCIpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2FuJ3QgZHVwIG91dCIpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFUlJPUjogdW5hYmxlIHRvIGludm9rZSBiYWNrdXAgbWFuYWdlciBzZXJ2aWNlIik7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gaW52b2tlIGJhY2t1cCBtYW5hZ2VyIGZvciBiYWNrdXAiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBkb0Z1bGxSZXN0b3JlKCkgeworICAgICAgICAvLyBObyBhcmd1bWVudHMgdG8gcmVzdG9yZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5kdXAoRmlsZURlc2NyaXB0b3IuaW4pOworICAgICAgICAgICAgbUJhY2t1cE1hbmFnZXIuZnVsbFJlc3RvcmUoZmQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYW4ndCBkdXAgU3lzdGVtLmluIik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gaW52b2tlIGJhY2t1cCBtYW5hZ2VyIGZvciByZXN0b3JlIik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZyBuZXh0QXJnKCkgewpkaWZmIC0tZ2l0IGEvY21kcy9rZXlzdG9yZS9BbmRyb2lkLm1rIGIvY21kcy9rZXlzdG9yZS9BbmRyb2lkLm1rCmluZGV4IDE1YTE5OWYuLjY3ZGQ5ZjggMTAwNjQ0Ci0tLSBhL2NtZHMva2V5c3RvcmUvQW5kcm9pZC5taworKysgYi9jbWRzL2tleXN0b3JlL0FuZHJvaWQubWsKQEAgLTE5LDE0ICsxOSwxNCBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IGtleXN0b3JlLmMKK0xPQ0FMX1NSQ19GSUxFUyA6PSBrZXlzdG9yZS5jcHAKIExPQ0FMX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJjcnlwdG8KIExPQ0FMX01PRFVMRTo9IGtleXN0b3JlCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0ga2V5c3RvcmVfY2xpLmMKK0xPQ0FMX1NSQ19GSUxFUyA6PSBrZXlzdG9yZV9jbGkuY3BwCiBMT0NBTF9DX0lOQ0xVREVTIDo9IGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGliY3J5cHRvCiBMT0NBTF9NT0RVTEU6PSBrZXlzdG9yZV9jbGkKZGlmZiAtLWdpdCBhL2NtZHMva2V5c3RvcmUva2V5c3RvcmUuYyBiL2NtZHMva2V5c3RvcmUva2V5c3RvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0MDUzYi4uMDAwMDAwMAotLS0gYS9jbWRzL2tleXN0b3JlL2tleXN0b3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAia2V5c3RvcmUiCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0KLSNpbmNsdWRlICJrZXlzdG9yZS5oIgotCi0vKiBLZXlTdG9yZSBpcyBhIHNlY3VyZWQgc3RvcmFnZSBmb3Iga2V5LXZhbHVlIHBhaXJzLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLAotICogZWFjaCBmaWxlIHN0b3JlcyBvbmUga2V5LXZhbHVlIHBhaXIuIEtleXMgYXJlIGVuY29kZWQgaW4gZmlsZSBuYW1lcywgYW5kCi0gKiB2YWx1ZXMgYXJlIGVuY3J5cHRlZCB3aXRoIGNoZWNrc3Vtcy4gVGhlIGVuY3J5cHRpb24ga2V5IGlzIHByb3RlY3RlZCBieSBhCi0gKiB1c2VyLWRlZmluZWQgcGFzc3dvcmQuIFRvIGtlZXAgdGhpbmdzIHNpbXBsZSwgYnVmZmVycyBhcmUgYWx3YXlzIGxhcmdlciB0aGFuCi0gKiB0aGUgbWF4aW11bSBzcGFjZSB3ZSBuZWVkZWQsIHNvIGJvdW5kYXJ5IGNoZWNrcyBvbiBidWZmZXJzIGFyZSBvbWl0dGVkLiAqLwotCi0jZGVmaW5lIEtFWV9TSVpFICAgICAgICAoKE5BTUVfTUFYIC0gMTUpIC8gMikKLSNkZWZpbmUgVkFMVUVfU0laRSAgICAgIDMyNzY4Ci0jZGVmaW5lIFBBU1NXT1JEX1NJWkUgICBWQUxVRV9TSVpFCi0KLS8qIEhlcmUgaXMgdGhlIGVuY29kaW5nIG9mIGtleXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGFsbG93IGFyYml0cmFyeQotICogY2hhcmFjdGVycyBpbiBrZXlzLiBDaGFyYWN0ZXJzIGluIFswLX5dIGFyZSBub3QgZW5jb2RlZC4gT3RoZXJzIGFyZSBlbmNvZGVkCi0gKiBpbnRvIHR3byBieXRlcy4gVGhlIGZpcnN0IGJ5dGUgaXMgb25lIG9mIFsrLS5dIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZpcnN0Ci0gKiB0d28gYml0cyBvZiB0aGUgY2hhcmFjdGVyLiBUaGUgc2Vjb25kIGJ5dGUgZW5jb2RlcyB0aGUgcmVzdCBvZiB0aGUgYml0cyBpbnRvCi0gKiBbMC1vXS4gVGhlcmVmb3JlIGluIHRoZSB3b3JzdCBjYXNlIHRoZSBsZW5ndGggb2YgYSBrZXkgZ2V0cyBkb3VibGVkLiBOb3RlCi0gKiB0aGF0IEJhc2U2NCBjYW5ub3QgYmUgdXNlZCBoZXJlIGR1ZSB0byB0aGUgbmVlZCBvZiBwcmVmaXggbWF0Y2ggb24ga2V5cy4gKi8KLQotc3RhdGljIGludCBlbmNvZGVfa2V5KGNoYXIgKm91dCwgdWludDhfdCAqaW4sIGludCBsZW5ndGgpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gbGVuZ3RoOyBpID4gMDsgLS1pLCArK2luLCArK291dCkgewotICAgICAgICBpZiAoKmluID49ICcwJyAmJiAqaW4gPD0gJ34nKSB7Ci0gICAgICAgICAgICAqb3V0ID0gKmluOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKm91dCA9ICcrJyArICgqaW4gPj4gNik7Ci0gICAgICAgICAgICAqKytvdXQgPSAnMCcgKyAoKmluICYgMHgzRik7Ci0gICAgICAgICAgICArK2xlbmd0aDsKLSAgICAgICAgfQotICAgIH0KLSAgICAqb3V0ID0gMDsKLSAgICByZXR1cm4gbGVuZ3RoOwotfQotCi1zdGF0aWMgaW50IGRlY29kZV9rZXkodWludDhfdCAqb3V0LCBjaGFyICppbiwgaW50IGxlbmd0aCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksICsraW4sICsrb3V0KSB7Ci0gICAgICAgIGlmICgqaW4gPj0gJzAnICYmICppbiA8PSAnficpIHsKLSAgICAgICAgICAgICpvdXQgPSAqaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqb3V0ID0gKCppbiAtICcrJykgPDwgNjsKLSAgICAgICAgICAgICpvdXQgfD0gKCorK2luIC0gJzAnKSAmIDB4M0Y7Ci0gICAgICAgICAgICAtLWxlbmd0aDsKLSAgICAgICAgfQotICAgIH0KLSAgICAqb3V0ID0gMDsKLSAgICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKiBIZXJlIGlzIHRoZSBwcm90b2NvbCB1c2VkIGluIGJvdGggcmVxdWVzdHMgYW5kIHJlc3BvbnNlczoKLSAqICAgICBjb2RlIFtsZW5ndGhfMSBtZXNzYWdlXzEgLi4uIGxlbmd0aF9uIG1lc3NhZ2Vfbl0gZW5kLW9mLWZpbGUKLSAqIHdoZXJlIGNvZGUgaXMgb25lIGJ5dGUgbG9uZyBhbmQgbGVuZ3RocyBhcmUgdW5zaWduZWQgMTYtYml0IGludGVnZXJzIGluCi0gKiBuZXR3b3JrIG9yZGVyLiBUaHVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIG1lc3NhZ2UgaXMgNjU1MzUgYnl0ZXMuICovCi0KLXN0YXRpYyBpbnQgdGhlX3NvY2tldCA9IC0xOwotCi1zdGF0aWMgaW50IHJlY3ZfY29kZShpbnQ4X3QgKmNvZGUpCi17Ci0gICAgcmV0dXJuIHJlY3YodGhlX3NvY2tldCwgY29kZSwgMSwgMCkgPT0gMTsKLX0KLQotc3RhdGljIGludCByZWN2X21lc3NhZ2UodWludDhfdCAqbWVzc2FnZSwgaW50IGxlbmd0aCkKLXsKLSAgICB1aW50OF90IGJ5dGVzWzJdOwotICAgIGlmIChyZWN2KHRoZV9zb2NrZXQsICZieXRlc1swXSwgMSwgMCkgIT0gMSB8fAotICAgICAgICByZWN2KHRoZV9zb2NrZXQsICZieXRlc1sxXSwgMSwgMCkgIT0gMSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG9mZnNldCA9IGJ5dGVzWzBdIDw8IDggfCBieXRlc1sxXTsKLSAgICAgICAgaWYgKGxlbmd0aCA8IG9mZnNldCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGxlbmd0aCA9IG9mZnNldDsKLSAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgewotICAgICAgICAgICAgaW50IG4gPSByZWN2KHRoZV9zb2NrZXQsICZtZXNzYWdlW29mZnNldF0sIGxlbmd0aCAtIG9mZnNldCwgMCk7Ci0gICAgICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICs9IG47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxlbmd0aDsKLX0KLQotc3RhdGljIGludCByZWN2X2VuZF9vZl9maWxlKCkKLXsKLSAgICB1aW50OF90IGJ5dGU7Ci0gICAgcmV0dXJuIHJlY3YodGhlX3NvY2tldCwgJmJ5dGUsIDEsIDApID09IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlbmRfY29kZShpbnQ4X3QgY29kZSkKLXsKLSAgICBzZW5kKHRoZV9zb2NrZXQsICZjb2RlLCAxLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgc2VuZF9tZXNzYWdlKHVpbnQ4X3QgKm1lc3NhZ2UsIGludCBsZW5ndGgpCi17Ci0gICAgdWludDE2X3QgYnl0ZXMgPSBodG9ucyhsZW5ndGgpOwotICAgIHNlbmQodGhlX3NvY2tldCwgJmJ5dGVzLCAyLCAwKTsKLSAgICBzZW5kKHRoZV9zb2NrZXQsIG1lc3NhZ2UsIGxlbmd0aCwgMCk7Ci19Ci0KLS8qIEhlcmUgaXMgdGhlIGZpbGUgZm9ybWF0LiBUaGVyZSBhcmUgdHdvIHBhcnRzIGluIGJsb2IudmFsdWUsIHRoZSBzZWNyZXQgYW5kCi0gKiB0aGUgZGVzY3JpcHRpb24uIFRoZSBzZWNyZXQgaXMgc3RvcmVkIGluIGNpcGhlcnRleHQsIGFuZCBpdHMgb3JpZ2luYWwgc2l6ZQotICogY2FuIGJlIGZvdW5kIGluIGJsb2IubGVuZ3RoLiBUaGUgZGVzY3JpcHRpb24gaXMgc3RvcmVkIGFmdGVyIHRoZSBzZWNyZXQgaW4KLSAqIHBsYWludGV4dCwgYW5kIGl0cyBzaXplIGlzIHNwZWNpZmllZCBpbiBibG9iLmluZm8uIFRoZSB0b3RhbCBzaXplIG9mIHRoZSB0d28KLSAqIHBhcnRzIG11c3QgYmUgbm8gbW9yZSB0aGFuIFZBTFVFX1NJWkUgYnl0ZXMuIFRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUKLSAqIGZpbGUgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBhcmUgYWx3YXlzIHNldCB0byB6ZXJvLiBGaWVsZHMgb3RoZXIKLSAqIHRoYW4gYmxvYi5pbmZvLCBibG9iLmxlbmd0aCwgYW5kIGJsb2IudmFsdWUgYXJlIG1vZGlmaWVkIGJ5IGVuY3J5cHRfYmxvYigpCi0gKiBhbmQgZGVjcnlwdF9ibG9iKCkuIFRodXMgdGhleSBzaG91bGQgbm90IGJlIGFjY2Vzc2VkIGZyb20gb3V0c2lkZS4gKi8KLQotc3RhdGljIGludCB0aGVfZW50cm9weSA9IC0xOwotCi1zdGF0aWMgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHsKLSAgICB1aW50OF90IHJlc2VydmVkWzNdOwotICAgIHVpbnQ4X3QgaW5mbzsKLSAgICB1aW50OF90IHZlY3RvcltBRVNfQkxPQ0tfU0laRV07Ci0gICAgdWludDhfdCBlbmNyeXB0ZWRbMF07Ci0gICAgdWludDhfdCBkaWdlc3RbTUQ1X0RJR0VTVF9MRU5HVEhdOwotICAgIHVpbnQ4X3QgZGlnZXN0ZWRbMF07Ci0gICAgaW50MzJfdCBsZW5ndGg7Ci0gICAgdWludDhfdCB2YWx1ZVtWQUxVRV9TSVpFICsgQUVTX0JMT0NLX1NJWkVdOwotfSBibG9iOwotCi1zdGF0aWMgaW50OF90IGVuY3J5cHRfYmxvYihjaGFyICpuYW1lLCBBRVNfS0VZICphZXNfa2V5KQotewotICAgIHVpbnQ4X3QgdmVjdG9yW0FFU19CTE9DS19TSVpFXTsKLSAgICBpbnQgbGVuZ3RoOwotICAgIGludCBmZDsKLQotICAgIGlmIChyZWFkKHRoZV9lbnRyb3B5LCBibG9iLnZlY3RvciwgQUVTX0JMT0NLX1NJWkUpICE9IEFFU19CTE9DS19TSVpFKSB7Ci0gICAgICAgIHJldHVybiBTWVNURU1fRVJST1I7Ci0gICAgfQotCi0gICAgbGVuZ3RoID0gYmxvYi5sZW5ndGggKyAoYmxvYi52YWx1ZSAtIGJsb2IuZW5jcnlwdGVkKTsKLSAgICBsZW5ndGggPSAobGVuZ3RoICsgQUVTX0JMT0NLX1NJWkUgLSAxKSAvIEFFU19CTE9DS19TSVpFICogQUVTX0JMT0NLX1NJWkU7Ci0KLSAgICBpZiAoYmxvYi5pbmZvICE9IDApIHsKLSAgICAgICAgbWVtbW92ZSgmYmxvYi5lbmNyeXB0ZWRbbGVuZ3RoXSwgJmJsb2IudmFsdWVbYmxvYi5sZW5ndGhdLCBibG9iLmluZm8pOwotICAgIH0KLQotICAgIGJsb2IubGVuZ3RoID0gaHRvbmwoYmxvYi5sZW5ndGgpOwotICAgIE1ENShibG9iLmRpZ2VzdGVkLCBsZW5ndGggLSAoYmxvYi5kaWdlc3RlZCAtIGJsb2IuZW5jcnlwdGVkKSwgYmxvYi5kaWdlc3QpOwotCi0gICAgbWVtY3B5KHZlY3RvciwgYmxvYi52ZWN0b3IsIEFFU19CTE9DS19TSVpFKTsKLSAgICBBRVNfY2JjX2VuY3J5cHQoYmxvYi5lbmNyeXB0ZWQsIGJsb2IuZW5jcnlwdGVkLCBsZW5ndGgsIGFlc19rZXksIHZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgQUVTX0VOQ1JZUFQpOwotCi0gICAgbWVtc2V0KGJsb2IucmVzZXJ2ZWQsIDAsIHNpemVvZihibG9iLnJlc2VydmVkKSk7Ci0gICAgbGVuZ3RoICs9IChibG9iLmVuY3J5cHRlZCAtICh1aW50OF90ICopJmJsb2IpICsgYmxvYi5pbmZvOwotCi0gICAgZmQgPSBvcGVuKCIudG1wIiwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGxlbmd0aCAtPSB3cml0ZShmZCwgJmJsb2IsIGxlbmd0aCk7Ci0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybiAobGVuZ3RoIHx8IHJlbmFtZSgiLnRtcCIsIG5hbWUpKSA/IFNZU1RFTV9FUlJPUiA6IE5PX0VSUk9SOwotfQotCi1zdGF0aWMgaW50OF90IGRlY3J5cHRfYmxvYihjaGFyICpuYW1lLCBBRVNfS0VZICphZXNfa2V5KQotewotICAgIGludCBmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpOwotICAgIGludCBsZW5ndGg7Ci0KLSAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIChlcnJubyA9PSBFTk9FTlQpID8gS0VZX05PVF9GT1VORCA6IFNZU1RFTV9FUlJPUjsKLSAgICB9Ci0gICAgbGVuZ3RoID0gcmVhZChmZCwgJmJsb2IsIHNpemVvZihibG9iKSk7Ci0gICAgY2xvc2UoZmQpOwotCi0gICAgbGVuZ3RoIC09IChibG9iLmVuY3J5cHRlZCAtICh1aW50OF90ICopJmJsb2IpICsgYmxvYi5pbmZvOwotICAgIGlmIChsZW5ndGggPCBibG9iLnZhbHVlIC0gYmxvYi5lbmNyeXB0ZWQgfHwgbGVuZ3RoICUgQUVTX0JMT0NLX1NJWkUgIT0gMCkgewotICAgICAgICByZXR1cm4gVkFMVUVfQ09SUlVQVEVEOwotICAgIH0KLQotICAgIEFFU19jYmNfZW5jcnlwdChibG9iLmVuY3J5cHRlZCwgYmxvYi5lbmNyeXB0ZWQsIGxlbmd0aCwgYWVzX2tleSwKLSAgICAgICAgICAgICAgICAgICAgYmxvYi52ZWN0b3IsIEFFU19ERUNSWVBUKTsKLSAgICBsZW5ndGggLT0gYmxvYi5kaWdlc3RlZCAtIGJsb2IuZW5jcnlwdGVkOwotICAgIGlmIChtZW1jbXAoYmxvYi5kaWdlc3QsIE1ENShibG9iLmRpZ2VzdGVkLCBsZW5ndGgsIE5VTEwpLAotICAgICAgICAgICAgICAgTUQ1X0RJR0VTVF9MRU5HVEgpKSB7Ci0gICAgICAgIHJldHVybiBWQUxVRV9DT1JSVVBURUQ7Ci0gICAgfQotCi0gICAgbGVuZ3RoIC09IGJsb2IudmFsdWUgLSBibG9iLmRpZ2VzdGVkOwotICAgIGJsb2IubGVuZ3RoID0gbnRvaGwoYmxvYi5sZW5ndGgpOwotICAgIGlmIChibG9iLmxlbmd0aCA8IDAgfHwgYmxvYi5sZW5ndGggPiBsZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIFZBTFVFX0NPUlJVUFRFRDsKLSAgICB9Ci0gICAgaWYgKGJsb2IuaW5mbyAhPSAwKSB7Ci0gICAgICAgIG1lbW1vdmUoJmJsb2IudmFsdWVbYmxvYi5sZW5ndGhdLCAmYmxvYi52YWx1ZVtsZW5ndGhdLCBibG9iLmluZm8pOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qIEhlcmUgYXJlIHRoZSBhY3Rpb25zLiBFYWNoIG9mIHRoZW0gaXMgYSBmdW5jdGlvbiB3aXRob3V0IGFyZ3VtZW50cy4gQWxsCi0gKiBpbmZvcm1hdGlvbiBpcyBkZWZpbmVkIGluIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGFyZSBzZXQgcHJvcGVybHkgYmVmb3JlCi0gKiBwZXJmb3JtaW5nIGFuIGFjdGlvbi4gVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IGVhY2ggYWN0aW9uIGlzCi0gKiBmaXhlZCBhbmQgZGVmaW5lZCBpbiBhIHRhYmxlLiBJZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuIGFjdGlvbiBpcyBwb3NpdGl2ZSwKLSAqIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlc3BvbnNlIGNvZGUgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBjbGllbnQuIE5vdGUKLSAqIHRoYXQgdGhlIGxlbmd0aHMgb2YgcGFyYW1ldGVycyBhcmUgY2hlY2tlZCB3aGVuIHRoZXkgYXJlIHJlY2VpdmVkLCBzbwotICogYm91bmRhcnkgY2hlY2tzIG9uIHBhcmFtZXRlcnMgYXJlIG9taXR0ZWQuICovCi0KLSNkZWZpbmUgTUFYX1BBUkFNICAgMgotI2RlZmluZSBNQVhfUkVUUlkgICA0Ci0KLXN0YXRpYyB1aWRfdCB1aWQgPSAtMTsKLXN0YXRpYyBpbnQ4X3Qgc3RhdGUgPSBVTklOSVRJQUxJWkVEOwotc3RhdGljIGludDhfdCByZXRyeSA9IE1BWF9SRVRSWTsKLQotc3RhdGljIHN0cnVjdCB7Ci0gICAgaW50IGxlbmd0aDsKLSAgICB1aW50OF90IHZhbHVlW1ZBTFVFX1NJWkVdOwotfSBwYXJhbXNbTUFYX1BBUkFNXTsKLQotc3RhdGljIEFFU19LRVkgZW5jcnlwdGlvbl9rZXk7Ci1zdGF0aWMgQUVTX0tFWSBkZWNyeXB0aW9uX2tleTsKLQotc3RhdGljIGludDhfdCB0ZXN0KCkKLXsKLSAgICByZXR1cm4gc3RhdGU7Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgZ2V0KCkKLXsKLSAgICBjaGFyIG5hbWVbTkFNRV9NQVhdOwotICAgIGludCBuID0gc3ByaW50ZihuYW1lLCAiJXVfIiwgdWlkKTsKLSAgICBlbmNvZGVfa2V5KCZuYW1lW25dLCBwYXJhbXNbMF0udmFsdWUsIHBhcmFtc1swXS5sZW5ndGgpOwotICAgIG4gPSBkZWNyeXB0X2Jsb2IobmFtZSwgJmRlY3J5cHRpb25fa2V5KTsKLSAgICBpZiAobiAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0gICAgc2VuZF9jb2RlKE5PX0VSUk9SKTsKLSAgICBzZW5kX21lc3NhZ2UoYmxvYi52YWx1ZSwgYmxvYi5sZW5ndGgpOwotICAgIHJldHVybiAtTk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgaW5zZXJ0KCkKLXsKLSAgICBjaGFyIG5hbWVbTkFNRV9NQVhdOwotICAgIGludCBuID0gc3ByaW50ZihuYW1lLCAiJXVfIiwgdWlkKTsKLSAgICBlbmNvZGVfa2V5KCZuYW1lW25dLCBwYXJhbXNbMF0udmFsdWUsIHBhcmFtc1swXS5sZW5ndGgpOwotICAgIGJsb2IuaW5mbyA9IDA7Ci0gICAgYmxvYi5sZW5ndGggPSBwYXJhbXNbMV0ubGVuZ3RoOwotICAgIG1lbWNweShibG9iLnZhbHVlLCBwYXJhbXNbMV0udmFsdWUsIHBhcmFtc1sxXS5sZW5ndGgpOwotICAgIHJldHVybiBlbmNyeXB0X2Jsb2IobmFtZSwgJmVuY3J5cHRpb25fa2V5KTsKLX0KLQotc3RhdGljIGludDhfdCBkZWxldGUoKQotewotICAgIGNoYXIgbmFtZVtOQU1FX01BWF07Ci0gICAgaW50IG4gPSBzcHJpbnRmKG5hbWUsICIldV8iLCB1aWQpOwotICAgIGVuY29kZV9rZXkoJm5hbWVbbl0sIHBhcmFtc1swXS52YWx1ZSwgcGFyYW1zWzBdLmxlbmd0aCk7Ci0gICAgcmV0dXJuICh1bmxpbmsobmFtZSkgJiYgZXJybm8gIT0gRU5PRU5UKSA/IFNZU1RFTV9FUlJPUiA6IE5PX0VSUk9SOwotfQotCi1zdGF0aWMgaW50OF90IGV4aXN0KCkKLXsKLSAgICBjaGFyIG5hbWVbTkFNRV9NQVhdOwotICAgIGludCBuID0gc3ByaW50ZihuYW1lLCAiJXVfIiwgdWlkKTsKLSAgICBlbmNvZGVfa2V5KCZuYW1lW25dLCBwYXJhbXNbMF0udmFsdWUsIHBhcmFtc1swXS5sZW5ndGgpOwotICAgIGlmIChhY2Nlc3MobmFtZSwgUl9PSykgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIChlcnJubyAhPSBFTk9FTlQpID8gU1lTVEVNX0VSUk9SIDogS0VZX05PVF9GT1VORDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0aWMgaW50OF90IHNhdygpCi17Ci0gICAgRElSICpkaXIgPSBvcGVuZGlyKCIuIik7Ci0gICAgc3RydWN0IGRpcmVudCAqZmlsZTsKLSAgICBjaGFyIG5hbWVbTkFNRV9NQVhdOwotICAgIGludCBuOwotCi0gICAgaWYgKCFkaXIpIHsKLSAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKLSAgICB9Ci0gICAgbiA9IHNwcmludGYobmFtZSwgIiV1XyIsIHVpZCk7Ci0gICAgbiArPSBlbmNvZGVfa2V5KCZuYW1lW25dLCBwYXJhbXNbMF0udmFsdWUsIHBhcmFtc1swXS5sZW5ndGgpOwotICAgIHNlbmRfY29kZShOT19FUlJPUik7Ci0gICAgd2hpbGUgKChmaWxlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RybmNtcChuYW1lLCBmaWxlLT5kX25hbWUsIG4pKSB7Ci0gICAgICAgICAgICBjaGFyICpwID0gJmZpbGUtPmRfbmFtZVtuXTsKLSAgICAgICAgICAgIHBhcmFtc1swXS5sZW5ndGggPSBkZWNvZGVfa2V5KHBhcmFtc1swXS52YWx1ZSwgcCwgc3RybGVuKHApKTsKLSAgICAgICAgICAgIHNlbmRfbWVzc2FnZShwYXJhbXNbMF0udmFsdWUsIHBhcmFtc1swXS5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGNsb3NlZGlyKGRpcik7Ci0gICAgcmV0dXJuIC1OT19FUlJPUjsKLX0KLQotc3RhdGljIGludDhfdCByZXNldCgpCi17Ci0gICAgRElSICpkaXIgPSBvcGVuZGlyKCIuIik7Ci0gICAgc3RydWN0IGRpcmVudCAqZmlsZTsKLQotICAgIG1lbXNldCgmZW5jcnlwdGlvbl9rZXksIDAsIHNpemVvZihlbmNyeXB0aW9uX2tleSkpOwotICAgIG1lbXNldCgmZGVjcnlwdGlvbl9rZXksIDAsIHNpemVvZihkZWNyeXB0aW9uX2tleSkpOwotICAgIHN0YXRlID0gVU5JTklUSUFMSVpFRDsKLSAgICByZXRyeSA9IE1BWF9SRVRSWTsKLQotICAgIGlmICghZGlyKSB7Ci0gICAgICAgIHJldHVybiBTWVNURU1fRVJST1I7Ci0gICAgfQotICAgIHdoaWxlICgoZmlsZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgewotICAgICAgICB1bmxpbmsoZmlsZS0+ZF9uYW1lKTsKLSAgICB9Ci0gICAgY2xvc2VkaXIoZGlyKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLSNkZWZpbmUgTUFTVEVSX0tFWV9GSUxFICIubWFzdGVya2V5IgotI2RlZmluZSBNQVNURVJfS0VZX1NJWkUgMTYKLSNkZWZpbmUgU0FMVF9TSVpFICAgICAgIDE2Ci0KLXN0YXRpYyB2b2lkIHNldF9rZXkodWludDhfdCAqa2V5LCB1aW50OF90ICpwYXNzd29yZCwgaW50IGxlbmd0aCwgdWludDhfdCAqc2FsdCkKLXsKLSAgICBpZiAoc2FsdCkgewotICAgICAgICBQS0NTNV9QQktERjJfSE1BQ19TSEExKChjaGFyICopcGFzc3dvcmQsIGxlbmd0aCwgc2FsdCwgU0FMVF9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxOTIsIE1BU1RFUl9LRVlfU0laRSwga2V5KTsKLSAgICB9IGVsc2UgewotICAgICAgICBQS0NTNV9QQktERjJfSE1BQ19TSEExKChjaGFyICopcGFzc3dvcmQsIGxlbmd0aCwgKHVpbnQ4X3QgKikia2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigia2V5c3RvcmUiKSwgMTAyNCwgTUFTVEVSX0tFWV9TSVpFLCBrZXkpOwotICAgIH0KLX0KLQotLyogSGVyZSBpcyB0aGUgaGlzdG9yeS4gVG8gaW1wcm92ZSB0aGUgc2VjdXJpdHksIHRoZSBwYXJhbWV0ZXJzIHRvIGdlbmVyYXRlIHRoZQotICogbWFzdGVyIGtleSBoYXMgYmVlbiBjaGFuZ2VkLiBUbyBtYWtlIGEgc2VhbWxlc3MgdHJhbnNpdGlvbiwgd2UgdXBkYXRlIHRoZQotICogZmlsZSB1c2luZyB0aGUgc2FtZSBwYXNzd29yZCB3aGVuIHRoZSB1c2VyIHVubG9jayBpdCBmb3IgdGhlIGZpcnN0IHRpbWUuIElmCi0gKiBhbnkgdGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgdGhlIHRyYW5zaXRpb24sIHRoZSBuZXcgZmlsZSB3aWxsIG5vdCBvdmVyd3JpdGUKLSAqIHRoZSBvbGQgb25lLiBUaGlzIGF2b2lkcyBwZXJtYW5lbnQgZGFtYWdlcyBvZiB0aGUgZXhpc3RpbmcgZGF0YS4gKi8KLQotc3RhdGljIGludDhfdCBwYXNzd29yZCgpCi17Ci0gICAgdWludDhfdCBrZXlbTUFTVEVSX0tFWV9TSVpFXTsKLSAgICBBRVNfS0VZIGFlc19rZXk7Ci0gICAgaW50OF90IHJlc3BvbnNlID0gU1lTVEVNX0VSUk9SOwotCi0gICAgaWYgKHN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgaWYgKHJlYWQodGhlX2VudHJvcHksIGJsb2IudmFsdWUsIE1BU1RFUl9LRVlfU0laRSkgIT0gTUFTVEVSX0tFWV9TSVpFKSB7Ci0gICAgICAgICAgIHJldHVybiBTWVNURU1fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgZmQgPSBvcGVuKE1BU1RFUl9LRVlfRklMRSwgT19SRE9OTFkpOwotICAgICAgICB1aW50OF90ICpzYWx0ID0gTlVMTDsKLSAgICAgICAgaWYgKGZkICE9IC0xKSB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVhZChmZCwgJmJsb2IsIHNpemVvZihibG9iKSk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gU0FMVF9TSVpFICYmIGJsb2IuaW5mbyA9PSBTQUxUX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBzYWx0ID0gKHVpbnQ4X3QgKikmYmxvYiArIGxlbmd0aCAtIFNBTFRfU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldF9rZXkoa2V5LCBwYXJhbXNbMF0udmFsdWUsIHBhcmFtc1swXS5sZW5ndGgsIHNhbHQpOwotICAgICAgICBBRVNfc2V0X2RlY3J5cHRfa2V5KGtleSwgTUFTVEVSX0tFWV9TSVpFICogOCwgJmFlc19rZXkpOwotICAgICAgICByZXNwb25zZSA9IGRlY3J5cHRfYmxvYihNQVNURVJfS0VZX0ZJTEUsICZhZXNfa2V5KTsKLSAgICAgICAgaWYgKHJlc3BvbnNlID09IFNZU1RFTV9FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2UgIT0gTk9fRVJST1IgfHwgYmxvYi5sZW5ndGggIT0gTUFTVEVSX0tFWV9TSVpFKSB7Ci0gICAgICAgICAgICBpZiAocmV0cnkgPD0gMCkgewotICAgICAgICAgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOSU5JVElBTElaRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gV1JPTkdfUEFTU1dPUkQgKyAtLXJldHJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzYWx0ICYmIHBhcmFtc1sxXS5sZW5ndGggPT0gLTEpIHsKLSAgICAgICAgICAgIHBhcmFtc1sxXSA9IHBhcmFtc1swXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwYXJhbXNbMV0ubGVuZ3RoID09IC0xKSB7Ci0gICAgICAgIG1lbWNweShrZXksIGJsb2IudmFsdWUsIE1BU1RFUl9LRVlfU0laRSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDhfdCAqc2FsdCA9ICZibG9iLnZhbHVlW01BU1RFUl9LRVlfU0laRV07Ci0gICAgICAgIGlmIChyZWFkKHRoZV9lbnRyb3B5LCBzYWx0LCBTQUxUX1NJWkUpICE9IFNBTFRfU0laRSkgewotICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHNldF9rZXkoa2V5LCBwYXJhbXNbMV0udmFsdWUsIHBhcmFtc1sxXS5sZW5ndGgsIHNhbHQpOwotICAgICAgICBBRVNfc2V0X2VuY3J5cHRfa2V5KGtleSwgTUFTVEVSX0tFWV9TSVpFICogOCwgJmFlc19rZXkpOwotICAgICAgICBtZW1jcHkoa2V5LCBibG9iLnZhbHVlLCBNQVNURVJfS0VZX1NJWkUpOwotICAgICAgICBibG9iLmluZm8gPSBTQUxUX1NJWkU7Ci0gICAgICAgIGJsb2IubGVuZ3RoID0gTUFTVEVSX0tFWV9TSVpFOwotICAgICAgICByZXNwb25zZSA9IGVuY3J5cHRfYmxvYihNQVNURVJfS0VZX0ZJTEUsICZhZXNfa2V5KTsKLSAgICB9Ci0KLSAgICBpZiAocmVzcG9uc2UgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXksIE1BU1RFUl9LRVlfU0laRSAqIDgsICZlbmNyeXB0aW9uX2tleSk7Ci0gICAgICAgIEFFU19zZXRfZGVjcnlwdF9rZXkoa2V5LCBNQVNURVJfS0VZX1NJWkUgKiA4LCAmZGVjcnlwdGlvbl9rZXkpOwotICAgICAgICBzdGF0ZSA9IE5PX0VSUk9SOwotICAgICAgICByZXRyeSA9IE1BWF9SRVRSWTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3BvbnNlOwotfQotCi1zdGF0aWMgaW50OF90IGxvY2soKQotewotICAgIG1lbXNldCgmZW5jcnlwdGlvbl9rZXksIDAsIHNpemVvZihlbmNyeXB0aW9uX2tleSkpOwotICAgIG1lbXNldCgmZGVjcnlwdGlvbl9rZXksIDAsIHNpemVvZihkZWNyeXB0aW9uX2tleSkpOwotICAgIHN0YXRlID0gTE9DS0VEOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdGljIGludDhfdCB1bmxvY2soKQotewotICAgIHBhcmFtc1sxXS5sZW5ndGggPSAtMTsKLSAgICByZXR1cm4gcGFzc3dvcmQoKTsKLX0KLQotLyogSGVyZSBhcmUgdGhlIHBlcm1pc3Npb25zLCBhY3Rpb25zLCB1c2VycywgYW5kIHRoZSBtYWluIGZ1bmN0aW9uLiAqLwotCi1lbnVtIHBlcm0gewotICAgIFRFU1QgICAgID0gICAxLAotICAgIEdFVCAgICAgID0gICAyLAotICAgIElOU0VSVCAgID0gICA0LAotICAgIERFTEVURSAgID0gICA4LAotICAgIEVYSVNUICAgID0gIDE2LAotICAgIFNBVyAgICAgID0gIDMyLAotICAgIFJFU0VUICAgID0gIDY0LAotICAgIFBBU1NXT1JEID0gMTI4LAotICAgIExPQ0sgICAgID0gMjU2LAotICAgIFVOTE9DSyAgID0gNTEyLAotfTsKLQotc3RhdGljIHN0cnVjdCBhY3Rpb24gewotICAgIGludDhfdCAoKnJ1bikoKTsKLSAgICBpbnQ4X3QgY29kZTsKLSAgICBpbnQ4X3Qgc3RhdGU7Ci0gICAgdWludDMyX3QgcGVybTsKLSAgICBpbnQgbGVuZ3Roc1tNQVhfUEFSQU1dOwotfSBhY3Rpb25zW10gPSB7Ci0gICAge3Rlc3QsICAgICAndCcsIDAsICAgICAgICBURVNULCAgICAgezB9fSwKLSAgICB7Z2V0LCAgICAgICdnJywgTk9fRVJST1IsIEdFVCwgICAgICB7S0VZX1NJWkV9fSwKLSAgICB7aW5zZXJ0LCAgICdpJywgTk9fRVJST1IsIElOU0VSVCwgICB7S0VZX1NJWkUsIFZBTFVFX1NJWkV9fSwKLSAgICB7ZGVsZXRlLCAgICdkJywgMCwgICAgICAgIERFTEVURSwgICB7S0VZX1NJWkV9fSwKLSAgICB7ZXhpc3QsICAgICdlJywgMCwgICAgICAgIEVYSVNULCAgICB7S0VZX1NJWkV9fSwKLSAgICB7c2F3LCAgICAgICdzJywgMCwgICAgICAgIFNBVywgICAgICB7S0VZX1NJWkV9fSwKLSAgICB7cmVzZXQsICAgICdyJywgMCwgICAgICAgIFJFU0VULCAgICB7MH19LAotICAgIHtwYXNzd29yZCwgJ3AnLCAwLCAgICAgICAgUEFTU1dPUkQsIHtQQVNTV09SRF9TSVpFLCBQQVNTV09SRF9TSVpFfX0sCi0gICAge2xvY2ssICAgICAnbCcsIE5PX0VSUk9SLCBMT0NLLCAgICAgezB9fSwKLSAgICB7dW5sb2NrLCAgICd1JywgTE9DS0VELCAgIFVOTE9DSywgICB7UEFTU1dPUkRfU0laRX19LAotICAgIHtOVUxMLCAgICAgIDAgLCAwLCAgICAgICAgMCwgICAgICAgIHswfX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHVzZXIgewotICAgIHVpZF90IHVpZDsKLSAgICB1aWRfdCBldWlkOwotICAgIHVpbnQzMl90IHBlcm1zOwotfSB1c2Vyc1tdID0gewotICAgIHtBSURfU1lTVEVNLCAgIH4wLCAgICAgICAgIH5HRVR9LAotICAgIHtBSURfVlBOLCAgICAgIEFJRF9TWVNURU0sIEdFVH0sCi0gICAge0FJRF9XSUZJLCAgICAgQUlEX1NZU1RFTSwgR0VUfSwKLSAgICB7QUlEX1JPT1QsICAgICBBSURfU1lTVEVNLCBHRVR9LAotICAgIHtBSURfS0VZQ0hBSU4sIEFJRF9TWVNURU0sIFRFU1QgfCBHRVQgfCBTQVd9LAotICAgIHt+MCwgICAgICAgICAgIH4wLCAgICAgICAgIFRFU1QgfCBHRVQgfCBJTlNFUlQgfCBERUxFVEUgfCBFWElTVCB8IFNBV30sCi19OwotCi1zdGF0aWMgaW50OF90IHByb2Nlc3MoaW50OF90IGNvZGUpIHsKLSAgICBzdHJ1Y3QgdXNlciAqdXNlciA9IHVzZXJzOwotICAgIHN0cnVjdCBhY3Rpb24gKmFjdGlvbiA9IGFjdGlvbnM7Ci0gICAgaW50IGk7Ci0KLSAgICB3aGlsZSAofnVzZXItPnVpZCAmJiB1c2VyLT51aWQgIT0gdWlkKSB7Ci0gICAgICAgICsrdXNlcjsKLSAgICB9Ci0gICAgd2hpbGUgKGFjdGlvbi0+Y29kZSAmJiBhY3Rpb24tPmNvZGUgIT0gY29kZSkgewotICAgICAgICArK2FjdGlvbjsKLSAgICB9Ci0gICAgaWYgKCFhY3Rpb24tPmNvZGUpIHsKLSAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9BQ1RJT047Ci0gICAgfQotICAgIGlmICghKGFjdGlvbi0+cGVybSAmIHVzZXItPnBlcm1zKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIGlmIChhY3Rpb24tPnN0YXRlICYmIGFjdGlvbi0+c3RhdGUgIT0gc3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRlOwotICAgIH0KLSAgICBpZiAofnVzZXItPmV1aWQpIHsKLSAgICAgICAgdWlkID0gdXNlci0+ZXVpZDsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9QQVJBTSAmJiBhY3Rpb24tPmxlbmd0aHNbaV07ICsraSkgewotICAgICAgICBwYXJhbXNbaV0ubGVuZ3RoID0gcmVjdl9tZXNzYWdlKHBhcmFtc1tpXS52YWx1ZSwgYWN0aW9uLT5sZW5ndGhzW2ldKTsKLSAgICAgICAgaWYgKHBhcmFtc1tpXS5sZW5ndGggPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBQUk9UT0NPTF9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXJlY3ZfZW5kX29mX2ZpbGUoKSkgewotICAgICAgICByZXR1cm4gUFJPVE9DT0xfRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBhY3Rpb24tPnJ1bigpOwotfQotCi0jZGVmaW5lIFJBTkRPTV9ERVZJQ0UgICAiL2Rldi91cmFuZG9tIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGNvbnRyb2xfc29ja2V0ID0gYW5kcm9pZF9nZXRfY29udHJvbF9zb2NrZXQoImtleXN0b3JlIik7Ci0gICAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgICAgIExPR0UoIkEgZGlyZWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkISIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKGNoZGlyKGFyZ3ZbMV0pID09IC0xKSB7Ci0gICAgICAgIExPR0UoImNoZGlyOiAlczogJXMiLCBhcmd2WzFdLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKCh0aGVfZW50cm9weSA9IG9wZW4oUkFORE9NX0RFVklDRSwgT19SRE9OTFkpKSA9PSAtMSkgewotICAgICAgICBMT0dFKCJvcGVuOiAlczogJXMiLCBSQU5ET01fREVWSUNFLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKGxpc3Rlbihjb250cm9sX3NvY2tldCwgMykgPT0gLTEpIHsKLSAgICAgICAgTE9HRSgibGlzdGVuOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKLSAgICBpZiAoYWNjZXNzKE1BU1RFUl9LRVlfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICBzdGF0ZSA9IExPQ0tFRDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKHRoZV9zb2NrZXQgPSBhY2NlcHQoY29udHJvbF9zb2NrZXQsIE5VTEwsIDApKSAhPSAtMSkgewotICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0diA9IHsudHZfc2VjID0gM307Ci0gICAgICAgIHN0cnVjdCB1Y3JlZCBjcmVkOwotICAgICAgICBzb2NrbGVuX3Qgc2l6ZSA9IHNpemVvZihjcmVkKTsKLSAgICAgICAgaW50OF90IHJlcXVlc3Q7Ci0KLSAgICAgICAgc2V0c29ja29wdCh0aGVfc29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJnR2LCBzaXplb2YodHYpKTsKLSAgICAgICAgc2V0c29ja29wdCh0aGVfc29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywgJnR2LCBzaXplb2YodHYpKTsKLQotICAgICAgICBpZiAoZ2V0c29ja29wdCh0aGVfc29ja2V0LCBTT0xfU09DS0VULCBTT19QRUVSQ1JFRCwgJmNyZWQsICZzaXplKSkgewotICAgICAgICAgICAgTE9HVygiZ2V0c29ja29wdDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9IGVsc2UgaWYgKHJlY3ZfY29kZSgmcmVxdWVzdCkpIHsKLSAgICAgICAgICAgIGludDhfdCBvbGRfc3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIGludDhfdCByZXNwb25zZTsKLSAgICAgICAgICAgIHVpZCA9IGNyZWQudWlkOwotCi0gICAgICAgICAgICBpZiAoKHJlc3BvbnNlID0gcHJvY2VzcyhyZXF1ZXN0KSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2VuZF9jb2RlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IC1yZXNwb25zZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTE9HSSgidWlkOiAlZCBhY3Rpb246ICVjIC0+ICVkIHN0YXRlOiAlZCAtPiAlZCByZXRyeTogJWQiLAotICAgICAgICAgICAgICAgICBjcmVkLnVpZCwgcmVxdWVzdCwgLXJlc3BvbnNlLCBvbGRfc3RhdGUsIHN0YXRlLCByZXRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2xvc2UodGhlX3NvY2tldCk7Ci0gICAgfQotICAgIExPR0UoImFjY2VwdDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvY21kcy9rZXlzdG9yZS9rZXlzdG9yZS5jcHAgYi9jbWRzL2tleXN0b3JlL2tleXN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDhiZTZlZgotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMva2V5c3RvcmUva2V5c3RvcmUuY3BwCkBAIC0wLDAgKzEsODEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKworI2RlZmluZSBMT0dfVEFHICJrZXlzdG9yZSIKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKworI2luY2x1ZGUgImtleXN0b3JlLmgiCisKKy8qIEtleVN0b3JlIGlzIGEgc2VjdXJlZCBzdG9yYWdlIGZvciBrZXktdmFsdWUgcGFpcnMuIEluIHRoaXMgaW1wbGVtZW50YXRpb24sCisgKiBlYWNoIGZpbGUgc3RvcmVzIG9uZSBrZXktdmFsdWUgcGFpci4gS2V5cyBhcmUgZW5jb2RlZCBpbiBmaWxlIG5hbWVzLCBhbmQKKyAqIHZhbHVlcyBhcmUgZW5jcnlwdGVkIHdpdGggY2hlY2tzdW1zLiBUaGUgZW5jcnlwdGlvbiBrZXkgaXMgcHJvdGVjdGVkIGJ5IGEKKyAqIHVzZXItZGVmaW5lZCBwYXNzd29yZC4gVG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCBidWZmZXJzIGFyZSBhbHdheXMgbGFyZ2VyIHRoYW4KKyAqIHRoZSBtYXhpbXVtIHNwYWNlIHdlIG5lZWRlZCwgc28gYm91bmRhcnkgY2hlY2tzIG9uIGJ1ZmZlcnMgYXJlIG9taXR0ZWQuICovCisKKyNkZWZpbmUgS0VZX1NJWkUgICAgICAgICgoTkFNRV9NQVggLSAxNSkgLyAyKQorI2RlZmluZSBWQUxVRV9TSVpFICAgICAgMzI3NjgKKyNkZWZpbmUgUEFTU1dPUkRfU0laRSAgIFZBTFVFX1NJWkUKKworc3RydWN0IFZhbHVlIHsKKyAgICBpbnQgbGVuZ3RoOworICAgIHVpbnQ4X3QgdmFsdWVbVkFMVUVfU0laRV07Cit9OworCisvKiBIZXJlIGlzIHRoZSBlbmNvZGluZyBvZiBrZXlzLiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhbGxvdyBhcmJpdHJhcnkKKyAqIGNoYXJhY3RlcnMgaW4ga2V5cy4gQ2hhcmFjdGVycyBpbiBbMC1+XSBhcmUgbm90IGVuY29kZWQuIE90aGVycyBhcmUgZW5jb2RlZAorICogaW50byB0d28gYnl0ZXMuIFRoZSBmaXJzdCBieXRlIGlzIG9uZSBvZiBbKy0uXSB3aGljaCByZXByZXNlbnRzIHRoZSBmaXJzdAorICogdHdvIGJpdHMgb2YgdGhlIGNoYXJhY3Rlci4gVGhlIHNlY29uZCBieXRlIGVuY29kZXMgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgaW50bworICogWzAtb10uIFRoZXJlZm9yZSBpbiB0aGUgd29yc3QgY2FzZSB0aGUgbGVuZ3RoIG9mIGEga2V5IGdldHMgZG91YmxlZC4gTm90ZQorICogdGhhdCBCYXNlNjQgY2Fubm90IGJlIHVzZWQgaGVyZSBkdWUgdG8gdGhlIG5lZWQgb2YgcHJlZml4IG1hdGNoIG9uIGtleXMuICovCisKK3N0YXRpYyBpbnQgZW5jb2RlX2tleShjaGFyKiBvdXQsIHVpZF90IHVpZCwgY29uc3QgVmFsdWUqIGtleSkgeworICAgIGludCBuID0gc25wcmludGYob3V0LCBOQU1FX01BWCwgIiV1XyIsIHVpZCk7CisgICAgb3V0ICs9IG47CisgICAgY29uc3QgdWludDhfdCogaW4gPSBrZXktPnZhbHVlOworICAgIGludCBsZW5ndGggPSBrZXktPmxlbmd0aDsKKyAgICBmb3IgKGludCBpID0gbGVuZ3RoOyBpID4gMDsgLS1pLCArK2luLCArK291dCkgeworICAgICAgICBpZiAoKmluID49ICcwJyAmJiAqaW4gPD0gJ34nKSB7CisgICAgICAgICAgICAqb3V0ID0gKmluOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm91dCA9ICcrJyArICgqaW4gPj4gNik7CisgICAgICAgICAgICAqKytvdXQgPSAnMCcgKyAoKmluICYgMHgzRik7CisgICAgICAgICAgICArK2xlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICAqb3V0ID0gJ1wwJzsKKyAgICByZXR1cm4gbiArIGxlbmd0aDsKK30KKworc3RhdGljIGludCBkZWNvZGVfa2V5KHVpbnQ4X3QqIG91dCwgY2hhciogaW4sIGludCBsZW5ndGgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpLCArK2luLCArK291dCkgeworICAgICAgICBpZiAoKmluID49ICcwJyAmJiAqaW4gPD0gJ34nKSB7CisgICAgICAgICAgICAqb3V0ID0gKmluOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm91dCA9ICgqaW4gLSAnKycpIDw8IDY7CisgICAgICAgICAgICAqb3V0IHw9ICgqKytpbiAtICcwJykgJiAweDNGOworICAgICAgICAgICAgLS1sZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisgICAgKm91dCA9ICdcMCc7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIHNpemVfdCByZWFkRnVsbHkoaW50IGZkLCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCByZW1haW5pbmcgPSBzaXplOworICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgIHNzaXplX3QgbiA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCBkYXRhLCBzaXplKSk7CisgICAgICAgIGlmIChuID09IC0xIHx8IG4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNpemUtcmVtYWluaW5nOworICAgICAgICB9CisgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgcmVtYWluaW5nIC09IG47CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgc2l6ZV90IHdyaXRlRnVsbHkoaW50IGZkLCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCByZW1haW5pbmcgPSBzaXplOworICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgIHNzaXplX3QgbiA9IFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShmZCwgZGF0YSwgc2l6ZSkpOworICAgICAgICBpZiAobiA9PSAtMSB8fCBuID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzaXplLXJlbWFpbmluZzsKKyAgICAgICAgfQorICAgICAgICBkYXRhICs9IG47CisgICAgICAgIHJlbWFpbmluZyAtPSBuOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworY2xhc3MgRW50cm9weSB7CitwdWJsaWM6CisgICAgRW50cm9weSgpIDogbVJhbmRvbSgtMSkge30KKyAgICB+RW50cm9weSgpIHsKKyAgICAgICAgaWYgKG1SYW5kb20gIT0gLTEpIHsKKyAgICAgICAgICAgIGNsb3NlKG1SYW5kb20pOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBvcGVuKCkgeworICAgICAgICBjb25zdCBjaGFyKiByYW5kb21EZXZpY2UgPSAiL2Rldi91cmFuZG9tIjsKKyAgICAgICAgbVJhbmRvbSA9IDo6b3BlbihyYW5kb21EZXZpY2UsIE9fUkRPTkxZKTsKKyAgICAgICAgaWYgKG1SYW5kb20gPT0gLTEpIHsKKyAgICAgICAgICAgIExPR0UoIm9wZW46ICVzOiAlcyIsIHJhbmRvbURldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGdlbmVyYXRlX3JhbmRvbV9kYXRhKHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiAocmVhZEZ1bGx5KG1SYW5kb20sIGRhdGEsIHNpemUpID09IHNpemUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQgbVJhbmRvbTsKK307CisKKy8qIEhlcmUgaXMgdGhlIGZpbGUgZm9ybWF0LiBUaGVyZSBhcmUgdHdvIHBhcnRzIGluIGJsb2IudmFsdWUsIHRoZSBzZWNyZXQgYW5kCisgKiB0aGUgZGVzY3JpcHRpb24uIFRoZSBzZWNyZXQgaXMgc3RvcmVkIGluIGNpcGhlcnRleHQsIGFuZCBpdHMgb3JpZ2luYWwgc2l6ZQorICogY2FuIGJlIGZvdW5kIGluIGJsb2IubGVuZ3RoLiBUaGUgZGVzY3JpcHRpb24gaXMgc3RvcmVkIGFmdGVyIHRoZSBzZWNyZXQgaW4KKyAqIHBsYWludGV4dCwgYW5kIGl0cyBzaXplIGlzIHNwZWNpZmllZCBpbiBibG9iLmluZm8uIFRoZSB0b3RhbCBzaXplIG9mIHRoZSB0d28KKyAqIHBhcnRzIG11c3QgYmUgbm8gbW9yZSB0aGFuIFZBTFVFX1NJWkUgYnl0ZXMuIFRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUKKyAqIGZpbGUgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBhcmUgYWx3YXlzIHNldCB0byB6ZXJvLiBGaWVsZHMgb3RoZXIKKyAqIHRoYW4gYmxvYi5pbmZvLCBibG9iLmxlbmd0aCwgYW5kIGJsb2IudmFsdWUgYXJlIG1vZGlmaWVkIGJ5IGVuY3J5cHRCbG9iKCkKKyAqIGFuZCBkZWNyeXB0QmxvYigpLiBUaHVzIHRoZXkgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZCBmcm9tIG91dHNpZGUuICovCisKK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBibG9iIHsKKyAgICB1aW50OF90IHJlc2VydmVkWzNdOworICAgIHVpbnQ4X3QgaW5mbzsKKyAgICB1aW50OF90IHZlY3RvcltBRVNfQkxPQ0tfU0laRV07CisgICAgdWludDhfdCBlbmNyeXB0ZWRbMF07CisgICAgdWludDhfdCBkaWdlc3RbTUQ1X0RJR0VTVF9MRU5HVEhdOworICAgIHVpbnQ4X3QgZGlnZXN0ZWRbMF07CisgICAgaW50MzJfdCBsZW5ndGg7IC8vIGluIG5ldHdvcmsgYnl0ZSBvcmRlciB3aGVuIGVuY3J5cHRlZAorICAgIHVpbnQ4X3QgdmFsdWVbVkFMVUVfU0laRSArIEFFU19CTE9DS19TSVpFXTsKK307CisKK2NsYXNzIEJsb2IgeworcHVibGljOgorICAgIEJsb2IodWludDhfdCogdmFsdWUsIGludDMyX3QgdmFsdWVMZW5ndGgsIHVpbnQ4X3QqIGluZm8sIHVpbnQ4X3QgaW5mb0xlbmd0aCkgeworICAgICAgICBtQmxvYi5sZW5ndGggPSB2YWx1ZUxlbmd0aDsKKyAgICAgICAgbWVtY3B5KG1CbG9iLnZhbHVlLCB2YWx1ZSwgdmFsdWVMZW5ndGgpOworCisgICAgICAgIG1CbG9iLmluZm8gPSBpbmZvTGVuZ3RoOworICAgICAgICBtZW1jcHkobUJsb2IudmFsdWUgKyB2YWx1ZUxlbmd0aCwgaW5mbywgaW5mb0xlbmd0aCk7CisgICAgfQorCisgICAgQmxvYihibG9iIGIpIHsKKyAgICAgICAgbUJsb2IgPSBiOworICAgIH0KKworICAgIEJsb2IoKSB7fQorCisgICAgdWludDhfdCogZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBtQmxvYi52YWx1ZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1CbG9iLmxlbmd0aDsKKyAgICB9CisKKyAgICB1aW50OF90IGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiBtQmxvYi5pbmZvOworICAgIH0KKworICAgIFJlc3BvbnNlQ29kZSBlbmNyeXB0QmxvYihjb25zdCBjaGFyKiBmaWxlbmFtZSwgQUVTX0tFWSAqYWVzX2tleSwgRW50cm9weSogZW50cm9weSkgeworICAgICAgICBpZiAoIWVudHJvcHktPmdlbmVyYXRlX3JhbmRvbV9kYXRhKG1CbG9iLnZlY3RvciwgQUVTX0JMT0NLX1NJWkUpKSB7CisgICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGF0YSBpbmNsdWRlcyB0aGUgdmFsdWUgYW5kIHRoZSB2YWx1ZSdzIGxlbmd0aAorICAgICAgICBzaXplX3QgZGF0YUxlbmd0aCA9IG1CbG9iLmxlbmd0aCArIHNpemVvZihtQmxvYi5sZW5ndGgpOworICAgICAgICAvLyBwYWQgZGF0YSB0byB0aGUgQUVTX0JMT0NLX1NJWkUKKyAgICAgICAgc2l6ZV90IGRpZ2VzdGVkTGVuZ3RoID0gKChkYXRhTGVuZ3RoICsgQUVTX0JMT0NLX1NJWkUgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBBRVNfQkxPQ0tfU0laRSAqIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgLy8gZW5jcnlwdGVkIGRhdGEgaW5jbHVkZXMgdGhlIGRpZ2VzdCB2YWx1ZQorICAgICAgICBzaXplX3QgZW5jcnlwdGVkTGVuZ3RoID0gZGlnZXN0ZWRMZW5ndGggKyBNRDVfRElHRVNUX0xFTkdUSDsKKyAgICAgICAgLy8gbW92ZSBpbmZvIGFmdGVyIHNwYWNlIGZvciBwYWRkaW5nCisgICAgICAgIG1lbW1vdmUoJm1CbG9iLmVuY3J5cHRlZFtlbmNyeXB0ZWRMZW5ndGhdLCAmbUJsb2IudmFsdWVbbUJsb2IubGVuZ3RoXSwgbUJsb2IuaW5mbyk7CisgICAgICAgIC8vIHplcm8gcGFkZGluZyBhcmVhCisgICAgICAgIG1lbXNldChtQmxvYi52YWx1ZSArIG1CbG9iLmxlbmd0aCwgMCwgZGlnZXN0ZWRMZW5ndGggLSBkYXRhTGVuZ3RoKTsKKworICAgICAgICBtQmxvYi5sZW5ndGggPSBodG9ubChtQmxvYi5sZW5ndGgpOworICAgICAgICBNRDUobUJsb2IuZGlnZXN0ZWQsIGRpZ2VzdGVkTGVuZ3RoLCBtQmxvYi5kaWdlc3QpOworCisgICAgICAgIHVpbnQ4X3QgdmVjdG9yW0FFU19CTE9DS19TSVpFXTsKKyAgICAgICAgbWVtY3B5KHZlY3RvciwgbUJsb2IudmVjdG9yLCBBRVNfQkxPQ0tfU0laRSk7CisgICAgICAgIEFFU19jYmNfZW5jcnlwdChtQmxvYi5lbmNyeXB0ZWQsIG1CbG9iLmVuY3J5cHRlZCwgZW5jcnlwdGVkTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgYWVzX2tleSwgdmVjdG9yLCBBRVNfRU5DUllQVCk7CisKKyAgICAgICAgbWVtc2V0KG1CbG9iLnJlc2VydmVkLCAwLCBzaXplb2YobUJsb2IucmVzZXJ2ZWQpKTsKKyAgICAgICAgc2l6ZV90IGhlYWRlckxlbmd0aCA9IChtQmxvYi5lbmNyeXB0ZWQgLSAodWludDhfdCopICZtQmxvYik7CisgICAgICAgIHNpemVfdCBmaWxlTGVuZ3RoID0gZW5jcnlwdGVkTGVuZ3RoICsgaGVhZGVyTGVuZ3RoICsgbUJsb2IuaW5mbzsKKworICAgICAgICBjb25zdCBjaGFyKiB0bXBGaWxlTmFtZSA9ICIudG1wIjsKKyAgICAgICAgaW50IG91dCA9IG9wZW4odG1wRmlsZU5hbWUsIE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQ1JFQVQsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICAgICAgaWYgKG91dCA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzaXplX3Qgd3JpdHRlbkJ5dGVzID0gd3JpdGVGdWxseShvdXQsICh1aW50OF90KikgJm1CbG9iLCBmaWxlTGVuZ3RoKTsKKyAgICAgICAgaWYgKGNsb3NlKG91dCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JpdHRlbkJ5dGVzICE9IGZpbGVMZW5ndGgpIHsKKyAgICAgICAgICAgIHVubGluayh0bXBGaWxlTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVuYW1lKHRtcEZpbGVOYW1lLCBmaWxlbmFtZSkgPT0gMCkgPyBOT19FUlJPUiA6IFNZU1RFTV9FUlJPUjsKKyAgICB9CisKKyAgICBSZXNwb25zZUNvZGUgZGVjcnlwdEJsb2IoY29uc3QgY2hhciogZmlsZW5hbWUsIEFFU19LRVkgKmFlc19rZXkpIHsKKyAgICAgICAgaW50IGluID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworICAgICAgICBpZiAoaW4gPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiAoZXJybm8gPT0gRU5PRU5UKSA/IEtFWV9OT1RfRk9VTkQgOiBTWVNURU1fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmlsZUxlbmd0aCBtYXkgYmUgbGVzcyB0aGFuIHNpemVvZihtQmxvYikgc2luY2UgdGhlIGluCisgICAgICAgIC8vIG1lbW9yeSB2ZXJzaW9uIGhhcyBleHRyYSBwYWRkaW5nIHRvIHRvbGVyYXRlIHJvdW5kaW5nIHVwIHRvCisgICAgICAgIC8vIHRoZSBBRVNfQkxPQ0tfU0laRQorICAgICAgICBzaXplX3QgZmlsZUxlbmd0aCA9IHJlYWRGdWxseShpbiwgKHVpbnQ4X3QqKSAmbUJsb2IsIHNpemVvZihtQmxvYikpOworICAgICAgICBpZiAoY2xvc2UoaW4pICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTWVNURU1fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGhlYWRlckxlbmd0aCA9IChtQmxvYi5lbmNyeXB0ZWQgLSAodWludDhfdCopICZtQmxvYik7CisgICAgICAgIGlmIChmaWxlTGVuZ3RoIDwgaGVhZGVyTGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUVfQ09SUlVQVEVEOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBlbmNyeXB0ZWRMZW5ndGggPSBmaWxlTGVuZ3RoIC0gKGhlYWRlckxlbmd0aCArIG1CbG9iLmluZm8pOworICAgICAgICBpZiAoZW5jcnlwdGVkTGVuZ3RoIDwgMCB8fCBlbmNyeXB0ZWRMZW5ndGggJSBBRVNfQkxPQ0tfU0laRSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUVfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEFFU19jYmNfZW5jcnlwdChtQmxvYi5lbmNyeXB0ZWQsIG1CbG9iLmVuY3J5cHRlZCwgZW5jcnlwdGVkTGVuZ3RoLCBhZXNfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2IudmVjdG9yLCBBRVNfREVDUllQVCk7CisgICAgICAgIHNpemVfdCBkaWdlc3RlZExlbmd0aCA9IGVuY3J5cHRlZExlbmd0aCAtIE1ENV9ESUdFU1RfTEVOR1RIOworICAgICAgICB1aW50OF90IGNvbXB1dGVkRGlnZXN0W01ENV9ESUdFU1RfTEVOR1RIXTsKKyAgICAgICAgTUQ1KG1CbG9iLmRpZ2VzdGVkLCBkaWdlc3RlZExlbmd0aCwgY29tcHV0ZWREaWdlc3QpOworICAgICAgICBpZiAobWVtY21wKG1CbG9iLmRpZ2VzdCwgY29tcHV0ZWREaWdlc3QsIE1ENV9ESUdFU1RfTEVOR1RIKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUVfQ09SUlVQVEVEOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBtYXhWYWx1ZUxlbmd0aCA9IGRpZ2VzdGVkTGVuZ3RoIC0gc2l6ZW9mKG1CbG9iLmxlbmd0aCk7CisgICAgICAgIG1CbG9iLmxlbmd0aCA9IG50b2hsKG1CbG9iLmxlbmd0aCk7CisgICAgICAgIGlmIChtQmxvYi5sZW5ndGggPCAwIHx8IG1CbG9iLmxlbmd0aCA+IG1heFZhbHVlTGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUVfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGlmIChtQmxvYi5pbmZvICE9IDApIHsKKyAgICAgICAgICAgIC8vIG1vdmUgaW5mbyBmcm9tIGFmdGVyIHBhZGRpbmcgdG8gYWZ0ZXIgZGF0YQorICAgICAgICAgICAgbWVtbW92ZSgmbUJsb2IudmFsdWVbbUJsb2IubGVuZ3RoXSwgJm1CbG9iLnZhbHVlW21heFZhbHVlTGVuZ3RoXSwgbUJsb2IuaW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgYmxvYiBtQmxvYjsKK307CisKK2NsYXNzIEtleVN0b3JlIHsKK3B1YmxpYzoKKyAgICBLZXlTdG9yZShFbnRyb3B5KiBlbnRyb3B5KSA6IG1FbnRyb3B5KGVudHJvcHkpLCBtUmV0cnkoTUFYX1JFVFJZKSB7CisgICAgICAgIGlmIChhY2Nlc3MoTUFTVEVSX0tFWV9GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICBzZXRTdGF0ZShTVEFURV9MT0NLRUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0U3RhdGUoU1RBVEVfVU5JTklUSUFMSVpFRCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdGF0ZSBnZXRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICB9CisKKyAgICBpbnQ4X3QgZ2V0UmV0cnkoKSB7CisgICAgICAgIHJldHVybiBtUmV0cnk7CisgICAgfQorCisgICAgUmVzcG9uc2VDb2RlIGluaXRpYWxpemUoVmFsdWUqIHB3KSB7CisgICAgICAgIGlmICghZ2VuZXJhdGVNYXN0ZXJLZXkoKSkgeworICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBSZXNwb25zZUNvZGUgcmVzcG9uc2UgPSB3cml0ZU1hc3RlcktleShwdyk7CisgICAgICAgIGlmIChyZXNwb25zZSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgICB9CisgICAgICAgIHNldHVwTWFzdGVyS2V5cygpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgUmVzcG9uc2VDb2RlIHdyaXRlTWFzdGVyS2V5KFZhbHVlKiBwdykgeworICAgICAgICB1aW50OF90IHBhc3N3b3JkS2V5W01BU1RFUl9LRVlfU0laRV9CWVRFU107CisgICAgICAgIGdlbmVyYXRlS2V5RnJvbVBhc3N3b3JkKHBhc3N3b3JkS2V5LCBNQVNURVJfS0VZX1NJWkVfQllURVMsIHB3LCBtU2FsdCk7CisgICAgICAgIEFFU19LRVkgcGFzc3dvcmRBZXNLZXk7CisgICAgICAgIEFFU19zZXRfZW5jcnlwdF9rZXkocGFzc3dvcmRLZXksIE1BU1RFUl9LRVlfU0laRV9CSVRTLCAmcGFzc3dvcmRBZXNLZXkpOworICAgICAgICBCbG9iIG1hc3RlcktleUJsb2IobU1hc3RlcktleSwgc2l6ZW9mKG1NYXN0ZXJLZXkpLCBtU2FsdCwgc2l6ZW9mKG1TYWx0KSk7CisgICAgICAgIHJldHVybiBtYXN0ZXJLZXlCbG9iLmVuY3J5cHRCbG9iKE1BU1RFUl9LRVlfRklMRSwgJnBhc3N3b3JkQWVzS2V5LCBtRW50cm9weSk7CisgICAgfQorCisgICAgUmVzcG9uc2VDb2RlIHJlYWRNYXN0ZXJLZXkoVmFsdWUqIHB3KSB7CisgICAgICAgIGludCBpbiA9IG9wZW4oTUFTVEVSX0tFWV9GSUxFLCBPX1JET05MWSk7CisgICAgICAgIGlmIChpbiA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIHJlYWQgdGhlIHJhdyBibG9iIHRvIGp1c3QgdG8gZ2V0IHRoZSBzYWx0IHRvIGdlbmVyYXRlCisgICAgICAgIC8vIHRoZSBBRVMga2V5LCB0aGVuIHdlIGNyZWF0ZSB0aGUgQmxvYiB0byB1c2Ugd2l0aCBkZWNyeXB0QmxvYgorICAgICAgICBibG9iIHJhd0Jsb2I7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSByZWFkRnVsbHkoaW4sICh1aW50OF90KikgJnJhd0Jsb2IsIHNpemVvZihyYXdCbG9iKSk7CisgICAgICAgIGlmIChjbG9zZShpbikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBmaW5kIHNhbHQgYXQgRU9GIGlmIHByZXNlbnQsIG90aGVyd2lzZSB3ZSBoYXZlIGFuIG9sZCBmaWxlCisgICAgICAgIHVpbnQ4X3QqIHNhbHQ7CisgICAgICAgIGlmIChsZW5ndGggPiBTQUxUX1NJWkUgJiYgcmF3QmxvYi5pbmZvID09IFNBTFRfU0laRSkgeworICAgICAgICAgICAgc2FsdCA9ICh1aW50OF90KikgJnJhd0Jsb2IgKyBsZW5ndGggLSBTQUxUX1NJWkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYWx0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IHBhc3N3b3JkS2V5W01BU1RFUl9LRVlfU0laRV9CWVRFU107CisgICAgICAgIGdlbmVyYXRlS2V5RnJvbVBhc3N3b3JkKHBhc3N3b3JkS2V5LCBNQVNURVJfS0VZX1NJWkVfQllURVMsIHB3LCBzYWx0KTsKKyAgICAgICAgQUVTX0tFWSBwYXNzd29yZEFlc0tleTsKKyAgICAgICAgQUVTX3NldF9kZWNyeXB0X2tleShwYXNzd29yZEtleSwgTUFTVEVSX0tFWV9TSVpFX0JJVFMsICZwYXNzd29yZEFlc0tleSk7CisgICAgICAgIEJsb2IgbWFzdGVyS2V5QmxvYihyYXdCbG9iKTsKKyAgICAgICAgUmVzcG9uc2VDb2RlIHJlc3BvbnNlID0gbWFzdGVyS2V5QmxvYi5kZWNyeXB0QmxvYihNQVNURVJfS0VZX0ZJTEUsICZwYXNzd29yZEFlc0tleSk7CisgICAgICAgIGlmIChyZXNwb25zZSA9PSBTWVNURU1fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBTWVNURU1fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3BvbnNlID09IE5PX0VSUk9SICYmIG1hc3RlcktleUJsb2IuZ2V0TGVuZ3RoKCkgPT0gTUFTVEVSX0tFWV9TSVpFX0JZVEVTKSB7CisgICAgICAgICAgICAvLyBpZiBzYWx0IHdhcyBtaXNzaW5nLCBnZW5lcmF0ZSBvbmUgYW5kIHdyaXRlIGEgbmV3IG1hc3RlciBrZXkgZmlsZSB3aXRoIHRoZSBzYWx0LgorICAgICAgICAgICAgaWYgKHNhbHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICghZ2VuZXJhdGVTYWx0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB3cml0ZU1hc3RlcktleShwdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzZXR1cE1hc3RlcktleXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJldHJ5IDw9IDApIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gVU5JTklUSUFMSVpFRDsKKyAgICAgICAgfQorICAgICAgICAtLW1SZXRyeTsKKyAgICAgICAgc3dpdGNoIChtUmV0cnkpIHsKKyAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFdST05HX1BBU1NXT1JEXzA7CisgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBXUk9OR19QQVNTV09SRF8xOworICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gV1JPTkdfUEFTU1dPUkRfMjsKKyAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFdST05HX1BBU1NXT1JEXzM7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gV1JPTkdfUEFTU1dPUkRfMzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgcmVzZXQoKSB7CisgICAgICAgIGNsZWFyTWFzdGVyS2V5cygpOworICAgICAgICBzZXRTdGF0ZShTVEFURV9VTklOSVRJQUxJWkVEKTsKKworICAgICAgICBESVIqIGRpciA9IG9wZW5kaXIoIi4iKTsKKyAgICAgICAgc3RydWN0IGRpcmVudCogZmlsZTsKKworICAgICAgICBpZiAoIWRpcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgoZmlsZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgdW5saW5rKGZpbGUtPmRfbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2VkaXIoZGlyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBpc0VtcHR5KCkgeworICAgICAgICBESVIqIGRpciA9IG9wZW5kaXIoIi4iKTsKKyAgICAgICAgc3RydWN0IGRpcmVudCogZmlsZTsKKyAgICAgICAgaWYgKCFkaXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKChmaWxlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoaXNLZXlGaWxlKGZpbGUtPmRfbmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihkaXIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHZvaWQgbG9jaygpIHsKKyAgICAgICAgY2xlYXJNYXN0ZXJLZXlzKCk7CisgICAgICAgIHNldFN0YXRlKFNUQVRFX0xPQ0tFRCk7CisgICAgfQorCisgICAgUmVzcG9uc2VDb2RlIGdldChjb25zdCBjaGFyKiBmaWxlbmFtZSwgQmxvYioga2V5QmxvYikgeworICAgICAgICByZXR1cm4ga2V5QmxvYi0+ZGVjcnlwdEJsb2IoZmlsZW5hbWUsICZtTWFzdGVyS2V5RGVjcnlwdGlvbik7CisgICAgfQorCisgICAgUmVzcG9uc2VDb2RlIHB1dChjb25zdCBjaGFyKiBmaWxlbmFtZSwgQmxvYioga2V5QmxvYikgeworICAgICAgICByZXR1cm4ga2V5QmxvYi0+ZW5jcnlwdEJsb2IoZmlsZW5hbWUsICZtTWFzdGVyS2V5RW5jcnlwdGlvbiwgbUVudHJvcHkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgY2hhciogTUFTVEVSX0tFWV9GSUxFOworICAgIHN0YXRpYyBjb25zdCBpbnQgTUFTVEVSX0tFWV9TSVpFX0JZVEVTID0gMTY7CisgICAgc3RhdGljIGNvbnN0IGludCBNQVNURVJfS0VZX1NJWkVfQklUUyA9IE1BU1RFUl9LRVlfU0laRV9CWVRFUyAqIDg7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9SRVRSWSA9IDQ7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBTQUxUX1NJWkUgPSAxNjsKKworICAgIEVudHJvcHkqIG1FbnRyb3B5OworCisgICAgU3RhdGUgbVN0YXRlOworICAgIGludDhfdCBtUmV0cnk7CisKKyAgICB1aW50OF90IG1NYXN0ZXJLZXlbTUFTVEVSX0tFWV9TSVpFX0JZVEVTXTsKKyAgICB1aW50OF90IG1TYWx0W1NBTFRfU0laRV07CisKKyAgICBBRVNfS0VZIG1NYXN0ZXJLZXlFbmNyeXB0aW9uOworICAgIEFFU19LRVkgbU1hc3RlcktleURlY3J5cHRpb247CisKKyAgICB2b2lkIHNldFN0YXRlKFN0YXRlIHN0YXRlKSB7CisgICAgICAgIG1TdGF0ZSA9IHN0YXRlOworICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX05PX0VSUk9SIHx8IG1TdGF0ZSA9PSBTVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICBtUmV0cnkgPSBNQVhfUkVUUlk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGdlbmVyYXRlU2FsdCgpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyb3B5LT5nZW5lcmF0ZV9yYW5kb21fZGF0YShtU2FsdCwgc2l6ZW9mKG1TYWx0KSk7CisgICAgfQorCisgICAgYm9vbCBnZW5lcmF0ZU1hc3RlcktleSgpIHsKKyAgICAgICAgaWYgKCFtRW50cm9weS0+Z2VuZXJhdGVfcmFuZG9tX2RhdGEobU1hc3RlcktleSwgc2l6ZW9mKG1NYXN0ZXJLZXkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghZ2VuZXJhdGVTYWx0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHNldHVwTWFzdGVyS2V5cygpIHsKKyAgICAgICAgQUVTX3NldF9lbmNyeXB0X2tleShtTWFzdGVyS2V5LCBNQVNURVJfS0VZX1NJWkVfQklUUywgJm1NYXN0ZXJLZXlFbmNyeXB0aW9uKTsKKyAgICAgICAgQUVTX3NldF9kZWNyeXB0X2tleShtTWFzdGVyS2V5LCBNQVNURVJfS0VZX1NJWkVfQklUUywgJm1NYXN0ZXJLZXlEZWNyeXB0aW9uKTsKKyAgICAgICAgc2V0U3RhdGUoU1RBVEVfTk9fRVJST1IpOworICAgIH0KKworICAgIHZvaWQgY2xlYXJNYXN0ZXJLZXlzKCkgeworICAgICAgICBtZW1zZXQobU1hc3RlcktleSwgMCwgc2l6ZW9mKG1NYXN0ZXJLZXkpKTsKKyAgICAgICAgbWVtc2V0KG1TYWx0LCAwLCBzaXplb2YobVNhbHQpKTsKKyAgICAgICAgbWVtc2V0KCZtTWFzdGVyS2V5RW5jcnlwdGlvbiwgMCwgc2l6ZW9mKG1NYXN0ZXJLZXlFbmNyeXB0aW9uKSk7CisgICAgICAgIG1lbXNldCgmbU1hc3RlcktleURlY3J5cHRpb24sIDAsIHNpemVvZihtTWFzdGVyS2V5RGVjcnlwdGlvbikpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdlbmVyYXRlS2V5RnJvbVBhc3N3b3JkKHVpbnQ4X3QqIGtleSwgc3NpemVfdCBrZXlTaXplLCBWYWx1ZSogcHcsIHVpbnQ4X3QqIHNhbHQpIHsKKyAgICAgICAgc2l6ZV90IHNhbHRTaXplOworICAgICAgICBpZiAoc2FsdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBzYWx0U2l6ZSA9IFNBTFRfU0laRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHByZS1naW5nZXJicmVhZCB1c2VkIHRoaXMgaGFyZHdpcmVkIHNhbHQsIHJlYWRNYXN0ZXJLZXkgd2lsbCByZXdyaXRlIHRoZXNlIHdoZW4gZm91bmQKKyAgICAgICAgICAgIHNhbHQgPSAodWludDhfdCopICJrZXlzdG9yZSI7CisgICAgICAgICAgICAvLyBzaXplb2YgPSA5LCBub3Qgc3RybGVuID0gOAorICAgICAgICAgICAgc2FsdFNpemUgPSBzaXplb2YoImtleXN0b3JlIik7CisgICAgICAgIH0KKyAgICAgICAgUEtDUzVfUEJLREYyX0hNQUNfU0hBMSgoY2hhciopIHB3LT52YWx1ZSwgcHctPmxlbmd0aCwgc2FsdCwgc2FsdFNpemUsIDgxOTIsIGtleVNpemUsIGtleSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNLZXlGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7CisgICAgICAgIHJldHVybiAoKHN0cmNtcChmaWxlbmFtZSwgTUFTVEVSX0tFWV9GSUxFKSAhPSAwKQorICAgICAgICAgICAgICAgICYmIChzdHJjbXAoZmlsZW5hbWUsICIuIikgIT0gMCkKKyAgICAgICAgICAgICAgICAmJiAoc3RyY21wKGZpbGVuYW1lLCAiLi4iKSAhPSAwKSk7CisgICAgfQorfTsKKworY29uc3QgY2hhciogS2V5U3RvcmU6Ok1BU1RFUl9LRVlfRklMRSA9ICIubWFzdGVya2V5IjsKKworLyogSGVyZSBpcyB0aGUgcHJvdG9jb2wgdXNlZCBpbiBib3RoIHJlcXVlc3RzIGFuZCByZXNwb25zZXM6CisgKiAgICAgY29kZSBbbGVuZ3RoXzEgbWVzc2FnZV8xIC4uLiBsZW5ndGhfbiBtZXNzYWdlX25dIGVuZC1vZi1maWxlCisgKiB3aGVyZSBjb2RlIGlzIG9uZSBieXRlIGxvbmcgYW5kIGxlbmd0aHMgYXJlIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VycyBpbgorICogbmV0d29yayBvcmRlci4gVGh1cyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBtZXNzYWdlIGlzIDY1NTM1IGJ5dGVzLiAqLworCitzdGF0aWMgaW50IHJlY3ZfY29kZShpbnQgc29jaywgaW50OF90KiBjb2RlKSB7CisgICAgcmV0dXJuIHJlY3Yoc29jaywgY29kZSwgMSwgMCkgPT0gMTsKK30KKworc3RhdGljIGludCByZWN2X21lc3NhZ2UoaW50IHNvY2ssIHVpbnQ4X3QqIG1lc3NhZ2UsIGludCBsZW5ndGgpIHsKKyAgICB1aW50OF90IGJ5dGVzWzJdOworICAgIGlmIChyZWN2KHNvY2ssICZieXRlc1swXSwgMSwgMCkgIT0gMSB8fAorICAgICAgICByZWN2KHNvY2ssICZieXRlc1sxXSwgMSwgMCkgIT0gMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG9mZnNldCA9IGJ5dGVzWzBdIDw8IDggfCBieXRlc1sxXTsKKyAgICAgICAgaWYgKGxlbmd0aCA8IG9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGxlbmd0aCA9IG9mZnNldDsKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgeworICAgICAgICAgICAgaW50IG4gPSByZWN2KHNvY2ssICZtZXNzYWdlW29mZnNldF0sIGxlbmd0aCAtIG9mZnNldCwgMCk7CisgICAgICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0ICs9IG47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGludCByZWN2X2VuZF9vZl9maWxlKGludCBzb2NrKSB7CisgICAgdWludDhfdCBieXRlOworICAgIHJldHVybiByZWN2KHNvY2ssICZieXRlLCAxLCAwKSA9PSAwOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2NvZGUoaW50IHNvY2ssIGludDhfdCBjb2RlKSB7CisgICAgc2VuZChzb2NrLCAmY29kZSwgMSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfbWVzc2FnZShpbnQgc29jaywgdWludDhfdCogbWVzc2FnZSwgaW50IGxlbmd0aCkgeworICAgIHVpbnQxNl90IGJ5dGVzID0gaHRvbnMobGVuZ3RoKTsKKyAgICBzZW5kKHNvY2ssICZieXRlcywgMiwgMCk7CisgICAgc2VuZChzb2NrLCBtZXNzYWdlLCBsZW5ndGgsIDApOworfQorCisvKiBIZXJlIGFyZSB0aGUgYWN0aW9ucy4gRWFjaCBvZiB0aGVtIGlzIGEgZnVuY3Rpb24gd2l0aG91dCBhcmd1bWVudHMuIEFsbAorICogaW5mb3JtYXRpb24gaXMgZGVmaW5lZCBpbiBnbG9iYWwgdmFyaWFibGVzLCB3aGljaCBhcmUgc2V0IHByb3Blcmx5IGJlZm9yZQorICogcGVyZm9ybWluZyBhbiBhY3Rpb24uIFRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyByZXF1aXJlZCBieSBlYWNoIGFjdGlvbiBpcworICogZml4ZWQgYW5kIGRlZmluZWQgaW4gYSB0YWJsZS4gSWYgdGhlIHJldHVybiB2YWx1ZSBvZiBhbiBhY3Rpb24gaXMgcG9zaXRpdmUsCisgKiBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZXNwb25zZSBjb2RlIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgY2xpZW50LiBOb3RlCisgKiB0aGF0IHRoZSBsZW5ndGhzIG9mIHBhcmFtZXRlcnMgYXJlIGNoZWNrZWQgd2hlbiB0aGV5IGFyZSByZWNlaXZlZCwgc28KKyAqIGJvdW5kYXJ5IGNoZWNrcyBvbiBwYXJhbWV0ZXJzIGFyZSBvbWl0dGVkLiAqLworCitzdGF0aWMgY29uc3QgUmVzcG9uc2VDb2RlIE5PX0VSUk9SX1JFU1BPTlNFX0NPREVfU0VOVCA9IChSZXNwb25zZUNvZGUpIDA7CisKK3N0YXRpYyBSZXNwb25zZUNvZGUgdGVzdChLZXlTdG9yZSoga2V5U3RvcmUsIGludCBzb2NrLCB1aWRfdCB1aWQsIFZhbHVlKiwgVmFsdWUqKSB7CisgICAgcmV0dXJuIChSZXNwb25zZUNvZGUpIGtleVN0b3JlLT5nZXRTdGF0ZSgpOworfQorCitzdGF0aWMgUmVzcG9uc2VDb2RlIGdldChLZXlTdG9yZSoga2V5U3RvcmUsIGludCBzb2NrLCB1aWRfdCB1aWQsIFZhbHVlKiBrZXlOYW1lLCBWYWx1ZSopIHsKKyAgICBjaGFyIGZpbGVuYW1lW05BTUVfTUFYXTsKKyAgICBlbmNvZGVfa2V5KGZpbGVuYW1lLCB1aWQsIGtleU5hbWUpOworICAgIEJsb2Iga2V5QmxvYjsKKyAgICBSZXNwb25zZUNvZGUgcmVzcG9uc2VDb2RlID0ga2V5U3RvcmUtPmdldChmaWxlbmFtZSwgJmtleUJsb2IpOworICAgIGlmIChyZXNwb25zZUNvZGUgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29kZTsKKyAgICB9CisgICAgc2VuZF9jb2RlKHNvY2ssIE5PX0VSUk9SKTsKKyAgICBzZW5kX21lc3NhZ2Uoc29jaywga2V5QmxvYi5nZXRWYWx1ZSgpLCBrZXlCbG9iLmdldExlbmd0aCgpKTsKKyAgICByZXR1cm4gTk9fRVJST1JfUkVTUE9OU0VfQ09ERV9TRU5UOworfQorCitzdGF0aWMgUmVzcG9uc2VDb2RlIGluc2VydChLZXlTdG9yZSoga2V5U3RvcmUsIGludCBzb2NrLCB1aWRfdCB1aWQsIFZhbHVlKiBrZXlOYW1lLCBWYWx1ZSogdmFsKSB7CisgICAgY2hhciBmaWxlbmFtZVtOQU1FX01BWF07CisgICAgZW5jb2RlX2tleShmaWxlbmFtZSwgdWlkLCBrZXlOYW1lKTsKKyAgICBCbG9iIGtleUJsb2IodmFsLT52YWx1ZSwgdmFsLT5sZW5ndGgsIDAsIE5VTEwpOworICAgIHJldHVybiBrZXlTdG9yZS0+cHV0KGZpbGVuYW1lLCAma2V5QmxvYik7Cit9CisKK3N0YXRpYyBSZXNwb25zZUNvZGUgZGVsKEtleVN0b3JlKiBrZXlTdG9yZSwgaW50IHNvY2ssIHVpZF90IHVpZCwgVmFsdWUqIGtleU5hbWUsIFZhbHVlKikgeworICAgIGNoYXIgZmlsZW5hbWVbTkFNRV9NQVhdOworICAgIGVuY29kZV9rZXkoZmlsZW5hbWUsIHVpZCwga2V5TmFtZSk7CisgICAgcmV0dXJuICh1bmxpbmsoZmlsZW5hbWUpICYmIGVycm5vICE9IEVOT0VOVCkgPyBTWVNURU1fRVJST1IgOiBOT19FUlJPUjsKK30KKworc3RhdGljIFJlc3BvbnNlQ29kZSBleGlzdChLZXlTdG9yZSoga2V5U3RvcmUsIGludCBzb2NrLCB1aWRfdCB1aWQsIFZhbHVlKiBrZXlOYW1lLCBWYWx1ZSopIHsKKyAgICBjaGFyIGZpbGVuYW1lW05BTUVfTUFYXTsKKyAgICBlbmNvZGVfa2V5KGZpbGVuYW1lLCB1aWQsIGtleU5hbWUpOworICAgIGlmIChhY2Nlc3MoZmlsZW5hbWUsIFJfT0spID09IC0xKSB7CisgICAgICAgIHJldHVybiAoZXJybm8gIT0gRU5PRU5UKSA/IFNZU1RFTV9FUlJPUiA6IEtFWV9OT1RfRk9VTkQ7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdGljIFJlc3BvbnNlQ29kZSBzYXcoS2V5U3RvcmUqIGtleVN0b3JlLCBpbnQgc29jaywgdWlkX3QgdWlkLCBWYWx1ZSoga2V5UHJlZml4LCBWYWx1ZSopIHsKKyAgICBESVIqIGRpciA9IG9wZW5kaXIoIi4iKTsKKyAgICBpZiAoIWRpcikgeworICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgIH0KKyAgICBjaGFyIGZpbGVuYW1lW05BTUVfTUFYXTsKKyAgICBpbnQgbiA9IGVuY29kZV9rZXkoZmlsZW5hbWUsIHVpZCwga2V5UHJlZml4KTsKKyAgICBzZW5kX2NvZGUoc29jaywgTk9fRVJST1IpOworCisgICAgc3RydWN0IGRpcmVudCogZmlsZTsKKyAgICB3aGlsZSAoKGZpbGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKGZpbGVuYW1lLCBmaWxlLT5kX25hbWUsIG4pKSB7CisgICAgICAgICAgICBjaGFyKiBwID0gJmZpbGUtPmRfbmFtZVtuXTsKKyAgICAgICAgICAgIGtleVByZWZpeC0+bGVuZ3RoID0gZGVjb2RlX2tleShrZXlQcmVmaXgtPnZhbHVlLCBwLCBzdHJsZW4ocCkpOworICAgICAgICAgICAgc2VuZF9tZXNzYWdlKHNvY2ssIGtleVByZWZpeC0+dmFsdWUsIGtleVByZWZpeC0+bGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbG9zZWRpcihkaXIpOworICAgIHJldHVybiBOT19FUlJPUl9SRVNQT05TRV9DT0RFX1NFTlQ7Cit9CisKK3N0YXRpYyBSZXNwb25zZUNvZGUgcmVzZXQoS2V5U3RvcmUqIGtleVN0b3JlLCBpbnQgc29jaywgdWlkX3QgdWlkLCBWYWx1ZSosIFZhbHVlKikgeworICAgIHJldHVybiBrZXlTdG9yZS0+cmVzZXQoKSA/IE5PX0VSUk9SIDogU1lTVEVNX0VSUk9SOworfQorCisvKiBIZXJlIGlzIHRoZSBoaXN0b3J5LiBUbyBpbXByb3ZlIHRoZSBzZWN1cml0eSwgdGhlIHBhcmFtZXRlcnMgdG8gZ2VuZXJhdGUgdGhlCisgKiBtYXN0ZXIga2V5IGhhcyBiZWVuIGNoYW5nZWQuIFRvIG1ha2UgYSBzZWFtbGVzcyB0cmFuc2l0aW9uLCB3ZSB1cGRhdGUgdGhlCisgKiBmaWxlIHVzaW5nIHRoZSBzYW1lIHBhc3N3b3JkIHdoZW4gdGhlIHVzZXIgdW5sb2NrIGl0IGZvciB0aGUgZmlyc3QgdGltZS4gSWYKKyAqIGFueSB0aGluZyBnb2VzIHdyb25nIGR1cmluZyB0aGUgdHJhbnNpdGlvbiwgdGhlIG5ldyBmaWxlIHdpbGwgbm90IG92ZXJ3cml0ZQorICogdGhlIG9sZCBvbmUuIFRoaXMgYXZvaWRzIHBlcm1hbmVudCBkYW1hZ2VzIG9mIHRoZSBleGlzdGluZyBkYXRhLiAqLworCitzdGF0aWMgUmVzcG9uc2VDb2RlIHBhc3N3b3JkKEtleVN0b3JlKiBrZXlTdG9yZSwgaW50IHNvY2ssIHVpZF90IHVpZCwgVmFsdWUqIHB3LCBWYWx1ZSopIHsKKyAgICBzd2l0Y2ggKGtleVN0b3JlLT5nZXRTdGF0ZSgpKSB7CisgICAgICAgIGNhc2UgU1RBVEVfVU5JTklUSUFMSVpFRDogeworICAgICAgICAgICAgLy8gZ2VuZXJhdGUgbWFzdGVyIGtleSwgZW5jcnlwdCB3aXRoIHBhc3N3b3JkLCB3cml0ZSB0byBmaWxlLCBpbml0aWFsaXplIG1NYXN0ZXJLZXkqLgorICAgICAgICAgICAgcmV0dXJuIGtleVN0b3JlLT5pbml0aWFsaXplKHB3KTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUQVRFX05PX0VSUk9SOiB7CisgICAgICAgICAgICAvLyByZXdyaXRlIG1hc3RlciBrZXkgd2l0aCBuZXcgcGFzc3dvcmQuCisgICAgICAgICAgICByZXR1cm4ga2V5U3RvcmUtPndyaXRlTWFzdGVyS2V5KHB3KTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUQVRFX0xPQ0tFRDogeworICAgICAgICAgICAgLy8gcmVhZCBtYXN0ZXIga2V5LCBkZWNyeXB0IHdpdGggcGFzc3dvcmQsIGluaXRpYWxpemUgbU1hc3RlcktleSouCisgICAgICAgICAgICByZXR1cm4ga2V5U3RvcmUtPnJlYWRNYXN0ZXJLZXkocHcpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTWVNURU1fRVJST1I7Cit9CisKK3N0YXRpYyBSZXNwb25zZUNvZGUgbG9jayhLZXlTdG9yZSoga2V5U3RvcmUsIGludCBzb2NrLCB1aWRfdCB1aWQsIFZhbHVlKiwgVmFsdWUqKSB7CisgICAga2V5U3RvcmUtPmxvY2soKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXRpYyBSZXNwb25zZUNvZGUgdW5sb2NrKEtleVN0b3JlKiBrZXlTdG9yZSwgaW50IHNvY2ssIHVpZF90IHVpZCwgVmFsdWUqIHB3LCBWYWx1ZSogdW51c2VkKSB7CisgICAgcmV0dXJuIHBhc3N3b3JkKGtleVN0b3JlLCBzb2NrLCB1aWQsIHB3LCB1bnVzZWQpOworfQorCitzdGF0aWMgUmVzcG9uc2VDb2RlIHplcm8oS2V5U3RvcmUqIGtleVN0b3JlLCBpbnQgc29jaywgdWlkX3QgdWlkLCBWYWx1ZSosIFZhbHVlKikgeworICAgIHJldHVybiBrZXlTdG9yZS0+aXNFbXB0eSgpID8gS0VZX05PVF9GT1VORCA6IE5PX0VSUk9SOworfQorCisvKiBIZXJlIGFyZSB0aGUgcGVybWlzc2lvbnMsIGFjdGlvbnMsIHVzZXJzLCBhbmQgdGhlIG1haW4gZnVuY3Rpb24uICovCisKK2VudW0gcGVybSB7CisgICAgVEVTVCAgICAgPSAgICAxLAorICAgIEdFVCAgICAgID0gICAgMiwKKyAgICBJTlNFUlQgICA9ICAgIDQsCisgICAgREVMRVRFICAgPSAgICA4LAorICAgIEVYSVNUICAgID0gICAxNiwKKyAgICBTQVcgICAgICA9ICAgMzIsCisgICAgUkVTRVQgICAgPSAgIDY0LAorICAgIFBBU1NXT1JEID0gIDEyOCwKKyAgICBMT0NLICAgICA9ICAyNTYsCisgICAgVU5MT0NLICAgPSAgNTEyLAorICAgIFpFUk8gICAgID0gMTAyNCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgTUFYX1BBUkFNID0gMjsKKworc3RhdGljIGNvbnN0IFN0YXRlIFNUQVRFX0FOWSA9IChTdGF0ZSkgMDsKKworc3RhdGljIHN0cnVjdCBhY3Rpb24geworICAgIFJlc3BvbnNlQ29kZSAoKnJ1bikoS2V5U3RvcmUqIGtleVN0b3JlLCBpbnQgc29jaywgdWlkX3QgdWlkLCBWYWx1ZSogcGFyYW0xLCBWYWx1ZSogcGFyYW0yKTsKKyAgICBpbnQ4X3QgY29kZTsKKyAgICBTdGF0ZSBzdGF0ZTsKKyAgICB1aW50MzJfdCBwZXJtOworICAgIGludCBsZW5ndGhzW01BWF9QQVJBTV07Cit9IGFjdGlvbnNbXSA9IHsKKyAgICB7dGVzdCwgICAgICd0JywgU1RBVEVfQU5ZLCAgICAgIFRFU1QsICAgICB7MCwgMH19LAorICAgIHtnZXQsICAgICAgJ2cnLCBTVEFURV9OT19FUlJPUiwgR0VULCAgICAgIHtLRVlfU0laRSwgMH19LAorICAgIHtpbnNlcnQsICAgJ2knLCBTVEFURV9OT19FUlJPUiwgSU5TRVJULCAgIHtLRVlfU0laRSwgVkFMVUVfU0laRX19LAorICAgIHtkZWwsICAgICAgJ2QnLCBTVEFURV9BTlksICAgICAgREVMRVRFLCAgIHtLRVlfU0laRSwgMH19LAorICAgIHtleGlzdCwgICAgJ2UnLCBTVEFURV9BTlksICAgICAgRVhJU1QsICAgIHtLRVlfU0laRSwgMH19LAorICAgIHtzYXcsICAgICAgJ3MnLCBTVEFURV9BTlksICAgICAgU0FXLCAgICAgIHtLRVlfU0laRSwgMH19LAorICAgIHtyZXNldCwgICAgJ3InLCBTVEFURV9BTlksICAgICAgUkVTRVQsICAgIHswLCAwfX0sCisgICAge3Bhc3N3b3JkLCAncCcsIFNUQVRFX0FOWSwgICAgICBQQVNTV09SRCwge1BBU1NXT1JEX1NJWkUsIDB9fSwKKyAgICB7bG9jaywgICAgICdsJywgU1RBVEVfTk9fRVJST1IsIExPQ0ssICAgICB7MCwgMH19LAorICAgIHt1bmxvY2ssICAgJ3UnLCBTVEFURV9MT0NLRUQsICAgVU5MT0NLLCAgIHtQQVNTV09SRF9TSVpFLCAwfX0sCisgICAge3plcm8sICAgICAneicsIFNUQVRFX0FOWSwgICAgICBaRVJPLCAgICAgezAsIDB9fSwKKyAgICB7TlVMTCwgICAgICAwICwgU1RBVEVfQU5ZLCAgICAgIDAsICAgICAgICB7MCwgMH19LAorfTsKKworc3RhdGljIHN0cnVjdCB1c2VyIHsKKyAgICB1aWRfdCB1aWQ7CisgICAgdWlkX3QgZXVpZDsKKyAgICB1aW50MzJfdCBwZXJtczsKK30gdXNlcnNbXSA9IHsKKyAgICB7QUlEX1NZU1RFTSwgICB+MCwgICAgICAgICB+R0VUfSwKKyAgICB7QUlEX1ZQTiwgICAgICBBSURfU1lTVEVNLCBHRVR9LAorICAgIHtBSURfV0lGSSwgICAgIEFJRF9TWVNURU0sIEdFVH0sCisgICAge0FJRF9ST09ULCAgICAgQUlEX1NZU1RFTSwgR0VUfSwKKyAgICB7QUlEX0tFWUNIQUlOLCBBSURfU1lTVEVNLCBURVNUIHwgR0VUIHwgU0FXfSwKKyAgICB7fjAsICAgICAgICAgICB+MCwgICAgICAgICBURVNUIHwgR0VUIHwgSU5TRVJUIHwgREVMRVRFIHwgRVhJU1QgfCBTQVd9LAorfTsKKworc3RhdGljIFJlc3BvbnNlQ29kZSBwcm9jZXNzKEtleVN0b3JlKiBrZXlTdG9yZSwgaW50IHNvY2ssIHVpZF90IHVpZCwgaW50OF90IGNvZGUpIHsKKyAgICBzdHJ1Y3QgdXNlciogdXNlciA9IHVzZXJzOworICAgIHN0cnVjdCBhY3Rpb24qIGFjdGlvbiA9IGFjdGlvbnM7CisgICAgaW50IGk7CisKKyAgICB3aGlsZSAofnVzZXItPnVpZCAmJiB1c2VyLT51aWQgIT0gdWlkKSB7CisgICAgICAgICsrdXNlcjsKKyAgICB9CisgICAgd2hpbGUgKGFjdGlvbi0+Y29kZSAmJiBhY3Rpb24tPmNvZGUgIT0gY29kZSkgeworICAgICAgICArK2FjdGlvbjsKKyAgICB9CisgICAgaWYgKCFhY3Rpb24tPmNvZGUpIHsKKyAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9BQ1RJT047CisgICAgfQorICAgIGlmICghKGFjdGlvbi0+cGVybSAmIHVzZXItPnBlcm1zKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChhY3Rpb24tPnN0YXRlICE9IFNUQVRFX0FOWSAmJiBhY3Rpb24tPnN0YXRlICE9IGtleVN0b3JlLT5nZXRTdGF0ZSgpKSB7CisgICAgICAgIHJldHVybiAoUmVzcG9uc2VDb2RlKSBrZXlTdG9yZS0+Z2V0U3RhdGUoKTsKKyAgICB9CisgICAgaWYgKH51c2VyLT5ldWlkKSB7CisgICAgICAgIHVpZCA9IHVzZXItPmV1aWQ7CisgICAgfQorICAgIFZhbHVlIHBhcmFtc1tNQVhfUEFSQU1dOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUEFSQU0gJiYgYWN0aW9uLT5sZW5ndGhzW2ldICE9IDA7ICsraSkgeworICAgICAgICBwYXJhbXNbaV0ubGVuZ3RoID0gcmVjdl9tZXNzYWdlKHNvY2ssIHBhcmFtc1tpXS52YWx1ZSwgYWN0aW9uLT5sZW5ndGhzW2ldKTsKKyAgICAgICAgaWYgKHBhcmFtc1tpXS5sZW5ndGggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gUFJPVE9DT0xfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFyZWN2X2VuZF9vZl9maWxlKHNvY2spKSB7CisgICAgICAgIHJldHVybiBQUk9UT0NPTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIGFjdGlvbi0+cnVuKGtleVN0b3JlLCBzb2NrLCB1aWQsICZwYXJhbXNbMF0sICZwYXJhbXNbMV0pOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaW50IGNvbnRyb2xTb2NrZXQgPSBhbmRyb2lkX2dldF9jb250cm9sX3NvY2tldCgia2V5c3RvcmUiKTsKKyAgICBpZiAoYXJnYyA8IDIpIHsKKyAgICAgICAgTE9HRSgiQSBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQhIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoY2hkaXIoYXJndlsxXSkgPT0gLTEpIHsKKyAgICAgICAgTE9HRSgiY2hkaXI6ICVzOiAlcyIsIGFyZ3ZbMV0sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIEVudHJvcHkgZW50cm9weTsKKyAgICBpZiAoIWVudHJvcHkub3BlbigpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobGlzdGVuKGNvbnRyb2xTb2NrZXQsIDMpID09IC0xKSB7CisgICAgICAgIExPR0UoImxpc3RlbjogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKyAgICBLZXlTdG9yZSBrZXlTdG9yZSgmZW50cm9weSk7CisgICAgaW50IHNvY2s7CisgICAgd2hpbGUgKChzb2NrID0gYWNjZXB0KGNvbnRyb2xTb2NrZXQsIE5VTEwsIDApKSAhPSAtMSkgeworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgdHYudHZfc2VjID0gMzsKKyAgICAgICAgc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJnR2LCBzaXplb2YodHYpKTsKKyAgICAgICAgc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywgJnR2LCBzaXplb2YodHYpKTsKKworICAgICAgICBzdHJ1Y3QgdWNyZWQgY3JlZDsKKyAgICAgICAgc29ja2xlbl90IHNpemUgPSBzaXplb2YoY3JlZCk7CisgICAgICAgIGludCBjcmVkUmVzdWx0ID0gZ2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19QRUVSQ1JFRCwgJmNyZWQsICZzaXplKTsKKyAgICAgICAgaWYgKGNyZWRSZXN1bHQgIT0gMCkgeworICAgICAgICAgICAgTE9HVygiZ2V0c29ja29wdDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50OF90IHJlcXVlc3Q7CisgICAgICAgICAgICBpZiAocmVjdl9jb2RlKHNvY2ssICZyZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgIFN0YXRlIG9sZF9zdGF0ZSA9IGtleVN0b3JlLmdldFN0YXRlKCk7CisgICAgICAgICAgICAgICAgUmVzcG9uc2VDb2RlIHJlc3BvbnNlID0gcHJvY2Vzcygma2V5U3RvcmUsIHNvY2ssIGNyZWQudWlkLCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT0gTk9fRVJST1JfUkVTUE9OU0VfQ09ERV9TRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gTk9fRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZF9jb2RlKHNvY2ssIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTE9HSSgidWlkOiAlZCBhY3Rpb246ICVjIC0+ICVkIHN0YXRlOiAlZCAtPiAlZCByZXRyeTogJWQiLAorICAgICAgICAgICAgICAgICAgICAgY3JlZC51aWQsCisgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgIG9sZF9zdGF0ZSwga2V5U3RvcmUuZ2V0U3RhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIGtleVN0b3JlLmdldFJldHJ5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsb3NlKHNvY2spOworICAgIH0KKyAgICBMT0dFKCJhY2NlcHQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NtZHMva2V5c3RvcmUva2V5c3RvcmUuaCBiL2NtZHMva2V5c3RvcmUva2V5c3RvcmUuaAppbmRleCA1ZWY1MWU5Li41YWUzZDI0IDEwMDY0NAotLS0gYS9jbWRzL2tleXN0b3JlL2tleXN0b3JlLmgKKysrIGIvY21kcy9rZXlzdG9yZS9rZXlzdG9yZS5oCkBAIC0xNywxNyArMTcsMjcgQEAKICNpZm5kZWYgX19LRVlTVE9SRV9IX18KICNkZWZpbmUgX19LRVlTVE9SRV9IX18KIAotZW51bSByZXNwb25zZV9jb2RlIHsKLSAgICBOT19FUlJPUiAgICAgICAgICA9ICAxLAotICAgIExPQ0tFRCAgICAgICAgICAgID0gIDIsCi0gICAgVU5JTklUSUFMSVpFRCAgICAgPSAgMywKKy8vIG5vdGUgc3RhdGUgdmFsdWVzIG92ZXJsYXAgd2l0aCBSZXNwb25zZUNvZGUgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgc3RhdGUoKSBBUEkKK2VudW0gU3RhdGUgeworICAgIFNUQVRFX05PX0VSUk9SICAgICAgPSAxLAorICAgIFNUQVRFX0xPQ0tFRCAgICAgICAgPSAyLAorICAgIFNUQVRFX1VOSU5JVElBTElaRUQgPSAzLAorfTsKKworZW51bSBSZXNwb25zZUNvZGUgeworICAgIE5PX0VSUk9SICAgICAgICAgID0gIFNUQVRFX05PX0VSUk9SLCAvLyAxCisgICAgTE9DS0VEICAgICAgICAgICAgPSAgU1RBVEVfTE9DS0VELCAvLyAyCisgICAgVU5JTklUSUFMSVpFRCAgICAgPSAgU1RBVEVfVU5JTklUSUFMSVpFRCwgLy8gMwogICAgIFNZU1RFTV9FUlJPUiAgICAgID0gIDQsCiAgICAgUFJPVE9DT0xfRVJST1IgICAgPSAgNSwKICAgICBQRVJNSVNTSU9OX0RFTklFRCA9ICA2LAogICAgIEtFWV9OT1RfRk9VTkQgICAgID0gIDcsCiAgICAgVkFMVUVfQ09SUlVQVEVEICAgPSAgOCwKICAgICBVTkRFRklORURfQUNUSU9OICA9ICA5LAotICAgIFdST05HX1BBU1NXT1JEICAgID0gMTAsCisgICAgV1JPTkdfUEFTU1dPUkRfMCAgPSAxMCwKKyAgICBXUk9OR19QQVNTV09SRF8xICA9IDExLAorICAgIFdST05HX1BBU1NXT1JEXzIgID0gMTIsCisgICAgV1JPTkdfUEFTU1dPUkRfMyAgPSAxMywgLy8gTUFYX1JFVFJZID0gNAogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9jbWRzL2tleXN0b3JlL2tleXN0b3JlX2NsaS5jIGIvY21kcy9rZXlzdG9yZS9rZXlzdG9yZV9jbGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhZmI1YS4uMDAwMDAwMAotLS0gYS9jbWRzL2tleXN0b3JlL2tleXN0b3JlX2NsaS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+Ci0KLSNpbmNsdWRlICJrZXlzdG9yZS5oIgotCi1jaGFyICpyZXNwb25zZXNbMjU2XSA9IHsKLSAgICBbTk9fRVJST1JdICAgICAgICAgICA9ICJObyBlcnJvciIsCi0gICAgW0xPQ0tFRF0gICAgICAgICAgICAgPSAiTG9ja2VkIiwKLSAgICBbVU5JTklUSUFMSVpFRF0gICAgICA9ICJVbmluaXRpYWxpemVkIiwKLSAgICBbU1lTVEVNX0VSUk9SXSAgICAgICA9ICJTeXN0ZW0gZXJyb3IiLAotICAgIFtQUk9UT0NPTF9FUlJPUl0gICAgID0gIlByb3RvY29sIGVycm9yIiwKLSAgICBbUEVSTUlTU0lPTl9ERU5JRURdICA9ICJQZXJtaXNzaW9uIGRlbmllZCIsCi0gICAgW0tFWV9OT1RfRk9VTkRdICAgICAgPSAiS2V5IG5vdCBmb3VuZCIsCi0gICAgW1ZBTFVFX0NPUlJVUFRFRF0gICAgPSAiVmFsdWUgY29ycnVwdGVkIiwKLSAgICBbVU5ERUZJTkVEX0FDVElPTl0gICA9ICJVbmRlZmluZWQgYWN0aW9uIiwKLSAgICBbV1JPTkdfUEFTU1dPUkRdICAgICA9ICJXcm9uZyBwYXNzd29yZCAobGFzdCBjaGFuY2UpIiwKLSAgICBbV1JPTkdfUEFTU1dPUkQgKyAxXSA9ICJXcm9uZyBwYXNzd29yZCAoMiB0cmllcyBsZWZ0KSIsCi0gICAgW1dST05HX1BBU1NXT1JEICsgMl0gPSAiV3JvbmcgcGFzc3dvcmQgKDMgdHJpZXMgbGVmdCkiLAotICAgIFtXUk9OR19QQVNTV09SRCArIDNdID0gIldyb25nIHBhc3N3b3JkICg0IHRyaWVzIGxlZnQpIiwKLX07Ci0KLSNkZWZpbmUgTUFYX1JFU1BPTlNFIChXUk9OR19QQVNTV09SRCArIDMpCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICB1aW50OF90IGJ5dGVzWzY1NTM2XTsKLSAgICB1aW50OF90IGNvZGU7Ci0gICAgaW50IHNvY2ssIGk7Ci0KLSAgICBpZiAoYXJnYyA8IDIpIHsKLSAgICAgICAgcHJpbnRmKCJVc2FnZTogJXMgYWN0aW9uIFtwYXJhbWV0ZXIgLi4uXVxuIiwgYXJndlswXSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHNvY2sgPSBzb2NrZXRfbG9jYWxfY2xpZW50KCJrZXlzdG9yZSIsIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9SRVNFUlZFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0NLX1NUUkVBTSk7Ci0gICAgaWYgKHNvY2sgPT0gLTEpIHsKLSAgICAgICAgcHV0cygiRmFpbGVkIHRvIGNvbm5lY3QiKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgc2VuZChzb2NrLCBhcmd2WzFdLCAxLCAwKTsKLSAgICBmb3IgKGkgPSAyOyBpIDwgYXJnYzsgKytpKSB7Ci0gICAgICAgIHVpbnQxNl90IGxlbmd0aCA9IHN0cmxlbihhcmd2W2ldKTsKLSAgICAgICAgYnl0ZXNbMF0gPSBsZW5ndGggPj4gODsKLSAgICAgICAgYnl0ZXNbMV0gPSBsZW5ndGg7Ci0gICAgICAgIHNlbmQoc29jaywgJmJ5dGVzLCAyLCAwKTsKLSAgICAgICAgc2VuZChzb2NrLCBhcmd2W2ldLCBsZW5ndGgsIDApOwotICAgIH0KLSAgICBzaHV0ZG93bihzb2NrLCBTSFVUX1dSKTsKLQotICAgIGlmIChyZWN2KHNvY2ssICZjb2RlLCAxLCAwKSAhPSAxKSB7Ci0gICAgICAgIHB1dHMoIkZhaWxlZCB0byByZWNlaXZlIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBwcmludGYoIiVkICVzXG4iLCBjb2RlICwgcmVzcG9uc2VzW2NvZGVdID8gcmVzcG9uc2VzW2NvZGVdIDogIlVua25vd24iKTsKLSAgICB3aGlsZSAoKGkgPSByZWN2KHNvY2ssICZieXRlc1swXSwgMSwgMCkpID09IDEpIHsKLSAgICAgICAgaW50IGxlbmd0aDsKLSAgICAgICAgaW50IG9mZnNldDsKLSAgICAgICAgaWYgKChpID0gcmVjdihzb2NrLCAmYnl0ZXNbMV0sIDEsIDApKSAhPSAxKSB7Ci0gICAgICAgICAgICBwdXRzKCJGYWlsZWQgdG8gcmVjZWl2ZSIpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuZ3RoID0gYnl0ZXNbMF0gPDwgOCB8IGJ5dGVzWzFdOwotICAgICAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGxlbmd0aDsgb2Zmc2V0ICs9IGkpIHsKLSAgICAgICAgICAgIGkgPSByZWN2KHNvY2ssICZieXRlc1tvZmZzZXRdLCBsZW5ndGggLSBvZmZzZXQsIDApOwotICAgICAgICAgICAgaWYgKGkgPD0gMCkgewotICAgICAgICAgICAgICAgIHB1dHMoIkZhaWxlZCB0byByZWNlaXZlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZndyaXRlKGJ5dGVzLCAxLCBsZW5ndGgsIHN0ZG91dCk7Ci0gICAgICAgIHB1dHMoIiIpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2NtZHMva2V5c3RvcmUva2V5c3RvcmVfY2xpLmNwcCBiL2NtZHMva2V5c3RvcmUva2V5c3RvcmVfY2xpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QzYmNiCi0tLSAvZGV2L251bGwKKysrIGIvY21kcy9rZXlzdG9yZS9rZXlzdG9yZV9jbGkuY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgorCisjaW5jbHVkZSAia2V5c3RvcmUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIqIHJlc3BvbnNlc1tdID0geworICAgIE5VTEwsCisgICAgLyogW05PX0VSUk9SXSAgICAgICAgICAgPSAqLyAiTm8gZXJyb3IiLAorICAgIC8qIFtMT0NLRURdICAgICAgICAgICAgID0gKi8gIkxvY2tlZCIsCisgICAgLyogW1VOSU5JVElBTElaRURdICAgICAgPSAqLyAiVW5pbml0aWFsaXplZCIsCisgICAgLyogW1NZU1RFTV9FUlJPUl0gICAgICAgPSAqLyAiU3lzdGVtIGVycm9yIiwKKyAgICAvKiBbUFJPVE9DT0xfRVJST1JdICAgICA9ICovICJQcm90b2NvbCBlcnJvciIsCisgICAgLyogW1BFUk1JU1NJT05fREVOSUVEXSAgPSAqLyAiUGVybWlzc2lvbiBkZW5pZWQiLAorICAgIC8qIFtLRVlfTk9UX0ZPVU5EXSAgICAgID0gKi8gIktleSBub3QgZm91bmQiLAorICAgIC8qIFtWQUxVRV9DT1JSVVBURURdICAgID0gKi8gIlZhbHVlIGNvcnJ1cHRlZCIsCisgICAgLyogW1VOREVGSU5FRF9BQ1RJT05dICAgPSAqLyAiVW5kZWZpbmVkIGFjdGlvbiIsCisgICAgLyogW1dST05HX1BBU1NXT1JEXSAgICAgPSAqLyAiV3JvbmcgcGFzc3dvcmQgKGxhc3QgY2hhbmNlKSIsCisgICAgLyogW1dST05HX1BBU1NXT1JEICsgMV0gPSAqLyAiV3JvbmcgcGFzc3dvcmQgKDIgdHJpZXMgbGVmdCkiLAorICAgIC8qIFtXUk9OR19QQVNTV09SRCArIDJdID0gKi8gIldyb25nIHBhc3N3b3JkICgzIHRyaWVzIGxlZnQpIiwKKyAgICAvKiBbV1JPTkdfUEFTU1dPUkQgKyAzXSA9ICovICJXcm9uZyBwYXNzd29yZCAoNCB0cmllcyBsZWZ0KSIsCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICAgIGlmIChhcmdjIDwgMikgeworICAgICAgICBwcmludGYoIlVzYWdlOiAlcyBhY3Rpb24gW3BhcmFtZXRlciAuLi5dXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IHNvY2sgPSBzb2NrZXRfbG9jYWxfY2xpZW50KCJrZXlzdG9yZSIsIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9SRVNFUlZFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09DS19TVFJFQU0pOworICAgIGlmIChzb2NrID09IC0xKSB7CisgICAgICAgIHB1dHMoIkZhaWxlZCB0byBjb25uZWN0Iik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHNlbmQoc29jaywgYXJndlsxXSwgMSwgMCk7CisgICAgdWludDhfdCBieXRlc1s2NTUzNl07CisgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBhcmdjOyArK2kpIHsKKyAgICAgICAgdWludDE2X3QgbGVuZ3RoID0gc3RybGVuKGFyZ3ZbaV0pOworICAgICAgICBieXRlc1swXSA9IGxlbmd0aCA+PiA4OworICAgICAgICBieXRlc1sxXSA9IGxlbmd0aDsKKyAgICAgICAgc2VuZChzb2NrLCAmYnl0ZXMsIDIsIDApOworICAgICAgICBzZW5kKHNvY2ssIGFyZ3ZbaV0sIGxlbmd0aCwgMCk7CisgICAgfQorICAgIHNodXRkb3duKHNvY2ssIFNIVVRfV1IpOworCisgICAgdWludDhfdCBjb2RlOworICAgIGlmIChyZWN2KHNvY2ssICZjb2RlLCAxLCAwKSAhPSAxKSB7CisgICAgICAgIHB1dHMoIkZhaWxlZCB0byByZWNlaXZlIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBwcmludGYoIiVkICVzXG4iLCBjb2RlICwgcmVzcG9uc2VzW2NvZGVdID8gcmVzcG9uc2VzW2NvZGVdIDogIlVua25vd24iKTsKKyAgICBpbnQgaTsKKyAgICB3aGlsZSAoKGkgPSByZWN2KHNvY2ssICZieXRlc1swXSwgMSwgMCkpID09IDEpIHsKKyAgICAgICAgaW50IGxlbmd0aDsKKyAgICAgICAgaW50IG9mZnNldDsKKyAgICAgICAgaWYgKChpID0gcmVjdihzb2NrLCAmYnl0ZXNbMV0sIDEsIDApKSAhPSAxKSB7CisgICAgICAgICAgICBwdXRzKCJGYWlsZWQgdG8gcmVjZWl2ZSIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoID0gYnl0ZXNbMF0gPDwgOCB8IGJ5dGVzWzFdOworICAgICAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGxlbmd0aDsgb2Zmc2V0ICs9IGkpIHsKKyAgICAgICAgICAgIGkgPSByZWN2KHNvY2ssICZieXRlc1tvZmZzZXRdLCBsZW5ndGggLSBvZmZzZXQsIDApOworICAgICAgICAgICAgaWYgKGkgPD0gMCkgeworICAgICAgICAgICAgICAgIHB1dHMoIkZhaWxlZCB0byByZWNlaXZlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZndyaXRlKGJ5dGVzLCAxLCBsZW5ndGgsIHN0ZG91dCk7CisgICAgICAgIHB1dHMoIiIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NtZHMvc2Vuc29yc2VydmljZS9BbmRyb2lkLm1rIGIvY21kcy9zZW5zb3JzZXJ2aWNlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxMWJlNQotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc2Vuc29yc2VydmljZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwltYWluX3NlbnNvcnNlcnZpY2UuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnNlbnNvcnNlcnZpY2UgXAorCWxpYmJpbmRlciBcCisJbGlidXRpbHMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChMT0NBTF9QQVRIKS8uLi8uLi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRTo9IHNlbnNvcnNlcnZpY2UKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jbWRzL3NlbnNvcnNlcnZpY2UvbWFpbl9zZW5zb3JzZXJ2aWNlLmNwcCBiL2NtZHMvc2Vuc29yc2VydmljZS9tYWluX3NlbnNvcnNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTA2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3NlbnNvcnNlcnZpY2UvbWFpbl9zZW5zb3JzZXJ2aWNlLmNwcApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8U2Vuc29yU2VydmljZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgU2Vuc29yU2VydmljZTo6cHVibGlzaEFuZEpvaW5UaHJlYWRQb29sKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jbWRzL3N5c3RlbV9zZXJ2ZXIvbGlicmFyeS9zeXN0ZW1faW5pdC5jcHAgYi9jbWRzL3N5c3RlbV9zZXJ2ZXIvbGlicmFyeS9zeXN0ZW1faW5pdC5jcHAKaW5kZXggYjYxNTc2NC4uYTE5NzExZSAxMDA2NDQKLS0tIGEvY21kcy9zeXN0ZW1fc2VydmVyL2xpYnJhcnkvc3lzdGVtX2luaXQuY3BwCisrKyBiL2NtZHMvc3lzdGVtX3NlcnZlci9saWJyYXJ5L3N5c3RlbV9pbml0LmNwcApAQCAtNzAsOCArNzAsMTEgQEAKICAgICAgICAgU3VyZmFjZUZsaW5nZXI6Omluc3RhbnRpYXRlKCk7CiAgICAgfQogCi0gICAgLy8gU3RhcnQgdGhlIHNlbnNvciBzZXJ2aWNlCi0gICAgU2Vuc29yU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICBwcm9wZXJ0eV9nZXQoInN5c3RlbV9pbml0LnN0YXJ0c2Vuc29yc2VydmljZSIsIHByb3BCdWYsICIxIik7CisgICAgaWYgKHN0cmNtcChwcm9wQnVmLCAiMSIpID09IDApIHsKKyAgICAgICAgLy8gU3RhcnQgdGhlIHNlbnNvciBzZXJ2aWNlCisgICAgICAgIFNlbnNvclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgfQogCiAgICAgLy8gT24gdGhlIHNpbXVsYXRvciwgYXVkaW9mbGluZ2VyIGV0IGFsIGRvbid0IGdldCBzdGFydGVkIHRoZQogICAgIC8vIHNhbWUgd2F5IGFzIG9uIHRoZSBkZXZpY2UsIGFuZCB3ZSBuZWVkIHRvIHN0YXJ0IHRoZW0gaGVyZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKaW5kZXggMDMzNDZmZS4uOGJiMzA1ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOwogCiAvKioKICAqIEFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBydW5zIGluIHRoZSBiYWNrZ3JvdW5kIGFuZCByZWNlaXZlcyBjYWxsYmFja3MgYnkgdGhlIHN5c3RlbQpAQCAtMzksMjEgKzQwLDY3IEBACiAgKiA8cD4KICAqIDxjb2RlPgogICogJmx0O3NlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTXlBY2Nlc3NpYmlsaXR5U2VydmljZSImZ3Q7PGJyPgotICogICAgICZsdDtpbnRlbnQtZmlsdGVyJmd0Ozxicj4KLSAqICAgICAgICAgJmx0O2FjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiIC8mZ3Q7PGJyPgotICogICAgICZsdDsvaW50ZW50LWZpbHRlciZndDs8YnI+CisgKiAmbmJzcDsmbmJzcDsmbHQ7aW50ZW50LWZpbHRlciZndDs8YnI+CisgKiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIgLyZndDs8YnI+CisgKiAmbmJzcDsmbmJzcDsmbHQ7L2ludGVudC1maWx0ZXImZ3Q7PGJyPgogICogJmx0Oy9zZXJ2aWNlJmd0Ozxicj4KICAqIDwvY29kZT4KKyAqIDwvcD4KICAqIDxwPgogICogVGhlIGxpZmVjeWNsZSBvZiBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgbWFuYWdlZCBleGNsdXNpdmVseSBieSB0aGUgc3lzdGVtLiBTdGFydGluZwogICogb3Igc3RvcHBpbmcgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIHRyaWdnZXJlZCBieSBhbiBleHBsaWNpdCB1c2VyIGFjdGlvbiB0aHJvdWdoCiAgKiBlbmFibGluZyBvciBkaXNhYmxpbmcgaXQgaW4gdGhlIGRldmljZSBzZXR0aW5ncy4gQWZ0ZXIgdGhlIHN5c3RlbSBiaW5kcyB0byBhIHNlcnZpY2UgaXQKICAqIGNhbGxzIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZSNvblNlcnZpY2VDb25uZWN0ZWQoKX0uIFRoaXMgbWV0aG9kIGNhbiBiZQotICogb3ZlcnJpZGVuIGJ5IGNsaWVudHMgdGhhdCB3YW50IHRvIHBlcmZvcm0gcG9zdCBiaW5kaW5nIHNldHVwLiBBbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKLSAqIGlzIGNvbmZpZ3VyZWQgdGhvdWdoIHNldHRpbmcgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb30gYnkgY2FsbGluZwotICoge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlI3NldFNlcnZpY2VJbmZvKEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyl9LiBZb3UgY2FuIGNhbGwgdGhpcwotICogbWV0aG9kIGFueSB0aW1lIHRvIGNoYW5nZSB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIGJ1dCBpdCBpcyBnb29kIHByYWN0aWNlIHRvIGRvIHRoYXQKLSAqIGluIHRoZSBvdmVycmlkZW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlI29uU2VydmljZUNvbm5lY3RlZCgpfS4KKyAqIG92ZXJyaWRlbiBieSBjbGllbnRzIHRoYXQgd2FudCB0byBwZXJmb3JtIHBvc3QgYmluZGluZyBzZXR1cC4KKyAqIDwvcD4KKyAqIDxwPgorICogQW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGNhbiBiZSBjb25maWd1cmVkIHRvIHJlY2VpdmUgc3BlY2lmaWMgdHlwZXMgb2YgYWNjZXNzaWJpbGl0eSBldmVudHMsCisgKiBsaXN0ZW4gb25seSB0byBzcGVjaWZpYyBwYWNrYWdlcywgZ2V0IGV2ZW50cyBmcm9tIGVhY2ggdHlwZSBvbmx5IG9uY2UgaW4gYSBnaXZlbiB0aW1lIGZyYW1lLAorICogcmV0cmlldmUgd2luZG93IGNvbnRlbnQsIHNwZWNpZnkgYSBzZXR0aW5ncyBhY3Rpdml0eSwgZXRjLgorICogPC9wPgorICogVGhlcmUgYXJlIHR3byBhcHByb2FjaGVzIGZvciBjb25maWd1cmluZyBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2U6CisgKiA8dWw+CisgKiAgIDxsaT4KKyAqICAgICBQcm92aWRpbmcgYSB7QGxpbmsgI1NFUlZJQ0VfTUVUQV9EQVRBIG1ldGEtZGF0YX0gZW50cnkgaW4gdGhlIG1hbmlmZXN0IHdoZW4gZGVjbGFyaW5nCisgKiAgICAgdGhlIHNlcnZpY2UuIEEgc2VydmljZSBkZWNsYXJhdGlvbiB3aXRoIGEgbWV0YS1kYXRhIHRhZyBpcyBwcmVzZW50ZWQgYmVsb3c6CisgKiAgICAgPHA+CisgKiAgICAgICA8Y29kZT4KKyAqICAgICAgICAgJmx0O3NlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTXlBY2Nlc3NpYmlsaXR5U2VydmljZSImZ3Q7PGJyPgorICogICAgICAgICAmbmJzcDsmbmJzcDsmbHQ7aW50ZW50LWZpbHRlciZndDs8YnI+CisgKiAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIiAvJmd0Ozxicj4KKyAqICAgICAgICAgJm5ic3A7Jm5ic3A7Jmx0Oy9pbnRlbnQtZmlsdGVyJmd0Ozxicj4KKyAqICAgICAgICAgJm5ic3A7Jm5ic3A7Jmx0O21ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuYXMiIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvYWNjZXNzaWJpbGl0eXNlcnZpY2UiIC8mZ3Q7PGJyPgorICogICAgICAgICAmbHQ7L3NlcnZpY2UmZ3Q7PGJyPgorICogICAgICAgPC9jb2RlPgorICogICAgIDwvcD4KKyAqICAgICA8cD4KKyAqICAgICA8c3Ryb25nPgorICogICAgICAgVGhpcyBhcHByb2FjaCBlbmFibGVzIHNldHRpbmcgYWxsIGFjY2Vzc2liaWxpdHkgc2VydmljZSBwcm9wZXJ0aWVzLgorICogICAgIDwvc3Ryb25nPgorICogICAgIDwvcD4KKyAqICAgICA8cD4KKyAqICAgICAgIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8ge0BsaW5rICNTRVJWSUNFX01FVEFfREFUQX0uCisgKiAgICAgPC9wPgorICogICA8L2xpPgorICogICA8bGk+CisgKiAgICAgQ2FsbGluZyB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2Ujc2V0U2VydmljZUluZm8oQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKX0uIE5vdGUKKyAqICAgICB0aGF0IHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYW55IHRpbWUgdG8gY2hhbmdlIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24uPGJyPgorICogICAgIDxwPgorICogICAgIDxzdHJvbmc+CisgKiAgICAgICBUaGlzIGFwcHJvYWNoIGVuYWJsZXMgc2V0dGluZyBvbmx5IGR5bmFtaWNhbGx5IGNvbmZpZ3VyYWJsZSBhY2Nlc3NpYmlsaXR5CisgKiAgICAgICBzZXJ2aWNlIHByb3BlcnRpZXM6CisgKiAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI2V2ZW50VHlwZXN9LAorICogICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNmZWVkYmFja1R5cGV9LAorICogICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNmbGFnc30sCisgKiAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI25vdGlmaWNhdGlvblRpbWVvdXR9LAorICogICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNwYWNrYWdlTmFtZXN9CisgKiAgICAgPC9zdHJvbmc+CisgKiAgICAgPC9wPgorICogICAgIDxwPgorICogICAgICAgRm9yIG1vcmUgZGV0YWlscyByZWZlciB0byB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvfS4KKyAqICAgICA8L3A+CisgKiAgIDwvbGk+CisgKiA8L3VsPgogICogPHA+CiAgKiBBbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgY2FuIGJlIHJlZ2lzdGVyZWQgZm9yIGV2ZW50cyBpbiBzcGVjaWZpYyBwYWNrYWdlcyB0byBwcm92aWRlIGEKICAqIHNwZWNpZmljIHR5cGUgb2YgZmVlZGJhY2sgYW5kIGlzIG5vdGlmaWVkIHdpdGggYSBjZXJ0YWluIHRpbWVvdXQgYWZ0ZXIgdGhlIGxhc3QgZXZlbnQKQEAgLTEwNSw2ICsxNTIsNjIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSA9CiAgICAgICAgICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIjsKIAorICAgIC8qKgorICAgICAqIE5hbWUgdW5kZXIgd2hpY2ggYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UgY29tcG9uZW50IHB1Ymxpc2hlcyBpbmZvcm1hdGlvbgorICAgICAqIGFib3V0IGl0c2VsZi4gVGhpcyBtZXRhLWRhdGEgbXVzdCByZWZlcmVuY2UgYW4gWE1MIHJlc291cmNlIGNvbnRhaW5pbmcKKyAgICAgKiBhbgorICAgICAqIDxjb2RlPiZsdDt7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNBY2Nlc3NpYmlsaXR5U2VydmljZSBhY2Nlc3NpYmlsaXR5LXNlcnZpY2V9Jmd0OzwvY29kZT4KKyAgICAgKiB0YWcuIFRoaXMgaXMgYSBhIHNhbXBsZSBYTUwgZmlsZSBjb25maWd1cmluZyBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2U6CisgICAgICogPHA+CisgICAgICogPGNvZGU+CisgICAgICogICAmbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Jmd0Ozxicj4KKyAgICAgKiAgICZsdDthY2Nlc3NpYmlsaXR5LXNlcnZpY2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIjxicj4KKyAgICAgKiAgICZuYnNwOyZuYnNwO2FuZHJvaWQ6YWNjZXNzaWJpbGl0eUV2ZW50VHlwZXM9InR5cGVWaWV3Q2xpY2tlZHx0eXBlVmlld0ZvY3VzZWQiPGJyPgorICAgICAqICAgJm5ic3A7Jm5ic3A7YW5kcm9pZDpwYWNrYWdlTmFtZXM9ImZvby5iYXIsIGZvby5iYXoiPGJyPgorICAgICAqICAgJm5ic3A7Jm5ic3A7YW5kcm9pZDphY2Nlc3NpYmlsaXR5RmVlZGJhY2tUeXBlPSJmZWVkYmFja1Nwb2tlbiI8YnI+CisgICAgICogICAmbmJzcDsmbmJzcDthbmRyb2lkOm5vdGlmaWNhdGlvblRpbWVvdXQ9IjEwMCI8YnI+CisgICAgICogICAmbmJzcDsmbmJzcDthbmRyb2lkOmFjY2Vzc2liaWxpdHlGbGFncz0iZmxhZ0RlZmF1bHQiPGJyPgorICAgICAqICAgJm5ic3A7Jm5ic3A7YW5kcm9pZDpzZXR0aW5nc0FjdGl2aXR5PSJmb28uYmFyLlRlc3RCYWNrQWN0aXZpdHkiPGJyPgorICAgICAqICAgJm5ic3A7Jm5ic3A7LiAuIC48YnI+CisgICAgICogICAvJmd0OworICAgICAqIDwvY29kZT4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gQSBzZXJ2aWNlIGNhbiByZXRyaWV2ZSBvbmx5IHRoZSBjb250ZW50IG9mIHRoZSBhY3RpdmUgd2luZG93LgorICAgICAqICAgICAgICAgIEFuIGFjdGl2ZSB3aW5kb3cgaXMgdGhlIHNvdXJjZSBvZiB0aGUgbW9zdCByZWNlbnQgZXZlbnQgb2YgdHlwZQorICAgICAqICAgICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9UT1VDSF9FWFBMT1JBVElPTl9HRVNUVVJFX1NUQVJUfSwKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVE9VQ0hfRVhQTE9SQVRJT05fR0VTVFVSRV9FTkR9LAorICAgICAqICAgICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX0NMSUNLRUR9LAorICAgICAqICAgICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX0ZPQ1VTRUR9LAorICAgICAqICAgICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX0hPVkVSX0VOVEVSfSwKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19IT1ZFUl9FWElUfSwKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19MT05HX0NMSUNLRUR9LAorICAgICAqICAgICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX1NFTEVDVEVEfSwKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19URVhUX0NIQU5HRUR9LAorICAgICAqICAgICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9XSU5ET1dfU1RBVEVfQ0hBTkdFRH0uCisgICAgICogICAgICAgICAgVGhlcmVmb3JlIHRoZSBzZXJ2aWNlIHNob3VsZDoKKyAgICAgKiAgICAgICAgICA8dWw+CisgICAgICogICAgICAgICAgICA8bGk+CisgICAgICogICAgICAgICAgICAgIFJlZ2lzdGVyIGZvciBhbGwgZXZlbnQgdHlwZXMgd2l0aCBubyBub3RpZmljYXRpb24gdGltZW91dCBhbmQga2VlcCB0cmFjaworICAgICAqICAgICAgICAgICAgICBmb3IgdGhlIGFjdGl2ZSB3aW5kb3cgYnkgY2FsbGluZworICAgICAqICAgICAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I2dldEFjY2Vzc2liaWxpdHlXaW5kb3dJZCgpfSBvZiB0aGUgbGFzdCByZWNlaXZlZAorICAgICAqICAgICAgICAgICAgICBldmVudCBhbmQgY29tcGFyZSB0aGlzIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jZ2V0QWNjZXNzaWJpbGl0eVdpbmRvd0lkKCl9IGJlZm9yZSBjYWxsaW5nCisgICAgICogICAgICAgICAgICAgIHJldHJpZXZhbCBtZXRob2RzIG9uIHRoZSBsYXR0ZXIuCisgICAgICogICAgICAgICAgICA8L2xpPgorICAgICAqICAgICAgICAgICAgPGxpPgorICAgICAqICAgICAgICAgICAgICBQcmVwYXJlIHRoYXQgYSByZXRyaWV2YWwgbWV0aG9kIG9uIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99IG1heSBmYWlsCisgICAgICogICAgICAgICAgICAgIHNpbmNlIHRoZSBhY3RpdmUgd2luZG93IGhhcyBjaGFuZ2VkIGFuZCB0aGUgc2VydmljZSBkaWQgbm90IGdldCB0aGUgCisgICAgICogICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHkgZXZlbnQuIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgcmV0cmlldmFsIG1ldGhvZAorICAgICAqICAgICAgICAgICAgICBmYWlsaW5nIGV2ZW50IGFkb3B0aW5nIHRoZSBzdHJhdGVneSBzcGVjaWZpZWQgaW4gdGhlIHByZXZpb3VzIGJ1bGxldAorICAgICAqICAgICAgICAgICAgICBiZWNhdXNlIHRoZSBhY2Nlc3NpYmlsaXR5IGV2ZW50IGRpc3BhdGNoIGlzIGFzeW5jaHJvbm91cyBhbmQgY3Jvc3NlcworICAgICAqICAgICAgICAgICAgICBwcm9jZXNzIGJvdW5kYXJpZXMuIAorICAgICAqICAgICAgICAgICAgPC9saT4KKyAgICAgKiAgICAgICAgICA8dWw+CisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTUVUQV9EQVRBID0gImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWNjZXNzaWJpbGl0eVNlcnZpY2UiOwogCiAgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gbUluZm87CkBAIC0xNjUsNyArMjY4LDcgQEAKIAogICAgIC8qKgogICAgICAqIEltcGxlbWVudCB0byByZXR1cm4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBhY2Nlc3NpYmlsaXR5Ci0gICAgICogc2VydmljZSBpbnRlcmZhY2UuICBTdWJjbGFzc2VzIHNob3VsZCBub3Qgb3ZlcnJpZGUuCisgICAgICogc2VydmljZSBpbnRlcmZhY2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLmphdmEKaW5kZXggYmY5ZTA3ZC4uYjk4NzhjZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLmphdmEKQEAgLTE2LDggKzE2LDI1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZTsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKICAqIFRoaXMgY2xhc3MgZGVzY3JpYmVzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0uIFRoZSBzeXN0ZW0KQEAgLTMwLDYgKzQ3LDggQEAKICAqLwogcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0NFU1NJQklMSVRZX1NFUlZJQ0UgPSAiYWNjZXNzaWJpbGl0eS1zZXJ2aWNlIjsKKwogICAgIC8qKgogICAgICAqIERlbm90ZXMgc3Bva2VuIGZlZWRiYWNrLgogICAgICAqLwpAQCAtNjQsNyArODMsOSBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIGV2ZW50IHR5cGVzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0gaXMgaW50ZXJlc3RlZCBpbi4KLSAgICAgKgorICAgICAqIDxwPgorICAgICAqICAgPHN0cm9uZz5DYW4gYmUgZHluYW1pY2FsbHkgc2V0IGF0IHJ1bnRpbWUuPC9zdHJvbmc+CisgICAgICogPC9wPgogICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19DTElDS0VECiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX0xPTkdfQ0xJQ0tFRAogICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19GT0NVU0VECkBAIC03NywxMyArOTgsMTggQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0gaXMgaW50ZXJlc3RlZCBpbi4gU2V0dGluZwotICAgICAqIHRvIG51bGwgaXMgZXF1aXZhbGVudCB0byBhbGwgcGFja2FnZXMuIAorICAgICAqIHRvIG51bGwgaXMgZXF1aXZhbGVudCB0byBhbGwgcGFja2FnZXMuCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPkNhbiBiZSBkeW5hbWljYWxseSBzZXQgYXQgcnVudGltZS48L3N0cm9uZz4KKyAgICAgKiA8L3A+CiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIHBhY2thZ2VOYW1lczsKIAogICAgIC8qKgogICAgICAqIFRoZSBmZWVkYmFjayB0eXBlIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0gcHJvdmlkZXMuCi0gICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiAgIDxzdHJvbmc+Q2FuIGJlIGR5bmFtaWNhbGx5IHNldCBhdCBydW50aW1lLjwvc3Ryb25nPgorICAgICAqIDwvcD4KICAgICAgKiBAc2VlICNGRUVEQkFDS19BVURJQkxFCiAgICAgICogQHNlZSAjRkVFREJBQ0tfR0VORVJJQwogICAgICAqIEBzZWUgI0ZFRURCQUNLX0hBUFRJQwpAQCAtOTYsNiArMTIyLDkgQEAKICAgICAgKiBUaGUgdGltZW91dCBhZnRlciB0aGUgbW9zdCByZWNlbnQgZXZlbnQgb2YgYSBnaXZlbiB0eXBlIGJlZm9yZSBhbgogICAgICAqIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0gaXMgbm90aWZpZWQuCiAgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPkNhbiBiZSBkeW5hbWljYWxseSBzZXQgYXQgcnVudGltZS48L3N0cm9uZz4uCisgICAgICogPC9wPgorICAgICAqIDxwPgogICAgICAqIE5vdGU6IFRoZSBldmVudCBub3RpZmljYXRpb24gdGltZW91dCBpcyB1c2VmdWwgdG8gYXZvaWQgcHJvcGFnYXRpbmcgZXZlbnRzIHRvIHRoZSBjbGllbnQKICAgICAgKiAgICAgICB0b28gZnJlcXVlbnRseSBzaW5jZSB0aGlzIGlzIGFjY29tcGxpc2hlZCB2aWEgYW4gZXhwZW5zaXZlIGludGVycHJvY2VzcyBjYWxsLgogICAgICAqICAgICAgIE9uZSBjYW4gdGhpbmsgb2YgdGhlIHRpbWVvdXQgYXMgYSBjcml0ZXJpYSB0byBkZXRlcm1pbmUgd2hlbiBldmVudCBnZW5lcmF0aW9uIGhhcwpAQCAtMTA2LDExICsxMzUsMTgxIEBACiAgICAgLyoqCiAgICAgICogVGhpcyBmaWVsZCByZXByZXNlbnRzIGEgc2V0IG9mIGZsYWdzIHVzZWQgZm9yIGNvbmZpZ3VyaW5nIGFuCiAgICAgICoge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KLSAgICAgKgorICAgICAqIDxwPgorICAgICAqICAgPHN0cm9uZz5DYW4gYmUgZHluYW1pY2FsbHkgc2V0IGF0IHJ1bnRpbWUuPC9zdHJvbmc+CisgICAgICogPC9wPgogICAgICAqIEBzZWUgI0RFRkFVTFQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGZsYWdzOwogCisgICAgLyoqCisgICAgICogVGhlIHVuaXF1ZSBzdHJpbmcgSWQgdG8gaWRlbnRpZnkgdGhlIGFjY2Vzc2liaWxpdHkgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtSWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU2VydmljZSB0aGF0IGltcGxlbWVudHMgdGhpcyBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgY29tcG9uZW50LgorICAgICAqLworICAgIHByaXZhdGUgUmVzb2x2ZUluZm8gbVJlc29sdmVJbmZvOworCisgICAgLyoqCisgICAgICogVGhlIGFjY2Vzc2liaWxpdHkgc2VydmljZSBzZXR0aW5nIGFjdGl2aXR5J3MgbmFtZSwgdXNlZCBieSB0aGUgc3lzdGVtCisgICAgICogc2V0dGluZ3MgdG8gbGF1bmNoIHRoZSBzZXR0aW5nIGFjdGl2aXR5IG9mIHRoaXMgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1TZXR0aW5nc0FjdGl2aXR5TmFtZTsKKworICAgIC8qKgorICAgICAqIEZsYWcgd2hldGhlciB0aGlzIGFjY2Vzc2liaWxpdHkgc2VydmljZSBjYW4gcmV0cmlldmUgc2NyZWVuIGNvbnRlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKSB7CisgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc29sdmVJbmZvIFRoZSBzZXJ2aWNlIHJlc29sdmUgaW5mby4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciBhY2Nlc3NpbmcgcmVzb3VyY2VzLgorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBJZiBhIFhNTCBwYXJzaW5nIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGEgWE1MIHBhcnNpbmcgZXJyb3Igb2NjdXJzLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvLCBDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvOworICAgICAgICBtSWQgPSBuZXcgQ29tcG9uZW50TmFtZShzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICAgICAgbVJlc29sdmVJbmZvID0gcmVzb2x2ZUluZm87CisKKyAgICAgICAgU3RyaW5nIHNldHRpbmdzQWN0aXZpdHlOYW1lID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiByZXRyaWV2ZVNjcmVlbkNvbnRlbnQgPSBmYWxzZTsKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgICAgICBwYXJzZXIgPSBzZXJ2aWNlSW5mby5sb2FkWG1sTWV0YURhdGEocGFja2FnZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLlNFUlZJQ0VfTUVUQV9EQVRBKTsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHR5cGUgPSAwOworICAgICAgICAgICAgd2hpbGUgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIHR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKCFUQUdfQUNDRVNTSUJJTElUWV9TRVJWSUNFLmVxdWFscyhub2RlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiggIk1ldGEtZGF0YSBkb2VzIG5vdCBzdGFydCB3aXRoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBUQUdfQUNDRVNTSUJJTElUWV9TRVJWSUNFICsgIiB0YWciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXR0cmlidXRlU2V0IGFsbEF0dHJpYnV0ZXMgPSBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKTsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBwYWNrYWdlTWFuYWdlci5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZUluZm8uYXBwbGljYXRpb25JbmZvKTsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYXNBdHRyaWJ1dGVzID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMoYWxsQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWNjZXNzaWJpbGl0eVNlcnZpY2UpOworICAgICAgICAgICAgZXZlbnRUeXBlcyA9IGFzQXR0cmlidXRlcy5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlX2FjY2Vzc2liaWxpdHlFdmVudFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZXogPSBhc0F0dHJpYnV0ZXMuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY2Nlc3NpYmlsaXR5U2VydmljZV9wYWNrYWdlTmFtZXMpOworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1leiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFja2FnZU5hbWVzID0gcGFja2FnZU5hbWV6LnNwbGl0KCIoXFxzKSosKFxccykqIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZWVkYmFja1R5cGUgPSBhc0F0dHJpYnV0ZXMuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY2Nlc3NpYmlsaXR5U2VydmljZV9hY2Nlc3NpYmlsaXR5RmVlZGJhY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvblRpbWVvdXQgPSBhc0F0dHJpYnV0ZXMuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY2Nlc3NpYmlsaXR5U2VydmljZV9ub3RpZmljYXRpb25UaW1lb3V0LCAKKyAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBmbGFncyA9IGFzQXR0cmlidXRlcy5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlX2FjY2Vzc2liaWxpdHlGbGFncywgMCk7CisgICAgICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBhc0F0dHJpYnV0ZXMuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY2Nlc3NpYmlsaXR5U2VydmljZV9zZXR0aW5nc0FjdGl2aXR5KTsKKyAgICAgICAgICAgIG1DYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQgPSBhc0F0dHJpYnV0ZXMuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWNjZXNzaWJpbGl0eVNlcnZpY2VfY2FuUmV0cmlldmVXaW5kb3dDb250ZW50LAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICBhc0F0dHJpYnV0ZXMucmVjeWNsZSgpOworICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oICJVbmFibGUgdG8gY3JlYXRlIGNvbnRleHQgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgc2VydmljZUluZm8ucGFja2FnZU5hbWUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFyc2VyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYW4gQWNjZXNzaWJpbGl0eVNlcml2aWNlIGNhbiBjaGFuZ2UgZHluYW1pY2FsbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3RoZXIgVGhlIGluZm8gZnJvbSB3aGljaCB0byB1cGRhdGUgdGhlIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUR5bmFtaWNhbGx5Q29uZmlndXJhYmxlUHJvcGVydGllcyhBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gb3RoZXIpIHsKKyAgICAgICAgZXZlbnRUeXBlcyA9IG90aGVyLmV2ZW50VHlwZXM7CisgICAgICAgIHBhY2thZ2VOYW1lcyA9IG90aGVyLnBhY2thZ2VOYW1lczsKKyAgICAgICAgZmVlZGJhY2tUeXBlID0gb3RoZXIuZmVlZGJhY2tUeXBlOworICAgICAgICBub3RpZmljYXRpb25UaW1lb3V0ID0gb3RoZXIubm90aWZpY2F0aW9uVGltZW91dDsKKyAgICAgICAgZmxhZ3MgPSBvdGhlci5mbGFnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlkLgorICAgICAqIDxwPgorICAgICAqICAgPHN0cm9uZz5HZW5lcmF0ZWQgYnkgdGhlIHN5c3RlbS48L3N0cm9uZz4KKyAgICAgKiA8L3A+CisgICAgICogQHJldHVybiBUaGUgaWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmljZSB7QGxpbmsgUmVzb2x2ZUluZm99LgorICAgICAqIDxwPgorICAgICAqICAgPHN0cm9uZz5HZW5lcmF0ZWQgYnkgdGhlIHN5c3RlbS48L3N0cm9uZz4KKyAgICAgKiA8L3A+CisgICAgICogQHJldHVybiBUaGUgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb2x2ZUluZm8gZ2V0UmVzb2x2ZUluZm8oKSB7CisgICAgICAgIHJldHVybiBtUmVzb2x2ZUluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNldHRpbmdzIGFjdGl2aXR5IG5hbWUuCisgICAgICogPHA+CisgICAgICogICAgPHN0cm9uZz5TdGF0aWNhbGx5IHNldCBmcm9tCisgICAgICogICAge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlI1NFUlZJQ0VfTUVUQV9EQVRBIG1ldGEtZGF0YX0uPC9zdHJvbmc+CisgICAgICogPC9wPgorICAgICAqIEByZXR1cm4gVGhlIHNldHRpbmdzIGFjdGl2aXR5IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXR0aW5nc0FjdGl2aXR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TZXR0aW5nc0FjdGl2aXR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgc2VydmljZSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBmb2N1c2VkIHdpbmRvdyBjb250ZW50LgorICAgICAqIDxwPgorICAgICAqICAgIDxzdHJvbmc+U3RhdGljYWxseSBzZXQgZnJvbQorICAgICAqICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZSNTRVJWSUNFX01FVEFfREFUQSBtZXRhLWRhdGF9Ljwvc3Ryb25nPgorICAgICAqIDwvcD4KKyAgICAgKiBAcmV0dXJuIFRydWUgc2NyZWVuIGNvbnRlbnQgaXMgcmV0cmlldmVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENhblJldHJpZXZlV2luZG93Q29udGVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1DYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLwogICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTIxLDYgKzMyMCwxNDIgQEAKICAgICAgICAgcGFyY2VsLndyaXRlSW50KGZlZWRiYWNrVHlwZSk7CiAgICAgICAgIHBhcmNlbC53cml0ZUxvbmcobm90aWZpY2F0aW9uVGltZW91dCk7CiAgICAgICAgIHBhcmNlbC53cml0ZUludChmbGFncyk7CisgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZyhtSWQpOworICAgICAgICBwYXJjZWwud3JpdGVQYXJjZWxhYmxlKG1SZXNvbHZlSW5mbywgMCk7CisgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZyhtU2V0dGluZ3NBY3Rpdml0eU5hbWUpOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUNhblJldHJpZXZlV2luZG93Q29udGVudCA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEZyb21QYXJjZWwoUGFyY2VsIHBhcmNlbCkgeworICAgICAgICBldmVudFR5cGVzID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgcGFja2FnZU5hbWVzID0gcGFyY2VsLnJlYWRTdHJpbmdBcnJheSgpOworICAgICAgICBmZWVkYmFja1R5cGUgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBub3RpZmljYXRpb25UaW1lb3V0ID0gcGFyY2VsLnJlYWRMb25nKCk7CisgICAgICAgIGZsYWdzID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgbUlkID0gcGFyY2VsLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbVJlc29sdmVJbmZvID0gcGFyY2VsLnJlYWRQYXJjZWxhYmxlKG51bGwpOworICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBwYXJjZWwucmVhZFN0cmluZygpOworICAgICAgICBtQ2FuUmV0cmlldmVXaW5kb3dDb250ZW50ID0gKHBhcmNlbC5yZWFkSW50KCkgPT0gMSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYXBwZW5kRXZlbnRUeXBlcyhzdHJpbmdCdWlsZGVyLCBldmVudFR5cGVzKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZFBhY2thZ2VOYW1lcyhzdHJpbmdCdWlsZGVyLCBwYWNrYWdlTmFtZXMpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kRmVlZGJhY2tUeXBlcyhzdHJpbmdCdWlsZGVyLCBmZWVkYmFja1R5cGUpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIm5vdGlmaWNhdGlvblRpbWVvdXQ6ICIpLmFwcGVuZChub3RpZmljYXRpb25UaW1lb3V0KTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZEZsYWdzKHN0cmluZ0J1aWxkZXIsIGZsYWdzKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIiwgIik7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJpZDogIikuYXBwZW5kKG1JZCk7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgicmVzb2x2ZUluZm86ICIpLmFwcGVuZChtUmVzb2x2ZUluZm8pOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoInNldHRpbmdzQWN0aXZpdHlOYW1lOiAiKS5hcHBlbmQobVNldHRpbmdzQWN0aXZpdHlOYW1lKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIiwgIik7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJyZXRyaWV2ZVNjcmVlbkNvbnRlbnQ6ICIpLmFwcGVuZChtQ2FuUmV0cmlldmVXaW5kb3dDb250ZW50KTsKKyAgICAgICAgcmV0dXJuIHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZEZlZWRiYWNrVHlwZXMoU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyLCBpbnQgZmVlZGJhY2tUeXBlcykgeworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiZmVlZGJhY2tUeXBlczoiKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIlsiKTsKKyAgICAgICAgd2hpbGUgKGZlZWRiYWNrVHlwZXMgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IGZlZWRiYWNrVHlwZUJpdCA9ICgxIDw8IEludGVnZXIubnVtYmVyT2ZUcmFpbGluZ1plcm9zKGZlZWRiYWNrVHlwZXMpKTsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKGZlZWRiYWNrVHlwZVRvU3RyaW5nKGZlZWRiYWNrVHlwZUJpdCkpOworICAgICAgICAgICAgZmVlZGJhY2tUeXBlcyAmPSB+ZmVlZGJhY2tUeXBlQml0OworICAgICAgICAgICAgaWYgKGZlZWRiYWNrVHlwZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRQYWNrYWdlTmFtZXMoU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyLCBTdHJpbmdbXSBwYWNrYWdlTmFtZXMpIHsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoInBhY2thZ2VOYW1lczoiKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIlsiKTsKKyAgICAgICAgaWYgKHBhY2thZ2VOYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcGFja2FnZU5hbWVDb3VudCA9IHBhY2thZ2VOYW1lcy5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VOYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHBhY2thZ2VOYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPCBwYWNrYWdlTmFtZUNvdW50IC0gMSkgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZEV2ZW50VHlwZXMoU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyLCBpbnQgZXZlbnRUeXBlcykgeworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiZXZlbnRUeXBlczoiKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIlsiKTsKKyAgICAgICAgd2hpbGUgKGV2ZW50VHlwZXMgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50VHlwZUJpdCA9ICgxIDw8IEludGVnZXIubnVtYmVyT2ZUcmFpbGluZ1plcm9zKGV2ZW50VHlwZXMpKTsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlFdmVudC5ldmVudFR5cGVUb1N0cmluZyhldmVudFR5cGVCaXQpKTsKKyAgICAgICAgICAgIGV2ZW50VHlwZXMgJj0gfmV2ZW50VHlwZUJpdDsKKyAgICAgICAgICAgIGlmIChldmVudFR5cGVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiXSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kRmxhZ3MoU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoImZsYWdzOiIpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiWyIpOworICAgICAgICB3aGlsZSAoZmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IGZsYWdCaXQgPSAoMSA8PCBJbnRlZ2VyLm51bWJlck9mVHJhaWxpbmdaZXJvcyhmbGFncykpOworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoZmxhZ1RvU3RyaW5nKGZsYWdCaXQpKTsKKyAgICAgICAgICAgIGZsYWdzICY9IH5mbGFnQml0OworICAgICAgICAgICAgaWYgKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiXSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGZlZWRiYWNrIHR5cGUuIEZvciBleGFtcGxlLAorICAgICAqIHtAbGluayAjRkVFREJBQ0tfU1BPS0VOfSBpcyByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIEZFRURCQUNLX1NQT0tFTi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZWVkYmFja1R5cGUgVGhlIGZlZWRiYWNrIHR5cGUuCisgICAgICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZlZWRiYWNrVHlwZVRvU3RyaW5nKGludCBmZWVkYmFja1R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChmZWVkYmFja1R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRkVFREJBQ0tfQVVESUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkZFRURCQUNLX0FVRElCTEUiOworICAgICAgICAgICAgY2FzZSBGRUVEQkFDS19IQVBUSUM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGRUVEQkFDS19IQVBUSUMiOworICAgICAgICAgICAgY2FzZSBGRUVEQkFDS19HRU5FUklDOgorICAgICAgICAgICAgICAgIHJldHVybiAiRkVFREJBQ0tfR0VORVJJQyI7CisgICAgICAgICAgICBjYXNlIEZFRURCQUNLX1NQT0tFTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkZFRURCQUNLX1NQT0tFTiI7CisgICAgICAgICAgICBjYXNlIEZFRURCQUNLX1ZJU1VBTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkZFRURCQUNLX1ZJU1VBTCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgZmxhZy4gRm9yIGV4YW1wbGUsCisgICAgICoge0BsaW5rICNERUZBVUxUfSBpcyByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIERFRkFVTFQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZy4KKyAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmxhZ1RvU3RyaW5nKGludCBmbGFnKSB7CisgICAgICAgIHN3aXRjaCAoZmxhZykgeworICAgICAgICAgICAgY2FzZSBERUZBVUxUOgorICAgICAgICAgICAgICAgIHJldHVybiAiREVGQVVMVCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzAsMTEgKzQ2NSw3IEBACiAgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4oKSB7CiAgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgcGFyY2VsKSB7CiAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKLSAgICAgICAgICAgIGluZm8uZXZlbnRUeXBlcyA9IHBhcmNlbC5yZWFkSW50KCk7Ci0gICAgICAgICAgICBpbmZvLnBhY2thZ2VOYW1lcyA9IHBhcmNlbC5yZWFkU3RyaW5nQXJyYXkoKTsKLSAgICAgICAgICAgIGluZm8uZmVlZGJhY2tUeXBlID0gcGFyY2VsLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGluZm8ubm90aWZpY2F0aW9uVGltZW91dCA9IHBhcmNlbC5yZWFkTG9uZygpOwotICAgICAgICAgICAgaW5mby5mbGFncyA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgICAgICBpbmZvLmluaXRGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgICAgICByZXR1cm4gaW5mbzsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9JQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9JQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uLmFpZGwKaW5kZXggNzE1N2RlZi4uMTlmMGJmMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbi5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0lBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24uYWlkbApAQCAtMTcsMTQgKzE3LDcyIEBACiBwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2U7CiAKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiAKIC8qKgotICogSW50ZXJmYWNlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSNTZXJ2aWNlIGltcGxlbWVudHMsIGFuZCBwYXNzZXMgdG8gYW4KLSAqIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHNvIGl0IGNhbiBkeW5hbWljYWxseSBjb25maWd1cmUgaG93IHRoZSBzeXN0ZW0gaGFuZGxlcyBpdC4KKyAqIEludGVyZmFjZSBnaXZlbiB0byBhbiBBY2Nlc3NpYmlsaXR5U2VyaXZjZSB0byB0YWxrIHRvIHRoZSBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuCiAgKgogICogQGhpZGUKICAqLwotb25ld2F5IGludGVyZmFjZSBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIHsKK2ludGVyZmFjZSBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIHsKIAogICAgIHZvaWQgc2V0U2VydmljZUluZm8oaW4gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8pOworCisgICAgLyoqCisgICAgICogRmluZHMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb30gYnkgYWNjZXNzaWJpbGl0eSBpZC4KKyAgICAgKiA8cD4KKyAgICAgKiAgIDxzdHJvbmc+CisgICAgICogICAgIEl0IGlzIGEgY2xpZW50IHJlc3BvbnNpYmlsaXR5IHRvIHJlY3ljbGUgdGhlIHJlY2VpdmVkIGluZm8gYnkKKyAgICAgKiAgICAgY2FsbGluZyB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3JlY3ljbGUoKX0gdG8gYXZvaWQgY3JlYXRpbmcKKyAgICAgKiAgICAgb2YgbXVsdGlwbGUgaW5zdGFuY2VzLgorICAgICAqICAgPC9zdHJvbmc+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc2liaWxpdHlXaW5kb3dJZCBBIHVuaXF1ZSB3aW5kb3cgaWQuCisgICAgICogQHBhcmFtIGFjY2Vzc2liaWxpdHlWaWV3SWQgQSB1bmlxdWUgVmlldyBhY2Nlc3NpYmlsaXR5IGlkLgorICAgICAqIEByZXR1cm4gVGhlIG5vZGUgaW5mby4KKyAgICAgKi8KKyAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkKGludCBhY2Nlc3NpYmlsaXR5V2luZG93SWQsCisgICAgICAgIGludCBhY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKworICAgIC8qKgorICAgICAqIEZpbmRzIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99cyBieSBWaWV3IHRleHQuIFRoZSBtYXRjaCBpcyBjYXNlCisgICAgICogaW5zZW5zaXRpdmUgY29udGFpbm1lbnQuCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPgorICAgICAqICAgICBJdCBpcyBhIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byByZWN5Y2xlIHRoZSByZWNlaXZlZCBpbmZvcyBieQorICAgICAqICAgICBjYWxsaW5nIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jcmVjeWNsZSgpfSB0byBhdm9pZCBjcmVhdGluZworICAgICAqICAgICBvZiBtdWx0aXBsZSBpbnN0YW5jZXMuCisgICAgICogICA8L3N0cm9uZz4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgc2VhcmNoZWQgdGV4dC4KKyAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBub2RlIGluZm8uCisgICAgICovCisgICAgTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3VGV4dChTdHJpbmcgdGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvfSBieSBWaWV3IGlkLgorICAgICAqIDxwPgorICAgICAqICAgPHN0cm9uZz4KKyAgICAgKiAgICAgSXQgaXMgYSBjbGllbnQgcmVzcG9uc2liaWxpdHkgdG8gcmVjeWNsZSB0aGUgcmVjZWl2ZWQgaW5mbyBieQorICAgICAqICAgICBjYWxsaW5nIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jcmVjeWNsZSgpfSB0byBhdm9pZCBjcmVhdGluZworICAgICAqICAgICBvZiBtdWx0aXBsZSBpbnN0YW5jZXMuCisgICAgICogICA8L3N0cm9uZz4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBub2RlLgorICAgICAqIEByZXR1cm4gVGhlIG5vZGUgaW5mby4KKyAgICAgKi8KKyAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKGludCB2aWV3SWQpOworCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYW4gYWNjZXNzaWJpbGl0eSBhY3Rpb24gb24gYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzaWJpbGl0eVdpbmRvd0lkIFRoZSBpZCBvZiB0aGUgd2luZG93LgorICAgICAqIEBwYXJhbSBhY2Nlc3NpYmlsaXR5Vmlld0lkIFRoZSBvZiBhIHZpZXcgaW4gdGhlIC4KKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGFjdGlvbiB3YXMgcGVyZm9ybWVkLgorICAgICAqLworICAgIGJvb2xlYW4gcGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb24oaW50IGFjY2Vzc2liaWxpdHlXaW5kb3dJZCwgaW50IGFjY2Vzc2liaWxpdHlWaWV3SWQsCisgICAgICAgIGludCBhY3Rpb24pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQppbmRleCAzODc3YmQwLi4wNDgxMTU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQpAQCAtNDQyNSwyNyArNDQyNSwyOSBAQAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVJlc3RhcnQoKSB7CiAgICAgICAgIG1GcmFnbWVudHMubm90ZVN0YXRlTm90U2F2ZWQoKTsKIAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgewotICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWFuYWdlZEN1cnNvcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIE1hbmFnZWRDdXJzb3IgbWMgPSBtTWFuYWdlZEN1cnNvcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChtYy5tUmVsZWFzZWQgfHwgbWMubVVwZGF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtYy5tQ3Vyc29yLnJlcXVlcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyeWluZyB0byByZXF1ZXJ5IGFuIGFscmVhZHkgY2xvc2VkIGN1cnNvciIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1jLm1SZWxlYXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtYy5tVXBkYXRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIGlmIChtU3RvcHBlZCkgewogICAgICAgICAgICAgbVN0b3BwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChtVG9rZW4gIT0gbnVsbCAmJiBtUGFyZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuc2V0U3RvcHBlZFN0YXRlKG1Ub2tlbiwgZmFsc2UpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbU1hbmFnZWRDdXJzb3JzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE1hbmFnZWRDdXJzb3IgbWMgPSBtTWFuYWdlZEN1cnNvcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAobWMubVJlbGVhc2VkIHx8IG1jLm1VcGRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1jLm1DdXJzb3IucmVxdWVyeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnlpbmcgdG8gcmVxdWVyeSBhbiBhbHJlYWR5IGNsb3NlZCBjdXJzb3IgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWMubUN1cnNvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtYy5tUmVsZWFzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1jLm1VcGRhdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25SZXN0YXJ0KHRoaXMpOwogICAgICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IGVmMmU1NGEuLmE2NjU4Y2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTEzOCw2ICsxMzgsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFBhY2thZ2VBc2tTY3JlZW5Db21wYXQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5nZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbSBkZWFkLCB3ZSB3aWxsIGJlIGRlYWQgdG9vIHNvb24hCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBhc2spIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkuc2V0UGFja2FnZUFza1NjcmVlbkNvbXBhdChwYWNrYWdlTmFtZSwgYXNrKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbSBkZWFkLCB3ZSB3aWxsIGJlIGRlYWQgdG9vIHNvb24hCisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGFwcHJveGltYXRlIHBlci1hcHBsaWNhdGlvbiBtZW1vcnkgY2xhc3Mgb2YgdGhlIGN1cnJlbnQKICAgICAgKiBkZXZpY2UuICBUaGlzIGdpdmVzIHlvdSBhbiBpZGVhIG9mIGhvdyBoYXJkIGEgbWVtb3J5IGxpbWl0IHlvdSBzaG91bGQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQppbmRleCAyYTBkNzk4Li44NWY0MGM5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCkBAIC0xNDgzLDYgKzE0ODMsMjYgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfUEFDS0FHRV9BU0tfU0NSRUVOX0NPTVBBVF9UUkFOU0FDVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBTdHJpbmcgcGtnID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBib29sZWFuIGFzayA9IGdldFBhY2thZ2VBc2tTY3JlZW5Db21wYXQocGtnKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KGFzayA/IDEgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfUEFDS0FHRV9BU0tfU0NSRUVOX0NPTVBBVF9UUkFOU0FDVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBTdHJpbmcgcGtnID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBib29sZWFuIGFzayA9IGRhdGEucmVhZEludCgpICE9IDA7CisgICAgICAgICAgICBzZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KHBrZywgYXNrKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC0zMjU0LDcgKzMyNzQsOCBAQAogICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKLSAgICAgICAgbVJlbW90ZS50cmFuc2FjdChTRVRfUEFDS0FHRV9TQ1JFRU5fQ09NUEFUX01PREVfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwYWNrYWdlTmFtZSk7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoR0VUX1BBQ0tBR0VfU0NSRUVOX0NPTVBBVF9NT0RFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKICAgICAgICAgaW50IG1vZGUgPSByZXBseS5yZWFkSW50KCk7CiAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKQEAgLTMyNzUsNiArMzI5NiwzMiBAQAogICAgICAgICBkYXRhLnJlY3ljbGUoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChHRVRfUEFDS0FHRV9BU0tfU0NSRUVOX0NPTVBBVF9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gYXNrID0gcmVwbHkucmVhZEludCgpICE9IDA7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiBhc2s7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZUFza1NjcmVlbkNvbXBhdChTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gYXNrKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZUludChhc2sgPyAxIDogMCk7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoU0VUX1BBQ0tBR0VfQVNLX1NDUkVFTl9DT01QQVRfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIHN3aXRjaFVzZXIoaW50IHVzZXJpZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCmluZGV4IDg1ZTU5YjMuLjdlOTRjZjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCkBAIC0xNzIsNiArMTcyLDExIEBACiAgICAgLy8gVGhlc2UgY2FuIGJlIGFjY2Vzc2VkIGJ5IG11bHRpcGxlIHRocmVhZHM7IG1QYWNrYWdlcyBpcyB0aGUgbG9jay4KICAgICAvLyBYWFggRm9yIG5vdyB3ZSBrZWVwIGFyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgcGFja2FnZXMgd2UgaGF2ZQogICAgIC8vIHNlZW4sIG5vdCByZW1vdmluZyBlbnRyaWVzIGZyb20gdGhpcyBtYXAuCisgICAgLy8gTk9URTogVGhlIGFjdGl2aXR5IG1hbmFnZXIgaW4gaXRzIHByb2Nlc3MgbmVlZHMgdG8gY2FsbCBpbiB0bworICAgIC8vIEFjdGl2aXR5VGhyZWFkIHRvIGRvIHRoaW5ncyBsaWtlIHVwZGF0ZSByZXNvdXJjZSBjb25maWd1cmF0aW9ucywKKyAgICAvLyB3aGljaCBtZWFucyB0aGlzIGxvY2sgZ2V0cyBoZWxkIHdoaWxlIHRoZSBhY3Rpdml0eSBtYW5hZ2VyIGhvbGRzIGl0cworICAgIC8vIG93biBsb2NrLiAgVGh1cyB5b3UgTVVTVCBORVZFUiBjYWxsIGJhY2sgaW50byB0aGUgYWN0aXZpdHkgbWFuYWdlcgorICAgIC8vIG9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBpdCB3aGlsZSBob2xkaW5nIHRoaXMgbG9jay4KICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZywgV2Vha1JlZmVyZW5jZTxMb2FkZWRBcGs+PiBtUGFja2FnZXMKICAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXZWFrUmVmZXJlbmNlPExvYWRlZEFwaz4+KCk7CiAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFdlYWtSZWZlcmVuY2U8TG9hZGVkQXBrPj4gbVJlc291cmNlUGFja2FnZXMKQEAgLTE0ODksNyArMTQ5NCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1Db25maWd1cmF0aW9uOworICAgICAgICByZXR1cm4gbVJlc0NvbmZpZ3VyYXRpb247CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNQcm9maWxpbmcoKSB7CkBAIC0xNTM0LDcgKzE1MzksNyBAQAogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIENvbnRleHRJbXBsIGNvbnRleHQgPSBnZXRTeXN0ZW1Db250ZXh0KCk7CiAgICAgICAgICAgICBjb250ZXh0LmluaXQobmV3IExvYWRlZEFwayh0aGlzLCAiYW5kcm9pZCIsIGNvbnRleHQsIGluZm8sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21wYXRpYmlsaXR5SW5mbyhpbmZvLCAwLCBmYWxzZSkpLCBudWxsLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8uREVGQVVMVF9DT01QQVRJQklMSVRZX0lORk8pLCBudWxsLCB0aGlzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTg3OSw3ICsxODg0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGl2ZXJOZXdJbnRlbnRzKHIsIGludGVudHMpOwogICAgICAgICAgICAgaWYgKHJlc3VtZWQpIHsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uUmVzdW1lKHIuYWN0aXZpdHkpOworICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkucGVyZm9ybVJlc3VtZSgpOwogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubVRlbXBvcmFyeVBhdXNlID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE5ODAsNyArMTk4NSw4IEBACiAgICAgICAgIEJhY2t1cEFnZW50IGFnZW50ID0gbnVsbDsKICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGRhdGEuYXBwSW5mby5iYWNrdXBBZ2VudE5hbWU7CiAKLSAgICAgICAgaWYgKGRhdGEuYmFja3VwTW9kZSA9PSBJQXBwbGljYXRpb25UaHJlYWQuQkFDS1VQX01PREVfRlVMTCkgeworICAgICAgICBpZiAoZGF0YS5iYWNrdXBNb2RlID09IElBcHBsaWNhdGlvblRocmVhZC5CQUNLVVBfTU9ERV9GVUxMCisgICAgICAgICAgICAgICAgfHwgZGF0YS5iYWNrdXBNb2RlID09IElBcHBsaWNhdGlvblRocmVhZC5CQUNLVVBfTU9ERV9SRVNUT1JFX0ZVTEwpIHsKICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJhbmRyb2lkLmFwcC5iYWNrdXAuRnVsbEJhY2t1cEFnZW50IjsKICAgICAgICAgICAgIGlmICgoZGF0YS5hcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1lTVEVNKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHBhY2thZ2VzIGNhbiBzdXBwbHkgdGhlaXIgb3duIGZ1bGwtYmFja3VwIGFnZW50CkBAIC0yMDExLDcgKzIwMTcsOCBAQAogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgZHVyaW5nIHJlc3RvcmUsIGZhaWwgc2lsZW50bHk7IG90aGVyd2lzZSBnbwogICAgICAgICAgICAgICAgIC8vIGFoZWFkIGFuZCBsZXQgdGhlIHVzZXIgc2VlIHRoZSBjcmFzaC4KICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQWdlbnQgdGhyZXcgZHVyaW5nIGNyZWF0aW9uOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEuYmFja3VwTW9kZSAhPSBJQXBwbGljYXRpb25UaHJlYWQuQkFDS1VQX01PREVfUkVTVE9SRSkgeworICAgICAgICAgICAgICAgIGlmIChkYXRhLmJhY2t1cE1vZGUgIT0gSUFwcGxpY2F0aW9uVGhyZWFkLkJBQ0tVUF9NT0RFX1JFU1RPUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRhdGEuYmFja3VwTW9kZSAhPSBJQXBwbGljYXRpb25UaHJlYWQuQkFDS1VQX01PREVfUkVTVE9SRV9GVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGZhbGxpbmcgdGhyb3VnaCB3aXRoICdiaW5kZXInIHN0aWxsIG51bGwKQEAgLTI4NDMsNyArMjg1MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWxpdmVyUmVzdWx0cyhyLCByZXMucmVzdWx0cyk7CiAgICAgICAgICAgICBpZiAocmVzdW1lZCkgewotICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25SZXN1bWUoci5hY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgci5hY3Rpdml0eS5wZXJmb3JtUmVzdW1lKCk7CiAgICAgICAgICAgICAgICAgci5hY3Rpdml0eS5tVGVtcG9yYXJ5UGF1c2UgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzI2OCw3ICszMjc1LDcgQEAKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFjdGl2aXR5IGRvZXNuJ3QgaGFuZGxlIGFueSBvZiB0aGUgY29uZmlnIGNoYW5nZXMKICAgICAgICAgICAgICAgICAvLyB0aGVuIGRvbid0IGJvdGhlciBjYWxsaW5nIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQgYXMgd2UncmUKICAgICAgICAgICAgICAgICAvLyBnb2luZyB0byBkZXN0cm95IGl0LgotICAgICAgICAgICAgICAgIGlmICgofmFjdGl2aXR5Lm1BY3Rpdml0eUluZm8uY29uZmlnQ2hhbmdlcyAmIGRpZmYpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKH5hY3Rpdml0eS5tQWN0aXZpdHlJbmZvLmdldFJlYWxDb25maWdDaGFuZ2VkKCkgJiBkaWZmKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNob3VsZENoYW5nZUNvbmZpZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzI5MSw2ICszMjk4LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBhcHBseUNvbmZpZ3VyYXRpb25Ub1Jlc291cmNlcyhDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYWNrYWdlcykgeworICAgICAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uVG9SZXNvdXJjZXNMb2NrZWQoY29uZmlnLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGZpbmFsIGJvb2xlYW4gYXBwbHlDb25maWd1cmF0aW9uVG9SZXNvdXJjZXNMb2NrZWQoQ29uZmlndXJhdGlvbiBjb25maWcsCiAgICAgICAgICAgICBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXQpIHsKICAgICAgICAgaWYgKG1SZXNDb25maWd1cmF0aW9uID09IG51bGwpIHsKQEAgLTM1MTYsOCArMzUyOSw3IEBACiAgICAgICAgICAqIHJlZmxlY3QgY29uZmlndXJhdGlvbiBjaGFuZ2VzLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgcGFzc2VkCiAgICAgICAgICAqIGluIEFwcEJpbmREYXRhIGNhbiBiZSBzYWZlbHkgYXNzdW1lZCB0byBiZSB1cCB0byBkYXRlCiAgICAgICAgICAqLwotICAgICAgICBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkudXBkYXRlQ29uZmlndXJhdGlvbihtQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0RGlzcGxheU1ldHJpY3MoKSwgZGF0YS5jb21wYXRJbmZvKTsKKyAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uVG9SZXNvdXJjZXNMb2NrZWQoZGF0YS5jb25maWcsIGRhdGEuY29tcGF0SW5mbyk7CiAKICAgICAgICAgZGF0YS5pbmZvID0gZ2V0UGFja2FnZUluZm9Ob0NoZWNrKGRhdGEuYXBwSW5mbywgZGF0YS5jb21wYXRJbmZvKTsKIApAQCAtMzY1OCwxMiArMzY3MCwxNiBAQAogICAgICAgICBBcHBsaWNhdGlvbiBhcHAgPSBkYXRhLmluZm8ubWFrZUFwcGxpY2F0aW9uKGRhdGEucmVzdHJpY3RlZEJhY2t1cE1vZGUsIG51bGwpOwogICAgICAgICBtSW5pdGlhbEFwcGxpY2F0aW9uID0gYXBwOwogCi0gICAgICAgIExpc3Q8UHJvdmlkZXJJbmZvPiBwcm92aWRlcnMgPSBkYXRhLnByb3ZpZGVyczsKLSAgICAgICAgaWYgKHByb3ZpZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YWxsQ29udGVudFByb3ZpZGVycyhhcHAsIHByb3ZpZGVycyk7Ci0gICAgICAgICAgICAvLyBGb3IgcHJvY2VzcyB0aGF0IGNvbnRhaW5zIGNvbnRlbnQgcHJvdmlkZXJzLCB3ZSB3YW50IHRvCi0gICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgSklUIGlzIGVuYWJsZWQgImF0IHNvbWUgcG9pbnQiLgotICAgICAgICAgICAgbUguc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoSC5FTkFCTEVfSklULCAxMCoxMDAwKTsKKyAgICAgICAgLy8gZG9uJ3QgYnJpbmcgdXAgcHJvdmlkZXJzIGluIHJlc3RyaWN0ZWQgbW9kZTsgdGhleSBtYXkgZGVwZW5kIG9uIHRoZQorICAgICAgICAvLyBhcHAncyBjdXN0b20gQXBwbGljYXRpb24gY2xhc3MKKyAgICAgICAgaWYgKCFkYXRhLnJlc3RyaWN0ZWRCYWNrdXBNb2RlKXsgCisgICAgICAgICAgICBMaXN0PFByb3ZpZGVySW5mbz4gcHJvdmlkZXJzID0gZGF0YS5wcm92aWRlcnM7CisgICAgICAgICAgICBpZiAocHJvdmlkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnN0YWxsQ29udGVudFByb3ZpZGVycyhhcHAsIHByb3ZpZGVycyk7CisgICAgICAgICAgICAgICAgLy8gRm9yIHByb2Nlc3MgdGhhdCBjb250YWlucyBjb250ZW50IHByb3ZpZGVycywgd2Ugd2FudCB0bworICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBKSVQgaXMgZW5hYmxlZCAiYXQgc29tZSBwb2ludCIuCisgICAgICAgICAgICAgICAgbUguc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoSC5FTkFCTEVfSklULCAxMCoxMDAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCmluZGV4IDUxZjFlM2QuLjczMTcwYmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCkBAIC00MjUsOSArNDI1LDYgQEAKIAogICAgICAgICByZWdpc3RlclNlcnZpY2UoV0lORE9XX1NFUlZJQ0UsIG5ldyBTZXJ2aWNlRmV0Y2hlcigpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2UoQ29udGV4dEltcGwgY3R4KSB7Ci0gICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJmb28iKTsKLSAgICAgICAgICAgICAgICAgICAgZS5maWxsSW5TdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkdldHRpbmcgd2luZG93IG1hbmFnZXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY2kgPSBjdHgubVJlc291cmNlcy5nZXRDb21wYXRpYmlsaXR5SW5mbygpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdChjaSk7CiAgICAgICAgICAgICAgICAgfX0pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQppbmRleCA2ZjBiYmQ3Li4xNGZmZDNiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQpAQCAtNDUwLDYgKzQ1MCw1MSBAQAogICAgIGJvb2xlYW4gbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyOwogICAgIAogICAgIC8qKgorICAgICAqIFN0YXRlIGluZm9ybWF0aW9uIHRoYXQgaGFzIGJlZW4gcmV0cmlldmVkIGZyb20gYSBmcmFnbWVudCBpbnN0YW5jZQorICAgICAqIHRocm91Z2gge0BsaW5rIEZyYWdtZW50TWFuYWdlciNzYXZlRnJhZ21lbnRJbnN0YW5jZVN0YXRlKEZyYWdtZW50KQorICAgICAqIEZyYWdtZW50TWFuYWdlci5zYXZlRnJhZ21lbnRJbnN0YW5jZVN0YXRlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAgICAgZmluYWwgQnVuZGxlIG1TdGF0ZTsKKworICAgICAgICBTYXZlZFN0YXRlKEJ1bmRsZSBzdGF0ZSkgeworICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBTYXZlZFN0YXRlKFBhcmNlbCBpbiwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwgJiYgbVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3RhdGUuc2V0Q2xhc3NMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobVN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DbGFzc0xvYWRlckNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgorICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ2xhc3NMb2FkZXJDcmVhdG9yPFNhdmVkU3RhdGU+KCkgeworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGUoaW4sIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbiwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluLCBsb2FkZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgogICAgICAqIFRocm93biBieSB7QGxpbmsgRnJhZ21lbnQjaW5zdGFudGlhdGUoQ29udGV4dCwgU3RyaW5nLCBCdW5kbGUpfSB3aGVuCiAgICAgICogdGhlcmUgaXMgYW4gaW5zdGFudGlhdGlvbiBmYWlsdXJlLgogICAgICAqLwpAQCAtNjI0LDYgKzY2OSwyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCB0aGUgaW5pdGlhbCBzYXZlZCBzdGF0ZSB0aGF0IHRoaXMgRnJhZ21lbnQgc2hvdWxkIHJlc3RvcmUgaXRzZWxmCisgICAgICogZnJvbSB3aGVuIGZpcnN0IGJlaW5nIGNvbnN0cnVjdGVkLCBhcyByZXR1cm5lZCBieQorICAgICAqIHtAbGluayBGcmFnbWVudE1hbmFnZXIjc2F2ZUZyYWdtZW50SW5zdGFuY2VTdGF0ZShGcmFnbWVudCkKKyAgICAgKiBGcmFnbWVudE1hbmFnZXIuc2F2ZUZyYWdtZW50SW5zdGFuY2VTdGF0ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRoZSBmcmFnbWVudCBzaG91bGQgYmUgcmVzdG9yZWQgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2F2ZWRTdGF0ZShTYXZlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgYWxyZWFkeSBhY3RpdmUiKTsKKyAgICAgICAgfQorICAgICAgICBtU2F2ZWRGcmFnbWVudFN0YXRlID0gc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZS5tU3RhdGUgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gc3RhdGUubVN0YXRlIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBPcHRpb25hbCB0YXJnZXQgZm9yIHRoaXMgZnJhZ21lbnQuICBUaGlzIG1heSBiZSB1c2VkLCBmb3IgZXhhbXBsZSwKICAgICAgKiBpZiB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHN0YXJ0ZWQgYnkgYW5vdGhlciwgYW5kIHdoZW4gZG9uZSB3YW50cyB0bwogICAgICAqIGdpdmUgYSByZXN1bHQgYmFjayB0byB0aGUgZmlyc3QuICBUaGUgdGFyZ2V0IHNldCBoZXJlIGlzIHJldGFpbmVkCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKaW5kZXggMGRhNjU2Zi4uM2IyZTEwOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudE1hbmFnZXIuamF2YQpAQCAtMjc0LDYgKzI3NCwzMCBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBGcmFnbWVudCBnZXRGcmFnbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5KTsKIAogICAgIC8qKgorICAgICAqIFNhdmUgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugc3RhdGUgb2YgdGhlIGdpdmVuIEZyYWdtZW50LiAgVGhpcyBjYW4gYmUKKyAgICAgKiB1c2VkIGxhdGVyIHdoZW4gY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEZyYWdtZW50IGFuZCBhZGRpbmcKKyAgICAgKiBpdCB0byB0aGUgZnJhZ21lbnQgbWFuYWdlciwgdG8gaGF2ZSBpdCBjcmVhdGUgaXRzZWxmIHRvIG1hdGNoIHRoZQorICAgICAqIGN1cnJlbnQgc3RhdGUgcmV0dXJuZWQgaGVyZS4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgbGltaXRzIG9uIGhvdworICAgICAqIHRoaXMgY2FuIGJlIHVzZWQ6CisgICAgICoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSBGcmFnbWVudCBtdXN0IGN1cnJlbnRseSBiZSBhdHRhY2hlZCB0byB0aGUgRnJhZ21lbnRNYW5hZ2VyLgorICAgICAqIDxsaT5BIG5ldyBGcmFnbWVudCBjcmVhdGVkIHVzaW5nIHRoaXMgc2F2ZWQgc3RhdGUgbXVzdCBiZSB0aGUgc2FtZSBjbGFzcworICAgICAqIHR5cGUgYXMgdGhlIEZyYWdtZW50IGl0IHdhcyBjcmVhdGVkIGZyb20uCisgICAgICogPGxpPlRoZSBzYXZlZCBzdGF0ZSBjYW4gbm90IGNvbnRhaW4gZGVwZW5kZW5jaWVzIG9uIG90aGVyIGZyYWdtZW50cyAtLQorICAgICAqIHRoYXQgaXMgaXQgY2FuJ3QgdXNlIHtAbGluayAjcHV0RnJhZ21lbnQoQnVuZGxlLCBTdHJpbmcsIEZyYWdtZW50KX0gdG8KKyAgICAgKiBzdG9yZSBhIGZyYWdtZW50IHJlZmVyZW5jZSBiZWNhdXNlIHRoYXQgcmVmZXJlbmNlIG1heSBub3QgYmUgdmFsaWQgd2hlbgorICAgICAqIHRoaXMgc2F2ZWQgc3RhdGUgaXMgbGF0ZXIgdXNlZC4gIExpa2V3aXNlIHRoZSBGcmFnbWVudCdzIHRhcmdldCBhbmQKKyAgICAgKiByZXN1bHQgY29kZSBhcmUgbm90IGluY2x1ZGVkIGluIHRoaXMgc3RhdGUuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIFRoZSBGcmFnbWVudCB3aG9zZSBzdGF0ZSBpcyB0byBiZSBzYXZlZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBnZW5lcmF0ZWQgc3RhdGUuICBUaGlzIHdpbGwgYmUgbnVsbCBpZiB0aGVyZSB3YXMgbm8KKyAgICAgKiBpbnRlcmVzdGluZyBzdGF0ZSBjcmVhdGVkIGJ5IHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRnJhZ21lbnQuU2F2ZWRTdGF0ZSBzYXZlRnJhZ21lbnRJbnN0YW5jZVN0YXRlKEZyYWdtZW50IGYpOworCisgICAgLyoqCiAgICAgICogUHJpbnQgdGhlIEZyYWdtZW50TWFuYWdlcidzIHN0YXRlIGludG8gdGhlIGdpdmVuIHN0cmVhbS4KICAgICAgKgogICAgICAqIEBwYXJhbSBwcmVmaXggVGV4dCB0byBwcmludCBhdCB0aGUgZnJvbnQgb2YgZWFjaCBsaW5lLgpAQCAtNDkyLDYgKzUxNiwxOSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGcmFnbWVudC5TYXZlZFN0YXRlIHNhdmVGcmFnbWVudEluc3RhbmNlU3RhdGUoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmcmFnbWVudAorICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgRnJhZ21lbnRNYW5hZ2VyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdtZW50Lm1TdGF0ZSA+IEZyYWdtZW50LklOSVRJQUxJWklORykgeworICAgICAgICAgICAgQnVuZGxlIHJlc3VsdCA9IHNhdmVGcmFnbWVudEJhc2ljU3RhdGUoZnJhZ21lbnQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gbmV3IEZyYWdtZW50LlNhdmVkU3RhdGUocmVzdWx0KSA6IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CiAgICAgICAgIHNiLmFwcGVuZCgiRnJhZ21lbnRNYW5hZ2VyeyIpOwpAQCAtNzE1LDcgKzc1Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldy5zZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1IaWRkZW4pIGYubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYucmVzdG9yZVZpZXdTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYub25WaWV3Q3JlYXRlZChmLm1WaWV3LCBmLm1TYXZlZEZyYWdtZW50U3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC03NDcsNyArNzgzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGYubVZpZXcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1IaWRkZW4pIGYubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5vblZpZXdDcmVhdGVkKGYubVZpZXcsIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNzU5LDYgKzc5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoKSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYucmVzdG9yZVZpZXdTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTA3Myw3ICsxMTA5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1BZGRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1SZW1vdmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUoZnJhZ21lbnQsIEZyYWdtZW50LkNSRUFURUQsIHRyYW5zaXRpb24sIHRyYW5zaXRpb25TdHlsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwODYsNyArMTEyMSw2IEBACiAgICAgICAgICAgICBpZiAoIWZyYWdtZW50Lm1BZGRlZCkgewogICAgICAgICAgICAgICAgIG1BZGRlZC5hZGQoZnJhZ21lbnQpOwogICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZnJhZ21lbnQubVJlbW92aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1IYXNNZW51KSB7CiAgICAgICAgICAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTEzNzUsNiArMTQwOSw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1TdGF0ZUFycmF5ID09IG51bGwpIHsKICAgICAgICAgICAgIG1TdGF0ZUFycmF5ID0gbmV3IFNwYXJzZUFycmF5PFBhcmNlbGFibGU+KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhdGVBcnJheS5jbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIGYubVZpZXcuc2F2ZUhpZXJhcmNoeVN0YXRlKG1TdGF0ZUFycmF5KTsKICAgICAgICAgaWYgKG1TdGF0ZUFycmF5LnNpemUoKSA+IDApIHsKQEAgLTEzODMsNiArMTQxOSwzMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIEJ1bmRsZSBzYXZlRnJhZ21lbnRCYXNpY1N0YXRlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgQnVuZGxlIHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgaWYgKG1TdGF0ZUJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgZi5vblNhdmVJbnN0YW5jZVN0YXRlKG1TdGF0ZUJ1bmRsZSk7CisgICAgICAgIGlmICghbVN0YXRlQnVuZGxlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbVN0YXRlQnVuZGxlOworICAgICAgICAgICAgbVN0YXRlQnVuZGxlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZi5tU2F2ZWRWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LnB1dFNwYXJzZVBhcmNlbGFibGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5WSUVXX1NUQVRFX1RBRywgZi5tU2F2ZWRWaWV3U3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICBQYXJjZWxhYmxlIHNhdmVBbGxTdGF0ZSgpIHsKICAgICAgICAgLy8gTWFrZSBzdXJlIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgaGF2ZSBub3cgYmVlbiBleGVjdXRlZCB0byBnZXQKICAgICAgICAgLy8gb3VyIHN0YXRlIHVwZGF0ZS10by1kYXRlLgpAQCAtMTQwNywyNSArMTQ2OSw3IEBACiAgICAgICAgICAgICAgICAgYWN0aXZlW2ldID0gZnM7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgaWYgKGYubVN0YXRlID4gRnJhZ21lbnQuSU5JVElBTElaSU5HICYmIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlQnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmLm9uU2F2ZUluc3RhbmNlU3RhdGUobVN0YXRlQnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtU3RhdGVCdW5kbGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVN0YXRlQnVuZGxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVuZGxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1TYXZlZFZpZXdTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlLnB1dFNwYXJzZVBhcmNlbGFibGVBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcsIGYubVNhdmVkVmlld1N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gc2F2ZUZyYWdtZW50QmFzaWNTdGF0ZShmKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQubUluZGV4IDwgMCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggMWY1M2MwZS4uZTI1ODhjZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0zNDcsNiArMzQ3LDkgQEAKICAgICBwdWJsaWMgaW50IGdldFBhY2thZ2VTY3JlZW5Db21wYXRNb2RlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlU2NyZWVuQ29tcGF0TW9kZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBtb2RlKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBhc2spCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIAogICAgIC8vIE11bHRpLXVzZXIgQVBJcwogICAgIHB1YmxpYyBib29sZWFuIHN3aXRjaFVzZXIoaW50IHVzZXJpZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKQEAgLTU3Nyw5ICs1ODAsMTEgQEAKICAgICBpbnQgU0VUX0ZST05UX0FDVElWSVRZX1NDUkVFTl9DT01QQVRfTU9ERV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMjQ7CiAgICAgaW50IEdFVF9QQUNLQUdFX1NDUkVFTl9DT01QQVRfTU9ERV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMjU7CiAgICAgaW50IFNFVF9QQUNLQUdFX1NDUkVFTl9DT01QQVRfTU9ERV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMjY7Ci0gICAgaW50IFNXSVRDSF9VU0VSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEyNzsKLSAgICBpbnQgUkVNT1ZFX1NVQl9UQVNLX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEyODsKLSAgICBpbnQgUkVNT1ZFX1RBU0tfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTI5OwotICAgIGludCBSRUdJU1RFUl9QUk9DRVNTX09CU0VSVkVSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEzMDsKLSAgICBpbnQgVU5SRUdJU1RFUl9QUk9DRVNTX09CU0VSVkVSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEzMTsKKyAgICBpbnQgR0VUX1BBQ0tBR0VfQVNLX1NDUkVFTl9DT01QQVRfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTI3OworICAgIGludCBTRVRfUEFDS0FHRV9BU0tfU0NSRUVOX0NPTVBBVF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMjg7CisgICAgaW50IFNXSVRDSF9VU0VSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEyOTsKKyAgICBpbnQgUkVNT1ZFX1NVQl9UQVNLX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEzMDsKKyAgICBpbnQgUkVNT1ZFX1RBU0tfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTMxOworICAgIGludCBSRUdJU1RFUl9QUk9DRVNTX09CU0VSVkVSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEzMjsKKyAgICBpbnQgVU5SRUdJU1RFUl9QUk9DRVNTX09CU0VSVkVSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEzMzsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQppbmRleCA4YzMxNTU5Li4wNWE2OGE4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhCkBAIC02OCw2ICs2OCw3IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBCQUNLVVBfTU9ERV9JTkNSRU1FTlRBTCA9IDA7CiAgICAgc3RhdGljIGZpbmFsIGludCBCQUNLVVBfTU9ERV9GVUxMID0gMTsKICAgICBzdGF0aWMgZmluYWwgaW50IEJBQ0tVUF9NT0RFX1JFU1RPUkUgPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1VQX01PREVfUkVTVE9SRV9GVUxMID0gMzsKICAgICB2b2lkIHNjaGVkdWxlQ3JlYXRlQmFja3VwQWdlbnQoQXBwbGljYXRpb25JbmZvIGFwcCwgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0SW5mbywKICAgICAgICAgICAgIGludCBiYWNrdXBNb2RlKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgc2NoZWR1bGVEZXN0cm95QmFja3VwQWdlbnQoQXBwbGljYXRpb25JbmZvIGFwcCwgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0SW5mbykKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQmFja3VwQWdlbnQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQmFja3VwQWdlbnQuYWlkbAppbmRleCA1MmZjNjIzLi44YWY3OGZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUJhY2t1cEFnZW50LmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lCYWNrdXBBZ2VudC5haWRsCkBAIC03OSw0ICs3OSwyMyBAQAogICAgICAqLwogICAgIHZvaWQgZG9SZXN0b3JlKGluIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGRhdGEsIGludCBhcHBWZXJzaW9uQ29kZSwKICAgICAgICAgICAgIGluIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5ld1N0YXRlLCBpbnQgdG9rZW4sIElCYWNrdXBNYW5hZ2VyIGNhbGxiYWNrQmluZGVyKTsKKworICAgIC8qKgorICAgICAqIFJlc3RvcmUgYSBzaW5nbGUgImZpbGUiIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBmaWxlIHdhcyB0eXBpY2FsbHkgb2J0YWluZWQgZnJvbQorICAgICAqIGEgZnVsbC1iYWNrdXAgZGF0YXNldC4gIFRoZSBhZ2VudCByZWFkcyAnc2l6ZScgYnl0ZXMgb2YgZmlsZSBjb250ZW50CisgICAgICogZnJvbSB0aGUgcHJvdmlkZWQgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgUmVhZC1vbmx5IHBpcGUgZGVsaXZlcmluZyB0aGUgZmlsZSBjb250ZW50IGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIFNpemUgb2YgdGhlIGZpbGUgYmVpbmcgcmVzdG9yZWQuCisgICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBmaWxlIHN5c3RlbSBlbnRpdHksIGUuZy4gRnVsbEJhY2t1cC5UWVBFX0RJUkVDVE9SWS4KKyAgICAgKiBAcGFyYW0gZG9tYWluIE5hbWUgb2YgdGhlIGZpbGUncyBzZW1hbnRpYyBkb21haW4gdG8gd2hpY2ggdGhlICdwYXRoJyBhcmd1bWVudCBpcyBhCisgICAgICogICAgICAgIHJlbGF0aXZlIHBhdGguICBlLmcuIEZ1bGxCYWNrdXAuREFUQUJBU0VfVFJFRV9UT0tFTi4KKyAgICAgKiBAcGFyYW0gcGF0aCBSZWxhdGl2ZSBwYXRoIG9mIHRoZSBmaWxlIHdpdGhpbiBpdHMgc2VtYW50aWMgZG9tYWluLgorICAgICAqIEBwYXJhbSBtb2RlIEFjY2VzcyBtb2RlIG9mIHRoZSBmaWxlIHN5c3RlbSBlbnRpdHksIGUuZy4gMDY2MC4KKyAgICAgKiBAcGFyYW0gbXRpbWUgTGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZSBzeXN0ZW0gZW50aXR5LgorICAgICAqLworICAgIHZvaWQgZG9SZXN0b3JlRmlsZShpbiBQYXJjZWxGaWxlRGVzY3JpcHRvciBkYXRhLCBsb25nIHNpemUsCisgICAgICAgICAgICBpbnQgdHlwZSwgU3RyaW5nIGRvbWFpbiwgU3RyaW5nIHBhdGgsIGxvbmcgbW9kZSwgbG9uZyBtdGltZSwKKyAgICAgICAgICAgIGludCB0b2tlbiwgSUJhY2t1cE1hbmFnZXIgY2FsbGJhY2tCaW5kZXIpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlZEFway5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlZEFway5qYXZhCmluZGV4IDUzMDc2OTYuLjYyODdkMzMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZWRBcGsuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVkQXBrLmphdmEKQEAgLTk4LDYgKzk4LDEyIEBACiAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb247CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ3JlYXRlIGluZm9ybWF0aW9uIGFib3V0IGEgbmV3IC5hcGsKKyAgICAgKgorICAgICAqIE5PVEU6IFRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIHdpdGggQWN0aXZpdHlUaHJlYWQncyBsb2NrIGhlbGQsCisgICAgICogc28gTVVTVCBOT1QgY2FsbCBiYWNrIG91dCB0byB0aGUgYWN0aXZpdHkgbWFuYWdlci4KKyAgICAgKi8KICAgICBwdWJsaWMgTG9hZGVkQXBrKEFjdGl2aXR5VGhyZWFkIGFjdGl2aXR5VGhyZWFkLCBBcHBsaWNhdGlvbkluZm8gYUluZm8sCiAgICAgICAgICAgICBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXRJbmZvLAogICAgICAgICAgICAgQWN0aXZpdHlUaHJlYWQgbWFpblRocmVhZCwgQ2xhc3NMb2FkZXIgYmFzZUxvYWRlciwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvQmFja3VwQWdlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvQmFja3VwQWdlbnQuamF2YQppbmRleCBkYzYwZTI0Li4xN2Y4YWRiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYmFja3VwL0JhY2t1cEFnZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9CYWNrdXBBZ2VudC5qYXZhCkBAIC0xNzksMTAgKzE3OSwxOCBAQAogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmVGaWxlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGRhdGEsIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgIGludCB0eXBlLCBTdHJpbmcgZG9tYWluLCBTdHJpbmcgcGF0aCwgbG9uZyBtb2RlLCBsb25nIG10aW1lKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZW1wdHkgc3R1YiBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworICAgIC8qKgogICAgICAqIFBhY2thZ2UtcHJpdmF0ZSwgdXNlZCBvbmx5IGZvciBkaXNwYXRjaGluZyBhbiBleHRyYSBzdGVwIGR1cmluZyBmdWxsIGJhY2t1cAogICAgICAqLwogICAgIHZvaWQgb25TYXZlQXBrKEJhY2t1cERhdGFPdXRwdXQgZGF0YSkgewotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIi0tLSBiYXNlIG9uU2F2ZUFwaygpIC0tLSIpOwogICAgIH0KIAogICAgIC8vIC0tLS0tIENvcmUgaW1wbGVtZW50YXRpb24gLS0tLS0KQEAgLTIwMyw2ICsyMTEsNyBAQAogICAgIHByaXZhdGUgY2xhc3MgQmFja3VwU2VydmljZUJpbmRlciBleHRlbmRzIElCYWNrdXBBZ2VudC5TdHViIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCYWNrdXBTZXJ2aWNlQmluZGVyIjsKIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZG9CYWNrdXAoUGFyY2VsRmlsZURlc2NyaXB0b3Igb2xkU3RhdGUsCiAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZGF0YSwKICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBuZXdTdGF0ZSwKQEAgLTIzNiw2ICsyNDUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGRvUmVzdG9yZShQYXJjZWxGaWxlRGVzY3JpcHRvciBkYXRhLCBpbnQgYXBwVmVyc2lvbkNvZGUsCiAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmV3U3RhdGUsCiAgICAgICAgICAgICAgICAgaW50IHRva2VuLCBJQmFja3VwTWFuYWdlciBjYWxsYmFja0JpbmRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CkBAIC0yNjEsNSArMjcxLDI1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRvUmVzdG9yZUZpbGUoUGFyY2VsRmlsZURlc2NyaXB0b3IgZGF0YSwgbG9uZyBzaXplLAorICAgICAgICAgICAgICAgIGludCB0eXBlLCBTdHJpbmcgZG9tYWluLCBTdHJpbmcgcGF0aCwgbG9uZyBtb2RlLCBsb25nIG10aW1lLAorICAgICAgICAgICAgICAgIGludCB0b2tlbiwgSUJhY2t1cE1hbmFnZXIgY2FsbGJhY2tCaW5kZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgdHJ5IHsKK0xvZy5kKFRBRywgImRvUmVzdG9yZUZpbGUoKSA9PiBvblJlc3RvcmVGaWxlKCkiKTsKKyAgICAgICAgICAgICAgICBCYWNrdXBBZ2VudC50aGlzLm9uUmVzdG9yZUZpbGUoZGF0YSwgc2l6ZSwgdHlwZSwgZG9tYWluLCBwYXRoLCBtb2RlLCBtdGltZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0JpbmRlci5vcENvbXBsZXRlKHRva2VuKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSdsbCB0aW1lIG91dCBhbnl3YXksIHNvIHdlJ3JlIHNhZmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYmFja3VwL0Z1bGxCYWNrdXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvRnVsbEJhY2t1cC5qYXZhCmluZGV4IDk4NTA1NjYuLmRmYjBkZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvRnVsbEJhY2t1cC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvRnVsbEJhY2t1cC5qYXZhCkBAIC0xNiw2ICsxNiwxNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwLmJhY2t1cDsKIAoraW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGxpYmNvcmUuaW8uRXJybm9FeGNlcHRpb247CitpbXBvcnQgbGliY29yZS5pby5MaWJjb3JlOworCiAvKioKICAqIEdsb2JhbCBjb25zdGFudCBkZWZpbml0aW9ucyBldCBjZXRlcmEgcmVsYXRlZCB0byB0aGUgZnVsbC1iYWNrdXAtdG8tZmQKICAqIGJpbmFyeSBmb3JtYXQuCkBAIC0yMywxOCArMzQsOTUgQEAKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBjbGFzcyBGdWxsQmFja3VwIHsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBUEtfVFJFRV9UT0tFTiA9ICJhIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPQkJfVFJFRV9UT0tFTiA9ICJvYmIiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJPT1RfVFJFRV9UT0tFTiA9ICJyIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEQVRBX1RSRUVfVE9LRU4gPSAiZiI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREFUQUJBU0VfVFJFRV9UT0tFTiA9ICJkYiI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0hBUkVEUFJFRlNfVFJFRV9UT0tFTiA9ICJzcCI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ0FDSEVfVFJFRV9UT0tFTiA9ICJjIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGdWxsQmFja3VwIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZVTExfQkFDS1VQX0lOVEVOVF9BQ1RJT04gPSAiZnVsbGJhY2siOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZVTExfUkVTVE9SRV9JTlRFTlRfQUNUSU9OID0gImZ1bGxyZXN0IjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDT05GX1RPS0VOX0lOVEVOVF9FWFRSQSA9ICJjb25mdG9rZW4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS19UUkVFX1RPS0VOID0gImEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CQl9UUkVFX1RPS0VOID0gIm9iYiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9UUkVFX1RPS0VOID0gInIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfVFJFRV9UT0tFTiA9ICJmIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9UUkVFX1RPS0VOID0gImRiIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURQUkVGU19UUkVFX1RPS0VOID0gInNwIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UUkVFX1RPS0VOID0gImMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9TVE9SQUdFX1RPS0VOID0gInNoYXJlZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBTX1BSRUZJWCA9ICJhcHBzLyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX1BSRUZJWCA9ICJzaGFyZWQvIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExfQkFDS1VQX0lOVEVOVF9BQ1RJT04gPSAiZnVsbGJhY2siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExfUkVTVE9SRV9JTlRFTlRfQUNUSU9OID0gImZ1bGxyZXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GX1RPS0VOX0lOVEVOVF9FWFRSQSA9ICJjb25mdG9rZW4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FT0YgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRklMRSA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ESVJFQ1RPUlkgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1lNTElOSyA9IDM7CiAKICAgICBzdGF0aWMgcHVibGljIG5hdGl2ZSBpbnQgYmFja3VwVG9UYXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZG9tYWluLAogICAgICAgICAgICAgU3RyaW5nIGxpbmtkb21haW4sIFN0cmluZyByb290cGF0aCwgU3RyaW5nIHBhdGgsIEJhY2t1cERhdGFPdXRwdXQgb3V0cHV0KTsKKworICAgIHN0YXRpYyBwdWJsaWMgdm9pZCByZXN0b3JlVG9GaWxlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGRhdGEsCisgICAgICAgICAgICBsb25nIHNpemUsIGludCB0eXBlLCBsb25nIG1vZGUsIGxvbmcgbXRpbWUsIEZpbGUgb3V0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gRnVsbEJhY2t1cC5UWVBFX0RJUkVDVE9SWSkgeworICAgICAgICAgICAgLy8gQ2Fub25pY2FsbHkgYSBkaXJlY3RvcnkgaGFzIG5vIGFzc29jaWF0ZWQgY29udGVudCwgc28gd2UgZG9uJ3QgbmVlZCB0byByZWFkCisgICAgICAgICAgICAvLyBhbnl0aGluZyBmcm9tIHRoZSBwaXBlIGluIHRoaXMgY2FzZS4gIEp1c3QgY3JlYXRlIHRoZSBkaXJlY3RvcnkgaGVyZSBhbmQKKyAgICAgICAgICAgIC8vIGRyb3AgZG93biB0byB0aGUgZmluYWwgbWV0YWRhdGEgYWRqdXN0bWVudC4KKyAgICAgICAgICAgIGlmIChvdXRGaWxlICE9IG51bGwpIG91dEZpbGUubWtkaXJzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIFB1bGwgdGhlIGRhdGEgZnJvbSB0aGUgcGlwZSwgY29weWluZyBpdCB0byB0aGUgb3V0cHV0IGZpbGUsIHVudGlsIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG91dEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIHBhcmVudCA9IG91dEZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gcHJhY3RpY2UgdGhpcyB3aWxsIG9ubHkgYmUgZm9yIHRoZSBkZWZhdWx0IHNlbWFudGljIGRpcmVjdG9yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzaW5nIHRoZSBkZWZhdWx0IG1vZGUgZm9yIHRob3NlIGlzIGFwcHJvcHJpYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCB0aGUgZWRnZSBjYXNlIG9mIGFwcHMgdGhhdCBoYXZlIGFkanVzdGVkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgcGVybWlzc2lvbnMgb24gdGhlc2UgY29yZSBkaXJlY3RvcmllcworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Lm1rZGlycygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gY3JlYXRlL29wZW4gZmlsZSAiICsgb3V0RmlsZS5nZXRQYXRoKCksIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMzIgKiAxMDI0XTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgb3JpZ1NpemUgPSBzaXplOworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShkYXRhLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IHRvUmVhZCA9IChzaXplID4gYnVmZmVyLmxlbmd0aCkgPyBidWZmZXIubGVuZ3RoIDogKGludClzaXplOworICAgICAgICAgICAgICAgIGludCBnb3QgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgdG9SZWFkKTsKKyAgICAgICAgICAgICAgICBpZiAoZ290IDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSW5jb21wbGV0ZSByZWFkOiBleHBlY3RlZCAiICsgc2l6ZSArICIgYnV0IGdvdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAob3JpZ1NpemUgLSBzaXplKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGdvdCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2JsZW0gd3JpdGluZyB0byB0aGUgZmlsZS4gIFF1aXQgY29weWluZyBkYXRhIGFuZCBkZWxldGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlLCBidXQgb2YgY291cnNlIGtlZXAgY29uc3VtaW5nIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gd3JpdGUgdG8gZmlsZSAiICsgb3V0RmlsZS5nZXRQYXRoKCksIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0RmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplIC09IGdvdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgb3V0LmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgdHdpZGRsZSB0aGUgc3RhdGUgdG8gbWF0Y2ggdGhlIGJhY2t1cCwgYXNzdW1pbmcgYWxsIHdlbnQgd2VsbAorICAgICAgICBpZiAob3V0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIExpYmNvcmUub3MuY2htb2Qob3V0RmlsZS5nZXRQYXRoKCksIChpbnQpbW9kZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFcnJub0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5yZXRocm93QXNJT0V4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0RmlsZS5zZXRMYXN0TW9kaWZpZWQobXRpbWUpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9GdWxsQmFja3VwQWdlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvRnVsbEJhY2t1cEFnZW50LmphdmEKaW5kZXggZjBhMWYyYS4uNGRjYTU5MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9GdWxsQmFja3VwQWdlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYmFja3VwL0Z1bGxCYWNrdXBBZ2VudC5qYXZhCkBAIC0yOCw2ICsyOCw5IEBACiBpbXBvcnQgbGliY29yZS5pby5TdHJ1Y3RTdGF0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogCkBAIC01Myw4ICs1NiwxMiBAQAogICAgIHByaXZhdGUgU3RyaW5nIG1DYWNoZURpcjsKICAgICBwcml2YXRlIFN0cmluZyBtTGliRGlyOwogCisgICAgcHJpdmF0ZSBGaWxlIE5VTExfRklMRTsKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBOVUxMX0ZJTEUgPSBuZXcgRmlsZSgiL2Rldi9udWxsIik7CisKICAgICAgICAgbVBtID0gZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhcHBJbmZvID0gbVBtLmdldEFwcGxpY2F0aW9uSW5mbyhnZXRQYWNrYWdlTmFtZSgpLCAwKTsKQEAgLTE3Nyw3ICsxODQsNDAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIER1bW15IC0tIFdlJ3JlIG5ldmVyIHVzZWQgZm9yIHJlc3RvcmUgb2YgYW4gaW5jcmVtZW50YWwgZGF0YXNldAorICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZShCYWNrdXBEYXRhSW5wdXQgZGF0YSwgaW50IGFwcFZlcnNpb25Db2RlLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBuZXdTdGF0ZSkgeworICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZShCYWNrdXBEYXRhSW5wdXQgZGF0YSwgaW50IGFwcFZlcnNpb25Db2RlLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBuZXdTdGF0ZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdG9yZSB0aGUgZGVzY3JpYmVkIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gcGlwZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmVGaWxlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGRhdGEsIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgIGludCB0eXBlLCBTdHJpbmcgZG9tYWluLCBTdHJpbmcgcmVscGF0aCwgbG9uZyBtb2RlLCBsb25nIG10aW1lKSAKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBiYXNlUGF0aCA9IG51bGw7CisgICAgICAgIEZpbGUgb3V0RmlsZSA9IG51bGw7CisKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblJlc3RvcmVGaWxlKCkgc2l6ZT0iICsgc2l6ZSArICIgdHlwZT0iICsgdHlwZQorICAgICAgICAgICAgICAgICsgIiBkb21haW49IiArIGRvbWFpbiArICIgcmVscGF0aD0iICsgcmVscGF0aCArICIgbW9kZT0iICsgbW9kZQorICAgICAgICAgICAgICAgICsgIiBtdGltZT0iICsgbXRpbWUpOworCisgICAgICAgIC8vIFBhcnNlIG91dCB0aGUgc2VtYW50aWMgZG9tYWlucyBpbnRvIHRoZSBjb3JyZWN0IHBoeXNpY2FsIGxvY2F0aW9uCisgICAgICAgIGlmIChkb21haW4uZXF1YWxzKEZ1bGxCYWNrdXAuREFUQV9UUkVFX1RPS0VOKSkgYmFzZVBhdGggPSBtRmlsZXNEaXI7CisgICAgICAgIGVsc2UgaWYgKGRvbWFpbi5lcXVhbHMoRnVsbEJhY2t1cC5EQVRBQkFTRV9UUkVFX1RPS0VOKSkgYmFzZVBhdGggPSBtRGF0YWJhc2VEaXI7CisgICAgICAgIGVsc2UgaWYgKGRvbWFpbi5lcXVhbHMoRnVsbEJhY2t1cC5ST09UX1RSRUVfVE9LRU4pKSBiYXNlUGF0aCA9IG1NYWluRGlyOworICAgICAgICBlbHNlIGlmIChkb21haW4uZXF1YWxzKEZ1bGxCYWNrdXAuU0hBUkVEUFJFRlNfVFJFRV9UT0tFTikpIGJhc2VQYXRoID0gbVNoYXJlZFByZWZzRGlyOworCisgICAgICAgIC8vIE5vdCBhIHN1cHBvcnRlZCBvdXRwdXQgbG9jYXRpb24/ICBXZSBuZWVkIHRvIGNvbnN1bWUgdGhlIGRhdGEKKyAgICAgICAgLy8gYW55d2F5LCBzbyBzZW5kIGl0IHRvIC9kZXYvbnVsbAorICAgICAgICBvdXRGaWxlID0gKGJhc2VQYXRoICE9IG51bGwpID8gbmV3IEZpbGUoYmFzZVBhdGgsIHJlbHBhdGgpIDogbnVsbDsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuaShUQUcsICJbIiArIGRvbWFpbiArICIgOiAiICsgcmVscGF0aCArICJdIG1hcHBlZCB0byAiICsgb3V0RmlsZS5nZXRQYXRoKCkpOworCisgICAgICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGZpZ3VyZWQgb3V0IHdoZXJlIHRoZSBkYXRhIGdvZXMsIHNlbmQgaXQgb24gaXRzIHdheQorICAgICAgICBGdWxsQmFja3VwLnJlc3RvcmVUb0ZpbGUoZGF0YSwgc2l6ZSwgdHlwZSwgbW9kZSwgbXRpbWUsIG91dEZpbGUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvSUJhY2t1cE1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvSUJhY2t1cE1hbmFnZXIuYWlkbAppbmRleCA5NGUzMWE4Li5iYWM4NzRlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYmFja3VwL0lCYWNrdXBNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9JQmFja3VwTWFuYWdlci5haWRsCkBAIC0xNDcsNiArMTQ3LDE0IEBACiAgICAgICAgICAgICBib29sZWFuIGFsbEFwcHMsIGluIFN0cmluZ1tdIHBhY2thZ2VOYW1lcyk7CiAKICAgICAvKioKKyAgICAgKiBSZXN0b3JlIGRldmljZSBjb250ZW50IGZyb20gdGhlIGRhdGEgc3RyZWFtIHBhc3NlZCB0aHJvdWdoIHRoZSBnaXZlbiBzb2NrZXQuICBUaGUKKyAgICAgKiBkYXRhIHN0cmVhbSBtdXN0IGJlIGluIHRoZSBmb3JtYXQgZW1pdHRlZCBieSBmdWxsQmFja3VwKCkuCisgICAgICoKKyAgICAgKiA8cD5DYWxsZXJzIG11c3QgaG9sZCB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkJBQ0tVUCBwZXJtaXNzaW9uIHRvIHVzZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2b2lkIGZ1bGxSZXN0b3JlKGluIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKTsKKworICAgIC8qKgogICAgICAqIENvbmZpcm0gdGhhdCB0aGUgcmVxdWVzdGVkIGZ1bGwgYmFja3VwL3Jlc3RvcmUgb3BlcmF0aW9uIGNhbiBwcm9jZWVkLiAgVGhlIHN5c3RlbSB3aWxsCiAgICAgICogbm90IGFjdHVhbGx5IHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBkZXNjcmliZWQgdG8gZnVsbEJhY2t1cCgpIC8gZnVsbFJlc3RvcmUoKSB1bmxlc3MgdGhlCiAgICAgICogVUkgY2FsbHMgYmFjayBpbnRvIHRoZSBCYWNrdXAgTWFuYWdlciB0byBjb25maXJtLCBwYXNzaW5nIHRoZSBjb3JyZWN0IHRva2VuLiAgQXQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQWRhcHRlci5qYXZhCmluZGV4IGUxYzkwNDQuLmE4YzMxZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFkYXB0ZXIuamF2YQpAQCAtNjk5LDcgKzY5OSw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsRGlzY292ZXJ5KCkgewogICAgICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBTVEFURV9PTikgcmV0dXJuIGZhbHNlOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVNlcnZpY2UuY2FuY2VsRGlzY292ZXJ5KCk7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY2FuY2VsRGlzY292ZXJ5KCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCAiIiwgZSk7fQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtODczLDEwICs4NzMsMTAgQEAKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIGxpc3RlbmluZywgaW5zZWN1cmUgUkZDT01NIEJsdWV0b290aCBzb2NrZXQgd2l0aCBTZXJ2aWNlIFJlY29yZC4KLSAgICAgKiA8cD5UaGUgbGluayBrZXkgd2lsbCBiZSB1bmF1dGhlbnRpY2F0ZWQgaS5lIHRoZSBjb21tdW5pY2F0aW9uIGlzCisgICAgICogPHA+VGhlIGxpbmsga2V5IGlzIG5vdCByZXF1aXJlZCB0byBiZSBhdXRoZW50aWNhdGVkLCBpLmUgdGhlIGNvbW11bmljYXRpb24gbWF5IGJlCiAgICAgICogdnVsbmVyYWJsZSB0byBNYW4gSW4gdGhlIE1pZGRsZSBhdHRhY2tzLiBGb3IgQmx1ZXRvb3RoIDIuMSBkZXZpY2VzLAotICAgICAqIHRoZSBsaW5rIGtleSB3aWxsIGJlIGVuY3J5cHRlZCwgYXMgZW5jcnlwdGlvbiBpcyBtYW5kYXJ0b3J5LgotICAgICAqIEZvciBsZWdhY3kgZGV2aWNlcyAocHJlIEJsdWV0b290aCAyLjEgZGV2aWNlcykgdGhlIGxpbmsga2V5IHdpbGwgbm90CisgICAgICogdGhlIGxpbmsgd2lsbCBiZSBlbmNyeXB0ZWQsIGFzIGVuY3J5cHRpb24gaXMgbWFuZGFydG9yeS4KKyAgICAgKiBGb3IgbGVnYWN5IGRldmljZXMgKHByZSBCbHVldG9vdGggMi4xIGRldmljZXMpIHRoZSBsaW5rIHdpbGwgbm90CiAgICAgICogYmUgZW5jcnlwdGVkLiBVc2Uge0BsaW5rICNsaXN0ZW5Vc2luZ1JmY29tbVdpdGhTZXJ2aWNlUmVjb3JkfSwgaWYgYW4KICAgICAgKiBlbmNyeXB0ZWQgYW5kIGF1dGhlbnRpY2F0ZWQgY29tbXVuaWNhdGlvbiBjaGFubmVsIGlzIGRlc2lyZWQuCiAgICAgICogPHA+VXNlIHtAbGluayBCbHVldG9vdGhTZXJ2ZXJTb2NrZXQjYWNjZXB0fSB0byByZXRyaWV2ZSBpbmNvbWluZwpAQCAtOTAyLDYgKzkwMiw0NCBAQAogICAgICAgICByZXR1cm4gY3JlYXRlTmV3UmZjb21tU29ja2V0QW5kUmVjb3JkKG5hbWUsIHV1aWQsIGZhbHNlLCBmYWxzZSk7CiAgICAgfQogCisgICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpc3RlbmluZywgZW5jcnlwdGVkLAorICAgICAqIFJGQ09NTSBCbHVldG9vdGggc29ja2V0IHdpdGggU2VydmljZSBSZWNvcmQuCisgICAgICogPHA+VGhlIGxpbmsgd2lsbCBiZSBlbmNyeXB0ZWQsIGJ1dCB0aGUgbGluayBrZXkgaXMgbm90IHJlcXVpcmVkIHRvIGJlIGF1dGhlbnRpY2F0ZWQKKyAgICAgKiBpLmUgdGhlIGNvbW11bmljYXRpb24gaXMgdnVsbmVyYWJsZSB0byBNYW4gSW4gdGhlIE1pZGRsZSBhdHRhY2tzLiBVc2UKKyAgICAgKiB7QGxpbmsgI2xpc3RlblVzaW5nUmZjb21tV2l0aFNlcnZpY2VSZWNvcmR9LCB0byBlbnN1cmUgYW4gYXV0aGVudGljYXRlZCBsaW5rIGtleS4KKyAgICAgKiA8cD4gVXNlIHRoaXMgc29ja2V0IGlmIGF1dGhlbnRpY2F0aW9uIG9mIGxpbmsga2V5IGlzIG5vdCBwb3NzaWJsZS4KKyAgICAgKiBGb3IgZXhhbXBsZSwgZm9yIEJsdWV0b290aCAyLjEgZGV2aWNlcywgaWYgYW55IG9mIHRoZSBkZXZpY2VzIGRvZXMgbm90IGhhdmUKKyAgICAgKiBhbiBpbnB1dCBhbmQgb3V0cHV0IGNhcGFiaWxpdHkgb3IganVzdCBoYXMgdGhlIGFiaWxpdHkgdG8gZGlzcGxheSBhIG51bWVyaWMga2V5LAorICAgICAqIGEgc2VjdXJlIHNvY2tldCBjb25uZWN0aW9uIGlzIG5vdCBwb3NzaWJsZSBhbmQgdGhpcyBzb2NrZXQgY2FuIGJlIHVzZWQuCisgICAgICogVXNlIHtAbGluayAjbGlzdGVuVXNpbmdJbnNlY3VyZVJmY29tbVdpdGhTZXJ2aWNlUmVjb3JkfSwgaWYgZW5jcnlwdGlvbiBpcyBub3QgcmVxdWlyZWQuCisgICAgICogRm9yIEJsdWV0b290aCAyLjEgZGV2aWNlcywgdGhlIGxpbmsgd2lsbCBiZSBlbmNyeXB0ZWQsIGFzIGVuY3J5cHRpb24gaXMgbWFuZGFydG9yeS4KKyAgICAgKiBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byB0aGUgU2VjdXJpdHkgTW9kZWwgc2VjdGlvbiA1LjIgKHZvbCAzKSBvZgorICAgICAqIEJsdWV0b290aCBDb3JlIFNwZWNpZmljYXRpb24gdmVyc2lvbiAyLjEgKyBFRFIuCisgICAgICogPHA+VXNlIHtAbGluayBCbHVldG9vdGhTZXJ2ZXJTb2NrZXQjYWNjZXB0fSB0byByZXRyaWV2ZSBpbmNvbWluZworICAgICAqIGNvbm5lY3Rpb25zIGZyb20gYSBsaXN0ZW5pbmcge0BsaW5rIEJsdWV0b290aFNlcnZlclNvY2tldH0uCisgICAgICogPHA+VGhlIHN5c3RlbSB3aWxsIGFzc2lnbiBhbiB1bnVzZWQgUkZDT01NIGNoYW5uZWwgdG8gbGlzdGVuIG9uLgorICAgICAqIDxwPlRoZSBzeXN0ZW0gd2lsbCBhbHNvIHJlZ2lzdGVyIGEgU2VydmljZSBEaXNjb3ZlcnkKKyAgICAgKiBQcm90b2NvbCAoU0RQKSByZWNvcmQgd2l0aCB0aGUgbG9jYWwgU0RQIHNlcnZlciBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBVVUlELCBzZXJ2aWNlIG5hbWUsIGFuZCBhdXRvLWFzc2lnbmVkIGNoYW5uZWwuIFJlbW90ZSBCbHVldG9vdGggZGV2aWNlcworICAgICAqIGNhbiB1c2UgdGhlIHNhbWUgVVVJRCB0byBxdWVyeSBvdXIgU0RQIHNlcnZlciBhbmQgZGlzY292ZXIgd2hpY2ggY2hhbm5lbAorICAgICAqIHRvIGNvbm5lY3QgdG8uIFRoaXMgU0RQIHJlY29yZCB3aWxsIGJlIHJlbW92ZWQgd2hlbiB0aGlzIHNvY2tldCBpcworICAgICAqIGNsb3NlZCwgb3IgaWYgdGhpcyBhcHBsaWNhdGlvbiBjbG9zZXMgdW5leHBlY3RlZGx5LgorICAgICAqIDxwPlVzZSB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI2NyZWF0ZVJmY29tbVNvY2tldFRvU2VydmljZVJlY29yZH0gdG8KKyAgICAgKiBjb25uZWN0IHRvIHRoaXMgc29ja2V0IGZyb20gYW5vdGhlciBkZXZpY2UgdXNpbmcgdGhlIHNhbWUge0BsaW5rIFVVSUR9LgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfQorICAgICAqIEBwYXJhbSBuYW1lIHNlcnZpY2UgbmFtZSBmb3IgU0RQIHJlY29yZAorICAgICAqIEBwYXJhbSB1dWlkIHV1aWQgZm9yIFNEUCByZWNvcmQKKyAgICAgKiBAcmV0dXJuIGEgbGlzdGVuaW5nIFJGQ09NTSBCbHVldG9vdGhTZXJ2ZXJTb2NrZXQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yLCBmb3IgZXhhbXBsZSBCbHVldG9vdGggbm90IGF2YWlsYWJsZSwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGluc3VmZmljaWVudCBwZXJtaXNzaW9ucywgb3IgY2hhbm5lbCBpbiB1c2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQmx1ZXRvb3RoU2VydmVyU29ja2V0IGxpc3RlblVzaW5nRW5jcnlwdGVkUmZjb21tV2l0aFNlcnZpY2VSZWNvcmQoCisgICAgICAgICAgICBTdHJpbmcgbmFtZSwgVVVJRCB1dWlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlTmV3UmZjb21tU29ja2V0QW5kUmVjb3JkKG5hbWUsIHV1aWQsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKICAgICBwcml2YXRlIEJsdWV0b290aFNlcnZlclNvY2tldCBjcmVhdGVOZXdSZmNvbW1Tb2NrZXRBbmRSZWNvcmQoU3RyaW5nIG5hbWUsIFVVSUQgdXVpZCwKICAgICAgICAgICAgIGJvb2xlYW4gYXV0aCwgYm9vbGVhbiBlbmNyeXB0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBSZmNvbW1DaGFubmVsUGlja2VyIHBpY2tlciA9IG5ldyBSZmNvbW1DaGFubmVsUGlja2VyKHV1aWQpOwpAQCAtOTczLDYgKzEwMTEsMjggQEAKICAgICAgICAgcmV0dXJuIHNvY2tldDsKICAgICB9CiAKKyAgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGVuY3J5cHRlZCwgUkZDT01NIHNlcnZlciBzb2NrZXQuCisgICAgICogQ2FsbCAjYWNjZXB0IHRvIHJldHJpZXZlIGNvbm5lY3Rpb25zIHRvIHRoaXMgc29ja2V0LgorICAgICAqIEByZXR1cm4gQW4gUkZDT01NIEJsdWV0b290aFNlcnZlclNvY2tldAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gT24gZXJyb3IsIGZvciBleGFtcGxlIEJsdWV0b290aCBub3QgYXZhaWxhYmxlLCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIEJsdWV0b290aFNlcnZlclNvY2tldCBsaXN0ZW5Vc2luZ0VuY3J5cHRlZFJmY29tbU9uKGludCBwb3J0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQmx1ZXRvb3RoU2VydmVyU29ja2V0IHNvY2tldCA9IG5ldyBCbHVldG9vdGhTZXJ2ZXJTb2NrZXQoCisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoU29ja2V0LlRZUEVfUkZDT01NLCBmYWxzZSwgdHJ1ZSwgcG9ydCk7CisgICAgICAgIGludCBlcnJubyA9IHNvY2tldC5tU29ja2V0LmJpbmRMaXN0ZW4oKTsKKyAgICAgICAgaWYgKGVycm5vICE9IDApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgc29ja2V0Lm1Tb2NrZXQudGhyb3dFcnJub05hdGl2ZShlcnJubyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNvY2tldDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBTQ08gc2VydmVyIHNvY2tldC4KICAgICAgKiBDYWxsICNhY2NlcHQgdG8gcmV0cmlldmUgY29ubmVjdGlvbnMgdG8gdGhpcyBzb2NrZXQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU29ja2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU29ja2V0LmphdmEKaW5kZXggNzE5ZDczMC4uOWExM2MzZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFNvY2tldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTb2NrZXQuamF2YQpAQCAtOTQsMTAgKzk0LDE2IEBACiAKICAgICBwcml2YXRlIGludCBtUG9ydDsgIC8qIFJGQ09NTSBjaGFubmVsIG9yIEwyQ0FQIHBzbSAqLwogCi0gICAgLyoqIHByZXZlbnRzIGFsbCBuYXRpdmUgY2FsbHMgYWZ0ZXIgZGVzdHJveU5hdGl2ZSgpICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1DbG9zZWQ7CisgICAgcHJpdmF0ZSBlbnVtIFNvY2tldFN0YXRlIHsKKyAgICAgICAgSU5JVCwKKyAgICAgICAgQ09OTkVDVEVELAorICAgICAgICBDTE9TRUQKKyAgICB9CiAKLSAgICAvKiogcHJvdGVjdHMgbUNsb3NlZCAqLworICAgIC8qKiBwcmV2ZW50cyBhbGwgbmF0aXZlIGNhbGxzIGFmdGVyIGRlc3Ryb3lOYXRpdmUoKSAqLworICAgIHByaXZhdGUgU29ja2V0U3RhdGUgbVNvY2tldFN0YXRlOworCisgICAgLyoqIHByb3RlY3RzIG1Tb2NrZXRTdGF0ZSAqLwogICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBtTG9jazsKIAogICAgIC8qKiB1c2VkIGJ5IG5hdGl2ZSBjb2RlIG9ubHkgKi8KQEAgLTE0NSw3ICsxNTEsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1JbnB1dFN0cmVhbSA9IG5ldyBCbHVldG9vdGhJbnB1dFN0cmVhbSh0aGlzKTsKICAgICAgICAgbU91dHB1dFN0cmVhbSA9IG5ldyBCbHVldG9vdGhPdXRwdXRTdHJlYW0odGhpcyk7Ci0gICAgICAgIG1DbG9zZWQgPSBmYWxzZTsKKyAgICAgICAgbVNvY2tldFN0YXRlID0gU29ja2V0U3RhdGUuSU5JVDsKICAgICAgICAgbUxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOwogICAgIH0KIApAQCAtMTk1LDEzICsyMDEsMTQgQEAKICAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbUxvY2sucmVhZExvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUNsb3NlZCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CisgICAgICAgICAgICBpZiAobVNvY2tldFN0YXRlID09IFNvY2tldFN0YXRlLkNMT1NFRCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CiAKICAgICAgICAgICAgIGlmIChtU2RwICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtUG9ydCA9IG1TZHAuZG9TZHAoKTsgIC8vIGJsb2NrcwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjb25uZWN0TmF0aXZlKCk7ICAvLyBibG9ja3MKKyAgICAgICAgICAgIG1Tb2NrZXRTdGF0ZSA9IFNvY2tldFN0YXRlLkNPTk5FQ1RFRDsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIG1Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CiAgICAgICAgIH0KQEAgLTIxNiw3ICsyMjMsNyBAQAogICAgICAgICAvLyBhYm9ydCBibG9ja2luZyBvcGVyYXRpb25zIG9uIHRoZSBzb2NrZXQKICAgICAgICAgbUxvY2sucmVhZExvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUNsb3NlZCkgcmV0dXJuOworICAgICAgICAgICAgaWYgKG1Tb2NrZXRTdGF0ZSA9PSBTb2NrZXRTdGF0ZS5DTE9TRUQpIHJldHVybjsKICAgICAgICAgICAgIGlmIChtU2RwICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtU2RwLmNhbmNlbCgpOwogICAgICAgICAgICAgfQpAQCAtMjI5LDcgKzIzNiw3IEBACiAgICAgICAgIC8vIGFib3J0TmF0aXZlKCksIHNvIHRoaXMgbG9jayBzaG91bGQgaW1tZWRpYXRlbHkgYWNxdWlyZQogICAgICAgICBtTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Tb2NrZXRTdGF0ZSA9IFNvY2tldFN0YXRlLkNMT1NFRDsKICAgICAgICAgICAgIGRlc3Ryb3lOYXRpdmUoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIG1Mb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwpAQCAtMjY3LDEzICsyNzQsMjMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIG9mIHRoaXMgc29ja2V0LCBpZSwgd2hldGhlciB0aGVyZSBpcyBhbiBhY3RpdmUgY29ubmVjdGlvbiB3aXRoCisgICAgICogcmVtb3RlIGRldmljZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29ubmVjdGVkCisgICAgICogICAgICAgICBmYWxzZSBpZiBub3QgY29ubmVjdGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiAobVNvY2tldFN0YXRlID09IFNvY2tldFN0YXRlLkNPTk5FQ1RFRCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ3VycmVudGx5IHJldHVybnMgdW5peCBlcnJubyBpbnN0ZWFkIG9mIHRocm93aW5nIElPRXhjZXB0aW9uLAogICAgICAqIHNvIHRoYXQgQmx1ZXRvb3RoQWRhcHRlciBjYW4gY2hlY2sgdGhlIGVycm9yIGNvZGUgZm9yIEVBRERSSU5VU0UKICAgICAgKi8KICAgICAvKnBhY2thZ2UqLyBpbnQgYmluZExpc3RlbigpIHsKICAgICAgICAgbUxvY2sucmVhZExvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUNsb3NlZCkgcmV0dXJuIEVCQURGRDsKKyAgICAgICAgICAgIGlmIChtU29ja2V0U3RhdGUgPT0gU29ja2V0U3RhdGUuQ0xPU0VEKSByZXR1cm4gRUJBREZEOwogICAgICAgICAgICAgcmV0dXJuIGJpbmRMaXN0ZW5OYXRpdmUoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIG1Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CkBAIC0yODMsOCArMzAwLDExIEBACiAgICAgLypwYWNrYWdlKi8gQmx1ZXRvb3RoU29ja2V0IGFjY2VwdChpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbUxvY2sucmVhZExvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUNsb3NlZCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7Ci0gICAgICAgICAgICByZXR1cm4gYWNjZXB0TmF0aXZlKHRpbWVvdXQpOworICAgICAgICAgICAgaWYgKG1Tb2NrZXRTdGF0ZSA9PSBTb2NrZXRTdGF0ZS5DTE9TRUQpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic29ja2V0IGNsb3NlZCIpOworCisgICAgICAgICAgICBCbHVldG9vdGhTb2NrZXQgYWNjZXB0ZWRTb2NrZXQgPSBhY2NlcHROYXRpdmUodGltZW91dCk7CisgICAgICAgICAgICBtU29ja2V0U3RhdGUgPSBTb2NrZXRTdGF0ZS5DT05ORUNURUQ7CisgICAgICAgICAgICByZXR1cm4gYWNjZXB0ZWRTb2NrZXQ7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBtTG9jay5yZWFkTG9jaygpLnVubG9jaygpOwogICAgICAgICB9CkBAIC0yOTMsNyArMzEzLDcgQEAKICAgICAvKnBhY2thZ2UqLyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbUxvY2sucmVhZExvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUNsb3NlZCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CisgICAgICAgICAgICBpZiAobVNvY2tldFN0YXRlID09IFNvY2tldFN0YXRlLkNMT1NFRCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CiAgICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlTmF0aXZlKCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBtTG9jay5yZWFkTG9jaygpLnVubG9jaygpOwpAQCAtMzAzLDcgKzMyMyw3IEBACiAgICAgLypwYWNrYWdlKi8gaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG1Mb2NrLnJlYWRMb2NrKCkubG9jaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1DbG9zZWQpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic29ja2V0IGNsb3NlZCIpOworICAgICAgICAgICAgaWYgKG1Tb2NrZXRTdGF0ZSA9PSBTb2NrZXRTdGF0ZS5DTE9TRUQpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic29ja2V0IGNsb3NlZCIpOwogICAgICAgICAgICAgcmV0dXJuIHJlYWROYXRpdmUoYiwgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgbUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKQEAgLTMxMyw3ICszMzMsNyBAQAogICAgIC8qcGFja2FnZSovIGludCB3cml0ZShieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbUxvY2sucmVhZExvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUNsb3NlZCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CisgICAgICAgICAgICBpZiAobVNvY2tldFN0YXRlID09IFNvY2tldFN0YXRlLkNMT1NFRCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CiAgICAgICAgICAgICByZXR1cm4gd3JpdGVOYXRpdmUoYiwgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgbUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKaW5kZXggYTY2MGJkNy4uYWVjZWM2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKQEAgLTE1NDUsNiArMTU0NSw4IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSA9ICJuZXR3b3JrX21hbmFnZW1lbnQiOwogCiAgICAgLyoqIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX1NUQVRTX1NFUlZJQ0UgPSAibmV0c3RhdHMiOworICAgIC8qKiB7QGhpZGV9ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19QT0xJQ1lfU0VSVklDRSA9ICJuZXRwb2xpY3kiOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudEZpbHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXIuamF2YQppbmRleCAyYTBlYmNmLi5mM2IxZDk0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudEZpbHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50RmlsdGVyLmphdmEKQEAgLTE2LDE2ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXI7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CkBAIC0zNiw2ICsyNiwxNSBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKIAoraW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiAvKioKICAqIFN0cnVjdHVyZWQgZGVzY3JpcHRpb24gb2YgSW50ZW50IHZhbHVlcyB0byBiZSBtYXRjaGVkLiAgQW4gSW50ZW50RmlsdGVyIGNhbgogICogbWF0Y2ggYWdhaW5zdCBhY3Rpb25zLCBjYXRlZ29yaWVzLCBhbmQgZGF0YSAoZWl0aGVyIHZpYSBpdHMgdHlwZSwgc2NoZW1lLApAQCAtNzU0LDcgKzc1Myw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkIGEgbmV3IEludGVudCBkYXRhIG9hdGggdG8gbWF0Y2ggYWdhaW5zdC4gIFRoZSBmaWx0ZXIgbXVzdAorICAgICAqIEFkZCBhIG5ldyBJbnRlbnQgZGF0YSBwYXRoIHRvIG1hdGNoIGFnYWluc3QuICBUaGUgZmlsdGVyIG11c3QKICAgICAgKiBpbmNsdWRlIG9uZSBvciBtb3JlIHNjaGVtZXMgKHZpYSB7QGxpbmsgI2FkZERhdGFTY2hlbWV9KSA8ZW0+YW5kPC9lbT4KICAgICAgKiBvbmUgb3IgbW9yZSBhdXRob3JpdGllcyAodmlhIHtAbGluayAjYWRkRGF0YUF1dGhvcml0eX0pIGZvciB0aGUKICAgICAgKiBwYXRoIHRvIGJlIGNvbnNpZGVyZWQuICBJZiBhbnkgcGF0aHMgYXJlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YQppbmRleCA0Mjg1Mzg4Li40ODU4ZjE0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEKQEAgLTMzNSwxMyArMzM1LDI1IEBACiAgICAgLyoqCiAgICAgICogQml0IGluIHtAbGluayAjY29uZmlnQ2hhbmdlc30gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgYWN0aXZpdHkKICAgICAgKiBjYW4gaXRzZWxmIGhhbmRsZSB0aGUgc2NyZWVuIHNpemUuIFNldCBmcm9tIHRoZQotICAgICAqIHtAbGluayBhbmRyb2lkLlIuYXR0ciNjb25maWdDaGFuZ2VzfSBhdHRyaWJ1dGUuCisgICAgICoge0BsaW5rIGFuZHJvaWQuUi5hdHRyI2NvbmZpZ0NoYW5nZXN9IGF0dHJpYnV0ZS4gIFRoaXMgd2lsbCBiZQorICAgICAqIHNldCBieSBkZWZhdWx0IGZvciBhcHBsaWNhdGlvbnMgdGhhdCB0YXJnZXQgYW4gZWFybGllciB2ZXJzaW9uCisgICAgICogdGhhbiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQl9NUjJ9Li4uCisgICAgICogPGI+aG93ZXZlcjwvYj4sIHlvdSB3aWxsIG5vdCBzZWUgdGhlIGJpdCBzZXQgaGVyZSBiZWNvbWVzIHNvbWUKKyAgICAgKiBhcHBsaWNhdGlvbnMgaW5jb3JyZWN0bHkgY29tcGFyZSB7QGxpbmsgI2NvbmZpZ0NoYW5nZXN9IGFnYWluc3QKKyAgICAgKiBhbiBhYnNvbHV0ZSB2YWx1ZSByYXRoZXIgdGhhbiBjb3JyZWN0bHkgbWFza2luZyBvdXQgdGhlIGJpdHMKKyAgICAgKiB0aGV5IGFyZSBpbnRlcmVzdGVkIGluLiAgUGxlYXNlIGRvbid0IGRvIHRoYXQsIHRoYW5rcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSUdfU0NSRUVOX1NJWkUgPSAweDA0MDA7CiAgICAgLyoqCiAgICAgICogQml0IGluIHtAbGluayAjY29uZmlnQ2hhbmdlc30gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgYWN0aXZpdHkKICAgICAgKiBjYW4gaXRzZWxmIGhhbmRsZSB0aGUgc21hbGxlc3Qgc2NyZWVuIHNpemUuIFNldCBmcm9tIHRoZQotICAgICAqIHtAbGluayBhbmRyb2lkLlIuYXR0ciNjb25maWdDaGFuZ2VzfSBhdHRyaWJ1dGUuCisgICAgICoge0BsaW5rIGFuZHJvaWQuUi5hdHRyI2NvbmZpZ0NoYW5nZXN9IGF0dHJpYnV0ZS4gIFRoaXMgd2lsbCBiZQorICAgICAqIHNldCBieSBkZWZhdWx0IGZvciBhcHBsaWNhdGlvbnMgdGhhdCB0YXJnZXQgYW4gZWFybGllciB2ZXJzaW9uCisgICAgICogdGhhbiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQl9NUjJ9Li4uCisgICAgICogPGI+aG93ZXZlcjwvYj4sIHlvdSB3aWxsIG5vdCBzZWUgdGhlIGJpdCBzZXQgaGVyZSBiZWNvbWVzIHNvbWUKKyAgICAgKiBhcHBsaWNhdGlvbnMgaW5jb3JyZWN0bHkgY29tcGFyZSB7QGxpbmsgI2NvbmZpZ0NoYW5nZXN9IGFnYWluc3QKKyAgICAgKiBhbiBhYnNvbHV0ZSB2YWx1ZSByYXRoZXIgdGhhbiBjb3JyZWN0bHkgbWFza2luZyBvdXQgdGhlIGJpdHMKKyAgICAgKiB0aGV5IGFyZSBpbnRlcmVzdGVkIGluLiAgUGxlYXNlIGRvbid0IGRvIHRoYXQsIHRoYW5rcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSUdfU01BTExFU1RfU0NSRUVOX1NJWkUgPSAweDA4MDA7CiAgICAgLyoqCkBAIC0zODYsNiArMzk4LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKiBVbmZvcnR1bmF0ZWx5IHNvbWUgZGV2ZWxvcGVycyAoT3BlbkZlaW50IEkgYW0gbG9va2luZyBhdCB5b3UpIGhhdmUKKyAgICAgKiBjb21wYXJlZCB0aGUgY29uZmlnQ2hhbmdlcyBiaXQgZmllbGQgYWdhaW5zdCBhYnNvbHV0ZSB2YWx1ZXMsIHNvIGlmIHdlCisgICAgICogaW50cm9kdWNlIGEgbmV3IGJpdCB0aGV5IGJyZWFrLiAgVG8gZGVhbCB3aXRoIHRoYXQsIHdlIHdpbGwgbWFrZSBzdXJlCisgICAgICogdGhlIHB1YmxpYyBmaWVsZCB3aWxsIG5vdCBoYXZlIGEgdmFsdWUgdGhhdCBicmVha3MgdGhlbSwgYW5kIGxldCB0aGUKKyAgICAgKiBmcmFtZXdvcmsgY2FsbCBoZXJlIHRvIGdldCB0aGUgcmVhbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlYWxDb25maWdDaGFuZ2VkKCkgeworICAgICAgICByZXR1cm4gYXBwbGljYXRpb25JbmZvLnRhcmdldFNka1ZlcnNpb24gPCBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMuSE9ORVlDT01CX01SMgorICAgICAgICAgICAgICAgID8gKGNvbmZpZ0NoYW5nZXMgfCBBY3Rpdml0eUluZm8uQ09ORklHX1NDUkVFTl9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICB8IEFjdGl2aXR5SW5mby5DT05GSUdfU01BTExFU1RfU0NSRUVOX1NJWkUpCisgICAgICAgICAgICAgICAgOiBjb25maWdDaGFuZ2VzOworICAgIH0KKworICAgIC8qKgogICAgICAqIEJpdCBtYXNrIG9mIGtpbmRzIG9mIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB0aGF0IHRoaXMgYWN0aXZpdHkKICAgICAgKiBjYW4gaGFuZGxlIGl0c2VsZiAod2l0aG91dCBiZWluZyByZXN0YXJ0ZWQgYnkgdGhlIHN5c3RlbSkuCiAgICAgICogQ29udGFpbnMgYW55IGNvbWJpbmF0aW9uIG9mIHtAbGluayAjQ09ORklHX0ZPTlRfU0NBTEV9LApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEKaW5kZXggNGIzOGQ0OC4uYzBhMWQ4ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhCkBAIC0zMzAsNiArMzMwLDMwIEBACiAgICAgcHVibGljIGludCBmbGFncyA9IDA7CiAgICAgCiAgICAgLyoqCisgICAgICogVGhlIHJlcXVpcmVkIHNtYWxsZXN0IHNjcmVlbiB3aWR0aCB0aGUgYXBwbGljYXRpb24gY2FuIHJ1biBvbi4gIElmIDAsCisgICAgICogbm90aGluZyBoYXMgYmVlbiBzcGVjaWZpZWQuICBDb21lcyBmcm9tCisgICAgICoge0BsaW5rIGFuZHJvaWQuUi5zdHlsZWFibGUjQW5kcm9pZE1hbmlmZXN0U3VwcG9ydHNTY3JlZW5zX3JlcXVpcmVzU21hbGxlc3RXaWR0aERwCisgICAgICogYW5kcm9pZDpyZXF1aXJlc1NtYWxsZXN0V2lkdGhEcH0gYXR0cmlidXRlIG9mIHRoZSAmbHQ7c3VwcG9ydHMtc2NyZWVucyZndDsgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gc21hbGxlc3Qgc2NyZWVuIHdpZHRoIHRoZSBhcHBsaWNhdGlvbiBpcyBkZXNpZ25lZCBmb3IuICBJZiAwLAorICAgICAqIG5vdGhpbmcgaGFzIGJlZW4gc3BlY2lmaWVkLiAgQ29tZXMgZnJvbQorICAgICAqIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0FuZHJvaWRNYW5pZmVzdFN1cHBvcnRzU2NyZWVuc19jb21wYXRpYmxlV2lkdGhMaW1pdERwCisgICAgICogYW5kcm9pZDpjb21wYXRpYmxlV2lkdGhMaW1pdERwfSBhdHRyaWJ1dGUgb2YgdGhlICZsdDtzdXBwb3J0cy1zY3JlZW5zJmd0OyB0YWcuCisgICAgICovCisgICAgcHVibGljIGludCBjb21wYXRpYmxlV2lkdGhMaW1pdERwID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHNtYWxsZXN0IHNjcmVlbiB3aWR0aCB0aGUgYXBwbGljYXRpb24gd2lsbCB3b3JrIG9uLiAgSWYgMCwKKyAgICAgKiBub3RoaW5nIGhhcyBiZWVuIHNwZWNpZmllZC4gIENvbWVzIGZyb20KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNBbmRyb2lkTWFuaWZlc3RTdXBwb3J0c1NjcmVlbnNfbGFyZ2VzdFdpZHRoTGltaXREcAorICAgICAqIGFuZHJvaWQ6bGFyZ2VzdFdpZHRoTGltaXREcH0gYXR0cmlidXRlIG9mIHRoZSAmbHQ7c3VwcG9ydHMtc2NyZWVucyZndDsgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbGFyZ2VzdFdpZHRoTGltaXREcCA9IDA7CisKKyAgICAvKioKICAgICAgKiBGdWxsIHBhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoaXMgcGFja2FnZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHNvdXJjZURpcjsKQEAgLTQxMCw2ICs0MzQsOSBAQAogICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJ0YXNrQWZmaW5pdHk9IiArIHRhc2tBZmZpbml0eSk7CiAgICAgICAgIHB3LnByaW50bG4ocHJlZml4ICsgInVpZD0iICsgdWlkICsgIiBmbGFncz0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGZsYWdzKQogICAgICAgICAgICAgICAgICsgIiB0aGVtZT0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoZW1lKSk7CisgICAgICAgIHB3LnByaW50bG4ocHJlZml4ICsgInJlcXVpcmVzU21hbGxlc3RXaWR0aERwPSIgKyByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcAorICAgICAgICAgICAgICAgICsgIiBjb21wYXRpYmxlV2lkdGhMaW1pdERwPSIgKyBjb21wYXRpYmxlV2lkdGhMaW1pdERwCisgICAgICAgICAgICAgICAgKyAiIGxhcmdlc3RXaWR0aExpbWl0RHA9IiArIGxhcmdlc3RXaWR0aExpbWl0RHApOwogICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJzb3VyY2VEaXI9IiArIHNvdXJjZURpcik7CiAgICAgICAgIGlmIChzb3VyY2VEaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHB1YmxpY1NvdXJjZURpciAhPSBudWxsKSB7CkBAIC00NjksNiArNDk2LDkgQEAKICAgICAgICAgY2xhc3NOYW1lID0gb3JpZy5jbGFzc05hbWU7CiAgICAgICAgIHRoZW1lID0gb3JpZy50aGVtZTsKICAgICAgICAgZmxhZ3MgPSBvcmlnLmZsYWdzOworICAgICAgICByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCA9IG9yaWcucmVxdWlyZXNTbWFsbGVzdFdpZHRoRHA7CisgICAgICAgIGNvbXBhdGlibGVXaWR0aExpbWl0RHAgPSBvcmlnLmNvbXBhdGlibGVXaWR0aExpbWl0RHA7CisgICAgICAgIGxhcmdlc3RXaWR0aExpbWl0RHAgPSBvcmlnLmxhcmdlc3RXaWR0aExpbWl0RHA7CiAgICAgICAgIHNvdXJjZURpciA9IG9yaWcuc291cmNlRGlyOwogICAgICAgICBwdWJsaWNTb3VyY2VEaXIgPSBvcmlnLnB1YmxpY1NvdXJjZURpcjsKICAgICAgICAgbmF0aXZlTGlicmFyeURpciA9IG9yaWcubmF0aXZlTGlicmFyeURpcjsKQEAgLTUwMiw2ICs1MzIsOSBAQAogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKGNsYXNzTmFtZSk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQodGhlbWUpOwogICAgICAgICBkZXN0LndyaXRlSW50KGZsYWdzKTsKKyAgICAgICAgZGVzdC53cml0ZUludChyZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoY29tcGF0aWJsZVdpZHRoTGltaXREcCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobGFyZ2VzdFdpZHRoTGltaXREcCk7CiAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcoc291cmNlRGlyKTsKICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhwdWJsaWNTb3VyY2VEaXIpOwogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG5hdGl2ZUxpYnJhcnlEaXIpOwpAQCAtNTM2LDYgKzU2OSw5IEBACiAgICAgICAgIGNsYXNzTmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgIHRoZW1lID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgICAgZmxhZ3MgPSBzb3VyY2UucmVhZEludCgpOworICAgICAgICByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCA9IHNvdXJjZS5yZWFkSW50KCk7CisgICAgICAgIGNvbXBhdGlibGVXaWR0aExpbWl0RHAgPSBzb3VyY2UucmVhZEludCgpOworICAgICAgICBsYXJnZXN0V2lkdGhMaW1pdERwID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgICAgc291cmNlRGlyID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICAgcHVibGljU291cmNlRGlyID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICAgbmF0aXZlTGlicmFyeURpciA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhCmluZGV4IDlmZjMyNGIuLjA5ZmVkZTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhCkBAIC05OTMsNiArOTkzLDE2IEBACiAgICAgICAgICAgICAgICAgc2EgPSByZXMub2J0YWluQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFN1cHBvcnRzU2NyZWVucyk7CiAKKyAgICAgICAgICAgICAgICBwa2cuYXBwbGljYXRpb25JbmZvLnJlcXVpcmVzU21hbGxlc3RXaWR0aERwID0gc2EuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFN1cHBvcnRzU2NyZWVuc19yZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIHBrZy5hcHBsaWNhdGlvbkluZm8uY29tcGF0aWJsZVdpZHRoTGltaXREcCA9IHNhLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RTdXBwb3J0c1NjcmVlbnNfY29tcGF0aWJsZVdpZHRoTGltaXREcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIHBrZy5hcHBsaWNhdGlvbkluZm8ubGFyZ2VzdFdpZHRoTGltaXREcCA9IHNhLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RTdXBwb3J0c1NjcmVlbnNfbGFyZ2VzdFdpZHRoTGltaXREcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworCiAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHRyaWNrIHRvIGdldCBhIGJvb2xlYW4gYW5kIHN0aWxsIGFibGUgdG8gZGV0ZWN0CiAgICAgICAgICAgICAgICAgLy8gaWYgYSB2YWx1ZSB3YXMgYWN0dWFsbHkgc2V0LgogICAgICAgICAgICAgICAgIHN1cHBvcnRzU21hbGxTY3JlZW5zID0gc2EuZ2V0SW50ZWdlcigKQEAgLTE5NDEsMTEgKzE5NTEsNiBAQAogICAgICAgICAgICAgYS5pbmZvLmNvbmZpZ0NoYW5nZXMgPSBzYS5nZXRJbnQoCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2NvbmZpZ0NoYW5nZXMsCiAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgaWYgKG93bmVyLmFwcGxpY2F0aW9uSW5mby50YXJnZXRTZGtWZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA8IGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUJfTVIyKSB7Ci0gICAgICAgICAgICAgICAgYS5pbmZvLmNvbmZpZ0NoYW5nZXMgfD0gQWN0aXZpdHlJbmZvLkNPTkZJR19TQ1JFRU5fU0laRQotICAgICAgICAgICAgICAgICAgICAgICAgfCBBY3Rpdml0eUluZm8uQ09ORklHX1NNQUxMRVNUX1NDUkVFTl9TSVpFOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgYS5pbmZvLnNvZnRJbnB1dE1vZGUgPSBzYS5nZXRJbnQoCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X3dpbmRvd1NvZnRJbnB1dE1vZGUsCiAgICAgICAgICAgICAgICAgICAgIDApOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29tcGF0aWJpbGl0eUluZm8uYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbXBhdGliaWxpdHlJbmZvLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlM2Q3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbXBhdGliaWxpdHlJbmZvLmFpZGwKQEAgLTAsMCArMSwyMCBAQAorLyoKKyoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50LnJlczsKKworcGFyY2VsYWJsZSBDb21wYXRpYmlsaXR5SW5mbzsKKwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29tcGF0aWJpbGl0eUluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbXBhdGliaWxpdHlJbmZvLmphdmEKaW5kZXggODU0ZDQxMC4uYjY4NmU1NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29tcGF0aWJpbGl0eUluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db21wYXRpYmlsaXR5SW5mby5qYXZhCkBAIC02MywzNyArNjMsMTkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTElOR19SRVFVSVJFRCA9IDE7IAogCiAgICAgLyoqCi0gICAgICogSGFzIHRoZSBhcHBsaWNhdGlvbiBzYWlkIHRoYXQgaXRzIFVJIGlzIGV4cGFuZGFibGU/ICBCYXNlZCBvbiB0aGUKLSAgICAgKiA8c3VwcG9ydHMtc2NyZWVuPiBhbmRyb2lkOmV4cGFuZGlibGUgaW4gdGhlIG1hbmlmZXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRBQkxFID0gMjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIYXMgdGhlIGFwcGxpY2F0aW9uIHNhaWQgdGhhdCBpdHMgVUkgc3VwcG9ydHMgbGFyZ2Ugc2NyZWVucz8gIEJhc2VkIG9uIHRoZQotICAgICAqIDxzdXBwb3J0cy1zY3JlZW4+IGFuZHJvaWQ6bGFyZ2VTY3JlZW5zIGluIHRoZSBtYW5pZmVzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfU0NSRUVOUyA9IDg7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFzIHRoZSBhcHBsaWNhdGlvbiBzYWlkIHRoYXQgaXRzIFVJIHN1cHBvcnRzIHhsYXJnZSBzY3JlZW5zPyAgQmFzZWQgb24gdGhlCi0gICAgICogPHN1cHBvcnRzLXNjcmVlbj4gYW5kcm9pZDp4bGFyZ2VTY3JlZW5zIGluIHRoZSBtYW5pZmVzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWExBUkdFX1NDUkVFTlMgPSAzMjsKLSAgICAKLSAgICAvKioKICAgICAgKiBBcHBsaWNhdGlvbiBtdXN0IGFsd2F5cyBydW4gaW4gY29tcGF0aWJpbGl0eSBtb2RlPwogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTFdBWVNfQ09NUEFUID0gNjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMV0FZU19ORUVEU19DT01QQVQgPSAyOwogCiAgICAgLyoqCiAgICAgICogQXBwbGljYXRpb24gbmV2ZXIgc2hvdWxkIHJ1biBpbiBjb21wYXRpYmlsaXR5IG1vZGU/CiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVkVSX0NPTVBBVCA9IDEyODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVWRVJfTkVFRFNfQ09NUEFUID0gNDsKIAogICAgIC8qKgogICAgICAqIFNldCBpZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcnVuIGluIHNjcmVlbiBzaXplIGNvbXBhdGliaWxpdHkgbW9kZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVFRFNfU0NSRUVOX0NPTVBBVCA9IDI1NjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVFRFNfU0NSRUVOX0NPTVBBVCA9IDg7CiAKICAgICAvKioKICAgICAgKiBUaGUgZWZmZWN0aXZlIHNjcmVlbiBkZW5zaXR5IHdlIGhhdmUgc2VsZWN0ZWQgZm9yIHRoaXMgYXBwbGljYXRpb24uCkBAIC0xMTAsNzcgKzkyLDE1MCBAQAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBhcHBsaWNhdGlvbkludmVydGVkU2NhbGU7CiAKLSAgICBwdWJsaWMgQ29tcGF0aWJpbGl0eUluZm8oQXBwbGljYXRpb25JbmZvIGFwcEluZm8sIGludCBzY3JlZW5MYXlvdXQsIGJvb2xlYW4gZm9yY2VDb21wYXQpIHsKKyAgICBwdWJsaWMgQ29tcGF0aWJpbGl0eUluZm8oQXBwbGljYXRpb25JbmZvIGFwcEluZm8sIGludCBzY3JlZW5MYXlvdXQsIGludCBzdywKKyAgICAgICAgICAgIGJvb2xlYW4gZm9yY2VDb21wYXQpIHsKICAgICAgICAgaW50IGNvbXBhdEZsYWdzID0gMDsKIAotICAgICAgICBpZiAoKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TVVBQT1JUU19MQVJHRV9TQ1JFRU5TKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb21wYXRGbGFncyB8PSBMQVJHRV9TQ1JFRU5TOwotICAgICAgICAgICAgaWYgKCFmb3JjZUNvbXBhdCkgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZW4ndCBmb3JjaW5nIHRoZSBhcHAgaW50byBjb21wYXRpYmlsaXR5IG1vZGUsIHRoZW4KLSAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaWYgaXQgc3VwcG9ydHMgbGFyZ2Ugc2NyZWVucyB0aGF0IHdlIHNob3VsZCBhbGxvdyBpdAotICAgICAgICAgICAgICAgIC8vIHRvIHVzZSB0aGUgZnVsbCBzcGFjZSBvZiBhbiB4bGFyZ2Ugc2NyZWVuIGFzIHdlbGwuCi0gICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gWExBUkdFX1NDUkVFTlMgfCBFWFBBTkRBQkxFOworICAgICAgICBpZiAoYXBwSW5mby5yZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCAhPSAwIHx8IGFwcEluZm8uY29tcGF0aWJsZVdpZHRoTGltaXREcCAhPSAwCisgICAgICAgICAgICAgICAgfHwgYXBwSW5mby5sYXJnZXN0V2lkdGhMaW1pdERwICE9IDApIHsKKyAgICAgICAgICAgIC8vIE5ldyBzdHlsZSBzY3JlZW4gcmVxdWlyZW1lbnRzIHNwZWMuCisgICAgICAgICAgICBpbnQgcmVxdWlyZWQgPSBhcHBJbmZvLnJlcXVpcmVzU21hbGxlc3RXaWR0aERwICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBhcHBJbmZvLnJlcXVpcmVzU21hbGxlc3RXaWR0aERwCisgICAgICAgICAgICAgICAgICAgIDogYXBwSW5mby5jb21wYXRpYmxlV2lkdGhMaW1pdERwOworICAgICAgICAgICAgaWYgKHJlcXVpcmVkID09IDApIHsKKyAgICAgICAgICAgICAgICByZXF1aXJlZCA9IGFwcEluZm8ubGFyZ2VzdFdpZHRoTGltaXREcDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TVVBQT1JUU19YTEFSR0VfU0NSRUVOUykgIT0gMCkgewotICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gWExBUkdFX1NDUkVFTlMgfCBFWFBBTkRBQkxFOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoYXBwSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1JFU0laRUFCTEVfRk9SX1NDUkVFTlMpICE9IDApIHsKLSAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IEVYUEFOREFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm9yY2VDb21wYXQpIHsKLSAgICAgICAgICAgIC8vIElmIHdlIGFyZSBmb3JjaW5nIGNvbXBhdGliaWxpdHkgbW9kZSwgdGhlbiBpZ25vcmUgYW4gYXBwIHRoYXQKLSAgICAgICAgICAgIC8vIGp1c3Qgc2F5cyBpdCBpcyByZXNpemFibGUgZm9yIHNjcmVlbnMuICBXZSdsbCBvbmx5IGhhdmUgaXQgZmlsbAotICAgICAgICAgICAgLy8gdGhlIHNjcmVlbiBpZiBpdCBleHBsaWNpdGx5IHNheXMgaXQgc3VwcG9ydHMgdGhlIHNjcmVlbiBzaXplIHdlCi0gICAgICAgICAgICAvLyBhcmUgcnVubmluZyBpbi4KLSAgICAgICAgICAgIGNvbXBhdEZsYWdzICY9IH5FWFBBTkRBQkxFOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBzdXBwb3J0c1NjcmVlbiA9IGZhbHNlOwotICAgICAgICBzd2l0Y2ggKHNjcmVlbkxheW91dCZDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spIHsKLSAgICAgICAgICAgIGNhc2UgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0U6Ci0gICAgICAgICAgICAgICAgaWYgKChjb21wYXRGbGFncyZYTEFSR0VfU0NSRUVOUykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c1NjcmVlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoYXBwSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NVUFBPUlRTX1hMQVJHRV9TQ1JFRU5TKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IE5FVkVSX0NPTVBBVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTEFSR0U6Ci0gICAgICAgICAgICAgICAgaWYgKChjb21wYXRGbGFncyZMQVJHRV9TQ1JFRU5TKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzU2NyZWVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChhcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1VQUE9SVFNfTEFSR0VfU0NSRUVOUykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb21wYXRGbGFncyB8PSBORVZFUl9DT01QQVQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChzY3JlZW5MYXlvdXQmQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfQ09NUEFUX05FRURFRCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKChjb21wYXRGbGFncyZFWFBBTkRBQkxFKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNTY3JlZW4gPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICgoYXBwSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1JFU0laRUFCTEVfRk9SX1NDUkVFTlMpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb21wYXRGbGFncyB8PSBBTFdBWVNfQ09NUEFUOworICAgICAgICAgICAgaW50IGNvbXBhdCA9IGFwcEluZm8uY29tcGF0aWJsZVdpZHRoTGltaXREcCAhPSAwCisgICAgICAgICAgICAgICAgICAgID8gYXBwSW5mby5jb21wYXRpYmxlV2lkdGhMaW1pdERwIDogcmVxdWlyZWQ7CisgICAgICAgICAgICBpZiAoY29tcGF0IDwgcmVxdWlyZWQpICB7CisgICAgICAgICAgICAgICAgY29tcGF0ID0gcmVxdWlyZWQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGludCBsYXJnZXN0ID0gYXBwSW5mby5sYXJnZXN0V2lkdGhMaW1pdERwOwogCi0gICAgICAgIGlmIChzdXBwb3J0c1NjcmVlbikgewotICAgICAgICAgICAgY29tcGF0RmxhZ3MgJj0gfk5FRURTX1NDUkVFTl9DT01QQVQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21wYXRGbGFncyB8PSBORUVEU19TQ1JFRU5fQ09NUEFUOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TVVBQT1JUU19TQ1JFRU5fREVOU0lUSUVTKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAocmVxdWlyZWQgPiBERUZBVUxUX05PUk1BTF9TSE9SVF9ESU1FTlNJT04pIHsKKyAgICAgICAgICAgICAgICAvLyBGb3Igbm93IC0tIGlmIHRoZXkgcmVxdWlyZSBhIHNpemUgbGFyZ2VyIHRoYW4gdGhlIG9ubHkKKyAgICAgICAgICAgICAgICAvLyBzaXplIHdlIGNhbiBkbyBpbiBjb21wYXRpYmlsaXR5IG1vZGUsIHRoZW4gZG9uJ3QgZXZlcgorICAgICAgICAgICAgICAgIC8vIGFsbG93IHRoZSBhcHAgdG8gZ28gaW4gdG8gY29tcGF0IG1vZGUuICBUcnlpbmcgdG8gcnVuCisgICAgICAgICAgICAgICAgLy8gaXQgYXQgYSBzbWFsbGVyIHNpemUgaXQgY2FuIGhhbmRsZSB3aWxsIG1ha2UgaXQgZmFyIG1vcmUKKyAgICAgICAgICAgICAgICAvLyBicm9rZW4gdGhhbiBydW5uaW5nIGF0IGEgbGFyZ2VyIHNpemUgdGhhbiBpdCB3YW50cyBvcgorICAgICAgICAgICAgICAgIC8vIHRoaW5rcyBpdCBjYW4gaGFuZGxlLgorICAgICAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IE5FVkVSX05FRURTX0NPTVBBVDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGFyZ2VzdCAhPSAwICYmIHN3ID4gbGFyZ2VzdCkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY3JlZW4gc2l6ZSBpcyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBzaXplIHRoZQorICAgICAgICAgICAgICAgIC8vIGFwcCB0aGlua3MgaXQgY2FuIHdvcmsgd2l0aCwgdGhlbiBhbHdheXMgZm9yY2UgaXQgaW4gdG8KKyAgICAgICAgICAgICAgICAvLyBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gTkVFRFNfU0NSRUVOX0NPTVBBVCB8IEFMV0FZU19ORUVEU19DT01QQVQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhdCA+PSBzdykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBzY3JlZW4gc2l6ZSBpcyBzb21ldGhpbmcgdGhlIGFwcCBzYXlzIGl0IHdhcyBkZXNpZ25lZAorICAgICAgICAgICAgICAgIC8vIGZvciwgc28gbmV2ZXIgZG8gY29tcGF0aWJpbGl0eSBtb2RlLgorICAgICAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IE5FVkVSX05FRURTX0NPTVBBVDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9yY2VDb21wYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgYXBwIG1heSB3b3JrIGJldHRlciB3aXRoIG9yIHdpdGhvdXQgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgICAgICAgICAgICAgIC8vIExldCB0aGUgdXNlciBkZWNpZGUuCisgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gTkVFRFNfU0NSRUVOX0NPTVBBVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW9kZXJuIGFwcHMgYWx3YXlzIHN1cHBvcnQgZGVuc2l0aWVzLgogICAgICAgICAgICAgYXBwbGljYXRpb25EZW5zaXR5ID0gRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERVZJQ0U7CiAgICAgICAgICAgICBhcHBsaWNhdGlvblNjYWxlID0gMS4wZjsKICAgICAgICAgICAgIGFwcGxpY2F0aW9uSW52ZXJ0ZWRTY2FsZSA9IDEuMGY7CisKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uRGVuc2l0eSA9IERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVGQVVMVDsKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uU2NhbGUgPSBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRQotICAgICAgICAgICAgICAgICAgICAvIChmbG9hdCkgRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERUZBVUxUOwotICAgICAgICAgICAgYXBwbGljYXRpb25JbnZlcnRlZFNjYWxlID0gMS4wZiAvIGFwcGxpY2F0aW9uU2NhbGU7Ci0gICAgICAgICAgICBjb21wYXRGbGFncyB8PSBTQ0FMSU5HX1JFUVVJUkVEOworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBIYXMgdGhlIGFwcGxpY2F0aW9uIHNhaWQgdGhhdCBpdHMgVUkgaXMgZXhwYW5kYWJsZT8gIEJhc2VkIG9uIHRoZQorICAgICAgICAgICAgICogPHN1cHBvcnRzLXNjcmVlbj4gYW5kcm9pZDpleHBhbmRpYmxlIGluIHRoZSBtYW5pZmVzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZmluYWwgaW50IEVYUEFOREFCTEUgPSAyOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEhhcyB0aGUgYXBwbGljYXRpb24gc2FpZCB0aGF0IGl0cyBVSSBzdXBwb3J0cyBsYXJnZSBzY3JlZW5zPyAgQmFzZWQgb24gdGhlCisgICAgICAgICAgICAgKiA8c3VwcG9ydHMtc2NyZWVuPiBhbmRyb2lkOmxhcmdlU2NyZWVucyBpbiB0aGUgbWFuaWZlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZpbmFsIGludCBMQVJHRV9TQ1JFRU5TID0gODsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBIYXMgdGhlIGFwcGxpY2F0aW9uIHNhaWQgdGhhdCBpdHMgVUkgc3VwcG9ydHMgeGxhcmdlIHNjcmVlbnM/ICBCYXNlZCBvbiB0aGUKKyAgICAgICAgICAgICAqIDxzdXBwb3J0cy1zY3JlZW4+IGFuZHJvaWQ6eGxhcmdlU2NyZWVucyBpbiB0aGUgbWFuaWZlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZpbmFsIGludCBYTEFSR0VfU0NSRUVOUyA9IDMyOworCisgICAgICAgICAgICBpbnQgc2l6ZUluZm8gPSAwOworCisgICAgICAgICAgICAvLyBXZSBjYW4ndCByZWx5IG9uIHRoZSBhcHBsaWNhdGlvbiBhbHdheXMgc2V0dGluZworICAgICAgICAgICAgLy8gRkxBR19SRVNJWkVBQkxFX0ZPUl9TQ1JFRU5TIHNvIHdpbGwgY29tcHV0ZSBpdCBiYXNlZCBvbiB2YXJpb3VzIGlucHV0LgorICAgICAgICAgICAgYm9vbGVhbiBhbnlSZXNpemVhYmxlID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICgoYXBwSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NVUFBPUlRTX0xBUkdFX1NDUkVFTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzaXplSW5mbyB8PSBMQVJHRV9TQ1JFRU5TOworICAgICAgICAgICAgICAgIGFueVJlc2l6ZWFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICghZm9yY2VDb21wYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlbid0IGZvcmNpbmcgdGhlIGFwcCBpbnRvIGNvbXBhdGliaWxpdHkgbW9kZSwgdGhlbgorICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaWYgaXQgc3VwcG9ydHMgbGFyZ2Ugc2NyZWVucyB0aGF0IHdlIHNob3VsZCBhbGxvdyBpdAorICAgICAgICAgICAgICAgICAgICAvLyB0byB1c2UgdGhlIGZ1bGwgc3BhY2Ugb2YgYW4geGxhcmdlIHNjcmVlbiBhcyB3ZWxsLgorICAgICAgICAgICAgICAgICAgICBzaXplSW5mbyB8PSBYTEFSR0VfU0NSRUVOUyB8IEVYUEFOREFCTEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChhcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1VQUE9SVFNfWExBUkdFX1NDUkVFTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBhbnlSZXNpemVhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIWZvcmNlQ29tcGF0KSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVJbmZvIHw9IFhMQVJHRV9TQ1JFRU5TIHwgRVhQQU5EQUJMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19SRVNJWkVBQkxFX0ZPUl9TQ1JFRU5TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYW55UmVzaXplYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgc2l6ZUluZm8gfD0gRVhQQU5EQUJMRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcmNlQ29tcGF0KSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGZvcmNpbmcgY29tcGF0aWJpbGl0eSBtb2RlLCB0aGVuIGlnbm9yZSBhbiBhcHAgdGhhdAorICAgICAgICAgICAgICAgIC8vIGp1c3Qgc2F5cyBpdCBpcyByZXNpemFibGUgZm9yIHNjcmVlbnMuICBXZSdsbCBvbmx5IGhhdmUgaXQgZmlsbAorICAgICAgICAgICAgICAgIC8vIHRoZSBzY3JlZW4gaWYgaXQgZXhwbGljaXRseSBzYXlzIGl0IHN1cHBvcnRzIHRoZSBzY3JlZW4gc2l6ZSB3ZQorICAgICAgICAgICAgICAgIC8vIGFyZSBydW5uaW5nIGluLgorICAgICAgICAgICAgICAgIHNpemVJbmZvICY9IH5FWFBBTkRBQkxFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb21wYXRGbGFncyB8PSBORUVEU19TQ1JFRU5fQ09NUEFUOworICAgICAgICAgICAgc3dpdGNoIChzY3JlZW5MYXlvdXQmQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9NQVNLKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzaXplSW5mbyZYTEFSR0VfU0NSRUVOUykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgJj0gfk5FRURTX1NDUkVFTl9DT01QQVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChhcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1VQUE9SVFNfWExBUkdFX1NDUkVFTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IE5FVkVSX05FRURTX0NPTVBBVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTEFSR0U6CisgICAgICAgICAgICAgICAgICAgIGlmICgoc2l6ZUluZm8mTEFSR0VfU0NSRUVOUykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgJj0gfk5FRURTX1NDUkVFTl9DT01QQVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChhcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1VQUE9SVFNfTEFSR0VfU0NSRUVOUykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gTkVWRVJfTkVFRFNfQ09NUEFUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHNjcmVlbkxheW91dCZDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9DT01QQVRfTkVFREVEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChzaXplSW5mbyZFWFBBTkRBQkxFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBhdEZsYWdzICY9IH5ORUVEU19TQ1JFRU5fQ09NUEFUOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFueVJlc2l6ZWFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gQUxXQVlTX05FRURTX0NPTVBBVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbXBhdEZsYWdzICY9IH5ORUVEU19TQ1JFRU5fQ09NUEFUOworICAgICAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IE5FVkVSX05FRURTX0NPTVBBVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChhcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1VQUE9SVFNfU0NSRUVOX0RFTlNJVElFUykgIT0gMCkgeworICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uRGVuc2l0eSA9IERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFOworICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uU2NhbGUgPSAxLjBmOworICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSW52ZXJ0ZWRTY2FsZSA9IDEuMGY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uRGVuc2l0eSA9IERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVGQVVMVDsKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvblNjYWxlID0gRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERVZJQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gKGZsb2F0KSBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFRkFVTFQ7CisgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JbnZlcnRlZFNjYWxlID0gMS4wZiAvIGFwcGxpY2F0aW9uU2NhbGU7CisgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gU0NBTElOR19SRVFVSVJFRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIG1Db21wYXRpYmlsaXR5RmxhZ3MgPSBjb21wYXRGbGFnczsKQEAgLTE5NSw4ICsyNTAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgQ29tcGF0aWJpbGl0eUluZm8oKSB7Ci0gICAgICAgIHRoaXMoWExBUkdFX1NDUkVFTlMgfCBMQVJHRV9TQ1JFRU5TIHwgRVhQQU5EQUJMRSwKLSAgICAgICAgICAgICAgICBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSwKKyAgICAgICAgdGhpcyhORVZFUl9ORUVEU19DT01QQVQsIERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFLAogICAgICAgICAgICAgICAgIDEuMGYsCiAgICAgICAgICAgICAgICAgMS4wZik7CiAgICAgfQpAQCAtMjA1LDcgKzI1OSw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzY2FsaW5nIGlzIHJlcXVpcmVkCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTY2FsaW5nUmVxdWlyZWQoKSB7Ci0gICAgICAgIHJldHVybiAobUNvbXBhdGliaWxpdHlGbGFncyAmIFNDQUxJTkdfUkVRVUlSRUQpICE9IDA7CisgICAgICAgIHJldHVybiAobUNvbXBhdGliaWxpdHlGbGFncyZTQ0FMSU5HX1JFUVVJUkVEKSAhPSAwOwogICAgIH0KICAgICAKICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NjcmVlbigpIHsKQEAgLTIxMywxNiArMjY3LDExIEBACiAgICAgfQogICAgIAogICAgIHB1YmxpYyBib29sZWFuIG5ldmVyU3VwcG9ydHNTY3JlZW4oKSB7Ci0gICAgICAgIHJldHVybiAobUNvbXBhdGliaWxpdHlGbGFncyZORVZFUl9DT01QQVQpICE9IDA7CisgICAgICAgIHJldHVybiAobUNvbXBhdGliaWxpdHlGbGFncyZBTFdBWVNfTkVFRFNfQ09NUEFUKSAhPSAwOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGFsd2F5c1N1cHBvcnRzU2NyZWVuKCkgewotICAgICAgICByZXR1cm4gKG1Db21wYXRpYmlsaXR5RmxhZ3MmQUxXQVlTX0NPTVBBVCkgIT0gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkNvbXBhdGliaWxpdHlJbmZve3NjYWxlPSIgKyBhcHBsaWNhdGlvblNjYWxlICsgIn0iOworICAgICAgICByZXR1cm4gKG1Db21wYXRpYmlsaXR5RmxhZ3MmTkVWRVJfTkVFRFNfQ09NUEFUKSAhPSAwOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzgxLDEwICs0MzAsMTAgQEAKICAgICAgICAgaWYgKCFzdXBwb3J0c1NjcmVlbigpKSB7CiAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbGFyZ2VyIHNjcmVlbiBkZXZpY2UgYW5kIHRoZSBhcHAgaXMgbm90CiAgICAgICAgICAgICAvLyBjb21wYXRpYmxlIHdpdGggbGFyZ2Ugc2NyZWVucywgc28gZGlkZGxlIGl0LgotICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8udXBkYXRlQ29tcGF0aWJsZVNjcmVlbkZyYW1lKGlub3V0RG0sIG51bGwsIGlub3V0RG0pOworICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8uY29tcHV0ZUNvbXBhdGlibGVTY2FsaW5nKGlub3V0RG0sIGlub3V0RG0pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5vdXREbS53aWR0aFBpeGVscyA9IGlub3V0RG0ucmVhbFdpZHRoUGl4ZWxzOwotICAgICAgICAgICAgaW5vdXREbS5oZWlnaHRQaXhlbHMgPSBpbm91dERtLnJlYWxIZWlnaHRQaXhlbHM7CisgICAgICAgICAgICBpbm91dERtLndpZHRoUGl4ZWxzID0gaW5vdXREbS51bnNjYWxlZFdpZHRoUGl4ZWxzOworICAgICAgICAgICAgaW5vdXREbS5oZWlnaHRQaXhlbHMgPSBpbm91dERtLnVuc2NhbGVkSGVpZ2h0UGl4ZWxzOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzU2NhbGluZ1JlcXVpcmVkKCkpIHsKQEAgLTQxOCwxMCArNDY3LDkgQEAKICAgICAgKiBAcGFyYW0gb3V0UmVjdCB0aGUgb3V0cHV0IHBhcmFtZXRlciB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdC4KICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNjYWxpbmcgZmFjdG9yIGZvciB0aGUgd2luZG93LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgdXBkYXRlQ29tcGF0aWJsZVNjcmVlbkZyYW1lKERpc3BsYXlNZXRyaWNzIGRtLAotICAgICAgICAgICAgUmVjdCBvdXRSZWN0LCBEaXNwbGF5TWV0cmljcyBvdXREbSkgewotICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBkbS5yZWFsV2lkdGhQaXhlbHM7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBkbS5yZWFsSGVpZ2h0UGl4ZWxzOworICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgY29tcHV0ZUNvbXBhdGlibGVTY2FsaW5nKERpc3BsYXlNZXRyaWNzIGRtLCBEaXNwbGF5TWV0cmljcyBvdXREbSkgeworICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBkbS51bnNjYWxlZFdpZHRoUGl4ZWxzOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZG0udW5zY2FsZWRIZWlnaHRQaXhlbHM7CiAgICAgICAgIGludCBzaG9ydFNpemUsIGxvbmdTaXplOwogICAgICAgICBpZiAod2lkdGggPCBoZWlnaHQpIHsKICAgICAgICAgICAgIHNob3J0U2l6ZSA9IHdpZHRoOwpAQCAtNDUyLDEyICs1MDAsNiBAQAogICAgICAgICAgICAgc2NhbGUgPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG91dFJlY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IGxlZnQgPSAoaW50KSgod2lkdGgtKG5ld1dpZHRoKnNjYWxlKSkvMik7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdG9wID0gKGludCkoKGhlaWdodC0obmV3SGVpZ2h0KnNjYWxlKSkvMik7Ci0gICAgICAgICAgICBvdXRSZWN0LnNldChsZWZ0LCB0b3AsIGxlZnQrbmV3V2lkdGgsIHRvcCtuZXdIZWlnaHQpOwotICAgICAgICB9Ci0KICAgICAgICAgaWYgKG91dERtICE9IG51bGwpIHsKICAgICAgICAgICAgIG91dERtLndpZHRoUGl4ZWxzID0gbmV3V2lkdGg7CiAgICAgICAgICAgICBvdXREbS5oZWlnaHRQaXhlbHMgPSBuZXdIZWlnaHQ7CkBAIC00ODEsNiArNTIzLDI4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisgICAgICAgIHNiLmFwcGVuZCgieyIpOworICAgICAgICBzYi5hcHBlbmQoYXBwbGljYXRpb25EZW5zaXR5KTsKKyAgICAgICAgc2IuYXBwZW5kKCJkcGkiKTsKKyAgICAgICAgaWYgKGlzU2NhbGluZ1JlcXVpcmVkKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNjYWxpbmciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1cHBvcnRzU2NyZWVuKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJlc2l6aW5nIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5ldmVyU3VwcG9ydHNTY3JlZW4oKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgbmV2ZXItY29tcGF0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFsd2F5c1N1cHBvcnRzU2NyZWVuKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGFsd2F5cy1jb21wYXQiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IDE3OwogICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIG1Db21wYXRpYmlsaXR5RmxhZ3M7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEKaW5kZXggZDQ3Njk5Ny4uNjQwOWFhYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMzMwLDE3ICszMzAsMTcgQEAKICAgICAgICAgaWYgKHNtYWxsZXN0U2NyZWVuV2lkdGhEcCAhPSBTTUFMTEVTVF9TQ1JFRU5fV0lEVEhfRFBfVU5ERUZJTkVEKSB7CiAgICAgICAgICAgICBzYi5hcHBlbmQoIiBzdyIpOyBzYi5hcHBlbmQoc21hbGxlc3RTY3JlZW5XaWR0aERwKTsgc2IuYXBwZW5kKCJkcCIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKCI/c3dkcCIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgP3N3ZHAiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc2NyZWVuV2lkdGhEcCAhPSBTQ1JFRU5fV0lEVEhfRFBfVU5ERUZJTkVEKSB7CiAgICAgICAgICAgICBzYi5hcHBlbmQoIiB3Iik7IHNiLmFwcGVuZChzY3JlZW5XaWR0aERwKTsgc2IuYXBwZW5kKCJkcCIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKCI/d2RwIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiA/d2RwIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNjcmVlbkhlaWdodERwICE9IFNDUkVFTl9IRUlHSFRfRFBfVU5ERUZJTkVEKSB7CiAgICAgICAgICAgICBzYi5hcHBlbmQoIiBoIik7IHNiLmFwcGVuZChzY3JlZW5IZWlnaHREcCk7IHNiLmFwcGVuZCgiZHAiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiP2hkcCIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgP2hkcCIpOwogICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAoKHNjcmVlbkxheW91dCZTQ1JFRU5MQVlPVVRfU0laRV9NQVNLKSkgewogICAgICAgICAgICAgY2FzZSBTQ1JFRU5MQVlPVVRfU0laRV9VTkRFRklORUQ6IHNiLmFwcGVuZCgiID9sc2l6ZSIpOyBicmVhazsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKaW5kZXggZTYzZTdlYi4uNzBiZjUyNCAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKQEAgLTI4LDE0ICsyOCwxMyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUuQ29uc3RhbnRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtMTkzLDExICsxOTIsNyBAQAogICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcsIENvbXBhdGliaWxpdHlJbmZvIGNvbXBJbmZvKSB7CiAgICAgICAgIG1Bc3NldHMgPSBhc3NldHM7CiAgICAgICAgIG1NZXRyaWNzLnNldFRvRGVmYXVsdHMoKTsKLSAgICAgICAgaWYgKGNvbXBJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db21wYXRpYmlsaXR5SW5mbyA9IENvbXBhdGliaWxpdHlJbmZvLkRFRkFVTFRfQ09NUEFUSUJJTElUWV9JTkZPOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNvbXBhdGliaWxpdHlJbmZvID0gY29tcEluZm87Ci0gICAgICAgIH0KKyAgICAgICAgbUNvbXBhdGliaWxpdHlJbmZvID0gY29tcEluZm87CiAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnLCBtZXRyaWNzKTsKICAgICAgICAgYXNzZXRzLmVuc3VyZVN0cmluZ0Jsb2NrcygpOwogICAgIH0KQEAgLTE0MTAsMTMgKzE0MDUsMjEgQEAKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZmlnLAogICAgICAgICAgICAgRGlzcGxheU1ldHJpY3MgbWV0cmljcywgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVRtcFZhbHVlKSB7CisgICAgICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiKioqKiBVcGRhdGluZyBjb25maWcgb2YgIiArIHRoaXMgKyAiOiBvbGQgY29uZmlnIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbmZpZ3VyYXRpb24gKyAiIG9sZCBjb21wYXQgaXMgIiArIG1Db21wYXRpYmlsaXR5SW5mbyk7CisgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIioqKiogVXBkYXRpbmcgY29uZmlnIG9mICIgKyB0aGlzICsgIjogbmV3IGNvbmZpZyBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNvbmZpZyArICIgbmV3IGNvbXBhdCBpcyAiICsgY29tcGF0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChjb21wYXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1Db21wYXRpYmlsaXR5SW5mbyA9IGNvbXBhdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCBjb25maWdDaGFuZ2VzID0gMHhmZmZmZmZmOwogICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVRtcENvbmZpZy5zZXRUbyhjb25maWcpOwotICAgICAgICAgICAgICAgIG1Db21wYXRpYmlsaXR5SW5mby5hcHBseVRvQ29uZmlndXJhdGlvbihtVG1wQ29uZmlnKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbXBhdGliaWxpdHlJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBhdGliaWxpdHlJbmZvLmFwcGx5VG9Db25maWd1cmF0aW9uKG1UbXBDb25maWcpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VzID0gbUNvbmZpZ3VyYXRpb24udXBkYXRlRnJvbShtVG1wQ29uZmlnKTsKICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VzID0gQWN0aXZpdHlJbmZvLmFjdGl2aXR5SW5mb0NvbmZpZ1RvTmF0aXZlKGNvbmZpZ0NoYW5nZXMpOwogICAgICAgICAgICAgfQpAQCAtMTQzNCw3ICsxNDM3LDkgQEAKICAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBiZSBjbGVhbmVyIGFuZCBtb3JlIG1haW50YWluYmxlIHRvIGp1c3QgYmUKICAgICAgICAgICAgICAgICAvLyBjb25zaXN0ZW50bHkgZGVhbGluZyB3aXRoIGEgY29tcGF0aWJsZSBkaXNwbGF5IGV2ZXJ5d2hlcmUgaW4KICAgICAgICAgICAgICAgICAvLyB0aGUgZnJhbWV3b3JrLgotICAgICAgICAgICAgICAgIG1Db21wYXRpYmlsaXR5SW5mby5hcHBseVRvRGlzcGxheU1ldHJpY3MobU1ldHJpY3MpOworICAgICAgICAgICAgICAgIGlmIChtQ29tcGF0aWJpbGl0eUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGF0aWJpbGl0eUluZm8uYXBwbHlUb0Rpc3BsYXlNZXRyaWNzKG1NZXRyaWNzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTWV0cmljcy5zY2FsZWREZW5zaXR5ID0gbU1ldHJpY3MuZGVuc2l0eSAqIG1Db25maWd1cmF0aW9uLmZvbnRTY2FsZTsKIApAQCAtMTQ3MSw2ICsxNDc2LDExIEBACiAgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmF0aW9uLnNjcmVlbkxheW91dCwgbUNvbmZpZ3VyYXRpb24udWlNb2RlLAogICAgICAgICAgICAgICAgICAgICBCdWlsZC5WRVJTSU9OLlJFU09VUkNFU19TREtfSU5UKTsKIAorICAgICAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIioqKiogVXBkYXRpbmcgY29uZmlnIG9mICIgKyB0aGlzICsgIjogZmluYWwgY29uZmlnIGlzICIgKyBtQ29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZpbmFsIGNvbXBhdCBpcyAiICsgbUNvbXBhdGliaWxpdHlJbmZvKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY2xlYXJEcmF3YWJsZUNhY2hlKG1EcmF3YWJsZUNhY2hlLCBjb25maWdDaGFuZ2VzKTsKICAgICAgICAgICAgIGNsZWFyRHJhd2FibGVDYWNoZShtQ29sb3JEcmF3YWJsZUNhY2hlLCBjb25maWdDaGFuZ2VzKTsKIApAQCAtMTU2NSwxMSArMTU3NSwxMiBAQAogICAgICAqIFJldHVybiB0aGUgY29tcGF0aWJpbGl0eSBtb2RlIGluZm9ybWF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uCiAgICAgICogVGhlIHJldHVybmVkIG9iamVjdCBzaG91bGQgYmUgdHJlYXRlZCBhcyByZWFkLW9ubHkuCiAgICAgICogCi0gICAgICogQHJldHVybiBjb21wYXRpYmlsaXR5IGluZm8uIG51bGwgaWYgdGhlIGFwcCBkb2VzIG5vdCByZXF1aXJlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICAgKiBAcmV0dXJuIGNvbXBhdGliaWxpdHkgaW5mby4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBDb21wYXRpYmlsaXR5SW5mbyBnZXRDb21wYXRpYmlsaXR5SW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1Db21wYXRpYmlsaXR5SW5mbzsKKyAgICAgICAgcmV0dXJuIG1Db21wYXRpYmlsaXR5SW5mbyAhPSBudWxsID8gbUNvbXBhdGliaWxpdHlJbmZvCisgICAgICAgICAgICAgICAgOiBDb21wYXRpYmlsaXR5SW5mby5ERUZBVUxUX0NPTVBBVElCSUxJVFlfSU5GTzsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeUJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeUJ1aWxkZXIuamF2YQppbmRleCBiNmFjYTJiLi44ZjhlYjZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnlCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5QnVpbGRlci5qYXZhCkBAIC0yNCw4ICsyNCw4IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogLyoqCkBAIC00Myw3ICs0Myw3IEBACiAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1XaGVyZUNsYXVzZSA9IG51bGw7ICAvLyBsYXppbHkgY3JlYXRlZAogICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzdGluY3Q7CiAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5IG1GYWN0b3J5OwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RyaWN0UHJvamVjdGlvbk1hcDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0cmljdDsKIAogICAgIHB1YmxpYyBTUUxpdGVRdWVyeUJ1aWxkZXIoKSB7CiAgICAgICAgIG1EaXN0aW5jdCA9IGZhbHNlOwpAQCAtMTQ1LDEwICsxNDUsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIFdoZW4gc2V0LCB0aGUgc2VsZWN0aW9uIGlzIHZlcmlmaWVkIGFnYWluc3QgbWFsaWNpb3VzIGFyZ3VtZW50cy4KKyAgICAgKiBXaGVuIHVzaW5nIHRoaXMgY2xhc3MgdG8gY3JlYXRlIGEgc3RhdGVtZW50IHVzaW5nCisgICAgICoge0BsaW5rICNidWlsZFF1ZXJ5U3RyaW5nKGJvb2xlYW4sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0sCisgICAgICogbm9uLW51bWVyaWMgbGltaXRzIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLiBJZiBhIHByb2plY3Rpb24gbWFwIGlzIHNwZWNpZmllZCwgZmllbGRzCisgICAgICogbm90IGluIHRoYXQgbWFwIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBJZiB0aGlzIGNsYXNzIGlzIHVzZWQgdG8gZXhlY3V0ZSB0aGUgc3RhdGVtZW50IGRpcmVjdGx5IHVzaW5nCisgICAgICoge0BsaW5rICNxdWVyeShTUUxpdGVEYXRhYmFzZSwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfQorICAgICAqIG9yCisgICAgICoge0BsaW5rICNxdWVyeShTUUxpdGVEYXRhYmFzZSwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9LAorICAgICAqIGFkZGl0aW9uYWxseSBhbHNvIHBhcmVudGhlc2lzIGVzY2FwaW5nIHNlbGVjdGlvbiBhcmUgY2F1Z2h0LgorICAgICAqCisgICAgICogVG8gc3VtbWFyaXplOiBUbyBnZXQgbWF4aW11bSBwcm90ZWN0aW9uIGFnYWluc3QgbWFsaWNpb3VzIHRoaXJkIHBhcnR5IGFwcHMgKGZvciBleGFtcGxlCisgICAgICogY29udGVudCBwcm92aWRlciBjb25zdW1lcnMpLCBtYWtlIHN1cmUgdG8gZG8gdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlNldCB0aGlzIHZhbHVlIHRvIHRydWU8L2xpPgorICAgICAqIDxsaT5Vc2UgYSBwcm9qZWN0aW9uIG1hcDwvbGk+CisgICAgICogPGxpPlVzZSBvbmUgb2YgdGhlIHF1ZXJ5IG92ZXJsb2FkcyBpbnN0ZWFkIG9mIGdldHRpbmcgdGhlIHN0YXRlbWVudCBhcyBhIHNxbCBzdHJpbmc8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyBmYWxzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3RQcm9qZWN0aW9uTWFwKGJvb2xlYW4gZmxhZykgewotICAgICAgICBtU3RyaWN0UHJvamVjdGlvbk1hcCA9IGZsYWc7CisgICAgcHVibGljIHZvaWQgc2V0U3RyaWN0KGJvb2xlYW4gZmxhZykgeworICAgICAgICBtU3RyaWN0ID0gZmxhZzsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNywxMyArMjM1LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kQ2xhdXNlRXNjYXBlQ2xhdXNlKFN0cmluZ0J1aWxkZXIgcywgU3RyaW5nIG5hbWUsIFN0cmluZyBjbGF1c2UpIHsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjbGF1c2UpKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyhzLCBjbGF1c2UpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQWRkIHRoZSBuYW1lcyB0aGF0IGFyZSBub24tbnVsbCBpbiBjb2x1bW5zIHRvIHMsIHNlcGFyYXRpbmcKICAgICAgKiB0aGVtIHdpdGggY29tbWFzLgpAQCAtMzIwLDYgKzMzMSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobVN0cmljdCAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgdXNlci1zdXBwbGllZCBzZWxlY3Rpb24gdG8gZGV0ZWN0IHN5bnRhY3RpYyBhbm9tYWxpZXMKKyAgICAgICAgICAgIC8vIGluIHRoZSBzZWxlY3Rpb24gc3RyaW5nIHRoYXQgY291bGQgaW5kaWNhdGUgYSBTUUwgaW5qZWN0aW9uIGF0dGVtcHQuCisgICAgICAgICAgICAvLyBUaGUgaWRlYSBpcyB0byBlbnN1cmUgdGhhdCB0aGUgc2VsZWN0aW9uIGNsYXVzZSBpcyBhIHZhbGlkIFNRTCBleHByZXNzaW9uCisgICAgICAgICAgICAvLyBieSBjb21waWxpbmcgaXQgdHdpY2U6IG9uY2Ugd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyBhbmQgb25jZSBhcworICAgICAgICAgICAgLy8gb3JpZ2luYWxseSBzcGVjaWZpZWQuIEFuIGF0dGFja2VyIGNhbm5vdCBjcmVhdGUgYW4gZXhwcmVzc2lvbiB0aGF0CisgICAgICAgICAgICAvLyB3b3VsZCBlc2NhcGUgdGhlIFNRTCBleHByZXNzaW9uIHdoaWxlIG1haW50YWluaW5nIGJhbGFuY2VkIHBhcmVudGhlc2VzCisgICAgICAgICAgICAvLyBpbiBib3RoIHRoZSB3cmFwcGVkIGFuZCBvcmlnaW5hbCBmb3Jtcy4KKyAgICAgICAgICAgIFN0cmluZyBzcWxGb3JWYWxpZGF0aW9uID0gYnVpbGRRdWVyeShwcm9qZWN0aW9uSW4sICIoIiArIHNlbGVjdGlvbiArICIpIiwgZ3JvdXBCeSwKKyAgICAgICAgICAgICAgICAgICAgaGF2aW5nLCBzb3J0T3JkZXIsIGxpbWl0KTsKKyAgICAgICAgICAgIHZhbGlkYXRlU3FsKGRiLCBzcWxGb3JWYWxpZGF0aW9uKTsgLy8gd2lsbCB0aHJvdyBpZiBxdWVyeSBpcyBpbnZhbGlkCisgICAgICAgIH0KKwogICAgICAgICBTdHJpbmcgc3FsID0gYnVpbGRRdWVyeSgKICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uSW4sIHNlbGVjdGlvbiwgZ3JvdXBCeSwgaGF2aW5nLAogICAgICAgICAgICAgICAgIHNvcnRPcmRlciwgbGltaXQpOwpAQCAtMzI5LDcgKzM1MywyMCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkYi5yYXdRdWVyeVdpdGhGYWN0b3J5KAogICAgICAgICAgICAgICAgIG1GYWN0b3J5LCBzcWwsIHNlbGVjdGlvbkFyZ3MsCi0gICAgICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UuZmluZEVkaXRUYWJsZShtVGFibGVzKSk7CisgICAgICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UuZmluZEVkaXRUYWJsZShtVGFibGVzKSk7IC8vIHdpbGwgdGhyb3cgaWYgcXVlcnkgaXMgaW52YWxpZAorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgYSBTUUwgc3RhdGVtZW50IGlzIHZhbGlkIGJ5IGNvbXBpbGluZyBpdC4KKyAgICAgKiBJZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBub3QgdmFsaWQsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYSB7QGxpbmsgU1FMaXRlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVTcWwoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKKyAgICAgICAgZGIubG9jayhzcWwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpLnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGRiLnVubG9jaygpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC01NDEsNyArNTc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtU3RyaWN0UHJvamVjdGlvbk1hcCAmJgorICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdHJpY3QgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHVzZXJDb2x1bW4uY29udGFpbnMoIiBBUyAiKSB8fCB1c2VyQ29sdW1uLmNvbnRhaW5zKCIgYXMgIikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIGNvbHVtbiBhbGlhcyBhbHJlYWR5IGV4aXN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uW2ldID0gdXNlckNvbHVtbjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0QnV0dG9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEJ1dHRvbi5qYXZhCmluZGV4IGY5MWNkNGUuLmI2Yjc1OTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0QnV0dG9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RCdXR0b24uamF2YQpAQCAtNDEsNiArNDEsNiBAQAogICAgICAqIGhpZ2hsaWdodCB3aGVuIHNlbGVjdGVkLgogICAgICAqLwogICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaXNFbmFibGVkKCkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiBnZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSA/IHRydWUgOiBmYWxzZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEVkaXRMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0RWRpdExheW91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZmZmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEVkaXRMYXlvdXQuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2U7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworLyoqCisgKiBFeHRyYWN0RWRpdExheW91dCBwcm92aWRlcyBhbiBBY3Rpb25Nb2RlIHByZXNlbnRhdGlvbiBmb3IgdGhlCisgKiBsaW1pdGVkIHNjcmVlbiByZWFsIGVzdGF0ZSBpbiBleHRyYWN0IG1vZGUuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEV4dHJhY3RFZGl0TGF5b3V0IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICBFeHRyYWN0QWN0aW9uTW9kZSBtQWN0aW9uTW9kZTsKKyAgICBCdXR0b24gbUV4dHJhY3RBY3Rpb25CdXR0b247CisgICAgQnV0dG9uIG1FZGl0QnV0dG9uOworCisgICAgcHVibGljIEV4dHJhY3RFZGl0TGF5b3V0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXh0cmFjdEVkaXRMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgc291cmNlVmlldywgQWN0aW9uTW9kZS5DYWxsYmFjayBjYikgeworICAgICAgICBmaW5hbCBFeHRyYWN0QWN0aW9uTW9kZSBtb2RlID0gbmV3IEV4dHJhY3RBY3Rpb25Nb2RlKGNiKTsKKyAgICAgICAgaWYgKG1vZGUuZGlzcGF0Y2hPbkNyZWF0ZSgpKSB7CisgICAgICAgICAgICBtb2RlLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1FeHRyYWN0QWN0aW9uQnV0dG9uLnNldFZpc2liaWxpdHkoSU5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1FZGl0QnV0dG9uLnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICByZXR1cm4gbW9kZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaEluZmxhdGUoKSB7CisgICAgICAgIHN1cGVyLm9uRmluaXNoSW5mbGF0ZSgpOworICAgICAgICBtRXh0cmFjdEFjdGlvbkJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmlucHV0RXh0cmFjdEFjdGlvbik7CisgICAgICAgIG1FZGl0QnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaW5wdXRFeHRyYWN0RWRpdEJ1dHRvbik7CisgICAgICAgIG1FZGl0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IGNsaWNrZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKGdldENvbnRleHQoKSwgbUFjdGlvbk1vZGUubU1lbnUsIGNsaWNrZWQpLnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRXh0cmFjdEFjdGlvbk1vZGUgZXh0ZW5kcyBBY3Rpb25Nb2RlIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgeworICAgICAgICBwcml2YXRlIEFjdGlvbk1vZGUuQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgICAgICBNZW51QnVpbGRlciBtTWVudTsKKworICAgICAgICBwdWJsaWMgRXh0cmFjdEFjdGlvbk1vZGUoQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgICAgIG1NZW51ID0gbmV3IE1lbnVCdWlsZGVyKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAgICAgLy8gVGl0bGUgd2lsbCBub3QgYmUgc2hvd24uCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgICAgICAvLyBUaXRsZSB3aWxsIG5vciBiZSBzaG93bi4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgICAgIC8vIFN1YnRpdGxlIHdpbGwgbm90IGJlIHNob3duLgorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKGludCByZXNJZCkgeworICAgICAgICAgICAgLy8gU3VidGl0bGUgd2lsbCBub3QgYmUgc2hvd24uCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIC8vIEN1c3RvbSB2aWV3IGlzIG5vdCBzdXBwb3J0ZWQgaGVyZS4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICAgICAgbU1lbnUuc3RvcERpc3BhdGNoaW5nSXRlbXNDaGFuZ2VkKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblByZXBhcmVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbU1lbnUuc3RhcnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hPbkNyZWF0ZSgpIHsKKyAgICAgICAgICAgIG1NZW51LnN0b3BEaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1NZW51LnN0YXJ0RGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGUgIT0gdGhpcykgeworICAgICAgICAgICAgICAgIC8vIE5vdCB0aGUgYWN0aXZlIGFjdGlvbiBtb2RlIC0gbm8tb3AKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkRlc3Ryb3lBY3Rpb25Nb2RlKHRoaXMpOworICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKKworICAgICAgICAgICAgbUV4dHJhY3RBY3Rpb25CdXR0b24uc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIG1FZGl0QnV0dG9uLnNldFZpc2liaWxpdHkoSU5WSVNJQkxFKTsKKworICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZW51IGdldE1lbnUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lbnVJbmZsYXRlcihnZXRDb250ZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrLm9uQWN0aW9uSXRlbUNsaWNrZWQodGhpcywgaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IDQxOTI4OGIuLmM3MmM0YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiAKIC8qKgogICogQ2xhc3MgdGhhdCBhbnN3ZXJzIHF1ZXJpZXMgYWJvdXQgdGhlIHN0YXRlIG9mIG5ldHdvcmsgY29ubmVjdGl2aXR5LiBJdCBhbHNvCkBAIC00MCw4ICszOSw5IEBACiAgKiBzdGF0ZSBvZiB0aGUgYXZhaWxhYmxlIG5ldHdvcmtzPC9saT4KICAqIDwvb2w+CiAgKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aXZpdHlNYW5hZ2VyCi17CitwdWJsaWMgY2xhc3MgQ29ubmVjdGl2aXR5TWFuYWdlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDb25uZWN0aXZpdHlNYW5hZ2VyIjsKKwogICAgIC8qKgogICAgICAqIEEgY2hhbmdlIGluIG5ldHdvcmsgY29ubmVjdGl2aXR5IGhhcyBvY2N1cnJlZC4gQSBjb25uZWN0aW9uIGhhcyBlaXRoZXIKICAgICAgKiBiZWVuIGVzdGFibGlzaGVkIG9yIGxvc3QuIFRoZSBOZXR3b3JrSW5mbyBmb3IgdGhlIGFmZmVjdGVkIG5ldHdvcmsgaXMKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgICAqIFRoZSBsb29rdXAga2V5IGZvciBhbiBpbnQgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dAogICAgICAqIG91ciBjb25uZWN0aW9uIHRvIHRoZSBpbnRlcm5ldCBhdCBsYXJnZS4gIDAgaW5kaWNhdGVzIG5vIGNvbm5lY3Rpb24sCiAgICAgICogMTAwIGluZGljYXRlcyBhIGdyZWF0IGNvbm5lY3Rpb24uICBSZXRyaWV2ZSBpdCB3aXRoCi0gICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnRAZ2V0SW50RXh0cmEoU3RyaW5nKX0uCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjZ2V0SW50RXh0cmEoU3RyaW5nLCBpbnQpfS4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSU5FVF9DT05ESVRJT04gPSAiaW5ldENvbmRpdGlvbiI7CkBAIC0xMjAsMTMgKzEyMCwxMiBAQAogICAgICAqIDxwPgogICAgICAqIElmIGFuIGFwcGxpY2F0aW9uIHVzZXMgdGhlIG5ldHdvcmsgaW4gdGhlIGJhY2tncm91bmQsIGl0IHNob3VsZCBsaXN0ZW4KICAgICAgKiBmb3IgdGhpcyBicm9hZGNhc3QgYW5kIHN0b3AgdXNpbmcgdGhlIGJhY2tncm91bmQgZGF0YSBpZiB0aGUgdmFsdWUgaXMKLSAgICAgKiBmYWxzZS4KKyAgICAgKiB7QGNvZGUgZmFsc2V9LgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0JBQ0tHUk9VTkRfREFUQV9TRVRUSU5HX0NIQU5HRUQgPQogICAgICAgICAgICAgImFuZHJvaWQubmV0LmNvbm4uQkFDS0dST1VORF9EQVRBX1NFVFRJTkdfQ0hBTkdFRCI7CiAKLQogICAgIC8qKgogICAgICAqIEJyb2FkY2FzdCBBY3Rpb246IFRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gbWF5IG5vdCBiZSBnb29kCiAgICAgICogdXNlcyB7QGNvZGUgQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9JTkVUX0NPTkRJVElPTn0gYW5kCkBAIC0yNTUsNyArMjU0LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTkVUV09SS19QUkVGRVJFTkNFID0gVFlQRV9XSUZJOwogCi0gICAgcHJpdmF0ZSBJQ29ubmVjdGl2aXR5TWFuYWdlciBtU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIElDb25uZWN0aXZpdHlNYW5hZ2VyIG1TZXJ2aWNlOwogCiAgICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGlzTmV0d29ya1R5cGVWYWxpZChpbnQgbmV0d29ya1R5cGUpIHsKICAgICAgICAgcmV0dXJuIG5ldHdvcmtUeXBlID49IDAgJiYgbmV0d29ya1R5cGUgPD0gTUFYX05FVFdPUktfVFlQRTsKQEAgLTI4NCw2ICsyODMsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKiB7QGhpZGV9ICovCisgICAgcHVibGljIE5ldHdvcmtJbmZvIGdldEFjdGl2ZU5ldHdvcmtJbmZvRm9yVWlkKGludCB1aWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRBY3RpdmVOZXR3b3JrSW5mb0ZvclVpZCh1aWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oaW50IG5ldHdvcmtUeXBlKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0TmV0d29ya0luZm8obmV0d29ya1R5cGUpOwpAQCAtMzAwLDcgKzMwOCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiogQGhpZGUgKi8KKyAgICAvKioge0BoaWRlfSAqLwogICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRBY3RpdmVMaW5rUHJvcGVydGllcygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRBY3RpdmVMaW5rUHJvcGVydGllcygpOwpAQCAtMzA5LDcgKzMxNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiogQGhpZGUgKi8KKyAgICAvKioge0BoaWRlfSAqLwogICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhpbnQgbmV0d29ya1R5cGUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRMaW5rUHJvcGVydGllcyhuZXR3b3JrVHlwZSk7CkBAIC00NzksMTkgKzQ4NywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERvbid0IGFsbG93IHVzZSBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKLSAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICoge0BoaWRlfQogICAgICAqLwogICAgIHB1YmxpYyBDb25uZWN0aXZpdHlNYW5hZ2VyKElDb25uZWN0aXZpdHlNYW5hZ2VyIHNlcnZpY2UpIHsKICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5TWFuYWdlcigpIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCB3aXRoIG51bGwgc2VydmljZSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWlzc2luZyBJQ29ubmVjdGl2aXR5TWFuYWdlciIpOwogICAgICAgICB9CiAgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCmluZGV4IDhiZTQ5MmMuLjY0N2E2MGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCkBAIC0zMywxMyArMzMsMTEgQEAKICAgICBpbnQgZ2V0TmV0d29ya1ByZWZlcmVuY2UoKTsKIAogICAgIE5ldHdvcmtJbmZvIGdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7Ci0KKyAgICBOZXR3b3JrSW5mbyBnZXRBY3RpdmVOZXR3b3JrSW5mb0ZvclVpZChpbnQgdWlkKTsKICAgICBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbyhpbnQgbmV0d29ya1R5cGUpOwotCiAgICAgTmV0d29ya0luZm9bXSBnZXRBbGxOZXR3b3JrSW5mbygpOwogCiAgICAgTGlua1Byb3BlcnRpZXMgZ2V0QWN0aXZlTGlua1Byb3BlcnRpZXMoKTsKLQogICAgIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKGludCBuZXR3b3JrVHlwZSk7CiAKICAgICBib29sZWFuIHNldFJhZGlvcyhib29sZWFuIG9uT2ZmKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1BvbGljeUxpc3RlbmVyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSU5ldHdvcmtQb2xpY3lMaXN0ZW5lci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzAxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSU5ldHdvcmtQb2xpY3lMaXN0ZW5lci5haWRsCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCisvKioge0BoaWRlfSAqLworb25ld2F5IGludGVyZmFjZSBJTmV0d29ya1BvbGljeUxpc3RlbmVyIHsKKworICAgIHZvaWQgb25SdWxlc0NoYW5nZWQoaW50IHVpZCwgaW50IHVpZFJ1bGVzKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lOZXR3b3JrUG9saWN5TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lOZXR3b3JrUG9saWN5TWFuYWdlci5haWRsCmluZGV4IGQ5MzUxZWUuLmMxZjM1MzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1BvbGljeU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSU5ldHdvcmtQb2xpY3lNYW5hZ2VyLmFpZGwKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAoraW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrUG9saWN5TGlzdGVuZXI7CisKIC8qKgogICogSW50ZXJmYWNlIHRoYXQgY3JlYXRlcyBhbmQgbW9kaWZpZXMgbmV0d29yayBwb2xpY3kgcnVsZXMuCiAgKgpAQCAtMjYsNiArMjgsMTEgQEAKICAgICB2b2lkIHNldFVpZFBvbGljeShpbnQgdWlkLCBpbnQgcG9saWN5KTsKICAgICBpbnQgZ2V0VWlkUG9saWN5KGludCB1aWQpOwogCisgICAgYm9vbGVhbiBpc1VpZEZvcmVncm91bmQoaW50IHVpZCk7CisKKyAgICB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSU5ldHdvcmtQb2xpY3lMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSU5ldHdvcmtQb2xpY3lMaXN0ZW5lciBsaXN0ZW5lcik7CisKICAgICAvLyBUT0RPOiBidWlsZCBBUEkgdG8gc3VyZmFjZSBzdGF0cyBkZXRhaWxzIGZvciBzZXR0aW5ncyBVSQogCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSU5ldHdvcmtTdGF0c1NlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1N0YXRzU2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTcwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSU5ldHdvcmtTdGF0c1NlcnZpY2UuYWlkbApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0c0hpc3Rvcnk7CisKKy8qKiB7QGhpZGV9ICovCitpbnRlcmZhY2UgSU5ldHdvcmtTdGF0c1NlcnZpY2UgeworCisgICAgTmV0d29ya1N0YXRzSGlzdG9yeVtdIGdldE5ldHdvcmtTdGF0c1N1bW1hcnkoaW50IG5ldHdvcmtUeXBlKTsKKyAgICBOZXR3b3JrU3RhdHNIaXN0b3J5IGdldE5ldHdvcmtTdGF0c1VpZChpbnQgdWlkKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQppbmRleCA1ZjVlMTFjLi41Mzc3NTBhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQpAQCAtNzQsNyArNzQsOSBAQAogICAgICAgICAvKiogSVAgdHJhZmZpYyBub3QgYXZhaWxhYmxlLiAqLwogICAgICAgICBESVNDT05ORUNURUQsCiAgICAgICAgIC8qKiBBdHRlbXB0IHRvIGNvbm5lY3QgZmFpbGVkLiAqLwotICAgICAgICBGQUlMRUQKKyAgICAgICAgRkFJTEVELAorICAgICAgICAvKiogQWNjZXNzIHRvIHRoaXMgbmV0d29yayBpcyBibG9ja2VkLiAqLworICAgICAgICBCTE9DS0VECiAgICAgfQogCiAgICAgLyoqCkBAIC05Niw2ICs5OCw3IEBACiAgICAgICAgIHN0YXRlTWFwLnB1dChEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RJTkcsIFN0YXRlLkRJU0NPTk5FQ1RJTkcpOwogICAgICAgICBzdGF0ZU1hcC5wdXQoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIFN0YXRlLkRJU0NPTk5FQ1RFRCk7CiAgICAgICAgIHN0YXRlTWFwLnB1dChEZXRhaWxlZFN0YXRlLkZBSUxFRCwgU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICAgICAgc3RhdGVNYXAucHV0KERldGFpbGVkU3RhdGUuQkxPQ0tFRCwgU3RhdGUuRElTQ09OTkVDVEVEKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBtTmV0d29ya1R5cGU7CkBAIC0xMzgsNiArMTQxLDIzIEBACiAgICAgICAgIG1Jc1JvYW1pbmcgPSBmYWxzZTsKICAgICB9CiAKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyhOZXR3b3JrSW5mbyBzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmV0d29ya1R5cGUgPSBzb3VyY2UubU5ldHdvcmtUeXBlOworICAgICAgICAgICAgbVN1YnR5cGUgPSBzb3VyY2UubVN1YnR5cGU7CisgICAgICAgICAgICBtVHlwZU5hbWUgPSBzb3VyY2UubVR5cGVOYW1lOworICAgICAgICAgICAgbVN1YnR5cGVOYW1lID0gc291cmNlLm1TdWJ0eXBlTmFtZTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IHNvdXJjZS5tU3RhdGU7CisgICAgICAgICAgICBtRGV0YWlsZWRTdGF0ZSA9IHNvdXJjZS5tRGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgICAgIG1SZWFzb24gPSBzb3VyY2UubVJlYXNvbjsKKyAgICAgICAgICAgIG1FeHRyYUluZm8gPSBzb3VyY2UubUV4dHJhSW5mbzsKKyAgICAgICAgICAgIG1Jc0ZhaWxvdmVyID0gc291cmNlLm1Jc0ZhaWxvdmVyOworICAgICAgICAgICAgbUlzUm9hbWluZyA9IHNvdXJjZS5tSXNSb2FtaW5nOworICAgICAgICAgICAgbUlzQXZhaWxhYmxlID0gc291cmNlLm1Jc0F2YWlsYWJsZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlcG9ydHMgdGhlIHR5cGUgb2YgbmV0d29yayAoY3VycmVudGx5IG1vYmlsZSBvciBXaS1GaSkgdG8gd2hpY2ggdGhlCiAgICAgICogaW5mbyBpbiB0aGlzIG9iamVjdCBwZXJ0YWlucy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUG9saWN5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtQb2xpY3lNYW5hZ2VyLmphdmEKaW5kZXggMTkxM2FhNy4uZGQ3YzFiMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtQb2xpY3lNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtQb2xpY3lNYW5hZ2VyLmphdmEKQEAgLTE5LDYgKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAoraW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKIC8qKgogICogTWFuYWdlciBmb3IgY3JlYXRpbmcgYW5kIG1vZGlmeWluZyBuZXR3b3JrIHBvbGljeSBydWxlcy4KICAqCkBAIC0yOCwxMiArMzAsMTMgQEAKIAogICAgIC8qKiBObyBzcGVjaWZpYyBuZXR3b3JrIHBvbGljeSwgdXNlIHN5c3RlbSBkZWZhdWx0LiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPTElDWV9OT05FID0gMHgwOwotICAgIC8qKiBSZWplY3QgbmV0d29yayB1c2FnZSB3aGVuIGFwcGxpY2F0aW9uIGluIGJhY2tncm91bmQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9MSUNZX1JFSkVDVF9CQUNLR1JPVU5EID0gMHgxOwotICAgIC8qKiBSZWplY3QgbmV0d29yayB1c2FnZSBvbiBwYWlkIG5ldHdvcmsgY29ubmVjdGlvbnMuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9MSUNZX1JFSkVDVF9QQUlEID0gMHgyOwotICAgIC8qKiBBcHBsaWNhdGlvbiBzaG91bGQgY29uc2VydmUgZGF0YS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfQ09OU0VSVkVfREFUQSA9IDB4NDsKKyAgICAvKiogUmVqZWN0IG5ldHdvcmsgdXNhZ2Ugb24gcGFpZCBuZXR3b3JrcyB3aGVuIGFwcGxpY2F0aW9uIGluIGJhY2tncm91bmQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9MSUNZX1JFSkVDVF9QQUlEX0JBQ0tHUk9VTkQgPSAweDE7CisKKyAgICAvKiogQWxsIG5ldHdvcmsgdHJhZmZpYyBzaG91bGQgYmUgYWxsb3dlZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0FMTE9XX0FMTCA9IDB4MDsKKyAgICAvKiogUmVqZWN0IHRyYWZmaWMgb24gcGFpZCBuZXR3b3Jrcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1JFSkVDVF9QQUlEID0gMHgxOwogCiAgICAgcHJpdmF0ZSBJTmV0d29ya1BvbGljeU1hbmFnZXIgbVNlcnZpY2U7CiAKQEAgLTUxLDkgKzU0LDggQEAKICAgICAvKioKICAgICAgKiBTZXQgcG9saWN5IGZsYWdzIGZvciBzcGVjaWZpYyBVSUQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcG9saWN5IHtAbGluayAjUE9MSUNZX05PTkV9IG9yIGNvbWJpbmF0aW9uIG9mCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI1BPTElDWV9SRUpFQ1RfQkFDS0dST1VORH0sIHtAbGluayAjUE9MSUNZX1JFSkVDVF9QQUlEfSwKLSAgICAgKiAgICAgICAgICAgIG9yIHtAbGluayAjUE9MSUNZX0NPTlNFUlZFX0RBVEF9LgorICAgICAqIEBwYXJhbSBwb2xpY3kge0BsaW5rICNQT0xJQ1lfTk9ORX0gb3IgY29tYmluYXRpb24gb2YgZmxhZ3MgbGlrZQorICAgICAqICAgICAgICAgICAge0BsaW5rICNQT0xJQ1lfUkVKRUNUX1BBSURfQkFDS0dST1VORH0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VWlkUG9saWN5KGludCB1aWQsIGludCBwb2xpY3kpIHsKICAgICAgICAgdHJ5IHsKQEAgLTY5LDUgKzcxLDIzIEBACiAgICAgICAgICAgICByZXR1cm4gUE9MSUNZX05PTkU7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgLyoqIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcFBvbGljeShQcmludFdyaXRlciBmb3V0LCBpbnQgcG9saWN5KSB7CisgICAgICAgIGZvdXQud3JpdGUoIlsiKTsKKyAgICAgICAgaWYgKChwb2xpY3kgJiBQT0xJQ1lfUkVKRUNUX1BBSURfQkFDS0dST1VORCkgIT0gMCkgeworICAgICAgICAgICAgZm91dC53cml0ZSgiUkVKRUNUX1BBSURfQkFDS0dST1VORCIpOworICAgICAgICB9CisgICAgICAgIGZvdXQud3JpdGUoIl0iKTsKKyAgICB9CisKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wUnVsZXMoUHJpbnRXcml0ZXIgZm91dCwgaW50IHJ1bGVzKSB7CisgICAgICAgIGZvdXQud3JpdGUoIlsiKTsKKyAgICAgICAgaWYgKChydWxlcyAmIFJVTEVfUkVKRUNUX1BBSUQpICE9IDApIHsKKyAgICAgICAgICAgIGZvdXQud3JpdGUoIlJFSkVDVF9QQUlEIik7CisgICAgICAgIH0KKyAgICAgICAgZm91dC53cml0ZSgiXSIpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0cy5qYXZhCmluZGV4IDBmMjA3YmMuLjU4OGJmNjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzLmphdmEKQEAgLTIyLDE5ICsyMiwyMiBAQAogCiBpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIAogLyoqCi0gKiBDb2xsZWN0aW9uIG9mIG5ldHdvcmsgc3RhdGlzdGljcy4gQ2FuIGNvbnRhaW4gc3VtbWFyeSBkZXRhaWxzIGFjcm9zcyBhbGwKLSAqIGludGVyZmFjZXMsIG9yIGRldGFpbHMgd2l0aCBwZXItVUlEIGdyYW51bGFyaXR5LiBEZXNpZ25lZCB0byBwYXJjZWwgcXVpY2tseQotICogYWNyb3NzIHByb2Nlc3MgYm91bmRhcmllcy4KKyAqIENvbGxlY3Rpb24gb2YgYWN0aXZlIG5ldHdvcmsgc3RhdGlzdGljcy4gQ2FuIGNvbnRhaW4gc3VtbWFyeSBkZXRhaWxzIGFjcm9zcworICogYWxsIGludGVyZmFjZXMsIG9yIGRldGFpbHMgd2l0aCBwZXItVUlEIGdyYW51bGFyaXR5LiBJbnRlcm5hbGx5IHN0b3JlcyBkYXRhCisgKiBhcyBhIGxhcmdlIHRhYmxlLCBjbG9zZWx5IG1hdGNoaW5nIHtAY29kZSAvcHJvYy99IGRhdGEgZm9ybWF0LiBUaGlzIHN0cnVjdHVyZQorICogb3B0aW1pemVzIGZvciByYXBpZCBpbi1tZW1vcnkgY29tcGFyaXNvbiwgYnV0IGNvbnNpZGVyIHVzaW5nCisgKiB7QGxpbmsgTmV0d29ya1N0YXRzSGlzdG9yeX0gd2hlbiBwZXJzaXN0aW5nLgogICoKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBjbGFzcyBOZXR3b3JrU3RhdHMgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKLSAgICAvKioge0BsaW5rICNpZmFjZX0gdmFsdWUgd2hlbiBlbnRyeSBpcyBzdW1tYXJpemVkIG92ZXIgYWxsIGludGVyZmFjZXMuICovCisgICAgLyoqIHtAbGluayAjaWZhY2V9IHZhbHVlIHdoZW4gaW50ZXJmYWNlIGRldGFpbHMgdW5hdmFpbGFibGUuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUZBQ0VfQUxMID0gbnVsbDsKLSAgICAvKioge0BsaW5rICN1aWR9IHZhbHVlIHdoZW4gZW50cnkgaXMgc3VtbWFyaXplZCBvdmVyIGFsbCBVSURzLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVJRF9BTEwgPSAwOworICAgIC8qKiB7QGxpbmsgI3VpZH0gdmFsdWUgd2hlbiBVSUQgZGV0YWlscyB1bmF2YWlsYWJsZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSURfQUxMID0gLTE7CiAKICAgICAvLyBOT1RFOiBkYXRhIHNob3VsZCBvbmx5IGJlIGFjY291bnRlZCBmb3Igb25jZSBpbiB0aGlzIHN0cnVjdHVyZTsgaWYgZGF0YQogICAgIC8vIGlzIGJyb2tlbiBvdXQsIHRoZSBzdW1tYXJpemVkIHZlcnNpb24gc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KQEAgLTQ5LDcgKzUyLDcgQEAKICAgICBwdWJsaWMgZmluYWwgbG9uZ1tdIHJ4OwogICAgIHB1YmxpYyBmaW5hbCBsb25nW10gdHg7CiAKLSAgICAvLyBUT0RPOiBhZGQgZmcvYmcgc3RhdHMgYW5kIHRhZyBncmFudWxhcml0eQorICAgIC8vIFRPRE86IGFkZCBmZy9iZyBzdGF0cyBvbmNlIHJlcG9ydGVkIGJ5IGtlcm5lbAogCiAgICAgcHJpdmF0ZSBOZXR3b3JrU3RhdHMobG9uZyBlbGFwc2VkUmVhbHRpbWUsIFN0cmluZ1tdIGlmYWNlLCBpbnRbXSB1aWQsIGxvbmdbXSByeCwgbG9uZ1tdIHR4KSB7CiAgICAgICAgIHRoaXMuZWxhcHNlZFJlYWx0aW1lID0gZWxhcHNlZFJlYWx0aW1lOwpAQCAtMTIwLDE1ICsxMjMsMzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gbGlzdCBvZiB1bmlxdWUgaW50ZXJmYWNlcyBrbm93biBieSB0aGlzIGRhdGEgc3RydWN0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRLbm93bklmYWNlcygpIHsKKyAgICAgICAgZmluYWwgSGFzaFNldDxTdHJpbmc+IGlmYWNlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaWZhY2UgOiB0aGlzLmlmYWNlKSB7CisgICAgICAgICAgICBpZiAoaWZhY2UgIT0gSUZBQ0VfQUxMKSB7CisgICAgICAgICAgICAgICAgaWZhY2VzLmFkZChpZmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlmYWNlcy50b0FycmF5KG5ldyBTdHJpbmdbaWZhY2VzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgogICAgICAqIFN1YnRyYWN0IHRoZSBnaXZlbiB7QGxpbmsgTmV0d29ya1N0YXRzfSwgZWZmZWN0aXZlbHkgbGVhdmluZyB0aGUgZGVsdGEKICAgICAgKiBiZXR3ZWVuIHR3byBzbmFwc2hvdHMgaW4gdGltZS4gQXNzdW1lcyB0aGF0IHN0YXRpc3RpY3Mgcm93cyBjb2xsZWN0IG92ZXIKICAgICAgKiB0aW1lLCBhbmQgdGhhdCBub25lIG9mIHRoZW0gaGF2ZSBkaXNhcHBlYXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmZvcmNlTW9ub3RvbmljIFZhbGlkYXRlIHRoYXQgaW5jb21pbmcgdmFsdWUgaXMgc3RyaWN0bHkKKyAgICAgKiAgICAgICAgICAgIG1vbm90b25pYyBjb21wYXJlZCB0byB0aGlzIG9iamVjdC4KICAgICAgKi8KLSAgICBwdWJsaWMgTmV0d29ya1N0YXRzIHN1YnRyYWN0KE5ldHdvcmtTdGF0cyB2YWx1ZSkgewotICAgICAgICAvLyByZXN1bHQgd2lsbCBoYXZlIG91ciByb3dzLCBidXQgbm8gbWVhbmluZ2Z1bCB0aW1lc3RhbXAKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxlbmd0aCgpOwotICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMuQnVpbGRlciByZXN1bHQgPSBuZXcgTmV0d29ya1N0YXRzLkJ1aWxkZXIoLTEsIGxlbmd0aCk7CisgICAgcHVibGljIE5ldHdvcmtTdGF0cyBzdWJ0cmFjdChOZXR3b3JrU3RhdHMgdmFsdWUsIGJvb2xlYW4gZW5mb3JjZU1vbm90b25pYykgeworICAgICAgICBmaW5hbCBsb25nIGRlbHRhUmVhbHRpbWUgPSB0aGlzLmVsYXBzZWRSZWFsdGltZSAtIHZhbHVlLmVsYXBzZWRSZWFsdGltZTsKKyAgICAgICAgaWYgKGVuZm9yY2VNb25vdG9uaWMgJiYgZGVsdGFSZWFsdGltZSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZvdW5kIG5vbi1tb25vdG9uaWMgcmVhbHRpbWUiKTsKKyAgICAgICAgfQogCisgICAgICAgIC8vIHJlc3VsdCB3aWxsIGhhdmUgb3VyIHJvd3MsIGFuZCBlbGFwc2VkIHRpbWUgYmV0d2VlbiBzbmFwc2hvdHMKKyAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxlbmd0aCgpOworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMuQnVpbGRlciByZXN1bHQgPSBuZXcgTmV0d29ya1N0YXRzLkJ1aWxkZXIoZGVsdGFSZWFsdGltZSwgbGVuZ3RoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlmYWNlID0gdGhpcy5pZmFjZVtpXTsKICAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSB0aGlzLnVpZFtpXTsKQEAgLTE0Miw2ICsxNjUsOSBAQAogICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHJvdywgc3VidHJhY3QgcmVtb3RlIHZhbHVlCiAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyByeCA9IHRoaXMucnhbaV0gLSB2YWx1ZS5yeFtqXTsKICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHR4ID0gdGhpcy50eFtpXSAtIHZhbHVlLnR4W2pdOworICAgICAgICAgICAgICAgIGlmIChlbmZvcmNlTW9ub3RvbmljICYmIChyeCA8IDAgfHwgdHggPCAwKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmb3VuZCBub24tbW9ub3RvbmljIHZhbHVlcyIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXN1bHQuYWRkRW50cnkoaWZhY2UsIHVpZCwgcngsIHR4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0c0hpc3RvcnkuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNIaXN0b3J5LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5MDY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNIaXN0b3J5LmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitwYXJjZWxhYmxlIE5ldHdvcmtTdGF0c0hpc3Rvcnk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzSGlzdG9yeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0c0hpc3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTYxMDFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0c0hpc3RvcnkuamF2YQpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKK2ltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogQ29sbGVjdGlvbiBvZiBoaXN0b3JpY2FsIG5ldHdvcmsgc3RhdGlzdGljcywgcmVjb3JkZWQgaW50byBlcXVhbGx5LXNpemVkCisgKiAiYnVja2V0cyIgaW4gdGltZS4gSW50ZXJuYWxseSBpdCBzdG9yZXMgZGF0YSBpbiB7QGNvZGUgbG9uZ30gc2VyaWVzIGZvciBtb3JlCisgKiBlZmZpY2llbnQgcGVyc2lzdGVuY2UuCisgKiA8cD4KKyAqIEVhY2ggYnVja2V0IGlzIGRlZmluZWQgYnkgYSB7QGxpbmsgI2J1Y2tldFN0YXJ0fSB0aW1lc3RhbXAsIGFuZCBsYXN0cyBmb3IKKyAqIHtAbGluayAjYnVja2V0RHVyYXRpb259LiBJbnRlcm5hbGx5IGFzc3VtZXMgdGhhdCB7QGxpbmsgI2J1Y2tldFN0YXJ0fSBpcworICogc29ydGVkIGF0IGFsbCB0aW1lcy4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTmV0d29ya1N0YXRzSGlzdG9yeSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OID0gMTsKKworICAgIC8qKiB7QGxpbmsgI3VpZH0gdmFsdWUgd2hlbiBVSUQgZGV0YWlscyB1bmF2YWlsYWJsZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSURfQUxMID0gLTE7CisKKyAgICAvLyBUT0RPOiB0ZWFjaCBhYm91dCB6aWd6YWcgZW5jb2RpbmcgdG8gdXNlIGxlc3MgZGlzayBzcGFjZQorICAgIC8vIFRPRE86IHRlYWNoIGhvdyB0byBjb252ZXJ0IGJldHdlZW4gYnVja2V0IHNpemVzCisKKyAgICBwdWJsaWMgZmluYWwgaW50IG5ldHdvcmtUeXBlOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgaWRlbnRpdHk7CisgICAgcHVibGljIGZpbmFsIGludCB1aWQ7CisgICAgcHVibGljIGZpbmFsIGxvbmcgYnVja2V0RHVyYXRpb247CisKKyAgICBpbnQgYnVja2V0Q291bnQ7CisgICAgbG9uZ1tdIGJ1Y2tldFN0YXJ0OworICAgIGxvbmdbXSByeDsKKyAgICBsb25nW10gdHg7CisKKyAgICBwdWJsaWMgTmV0d29ya1N0YXRzSGlzdG9yeShpbnQgbmV0d29ya1R5cGUsIFN0cmluZyBpZGVudGl0eSwgaW50IHVpZCwgbG9uZyBidWNrZXREdXJhdGlvbikgeworICAgICAgICB0aGlzLm5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7CisgICAgICAgIHRoaXMuaWRlbnRpdHkgPSBpZGVudGl0eTsKKyAgICAgICAgdGhpcy51aWQgPSB1aWQ7CisgICAgICAgIHRoaXMuYnVja2V0RHVyYXRpb24gPSBidWNrZXREdXJhdGlvbjsKKyAgICAgICAgYnVja2V0U3RhcnQgPSBuZXcgbG9uZ1swXTsKKyAgICAgICAgcnggPSBuZXcgbG9uZ1swXTsKKyAgICAgICAgdHggPSBuZXcgbG9uZ1swXTsKKyAgICAgICAgYnVja2V0Q291bnQgPSBidWNrZXRTdGFydC5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIE5ldHdvcmtTdGF0c0hpc3RvcnkoUGFyY2VsIGluKSB7CisgICAgICAgIG5ldHdvcmtUeXBlID0gaW4ucmVhZEludCgpOworICAgICAgICBpZGVudGl0eSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgdWlkID0gaW4ucmVhZEludCgpOworICAgICAgICBidWNrZXREdXJhdGlvbiA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIGJ1Y2tldFN0YXJ0ID0gcmVhZExvbmdBcnJheShpbik7CisgICAgICAgIHJ4ID0gaW4uY3JlYXRlTG9uZ0FycmF5KCk7CisgICAgICAgIHR4ID0gaW4uY3JlYXRlTG9uZ0FycmF5KCk7CisgICAgICAgIGJ1Y2tldENvdW50ID0gYnVja2V0U3RhcnQubGVuZ3RoOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgb3V0LndyaXRlSW50KG5ldHdvcmtUeXBlKTsKKyAgICAgICAgb3V0LndyaXRlU3RyaW5nKGlkZW50aXR5KTsKKyAgICAgICAgb3V0LndyaXRlSW50KHVpZCk7CisgICAgICAgIG91dC53cml0ZUxvbmcoYnVja2V0RHVyYXRpb24pOworICAgICAgICB3cml0ZUxvbmdBcnJheShvdXQsIGJ1Y2tldFN0YXJ0LCBidWNrZXRDb3VudCk7CisgICAgICAgIHdyaXRlTG9uZ0FycmF5KG91dCwgcngsIGJ1Y2tldENvdW50KTsKKyAgICAgICAgd3JpdGVMb25nQXJyYXkob3V0LCB0eCwgYnVja2V0Q291bnQpOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrU3RhdHNIaXN0b3J5KERhdGFJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHZlcnNpb24gPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG5ldHdvcmtUeXBlID0gaW4ucmVhZEludCgpOworICAgICAgICBpZGVudGl0eSA9IGluLnJlYWRVVEYoKTsKKyAgICAgICAgdWlkID0gaW4ucmVhZEludCgpOworICAgICAgICBidWNrZXREdXJhdGlvbiA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIGJ1Y2tldFN0YXJ0ID0gcmVhZExvbmdBcnJheShpbik7CisgICAgICAgIHJ4ID0gcmVhZExvbmdBcnJheShpbik7CisgICAgICAgIHR4ID0gcmVhZExvbmdBcnJheShpbik7CisgICAgICAgIGJ1Y2tldENvdW50ID0gYnVja2V0U3RhcnQubGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9TdHJlYW0oRGF0YU91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUludChWRVJTSU9OKTsKKyAgICAgICAgb3V0LndyaXRlSW50KG5ldHdvcmtUeXBlKTsKKyAgICAgICAgb3V0LndyaXRlVVRGKGlkZW50aXR5KTsKKyAgICAgICAgb3V0LndyaXRlSW50KHVpZCk7CisgICAgICAgIG91dC53cml0ZUxvbmcoYnVja2V0RHVyYXRpb24pOworICAgICAgICB3cml0ZUxvbmdBcnJheShvdXQsIGJ1Y2tldFN0YXJ0LCBidWNrZXRDb3VudCk7CisgICAgICAgIHdyaXRlTG9uZ0FycmF5KG91dCwgcngsIGJ1Y2tldENvdW50KTsKKyAgICAgICAgd3JpdGVMb25nQXJyYXkob3V0LCB0eCwgYnVja2V0Q291bnQpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhhdCBkYXRhIHRyYWZmaWMgb2NjdXJyZWQgaW4gdGhlIGdpdmVuIHRpbWUgcmFuZ2UuIFdpbGwKKyAgICAgKiBkaXN0cmlidXRlIGFjcm9zcyBpbnRlcm5hbCBidWNrZXRzLCBjcmVhdGluZyBuZXcgYnVja2V0cyBhcyBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjb3JkRGF0YShsb25nIHN0YXJ0LCBsb25nIGVuZCwgbG9uZyByeCwgbG9uZyB0eCkgeworICAgICAgICAvLyBjcmVhdGUgYW55IGJ1Y2tldHMgbmVlZGVkIGJ5IHRoaXMgcmFuZ2UKKyAgICAgICAgZW5zdXJlQnVja2V0cyhzdGFydCwgZW5kKTsKKworICAgICAgICAvLyBkaXN0cmlidXRlIGRhdGEgdXNhZ2UgaW50byBidWNrZXRzCisgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgZm9yIChpbnQgaSA9IGJ1Y2tldENvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgY3VyU3RhcnQgPSBidWNrZXRTdGFydFtpXTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgY3VyRW5kID0gY3VyU3RhcnQgKyBidWNrZXREdXJhdGlvbjsKKworICAgICAgICAgICAgLy8gYnVja2V0IGlzIG9sZGVyIHRoYW4gcmVjb3JkOyB3ZSdyZSBmaW5pc2hlZAorICAgICAgICAgICAgaWYgKGN1ckVuZCA8IHN0YXJ0KSBicmVhazsKKyAgICAgICAgICAgIC8vIGJ1Y2tldCBpcyBuZXdlciB0aGFuIHJlY29yZDsga2VlcCBsb29raW5nCisgICAgICAgICAgICBpZiAoY3VyU3RhcnQgPiBlbmQpIGNvbnRpbnVlOworCisgICAgICAgICAgICBmaW5hbCBsb25nIG92ZXJsYXAgPSBNYXRoLm1pbihjdXJFbmQsIGVuZCkgLSBNYXRoLm1heChjdXJTdGFydCwgc3RhcnQpOworICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5yeFtpXSArPSByeCAqIG92ZXJsYXAgLyBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICB0aGlzLnR4W2ldICs9IHR4ICogb3ZlcmxhcCAvIGR1cmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgYnVja2V0cyBleGlzdCBmb3IgZ2l2ZW4gdGltZSByYW5nZSwgY3JlYXRpbmcgYXMgbmVlZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVCdWNrZXRzKGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisgICAgICAgIC8vIG5vcm1hbGl6ZSBpbmNvbWluZyByYW5nZSB0byBidWNrZXQgYm91bmRhcmllcworICAgICAgICBzdGFydCAtPSBzdGFydCAlIGJ1Y2tldER1cmF0aW9uOworICAgICAgICBlbmQgKz0gKGJ1Y2tldER1cmF0aW9uIC0gKGVuZCAlIGJ1Y2tldER1cmF0aW9uKSkgJSBidWNrZXREdXJhdGlvbjsKKworICAgICAgICBmb3IgKGxvbmcgbm93ID0gc3RhcnQ7IG5vdyA8IGVuZDsgbm93ICs9IGJ1Y2tldER1cmF0aW9uKSB7CisgICAgICAgICAgICAvLyB0cnkgZmluZGluZyBleGlzdGluZyBidWNrZXQKKyAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goYnVja2V0U3RhcnQsIDAsIGJ1Y2tldENvdW50LCBub3cpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIC8vIGJ1Y2tldCBtaXNzaW5nLCBjcmVhdGUgYW5kIGluc2VydAorICAgICAgICAgICAgICAgIGluc2VydEJ1Y2tldCh+aW5kZXgsIG5vdyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnQgbmV3IGJ1Y2tldCBhdCByZXF1ZXN0ZWQgaW5kZXggYW5kIHN0YXJ0aW5nIHRpbWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluc2VydEJ1Y2tldChpbnQgaW5kZXgsIGxvbmcgc3RhcnQpIHsKKyAgICAgICAgLy8gY3JlYXRlIG1vcmUgYnVja2V0cyB3aGVuIG5lZWRlZAorICAgICAgICBpZiAoYnVja2V0Q291bnQgKyAxID4gYnVja2V0U3RhcnQubGVuZ3RoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbmV3TGVuZ3RoID0gYnVja2V0U3RhcnQubGVuZ3RoICsgMTA7CisgICAgICAgICAgICBidWNrZXRTdGFydCA9IEFycmF5cy5jb3B5T2YoYnVja2V0U3RhcnQsIG5ld0xlbmd0aCk7CisgICAgICAgICAgICByeCA9IEFycmF5cy5jb3B5T2YocngsIG5ld0xlbmd0aCk7CisgICAgICAgICAgICB0eCA9IEFycmF5cy5jb3B5T2YodHgsIG5ld0xlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgZ2FwIHdoZW4gaW5zZXJ0aW5nIGJ1Y2tldCBpbiBtaWRkbGUKKyAgICAgICAgaWYgKGluZGV4IDwgYnVja2V0Q291bnQpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBkc3RQb3MgPSBpbmRleCArIDE7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYnVja2V0Q291bnQgLSBpbmRleDsKKworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWNrZXRTdGFydCwgaW5kZXgsIGJ1Y2tldFN0YXJ0LCBkc3RQb3MsIGxlbmd0aCk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJ4LCBpbmRleCwgcngsIGRzdFBvcywgbGVuZ3RoKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodHgsIGluZGV4LCB0eCwgZHN0UG9zLCBsZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgYnVja2V0U3RhcnRbaW5kZXhdID0gc3RhcnQ7CisgICAgICAgIHJ4W2luZGV4XSA9IDA7CisgICAgICAgIHR4W2luZGV4XSA9IDA7CisgICAgICAgIGJ1Y2tldENvdW50Kys7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGJ1Y2tldHMgb2xkZXIgdGhhbiByZXF1ZXN0ZWQgY3V0b2ZmLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJ1Y2tldHNCZWZvcmUobG9uZyBjdXRvZmYpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWNrZXRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIGN1clN0YXJ0ID0gYnVja2V0U3RhcnRbaV07CisgICAgICAgICAgICBmaW5hbCBsb25nIGN1ckVuZCA9IGN1clN0YXJ0ICsgYnVja2V0RHVyYXRpb247CisKKyAgICAgICAgICAgIC8vIGN1dG9mZiBoYXBwZW5zIGJlZm9yZSBvciBkdXJpbmcgdGhpcyBidWNrZXQ7IGV2ZXJ5dGhpbmcgYmVmb3JlCisgICAgICAgICAgICAvLyB0aGlzIGJ1Y2tldCBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgICAgICAgICAgIGlmIChjdXJFbmQgPiBjdXRvZmYpIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYnVja2V0U3RhcnQubGVuZ3RoOworICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBBcnJheXMuY29weU9mUmFuZ2UoYnVja2V0U3RhcnQsIGksIGxlbmd0aCk7CisgICAgICAgICAgICByeCA9IEFycmF5cy5jb3B5T2ZSYW5nZShyeCwgaSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHR4ID0gQXJyYXlzLmNvcHlPZlJhbmdlKHR4LCBpLCBsZW5ndGgpOworICAgICAgICAgICAgYnVja2V0Q291bnQgLT0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCwgUHJpbnRXcml0ZXIgcHcpIHsKKyAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgc3RyaXBwaW5nIGlkZW50aXR5IHdoZW4gZHVtcGluZworICAgICAgICBwdy5wcmludChwcmVmaXgpOworICAgICAgICBwdy5wcmludCgiTmV0d29ya1N0YXRzSGlzdG9yeTogbmV0d29ya1R5cGU9Iik7IHB3LnByaW50KG5ldHdvcmtUeXBlKTsKKyAgICAgICAgcHcucHJpbnQoIiBpZGVudGl0eT0iKTsgcHcucHJpbnQoaWRlbnRpdHkpOworICAgICAgICBwdy5wcmludCgiIHVpZD0iKTsgcHcucHJpbnRsbih1aWQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Y2tldENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7CisgICAgICAgICAgICBwdy5wcmludCgiICB0aW1lc3RhbXA9Iik7IHB3LnByaW50KGJ1Y2tldFN0YXJ0W2ldKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgcng9Iik7IHB3LnByaW50KHJ4W2ldKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgdHg9Iik7IHB3LnByaW50bG4odHhbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgQ2hhckFycmF5V3JpdGVyIHdyaXRlciA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgZHVtcCgiIiwgbmV3IFByaW50V3JpdGVyKHdyaXRlcikpOworICAgICAgICByZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDcmVhdG9yPE5ldHdvcmtTdGF0c0hpc3Rvcnk+IENSRUFUT1IgPSBuZXcgQ3JlYXRvcjxOZXR3b3JrU3RhdHNIaXN0b3J5PigpIHsKKyAgICAgICAgcHVibGljIE5ldHdvcmtTdGF0c0hpc3RvcnkgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya1N0YXRzSGlzdG9yeShpbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTmV0d29ya1N0YXRzSGlzdG9yeVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtTdGF0c0hpc3Rvcnlbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZ1tdIHJlYWRMb25nQXJyYXkoRGF0YUlucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgZmluYWwgbG9uZ1tdIHZhbHVlcyA9IG5ldyBsb25nW3NpemVdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdmFsdWVzW2ldID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVMb25nQXJyYXkoRGF0YU91dHB1dFN0cmVhbSBvdXQsIGxvbmdbXSB2YWx1ZXMsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc2l6ZSA+IHZhbHVlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNpemUgbGFyZ2VyIHRoYW4gbGVuZ3RoIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlSW50KHNpemUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgb3V0LndyaXRlTG9uZyh2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZ1tdIHJlYWRMb25nQXJyYXkoUGFyY2VsIGluKSB7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gaW4ucmVhZEludCgpOworICAgICAgICBmaW5hbCBsb25nW10gdmFsdWVzID0gbmV3IGxvbmdbc2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZXNbaV0gPSBpbi5yZWFkTG9uZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUxvbmdBcnJheShQYXJjZWwgb3V0LCBsb25nW10gdmFsdWVzLCBpbnQgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA+IHZhbHVlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNpemUgbGFyZ2VyIHRoYW4gbGVuZ3RoIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlSW50KHNpemUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgb3V0LndyaXRlTG9uZyh2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5LmphdmEKaW5kZXggM2JmNjRiMi4uOGU1MGNkNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1NTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9TU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3RvcnkuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5OwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKIGltcG9ydCBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLktleU1hbmFnZXI7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFeGNlcHRpb247CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb247CkBAIC04Niw2ICs4Nyw4IEBACiAKICAgICBwcml2YXRlIFNTTFNvY2tldEZhY3RvcnkgbUluc2VjdXJlRmFjdG9yeSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTU0xTb2NrZXRGYWN0b3J5IG1TZWN1cmVGYWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIFRydXN0TWFuYWdlcltdIG1UcnVzdE1hbmFnZXJzID0gbnVsbDsKKyAgICBwcml2YXRlIEtleU1hbmFnZXJbXSBtS2V5TWFuYWdlcnMgPSBudWxsOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUhhbmRzaGFrZVRpbWVvdXRNaWxsaXM7CiAgICAgcHJpdmF0ZSBmaW5hbCBTU0xDbGllbnRTZXNzaW9uQ2FjaGUgbVNlc3Npb25DYWNoZTsKQEAgLTE5NywxMCArMjAwLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIFNTTFNvY2tldEZhY3RvcnkgbWFrZVNvY2tldEZhY3RvcnkoVHJ1c3RNYW5hZ2VyW10gdHJ1c3RNYW5hZ2VycykgeworICAgIHByaXZhdGUgU1NMU29ja2V0RmFjdG9yeSBtYWtlU29ja2V0RmFjdG9yeSgKKyAgICAgICAgICAgIEtleU1hbmFnZXJbXSBrZXlNYW5hZ2VycywgVHJ1c3RNYW5hZ2VyW10gdHJ1c3RNYW5hZ2VycykgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgT3BlblNTTENvbnRleHRJbXBsIHNzbENvbnRleHQgPSBuZXcgT3BlblNTTENvbnRleHRJbXBsKCk7Ci0gICAgICAgICAgICBzc2xDb250ZXh0LmVuZ2luZUluaXQobnVsbCwgdHJ1c3RNYW5hZ2VycywgbnVsbCk7CisgICAgICAgICAgICBzc2xDb250ZXh0LmVuZ2luZUluaXQoa2V5TWFuYWdlcnMsIHRydXN0TWFuYWdlcnMsIG51bGwpOwogICAgICAgICAgICAgc3NsQ29udGV4dC5lbmdpbmVHZXRDbGllbnRTZXNzaW9uQ29udGV4dCgpLnNldFBlcnNpc3RlbnRDYWNoZShtU2Vzc2lvbkNhY2hlKTsKICAgICAgICAgICAgIHJldHVybiBzc2xDb250ZXh0LmVuZ2luZUdldFNvY2tldEZhY3RvcnkoKTsKICAgICAgICAgfSBjYXRjaCAoS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiBlKSB7CkBAIC0yMjMsMTggKzIyNyw0NCBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkJ5cGFzc2luZyBTU0wgc2VjdXJpdHkgY2hlY2tzIGF0IGNhbGxlcidzIHJlcXVlc3QiKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUluc2VjdXJlRmFjdG9yeSA9IG1ha2VTb2NrZXRGYWN0b3J5KElOU0VDVVJFX1RSVVNUX01BTkFHRVIpOworICAgICAgICAgICAgICAgIG1JbnNlY3VyZUZhY3RvcnkgPSBtYWtlU29ja2V0RmFjdG9yeShtS2V5TWFuYWdlcnMsIElOU0VDVVJFX1RSVVNUX01BTkFHRVIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1JbnNlY3VyZUZhY3Rvcnk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobVNlY3VyZUZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWN1cmVGYWN0b3J5ID0gbWFrZVNvY2tldEZhY3RvcnkobnVsbCk7CisgICAgICAgICAgICAgICAgbVNlY3VyZUZhY3RvcnkgPSBtYWtlU29ja2V0RmFjdG9yeShtS2V5TWFuYWdlcnMsIG1UcnVzdE1hbmFnZXJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBtU2VjdXJlRmFjdG9yeTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIHtAbGluayBUcnVzdE1hbmFnZXJ9cyB0byBiZSB1c2VkIGZvciBjb25uZWN0aW9ucyBtYWRlIGJ5IHRoaXMgZmFjdG9yeS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRydXN0TWFuYWdlcnMoVHJ1c3RNYW5hZ2VyW10gdHJ1c3RNYW5hZ2VyKSB7CisgICAgICAgIG1UcnVzdE1hbmFnZXJzID0gdHJ1c3RNYW5hZ2VyOworCisgICAgICAgIC8vIENsZWFyIG91dCBhbGwgY2FjaGVkIHNlY3VyZSBmYWN0b3JpZXMgc2luY2UgY29uZmlndXJhdGlvbnMgaGF2ZSBjaGFuZ2VkLgorICAgICAgICBtU2VjdXJlRmFjdG9yeSA9IG51bGw7CisgICAgICAgIC8vIE5vdGUgLSBpbnNlY3VyZSBmYWN0b3JpZXMgb25seSBldmVyIHVzZSB0aGUgSU5TRUNVUkVfVFJVU1RfTUFOQUdFUiBzbyB0aGV5IG5lZWQgbm90CisgICAgICAgIC8vIGJlIGNsZWFyZWQgb3V0IGhlcmUuCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUge0BsaW5rIEtleU1hbmFnZXJ9cyB0byBiZSB1c2VkIGZvciBjb25uZWN0aW9ucyBtYWRlIGJ5IHRoaXMgZmFjdG9yeS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleU1hbmFnZXJzKEtleU1hbmFnZXJbXSBrZXlNYW5hZ2VycykgeworICAgICAgICBtS2V5TWFuYWdlcnMgPSBrZXlNYW5hZ2VyczsKKworICAgICAgICAvLyBDbGVhciBvdXQgYW55IGV4aXN0aW5nIGNhY2hlZCBmYWN0b3JpZXMgc2luY2UgY29uZmlndXJhdGlvbnMgaGF2ZSBjaGFuZ2VkLgorICAgICAgICBtU2VjdXJlRmFjdG9yeSA9IG51bGw7CisgICAgICAgIG1JbnNlY3VyZUZhY3RvcnkgPSBudWxsOworICAgIH0KKworCisgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqCiAgICAgICogPHA+VGhpcyBtZXRob2QgdmVyaWZpZXMgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSBob3N0bmFtZSBhZnRlciBjb25uZWN0aW5nCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVHJhZmZpY1N0YXRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVHJhZmZpY1N0YXRzLmphdmEKaW5kZXggYzBmZjczNC4uOGFiNjRmYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1RyYWZmaWNTdGF0cy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9UcmFmZmljU3RhdHMuamF2YQpAQCAtMTQxLDcgKzE0MSw4IEBACiAKICAgICAgICAgICAgIC8vIHN1YnRyYWN0IHN0YXJ0aW5nIHZhbHVlcyBhbmQgcmV0dXJuIGRlbHRhCiAgICAgICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgcHJvZmlsaW5nU3RvcCA9IGdldE5ldHdvcmtTdGF0c0ZvclVpZChjb250ZXh0KTsKLSAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBwcm9maWxpbmdEZWx0YSA9IHByb2ZpbGluZ1N0b3Auc3VidHJhY3Qoc0FjdGl2ZVByb2ZpbGluZ1N0YXJ0KTsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBwcm9maWxpbmdEZWx0YSA9IHByb2ZpbGluZ1N0b3Auc3VidHJhY3QoCisgICAgICAgICAgICAgICAgICAgIHNBY3RpdmVQcm9maWxpbmdTdGFydCwgZmFsc2UpOwogICAgICAgICAgICAgc0FjdGl2ZVByb2ZpbGluZ1N0YXJ0ID0gbnVsbDsKICAgICAgICAgICAgIHJldHVybiBwcm9maWxpbmdEZWx0YTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvSHR0cFJlc3BvbnNlQ2FjaGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0h0dHBSZXNwb25zZUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkNjRlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0h0dHBSZXNwb25zZUNhY2hlLmphdmEKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0Lmh0dHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5DYWNoZVJlcXVlc3Q7CitpbXBvcnQgamF2YS5uZXQuQ2FjaGVSZXNwb25zZTsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5SZXNwb25zZUNhY2hlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb247CitpbXBvcnQgbGliY29yZS5pby5EaXNrTHJ1Q2FjaGU7CitpbXBvcnQgbGliY29yZS5pby5Jb1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudDsKKworLyoqCisgKiBDYWNoZXMgSFRUUCBhbmQgSFRUUFMgcmVzcG9uc2VzIHRvIHRoZSBmaWxlc3lzdGVtIHNvIHRoZXkgbWF5IGJlIHJldXNlZCwKKyAqIHNhdmluZyB0aW1lIGFuZCBiYW5kd2lkdGguIFRoaXMgY2xhc3Mgc3VwcG9ydHMge0BsaW5rIEh0dHBVUkxDb25uZWN0aW9ufSBhbmQKKyAqIHtAbGluayBIdHRwc1VSTENvbm5lY3Rpb259OyB0aGVyZSBpcyBubyBwbGF0Zm9ybS1wcm92aWRlZCBjYWNoZSBmb3Ige0BsaW5rCisgKiBEZWZhdWx0SHR0cENsaWVudH0gb3Ige0BsaW5rIEFuZHJvaWRIdHRwQ2xpZW50fS4KKyAqCisgKiA8aDM+SW5zdGFsbGluZyBhbiBIVFRQIHJlc3BvbnNlIGNhY2hlPC9oMz4KKyAqIEVuYWJsZSBjYWNoaW5nIG9mIGFsbCBvZiB5b3VyIGFwcGxpY2F0aW9uJ3MgSFRUUCByZXF1ZXN0cyBieSBpbnN0YWxsaW5nIHRoZQorICogY2FjaGUgYXQgYXBwbGljYXRpb24gc3RhcnR1cC4gRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBpbnN0YWxscyBhIDEwIE1pQiBjYWNoZQorICogaW4gdGhlIHtAbGluayBDb250ZXh0I2dldENhY2hlRGlyKCkgYXBwbGljYXRpb24tc3BlY2lmaWMgY2FjaGUgZGlyZWN0b3J5fSBvZgorICogdGhlIGZpbGVzeXN0ZW19OiA8cHJlPiAgIHtAY29kZQorICogICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgKiAgICAgICAuLi4KKyAqCisgKiAgICAgICB0cnkgeworICogICAgICAgICAgIEZpbGUgaHR0cENhY2hlRGlyID0gbmV3IEZpbGUoY29udGV4dC5nZXRDYWNoZURpcigpLCAiaHR0cCIpOworICogICAgICAgICAgIGxvbmcgaHR0cENhY2hlU2l6ZSA9IDEwICogMTAyNCAqIDEwMjQ7IC8vIDEwIE1pQgorICogICAgICAgICAgIEh0dHBSZXNwb25zZUNhY2hlLmluc3RhbGwoaHR0cENhY2hlRGlyLCBodHRwQ2FjaGVTaXplKTsKKyAqICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAqICAgICAgICAgICBMb2cuaShUQUcsICJIVFRQIHJlc3BvbnNlIGNhY2hlIGluc3RhbGxhdGlvbiBmYWlsZWQ6IiArIGUpOworICogICAgICAgfQorICogICB9CisgKgorICogICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CisgKiAgICAgICAuLi4KKyAqCisgKiAgICAgICBIdHRwUmVzcG9uc2VDYWNoZSBjYWNoZSA9IEh0dHBSZXNwb25zZUNhY2hlLmdldEluc3RhbGxlZCgpOworICogICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHsKKyAqICAgICAgICAgICBjYWNoZS5mbHVzaCgpOworICogICAgICAgfQorICogICB9fTwvcHJlPgorICogVGhpcyBjYWNoZSB3aWxsIGV2aWN0IGVudHJpZXMgYXMgbmVjZXNzYXJ5IHRvIGtlZXAgaXRzIHNpemUgZnJvbSBleGNlZWRpbmcKKyAqIDEwIE1pQi4gVGhlIGJlc3QgY2FjaGUgc2l6ZSBpcyBhcHBsaWNhdGlvbiBzcGVjaWZpYyBhbmQgZGVwZW5kcyBvbiB0aGUgc2l6ZQorICogYW5kIGZyZXF1ZW5jeSBvZiB0aGUgZmlsZXMgYmVpbmcgZG93bmxvYWRlZC4gSW5jcmVhc2luZyB0aGUgbGltaXQgbWF5IGltcHJvdmUKKyAqIHRoZSBoaXQgcmF0ZSwgYnV0IGl0IG1heSBhbHNvIGp1c3Qgd2FzdGUgZmlsZXN5c3RlbSBzcGFjZSEKKyAqCisgKiA8cD5Gb3Igc29tZSBhcHBsaWNhdGlvbnMgaXQgbWF5IGJlIHByZWZlcmFibGUgdG8gY3JlYXRlIHRoZSBjYWNoZSBpbiB0aGUKKyAqIGV4dGVybmFsIHN0b3JhZ2UgZGlyZWN0b3J5LiBBbHRob3VnaCBpdCBvZnRlbiBoYXMgbW9yZSBmcmVlIHNwYWNlLCBleHRlcm5hbAorICogc3RvcmFnZSBpcyBvcHRpb25hbCBhbmQmIzgyMTI7ZXZlbiBpZiBhdmFpbGFibGUmIzgyMTI7Y2FuIGRpc2FwcGVhciBkdXJpbmcKKyAqIHVzZS4gUmV0cmlldmUgdGhlIGV4dGVybmFsIGNhY2hlIGRpcmVjdG9yeSB1c2luZyB7QGxpbmsgQ29udGV4dCNnZXRFeHRlcm5hbENhY2hlRGlyKCl9LiBJZiB0aGlzIG1ldGhvZAorICogcmV0dXJucyBudWxsLCB5b3VyIGFwcGxpY2F0aW9uIHNob3VsZCBmYWxsIGJhY2sgdG8gZWl0aGVyIG5vdCBjYWNoaW5nIG9yCisgKiBjYWNoaW5nIG9uIG5vbi1leHRlcm5hbCBzdG9yYWdlLiBJZiB0aGUgZXh0ZXJuYWwgc3RvcmFnZSBpcyByZW1vdmVkIGR1cmluZworICogdXNlLCB0aGUgY2FjaGUgaGl0IHJhdGUgd2lsbCBkcm9wIHRvIHplcm8gYW5kIG9uZ29pbmcgY2FjaGUgcmVhZHMgd2lsbCBmYWlsLgorICoKKyAqIDxwPkZsdXNoaW5nIHRoZSBjYWNoZSBmb3JjZXMgaXRzIGRhdGEgdG8gdGhlIGZpbGVzeXN0ZW0uIFRoaXMgZW5zdXJlcyB0aGF0CisgKiBhbGwgcmVzcG9uc2VzIHdyaXR0ZW4gdG8gdGhlIGNhY2hlIHdpbGwgYmUgcmVhZGFibGUgdGhlIG5leHQgdGltZSB0aGUKKyAqIGFjdGl2aXR5IHN0YXJ0cy4KKyAqCisgKiA8aDM+Q2FjaGUgT3B0aW1pemF0aW9uPC9oMz4KKyAqIFRvIG1lYXN1cmUgY2FjaGUgZWZmZWN0aXZlbmVzcywgdGhpcyBjbGFzcyB0cmFja3MgdGhyZWUgc3RhdGlzdGljczoKKyAqIDx1bD4KKyAqICAgICA8bGk+PHN0cm9uZz57QGxpbmsgI2dldFJlcXVlc3RDb3VudCgpIFJlcXVlc3QgQ291bnQ6fTwvc3Ryb25nPiB0aGUgbnVtYmVyCisgKiAgICAgICAgIG9mIEhUVFAgcmVxdWVzdHMgaXNzdWVkIHNpbmNlIHRoaXMgY2FjaGUgd2FzIGNyZWF0ZWQuCisgKiAgICAgPGxpPjxzdHJvbmc+e0BsaW5rICNnZXROZXR3b3JrQ291bnQoKSBOZXR3b3JrIENvdW50On08L3N0cm9uZz4gdGhlCisgKiAgICAgICAgIG51bWJlciBvZiB0aG9zZSByZXF1ZXN0cyB0aGF0IHJlcXVpcmVkIG5ldHdvcmsgdXNlLgorICogICAgIDxsaT48c3Ryb25nPntAbGluayAjZ2V0SGl0Q291bnQoKSBIaXQgQ291bnQ6fTwvc3Ryb25nPiB0aGUgbnVtYmVyIG9mCisgKiAgICAgICAgIHRob3NlIHJlcXVlc3RzIHdob3NlIHJlc3BvbnNlcyB3ZXJlIHNlcnZlZCBieSB0aGUgY2FjaGUuCisgKiA8L3VsPgorICogU29tZXRpbWVzIGEgcmVxdWVzdCB3aWxsIHJlc3VsdCBpbiBhIGNvbmRpdGlvbmFsIGNhY2hlIGhpdC4gSWYgdGhlIGNhY2hlCisgKiBjb250YWlucyBhIHN0YWxlIGNvcHkgb2YgdGhlIHJlc3BvbnNlLCB0aGUgY2xpZW50IHdpbGwgaXNzdWUgYSBjb25kaXRpb25hbAorICoge0Bjb2RlIEdFVH0uIFRoZSBzZXJ2ZXIgd2lsbCB0aGVuIHNlbmQgZWl0aGVyIHRoZSB1cGRhdGVkIHJlc3BvbnNlIGlmIGl0IGhhcworICogY2hhbmdlZCwgb3IgYSBzaG9ydCAnbm90IG1vZGlmaWVkJyByZXNwb25zZSBpZiB0aGUgY2xpZW50J3MgY29weSBpcyBzdGlsbAorICogdmFsaWQuIFN1Y2ggcmVzcG9uc2VzIGluY3JlbWVudCBib3RoIHRoZSBuZXR3b3JrIGNvdW50IGFuZCBoaXQgY291bnQuCisgKgorICogPHA+VGhlIGJlc3Qgd2F5IHRvIGltcHJvdmUgdGhlIGNhY2hlIGhpdCByYXRlIGlzIGJ5IGNvbmZpZ3VyaW5nIHRoZSB3ZWIKKyAqIHNlcnZlciB0byByZXR1cm4gY2FjaGVhYmxlIHJlc3BvbnNlcy4gQWx0aG91Z2ggdGhpcyBjbGllbnQgaG9ub3JzIGFsbCA8YQorICogaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjYxNi50eHQiPkhUVFAvMS4xIChSRkMgMjA2OCk8L2E+IGNhY2hlCisgKiBoZWFkZXJzLCBpdCBkb2Vzbid0IGNhY2hlIHBhcnRpYWwgcmVzcG9uc2VzLgorICoKKyAqIDxoMz5Gb3JjZSBhIE5ldHdvcmsgUmVzcG9uc2U8L2gzPgorICogSW4gc29tZSBzaXR1YXRpb25zLCBzdWNoIGFzIGFmdGVyIGEgdXNlciBjbGlja3MgYSAncmVmcmVzaCcgYnV0dG9uLCBpdCBtYXkgYmUKKyAqIG5lY2Vzc2FyeSB0byBza2lwIHRoZSBjYWNoZSwgYW5kIGZldGNoIGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgc2VydmVyLiBUbyBmb3JjZQorICogYSBmdWxsIHJlZnJlc2gsIGFkZCB0aGUge0Bjb2RlIG5vLWNhY2hlfSBkaXJlY3RpdmU6IDxwcmU+ICAge0Bjb2RlCisgKiAgICAgICAgIGNvbm5lY3Rpb24uYWRkUmVxdWVzdFByb3BlcnR5KCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlIik7CisgKiB9PC9wcmU+CisgKiBJZiBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byBmb3JjZSBhIGNhY2hlZCByZXNwb25zZSB0byBiZSB2YWxpZGF0ZWQgYnkgdGhlCisgKiBzZXJ2ZXIsIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQge0Bjb2RlIG1heC1hZ2U9MH0gaW5zdGVhZDogPHByZT4gICB7QGNvZGUKKyAqICAgICAgICAgY29ubmVjdGlvbi5hZGRSZXF1ZXN0UHJvcGVydHkoIkNhY2hlLUNvbnRyb2wiLCAibWF4LWFnZT0wIik7CisgKiB9PC9wcmU+CisgKgorICogPGgzPkZvcmNlIGEgQ2FjaGUgUmVzcG9uc2U8L2gzPgorICogU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIHNob3cgcmVzb3VyY2VzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseSwKKyAqIGJ1dCBub3Qgb3RoZXJ3aXNlLiBUaGlzIGNhbiBiZSB1c2VkIHNvIHlvdXIgYXBwbGljYXRpb24gY2FuIHNob3cKKyAqIDxpPnNvbWV0aGluZzwvaT4gd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxhdGVzdCBkYXRhIHRvIGJlIGRvd25sb2FkZWQuIFRvCisgKiByZXN0cmljdCBhIHJlcXVlc3QgdG8gbG9jYWxseS1jYWNoZWQgcmVzb3VyY2VzLCBhZGQgdGhlIHtAY29kZQorICogb25seS1pZi1jYWNoZWR9IGRpcmVjdGl2ZTogPHByZT4gICB7QGNvZGUKKyAqICAgICB0cnkgeworICogICAgICAgICBjb25uZWN0aW9uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiQ2FjaGUtQ29udHJvbCIsICJvbmx5LWlmLWNhY2hlZCIpOworICogICAgICAgICBJbnB1dFN0cmVhbSBjYWNoZWQgPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7CisgKiAgICAgICAgIC8vIHRoZSByZXNvdXJjZSB3YXMgY2FjaGVkISBzaG93IGl0CisgKiAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAqICAgICAgICAgLy8gdGhlIHJlc291cmNlIHdhcyBub3QgY2FjaGVkCisgKiAgICAgfQorICogfTwvcHJlPgorICogVGhpcyB0ZWNobmlxdWUgd29ya3MgZXZlbiBiZXR0ZXIgaW4gc2l0dWF0aW9ucyB3aGVyZSBhIHN0YWxlIHJlc3BvbnNlIGlzCisgKiBiZXR0ZXIgdGhhbiBubyByZXNwb25zZS4gVG8gcGVybWl0IHN0YWxlIGNhY2hlZCByZXNwb25zZXMsIHVzZSB0aGUge0Bjb2RlCisgKiBtYXgtc3RhbGV9IGRpcmVjdGl2ZSB3aXRoIHRoZSBtYXhpbXVtIHN0YWxlbmVzcyBpbiBzZWNvbmRzOiA8cHJlPiAgIHtAY29kZQorICogICAgICAgICBpbnQgbWF4U3RhbGUgPSA2MCAqIDYwICogMjQgKiAyODsgLy8gdG9sZXJhdGUgNC13ZWVrcyBzdGFsZQorICogICAgICAgICBjb25uZWN0aW9uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiQ2FjaGUtQ29udHJvbCIsICJtYXgtc3RhbGU9IiArIG1heFN0YWxlKTsKKyAqIH08L3ByZT4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEh0dHBSZXNwb25zZUNhY2hlIGV4dGVuZHMgUmVzcG9uc2VDYWNoZSBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIGxpYmNvcmUubmV0Lmh0dHAuSHR0cFJlc3BvbnNlQ2FjaGUgZGVsZWdhdGU7CisKKyAgICBwcml2YXRlIEh0dHBSZXNwb25zZUNhY2hlKEZpbGUgZGlyZWN0b3J5LCBsb25nIG1heFNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBuZXcgbGliY29yZS5uZXQuaHR0cC5IdHRwUmVzcG9uc2VDYWNoZShkaXJlY3RvcnksIG1heFNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseS1pbnN0YWxsZWQge0Bjb2RlIEh0dHBSZXNwb25zZUNhY2hlfSwgb3IgbnVsbCBpZgorICAgICAqIHRoZXJlIGlzIG5vIGNhY2hlIGluc3RhbGxlZCBvciBpdCBpcyBub3QgYSB7QGNvZGUgSHR0cFJlc3BvbnNlQ2FjaGV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlQ2FjaGUgZ2V0SW5zdGFsbGVkKCkgeworICAgICAgICBSZXNwb25zZUNhY2hlIGluc3RhbGxlZCA9IFJlc3BvbnNlQ2FjaGUuZ2V0RGVmYXVsdCgpOworICAgICAgICByZXR1cm4gaW5zdGFsbGVkIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQ2FjaGUgPyAoSHR0cFJlc3BvbnNlQ2FjaGUpIGluc3RhbGxlZCA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBIVFRQIHJlc3BvbnNlIGNhY2hlIGFuZCB7QGxpbmsgUmVzcG9uc2VDYWNoZSNzZXREZWZhdWx0CisgICAgICogc2V0cyBpdH0gYXMgdGhlIHN5c3RlbSBkZWZhdWx0IGNhY2hlLgorICAgICAqCisgICAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgZGlyZWN0b3J5IHRvIGhvbGQgY2FjaGUgZGF0YS4KKyAgICAgKiBAcGFyYW0gbWF4U2l6ZSB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseS1pbnN0YWxsZWQgY2FjaGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHtAY29kZSBkaXJlY3Rvcnl9IGNhbm5vdCBiZSB1c2VkIGZvciB0aGlzIGNhY2hlLgorICAgICAqICAgICBNb3N0IGFwcGxpY2F0aW9ucyBzaG91bGQgcmVzcG9uZCB0byB0aGlzIGV4Y2VwdGlvbiBieSBsb2dnaW5nIGEKKyAgICAgKiAgICAgd2FybmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBSZXNwb25zZUNhY2hlIGluc3RhbGwoRmlsZSBkaXJlY3RvcnksIGxvbmcgbWF4U2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFJlc3BvbnNlQ2FjaGUgaW5zdGFsbGVkID0gZ2V0SW5zdGFsbGVkKCk7CisgICAgICAgIGlmIChpbnN0YWxsZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZG9uJ3QgY2xvc2UgYW5kIHJlb3BlbiBpZiBhbiBlcXVpdmFsZW50IGNhY2hlIGlzIGFscmVhZHkgaW5zdGFsbGVkCisgICAgICAgICAgICBEaXNrTHJ1Q2FjaGUgaW5zdGFsbGVkQ2FjaGUgPSBpbnN0YWxsZWQuZGVsZWdhdGUuZ2V0Q2FjaGUoKTsKKyAgICAgICAgICAgIGlmIChpbnN0YWxsZWRDYWNoZS5nZXREaXJlY3RvcnkoKS5lcXVhbHMoZGlyZWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0YWxsZWRDYWNoZS5tYXhTaXplKCkgPT0gbWF4U2l6ZQorICAgICAgICAgICAgICAgICAgICAmJiAhaW5zdGFsbGVkQ2FjaGUuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIElvVXRpbHMuY2xvc2VRdWlldGx5KGluc3RhbGxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBIdHRwUmVzcG9uc2VDYWNoZSByZXN1bHQgPSBuZXcgSHR0cFJlc3BvbnNlQ2FjaGUoZGlyZWN0b3J5LCBtYXhTaXplKTsKKyAgICAgICAgUmVzcG9uc2VDYWNoZS5zZXREZWZhdWx0KHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBDYWNoZVJlc3BvbnNlIGdldChVUkkgdXJpLCBTdHJpbmcgcmVxdWVzdE1ldGhvZCwKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVxdWVzdEhlYWRlcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXQodXJpLCByZXF1ZXN0TWV0aG9kLCByZXF1ZXN0SGVhZGVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBDYWNoZVJlcXVlc3QgcHV0KFVSSSB1cmksIFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnB1dCh1cmksIHVybENvbm5lY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgYmVpbmcgdXNlZCB0byBzdG9yZSB0aGUgdmFsdWVzIGluCisgICAgICogdGhpcyBjYWNoZS4gVGhpcyBtYXkgYmUgZ3JlYXRlciB0aGFuIHRoZSB7QGxpbmsgI21heFNpemV9IGlmIGEgYmFja2dyb3VuZAorICAgICAqIGRlbGV0aW9uIGlzIHBlbmRpbmcuCisgICAgICovCisgICAgcHVibGljIGxvbmcgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENhY2hlKCkuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhpcyBjYWNoZSBzaG91bGQgdXNlIHRvIHN0b3JlCisgICAgICogaXRzIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGxvbmcgbWF4U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENhY2hlKCkubWF4U2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlIGJ1ZmZlcmVkIG9wZXJhdGlvbnMgdG8gdGhlIGZpbGVzeXN0ZW0uIFRoaXMgZW5zdXJlcyB0aGF0IHJlc3BvbnNlcworICAgICAqIHdyaXR0ZW4gdG8gdGhlIGNhY2hlIHdpbGwgYmUgYXZhaWxhYmxlIHRoZSBuZXh0IHRpbWUgdGhlIGNhY2hlIGlzIG9wZW5lZCwKKyAgICAgKiBldmVuIGlmIHRoaXMgcHJvY2VzcyBpcyBraWxsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWxlZ2F0ZS5nZXRDYWNoZSgpLmZsdXNoKCk7IC8vIFRPRE86IGZpeCBmbHVzaCgpIHRvIG5vdCB0aHJvdz8KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIEhUVFAgcmVxdWVzdHMgdGhhdCByZXF1aXJlZCB0aGUgbmV0d29yayB0byBlaXRoZXIKKyAgICAgKiBzdXBwbHkgYSByZXNwb25zZSBvciB2YWxpZGF0ZSBhIGxvY2FsbHkgY2FjaGVkIHJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TmV0d29ya0NvdW50KCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TmV0d29ya0NvdW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIEhUVFAgcmVxdWVzdHMgd2hvc2UgcmVzcG9uc2Ugd2FzIHByb3ZpZGVkIGJ5IHRoZQorICAgICAqIGNhY2hlLiBUaGlzIG1heSBpbmNsdWRlIGNvbmRpdGlvbmFsIHtAY29kZSBHRVR9IHJlcXVlc3RzIHRoYXQgd2VyZQorICAgICAqIHZhbGlkYXRlZCBvdmVyIHRoZSBuZXR3b3JrLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SGl0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRIaXRDb3VudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBIVFRQIHJlcXVlc3RzIHRoYXQgd2VyZSBtYWRlLiBUaGlzIGluY2x1ZGVzCisgICAgICogYm90aCBjbGllbnQgcmVxdWVzdHMgYW5kIHJlcXVlc3RzIHRoYXQgd2VyZSBtYWRlIG9uIHRoZSBjbGllbnQncyBiZWhhbGYKKyAgICAgKiB0byBoYW5kbGUgYSByZWRpcmVjdHMgYW5kIHJldHJpZXMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRSZXF1ZXN0Q291bnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmluc3RhbGxzIHRoZSBjYWNoZSBhbmQgcmVsZWFzZXMgYW55IGFjdGl2ZSByZXNvdXJjZXMuIFN0b3JlZCBjb250ZW50cworICAgICAqIHdpbGwgcmVtYWluIG9uIHRoZSBmaWxlc3lzdGVtLgorICAgICAqLworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChSZXNwb25zZUNhY2hlLmdldERlZmF1bHQoKSA9PSB0aGlzKSB7CisgICAgICAgICAgICBSZXNwb25zZUNhY2hlLnNldERlZmF1bHQobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZWdhdGUuZ2V0Q2FjaGUoKS5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuaW5zdGFsbHMgdGhlIGNhY2hlIGFuZCBkZWxldGVzIGFsbCBvZiBpdHMgc3RvcmVkIGNvbnRlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChSZXNwb25zZUNhY2hlLmdldERlZmF1bHQoKSA9PSB0aGlzKSB7CisgICAgICAgICAgICBSZXNwb25zZUNhY2hlLnNldERlZmF1bHQobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZWdhdGUuZ2V0Q2FjaGUoKS5kZWxldGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvRXJyb3JDb2Rlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0Vycm9yQ29kZXMuamF2YQppbmRleCA2OTMyOWRmLi4zYWRjZGMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvRXJyb3JDb2Rlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy9FcnJvckNvZGVzLmphdmEKQEAgLTU3LDYgKzU3LDcgQEAKICAgICAgICAgICAgIGNhc2UgRVJST1JfU0VfQUxSRUFEWV9TRUxFQ1RFRDogcmV0dXJuICJTRV9BTFJFQURZX1NFTEVDVEVEIjsKICAgICAgICAgICAgIGNhc2UgRVJST1JfU0VfQ09OTkVDVEVEOiByZXR1cm4gIlNFX0NPTk5FQ1RFRCI7CiAgICAgICAgICAgICBjYXNlIEVSUk9SX05PX1NFX0NPTk5FQ1RFRDogcmV0dXJuICJOT19TRV9DT05ORUNURUQiOworICAgICAgICAgICAgY2FzZSBFUlJPUl9OT1RfU1VQUE9SVEVEOiByZXR1cm4gIk5PVF9TVVBQT1JURUQiOwogICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVTktOT1dOIEVSUk9SIjsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNSw0ICsxMDYsNiBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTk9fU0VfQ09OTkVDVEVEID0gLTIwOwogCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX05PVF9TVVBQT1JURUQgPSAtMjE7CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9OZGVmUmVjb3JkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvTmRlZlJlY29yZC5qYXZhCmluZGV4IDc0NmQzZGYuLmZlMjE1ZmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9OZGVmUmVjb3JkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL05kZWZSZWNvcmQuamF2YQpAQCAtMTYzLDYgKzE2MywxOCBAQAogICAgICAqICAgICAgICAgICAgICAgIG11c3Qgbm90IGJlIG51bGwKICAgICAgKi8KICAgICBwdWJsaWMgTmRlZlJlY29yZChzaG9ydCB0bmYsIGJ5dGVbXSB0eXBlLCBieXRlW10gaWQsIGJ5dGVbXSBwYXlsb2FkKSB7CisgICAgICAgIC8qIE5ldyBOREVGIHJlY29yZHMgY3JlYXRlZCBieSBhcHBsaWNhdGlvbnMgd2lsbCBoYXZlIEZMQUdfTUJ8RkxBR19NRQorICAgICAgICAgKiBzZXQgYnkgZGVmYXVsdDsgd2hlbiBtdWx0aXBsZSByZWNvcmRzIGFyZSBzdG9yZWQgaW4gYQorICAgICAgICAgKiB7QGxpbmsgTmRlZk1lc3NhZ2V9LCB0aGVzZSBmbGFncyB3aWxsIGJlIGNvcnJlY3RlZCB3aGVuIHRoZSB7QGxpbmsgTmRlZk1lc3NhZ2V9CisgICAgICAgICAqIGlzIHNlcmlhbGl6ZWQgdG8gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICB0aGlzKHRuZiwgdHlwZSwgaWQsIHBheWxvYWQsIChieXRlKShGTEFHX01CfEZMQUdfTUUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIC8qcGFja2FnZSovIE5kZWZSZWNvcmQoc2hvcnQgdG5mLCBieXRlW10gdHlwZSwgYnl0ZVtdIGlkLCBieXRlW10gcGF5bG9hZCwgYnl0ZSBmbGFncykgewogICAgICAgICAvKiBjaGVjayBhcmd1bWVudHMgKi8KICAgICAgICAgaWYgKCh0eXBlID09IG51bGwpIHx8IChpZCA9PSBudWxsKSB8fCAocGF5bG9hZCA9PSBudWxsKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBudWxsIGFyZ3VtZW50Iik7CkBAIC0xNzIsOSArMTg0LDYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRORiBvdXQgb2YgcmFuZ2UgIiArIHRuZik7CiAgICAgICAgIH0KIAotICAgICAgICAvKiBnZW5lcmF0ZSBmbGFnICovCi0gICAgICAgIGJ5dGUgZmxhZ3MgPSBGTEFHX01CIHwgRkxBR19NRTsKLQogICAgICAgICAvKiBEZXRlcm1pbmUgaWYgaXQgaXMgYSBzaG9ydCByZWNvcmQgKi8KICAgICAgICAgaWYocGF5bG9hZC5sZW5ndGggPCAweEZGKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1NSOwpAQCAtMjU4LDYgKzI2Nyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUZsYWdzKTsKICAgICAgICAgZGVzdC53cml0ZUludChtVG5mKTsKICAgICAgICAgZGVzdC53cml0ZUludChtVHlwZS5sZW5ndGgpOwogICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KG1UeXBlKTsKQEAgLTI3MCw2ICsyODAsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPE5kZWZSZWNvcmQ+IENSRUFUT1IgPQogICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxOZGVmUmVjb3JkPigpIHsKICAgICAgICAgcHVibGljIE5kZWZSZWNvcmQgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIGJ5dGUgZmxhZ3MgPSAoYnl0ZSlpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICBzaG9ydCB0bmYgPSAoc2hvcnQpaW4ucmVhZEludCgpOwogICAgICAgICAgICAgaW50IHR5cGVMZW5ndGggPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICBieXRlW10gdHlwZSA9IG5ldyBieXRlW3R5cGVMZW5ndGhdOwpAQCAtMjgxLDcgKzI5Miw3IEBACiAgICAgICAgICAgICBieXRlW10gcGF5bG9hZCA9IG5ldyBieXRlW3BheWxvYWRMZW5ndGhdOwogICAgICAgICAgICAgaW4ucmVhZEJ5dGVBcnJheShwYXlsb2FkKTsKIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBOZGVmUmVjb3JkKHRuZiwgdHlwZSwgaWQsIHBheWxvYWQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBOZGVmUmVjb3JkKHRuZiwgdHlwZSwgaWQsIHBheWxvYWQsIGZsYWdzKTsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgTmRlZlJlY29yZFtdIG5ld0FycmF5KGludCBzaXplKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IE5kZWZSZWNvcmRbc2l6ZV07CkBAIC0yOTAsNCArMzAxLDQgQEAKIAogICAgIHByaXZhdGUgbmF0aXZlIGludCBwYXJzZU5kZWZSZWNvcmQoYnl0ZVtdIGRhdGEpOwogICAgIHByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZW5lcmF0ZShzaG9ydCBmbGFncywgc2hvcnQgdG5mLCBieXRlW10gdHlwZSwgYnl0ZVtdIGlkLCBieXRlW10gZGF0YSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvQmFzaWNUYWdUZWNobm9sb2d5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9CYXNpY1RhZ1RlY2hub2xvZ3kuamF2YQppbmRleCA3ZWM4MDdhLi42NTU3ZWUwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9CYXNpY1RhZ1RlY2hub2xvZ3kuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9CYXNpY1RhZ1RlY2hub2xvZ3kuamF2YQpAQCAtNzcsNiArNzcsMTAgQEAKICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGlzIGluIHRoZSB0YWcgb2JqZWN0CiAgICAgICAgICAgICAgICAgbVRhZy5zZXRDb25uZWN0ZWRUZWNobm9sb2d5KG1TZWxlY3RlZFRlY2hub2xvZ3kpOwogICAgICAgICAgICAgICAgIG1Jc0Nvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yQ29kZSA9PSBFcnJvckNvZGVzLkVSUk9SX05PVF9TVVBQT1JURUQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNvbm5lY3RpbmcgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyB0ZWNobm9sb2d5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIE5GQyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJhZGFwdGVyLiIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL01pZmFyZUNsYXNzaWMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL01pZmFyZUNsYXNzaWMuamF2YQppbmRleCA5YTJmMmJkLi5jNGI3NzE4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9NaWZhcmVDbGFzc2ljLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTWlmYXJlQ2xhc3NpYy5qYXZhCkBAIC04MiwxMiArODIsMTIgQEAKICAgICAgICAgICAgIHsoYnl0ZSkweEEwLChieXRlKTB4QTEsKGJ5dGUpMHhBMiwoYnl0ZSkweEEzLChieXRlKTB4QTQsKGJ5dGUpMHhBNX07CiAgICAgLyoqCiAgICAgICogVGhlIHdlbGwta25vd24ga2V5IGZvciB0YWdzIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICogTkRFRiBvbiBNaWZhcmUgQ2xhc3NpYyBzcGVjaWZpY2F0aW9uLgorICAgICAqIE5ERUYgb24gTUlGQVJFIENsYXNzaWMgc3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBLRVlfTkZDX0ZPUlVNID0KICAgICAgICAgICAgIHsoYnl0ZSkweEQzLChieXRlKTB4RjcsKGJ5dGUpMHhEMywoYnl0ZSkweEY3LChieXRlKTB4RDMsKGJ5dGUpMHhGN307CiAKLSAgICAvKiogQSBNaWZhcmUgQ2xhc3NpYyBjb21wYXRpYmxlIGNhcmQgb2YgdW5rbm93biB0eXBlICovCisgICAgLyoqIEEgTUlGQVJFIENsYXNzaWMgY29tcGF0aWJsZSBjYXJkIG9mIHVua25vd24gdHlwZSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVU5LTk9XTiA9IC0xOwogICAgIC8qKiBBIE1JRkFSRSBDbGFzc2ljIHRhZyAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ0xBU1NJQyA9IDA7CkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICBwdWJsaWMgTWlmYXJlQ2xhc3NpYyhUYWcgdGFnKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIodGFnLCBUYWdUZWNobm9sb2d5Lk1JRkFSRV9DTEFTU0lDKTsKIAotICAgICAgICBOZmNBIGEgPSBOZmNBLmdldCh0YWcpOyAgLy8gTWlmYXJlIENsYXNzaWMgaXMgYWx3YXlzIGJhc2VkIG9uIE5GQyBhCisgICAgICAgIE5mY0EgYSA9IE5mY0EuZ2V0KHRhZyk7ICAvLyBNSUZBUkUgQ2xhc3NpYyBpcyBhbHdheXMgYmFzZWQgb24gTkZDIGEKIAogICAgICAgICBtSXNFbXVsYXRlZCA9IGZhbHNlOwogCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgICAgIC8vIFN0YWNrIGluY29ycmVjdGx5IHJlcG9ydGVkIGEgTWlmYXJlQ2xhc3NpYy4gV2UgY2Fubm90IGhhbmRsZSB0aGlzCiAgICAgICAgICAgICAvLyBncmFjZWZ1bGx5IC0gd2UgaGF2ZSBubyBpZGVhIG9mIHRoZSBtZW1vcnkgbGF5b3V0LiBCYWlsLgogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUYWcgaW5jb3JyZWN0bHkgZW51bWVyYXRlZCBhcyBNaWZhcmUgQ2xhc3NpYywgU0FLID0gIiArIGEuZ2V0U2FrKCkpOworICAgICAgICAgICAgICAgICAgICAiVGFnIGluY29ycmVjdGx5IGVudW1lcmF0ZWQgYXMgTUlGQVJFIENsYXNzaWMsIFNBSyA9ICIgKyBhLmdldFNhaygpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjIxLDggKzIyMSw4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFnIGlzIGVtdWxhdGVkLCBkZXRlcm1pbmVkIGF0IGRpc2NvdmVyeSB0aW1lLgotICAgICAqIFRoZXNlIGFyZSBhY3R1YWxseSBzbWFydC1jYXJkcyB0aGF0IGVtdWxhdGUgYSBNaWZhcmUgQ2xhc3NpYyBpbnRlcmZhY2UuCi0gICAgICogVGhleSBjYW4gYmUgdHJlYXRlZCBpZGVudGljYWxseSB0byBhIE1pZmFyZSBDbGFzc2ljIHRhZy4KKyAgICAgKiBUaGVzZSBhcmUgYWN0dWFsbHkgc21hcnQtY2FyZHMgdGhhdCBlbXVsYXRlIGEgTUlGQVJFIENsYXNzaWMgaW50ZXJmYWNlLgorICAgICAqIFRoZXkgY2FuIGJlIHRyZWF0ZWQgaWRlbnRpY2FsbHkgdG8gYSBNSUZBUkUgQ2xhc3NpYyB0YWcuCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtdWxhdGVkKCkgewpAQCAtNTcxLDggKzU3MSw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVNlY3RvcihpbnQgc2VjdG9yKSB7CiAgICAgICAgIC8vIERvIG5vdCBiZSB0b28gc3RyaWN0IG9uIHVwcGVyIGJvdW5kcyBjaGVja2luZywgc2luY2Ugc29tZSBjYXJkcwogICAgICAgICAvLyBoYXZlIG1vcmUgYWRkcmVzc2FibGUgbWVtb3J5IHRoYW4gdGhleSByZXBvcnQuIEZvciBleGFtcGxlLAotICAgICAgICAvLyBNaWZhcmUgUGx1cyAyayBjYXJkcyB3aWxsIGFwcGVhciBhcyBNaWZhcmUgQ2xhc3NpYyAxayBjYXJkcyB3aGVuIGluCi0gICAgICAgIC8vIE1pZmFyZSBDbGFzc2ljIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICAgICAgLy8gTUlGQVJFIFBsdXMgMmsgY2FyZHMgd2lsbCBhcHBlYXIgYXMgTUlGQVJFIENsYXNzaWMgMWsgY2FyZHMgd2hlbiBpbgorICAgICAgICAvLyBNSUZBUkUgQ2xhc3NpYyBjb21wYXRpYmlsaXR5IG1vZGUuCiAgICAgICAgIC8vIE5vdGUgdGhhdCBpc3N1aW5nIGEgY29tbWFuZCB0byBhbiBvdXQtb2YtYm91bmRzIGJsb2NrIGlzIHNhZmUgLSB0aGUKICAgICAgICAgLy8gdGFnIHNob3VsZCByZXBvcnQgZXJyb3IgY2F1c2luZyBJT0V4Y2VwdGlvbi4gVGhpcyB2YWxpZGF0aW9uIGlzIGEKICAgICAgICAgLy8gaGVscGVyIHRvIGd1YXJkIGFnYWluc3Qgb2J2aW91cyBwcm9ncmFtbWluZyBtaXN0YWtlcy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL01pZmFyZVVsdHJhbGlnaHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL01pZmFyZVVsdHJhbGlnaHQuamF2YQppbmRleCA4N2M4ZDk5Li42YzI3NTRiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9NaWZhcmVVbHRyYWxpZ2h0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTWlmYXJlVWx0cmFsaWdodC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLm5mYy5UYWc7CiBpbXBvcnQgYW5kcm9pZC5uZmMuVGFnTG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC02OSw2ICs3MCw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5YUF9NQU5VRkFDVFVSRVJfSUQgPSAweDA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUEFHRV9DT1VOVCA9IDI1NjsKIAorICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lTX1VMX0MgPSAiaXN1bGMiOworCiAgICAgcHJpdmF0ZSBpbnQgbVR5cGU7CiAKICAgICAvKioKQEAgLTk1LDE2ICs5OSwxOCBAQAogICAgIHB1YmxpYyBNaWZhcmVVbHRyYWxpZ2h0KFRhZyB0YWcpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBzdXBlcih0YWcsIFRhZ1RlY2hub2xvZ3kuTUlGQVJFX1VMVFJBTElHSFQpOwogCi0gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgY291bGQgYWN0dWFsbHkgYmUgYSBNaWZhcmUKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjb3VsZCBhY3R1YWxseSBiZSBhIE1JRkFSRQogICAgICAgICBOZmNBIGEgPSBOZmNBLmdldCh0YWcpOwogCiAgICAgICAgIG1UeXBlID0gVFlQRV9VTktOT1dOOwogCiAgICAgICAgIGlmIChhLmdldFNhaygpID09IDB4MDAgJiYgdGFnLmdldElkKClbMF0gPT0gTlhQX01BTlVGQUNUVVJFUl9JRCkgewotICAgICAgICAgICAgLy8gY291bGQgYmUgVUwgb3IgVUwtQwotICAgICAgICAgICAgLy9UT0RPOiBzdGFjayBzaG91bGQgdXNlIE5YUCBBTjEzMDMgcHJvY2VkdXJlIHRvIG1ha2UgYSBiZXN0IGd1ZXNzCi0gICAgICAgICAgICAvLyBhdHRlbXB0IGF0IGNsYXNzaWZ5aW5nIFVsdHJhbGlnaHQgdnMgVWx0cmFsaWdodCBDLgotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX1VMVFJBTElHSFQ7CisgICAgICAgICAgICBCdW5kbGUgZXh0cmFzID0gdGFnLmdldFRlY2hFeHRyYXMoVGFnVGVjaG5vbG9neS5NSUZBUkVfVUxUUkFMSUdIVCk7CisgICAgICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oRVhUUkFfSVNfVUxfQykpIHsKKyAgICAgICAgICAgICAgICBtVHlwZSA9IFRZUEVfVUxUUkFMSUdIVF9DOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVHlwZSA9IFRZUEVfVUxUUkFMSUdIVDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKaW5kZXggOWFjY2Y5OS4uZDdiYmFiNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCkBAIC0yMzMsNiArMjMzLDE2IEBACiAgICAgICAgIAogICAgICAgICAvKioKICAgICAgICAgICogQ3VycmVudCBkZXZlbG9wbWVudCB2ZXJzaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5VcGRhdGUgdG8gSG9uZXljb21iIE1SMSB0byBzdXBwb3J0IDcgaW5jaCB0YWJsZXRzLCBpbXByb3ZlCisgICAgICAgICAqIHNjcmVlbiBjb21wYXRpYmlsaXR5IG1vZGUsIGV0Yy48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPkFzIG9mIHRoaXMgdmVyc2lvbiwgYXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgc2F5IHdoZXRoZXIgdGhleQorICAgICAgICAgKiBzdXBwb3J0IFhMQVJHRSBzY3JlZW5zIHdpbGwgYmUgYXNzdW1lZCB0byBkbyBzbyBvbmx5IGlmIHRoZXkgdGFyZ2V0CisgICAgICAgICAqIHtAbGluayAjSE9ORVlDT01CfSBvciBsYXRlcjsgaXQgaGFkIGJlZW4ge0BsaW5rICNHSU5HRVJCUkVBRH0gb3IKKyAgICAgICAgICogbGF0ZXIuICBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBzdXBwb3J0IGEgc2NyZWVuIHNpemUgYXQgbGVhc3QgYXMKKyAgICAgICAgICogbGFyZ2UgYXMgdGhlIGN1cnJlbnQgc2NyZWVuIHdpbGwgcHJvdmlkZSB0aGUgdXNlciB3aXRoIGEgVUkgdG8KKyAgICAgICAgICogc3dpdGNoIHRoZW0gaW4gdG8gc2NyZWVuIHNpemUgY29tcGF0aWJpbGl0eSBtb2RlLjwvcD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTkVZQ09NQl9NUjIgPSBDVVJfREVWRUxPUE1FTlQ7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKaW5kZXggZjU2ZjZhOS4uMjE1ZTgzNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKQEAgLTE5LDE5ICsxOSwyMSBAQAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOworaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tlZElucHV0U3RyZWFtOwogCiAKIC8qKgogICogVG9vbHMgZm9yIG1hbmFnaW5nIGZpbGVzLiAgTm90IGZvciBwdWJsaWMgY29uc3VtcHRpb24uCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWxzCi17CitwdWJsaWMgY2xhc3MgRmlsZVV0aWxzIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lSV1hVID0gMDA3MDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JUlVTUiA9IDAwNDAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSVdVU1IgPSAwMDIwMDsKQEAgLTk0LDcgKzk2LDcgQEAKIAogICAgIC8qKiByZXR1cm5zIHRoZSBGQVQgZmlsZSBzeXN0ZW0gdm9sdW1lIElEIGZvciB0aGUgdm9sdW1lIG1vdW50ZWQgCiAgICAgICogYXQgdGhlIGdpdmVuIG1vdW50IHBvaW50LCBvciAtMSBmb3IgZmFpbHVyZQotICAgICAqIEBwYXJhbSBtb3VudCBwb2ludCBmb3IgRkFUIHZvbHVtZQorICAgICAqIEBwYXJhbSBtb3VudFBvaW50IHBvaW50IGZvciBGQVQgdm9sdW1lCiAgICAgICogQHJldHVybiB2b2x1bWUgSUQgb3IgLTEKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RmF0Vm9sdW1lSWQoU3RyaW5nIG1vdW50UG9pbnQpOwpAQCAtMjI2LDQgKzIyOCw0OCBAQAogICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KKworICAgLyoqCisgICAgICogV3JpdGVzIHN0cmluZyB0byBmaWxlLiBCYXNpY2FsbHkgc2FtZSBhcyAiZWNobyAtbiAkc3RyaW5nID4gJGZpbGVuYW1lIgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lCisgICAgICogQHBhcmFtIHN0cmluZworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RyaW5nVG9GaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGUoc3RyaW5nKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIGEgZmlsZSB1c2luZyB0aGUgQ1JDMzIgY2hlY2tzdW0gcm91dGluZS4KKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGNoZWNrc3VtIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgIHRoZSBmaWxlIHRvIGNoZWNrc3VtLCBtdXN0IG5vdCBiZSBudWxsCisgICAgICogQHJldHVybiB0aGUgY2hlY2tzdW0gdmFsdWUgb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgY2hlY2tzdW1DcmMzMihGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ1JDMzIgY2hlY2tTdW1tZXIgPSBuZXcgQ1JDMzIoKTsKKyAgICAgICAgQ2hlY2tlZElucHV0U3RyZWFtIGNpcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNpcyA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0oIG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSksIGNoZWNrU3VtbWVyKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMjhdOworICAgICAgICAgICAgd2hpbGUoY2lzLnJlYWQoYnVmKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSnVzdCByZWFkIGZvciBjaGVja3N1bSB0byBnZXQgY2FsY3VsYXRlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGVja1N1bW1lci5nZXRWYWx1ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGNpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2lzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0lOZXRTdGF0U2VydmljZS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvSU5ldFN0YXRTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjNkZTAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvSU5ldFN0YXRTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm9zOwotCi0vKioKLSAqIFJldHJpZXZlcyBwYWNrZXQgYW5kIGJ5dGUgY291bnRzIGZvciB0aGUgcGhvbmUgZGF0YSBpbnRlcmZhY2UsCi0gKiBhbmQgZm9yIGFsbCBpbnRlcmZhY2VzLgotICogVXNlZCBmb3IgdGhlIGRhdGEgYWN0aXZpdHkgaWNvbiBhbmQgdGhlIHBob25lIHN0YXR1cyBpbiBTZXR0aW5ncy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLWludGVyZmFjZSBJTmV0U3RhdFNlcnZpY2UgewotICAgIGxvbmcgZ2V0TW9iaWxlVHhQYWNrZXRzKCk7Ci0gICAgbG9uZyBnZXRNb2JpbGVSeFBhY2tldHMoKTsKLSAgICBsb25nIGdldE1vYmlsZVR4Qnl0ZXMoKTsKLSAgICBsb25nIGdldE1vYmlsZVJ4Qnl0ZXMoKTsKLSAgICBsb25nIGdldFRvdGFsVHhQYWNrZXRzKCk7Ci0gICAgbG9uZyBnZXRUb3RhbFJ4UGFja2V0cygpOwotICAgIGxvbmcgZ2V0VG90YWxUeEJ5dGVzKCk7Ci0gICAgbG9uZyBnZXRUb3RhbFJ4Qnl0ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsLmphdmEKaW5kZXggNmIzNTIxNS4uZTllZDY3NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsLmphdmEKQEAgLTE5ODAsNiArMTk4MCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoY3JlYXRvciBpbnN0YW5jZW9mIFBhcmNlbGFibGUuQ2xhc3NMb2FkZXJDcmVhdG9yPD8+KSB7CisgICAgICAgICAgICByZXR1cm4gKChQYXJjZWxhYmxlLkNsYXNzTG9hZGVyQ3JlYXRvcjxUPiljcmVhdG9yKS5jcmVhdGVGcm9tUGFyY2VsKHRoaXMsIGxvYWRlcik7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNyZWF0b3IuY3JlYXRlRnJvbVBhcmNlbCh0aGlzKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbGFibGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbGFibGUuamF2YQppbmRleCAwYTRiNjBmLi41OTRmYmIyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsYWJsZS5qYXZhCkBAIC0xMTMsNCArMTEzLDIyIEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgVFtdIG5ld0FycmF5KGludCBzaXplKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiBvZiB7QGxpbmsgQ3JlYXRvcn0gdGhhdCBhbGxvd3MgeW91IHRvIHJlY2VpdmUgdGhlCisgICAgICogQ2xhc3NMb2FkZXIgdGhlIG9iamVjdCBpcyBiZWluZyBjcmVhdGVkIGluLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NMb2FkZXJDcmVhdG9yPFQ+IGV4dGVuZHMgQ3JlYXRvcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBhcmNlbGFibGUgY2xhc3MsIGluc3RhbnRpYXRpbmcgaXQKKyAgICAgICAgICogZnJvbSB0aGUgZ2l2ZW4gUGFyY2VsIHdob3NlIGRhdGEgaGFkIHByZXZpb3VzbHkgYmVlbiB3cml0dGVuIGJ5CisgICAgICAgICAqIHtAbGluayBQYXJjZWxhYmxlI3dyaXRlVG9QYXJjZWwgUGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKCl9IGFuZAorICAgICAgICAgKiB1c2luZyB0aGUgZ2l2ZW4gQ2xhc3NMb2FkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIFBhcmNlbCB0byByZWFkIHRoZSBvYmplY3QncyBkYXRhIGZyb20uCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIENsYXNzTG9hZGVyIHRoYXQgdGhpcyBvYmplY3QgaXMgYmVpbmcgY3JlYXRlZCBpbi4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQYXJjZWxhYmxlIGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFQgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgc291cmNlLCBDbGFzc0xvYWRlciBsb2FkZXIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQppbmRleCA2ZmQxZDAwLi5jZGI2MjJjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCkBAIC0yMyw3ICsyMyw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKQEAgLTEwMCwxMCArOTksMTEgQEAKICAgICBwcml2YXRlIGZpbmFsIE9iYkFjdGlvbkxpc3RlbmVyIG1PYmJBY3Rpb25MaXN0ZW5lciA9IG5ldyBPYmJBY3Rpb25MaXN0ZW5lcigpOwogCiAgICAgcHJpdmF0ZSBjbGFzcyBPYmJBY3Rpb25MaXN0ZW5lciBleHRlbmRzIElPYmJBY3Rpb25MaXN0ZW5lci5TdHViIHsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCiAgICAgICAgIHByaXZhdGUgU3BhcnNlQXJyYXk8T2JiTGlzdGVuZXJEZWxlZ2F0ZT4gbUxpc3RlbmVycyA9IG5ldyBTcGFyc2VBcnJheTxPYmJMaXN0ZW5lckRlbGVnYXRlPigpOwogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk9iYlJlc3VsdChTdHJpbmcgZmlsZW5hbWUsIGludCBub25jZSwgaW50IHN0YXR1cykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uT2JiUmVzdWx0KFN0cmluZyBmaWxlbmFtZSwgaW50IG5vbmNlLCBpbnQgc3RhdHVzKSB7CiAgICAgICAgICAgICBmaW5hbCBPYmJMaXN0ZW5lckRlbGVnYXRlIGRlbGVnYXRlOwogICAgICAgICAgICAgc3luY2hyb25pemVkIChtTGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICAgZGVsZWdhdGUgPSBtTGlzdGVuZXJzLmdldChub25jZSk7CkBAIC0xNDcsOCArMTQ3LDggQEAKICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIobVRndExvb3BlcikgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgT25PYmJTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgT25PYmJTdGF0ZUNoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZUxpc3RlbmVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0xNTYsNyArMTU2LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gU3RvcmFnZUV2ZW50LkVWRU5UX09CQl9TVEFURV9DSEFOR0VEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBPYmJTdGF0ZUNoYW5nZWRTdG9yYWdlRXZlbnQgZXYgPSAoT2JiU3RhdGVDaGFuZ2VkU3RvcmFnZUV2ZW50KSBlOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25PYmJTdGF0ZUNoYW5nZShldi5wYXRoLCBldi5zdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VMaXN0ZW5lci5vbk9iYlN0YXRlQ2hhbmdlKGV2LnBhdGgsIGV2LnN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuc3VwcG9ydGVkIGV2ZW50ICIgKyBtc2cud2hhdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVZvbHVtZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlVm9sdW1lLmphdmEKaW5kZXggYmM2ZTk5My4uYmM0MjA4YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlVm9sdW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlVm9sdW1lLmphdmEKQEAgLTE2LDEwICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5vcy5zdG9yYWdlOwogCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgogICogQSBjbGFzcyByZXByZXNlbnRpbmcgYSBzdG9yYWdlIHZvbHVtZQpAQCAtMjcsNyArMjUsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU3RvcmFnZVZvbHVtZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdG9yYWdlVm9sdW1lIjsKKyAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RvcmFnZVZvbHVtZSI7CiAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGF0aDsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRpb247CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCmluZGV4IDVlMWJlMjEuLmI2ZDE1OTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCkBAIC00NzIsMTEgKzQ3MiwxNSBAQAogICAgICAgICAKICAgICAgICAgZmluYWwgVmlldyBsYXlvdXQgPSBsYXlvdXRJbmZsYXRlci5pbmZsYXRlKG1MYXlvdXRSZXNJZCwgcGFyZW50LCBmYWxzZSk7IAogICAgICAgICAKLSAgICAgICAgaWYgKG1XaWRnZXRMYXlvdXRSZXNJZCAhPSAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgd2lkZ2V0RnJhbWUgPSAoVmlld0dyb3VwKWxheW91dC5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC53aWRnZXRfZnJhbWUpOwotICAgICAgICAgICAgbGF5b3V0SW5mbGF0ZXIuaW5mbGF0ZShtV2lkZ2V0TGF5b3V0UmVzSWQsIHdpZGdldEZyYW1lKTsKKyAgICAgICAgZmluYWwgVmlld0dyb3VwIHdpZGdldEZyYW1lID0gKFZpZXdHcm91cCkgbGF5b3V0CisgICAgICAgICAgICAgICAgLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLndpZGdldF9mcmFtZSk7CisgICAgICAgIGlmICh3aWRnZXRGcmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVdpZGdldExheW91dFJlc0lkICE9IDApIHsKKyAgICAgICAgICAgICAgICBsYXlvdXRJbmZsYXRlci5pbmZsYXRlKG1XaWRnZXRMYXlvdXRSZXNJZCwgd2lkZ2V0RnJhbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aWRnZXRGcmFtZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbGF5b3V0OwogICAgIH0KICAgICAKQEAgLTUxNCwxNCArNTE4LDE4IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIEltYWdlVmlldyBpbWFnZVZpZXcgPSAoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmljb24pOwotICAgICAgICBpZiAoaW1hZ2VWaWV3ICE9IG51bGwgJiYgKG1JY29uUmVzSWQgIT0gMCB8fCBtSWNvbiAhPSBudWxsKSkgewotICAgICAgICAgICAgaWYgKG1JY29uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSWNvbiA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShtSWNvblJlc0lkKTsKKyAgICAgICAgaWYgKGltYWdlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUljb25SZXNJZCAhPSAwIHx8IG1JY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUljb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSWNvbiA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShtSWNvblJlc0lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1JY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlRHJhd2FibGUobUljb24pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtSWNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlRHJhd2FibGUobUljb24pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1hZ2VWaWV3LnNldFZpc2liaWxpdHkobUljb24gIT0gbnVsbCA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CiAgICAgICAgIH0KKwogICAgICAgICBpZiAobVNob3VsZERpc2FibGVWaWV3KSB7CiAgICAgICAgICAgICBzZXRFbmFibGVkU3RhdGVPblZpZXdzKHZpZXcsIGlzRW5hYmxlZCgpKTsKICAgICAgICAgfQpAQCAtNjMzLDYgKzY0MSw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CiAgICAgICAgIGlmICgoaWNvbiA9PSBudWxsICYmIG1JY29uICE9IG51bGwpIHx8IChpY29uICE9IG51bGwgJiYgbUljb24gIT0gaWNvbikpIHsKICAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKwogICAgICAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKaW5kZXggMTVkNTg5OC4uMTRlN2JlZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCkBAIC0xOCw5ICsxOCw2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOwogCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyOwogaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50QnJlYWRDcnVtYnM7CkBAIC00NCw4ICs0MSw4IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CkBAIC01OCw2ICs1NSw5IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKwogLyoqCiAgKiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbiBhY3Rpdml0eSB0byBzaG93IGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzCiAgKiB0byB0aGUgdXNlci4gIFByaW9yIHRvIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQpAQCAtNTAzLDEyICs1MDMsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAotICAgICAgICBpZiAoZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmlzTGF5b3V0U2l6ZUF0TGVhc3QoCi0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9MQVJHRSkpIHsKLSAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50X2xhcmdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50KTsKLSAgICAgICAgfQorICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfY29udGVudCk7CiAKICAgICAgICAgbUxpc3RGb290ZXIgPSAoRnJhbWVMYXlvdXQpZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubGlzdF9mb290ZXIpOwogICAgICAgICBtUHJlZnNDb250YWluZXIgPSAoVmlld0dyb3VwKSBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5wcmVmc19mcmFtZSk7CkBAIC01ODUsMTIgKzU4MCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaGVhZGVycywgd2UgYXJlIGluIHRoZSBvbGQgImp1c3Qgc2hvdyBhIHNjcmVlbgogICAgICAgICAgICAgLy8gb2YgcHJlZmVyZW5jZXMiIG1vZGUuCi0gICAgICAgICAgICBpZiAoZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmlzTGF5b3V0U2l6ZUF0TGVhc3QoCi0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTEFSR0UpKSB7Ci0gICAgICAgICAgICAgICAgc2V0Q29udGVudFZpZXcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV9saXN0X2NvbnRlbnRfc2luZ2xlX2xhcmdlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0Q29udGVudFZpZXcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV9saXN0X2NvbnRlbnRfc2luZ2xlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50X3NpbmdsZSk7CiAgICAgICAgICAgICBtTGlzdEZvb3RlciA9IChGcmFtZUxheW91dCkgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubGlzdF9mb290ZXIpOwogICAgICAgICAgICAgbVByZWZzQ29udGFpbmVyID0gKFZpZXdHcm91cCkgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQucHJlZnMpOwogICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKHRoaXMsIEZJUlNUX1JFUVVFU1RfQ09ERSk7CkBAIC02NzQsMTcgKzY2NCw5IEBACiAgICAgICogZW5vdWdoLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG9uSXNNdWx0aVBhbmUoKSB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpOwotICAgICAgICBpZiAoKGNvbmZpZy5zY3JlZW5MYXlvdXQmQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9NQVNLKQotICAgICAgICAgICAgICAgID09IENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfWExBUkdFKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGNvbmZpZy5zY3JlZW5MYXlvdXQmQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9NQVNLKQotICAgICAgICAgICAgICAgID09IENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTEFSR0UKLSAgICAgICAgICAgICAgICAmJiBjb25maWcub3JpZW50YXRpb24gPT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBwcmVmZXJNdWx0aVBhbmUgPSBnZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5wcmVmZXJlbmNlc19wcmVmZXJfZHVhbF9wYW5lKTsKKyAgICAgICAgcmV0dXJuIHByZWZlck11bHRpUGFuZTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCmluZGV4IDc1MTFlMTQuLjlkNDZiN2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRnJhZ21lbnQuamF2YQpAQCAtMTUyLDE0ICsxNTIsOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgaWYgKGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS5pc0xheW91dFNpemVBdExlYXN0KAotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTEFSR0UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfZnJhZ21lbnRfbGFyZ2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV9saXN0X2ZyYWdtZW50LAotICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsIGZhbHNlKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfZnJhZ21lbnQsIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQppbmRleCAyMDYxNGRjLi4yZGYyNjg4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOwogCisKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CkBAIC0zMiw3ICszMyw2IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS5JQ2FsZW5kYXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LlRpbWU7CkBAIC00NCwyNCArNDQsMzAgQEAKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDYWxlbmRhciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2FsZW5kYXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2FsZW5kYXIiOwogCiAgICAgLyoqCi0gICAgICogQnJvYWRjYXN0IEFjdGlvbjogQW4gZXZlbnQgcmVtaW5kZXIuCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogVGhpcyBpcyB0aGUgaW50ZW50IHRoYXQgZ2V0cyBmaXJlZCB3aGVuIGFuIGFsYXJtCisgICAgICogbm90aWZpY2F0aW9uIG5lZWRzIHRvIGJlIHBvc3RlZCBmb3IgYSByZW1pbmRlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9SRU1JTkRFUl9BQ1RJT04gPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkVWRU5UX1JFTUlOREVSIjsKIAogICAgIC8qKgotICAgICAqIFRoZXNlIGFyZSB0aGUgc3ltYm9saWMgbmFtZXMgZm9yIHRoZSBrZXlzIHVzZWQgaW4gdGhlIGV4dHJhIGRhdGEKLSAgICAgKiBwYXNzZWQgaW4gdGhlIGludGVudCBmb3IgZXZlbnQgcmVtaW5kZXJzLgorICAgICAqIEludGVudCBFeHRyYXMga2V5OiBUaGUgc3RhcnQgdGltZSBvZiBhbiBldmVudCBvciBhbiBpbnN0YW5jZSBvZiBhCisgICAgICogcmVjdXJyaW5nIGV2ZW50LiAobWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoKQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0JFR0lOX1RJTUUgPSAiYmVnaW5UaW1lIjsKKworICAgIC8qKgorICAgICAqIEludGVudCBFeHRyYXMga2V5OiBUaGUgZW5kIHRpbWUgb2YgYW4gZXZlbnQgb3IgYW4gaW5zdGFuY2Ugb2YgYSByZWN1cnJpbmcKKyAgICAgKiBldmVudC4gKG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCkKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9FTkRfVElNRSA9ICJlbmRUaW1lIjsKIAogICAgIC8qKgotICAgICAqIFRoaXMgbXVzdCBub3QgYmUgY2hhbmdlZCBvciBob3JyaWJsZSwgdW5zcGVha2FibGUgdGhpbmdzIGNvdWxkIGhhcHBlbi4KLSAgICAgKiBGb3IgaW5zdGFuY2UsIHRoZSBDYWxlbmRhciBhcHAgbWlnaHQgYnJlYWsuIEFsc28sIHRoZSBkYiBtaWdodCBub3Qgd29yay4KKyAgICAgKiBUaGlzIGF1dGhvcml0eSBpcyB1c2VkIGZvciB3cml0aW5nIHRvIG9yIHF1ZXJ5aW5nIGZyb20gdGhlIGNhbGVuZGFyCisgICAgICogcHJvdmlkZXIuIE5vdGU6IFRoaXMgaXMgc2V0IGF0IGZpcnN0IHJ1biBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dAorICAgICAqIGJyZWFraW5nIGFwcHMgdGhhdCBhY2Nlc3MgdGhlIHByb3ZpZGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJjb20uYW5kcm9pZC5jYWxlbmRhciI7CiAKQEAgLTczLDU5ICs3OSw4OCBAQAogCiAgICAgLyoqCiAgICAgICogQW4gb3B0aW9uYWwgaW5zZXJ0LCB1cGRhdGUgb3IgZGVsZXRlIFVSSSBwYXJhbWV0ZXIgdGhhdCBhbGxvd3MgdGhlIGNhbGxlcgotICAgICAqIHRvIHNwZWNpZnkgdGhhdCBpdCBpcyBhIHN5bmMgYWRhcHRlci4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIElmIHRydWUKLSAgICAgKiB0aGUgZGlydHkgZmxhZyBpcyBub3QgYXV0b21hdGljYWxseSBzZXQgYW5kIHRoZSAic3luY1RvTmV0d29yayIgcGFyYW1ldGVyCi0gICAgICogaXMgc2V0IHRvIGZhbHNlIHdoZW4gY2FsbGluZwotICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKGFuZHJvaWQubmV0LlVyaSwgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIsIGJvb2xlYW4pfS4KKyAgICAgKiB0byBzcGVjaWZ5IHRoYXQgaXQgaXMgYSBzeW5jIGFkYXB0ZXIuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLiBJZiBzZXQKKyAgICAgKiB0byB0cnVlLCB0aGUgbW9kaWZpZWQgcm93IGlzIG5vdCBtYXJrZWQgYXMgImRpcnR5IiAobmVlZHMgdG8gYmUgc3luY2VkKQorICAgICAqIGFuZCB3aGVuIHRoZSBwcm92aWRlciBjYWxscworICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKGFuZHJvaWQubmV0LlVyaSwgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIsIGJvb2xlYW4pfQorICAgICAqICwgdGhlIHRoaXJkIHBhcmFtZXRlciAic3luY1RvTmV0d29yayIgaXMgc2V0IHRvIGZhbHNlLiBGdXJ0aGVybW9yZSwgaWYKKyAgICAgKiBzZXQgdG8gdHJ1ZSwgdGhlIGNhbGxlciBtdXN0IGFsc28gaW5jbHVkZQorICAgICAqIHtAbGluayBTeW5jQ29sdW1ucyNBQ0NPVU5UX05BTUV9IGFuZCB7QGxpbmsgU3luY0NvbHVtbnMjQUNDT1VOVF9UWVBFfSBhcworICAgICAqIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAU2VlIFVyaS5CdWlsZGVyI2FwcGVuZFF1ZXJ5UGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTEVSX0lTX1NZTkNBREFQVEVSID0gImNhbGxlcl9pc19zeW5jYWRhcHRlciI7CiAKKyAgICAvKioKKyAgICAgKiBBIHNwZWNpYWwgYWNjb3VudCB0eXBlIGZvciBjYWxlbmRhcnMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgYWNjb3VudC4KKyAgICAgKiBOb3JtYWxseSBjYWxlbmRhcnMgdGhhdCBkbyBub3QgbWF0Y2ggYW4gYWNjb3VudCBvbiB0aGUgZGV2aWNlIHdpbGwgYmUKKyAgICAgKiByZW1vdmVkLiBTZXR0aW5nIHRoZSBhY2NvdW50X3R5cGUgb24gYSBjYWxlbmRhciB0byB0aGlzIHdpbGwgcHJldmVudCBpdAorICAgICAqIGZyb20gYmVpbmcgd2lwZWQgaWYgaXQgZG9lcyBub3QgbWF0Y2ggYW4gZXhpc3RpbmcgYWNjb3VudC4KKyAgICAgKgorICAgICAqIEBzZWUgU3luY0NvbHVtbnMjQUNDT1VOVF9UWVBFCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFX0xPQ0FMID0gIkxPQ0FMIjsKIAogICAgIC8qKgotICAgICAqIEdlbmVyaWMgY29sdW1ucyBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIFRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgb2YKLSAgICAgKiB0aGVzZSBjb2x1bW5zIGFyZSBwcml2YXRlIHRvIHRoZSBzeW5jIGFkYXB0ZXIuIE90aGVyIGNsaWVudHMgb2YgdGhlIEFQSQotICAgICAqIHNob3VsZCBub3QgYXR0ZW1wdCB0byBlaXRoZXIgcmVhZCBvciB3cml0ZSB0aGlzIGNvbHVtbi4KKyAgICAgKiBHZW5lcmljIGNvbHVtbnMgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBUaGUgc3BlY2lmaWMgZnVuY3Rpb25zIG9mIHRoZXNlCisgICAgICogY29sdW1ucyBhcmUgcHJpdmF0ZSB0byB0aGUgc3luYyBhZGFwdGVyLiBPdGhlciBjbGllbnRzIG9mIHRoZSBBUEkgc2hvdWxkCisgICAgICogbm90IGF0dGVtcHQgdG8gZWl0aGVyIHJlYWQgb3Igd3JpdGUgdGhpcyBjb2x1bW4uIFRoZXNlIGNvbHVtbnMgYXJlCisgICAgICogZWRpdGFibGUgYXMgcGFydCBvZiB0aGUgQ2FsZW5kYXJzIFVyaSwgYnV0IGNhbiBvbmx5IGJlIHJlYWQgaWYgYWNjZXNzZWQKKyAgICAgKiB0aHJvdWdoIGFueSBvdGhlciBVcmkuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIGludGVyZmFjZSBCYXNlU3luY0NvbHVtbnMgeworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgQ2FsZW5kYXJTeW5jQ29sdW1ucyB7CiAKICAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzEgPSAic3luYzEiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxfU1lOQzEgPSAiY2FsX3N5bmMxIjsKICAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzIgPSAic3luYzIiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxfU1lOQzIgPSAiY2FsX3N5bmMyIjsKICAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzMgPSAic3luYzMiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxfU1lOQzMgPSAiY2FsX3N5bmMzIjsKICAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzQgPSAic3luYzQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxfU1lOQzQgPSAiY2FsX3N5bmM0IjsKICAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzUgPSAic3luYzUiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxfU1lOQzUgPSAiY2FsX3N5bmM1IjsKICAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzYgPSAic3luYzYiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxfU1lOQzYgPSAiY2FsX3N5bmM2IjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb2x1bW5zIGZvciBTeW5jIGluZm9ybWF0aW9uIHVzZWQgYnkgQ2FsZW5kYXJzIGFuZCBFdmVudHMgdGFibGVzLgorICAgICAqIENvbHVtbnMgZm9yIFN5bmMgaW5mb3JtYXRpb24gdXNlZCBieSBDYWxlbmRhcnMgYW5kIEV2ZW50cyB0YWJsZXMuIFRoZXNlCisgICAgICogaGF2ZSBzcGVjaWZpYyB1c2VzIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBjb25zaXN0ZW50IGJ5IHRoZSBhcHAgYW5kCisgICAgICogc3luYyBhZGFwdGVyLgorICAgICAqCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDb2x1bW5zIGV4dGVuZHMgQmFzZVN5bmNDb2x1bW5zIHsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDb2x1bW5zIGV4dGVuZHMgQ2FsZW5kYXJTeW5jQ29sdW1ucyB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCisgICAgICAgICAqIFRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4gSWYgdGhlCisgICAgICAgICAqIGFjY291bnRfdHlwZSBpcyBub3Qge0BsaW5rICNBQ0NPVU5UX1RZUEVfTE9DQUx9IHRoZW4gdGhlIG5hbWUgYW5kCisgICAgICAgICAqIHR5cGUgbXVzdCBtYXRjaCBhbiBhY2NvdW50IG9uIHRoZSBkZXZpY2Ugb3IgdGhlIGNhbGVuZGFyIHdpbGwgYmUKKyAgICAgICAgICogZGVsZXRlZC4KICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCisgICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlCisgICAgICAgICAqIGRldmljZS4gQSB0eXBlIG9mIHtAbGluayAjQUNDT1VOVF9UWVBFX0xPQ0FMfSB3aWxsIGtlZXAgdGhpcyBldmVudAorICAgICAgICAgKiBmb3JtIGJlaW5nIGRlbGV0ZWQgaWYgdGhlcmUgYXJlIG5vIG1hdGNoaW5nIGFjY291bnRzIG9uIHRoZSBkZXZpY2UuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgYSByb3cgYXNzaWduZWQgYnkgdGhlIHN5bmMgc291cmNlLiBOVUxMIGlmIHRoZSByb3cgaGFzIG5ldmVyIGJlZW4gc3luY2VkLgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdyBhc3NpZ25lZCBieSB0aGUgc3luYyBzb3VyY2UuIE5VTEwgaWYgdGhlIHJvdworICAgICAgICAgKiBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuIFRoaXMgaXMgdXNlZCBhcyBhIHJlZmVyZW5jZSBpZCBmb3IgZXhjZXB0aW9ucworICAgICAgICAgKiBhbG9uZyB3aXRoIHtAbGluayBCYXNlQ29sdW1ucyNfSUR9LgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfSUQgPSAiX3N5bmNfaWQiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbGFzdCB0aW1lLCBmcm9tIHRoZSBzeW5jIHNvdXJjZSdzIHBvaW50IG9mIHZpZXcsIHRoYXQgdGhpcyByb3cgaGFzIGJlZW4gc3luY2hyb25pemVkLgorICAgICAgICAgKiBUaGUgbGFzdCB0aW1lLCBmcm9tIHRoZSBzeW5jIHNvdXJjZSdzIHBvaW50IG9mIHZpZXcsIHRoYXQgdGhpcyByb3cKKyAgICAgICAgICogaGFzIGJlZW4gc3luY2hyb25pemVkLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1RJTUUgPSAiX3N5bmNfdGltZSI7CkBAIC0xNTEsOSArMTg2LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb2x1bW5zIGZyb20gdGhlIENhbGVuZGFycyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KKyAgICAgKiBDb2x1bW5zIHNwZWNpZmljIHRvIHRoZSBDYWxlbmRhcnMgVXJpIHRoYXQgb3RoZXIgVXJpcyBjYW4gcXVlcnkuCiAgICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zIHsKKyAgICBwcml2YXRlIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoY29sb3IgdmFsdWUpPC9QPgpAQCAtMTcyLDEwICsyMDcsMTcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJFRUJVU1lfQUNDRVNTID0gMTAwOwogICAgICAgICAvKiogQ2FuIHJlYWQgYWxsIGV2ZW50IGRldGFpbHMgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9BQ0NFU1MgPSAyMDA7CisgICAgICAgIC8qKiBDYW4gcmVwbHkgeWVzL25vL21heWJlIHRvIGFuIGV2ZW50ICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTkRfQUNDRVNTID0gMzAwOworICAgICAgICAvKiogbm90IHVzZWQgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlJJREVfQUNDRVNTID0gNDAwOwotICAgICAgICAvKiogRnVsbCBhY2Nlc3MgdG8gbW9kaWZ5IHRoZSBjYWxlbmRhciwgYnV0IG5vdCB0aGUgYWNjZXNzIGNvbnRyb2wgc2V0dGluZ3MgKi8KKyAgICAgICAgLyoqIEZ1bGwgYWNjZXNzIHRvIG1vZGlmeSB0aGUgY2FsZW5kYXIsIGJ1dCBub3QgdGhlIGFjY2VzcyBjb250cm9sCisgICAgICAgICAqIHNldHRpbmdzCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UUklCVVRPUl9BQ0NFU1MgPSA1MDA7CisgICAgICAgIC8qKiBGdWxsIGFjY2VzcyB0byBtb2RpZnkgdGhlIGNhbGVuZGFyLCBidXQgbm90IHRoZSBhY2Nlc3MgY29udHJvbAorICAgICAgICAgKiBzZXR0aW5ncworICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVE9SX0FDQ0VTUyA9IDYwMDsKICAgICAgICAgLyoqIEZ1bGwgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPV05FUl9BQ0NFU1MgPSA3MDA7CkBAIC0xODQsMzEgKzIyNiwzNSBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJcyB0aGUgY2FsZW5kYXIgc2VsZWN0ZWQgdG8gYmUgZGlzcGxheWVkPworICAgICAgICAgKiAwIC0gZG8gbm90IHNob3cgZXZlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhbGVuZGFyLgorICAgICAgICAgKiAxIC0gc2hvdyBldmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJQkxFID0gInZpc2libGUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGltZXpvbmUgdGhlIGNhbGVuZGFyJ3MgZXZlbnRzIG9jY3VycyBpbgorICAgICAgICAgKiBUaGUgdGltZSB6b25lIHRoZSBjYWxlbmRhciBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxFTkRBUl9USU1FWk9ORSA9ICJjYWxlbmRhcl90aW1lem9uZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIElmIHRoaXMgY2FsZW5kYXIgaXMgaW4gdGhlIGxpc3Qgb2YgY2FsZW5kYXJzIHRoYXQgYXJlIHNlbGVjdGVkIGZvcgotICAgICAgICAgKiBzeW5jaW5nIHRoZW4gInN5bmNfZXZlbnRzIiBpcyAxLCBvdGhlcndpc2UgMC4KKyAgICAgICAgICogSXMgdGhpcyBjYWxlbmRhciBzeW5jZWQgYW5kIGFyZSBpdHMgZXZlbnRzIHN0b3JlZCBvbiB0aGUgZGV2aWNlPworICAgICAgICAgKiAwIC0gRG8gbm90IHN5bmMgdGhpcyBjYWxlbmRhciBvciBzdG9yZSBldmVudHMgZm9yIHRoaXMgY2FsZW5kYXIuCisgICAgICAgICAqIDEgLSBTeW5jIGRvd24gZXZlbnRzIGZvciB0aGlzIGNhbGVuZGFyLgogICAgICAgICAgKiA8cD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvcD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfRVZFTlRTID0gInN5bmNfZXZlbnRzIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogU3luYyBzdGF0ZSBkYXRhLgorICAgICAgICAgKiBTeW5jIHN0YXRlIGRhdGEuIFVzYWJsZSBieSB0aGUgc3luYyBhZGFwdGVyLgogICAgICAgICAgKiA8cD5UeXBlOiBTdHJpbmcgKGJsb2IpPC9wPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19TVEFURSA9ICJzeW5jX3N0YXRlIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0aGUgcm93IGhhcyBiZWVuIGRlbGV0ZWQuICBBIGRlbGV0ZWQgcm93IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAgICAgKiBXaGV0aGVyIHRoZSByb3cgaGFzIGJlZW4gZGVsZXRlZCBidXQgbm90IHN5bmNlZCB0byB0aGUgc2VydmVyLiBBCisgICAgICAgICAqIGRlbGV0ZWQgcm93IHNob3VsZCBiZSBpZ25vcmVkLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURUQgPSAiZGVsZXRlZCI7CkBAIC0yMTYsMzUgKzI2MiwzMiBAQAogCiAgICAgLyoqCiAgICAgICogQ2xhc3MgdGhhdCByZXByZXNlbnRzIGEgQ2FsZW5kYXIgRW50aXR5LiBUaGVyZSBpcyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyLgorICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gbWFrZSBiYXRjaCBvcGVyYXRpb25zIGVhc2llci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFyc0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IFVyaSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBuZXcgY2FsZW5kYXIgRW50aXR5SXRlcmF0b3IuCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsKICAgICAgICAgICAgICAgICAiL2NhbGVuZGFyX2VudGl0aWVzIik7CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcmVzb2x2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLAotICAgICAgICAgICAgICAgIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlcikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJdGVyYXRvckltcGwoY3Vyc29yLCBwcm92aWRlcik7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGVudGl0eSBpdGVyYXRvciBmb3IgdGhlIGdpdmVuIGN1cnNvci4gSXQgYXNzdW1lcyB0aGUKKyAgICAgICAgICogY3Vyc29yIGNvbnRhaW5zIGEgY2FsZW5kYXJzIHF1ZXJ5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3Vyc29yIHF1ZXJ5IG9uIHtAbGluayAjQ09OVEVOVF9VUkl9CisgICAgICAgICAqIEByZXR1cm4gYW4gRW50aXR5SXRlcmF0b3Igb2YgY2FsZW5kYXJzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG5ld0VudGl0eUl0ZXJhdG9yKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvcik7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRpdHlJdGVyYXRvckltcGwgZXh0ZW5kcyBDdXJzb3JFbnRpdHlJdGVyYXRvciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRQcm92aWRlckNsaWVudCBtUHJvdmlkZXI7CiAKLSAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvckltcGwoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IpIHsKICAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOwotICAgICAgICAgICAgICAgIG1SZXNvbHZlciA9IHJlc29sdmVyOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvckltcGwoQ3Vyc29yIGN1cnNvciwgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoY3Vyc29yKTsKLSAgICAgICAgICAgICAgICBtUmVzb2x2ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTI2NCwxMiArMzA3LDEyIEBACiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVElNRSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERJUlRZKTsKIAotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMyKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzMpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DNCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkM1KTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzYpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5DQUxfU1lOQzEpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5DQUxfU1lOQzIpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5DQUxfU1lOQzMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5DQUxfU1lOQzQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5DQUxfU1lOQzUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5DQUxfU1lOQzYpOwogCiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLk5BTUUpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCkBAIC0zMDUsMjcgKzM0OCw0MCBAQAogICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb250YWlucyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNhbGVuZGFycy4KKyAgICAgKiBGaWVsZHMgYW5kIGhlbHBlcnMgZm9yIGludGVyYWN0aW5nIHdpdGggQ2FsZW5kYXJzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLAotICAgICAgICAgICAgQ2FsZW5kYXJzQ29sdW1ucwotICAgIHsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFycyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9ERUxFVEVfRk9SX0FDQ09VTlQgPSBDYWxlbmRhcnMuQUNDT1VOVF9OQU1FICsgIj0/IgogICAgICAgICAgICAgICAgICsgIiBBTkQgIgogICAgICAgICAgICAgICAgICsgQ2FsZW5kYXJzLkFDQ09VTlRfVFlQRSArICI9PyI7CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdoZXJlLCBTdHJpbmcgb3JkZXJCeSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KENPTlRFTlRfVVJJLCBwcm9qZWN0aW9uLCB3aGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgb3JkZXJCeSA9PSBudWxsID8gREVGQVVMVF9TT1JUX09SREVSIDogb3JkZXJCeSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgYSBjYWxlbmRhcnMgcXVlcnkuIFRoaXMgaXMgYmxvY2tpbmcKKyAgICAgICAgICogYW5kIHNob3VsZCBub3QgYmUgdXNlZCBvbiB0aGUgVUkgdGhyZWFkLiBTZWUKKyAgICAgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNxdWVyeShVcmksIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfQorICAgICAgICAgKiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHVzaW5nIHRoZSBwYXJhbWV0ZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgVGhlIENvbnRlbnRSZXNvbHZlciB0byBxdWVyeSB3aXRoCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIEEgbGlzdCBvZiBjb2x1bW5zIHRvIHJldHVybgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIEEgZm9ybWF0dGVkIHNlbGVjdGlvbiBzdHJpbmcKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgYXJndW1lbnRzIHRvIHRoZSBzZWxlY3Rpb24gc3RyaW5nCisgICAgICAgICAqIEBwYXJhbSBvcmRlckJ5IEhvdyB0byBvcmRlciB0aGUgcmV0dXJuZWQgcm93cworICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIG9yZGVyQnkpIHsKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShDT05URU5UX1VSSSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgICAgICAgICBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgcGVyZm9ybSBhIGRlbGV0ZSBvbiB0aGUgQ2FsZW5kYXIgcHJvdmlkZXIKKyAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHBlcmZvcm0gYSBkZWxldGUgb24gdGhlIENhbGVuZGFyIHByb3ZpZGVyLiBUaGlzIGlzCisgICAgICAgICAqIGEgYmxvY2tpbmcgY2FsbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHRoZSBVSSB0aHJlYWQuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBjciB0aGUgQ29udGVudFJlc29sdmVyCi0gICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHJvd3MgdG8gZGVsZXRlCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gQSBmaWx0ZXIgdG8gYXBwbHkgdG8gcm93cyBiZWZvcmUgZGVsZXRpbmcsIGZvcm1hdHRlZAorICAgICAgICAgKiAgICAgICAgICAgIGFzIGFuIFNRTCBXSEVSRSBjbGF1c2UgKGV4Y2x1ZGluZyB0aGUgV0hFUkUgaXRzZWxmKS4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgRmlsbCBpbiB0aGUgJz8ncyBpbiB0aGUgc2VsZWN0aW9uCiAgICAgICAgICAqIEByZXR1cm4gdGhlIGNvdW50IG9mIHJvd3MgdGhhdCB3ZXJlIGRlbGV0ZWQKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGRlbGV0ZShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpCkBAIC0zMzUsMTAgKzM5MSwxMiBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIGFsbCBjYWxlbmRhcnMgdGhhdCBtYXRjaCB0aGUgYWNjb3VudC4KKyAgICAgICAgICogVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBvbiB0aGUgVUkgdGhyZWFkLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gY3IgdGhlIENvbnRlbnRSZXNvbHZlcgotICAgICAgICAgKiBAcGFyYW0gYWNjb3VudCB0aGUgYWNjb3VudCB3aG9zZSByb3dzIHNob3VsZCBiZSBkZWxldGVkCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGNvdW50IG9mIHJvd3MgdGhhdCB3ZXJlIGRlbGV0ZWQKKyAgICAgICAgICogQHBhcmFtIGFjY291bnQgdGhlIGFjY291bnQgd2hvc2UgY2FsZW5kYXJzIGFuZCBldmVudHMgc2hvdWxkIGJlCisgICAgICAgICAqICAgICAgICAgICAgZGVsZXRlZAorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb3VudCBvZiBjYWxlbmRhciByb3dzIHRoYXQgd2VyZSBkZWxldGVkCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGludCBkZWxldGVDYWxlbmRhcnNGb3JBY2NvdW50KENvbnRlbnRSZXNvbHZlciBjciwgQWNjb3VudCBhY2NvdW50KSB7CiAgICAgICAgICAgICAvLyBkZWxldGUgYWxsIGNhbGVuZGFycyB0aGF0IG1hdGNoIHRoaXMgYWNjb3VudApAQCAtMzQ4LDggKzQwNiw5IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgYWNjZXNzaW5nIENhbGVuZGFycwogICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvY2FsZW5kYXJzIik7CiAKICAgICAgICAgLyoqCkBAIC0zNTgsNDMgKzQxNyw0MyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAiZGlzcGxheU5hbWUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgVVJMIHRvIHRoZSBjYWxlbmRhcgorICAgICAgICAgKiBUaGUgVVJMIHRvIHRoZSBjYWxlbmRhci4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIGl0c2VsZgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgaXRzZWxmLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEZfVVJMID0gInNlbGZVcmwiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgdG8gYmUgZWRpdGVkCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciB0byBiZSBlZGl0ZWQuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9VUkwgPSAiZWRpdFVybCI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciBldmVudHMKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIGV2ZW50cy4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVFNfVVJMID0gImV2ZW50c1VybCI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjYWxlbmRhcgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgY2FsZW5kYXIKKyAgICAgICAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgY2FsZW5kYXIuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUExBWV9OQU1FID0gImRpc3BsYXlOYW1lIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxvY2F0aW9uIHRoZSBvZiB0aGUgZXZlbnRzIGluIHRoZSBjYWxlbmRhcgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBsb2NhdGlvbiBmb3IgdGhlIGNhbGVuZGFyLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTEVOREFSX0xPQ0FUSU9OID0gImNhbGVuZGFyX2xvY2F0aW9uIjsKQEAgLTQwMiw0MSArNDYxLDQ1IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgb3duZXIgYWNjb3VudCBmb3IgdGhpcyBjYWxlbmRhciwgYmFzZWQgb24gdGhlIGNhbGVuZGFyIGZlZWQuCiAgICAgICAgICAqIFRoaXMgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgX1NZTkNfQUNDT1VOVCBmb3IgZGVsZWdhdGVkIGNhbGVuZGFycy4KKyAgICAgICAgICogQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFN0cmluZzwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9XTkVSX0FDQ09VTlQgPSAib3duZXJBY2NvdW50IjsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ2FuIHRoZSBvcmdhbml6ZXIgcmVzcG9uZCB0byB0aGUgZXZlbnQ/ICBJZiBubywgdGhlIHN0YXR1cyBvZiB0aGUKLSAgICAgICAgICogb3JnYW5pemVyIHNob3VsZCBub3QgYmUgc2hvd24gYnkgdGhlIFVJLiAgRGVmYXVsdHMgdG8gMQorICAgICAgICAgKiBvcmdhbml6ZXIgc2hvdWxkIG5vdCBiZSBzaG93biBieSB0aGUgVUkuICBEZWZhdWx0cyB0byAxLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5fT1JHQU5JWkVSX1JFU1BPTkQgPSAiY2FuT3JnYW5pemVyUmVzcG9uZCI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENhbiB0aGUgb3JnYW5pemVyIG1vZGlmeSB0aGUgdGltZSB6b25lIG9mIHRoZSBldmVudD8KKyAgICAgICAgICogQ2FuIHRoZSBvcmdhbml6ZXIgbW9kaWZ5IHRoZSB0aW1lIHpvbmUgb2YgdGhlIGV2ZW50PyBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTl9NT0RJRllfVElNRV9aT05FID0gImNhbk1vZGlmeVRpbWVab25lIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlbWluZGVycyBhbGxvd2VkIGZvciBhbiBldmVudC4KKyAgICAgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlbWluZGVycyBhbGxvd2VkIGZvciBhbiBldmVudC4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfUkVNSU5ERVJTID0gIm1heFJlbWluZGVycyI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZW1pbmRlcnMgYWxsb3dlZCBmb3IgYW4gZXZlbnQuCi0gICAgICAgICAqIDxQPgotICAgICAgICAgKiBUeXBlOiBJTlRFR0VSCi0gICAgICAgICAqIDwvUD4KKyAgICAgICAgICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZW1pbmRlciBtZXRob2RzIHN1cHBvcnRlZCBmb3IgdGhpcworICAgICAgICAgKiBjYWxlbmRhciBpbiB0aGUgZm9ybWF0ICIjLCMsIyIuIFZhbGlkIHR5cGVzIGFyZQorICAgICAgICAgKiB7QGxpbmsgUmVtaW5kZXJzI01FVEhPRF9ERUZBVUxUfSwge0BsaW5rIFJlbWluZGVycyNNRVRIT0RfQUxFUlR9LAorICAgICAgICAgKiB7QGxpbmsgUmVtaW5kZXJzI01FVEhPRF9FTUFJTH0sIHtAbGluayBSZW1pbmRlcnMjTUVUSE9EX1NNU30uIENvbHVtbgorICAgICAgICAgKiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dFRF9SRU1JTkRFUlMgPSAiYWxsb3dlZFJlbWluZGVycyI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0YWJsZSBieSBhIHN5bmMgYWRhcHRlci4gVG8gbW9kaWZ5IHRoZW0gdGhlCi0gICAgICAgICAqIGNhbGxlciBtdXN0IGluY2x1ZGUgQ0FMTEVSX0lTX1NZTkNBREFQVEVSLCBfU1lOQ19BQ0NPVU5ULCBhbmQKLSAgICAgICAgICogX1NZTkNfQUNDT1VOVF9UWVBFIGluIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBjYWxsZXIgbXVzdCBpbmNsdWRlIHtAbGluayAjQ0FMTEVSX0lTX1NZTkNBREFQVEVSfSwKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9LCBhbmQge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGluIHRoZSBxdWVyeQorICAgICAgICAgKiBwYXJhbWV0ZXJzLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTWU5DX1dSSVRBQkxFX0NPTFVNTlMgPSBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgQUNDT1VOVF9OQU1FLApAQCAtNDUzLDEyICs1MTYsMTIgQEAKICAgICAgICAgICAgIENBTEVOREFSX1RJTUVaT05FLAogICAgICAgICAgICAgQUNDRVNTX0xFVkVMLAogICAgICAgICAgICAgREVMRVRFRCwKLSAgICAgICAgICAgIFNZTkMxLAotICAgICAgICAgICAgU1lOQzIsCi0gICAgICAgICAgICBTWU5DMywKLSAgICAgICAgICAgIFNZTkM0LAotICAgICAgICAgICAgU1lOQzUsCi0gICAgICAgICAgICBTWU5DNiwKKyAgICAgICAgICAgIENBTF9TWU5DMSwKKyAgICAgICAgICAgIENBTF9TWU5DMiwKKyAgICAgICAgICAgIENBTF9TWU5DMywKKyAgICAgICAgICAgIENBTF9TWU5DNCwKKyAgICAgICAgICAgIENBTF9TWU5DNSwKKyAgICAgICAgICAgIENBTF9TWU5DNiwKICAgICAgICAgICAgIFNZTkNfU1RBVEUsCiAgICAgICAgIH07CiAgICAgfQpAQCAtNDY2LDI5ICs1MjksMjkgQEAKICAgICAvKioKICAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEF0dGVuZGVlcyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEF0dGVuZGVlc0NvbHVtbnMgeworICAgIHByaXZhdGUgaW50ZXJmYWNlIEF0dGVuZGVlc0NvbHVtbnMgewogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgaWQgb2YgdGhlIGV2ZW50LgorICAgICAgICAgKiBUaGUgaWQgb2YgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0lEID0gImV2ZW50X2lkIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGF0dGVuZGVlLgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXR0ZW5kZWUuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBTVFJJTkc8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRFTkRFRV9OQU1FID0gImF0dGVuZGVlTmFtZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSBhdHRlbmRlZS4KKyAgICAgICAgICogVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIGF0dGVuZGVlLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogU1RSSU5HPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRURU5ERUVfRU1BSUwgPSAiYXR0ZW5kZWVFbWFpbCI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIGF0dGVuZGVlIHRvIHRoZSB1c2VyLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChvbmUgb2Yge0BsaW5rICNSRUxBVElPTlNISVBfQVRURU5ERUV9LCAuLi59LgorICAgICAgICAgKiBUaGUgcmVsYXRpb25zaGlwIG9mIHRoZSBhdHRlbmRlZSB0byB0aGUgdXNlci4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKG9uZSBvZiB7QGxpbmsgI1JFTEFUSU9OU0hJUF9BVFRFTkRFRX0sIC4uLn0uPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRURU5ERUVfUkVMQVRJT05TSElQID0gImF0dGVuZGVlUmVsYXRpb25zaGlwIjsKIApAQCAtNDk5LDggKzU2Miw4IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSU9OU0hJUF9TUEVBS0VSID0gNDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHR5cGUgb2YgYXR0ZW5kZWUuCi0gICAgICAgICAqIDxQPlR5cGU6IEludGVnZXIgKG9uZSBvZiB7QGxpbmsgI1RZUEVfUkVRVUlSRUR9LCB7QGxpbmsgI1RZUEVfT1BUSU9OQUx9KQorICAgICAgICAgKiBUaGUgdHlwZSBvZiBhdHRlbmRlZS4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IEludGVnZXIgKG9uZSBvZiB7QGxpbmsgI1RZUEVfUkVRVUlSRUR9LCB7QGxpbmsgI1RZUEVfT1BUSU9OQUx9KTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEVOREVFX1RZUEUgPSAiYXR0ZW5kZWVUeXBlIjsKIApAQCAtNTA5LDggKzU3Miw4IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfT1BUSU9OQUwgPSAyOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgYXR0ZW5kYW5jZSBzdGF0dXMgb2YgdGhlIGF0dGVuZGVlLgotICAgICAgICAgKiA8UD5UeXBlOiBJbnRlZ2VyIChvbmUgb2Yge0BsaW5rICNBVFRFTkRFRV9TVEFUVVNfQUNDRVBURUR9LCAuLi59LgorICAgICAgICAgKiBUaGUgYXR0ZW5kYW5jZSBzdGF0dXMgb2YgdGhlIGF0dGVuZGVlLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSW50ZWdlciAob25lIG9mIHtAbGluayAjQVRURU5ERUVfU1RBVFVTX0FDQ0VQVEVEfSwgLi4uKS48L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRFTkRFRV9TVEFUVVMgPSAiYXR0ZW5kZWVTdGF0dXMiOwogCkBAIC01MjEsNTkgKzU4NCw4NCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRFTkRFRV9TVEFUVVNfVEVOVEFUSVZFID0gNDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBGaWVsZHMgYW5kIGhlbHBlcnMgZm9yIGludGVyYWN0aW5nIHdpdGggQXR0ZW5kZWVzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQXR0ZW5kZWVzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEF0dGVuZGVlc0NvbHVtbnMsIEV2ZW50c0NvbHVtbnMgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2F0dGVuZGVlcyIpOwogCi0gICAgICAgIC8vIFRPRE86IGZpbGwgb3V0IHRoaXMgY2xhc3Mgd2hlbiB3ZSBhY3R1YWxseSBzdGFydCB1dGlsaXppbmcgYXR0ZW5kZWVzCi0gICAgICAgIC8vIGluIHRoZSBjYWxlbmRhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgYWNjZXNzaW5nIEF0dGVuZGVlcyBkYXRhCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9hdHRlbmRlZXMiKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRoZSBwcm9qZWN0aW9uIHVzZWQgYnkgdGhlIGF0dGVuZGVlcyBxdWVyeQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICBfSUQsIEFUVEVOREVFX05BTUUsIEFUVEVOREVFX0VNQUlMLCBBVFRFTkRFRV9SRUxBVElPTlNISVAsIEFUVEVOREVFX1NUQVRVUyx9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRURU5ERUVTX1dIRVJFID0gQXR0ZW5kZWVzLkVWRU5UX0lEICsgIj0/IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcmllcyBhbGwgYXR0ZW5kZWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZXZlbnQuIFRoaXMgaXMgYQorICAgICAgICAgKiBibG9ja2luZyBjYWxsIGFuZCBzaG91bGQgbm90IGJlIGRvbmUgb24gdGhlIFVJIHRocmVhZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIFRoZSBjb250ZW50IHJlc29sdmVyIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5CisgICAgICAgICAqIEBwYXJhbSBldmVudElkIFRoZSBpZCBvZiB0aGUgZXZlbnQgdG8gcmV0cmlldmUgYXR0ZW5kZWVzIGZvcgorICAgICAgICAgKiBAcmV0dXJuIEEgQ3Vyc29yIGNvbnRhaW5pbmcgYWxsIGF0dGVuZGVlcyBmb3IgdGhlIGV2ZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIGxvbmcgZXZlbnRJZCkgeworICAgICAgICAgICAgU3RyaW5nW10gYXR0QXJncyA9IHtMb25nLnRvU3RyaW5nKGV2ZW50SWQpfTsKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShDT05URU5UX1VSSSwgUFJPSkVDVElPTiwgQVRURU5ERUVTX1dIRVJFLCBhdHRBcmdzIC8qIHNlbGVjdGlvbiBhcmdzICovLAorICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnQgb3JkZXIgKi8pOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ29sdW1ucyBmcm9tIHRoZSBFdmVudHMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCiAgICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBFdmVudHNDb2x1bW5zIHsKKyAgICBwcml2YXRlIGludGVyZmFjZSBFdmVudHNDb2x1bW5zIHsKICAgICAgICAgLyoqCi0gICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uOyBub3QgbW9kaWZpZWQgYnkgQ2FsZW5kYXJQcm92aWRlcgotICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2x1bW4gd2FzIGZvcm1lcmx5IG5hbWVkIF9TWU5DX0xPQ0FMX0lELiAgV2UgYXJlIHVzaW5nIGl0IHRvIGF2b2lkIGEKLSAgICAgICAgICogc2NoZW1hIGNoYW5nZS4KLSAgICAgICAgICogVE9ETyBSZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogVE9ETyBjaGFuZ2UgdG8gc3luY19kYXRhMgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RBVEEgPSAiX3N5bmNfbG9jYWxfaWQiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgY2FsZW5kYXIgdGhlIGV2ZW50IGJlbG9uZ3MgdG8KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIENhbGVuZGFycyB0YWJsZSk8L1A+CisgICAgICAgICAqIFRoZSB7QGxpbmsgQ2FsZW5kYXJzI19JRH0gb2YgdGhlIGNhbGVuZGFyIHRoZSBldmVudCBiZWxvbmdzIHRvLgorICAgICAgICAgKiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTEVOREFSX0lEID0gImNhbGVuZGFyX2lkIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFVSSSBmb3IgYW4gSFRNTCB2ZXJzaW9uIG9mIHRoaXMgZXZlbnQuCisgICAgICAgICAqIFRoZSBVUkkgZm9yIGFuIEhUTUwgdmVyc2lvbiBvZiB0aGlzIGV2ZW50LiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogVE9ETyBjaGFuZ2UgdG8gc3luY19kYXRhMwogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9VUkkgPSAiaHRtbFVyaSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgZXZlbnQKKyAgICAgICAgICogVGhlIHRpdGxlIG9mIHRoZSBldmVudC4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJ0aXRsZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQKKyAgICAgICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBldmVudC4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXJlIHRoZSBldmVudCB0YWtlcyBwbGFjZS4KKyAgICAgICAgICogV2hlcmUgdGhlIGV2ZW50IHRha2VzIHBsYWNlLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0xPQ0FUSU9OID0gImV2ZW50TG9jYXRpb24iOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZXZlbnQgc3RhdHVzCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGludCk8L1A+CisgICAgICAgICAqIFRoZSBldmVudCBzdGF0dXMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChvbmUgb2Yge0BsaW5rICNTVEFUVVNfVEVOVEFUSVZFfS4uLik8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVMgPSAiZXZlbnRTdGF0dXMiOwogCkBAIC01ODUsNjQgKzY3Myw2NSBAQAogICAgICAgICAgKiBUaGlzIGlzIGEgY29weSBvZiB0aGUgYXR0ZW5kZWUgc3RhdHVzIGZvciB0aGUgb3duZXIgb2YgdGhpcyBldmVudC4KICAgICAgICAgICogVGhpcyBmaWVsZCBpcyBjb3BpZWQgaGVyZSBzbyB0aGF0IHdlIGNhbiBlZmZpY2llbnRseSBmaWx0ZXIgb3V0CiAgICAgICAgICAqIGV2ZW50cyB0aGF0IGFyZSBkZWNsaW5lZCB3aXRob3V0IGhhdmluZyB0byBsb29rIGluIHRoZSBBdHRlbmRlZXMKLSAgICAgICAgICogdGFibGUuCisgICAgICAgICAqIHRhYmxlLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICoKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoaW50KTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEZfQVRURU5ERUVfU1RBVFVTID0gInNlbGZBdHRlbmRlZVN0YXR1cyI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgY29sdW1uIGlzIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMKKyAgICAgICAgICogVGhpcyBjb2x1bW4gaXMgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX0RBVEExID0gInN5bmNfZGF0YTEiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgY29tbWVudHMgZmVlZCB1cmkuCisgICAgICAgICAqIFRoZSBjb21tZW50cyBmZWVkIHVyaS4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIFRPRE8gY2hhbmdlIHRvIHN5bmNfZGF0YTYKICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRTX1VSSSA9ICJjb21tZW50c1VyaSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBzdGFydHMKKyAgICAgICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IHN0YXJ0cyBpbiBVVEMgbWlsbGlzIHNpbmNlIGVwb2NoLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUU1RBUlQgPSAiZHRzdGFydCI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBlbmRzCisgICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBlbmRzIGluIFVUQyBtaWxsaXMgc2luY2UgZXBvY2guIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkQgPSAiZHRlbmQiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIGV2ZW50CisgICAgICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgZXZlbnQgaW4gUkZDMjQ0NSBmb3JtYXQuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChkdXJhdGlvbiBpbiBSRkMyNDQ1IGZvcm1hdCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVVJBVElPTiA9ICJkdXJhdGlvbiI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aW1lem9uZSBmb3IgdGhlIGV2ZW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUCisgICAgICAgICAqIFRoZSB0aW1lem9uZSBmb3IgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1RJTUVaT05FID0gImV2ZW50VGltZXpvbmUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGltZXpvbmUgZm9yIHRoZSBldmVudCwgYWxsRGF5IGV2ZW50cyB3aWxsIGhhdmUgYSBsb2NhbCB0eiBpbnN0ZWFkIG9mIFVUQwotICAgICAgICAgKiA8UD5UeXBlOiBURVhUCisgICAgICAgICAqIFRoZSB0aW1lem9uZSBmb3IgdGhlIGVuZCB0aW1lIG9mIHRoZSBldmVudC4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9FTkRfVElNRVpPTkUgPSAiZXZlbnRFbmRUaW1lem9uZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdGhlIGV2ZW50IGxhc3RzIGFsbCBkYXkgb3Igbm90CisgICAgICAgICAqIElzIHRoZSBldmVudCBhbGwgZGF5ICh0aW1lIHpvbmUgaW5kZXBlbmRlbnQpLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfREFZID0gImFsbERheSI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIERlZmluZXMgaG93IHRoZSBldmVudCBzaG93cyB1cCBmb3Igb3RoZXJzIHdoZW4gdGhlIGNhbGVuZGFyIGlzCi0gICAgICAgICAqIHNoYXJlZC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICogc2hhcmVkLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoT25lIG9mIHtAbGluayAjQUNDRVNTX0RFRkFVTFR9LCAuLi4pPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTX0xFVkVMID0gImFjY2Vzc0xldmVsIjsKIApAQCAtNjU2LDIwICs3NDUsMjAgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU19DT05GSURFTlRJQUwgPSAxOwogICAgICAgICAvKioKLSAgICAgICAgICogUHJpdmF0ZSBhc3N1bWVzIHRoZSBldmVudCBhcHBlYXJzIGFzIGEgZnJlZS9idXN5IHNsb3Qgd2l0aCBubwotICAgICAgICAgKiBkZXRhaWxzLgorICAgICAgICAgKiBQcml2YXRlIHNoYXJlcyB0aGUgZXZlbnQgYXMgYSBmcmVlL2J1c3kgc2xvdCB3aXRoIG5vIGRldGFpbHMuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NfUFJJVkFURSA9IDI7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBQdWJsaWMgYXNzdW1lcyB0aGUgY29udGVudHMgYXJlIHZpc2libGUgdG8gYW55b25lIHdpdGggYWNjZXNzIHRvIHRoZQorICAgICAgICAgKiBQdWJsaWMgbWFrZXMgdGhlIGNvbnRlbnRzIHZpc2libGUgdG8gYW55b25lIHdpdGggYWNjZXNzIHRvIHRoZQogICAgICAgICAgKiBjYWxlbmRhci4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU19QVUJMSUMgPSAzOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJZiB0aGlzIGV2ZW50IGNvdW50cyBhcyBidXN5IHRpbWUgb3IgaXMgc3RpbGwgZnJlZSB0aW1lIHRoYXQgY2FuIGJlCi0gICAgICAgICAqIHNjaGVkdWxlZCBvdmVyLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKiBzY2hlZHVsZWQgb3Zlci4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKE9uZSBvZiB7QGxpbmsgI0FWQUlMQUJJTElUWV9CVVNZfSwKKyAgICAgICAgICoge0BsaW5rICNBVkFJTEFCSUxJVFlfRlJFRX0pPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVZBSUxBQklMSVRZID0gImF2YWlsYWJpbGl0eSI7CiAKQEAgLTY4NSw0NSArNzc0LDQ0IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJJTElUWV9GUkVFID0gMTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0aGUgZXZlbnQgaGFzIGFuIGFsYXJtIG9yIG5vdAorICAgICAgICAgKiBXaGV0aGVyIHRoZSBldmVudCBoYXMgYW4gYWxhcm0gb3Igbm90LiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfQUxBUk0gPSAiaGFzQWxhcm0iOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIHRoZSBldmVudCBoYXMgZXh0ZW5kZWQgcHJvcGVydGllcyBvciBub3QKKyAgICAgICAgICogV2hldGhlciB0aGUgZXZlbnQgaGFzIGV4dGVuZGVkIHByb3BlcnRpZXMgb3Igbm90LiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfRVhURU5ERURfUFJPUEVSVElFUyA9ICJoYXNFeHRlbmRlZFByb3BlcnRpZXMiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcmVjdXJyZW5jZSBydWxlIGZvciB0aGUgZXZlbnQuCi0gICAgICAgICAqIHRoYW4gb25lLgorICAgICAgICAgKiBUaGUgcmVjdXJyZW5jZSBydWxlIGZvciB0aGUgZXZlbnQuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlJVTEUgPSAicnJ1bGUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcmVjdXJyZW5jZSBkYXRlcyBmb3IgdGhlIGV2ZW50LgorICAgICAgICAgKiBUaGUgcmVjdXJyZW5jZSBkYXRlcyBmb3IgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJEQVRFID0gInJkYXRlIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHJlY3VycmVuY2UgZXhjZXB0aW9uIHJ1bGUgZm9yIHRoZSBldmVudC4KKyAgICAgICAgICogVGhlIHJlY3VycmVuY2UgZXhjZXB0aW9uIHJ1bGUgZm9yIHRoZSBldmVudC4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFJVTEUgPSAiZXhydWxlIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHJlY3VycmVuY2UgZXhjZXB0aW9uIGRhdGVzIGZvciB0aGUgZXZlbnQuCisgICAgICAgICAqIFRoZSByZWN1cnJlbmNlIGV4Y2VwdGlvbiBkYXRlcyBmb3IgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYREFURSA9ICJleGRhdGUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgX2lkIG9mIHRoZSBvcmlnaW5hbCByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgYW4KLSAgICAgICAgICogZXhjZXB0aW9uLgorICAgICAgICAgKiBUaGUge0BsaW5rIEV2ZW50cyNfSUR9IG9mIHRoZSBvcmlnaW5hbCByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMKKyAgICAgICAgICogZXZlbnQgaXMgYW4gZXhjZXB0aW9uLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX0lEID0gIm9yaWdpbmFsX2lkIjsKQEAgLTczMSwyNyArODE5LDI4IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgX3N5bmNfaWQgb2YgdGhlIG9yaWdpbmFsIHJlY3VycmluZyBldmVudCBmb3Igd2hpY2ggdGhpcyBldmVudCBpcwogICAgICAgICAgKiBhbiBleGNlcHRpb24uIFRoZSBwcm92aWRlciBzaG91bGQga2VlcCB0aGUgb3JpZ2luYWxfaWQgaW4gc3luYyB3aGVuCi0gICAgICAgICAqIHRoaXMgaXMgdXBkYXRlZC4KKyAgICAgICAgICogdGhpcyBpcyB1cGRhdGVkLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX1NZTkNfSUQgPSAib3JpZ2luYWxfc3luY19pZCI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBvcmlnaW5hbCBpbnN0YW5jZSB0aW1lIG9mIHRoZSByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMKLSAgICAgICAgICogZXZlbnQgaXMgYW4gZXhjZXB0aW9uLgorICAgICAgICAgKiBldmVudCBpcyBhbiBleGNlcHRpb24uIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfSU5TVEFOQ0VfVElNRSA9ICJvcmlnaW5hbEluc3RhbmNlVGltZSI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBhbGxEYXkgc3RhdHVzICh0cnVlIG9yIGZhbHNlKSBvZiB0aGUgb3JpZ2luYWwgcmVjdXJyaW5nIGV2ZW50Ci0gICAgICAgICAqIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICogZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgYW4gZXhjZXB0aW9uLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9BTExfREFZID0gIm9yaWdpbmFsQWxsRGF5IjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxhc3QgZGF0ZSB0aGlzIGV2ZW50IHJlcGVhdHMgb24sIG9yIE5VTEwgaWYgaXQgbmV2ZXIgZW5kcworICAgICAgICAgKiBUaGUgbGFzdCBkYXRlIHRoaXMgZXZlbnQgcmVwZWF0cyBvbiwgb3IgTlVMTCBpZiBpdCBuZXZlciBlbmRzLiBDb2x1bW4KKyAgICAgICAgICogbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfREFURSA9ICJsYXN0RGF0ZSI7CkBAIC03NTksNjEgKzg0OCw2NiBAQAogICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgZXZlbnQgaGFzIGF0dGVuZGVlIGluZm9ybWF0aW9uLiAgVHJ1ZSBpZiB0aGUgZXZlbnQKICAgICAgICAgICogaGFzIGZ1bGwgYXR0ZW5kZWUgZGF0YSwgZmFsc2UgaWYgdGhlIGV2ZW50IGhhcyBpbmZvcm1hdGlvbiBhYm91dAotICAgICAgICAgKiBzZWxmIG9ubHkuCisgICAgICAgICAqIHNlbGYgb25seS4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFTX0FUVEVOREVFX0RBVEEgPSAiaGFzQXR0ZW5kZWVEYXRhIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciBndWVzdHMgY2FuIG1vZGlmeSB0aGUgZXZlbnQuCisgICAgICAgICAqIFdoZXRoZXIgZ3Vlc3RzIGNhbiBtb2RpZnkgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUVTVFNfQ0FOX01PRElGWSA9ICJndWVzdHNDYW5Nb2RpZnkiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIGd1ZXN0cyBjYW4gaW52aXRlIG90aGVyIGd1ZXN0cy4KKyAgICAgICAgICogV2hldGhlciBndWVzdHMgY2FuIGludml0ZSBvdGhlciBndWVzdHMuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVRVNUU19DQU5fSU5WSVRFX09USEVSUyA9ICJndWVzdHNDYW5JbnZpdGVPdGhlcnMiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIGd1ZXN0cyBjYW4gc2VlIHRoZSBsaXN0IG9mIGF0dGVuZGVlcy4KKyAgICAgICAgICogV2hldGhlciBndWVzdHMgY2FuIHNlZSB0aGUgbGlzdCBvZiBhdHRlbmRlZXMuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVRVNUU19DQU5fU0VFX0dVRVNUUyA9ICJndWVzdHNDYW5TZWVHdWVzdHMiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBFbWFpbCBvZiB0aGUgb3JnYW5pemVyIChvd25lcikgb2YgdGhlIGV2ZW50LgorICAgICAgICAgKiBFbWFpbCBvZiB0aGUgb3JnYW5pemVyIChvd25lcikgb2YgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogU1RSSU5HPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHQU5JWkVSID0gIm9yZ2FuaXplciI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgY2FuIGludml0ZSBvdGhlcnMgdG8gdGhlIGV2ZW50LgotICAgICAgICAgKiBUaGUgR1VFU1RTX0NBTl9JTlZJVEVfT1RIRVJTIGlzIGEgc2V0dGluZyB0aGF0IGFwcGxpZXMgdG8gYW4gYXJiaXRyYXJ5IGd1ZXN0LAotICAgICAgICAgKiB3aGlsZSBDQU5fSU5WSVRFX09USEVSUyBpbmRpY2F0ZXMgaWYgdGhlIHVzZXIgY2FuIGludml0ZSBvdGhlcnMgKGVpdGhlciB0aHJvdWdoCi0gICAgICAgICAqIEdVRVNUU19DQU5fSU5WSVRFX09USEVSUyBvciBiZWNhdXNlIHRoZSB1c2VyIGhhcyBtb2RpZnkgYWNjZXNzIHRvIHRoZSBldmVudCkuCisgICAgICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgY2FuIGludml0ZSBvdGhlcnMgdG8gdGhlIGV2ZW50LiBUaGUKKyAgICAgICAgICogR1VFU1RTX0NBTl9JTlZJVEVfT1RIRVJTIGlzIGEgc2V0dGluZyB0aGF0IGFwcGxpZXMgdG8gYW4gYXJiaXRyYXJ5CisgICAgICAgICAqIGd1ZXN0LCB3aGlsZSBDQU5fSU5WSVRFX09USEVSUyBpbmRpY2F0ZXMgaWYgdGhlIHVzZXIgY2FuIGludml0ZQorICAgICAgICAgKiBvdGhlcnMgKGVpdGhlciB0aHJvdWdoIEdVRVNUU19DQU5fSU5WSVRFX09USEVSUyBvciBiZWNhdXNlIHRoZSB1c2VyCisgICAgICAgICAqIGhhcyBtb2RpZnkgYWNjZXNzIHRvIHRoZSBldmVudCkuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuLCByZWFkb25seSk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5fSU5WSVRFX09USEVSUyA9ICJjYW5JbnZpdGVPdGhlcnMiOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgb3duZXIgYWNjb3VudCBmb3IgdGhpcyBjYWxlbmRhciwgYmFzZWQgb24gdGhlIGNhbGVuZGFyIChmb3JlaWduCi0gICAgICAgICAqIGtleSBpbnRvIHRoZSBjYWxlbmRhcnMgdGFibGUpLgorICAgICAgICAgKiBrZXkgaW50byB0aGUgY2FsZW5kYXJzIHRhYmxlKS4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFN0cmluZzwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9XTkVSX0FDQ09VTlQgPSAib3duZXJBY2NvdW50IjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0aGUgcm93IGhhcyBiZWVuIGRlbGV0ZWQuICBBIGRlbGV0ZWQgcm93IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAgICAgKiBXaGV0aGVyIHRoZSByb3cgaGFzIGJlZW4gZGVsZXRlZC4gQSBkZWxldGVkIHJvdyBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgICAgICogQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFRCA9ICJkZWxldGVkIjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb250YWlucyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyIGV2ZW50LiBSZWN1cnJpbmcgZXZlbnRzIHNob3cgdXAgYXMgYQotICAgICAqIHNpbmdsZSBlbnRyeS4KKyAgICAgKiBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gRXZlbnQgRW50aXR5LiBUaGVyZSBpcyBvbmUgZW50cnkgcGVyIGV2ZW50LgorICAgICAqIFJlY3VycmluZyBldmVudHMgc2hvdyB1cCBhcyBhIHNpbmdsZSBlbnRyeS4gVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0bworICAgICAqIG1ha2UgYmF0Y2ggb3BlcmF0aW9ucyBlYXNpZXIuIEEge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gb3IKKyAgICAgKiB7QGxpbmsgQ29udGVudFByb3ZpZGVyQ2xpZW50fSBpcyByZXF1aXJlZCBhcyB0aGUgaGVscGVyIGRvZXMgYWRkaXRpb25hbAorICAgICAqIHF1ZXJpZXMgdG8gYWRkIHJlbWluZGVycyBhbmQgYXR0ZW5kZWVzIHRvIGVhY2ggZW50cnkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEV2ZW50c0NvbHVtbnMgewogICAgICAgICAvKioKQEAgLTgyMiwxMCArOTE2LDI2IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCiAgICAgICAgICAgICAgICAgIi9ldmVudF9lbnRpdGllcyIpOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGl0ZXJhdG9yIGZvciBldmVudHMKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBBbiBldmVudCBxdWVyeQorICAgICAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgRm9yIHBlcmZvcm1pbmcgYWRkaXRpb25hbCBxdWVyaWVzCisgICAgICAgICAqIEByZXR1cm4gYW4gRW50aXR5SXRlcmF0b3IgY29udGFpbmluZyBvbmUgZW50aXR5IHBlciBldmVudCBpbiB0aGUKKyAgICAgICAgICogICAgICAgICBjdXJzb3IKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IsIHJlc29sdmVyKTsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGl0ZXJhdG9yIGZvciBldmVudHMKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBBbiBldmVudCBxdWVyeQorICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgRm9yIHBlcmZvcm1pbmcgYWRkaXRpb25hbCBxdWVyaWVzCisgICAgICAgICAqIEByZXR1cm4gYW4gRW50aXR5SXRlcmF0b3IgY29udGFpbmluZyBvbmUgZW50aXR5IHBlciBldmVudCBpbiB0aGUKKyAgICAgICAgICogICAgICAgICBjdXJzb3IKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwKICAgICAgICAgICAgICAgICBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcHJvdmlkZXIpOwpAQCAtOTIyLDggKzEwMzIsMTMgQEAKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19EQVRBKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRElSVFkpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEV2ZW50c0NvbHVtbnMuREVMRVRFRCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQzEpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERFTEVURUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTF9TWU5DMSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMX1NZTkMyKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDQUxfU1lOQzMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTF9TWU5DNCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMX1NZTkM1KTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDQUxfU1lOQzYpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCiAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudHMuU1lOQ19EQVRBMSk7CiAKQEAgLTEwMTQsNTMgKzExMjksNTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb250YWlucyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyIGV2ZW50LiBSZWN1cnJpbmcgZXZlbnRzIHNob3cgdXAgYXMgYSBzaW5nbGUgZW50cnkuCisgICAgICogRmllbGRzIGFuZCBoZWxwZXJzIGZvciBpbnRlcmFjdGluZyB3aXRoIEV2ZW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50cyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgRXZlbnRzQ29sdW1ucyB7CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRkVUQ0hfRU5UUllfQ09MVU1OUyA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgRXZlbnRzLkFDQ09VTlRfTkFNRSwgRXZlbnRzLl9TWU5DX0lEIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVRURU5ERUVTX0NPTFVNTlMgPQotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEF0dGVuZGVlc0NvbHVtbnMuQVRURU5ERUVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRlbmRlZXNDb2x1bW5zLkFUVEVOREVFX0VNQUlMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGVuZGVlc0NvbHVtbnMuQVRURU5ERUVfUkVMQVRJT05TSElQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGVuZGVlc0NvbHVtbnMuQVRURU5ERUVfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRlbmRlZXNDb2x1bW5zLkFUVEVOREVFX1NUQVRVUyB9OwotCisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWVyaWVzIGFsbCBldmVudHMgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdGlvbi4gVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwKKyAgICAgICAgICogYW5kIHNob3VsZCBub3QgYmUgZG9uZSBvbiB0aGUgVUkgdGhyZWFkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgVGhlIGNvbnRlbnQgcmVzb2x2ZXIgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIHByb2plY3Rpb24gVGhlIGNvbHVtbnMgdG8gcmV0dXJuCisgICAgICAgICAqIEByZXR1cm4gQSBDdXJzb3IgY29udGFpbmluZyBhbGwgZXZlbnRzIGluIHRoZSBkYgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uKSB7CiAgICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoQ09OVEVOVF9VUkksIHByb2plY3Rpb24sIG51bGwsIG51bGwsIERFRkFVTFRfU09SVF9PUkRFUik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoQ09OVEVOVF9VUkksIHByb2plY3Rpb24sIHdoZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0VmFsdWUoSUNhbGVuZGFyLkNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICAgICAgSUNhbGVuZGFyLlByb3BlcnR5IHByb3BlcnR5ID0KLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldEZpcnN0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1ZXJpZXMgZXZlbnRzIHVzaW5nIHRoZSBnaXZlbiBwcm9qZWN0aW9uLCBzZWxlY3Rpb24gZmlsdGVyLCBhbmQKKyAgICAgICAgICogb3JkZXJpbmcuIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsIGFuZCBzaG91bGQgbm90IGJlIGRvbmUgb24gdGhlIFVJCisgICAgICAgICAqIHRocmVhZC4gRm9yIHNlbGVjdGlvbiBhbmQgc2VsZWN0aW9uQXJncyB1c2FnZSBzZWUKKyAgICAgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNxdWVyeShVcmksIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgVGhlIGNvbnRlbnQgcmVzb2x2ZXIgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIHByb2plY3Rpb24gVGhlIGNvbHVtbnMgdG8gcmV0dXJuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gRmlsdGVyIG9uIHRoZSBxdWVyeSBhcyBhbiBTUUwgV0hFUkUgc3RhdGVtZW50CisgICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIEFyZ3MgdG8gcmVwbGFjZSBhbnkgJz8ncyBpbiB0aGUgc2VsZWN0aW9uCisgICAgICAgICAqIEBwYXJhbSBvcmRlckJ5IEhvdyB0byBvcmRlciB0aGUgcm93cyBhcyBhbiBTUUwgT1JERVIgQlkgc3RhdGVtZW50CisgICAgICAgICAqIEByZXR1cm4gQSBDdXJzb3IgY29udGFpbmluZyB0aGUgbWF0Y2hpbmcgZXZlbnRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIG9yZGVyQnkpIHsKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShDT05URU5UX1VSSSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciBpbnRlcmFjdGluZyB3aXRoIGV2ZW50cy4gQXBwZW5kaW5nIGFuCisgICAgICAgICAqIGV2ZW50IGlkIHVzaW5nIHtAbGluayBDb250ZW50VXJpcyN3aXRoQXBwZW5kZWRJZChVcmksIGxvbmcpfSB3aWxsCisgICAgICAgICAqIHNwZWNpZnkgYSBzaW5nbGUgZXZlbnQuCiAgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQogICAgICAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2V2ZW50cyIpOwogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIERFTEVURURfQ09OVEVOVF9VUkkgPQotICAgICAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2RlbGV0ZWRfZXZlbnRzIik7Ci0KICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgZm9yIHRoaXMgdGFibGUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUiA9ICIiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1JUX09SREVSID0gIiI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZXNlIGFyZSBjb2x1bW5zIHRoYXQgc2hvdWxkIG9ubHkgZXZlciBiZSB1cGRhdGVkIGJ5IHRoZSBwcm92aWRlciwKQEAgLTEwNjksNyArMTE4NSwxMyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBQUk9WSURFUl9XUklUQUJMRV9DT0xVTU5TID0gbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICBBQ0NPVU5UX05BTUUsCi0gICAgICAgICAgICAgICAgQUNDT1VOVF9UWVBFCisgICAgICAgICAgICAgICAgQUNDT1VOVF9UWVBFLAorICAgICAgICAgICAgICAgIENBTF9TWU5DMSwKKyAgICAgICAgICAgICAgICBDQUxfU1lOQzIsCisgICAgICAgICAgICAgICAgQ0FMX1NZTkMzLAorICAgICAgICAgICAgICAgIENBTF9TWU5DNCwKKyAgICAgICAgICAgICAgICBDQUxfU1lOQzUsCisgICAgICAgICAgICAgICAgQ0FMX1NZTkM2CiAgICAgICAgIH07CiAKICAgICAgICAgLyoqCkBAIC0xMDg3LDEzICsxMjA5LDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29udGFpbnMgb25lIGVudHJ5IHBlciBjYWxlbmRhciBldmVudCBpbnN0YW5jZS4gUmVjdXJyaW5nIGV2ZW50cyBzaG93IHVwIGV2ZXJ5IHRpbWUKLSAgICAgKiB0aGV5IG9jY3VyLgorICAgICAqIEZpZWxkcyBhbmQgaGVscGVycyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBJbnN0YW5jZXMuIEFuIGluc3RhbmNlIGlzIGEKKyAgICAgKiBzaW5nbGUgb2NjdXJyZW5jZSBvZiBhbiBldmVudCBpbmNsdWRpbmcgdGltZSB6b25lIHNwZWNpZmljIHN0YXJ0IGFuZCBlbmQKKyAgICAgKiBkYXlzIGFuZCBtaW51dGVzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSW5zdGFuY2VzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgewogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQgPSBDYWxlbmRhcnMuVklTSUJMRSArICI9MSI7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGEgcXVlcnkgdG8gcmV0dXJuIGFsbCB2aXNpYmxlIGluc3RhbmNlcyBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgICAgICAgICAqIFRoaXMgaXMgYSBibG9ja2luZyBmdW5jdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBkb25lIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICAgICAqIFRoaXMgd2lsbCBjYXVzZSBhbiBleHBhbnNpb24gb2YgcmVjdXJyaW5nIGV2ZW50cyB0byBmaWxsIHRoaXMgdGltZQorICAgICAgICAgKiByYW5nZSBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBleHBhbmRlZCBhbmQgd2lsbCBzbG93IGRvd24gZm9yIGxhcmdlcgorICAgICAgICAgKiB0aW1lIHJhbmdlcyB3aXRoIG1hbnkgcmVjdXJyaW5nIGV2ZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIFRoZSBDb250ZW50UmVzb2x2ZXIgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIHByb2plY3Rpb24gVGhlIGNvbHVtbnMgdG8gcmV0dXJuCisgICAgICAgICAqIEBwYXJhbSBiZWdpbiBUaGUgc3RhcnQgb2YgdGhlIHRpbWUgcmFuZ2UgdG8gcXVlcnkgaW4gVVRDIG1pbGxpcyBzaW5jZQorICAgICAgICAgKiAgICAgICAgICAgIGVwb2NoCisgICAgICAgICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZiB0aGUgdGltZSByYW5nZSB0byBxdWVyeSBpbiBVVEMgbWlsbGlzIHNpbmNlCisgICAgICAgICAqICAgICAgICAgICAgZXBvY2gKKyAgICAgICAgICogQHJldHVybiBBIEN1cnNvciBjb250YWluaW5nIGFsbCBpbnN0YW5jZXMgaW4gdGhlIGdpdmVuIHJhbmdlCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kKSB7CiAgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7CkBAIC0xMTAzLDExMSArMTI0MSwxODQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBERUZBVUxUX1NPUlRfT1JERVIpOwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGEgcXVlcnkgdG8gcmV0dXJuIGFsbCB2aXNpYmxlIGluc3RhbmNlcyBpbiB0aGUgZ2l2ZW4gcmFuZ2UKKyAgICAgICAgICogdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcXVlcnkuIFRoaXMgaXMgYSBibG9ja2luZyBmdW5jdGlvbiBhbmQgc2hvdWxkCisgICAgICAgICAqIG5vdCBiZSBkb25lIG9uIHRoZSBVSSB0aHJlYWQuIFRoaXMgd2lsbCBjYXVzZSBhbiBleHBhbnNpb24gb2YKKyAgICAgICAgICogcmVjdXJyaW5nIGV2ZW50cyB0byBmaWxsIHRoaXMgdGltZSByYW5nZSBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeQorICAgICAgICAgKiBleHBhbmRlZCBhbmQgd2lsbCBzbG93IGRvd24gZm9yIGxhcmdlciB0aW1lIHJhbmdlcyB3aXRoIG1hbnkKKyAgICAgICAgICogcmVjdXJyaW5nIGV2ZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIFRoZSBDb250ZW50UmVzb2x2ZXIgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIHByb2plY3Rpb24gVGhlIGNvbHVtbnMgdG8gcmV0dXJuCisgICAgICAgICAqIEBwYXJhbSBiZWdpbiBUaGUgc3RhcnQgb2YgdGhlIHRpbWUgcmFuZ2UgdG8gcXVlcnkgaW4gVVRDIG1pbGxpcyBzaW5jZQorICAgICAgICAgKiAgICAgICAgICAgIGVwb2NoCisgICAgICAgICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZiB0aGUgdGltZSByYW5nZSB0byBxdWVyeSBpbiBVVEMgbWlsbGlzIHNpbmNlCisgICAgICAgICAqICAgICAgICAgICAgZXBvY2gKKyAgICAgICAgICogQHBhcmFtIHNlYXJjaFF1ZXJ5IEEgc3RyaW5nIG9mIHNwYWNlIHNlcGFyYXRlZCBzZWFyY2ggdGVybXMuIFNlZ21lbnRzCisgICAgICAgICAqICAgICAgICAgICAgZW5jbG9zZWQgYnkgZG91YmxlIHF1b3RlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUKKyAgICAgICAgICogICAgICAgICAgICB0ZXJtLgorICAgICAgICAgKiBAcmV0dXJuIEEgQ3Vyc29yIG9mIGluc3RhbmNlcyBtYXRjaGluZyB0aGUgc2VhcmNoIHRlcm1zIGluIHRoZSBnaXZlbgorICAgICAgICAgKiAgICAgICAgIHRpbWUgcmFuZ2UKKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBiZWdpbiwgbG9uZyBlbmQsIFN0cmluZyBzZWFyY2hRdWVyeSkgewogICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfU0VBUkNIX1VSSS5idWlsZFVwb24oKTsKICAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGJlZ2luKTsKICAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGVuZCk7Ci0gICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgc2VhcmNoUXVlcnkgfSwgREVGQVVMVF9TT1JUX09SREVSKTsKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmFwcGVuZFBhdGgoc2VhcmNoUXVlcnkpOworICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVELCBudWxsLAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1NPUlRfT1JERVIpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJlZ2luLCBsb25nIGVuZCwgU3RyaW5nIHdoZXJlLCBTdHJpbmcgb3JkZXJCeSkgeworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgYSBxdWVyeSB0byByZXR1cm4gYWxsIHZpc2libGUgaW5zdGFuY2VzIGluIHRoZSBnaXZlbiByYW5nZQorICAgICAgICAgKiB0aGF0IG1hdGNoIHRoZSBnaXZlbiBzZWxlY3Rpb24uIFRoaXMgaXMgYSBibG9ja2luZyBmdW5jdGlvbiBhbmQKKyAgICAgICAgICogc2hvdWxkIG5vdCBiZSBkb25lIG9uIHRoZSBVSSB0aHJlYWQuIFRoaXMgd2lsbCBjYXVzZSBhbiBleHBhbnNpb24gb2YKKyAgICAgICAgICogcmVjdXJyaW5nIGV2ZW50cyB0byBmaWxsIHRoaXMgdGltZSByYW5nZSBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeQorICAgICAgICAgKiBleHBhbmRlZCBhbmQgd2lsbCBzbG93IGRvd24gZm9yIGxhcmdlciB0aW1lIHJhbmdlcyB3aXRoIG1hbnkKKyAgICAgICAgICogcmVjdXJyaW5nIGV2ZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIFRoZSBDb250ZW50UmVzb2x2ZXIgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIHByb2plY3Rpb24gVGhlIGNvbHVtbnMgdG8gcmV0dXJuCisgICAgICAgICAqIEBwYXJhbSBiZWdpbiBUaGUgc3RhcnQgb2YgdGhlIHRpbWUgcmFuZ2UgdG8gcXVlcnkgaW4gVVRDIG1pbGxpcyBzaW5jZQorICAgICAgICAgKiAgICAgICAgICAgIGVwb2NoCisgICAgICAgICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZiB0aGUgdGltZSByYW5nZSB0byBxdWVyeSBpbiBVVEMgbWlsbGlzIHNpbmNlCisgICAgICAgICAqICAgICAgICAgICAgZXBvY2gKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdGlvbiBGaWx0ZXIgb24gdGhlIHF1ZXJ5IGFzIGFuIFNRTCBXSEVSRSBzdGF0ZW1lbnQKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgQXJncyB0byByZXBsYWNlIGFueSAnPydzIGluIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgICogQHBhcmFtIG9yZGVyQnkgSG93IHRvIG9yZGVyIHRoZSByb3dzIGFzIGFuIFNRTCBPUkRFUiBCWSBzdGF0ZW1lbnQKKyAgICAgICAgICogQHJldHVybiBBIEN1cnNvciBvZiBpbnN0YW5jZXMgbWF0Y2hpbmcgdGhlIHNlbGVjdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBsb25nIGJlZ2luLAorICAgICAgICAgICAgICAgIGxvbmcgZW5kLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgb3JkZXJCeSkgewogICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfVVJJLmJ1aWxkVXBvbigpOwogICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOwogICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZW5kKTsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZSkpIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9IFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRDsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZWxlY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9ICIoIiArIHdoZXJlICsgIikgQU5EICIgKyBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gIigiICsgc2VsZWN0aW9uICsgIikgQU5EICIgKyBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCB3aGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwgbG9uZyBiZWdpbiwKLSAgICAgICAgICAgICAgICBsb25nIGVuZCwgU3RyaW5nIHNlYXJjaFF1ZXJ5LCBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7Ci0gICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9TRUFSQ0hfVVJJLmJ1aWxkVXBvbigpOwotICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOwotICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZW5kKTsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmFwcGVuZFBhdGgoc2VhcmNoUXVlcnkpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHdoZXJlKSkgewotICAgICAgICAgICAgICAgIHdoZXJlID0gV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9ICIoIiArIHdoZXJlICsgIikgQU5EICIgKyBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCB3aGVyZSwgbnVsbCwKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShidWlsZGVyLmJ1aWxkKCksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywKICAgICAgICAgICAgICAgICAgICAgb3JkZXJCeSA9PSBudWxsID8gREVGQVVMVF9TT1JUX09SREVSIDogb3JkZXJCeSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqIFBlcmZvcm1zIGEgcXVlcnkgdG8gcmV0dXJuIGFsbCB2aXNpYmxlIGluc3RhbmNlcyBpbiB0aGUgZ2l2ZW4gcmFuZ2UKKyAgICAgICAgICogdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gc2VsZWN0aW9uLiBUaGlzIGlzIGEgYmxvY2tpbmcgZnVuY3Rpb24gYW5kCisgICAgICAgICAqIHNob3VsZCBub3QgYmUgZG9uZSBvbiB0aGUgVUkgdGhyZWFkLiBUaGlzIHdpbGwgY2F1c2UgYW4gZXhwYW5zaW9uIG9mCisgICAgICAgICAqIHJlY3VycmluZyBldmVudHMgdG8gZmlsbCB0aGlzIHRpbWUgcmFuZ2UgaWYgdGhleSBhcmUgbm90IGFscmVhZHkKKyAgICAgICAgICogZXhwYW5kZWQgYW5kIHdpbGwgc2xvdyBkb3duIGZvciBsYXJnZXIgdGltZSByYW5nZXMgd2l0aCBtYW55CisgICAgICAgICAqIHJlY3VycmluZyBldmVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjciBUaGUgQ29udGVudFJlc29sdmVyIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5CisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIFRoZSBjb2x1bW5zIHRvIHJldHVybgorICAgICAgICAgKiBAcGFyYW0gYmVnaW4gVGhlIHN0YXJ0IG9mIHRoZSB0aW1lIHJhbmdlIHRvIHF1ZXJ5IGluIFVUQyBtaWxsaXMgc2luY2UKKyAgICAgICAgICogICAgICAgICAgICBlcG9jaAorICAgICAgICAgKiBAcGFyYW0gZW5kIFRoZSBlbmQgb2YgdGhlIHRpbWUgcmFuZ2UgdG8gcXVlcnkgaW4gVVRDIG1pbGxpcyBzaW5jZQorICAgICAgICAgKiAgICAgICAgICAgIGVwb2NoCisgICAgICAgICAqIEBwYXJhbSBzZWFyY2hRdWVyeSBBIHN0cmluZyBvZiBzcGFjZSBzZXBhcmF0ZWQgc2VhcmNoIHRlcm1zLiBTZWdtZW50cworICAgICAgICAgKiAgICAgICAgICAgIGVuY2xvc2VkIGJ5IGRvdWJsZSBxdW90ZXMgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlCisgICAgICAgICAqICAgICAgICAgICAgdGVybS4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdGlvbiBGaWx0ZXIgb24gdGhlIHF1ZXJ5IGFzIGFuIFNRTCBXSEVSRSBzdGF0ZW1lbnQKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgQXJncyB0byByZXBsYWNlIGFueSAnPydzIGluIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgICogQHBhcmFtIG9yZGVyQnkgSG93IHRvIG9yZGVyIHRoZSByb3dzIGFzIGFuIFNRTCBPUkRFUiBCWSBzdGF0ZW1lbnQKKyAgICAgICAgICogQHJldHVybiBBIEN1cnNvciBvZiBpbnN0YW5jZXMgbWF0Y2hpbmcgdGhlIHNlbGVjdGlvbgogICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBsb25nIGJlZ2luLAorICAgICAgICAgICAgICAgIGxvbmcgZW5kLCBTdHJpbmcgc2VhcmNoUXVlcnksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICAgICAgU3RyaW5nIG9yZGVyQnkpIHsKKyAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1NFQVJDSF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOworICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIuYXBwZW5kUGF0aChzZWFyY2hRdWVyeSk7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2VsZWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gIigiICsgc2VsZWN0aW9uICsgIikgQU5EICIgKyBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICAgICAgICAgIG9yZGVyQnkgPT0gbnVsbCA/IERFRkFVTFRfU09SVF9PUkRFUiA6IG9yZGVyQnkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgcXVlcnlpbmcgYW4gaW5zdGFuY2UgcmFuZ2UuIFRoZSBiZWdpbgorICAgICAgICAgKiBhbmQgZW5kIG9mIHRoZSByYW5nZSB0byBxdWVyeSBzaG91bGQgYmUgYWRkZWQgYXMgcGF0aCBzZWdtZW50cyBpZgorICAgICAgICAgKiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsKICAgICAgICAgICAgICAgICAiL2luc3RhbmNlcy93aGVuIik7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHF1ZXJ5aW5nIGFuIGluc3RhbmNlIHJhbmdlIGJ5IEp1bGlhbgorICAgICAgICAgKiBEYXkuIFRoZSBzdGFydCBhbmQgZW5kIGRheSBzaG91bGQgYmUgYWRkZWQgYXMgcGF0aCBzZWdtZW50cyBpZiB0aGlzCisgICAgICAgICAqIGlzIHVzZWQgZGlyZWN0bHkuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX0JZX0RBWV9VUkkgPQogICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvaW5zdGFuY2VzL3doZW5ieWRheSIpOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciBxdWVyeWluZyBhbiBpbnN0YW5jZSByYW5nZSB3aXRoIGEgc2VhcmNoCisgICAgICAgICAqIHRlcm0uIFRoZSBiZWdpbiwgZW5kLCBhbmQgc2VhcmNoIHN0cmluZyBzaG91bGQgYmUgYXBwZW5kZWQgYXMgcGF0aAorICAgICAgICAgKiBzZWdtZW50cyBpZiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1NFQVJDSF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsKICAgICAgICAgICAgICAgICAiL2luc3RhbmNlcy9zZWFyY2giKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgcXVlcnlpbmcgYW4gaW5zdGFuY2UgcmFuZ2Ugd2l0aCBhIHNlYXJjaAorICAgICAgICAgKiB0ZXJtLiBUaGUgc3RhcnQgZGF5LCBlbmQgZGF5LCBhbmQgc2VhcmNoIHN0cmluZyBzaG91bGQgYmUgYXBwZW5kZWQgYXMKKyAgICAgICAgICogcGF0aCBzZWdtZW50cyBpZiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1NFQVJDSF9CWV9EQVlfVVJJID0KICAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2luc3RhbmNlcy9zZWFyY2hieWRheSIpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZvciB0aGlzIHRhYmxlLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1JUX09SREVSID0gImJlZ2luIEFTQyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAiYmVnaW4gQVNDIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHNvcnQgb3JkZXIgaXM6IGV2ZW50cyB3aXRoIGFuIGVhcmxpZXIgc3RhcnQgdGltZSBvY2N1cgotICAgICAgICAgKiBmaXJzdCBhbmQgaWYgdGhlIHN0YXJ0IHRpbWVzIGFyZSB0aGUgc2FtZSwgdGhlbiBldmVudHMgd2l0aAotICAgICAgICAgKiBhIGxhdGVyIGVuZCB0aW1lIG9jY3VyIGZpcnN0LiBUaGUgbGF0ZXIgZW5kIHRpbWUgaXMgb3JkZXJlZAotICAgICAgICAgKiBmaXJzdCBzbyB0aGF0IGxvbmctcnVubmluZyBldmVudHMgaW4gdGhlIGNhbGVuZGFyIHZpZXdzIGFwcGVhcgotICAgICAgICAgKiBmaXJzdC4gIElmIHRoZSBzdGFydCBhbmQgZW5kIHRpbWVzIG9mIHR3byBldmVudHMgYXJlCi0gICAgICAgICAqIHRoZSBzYW1lIHRoZW4gd2Ugc29ydCBhbHBoYWJldGljYWxseSBvbiB0aGUgdGl0bGUuICBUaGlzIGlzbid0Ci0gICAgICAgICAqIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcywgaXQganVzdCBhZGRzIGEgbmljZSB0b3VjaC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfQ0FMRU5EQVJfVklFVyA9ICJiZWdpbiBBU0MsIGVuZCBERVNDLCB0aXRsZSBBU0MiOwotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGJlZ2lubmluZyB0aW1lIG9mIHRoZSBpbnN0YW5jZSwgaW4gVVRDIG1pbGxpc2Vjb25kcworICAgICAgICAgKiBUaGUgYmVnaW5uaW5nIHRpbWUgb2YgdGhlIGluc3RhbmNlLCBpbiBVVEMgbWlsbGlzZWNvbmRzLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFR0lOID0gImJlZ2luIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGVuZGluZyB0aW1lIG9mIHRoZSBpbnN0YW5jZSwgaW4gVVRDIG1pbGxpc2Vjb25kcworICAgICAgICAgKiBUaGUgZW5kaW5nIHRpbWUgb2YgdGhlIGluc3RhbmNlLCBpbiBVVEMgbWlsbGlzZWNvbmRzLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORCA9ICJlbmQiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZXZlbnQgZm9yIHRoaXMgaW5zdGFuY2UKKyAgICAgICAgICogVGhlIF9pZCBvZiB0aGUgZXZlbnQgZm9yIHRoaXMgaW5zdGFuY2UuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nLCBmb3JlaWduIGtleSB0byB0aGUgRXZlbnRzIHRhYmxlKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0lEID0gImV2ZW50X2lkIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIEp1bGlhbiBzdGFydCBkYXkgb2YgdGhlIGluc3RhbmNlLCByZWxhdGl2ZSB0byB0aGUgbG9jYWwgdGltZXpvbmUKKyAgICAgICAgICogVGhlIEp1bGlhbiBzdGFydCBkYXkgb2YgdGhlIGluc3RhbmNlLCByZWxhdGl2ZSB0byB0aGUgbG9jYWwgdGltZQorICAgICAgICAgKiB6b25lLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoaW50KTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX0RBWSA9ICJzdGFydERheSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBKdWxpYW4gZW5kIGRheSBvZiB0aGUgaW5zdGFuY2UsIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCB0aW1lem9uZQorICAgICAgICAgKiBUaGUgSnVsaWFuIGVuZCBkYXkgb2YgdGhlIGluc3RhbmNlLCByZWxhdGl2ZSB0byB0aGUgbG9jYWwgdGltZQorICAgICAgICAgKiB6b25lLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoaW50KTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9EQVkgPSAiZW5kRGF5IjsKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHN0YXJ0IG1pbnV0ZSBvZiB0aGUgaW5zdGFuY2UgbWVhc3VyZWQgZnJvbSBtaWRuaWdodCBpbiB0aGUKLSAgICAgICAgICogbG9jYWwgdGltZXpvbmUuCisgICAgICAgICAqIGxvY2FsIHRpbWUgem9uZS4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGludCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9NSU5VVEUgPSAic3RhcnRNaW51dGUiOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZW5kIG1pbnV0ZSBvZiB0aGUgaW5zdGFuY2UgbWVhc3VyZWQgZnJvbSBtaWRuaWdodCBpbiB0aGUKLSAgICAgICAgICogbG9jYWwgdGltZXpvbmUuCisgICAgICAgICAqIGxvY2FsIHRpbWUgem9uZS4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGludCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfTUlOVVRFID0gImVuZE1pbnV0ZSI7CkBAIC0xMjE1LDE0ICsxNDI2LDEyIEBACiAKICAgICAvKioKICAgICAgKiBDYWxlbmRhckNhY2hlIHN0b3JlcyBzb21lIHNldHRpbmdzIGZvciBjYWxlbmRhciBpbmNsdWRpbmcgdGhlIGN1cnJlbnQKLSAgICAgKiB0aW1lIHpvbmUgZm9yIHRoZSBhcHAuIFRoZXNlIHNldHRpbmdzIGFyZSBzdG9yZWQgdXNpbmcgYSBrZXkvdmFsdWUKKyAgICAgKiB0aW1lIHpvbmUgZm9yIHRoZSBpbnN0YWNlcy4gVGhlc2Ugc2V0dGluZ3MgYXJlIHN0b3JlZCB1c2luZyBhIGtleS92YWx1ZQogICAgICAqIHNjaGVtZS4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyQ2FjaGVDb2x1bW5zIHsKKyAgICBwcml2YXRlIGludGVyZmFjZSBDYWxlbmRhckNhY2hlQ29sdW1ucyB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUga2V5IGZvciB0aGUgc2V0dGluZy4gS2V5cyBhcmUgZGVmaW5lZCBpbiBDYWxlbmRhckNoYWNoZSBpbiB0aGUKLSAgICAgICAgICogQ2FsZW5kYXIgcHJvdmlkZXIuCi0gICAgICAgICAqIFRPRE8gQWRkIGtleXMgdG8gdGhpcyBmaWxlCisgICAgICAgICAqIFRoZSBrZXkgZm9yIHRoZSBzZXR0aW5nLiBLZXlzIGFyZSBkZWZpbmVkIGluIHtAbGluayBDYWxlbmRhckNhY2hlfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJrZXkiOwogCkBAIC0xMjkyLDcgKzE1MDEsNyBAQAogICAgICAqIHRoZSBJbnN0YW5jZXMgdGFibGUgYW5kIHRoZXNlIGFyZSBhbGwgc3RvcmVkIGluIHRoZSBmaXJzdCAoYW5kIG9ubHkpCiAgICAgICogcm93IG9mIHRoZSBDYWxlbmRhck1ldGFEYXRhIHRhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMgeworICAgIHByaXZhdGUgaW50ZXJmYWNlIENhbGVuZGFyTWV0YURhdGFDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBsb2NhbCB0aW1lem9uZSB0aGF0IHdhcyB1c2VkIGZvciBwcmVjb21wdXRpbmcgdGhlIGZpZWxkcwogICAgICAgICAgKiBpbiB0aGUgSW5zdGFuY2VzIHRhYmxlLgpAQCAtMTMyNiwzNCArMTUzNSw1MSBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfRVZFTlREQVlTID0gIm1heEV2ZW50RGF5cyI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbGVuZGFyTWV0YURhdGEgaW1wbGVtZW50cyBDYWxlbmRhck1ldGFEYXRhQ29sdW1ucywgQmFzZUNvbHVtbnMgewogICAgIH0KIAotICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnREYXlzQ29sdW1ucyB7CisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgRXZlbnREYXlzQ29sdW1ucyB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgSnVsaWFuIHN0YXJ0aW5nIGRheSBudW1iZXIuCisgICAgICAgICAqIFRoZSBKdWxpYW4gc3RhcnRpbmcgZGF5IG51bWJlci4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGludCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVERBWSA9ICJzdGFydERheSI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSnVsaWFuIGVuZGluZyBkYXkgbnVtYmVyLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoaW50KTwvUD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORERBWSA9ICJlbmREYXkiOwogCiAgICAgfQogCisgICAgLyoqCisgICAgICogRmllbGRzIGFuZCBoZWxwZXJzIGZvciBxdWVyeWluZyBmb3IgYSBsaXN0IG9mIGRheXMgdGhhdCBjb250YWluIGV2ZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50RGF5cyBpbXBsZW1lbnRzIEV2ZW50RGF5c0NvbHVtbnMgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKwotICAgICAgICAgICAgICAgICIvaW5zdGFuY2VzL2dyb3VwYnlkYXkiKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPSB7IFNUQVJUREFZLCBFTkREQVkgfTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OID0gInNlbGVjdGVkPTEiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZCisgICAgICAgICAgICAgICAgKyAiL2luc3RhbmNlcy9ncm91cGJ5ZGF5Iik7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHJpZXZlcyB0aGUgZGF5cyB3aXRoIGV2ZW50cyBmb3IgdGhlIEp1bGlhbiBkYXlzIHN0YXJ0aW5nIGF0ICJzdGFydERheSIKLSAgICAgICAgICogZm9yICJudW1EYXlzIi4KKyAgICAgICAgICogVGhlIHByb2plY3Rpb24gdXNlZCBieSB0aGUgRXZlbnREYXlzIHF1ZXJ5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUk9KRUNUSU9OID0geyBTVEFSVERBWSwgRU5EREFZIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RJT04gPSAic2VsZWN0ZWQ9MSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlcyB0aGUgZGF5cyB3aXRoIGV2ZW50cyBmb3IgdGhlIEp1bGlhbiBkYXlzIHN0YXJ0aW5nIGF0CisgICAgICAgICAqICJzdGFydERheSIgZm9yICJudW1EYXlzIi4gSXQgcmV0dXJucyBhIGN1cnNvciBjb250YWluaW5nIHN0YXJ0ZGF5IGFuZAorICAgICAgICAgKiBlbmRkYXkgcmVwcmVzZW50aW5nIHRoZSBtYXggcmFuZ2Ugb2YgZGF5cyBmb3IgYWxsIGV2ZW50cyBiZWdpbm5pbmcgb24KKyAgICAgICAgICogZWFjaCBzdGFydGRheS5UaGlzIGlzIGEgYmxvY2tpbmcgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgZG9uZSBvbgorICAgICAgICAgKiB0aGUgVUkgdGhyZWFkLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gY3IgdGhlIENvbnRlbnRSZXNvbHZlcgogICAgICAgICAgKiBAcGFyYW0gc3RhcnREYXkgdGhlIGZpcnN0IEp1bGlhbiBkYXkgaW4gdGhlIHJhbmdlCiAgICAgICAgICAqIEBwYXJhbSBudW1EYXlzIHRoZSBudW1iZXIgb2YgZGF5cyB0byBsb2FkIChtdXN0IGJlIGF0IGxlYXN0IDEpCi0gICAgICAgICAqIEByZXR1cm4gYSBkYXRhYmFzZSBjdXJzb3IKKyAgICAgICAgICogQHJldHVybiBhIGRhdGFiYXNlIGN1cnNvciBjb250YWluaW5nIGEgbGlzdCBvZiBzdGFydCBhbmQgZW5kIGRheXMgZm9yCisgICAgICAgICAqICAgICAgICAgZXZlbnRzCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIGludCBzdGFydERheSwgaW50IG51bURheXMpIHsKICAgICAgICAgICAgIGlmIChudW1EYXlzIDwgMSkgewpAQCAtMTM2OCw5ICsxNTk0LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBpbnRlcmZhY2UgUmVtaW5kZXJzQ29sdW1ucyB7CisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgUmVtaW5kZXJzQ29sdW1ucyB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZXZlbnQgdGhlIHJlbWluZGVyIGJlbG9uZ3MgdG8KKyAgICAgICAgICogVGhlIGV2ZW50IHRoZSByZW1pbmRlciBiZWxvbmdzIHRvLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIEV2ZW50cyB0YWJsZSk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CkBAIC0xMzc4LDE3ICsxNjA0LDI0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgbWludXRlcyBwcmlvciB0byB0aGUgZXZlbnQgdGhhdCB0aGUgYWxhcm0gc2hvdWxkIHJpbmcuICAtMQogICAgICAgICAgKiBzcGVjaWZpZXMgdGhhdCB3ZSBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3lzdGVtLgorICAgICAgICAgKiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTlVURVMgPSAibWludXRlcyI7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhc3NpbmcgdGhpcyBhcyBhIG1pbnV0ZXMgdmFsdWUgd2lsbCB1c2UgdGhlIGRlZmF1bHQgcmVtaW5kZXIKKyAgICAgICAgICogbWludXRlcy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVURVNfREVGQVVMVCA9IC0xOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgYWxhcm0gbWV0aG9kLCBhcyBzZXQgb24gdGhlIHNlcnZlci4gIERFRkFVTFQsIEFMRVJULCBFTUFJTCwgYW5kCi0gICAgICAgICAqIFNNUyBhcmUgcG9zc2libGUgdmFsdWVzOyB0aGUgZGV2aWNlIHdpbGwgb25seSBwcm9jZXNzIERFRkFVTFQgYW5kCi0gICAgICAgICAqIEFMRVJUIHJlbWluZGVycyAodGhlIG90aGVyIHR5cGVzIGFyZSBzaW1wbHkgc3RvcmVkIHNvIHdlIGNhbiBzZW5kIHRoZQotICAgICAgICAgKiBzYW1lIHJlbWluZGVyIGluZm8gYmFjayB0byB0aGUgc2VydmVyIHdoZW4gd2UgbWFrZSBjaGFuZ2VzKS4KKyAgICAgICAgICogVGhlIGFsYXJtIG1ldGhvZCwgYXMgc2V0IG9uIHRoZSBzZXJ2ZXIuIHtAbGluayAjTUVUSE9EX0RFRkFVTFR9LAorICAgICAgICAgKiB7QGxpbmsgI01FVEhPRF9BTEVSVH0sIHtAbGluayAjTUVUSE9EX0VNQUlMfSwgYW5kIHtAbGluayAjTUVUSE9EX1NNU30KKyAgICAgICAgICogYXJlIHBvc3NpYmxlIHZhbHVlczsgdGhlIGRldmljZSB3aWxsIG9ubHkgcHJvY2VzcworICAgICAgICAgKiB7QGxpbmsgI01FVEhPRF9ERUZBVUxUfSBhbmQge0BsaW5rICNNRVRIT0RfQUxFUlR9IHJlbWluZGVycyAodGhlCisgICAgICAgICAqIG90aGVyIHR5cGVzIGFyZSBzaW1wbHkgc3RvcmVkIHNvIHdlIGNhbiBzZW5kIHRoZSBzYW1lIHJlbWluZGVyIGluZm8KKyAgICAgICAgICogYmFjayB0byB0aGUgc2VydmVyIHdoZW4gd2UgbWFrZSBjaGFuZ2VzKS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRCA9ICJtZXRob2QiOwogCkBAIC0xMzk4LDYxICsxNjMxLDg1IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9TTVMgPSAzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZpZWxkcyBhbmQgaGVscGVycyBmb3IgYWNjZXNzaW5nIHJlbWluZGVycyBmb3IgYW4gZXZlbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZW1pbmRlcnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgUmVtaW5kZXJzQ29sdW1ucywgRXZlbnRzQ29sdW1ucyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiUmVtaW5kZXJzIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTUlOREVSU19XSEVSRSA9IENhbGVuZGFyLlJlbWluZGVycy5FVkVOVF9JRCArICI9PyI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcHJvamVjdGlvbiB1c2VkIGJ5IHRoZSByZW1pbmRlcnMgcXVlcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgIF9JRCwgTUlOVVRFUywgTUVUSE9ELH07CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL3JlbWluZGVycyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWVyaWVzIGFsbCByZW1pbmRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBldmVudC4gVGhpcyBpcyBhCisgICAgICAgICAqIGJsb2NraW5nIGNhbGwgYW5kIHNob3VsZCBub3QgYmUgZG9uZSBvbiB0aGUgVUkgdGhyZWFkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgVGhlIGNvbnRlbnQgcmVzb2x2ZXIgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIGV2ZW50SWQgVGhlIGlkIG9mIHRoZSBldmVudCB0byByZXRyaWV2ZSByZW1pbmRlcnMgZm9yCisgICAgICAgICAqIEByZXR1cm4gQSBDdXJzb3IgY29udGFpbmluZyBhbGwgcmVtaW5kZXJzIGZvciB0aGUgZXZlbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgbG9uZyBldmVudElkKSB7CisgICAgICAgICAgICBTdHJpbmdbXSByZW1BcmdzID0ge0xvbmcudG9TdHJpbmcoZXZlbnRJZCl9OworICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KENPTlRFTlRfVVJJLCBQUk9KRUNUSU9OLCBSRU1JTkRFUlNfV0hFUkUsIHJlbUFyZ3MgLyogc2VsZWN0aW9uIGFyZ3MgKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc29ydCBvcmRlciAqLyk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyQWxlcnRzQ29sdW1ucyB7CisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgQ2FsZW5kYXJBbGVydHNDb2x1bW5zIHsKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBldmVudCB0aGF0IHRoZSBhbGVydCBiZWxvbmdzIHRvCisgICAgICAgICAqIFRoZSBldmVudCB0aGF0IHRoZSBhbGVydCBiZWxvbmdzIHRvLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIEV2ZW50cyB0YWJsZSk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBzdGFydCB0aW1lIG9mIHRoZSBldmVudCwgaW4gVVRDCisgICAgICAgICAqIFRoZSBzdGFydCB0aW1lIG9mIHRoZSBldmVudCwgaW4gVVRDLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFR0lOID0gImJlZ2luIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGVuZCB0aW1lIG9mIHRoZSBldmVudCwgaW4gVVRDCisgICAgICAgICAqIFRoZSBlbmQgdGltZSBvZiB0aGUgZXZlbnQsIGluIFVUQy4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkQgPSAiZW5kIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGFsYXJtIHRpbWUgb2YgdGhlIGV2ZW50LCBpbiBVVEMKKyAgICAgICAgICogVGhlIGFsYXJtIHRpbWUgb2YgdGhlIGV2ZW50LCBpbiBVVEMuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxBUk1fVElNRSA9ICJhbGFybVRpbWUiOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY3JlYXRpb24gdGltZSBvZiB0aGlzIGRhdGFiYXNlIGVudHJ5LCBpbiBVVEMuCi0gICAgICAgICAqIChVc2VmdWwgZm9yIGRlYnVnZ2luZyBtaXNzZWQgcmVtaW5kZXJzLikKKyAgICAgICAgICogVXNlZnVsIGZvciBkZWJ1Z2dpbmcgbWlzc2VkIHJlbWluZGVycy4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVElPTl9USU1FID0gImNyZWF0aW9uVGltZSI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSB0aW1lIHRoYXQgdGhlIGFsYXJtIGJyb2FkY2FzdCB3YXMgcmVjZWl2ZWQgYnkgdGhlIENhbGVuZGFyIGFwcCwKLSAgICAgICAgICogaW4gVVRDLiAoVXNlZnVsIGZvciBkZWJ1Z2dpbmcgbWlzc2VkIHJlbWluZGVycy4pCisgICAgICAgICAqIGluIFVUQy4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcgbWlzc2VkIHJlbWluZGVycy4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNFSVZFRF9USU1FID0gInJlY2VpdmVkVGltZSI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSB0aW1lIHRoYXQgdGhlIG5vdGlmaWNhdGlvbiB3YXMgY3JlYXRlZCBieSB0aGUgQ2FsZW5kYXIgYXBwLAotICAgICAgICAgKiBpbiBVVEMuIChVc2VmdWwgZm9yIGRlYnVnZ2luZyBtaXNzZWQgcmVtaW5kZXJzLikKKyAgICAgICAgICogaW4gVVRDLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBtaXNzZWQgcmVtaW5kZXJzLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGWV9USU1FID0gIm5vdGlmeVRpbWUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgc3RhdGUgb2YgdGhpcyBhbGVydC4gIEl0IHN0YXJ0cyBvdXQgYXMgU0NIRURVTEVELCB0aGVuIHdoZW4KLSAgICAgICAgICogdGhlIGFsYXJtIGdvZXMgb2ZmLCBpdCBjaGFuZ2VzIHRvIEZJUkVELCBhbmQgdGhlbiB3aGVuIHRoZSB1c2VyCi0gICAgICAgICAqIGRpc21pc3NlcyB0aGUgYWxhcm0gaXQgY2hhbmdlcyB0byBESVNNSVNTRUQuCisgICAgICAgICAqIFRoZSBzdGF0ZSBvZiB0aGlzIGFsZXJ0LiBJdCBzdGFydHMgb3V0IGFzIHtAbGluayBTQ0hFRFVMRUR9LCB0aGVuCisgICAgICAgICAqIHdoZW4gdGhlIGFsYXJtIGdvZXMgb2ZmLCBpdCBjaGFuZ2VzIHRvIHtAbGluayBGSVJFRH0sIGFuZCB0aGVuIHdoZW4KKyAgICAgICAgICogdGhlIHVzZXIgZGlzbWlzc2VzIHRoZSBhbGFybSBpdCBjaGFuZ2VzIHRvIHtAbGluayBESVNNSVNTRUR9LiBDb2x1bW4KKyAgICAgICAgICogbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFID0gInN0YXRlIjsKQEAgLTE0NjIsMjEgKzE3MTksMzMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTTUlTU0VEID0gMjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG51bWJlciBvZiBtaW51dGVzIHRoYXQgdGhpcyBhbGFybSBwcmVjZWRlcyB0aGUgc3RhcnQgdGltZQotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIDwvUD4KKyAgICAgICAgICogVGhlIG51bWJlciBvZiBtaW51dGVzIHRoYXQgdGhpcyBhbGFybSBwcmVjZWRlcyB0aGUgc3RhcnQgdGltZS4gQ29sdW1uCisgICAgICAgICAqIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5VVEVTID0gIm1pbnV0ZXMiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgZm9yIHRoaXMgYWxlcnRzIHF1ZXJpZXMKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUiA9ICJiZWdpbiBBU0MsdGl0bGUgQVNDIjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBGaWVsZHMgYW5kIGhlbHBlcnMgZm9yIGFjY2Vzc2luZyBjYWxlbmRhciBhbGVydHMgaW5mb3JtYXRpb24uIFRoZXNlCisgICAgICogZmllbGRzIGFyZSBmb3IgdHJhY2tpbmcgd2hpY2ggYWxlcnRzIGhhdmUgYmVlbiBmaXJlZC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbGVuZGFyQWxlcnRzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsCiAgICAgICAgICAgICBDYWxlbmRhckFsZXJ0c0NvbHVtbnMsIEV2ZW50c0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgewogCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJDYWxlbmRhckFsZXJ0cyI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVXJpIGZvciBxdWVyeWluZyBjYWxlbmRhciBhbGVydCBpbmZvcm1hdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCiAgICAgICAgICAgICAgICAgIi9jYWxlbmRhcl9hbGVydHMiKTsKIApAQCAtMTUwMyw2ICsxNzcyLDExIEBACiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhlbHBlciBmb3IgaW5zZXJ0aW5nIGFuIGFsYXJtIHRpbWUgYXNzb2NpYXRlZCB3aXRoIGFuIGV2ZW50CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBpbnNlcnQoQ29udGVudFJlc29sdmVyIGNyLCBsb25nIGV2ZW50SWQsCiAgICAgICAgICAgICAgICAgbG9uZyBiZWdpbiwgbG9uZyBlbmQsIGxvbmcgYWxhcm1UaW1lLCBpbnQgbWludXRlcykgewogICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwpAQCAtMTUxOSw2ICsxNzkzLDE5IEBACiAgICAgICAgICAgICByZXR1cm4gY3IuaW5zZXJ0KENPTlRFTlRfVVJJLCB2YWx1ZXMpOwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1ZXJpZXMgYWxlcnRzIGluZm8gdXNpbmcgdGhlIGdpdmVuIHByb2plY3Rpb24sIHNlbGVjdGlvbiBmaWx0ZXIsIGFuZAorICAgICAgICAgKiBvcmRlcmluZy4gVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgYW5kIHNob3VsZCBub3QgYmUgZG9uZSBvbiB0aGUgVUkKKyAgICAgICAgICogdGhyZWFkLiBGb3Igc2VsZWN0aW9uIGFuZCBzZWxlY3Rpb25BcmdzIHVzYWdlIHNlZQorICAgICAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI3F1ZXJ5KFVyaSwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZyl9CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjciBUaGUgY29udGVudCByZXNvbHZlciB0byB1c2UgZm9yIHRoZSBxdWVyeQorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdGlvbiBUaGUgY29sdW1ucyB0byByZXR1cm4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdGlvbiBGaWx0ZXIgb24gdGhlIHF1ZXJ5IGFzIGFuIFNRTCBXSEVSRSBzdGF0ZW1lbnQKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgQXJncyB0byByZXBsYWNlIGFueSAnPydzIGluIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgICogQHBhcmFtIHNvcnRPcmRlciBIb3cgdG8gb3JkZXIgdGhlIHJvd3MgYXMgYW4gU1FMIE9SREVSIEJZIHN0YXRlbWVudAorICAgICAgICAgKiBAcmV0dXJuIEEgQ3Vyc29yIGNvbnRhaW5pbmcgdGhlIG1hdGNoaW5nIGFsZXJ0cworICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLAogICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKICAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShDT05URU5UX1VSSSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLApAQCAtMTUyNywxMiArMTgxNCwxMyBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGaW5kcyB0aGUgbmV4dCBhbGFybSBhZnRlciAob3IgZXF1YWwgdG8pIHRoZSBnaXZlbiB0aW1lIGFuZCByZXR1cm5zCi0gICAgICAgICAqIHRoZSB0aW1lIG9mIHRoYXQgYWxhcm0gb3IgLTEgaWYgbm8gc3VjaCBhbGFybSBleGlzdHMuCisgICAgICAgICAqIHRoZSB0aW1lIG9mIHRoYXQgYWxhcm0gb3IgLTEgaWYgbm8gc3VjaCBhbGFybSBleGlzdHMuIFRoaXMgaXMgYQorICAgICAgICAgKiBibG9ja2luZyBjYWxsIGFuZCBzaG91bGQgbm90IGJlIGRvbmUgb24gdGhlIFVJIHRocmVhZC4KICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGNyIHRoZSBDb250ZW50UmVzb2x2ZXIKICAgICAgICAgICogQHBhcmFtIG1pbGxpcyB0aGUgdGltZSBpbiBVVEMgbWlsbGlzZWNvbmRzCiAgICAgICAgICAqIEByZXR1cm4gdGhlIG5leHQgYWxhcm0gdGltZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIm1pbGxpcyIsIG9yIC0xCi0gICAgICAgICAqICAgICBpZiBubyBzdWNoIGFsYXJtIGV4aXN0cy4KKyAgICAgICAgICogICAgICAgICBpZiBubyBzdWNoIGFsYXJtIGV4aXN0cy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBmaW5kTmV4dEFsYXJtVGltZShDb250ZW50UmVzb2x2ZXIgY3IsIGxvbmcgbWlsbGlzKSB7CiAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gQUxBUk1fVElNRSArICI+PSIgKyBtaWxsaXM7CkBAIC0xNjE1LDYgKzE5MDMsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBTY2hlZHVsZXMgYW4gYWxhcm0gaW50ZW50IHdpdGggdGhlIHN5c3RlbSBBbGFybU1hbmFnZXIgdGhhdCB3aWxsCisgICAgICAgICAqIGNhdXNlIHRoZSBDYWxlbmRhciBwcm92aWRlciB0byByZWNoZWNrIGFsYXJtcy4gVGhpcyBpcyB1c2VkIHRvIHdha2UKKyAgICAgICAgICogdGhlIENhbGVuZGFyIGFsYXJtIGhhbmRsZXIgd2hlbiBhbiBhbGFybSBpcyBleHBlY3RlZCBvciB0byBkbyBhCisgICAgICAgICAqIHBlcmlvZGljIHJlZnJlc2ggb2YgYWxhcm0gZGF0YS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IGZvciByZWZlcmVuY2luZyBzeXN0ZW0gcmVzb3VyY2VzCisgICAgICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBBbGFybU1hbmFnZXIgdG8gdXNlIG9yIG51bGwKKyAgICAgICAgICogQHBhcmFtIGFsYXJtVGltZSBUaGUgdGltZSB0byBmaXJlIHRoZSBpbnRlbnQgaW4gVVRDIG1pbGxpcyBzaW5jZQorICAgICAgICAgKiAgICAgICAgICAgIGVwb2NoCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2NoZWR1bGVBbGFybShDb250ZXh0IGNvbnRleHQsIEFsYXJtTWFuYWdlciBtYW5hZ2VyLCBsb25nIGFsYXJtVGltZSkgewogICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgVGltZSB0aW1lID0gbmV3IFRpbWUoKTsKQEAgLTE2NzQsMjcgKzE5NzMsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRQcm9wZXJ0aWVzQ29sdW1ucyB7CisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgRXh0ZW5kZWRQcm9wZXJ0aWVzQ29sdW1ucyB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZXZlbnQgdGhlIGV4dGVuZGVkIHByb3BlcnR5IGJlbG9uZ3MgdG8KKyAgICAgICAgICogVGhlIGV2ZW50IHRoZSBleHRlbmRlZCBwcm9wZXJ0eSBiZWxvbmdzIHRvLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIEV2ZW50cyB0YWJsZSk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBleHRlbmRlZCBwcm9wZXJ0eS4gIFRoaXMgaXMgYSB1cmkgb2YgdGhlIGZvcm0KLSAgICAgICAgICoge3NjaGVtZX0je2xvY2FsLW5hbWV9IGNvbnZlbnRpb24uCisgICAgICAgICAqIHtzY2hlbWV9I3tsb2NhbC1uYW1lfSBjb252ZW50aW9uLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgcHJvcGVydHkuCisgICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgcHJvcGVydHkuIENvbHVtbiBuYW1lLgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZpZWxkcyBmb3IgYWNjZXNzaW5nIHRoZSBFeHRlbmRlZCBQcm9wZXJ0aWVzLiBUaGlzIGlzIGEgZ2VuZXJpYyBzZXQgb2YKKyAgICAgKiBuYW1lL3ZhbHVlIHBhaXJzIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycyBvciBhcHBzIHRvIGFkZCBleHRyYQorICAgICAqIGluZm9ybWF0aW9uIHRvIGV2ZW50cy4KKyAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXh0ZW5kZWRQcm9wZXJ0aWVzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsCiAgICAgICAgICAgICBFeHRlbmRlZFByb3BlcnRpZXNDb2x1bW5zLCBFdmVudHNDb2x1bW5zIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQpAQCAtMTcxNSw3ICsyMDE5LDcgQEAKICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgU3luY1N0YXRlKCkge30KIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RJUkVDVE9SWSA9CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RJUkVDVE9SWSA9CiAgICAgICAgICAgICAgICAgU3luY1N0YXRlQ29udHJhY3QuQ29uc3RhbnRzLkNPTlRFTlRfRElSRUNUT1JZOwogCiAgICAgICAgIC8qKgpAQCAtMTcyOCwzOSArMjAzMiw0MyBAQAogICAgIC8qKgogICAgICAqIENvbHVtbnMgZnJvbSB0aGUgRXZlbnRzUmF3VGltZXMgdGFibGUKICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c1Jhd1RpbWVzQ29sdW1ucyB7CisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgRXZlbnRzUmF3VGltZXNDb2x1bW5zIHsKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBjb3JyZXNwb25kaW5nIGV2ZW50IGlkCisgICAgICAgICAqIFRoZSBjb3JyZXNwb25kaW5nIGV2ZW50IGlkLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBzdGFydHMKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IHRpbWUgdGhlIGV2ZW50IHN0YXJ0cy4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVFNUQVJUXzI0NDUgPSAiZHRzdGFydDI0NDUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgdGltZSB0aGUgZXZlbnQgZW5kcworICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgdGltZSB0aGUgZXZlbnQgZW5kcy4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORF8yNDQ1ID0gImR0ZW5kMjQ0NSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCBvcmlnaW5hbCBpbnN0YW5jZSB0aW1lIG9mIHRoZSByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMKLSAgICAgICAgICogZXZlbnQgaXMgYW4gZXhjZXB0aW9uLgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgb3JpZ2luYWwgaW5zdGFuY2UgdGltZSBvZiB0aGUgcmVjdXJyaW5nIGV2ZW50CisgICAgICAgICAqIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIGFuIGV4Y2VwdGlvbi4gQ29sdW1uIG5hbWUuCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9JTlNUQU5DRV9USU1FXzI0NDUgPSAib3JpZ2luYWxJbnN0YW5jZVRpbWUyNDQ1IjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IGxhc3QgZGF0ZSB0aGlzIGV2ZW50IHJlcGVhdHMgb24sIG9yIE5VTEwgaWYgaXQgbmV2ZXIgZW5kcworICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgbGFzdCBkYXRlIHRoaXMgZXZlbnQgcmVwZWF0cyBvbiwgb3IgTlVMTCBpZiBpdAorICAgICAgICAgKiBuZXZlciBlbmRzLiBDb2x1bW4gbmFtZS4KICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfREFURV8yNDQ1ID0gImxhc3REYXRlMjQ0NSI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c1Jhd1RpbWVzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c1Jhd1RpbWVzQ29sdW1ucyB7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKaW5kZXggYzc4YjkzNS4uODkzOTQ3ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCkBAIC0xODA5LDYgKzE4MDksMTYgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lQX0FTS19NRV9FQUNIX1RJTUUgPSAiU0lQX0FTS19NRV9FQUNIX1RJTUUiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBQb2ludGVyIHNwZWVkIHNldHRpbmcuCisgICAgICAgICAqIFRoaXMgaXMgYW4gaW50ZWdlciB2YWx1ZSBpbiBhIHJhbmdlIGJldHdlZW4gLTcgYW5kICs3LCBzbyB0aGVyZSBhcmUgMTUgcG9zc2libGUgdmFsdWVzLgorICAgICAgICAgKiAgIC03ID0gc2xvd2VzdAorICAgICAgICAgKiAgICAwID0gZGVmYXVsdCBzcGVlZAorICAgICAgICAgKiAgICs3ID0gZmFzdGVzdAorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9JTlRFUl9TUEVFRCA9ICJwb2ludGVyX3NwZWVkIjsKKworICAgICAgICAvKioKICAgICAgICAgICogU2V0dGluZ3MgdG8gYmFja3VwLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBpdCdzIGluIHRoZSBzYW1lIHBsYWNlIGFzIHRoZSBzZXR0aW5ncwogICAgICAgICAgKiBrZXlzIGFuZCBlYXN5IHRvIHVwZGF0ZS4KICAgICAgICAgICogQGhpZGUKQEAgLTE4NzIsNiArMTg4Miw3IEBACiAgICAgICAgICAgICBVU0VfUFRQX0lOVEVSRkFDRSwKICAgICAgICAgICAgIFNJUF9DQUxMX09QVElPTlMsCiAgICAgICAgICAgICBTSVBfUkVDRUlWRV9DQUxMUywKKyAgICAgICAgICAgIFBPSU5URVJfU1BFRUQsCiAgICAgICAgIH07CiAKICAgICAgICAgLy8gU2V0dGluZ3MgbW92ZWQgdG8gU2V0dGluZ3MuU2VjdXJlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL1RleHRUb1NwZWVjaFNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvVGV4dFRvU3BlZWNoU2VydmljZS5qYXZhCmluZGV4IDcxN2RkZTguLmRkZDMyNTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvVGV4dFRvU3BlZWNoU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvVGV4dFRvU3BlZWNoU2VydmljZS5qYXZhCkBAIC01NSw2ICs1NSw4IEBACiAKICAgICBwcml2YXRlIENhbGxiYWNrTWFwIG1DYWxsYmFja3M7CiAKKyAgICBwcml2YXRlIGludCBtRGVmYXVsdEF2YWlsYWJpbGl0eSA9IFRleHRUb1NwZWVjaC5MQU5HX05PVF9TVVBQT1JURUQ7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAib25DcmVhdGUoKSIpOwpAQCAtNzEsNyArNzMsOCBAQAogICAgICAgICBtQ2FsbGJhY2tzID0gbmV3IENhbGxiYWNrTWFwKCk7CiAKICAgICAgICAgLy8gTG9hZCBkZWZhdWx0IGxhbmd1YWdlCi0gICAgICAgIG9uTG9hZExhbmd1YWdlKGdldERlZmF1bHRMYW5ndWFnZSgpLCBnZXREZWZhdWx0Q291bnRyeSgpLCBnZXREZWZhdWx0VmFyaWFudCgpKTsKKyAgICAgICAgbURlZmF1bHRBdmFpbGFiaWxpdHkgPSBvbkxvYWRMYW5ndWFnZShnZXREZWZhdWx0TGFuZ3VhZ2UoKSwKKyAgICAgICAgICAgICAgICBnZXREZWZhdWx0Q291bnRyeSgpLCBnZXREZWZhdWx0VmFyaWFudCgpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTY1MSwxNyArNjU0LDQzIEBACiAgICAgICAgICAgICByZXR1cm4gb25HZXRMYW5ndWFnZSgpOwogICAgICAgICB9CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgZGVmYXVsdHMgYXJlIGVuZm9yY2VkLCB0aGVuIG5vIGxhbmd1YWdlIGlzICJhdmFpbGFibGUiIGV4Y2VwdAorICAgICAgICAgKiBwZXJoYXBzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBpc0xhbmd1YWdlQXZhaWxhYmxlKFN0cmluZyBsYW5nLCBTdHJpbmcgY291bnRyeSwgU3RyaW5nIHZhcmlhbnQpIHsKKyAgICAgICAgICAgIGlmIChhcmVEZWZhdWx0c0VuZm9yY2VkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNEZWZhdWx0KGxhbmcsIGNvdW50cnksIHZhcmlhbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdEF2YWlsYWJpbGl0eTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkxBTkdfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gb25Jc0xhbmd1YWdlQXZhaWxhYmxlKGxhbmcsIGNvdW50cnksIHZhcmlhbnQpOwogICAgICAgICB9CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlcmUgaXMgbm8gcG9pbnQgbG9hZGluZyBhIG5vbiBkZWZhdWx0IGxhbmd1YWdlIGlmIGRlZmF1bHRzCisgICAgICAgICAqIGFyZSBlbmZvcmNlZC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgbG9hZExhbmd1YWdlKFN0cmluZyBsYW5nLCBTdHJpbmcgY291bnRyeSwgU3RyaW5nIHZhcmlhbnQpIHsKKyAgICAgICAgICAgIGlmIChhcmVEZWZhdWx0c0VuZm9yY2VkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNEZWZhdWx0KGxhbmcsIGNvdW50cnksIHZhcmlhbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdEF2YWlsYWJpbGl0eTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkxBTkdfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gb25Mb2FkTGFuZ3VhZ2UobGFuZywgY291bnRyeSwgdmFyaWFudCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhTdHJpbmcgcGFja2FnZU5hbWUsIElUZXh0VG9TcGVlY2hDYWxsYmFjayBjYikgewogICAgICAgICAgICAgbUNhbGxiYWNrcy5zZXRDYWxsYmFjayhwYWNrYWdlTmFtZSwgY2IpOwogICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdChTdHJpbmcgbGFuZywgU3RyaW5nIGNvdW50cnksIFN0cmluZyB2YXJpYW50KSB7CisgICAgICAgICAgICByZXR1cm4gTG9jYWxlLmdldERlZmF1bHQoKS5lcXVhbHMobmV3IExvY2FsZShsYW5nLCBjb3VudHJ5LCB2YXJpYW50KSk7CisgICAgICAgIH0KICAgICB9OwogCiAgICAgcHJpdmF0ZSBjbGFzcyBDYWxsYmFja01hcCBleHRlbmRzIFJlbW90ZUNhbGxiYWNrTGlzdDxJVGV4dFRvU3BlZWNoQ2FsbGJhY2s+IHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L01lYXN1cmVkVGV4dC5qYXZhCmluZGV4IDc2MWMyNzEuLmE4MWJlMDkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YQpAQCAtMTYsMTQgKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CisKIC8qKgogICogQGhpZGUKICAqLwpAQCAtMTg3LDYgKzE4Nyw3IEBACiAgICAgICAgICAgICB3W21Qb3NdID0gd2lkOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb3MgKyAxLCBlID0gbVBvcyArIGxlbjsgaSA8IGU7IGkrKykKICAgICAgICAgICAgICAgICB3W2ldID0gMDsKKyAgICAgICAgICAgIG1Qb3MgKz0gbGVuOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YQppbmRleCAwZjgwOTdhLi5mNTI0OTYxMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YQpAQCAtNDMsNiArNDMsOCBAQAogICogQGhpZGUKICAqLwogY2xhc3MgVGV4dExpbmUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKwogICAgIHByaXZhdGUgVGV4dFBhaW50IG1QYWludDsKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGV4dDsKICAgICBwcml2YXRlIGludCBtU3RhcnQ7CkBAIC01Niw3ICs1OCw3IEBACiAgICAgcHJpdmF0ZSBTcGFubmVkIG1TcGFubmVkOwogICAgIHByaXZhdGUgZmluYWwgVGV4dFBhaW50IG1Xb3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBUZXh0TGluZVtdIGNhY2hlZCA9IG5ldyBUZXh0TGluZVszXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUZXh0TGluZVtdIHNDYWNoZWQgPSBuZXcgVGV4dExpbmVbM107CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IFRleHRMaW5lIGZyb20gdGhlIHNoYXJlZCBwb29sLgpAQCAtNjUsMTcgKzY3LDE5IEBACiAgICAgICovCiAgICAgc3RhdGljIFRleHRMaW5lIG9idGFpbigpIHsKICAgICAgICAgVGV4dExpbmUgdGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gY2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRsID0gY2FjaGVkW2ldOwotICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDYWNoZWQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzQ2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgaWYgKHNDYWNoZWRbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0bCA9IHNDYWNoZWRbaV07CisgICAgICAgICAgICAgICAgICAgIHNDYWNoZWRbaV0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHRsID0gbmV3IFRleHRMaW5lKCk7Ci0gICAgICAgIExvZy52KCJUTElORSIsICJuZXc6ICIgKyB0bCk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLnYoIlRMSU5FIiwgIm5ldzogIiArIHRsKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdGw7CiAgICAgfQogCkBAIC05MCwxMCArOTQsMTAgQEAKICAgICAgICAgdGwubVRleHQgPSBudWxsOwogICAgICAgICB0bC5tUGFpbnQgPSBudWxsOwogICAgICAgICB0bC5tRGlyZWN0aW9ucyA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZChjYWNoZWQpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IHRsOworICAgICAgICBzeW5jaHJvbml6ZWQoc0NhY2hlZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzQ2FjaGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNDYWNoZWRbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzQ2FjaGVkW2ldID0gdGw7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE3NSwxMSArMTc5LDExIEBACiAgICAgdm9pZCBkcmF3KENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSkgewogICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CiAgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICBkcmF3UnVuKGMsIDAsIDAsIG1MZW4sIGZhbHNlLCB4LCB0b3AsIHksIGJvdHRvbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGRyYXdSdW4oYywgMCwgbUxlbiwgZmFsc2UsIHgsIHRvcCwgeSwgYm90dG9tLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb25zID09IExheW91dC5ESVJTX0FMTF9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgZHJhd1J1bihjLCAwLCAwLCBtTGVuLCB0cnVlLCB4LCB0b3AsIHksIGJvdHRvbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGRyYXdSdW4oYywgMCwgbUxlbiwgdHJ1ZSwgeCwgdG9wLCB5LCBib3R0b20sIGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxNiw3ICsyMjAsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChqID09IHJ1bkxpbWl0IHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaCArPSBkcmF3UnVuKGMsIGksIHNlZ3N0YXJ0LCBqLCBydW5Jc1J0bCwgeCtoLCB0b3AsIHksIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgaCArPSBkcmF3UnVuKGMsIHNlZ3N0YXJ0LCBqLCBydW5Jc1J0bCwgeCtoLCB0b3AsIHksIGJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICE9IGxhc3RSdW5JbmRleCB8fCBqICE9IG1MZW4pOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPT0gJ1x0JykgewpAQCAtMjc1LDEwICsyNzksMTAgQEAKIAogICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CiAgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIGZhbHNlLCBmbWkpOworICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlUnVuKDAsIG9mZnNldCwgbUxlbiwgZmFsc2UsIGZtaSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIHRydWUsIGZtaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVSdW4oMCwgb2Zmc2V0LCBtTGVuLCB0cnVlLCBmbWkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMxNSwxNCArMzE5LDE0IEBACiAKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gKG1EaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKSA9PSBydW5Jc1J0bDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluU2VnbWVudCAmJiBhZHZhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaCArPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBvZmZzZXQsIGosIHJ1bklzUnRsLCBmbWkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggKz0gbWVhc3VyZVJ1bihzZWdzdGFydCwgb2Zmc2V0LCBqLCBydW5Jc1J0bCwgZm1pKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBqLCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVSdW4oc2Vnc3RhcnQsIGosIGosIHJ1bklzUnRsLCBmbWkpOwogICAgICAgICAgICAgICAgICAgICBoICs9IGFkdmFuY2UgPyB3IDogLXc7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGluU2VnbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggKz0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgb2Zmc2V0LCBqLCBydW5Jc1J0bCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaCArPSBtZWFzdXJlUnVuKHNlZ3N0YXJ0LCBvZmZzZXQsIGosIHJ1bklzUnRsLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPT0gJ1x0JykgewpAQCAtMzUzLDggKzM1Nyw4IEBACiAgICAgLyoqCiAgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCAoYnV0IHBvc3NpYmx5IG11bHRpLXN0eWxlZCkgcnVuIG9mIHRleHQuCiAgICAgICoKKyAgICAgKgogICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMgdG8gZHJhdyBvbgotICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgaW5kZXggb2YgdGhpcyBkaXJlY3Rpb25hbCBydW4KICAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQKICAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbmUtcmVsYXRpdmUgbGltaXQKICAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKQEAgLTM2NiwyNSArMzcwLDI1IEBACiAgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4sIGJhc2VkIG9uIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uLgogICAgICAqIE9ubHkgdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmbG9hdCBkcmF3UnVuKENhbnZhcyBjLCBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwKKyAgICBwcml2YXRlIGZsb2F0IGRyYXdSdW4oQ2FudmFzIGMsIGludCBzdGFydCwKICAgICAgICAgICAgIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCiAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewogCiAgICAgICAgIGlmICgobURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsKSB7Ci0gICAgICAgICAgICBmbG9hdCB3ID0gLW1lYXN1cmVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBudWxsKTsKLSAgICAgICAgICAgIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHggKyB3LCB0b3AsCisgICAgICAgICAgICBmbG9hdCB3ID0gLW1lYXN1cmVSdW4oc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIG51bGwpOworICAgICAgICAgICAgaGFuZGxlUnVuKHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBjLCB4ICsgdywgdG9wLAogICAgICAgICAgICAgICAgICAgICB5LCBib3R0b20sIG51bGwsIGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiB3OwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHgsIHRvcCwKKyAgICAgICAgcmV0dXJuIGhhbmRsZVJ1bihzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgYywgeCwgdG9wLAogICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgbmVlZFdpZHRoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBNZWFzdXJlcyBhIHVuaWRpcmVjdGlvbmFsIChidXQgcG9zc2libHkgbXVsdGktc3R5bGVkKSBydW4gb2YgdGV4dC4KICAgICAgKgotICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICoKICAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQgb2YgdGhlIHJ1bgogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byBtZWFzdXJlIHRvLCBiZXR3ZWVuIHN0YXJ0IGFuZCBsaW1pdCBpbmNsdXNpdmUKICAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbmUtcmVsYXRpdmUgbGltaXQgb2YgdGhlIHJ1bgpAQCAtMzk0LDEwICszOTgsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcnVuIHRvIHRoZSBsZWFkaW5nIGVkZ2UKICAgICAgKiBvZiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCwgYmFzZWQgb24gdGhlIHJ1biAobm90IHBhcmFncmFwaCkgZGlyZWN0aW9uCiAgICAgICovCi0gICAgcHJpdmF0ZSBmbG9hdCBtZWFzdXJlUnVuKGludCBydW5JbmRleCwgaW50IHN0YXJ0LAotICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBGb250TWV0cmljc0ludCBmbWkpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIG9mZnNldCwgbGltaXQsIHJ1bklzUnRsLCBudWxsLAotICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIGZtaSwgdHJ1ZSk7CisgICAgcHJpdmF0ZSBmbG9hdCBtZWFzdXJlUnVuKGludCBzdGFydCwgaW50IG9mZnNldCwgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLAorICAgICAgICAgICAgRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVSdW4oc3RhcnQsIG9mZnNldCwgbGltaXQsIHJ1bklzUnRsLCBudWxsLCAwLCAwLCAwLCAwLCBmbWksIHRydWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzUxLDkgKzc1NCw5IEBACiAgICAgLyoqCiAgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgbWVhc3VyaW5nIGFuZCByZW5kZXJpbmcgYSByZXBsYWNlbWVudC4KICAgICAgKgorICAgICAqCiAgICAgICogQHBhcmFtIHJlcGxhY2VtZW50IHRoZSByZXBsYWNlbWVudAogICAgICAqIEBwYXJhbSB3cCB0aGUgd29yayBwYWludAotICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CiAgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCiAgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW1pdCBvZiB0aGUgcnVuCiAgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CkBAIC03NjgsNyArNzcxLDcgQEAKICAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQogICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlUmVwbGFjZW1lbnQoUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50LCBUZXh0UGFpbnQgd3AsCi0gICAgICAgICAgICBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBDYW52YXMgYywKKyAgICAgICAgICAgIGludCBzdGFydCwgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBDYW52YXMgYywKICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLCBGb250TWV0cmljc0ludCBmbWksCiAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewogCkBAIC03OTYsNyArNzk5LDcgQEAKICAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBoYW5kbGluZyBhIHVuaWRpcmVjdGlvbmFsIHJ1bi4gIFRoZSBydW4gbXVzdCBub3QKICAgICAgKiBjb250YWluIHRhYnMgb3IgZW1vamkgYnV0IGNhbiBjb250YWluIHN0eWxlcy4KICAgICAgKgotICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICoKICAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQgb2YgdGhlIHJ1bgogICAgICAqIEBwYXJhbSBtZWFzdXJlTGltaXQgdGhlIG9mZnNldCB0byBtZWFzdXJlIHRvLCBiZXR3ZWVuIHN0YXJ0IGFuZCBsaW1pdCBpbmNsdXNpdmUKICAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KQEAgLTgxMSw3ICs4MTQsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CiAgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKICAgICAgKi8KLSAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVJ1bihpbnQgcnVuSW5kZXgsIGludCBzdGFydCwgaW50IG1lYXN1cmVMaW1pdCwKKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVJ1bihpbnQgc3RhcnQsIGludCBtZWFzdXJlTGltaXQsCiAgICAgICAgICAgICBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwKICAgICAgICAgICAgIGludCBib3R0b20sIEZvbnRNZXRyaWNzSW50IGZtaSwgYm9vbGVhbiBuZWVkV2lkdGgpIHsKIApAQCAtODU5LDcgKzg2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVSZXBsYWNlbWVudChyZXBsYWNlbWVudCwgd3AsIHJ1bkluZGV4LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVSZXBsYWNlbWVudChyZXBsYWNlbWVudCwgd3AsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1saW1pdCwgcnVuSXNSdGwsIGMsIHgsIHRvcCwgeSwgYm90dG9tLCBmbWksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRXaWR0aCB8fCBtbGltaXQgPCBtZWFzdXJlTGltaXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Xb3JkSXRlcmF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1dvcmRJdGVyYXRvci5qYXZhCmluZGV4IGIyNTA0MTQuLmFmNTI0ZWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1dvcmRJdGVyYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1dvcmRJdGVyYXRvci5qYXZhCkBAIC0yMTMsNyArMjEzLDggQEAKIAogICAgIHByaXZhdGUgdm9pZCBjaGVja09mZnNldElzVmFsaWQoaW50IG9mZnNldCkgewogICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBtQ3VycmVudC5sZW5ndGgoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVmFsaWQgcmFuZ2UgaXMgWzAsICIgKyBtQ3VycmVudC5sZW5ndGgoKSArICJdIjsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkludmFsaWQgb2Zmc2V0OiAiICsgb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgIi4gVmFsaWQgcmFuZ2UgaXMgWzAsICIgKyBtQ3VycmVudC5sZW5ndGgoKSArICJdIjsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0Rpc3BsYXlNZXRyaWNzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0Rpc3BsYXlNZXRyaWNzLmphdmEKaW5kZXggODAxOGZmOS4uZDU5NDU2NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9EaXNwbGF5TWV0cmljcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRGlzcGxheU1ldHJpY3MuamF2YQpAQCAtMzgsNiArMzgsMTUgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX01FRElVTSA9IDE2MDsKIAogICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHF1YW50aXplZCBEUEkgZm9yIDcyMHAgVFYgc2NyZWVucy4gIEFwcGxpY2F0aW9ucyBzaG91bGQKKyAgICAgKiBnZW5lcmFsbHkgbm90IHdvcnJ5IGFib3V0IHRoaXMgZGVuc2l0eSwgaW5zdGVhZCB0YXJnZXRpbmcKKyAgICAgKiB7QGxpbmsgI0RFTlNJVFlfWEhJR0h9IGZvciAxMDgwcCBUViBzY3JlZW5zLiAgRm9yIHNpdHVhdGlvbnMgd2hlcmUKKyAgICAgKiBvdXRwdXQgaXMgbmVlZGVkIGZvciBhIDcyMHAgc2NyZWVuLCB0aGUgVUkgZWxlbWVudHMgY2FuIGJlIHNjYWxlZAorICAgICAqIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBsYXRmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTlNJVFlfVFYgPSAyMTM7CisKKyAgICAvKioKICAgICAgKiBTdGFuZGFyZCBxdWFudGl6ZWQgRFBJIGZvciBoaWdoLWRlbnNpdHkgc2NyZWVucy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX0hJR0ggPSAyNDA7CkBAIC0xMDUsMTAgKzExNCwxOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCB5ZHBpOwogCi0gICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIGludCByZWFsV2lkdGhQaXhlbHM7Ci0gICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIGludCByZWFsSGVpZ2h0UGl4ZWxzOworICAgIC8qKgorICAgICAqIFRoZSByZXBvcnRlZCBkaXNwbGF5IHdpZHRoIHByaW9yIHRvIGFueSBjb21wYXRpYmlsaXR5IG1vZGUgc2NhbGluZworICAgICAqIGJlaW5nIGFwcGxpZWQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVuc2NhbGVkV2lkdGhQaXhlbHM7CisgICAgLyoqCisgICAgICogVGhlIHJlcG9ydGVkIGRpc3BsYXkgaGVpZ2h0IHByaW9yIHRvIGFueSBjb21wYXRpYmlsaXR5IG1vZGUgc2NhbGluZworICAgICAqIGJlaW5nIGFwcGxpZWQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVuc2NhbGVkSGVpZ2h0UGl4ZWxzOwogCiAgICAgcHVibGljIERpc3BsYXlNZXRyaWNzKCkgewogICAgIH0KQEAgLTEyMSw4ICsxMzgsOCBAQAogICAgICAgICBzY2FsZWREZW5zaXR5ID0gby5zY2FsZWREZW5zaXR5OwogICAgICAgICB4ZHBpID0gby54ZHBpOwogICAgICAgICB5ZHBpID0gby55ZHBpOwotICAgICAgICByZWFsV2lkdGhQaXhlbHMgPSBvLnJlYWxXaWR0aFBpeGVsczsKLSAgICAgICAgcmVhbEhlaWdodFBpeGVscyA9IG8ucmVhbEhlaWdodFBpeGVsczsKKyAgICAgICAgdW5zY2FsZWRXaWR0aFBpeGVscyA9IG8udW5zY2FsZWRXaWR0aFBpeGVsczsKKyAgICAgICAgdW5zY2FsZWRIZWlnaHRQaXhlbHMgPSBvLnVuc2NhbGVkSGVpZ2h0UGl4ZWxzOwogICAgIH0KICAgICAKICAgICBwdWJsaWMgdm9pZCBzZXRUb0RlZmF1bHRzKCkgewpAQCAtMTMzLDggKzE1MCw4IEBACiAgICAgICAgIHNjYWxlZERlbnNpdHkgPSBkZW5zaXR5OwogICAgICAgICB4ZHBpID0gREVOU0lUWV9ERVZJQ0U7CiAgICAgICAgIHlkcGkgPSBERU5TSVRZX0RFVklDRTsKLSAgICAgICAgcmVhbFdpZHRoUGl4ZWxzID0gMDsKLSAgICAgICAgcmVhbEhlaWdodFBpeGVscyA9IDA7CisgICAgICAgIHVuc2NhbGVkV2lkdGhQaXhlbHMgPSAwOworICAgICAgICB1bnNjYWxlZEhlaWdodFBpeGVscyA9IDA7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0Zpbml0ZVBvb2wuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmluaXRlUG9vbC5qYXZhCmluZGV4IDNlZjgyOTMuLjRhZTIxYWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmluaXRlUG9vbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmluaXRlUG9vbC5qYXZhCkBAIC02OSw2ICs2OSw3IEBACiAKICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgZWxlbWVudC5zZXROZXh0UG9vbGFibGUobnVsbCk7CisgICAgICAgICAgICBlbGVtZW50LnNldFBvb2xlZChmYWxzZSk7CiAgICAgICAgICAgICBtTWFuYWdlci5vbkFjcXVpcmVkKGVsZW1lbnQpOyAgICAgICAgICAgIAogICAgICAgICB9CiAKQEAgLTc2LDkgKzc3LDEzIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVsZWFzZShUIGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQuaXNQb29sZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRWxlbWVudCBhbHJlYWR5IGluIHRoZSBwb29sLiIpOworICAgICAgICB9CiAgICAgICAgIGlmIChtSW5maW5pdGUgfHwgbVBvb2xDb3VudCA8IG1MaW1pdCkgewogICAgICAgICAgICAgbVBvb2xDb3VudCsrOwogICAgICAgICAgICAgZWxlbWVudC5zZXROZXh0UG9vbGFibGUobVJvb3QpOworICAgICAgICAgICAgZWxlbWVudC5zZXRQb29sZWQodHJ1ZSk7CiAgICAgICAgICAgICBtUm9vdCA9IGVsZW1lbnQ7CiAgICAgICAgIH0KICAgICAgICAgbU1hbmFnZXIub25SZWxlYXNlZChlbGVtZW50KTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvTG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0xvZy5qYXZhCmluZGV4IDM4OTAzYWIuLjFjMzcwOWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvTG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Mb2cuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogCiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBBUEkgZm9yIHNlbmRpbmcgbG9nIG91dHB1dC4KQEAgLTMwMiw2ICszMDMsMTcgQEAKICAgICAgICAgaWYgKHRyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgaXMgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgbG9nIHNwZXcgdGhhdCBhcHBzIGRvIGluIHRoZSBub24tZXJyb3IKKyAgICAgICAgLy8gY29uZGl0aW9uIG9mIHRoZSBuZXR3b3JrIGJlaW5nIHVuYXZhaWxhYmxlLgorICAgICAgICBUaHJvd2FibGUgdCA9IHRyOworICAgICAgICB3aGlsZSAodCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFVua25vd25Ib3N0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdCA9IHQuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorCiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKICAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwogICAgICAgICB0ci5wcmludFN0YWNrVHJhY2UocHcpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Qb29sYWJsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Qb29sYWJsZS5qYXZhCmluZGV4IGZkOWJkOWIuLjg3ZTA1MjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUG9vbGFibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1Bvb2xhYmxlLmphdmEKQEAgLTIyLDQgKzIyLDYgQEAKIHB1YmxpYyBpbnRlcmZhY2UgUG9vbGFibGU8VD4gewogICAgIHZvaWQgc2V0TmV4dFBvb2xhYmxlKFQgZWxlbWVudCk7CiAgICAgVCBnZXROZXh0UG9vbGFibGUoKTsKKyAgICBib29sZWFuIGlzUG9vbGVkKCk7CisgICAgdm9pZCBzZXRQb29sZWQoYm9vbGVhbiBpc1Bvb2xlZCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Rpc3BsYXkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRGlzcGxheS5qYXZhCmluZGV4IGI1ZDM2ZDkuLjgwMzI1NDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRGlzcGxheS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRGlzcGxheS5qYXZhCkBAIC04MCwyNSArODAsMzcgQEAKICAgICAgKiBhZGp1c3RlZCBmb3IgeW91IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJvdGF0aW9uIG9mIHRoZSBkaXNwbGF5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldFNpemUoUG9pbnQgb3V0U2l6ZSkgeworICAgICAgICBnZXRTaXplSW50ZXJuYWwob3V0U2l6ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmF3IHNpemUgb2YgdGhlIGRpc3BsYXksIGluIHBpeGVscy4gIE5vdGUgdGhhdCB0aGlzCisgICAgICogc2hvdWxkIDxlbT5ub3Q8L2VtPiBnZW5lcmFsbHkgYmUgdXNlZCBmb3IgY29tcHV0aW5nIGxheW91dHMsIHNpbmNlCisgICAgICogYSBkZXZpY2Ugd2lsbCB0eXBpY2FsbHkgaGF2ZSBzY3JlZW4gZGVjb3JhdGlvbiAoc3VjaCBhcyBhIHN0YXR1cyBiYXIpCisgICAgICogYWxvbmcgdGhlIGVkZ2VzIG9mIHRoZSBkaXNwbGF5IHRoYXQgcmVkdWNlIHRoZSBhbW91bnQgb2YgYXBwbGljYXRpb24KKyAgICAgKiBzcGFjZSBhdmFpbGFibGUgZnJvbSB0aGUgcmF3IHNpemUgcmV0dXJuZWQgaGVyZS4gIFRoaXMgdmFsdWUgaXMKKyAgICAgKiBhZGp1c3RlZCBmb3IgeW91IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJvdGF0aW9uIG9mIHRoZSBkaXNwbGF5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRTaXplSW50ZXJuYWwoUG9pbnQgb3V0U2l6ZSwgYm9vbGVhbiBkb0NvbXBhdCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgSVdpbmRvd01hbmFnZXIgd20gPSBnZXRXaW5kb3dNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAod20gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHdtLmdldERpc3BsYXlTaXplKG91dFNpemUpOworICAgICAgICAgICAgICAgIGlmIChkb0NvbXBhdCAmJiBtQ29tcGF0aWJpbGl0eUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UbXBNZXRyaWNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG1wTWV0cmljcy51bnNjYWxlZFdpZHRoUGl4ZWxzID0gb3V0U2l6ZS54OworICAgICAgICAgICAgICAgICAgICAgICAgbVRtcE1ldHJpY3MudW5zY2FsZWRIZWlnaHRQaXhlbHMgPSBvdXRTaXplLnk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG1wTWV0cmljcy5kZW5zaXR5ID0gbURlbnNpdHk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGF0aWJpbGl0eUluZm8uYXBwbHlUb0Rpc3BsYXlNZXRyaWNzKG1UbXBNZXRyaWNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFNpemUueCA9IG1UbXBNZXRyaWNzLndpZHRoUGl4ZWxzOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2l6ZS55ID0gbVRtcE1ldHJpY3MuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIGJvb3Qtc3RyYXBwaW5nLCBpbml0aWFsaXppbmcgdGhlCiAgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgYmVmb3JlIHRoZSB3aW5kb3cgbWFuYWdlciBpcyB1cC4KICAgICAgICAgICAgICAgICBvdXRTaXplLnkgPSBnZXRSZWFsSGVpZ2h0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUNvbXBhdGliaWxpdHlJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UbXBNZXRyaWNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UbXBNZXRyaWNzLnJlYWxXaWR0aFBpeGVscyA9IG91dFNpemUueDsKLSAgICAgICAgICAgICAgICAgICAgbVRtcE1ldHJpY3MucmVhbEhlaWdodFBpeGVscyA9IG91dFNpemUueTsKLSAgICAgICAgICAgICAgICAgICAgbVRtcE1ldHJpY3MuZGVuc2l0eSA9IG1EZW5zaXR5OwotICAgICAgICAgICAgICAgICAgICBtQ29tcGF0aWJpbGl0eUluZm8uYXBwbHlUb0Rpc3BsYXlNZXRyaWNzKG1UbXBNZXRyaWNzKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0U2l6ZS54ID0gbVRtcE1ldHJpY3Mud2lkdGhQaXhlbHM7Ci0gICAgICAgICAgICAgICAgICAgIG91dFNpemUueSA9IG1UbXBNZXRyaWNzLmhlaWdodFBpeGVsczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBTbG9nLncoIkRpc3BsYXkiLCAiVW5hYmxlIHRvIGdldCBkaXNwbGF5IHNpemUiLCBlKTsKICAgICAgICAgfQpAQCAtMTA5LDcgKzEyMSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0UmVjdFNpemUoUmVjdCBvdXRTaXplKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVRtcFBvaW50KSB7Ci0gICAgICAgICAgICBnZXRTaXplKG1UbXBQb2ludCk7CisgICAgICAgICAgICBnZXRTaXplSW50ZXJuYWwobVRtcFBvaW50LCB0cnVlKTsKICAgICAgICAgICAgIG91dFNpemUuc2V0KDAsIDAsIG1UbXBQb2ludC54LCBtVG1wUG9pbnQueSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzcsNyArMTQ5LDcgQEAKICAgICAgICAgc3luY2hyb25pemVkIChtVG1wUG9pbnQpIHsKICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgICAgICBpZiAobm93ID4gKG1MYXN0R2V0VGltZSsyMCkpIHsKLSAgICAgICAgICAgICAgICBnZXRTaXplKG1UbXBQb2ludCk7CisgICAgICAgICAgICAgICAgZ2V0U2l6ZUludGVybmFsKG1UbXBQb2ludCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgbUxhc3RHZXRUaW1lID0gbm93OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1UbXBQb2ludC54OwpAQCAtMTUyLDcgKzE2NCw3IEBACiAgICAgICAgIHN5bmNocm9uaXplZCAobVRtcFBvaW50KSB7CiAgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgaWYgKG5vdyA+IChtTGFzdEdldFRpbWUrMjApKSB7Ci0gICAgICAgICAgICAgICAgZ2V0U2l6ZShtVG1wUG9pbnQpOworICAgICAgICAgICAgICAgIGdldFNpemVJbnRlcm5hbChtVG1wUG9pbnQsIHRydWUpOwogICAgICAgICAgICAgICAgIG1MYXN0R2V0VGltZSA9IG5vdzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBtVG1wUG9pbnQueTsKQEAgLTIxOCw3ICsyMzAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldE1ldHJpY3MoRGlzcGxheU1ldHJpY3Mgb3V0TWV0cmljcykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1UbXBQb2ludCkgewotICAgICAgICAgICAgZ2V0U2l6ZShtVG1wUG9pbnQpOworICAgICAgICAgICAgZ2V0U2l6ZUludGVybmFsKG1UbXBQb2ludCwgZmFsc2UpOwogICAgICAgICAgICAgb3V0TWV0cmljcy53aWR0aFBpeGVscyA9IG1UbXBQb2ludC54OwogICAgICAgICAgICAgb3V0TWV0cmljcy5oZWlnaHRQaXhlbHMgPSBtVG1wUG9pbnQueTsKICAgICAgICAgfQpAQCAtMjQ4LDggKzI2MCw4IEBACiAgICAgICAgIG91dE1ldHJpY3MueGRwaSAgICAgICAgID0gbURwaVg7CiAgICAgICAgIG91dE1ldHJpY3MueWRwaSAgICAgICAgID0gbURwaVk7CiAKLSAgICAgICAgb3V0TWV0cmljcy5yZWFsV2lkdGhQaXhlbHMgID0gb3V0TWV0cmljcy53aWR0aFBpeGVsczsKLSAgICAgICAgb3V0TWV0cmljcy5yZWFsSGVpZ2h0UGl4ZWxzID0gb3V0TWV0cmljcy5oZWlnaHRQaXhlbHM7CisgICAgICAgIG91dE1ldHJpY3MudW5zY2FsZWRXaWR0aFBpeGVscyAgPSBvdXRNZXRyaWNzLndpZHRoUGl4ZWxzOworICAgICAgICBvdXRNZXRyaWNzLnVuc2NhbGVkSGVpZ2h0UGl4ZWxzID0gb3V0TWV0cmljcy5oZWlnaHRQaXhlbHM7CiAgICAgfQogCiAgICAgc3RhdGljIElXaW5kb3dNYW5hZ2VyIGdldFdpbmRvd01hbmFnZXIoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YQppbmRleCAyYjc5YTc2Li5kNWNhZDk2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEKQEAgLTIwMSw2ICsyMDEsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuU2V0Vmlld3BvcnQoaW50IHJlbmRlcmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogCiAgICAgLyoqCisgICAgICogUHJlc2VydmVzIHRoZSBiYWNrIGJ1ZmZlciBvZiB0aGUgY3VycmVudCBzdXJmYWNlIGFmdGVyIGEgYnVmZmVyIHN3YXAuCisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBzZXRzIHRoZSBFR0xfU1dBUF9CRUhBVklPUiBhdHRyaWJ1dGUgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiBzdXJmYWNlIHRvIEVHTF9CVUZGRVJfUFJFU0VSVkVELiBDYWxsaW5nIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGFuIEVHTAorICAgICAqIGNvbmZpZyB0aGF0IHN1cHBvcnRzIEVHTF9TV0FQX0JFSEFWSU9SX1BSRVNFUlZFRF9CSVQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzd2FwIGJlaGF2aW9yIHdhcyBzdWNjZXNzZnVsbHkgY2hhbmdlZCwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcmVzZXJ2ZUJhY2tCdWZmZXIoKSB7CkBAIC0yMDgsNiArMjE2LDIxIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gblByZXNlcnZlQmFja0J1ZmZlcigpOyAgICAKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN1cmZhY2UgcHJlc2VydmVzIGl0cyBiYWNrIGJ1ZmZlcgorICAgICAqIGFmdGVyIGEgYnVmZmVyIHN3YXAuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlLCBpZiB0aGUgc3VyZmFjZSdzIEVHTF9TV0FQX0JFSEFWSU9SIGlzIEVHTF9CVUZGRVJfUFJFU0VSVkVELAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogICAgICAgICAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JhY2tCdWZmZXJQcmVzZXJ2ZWQoKSB7CisgICAgICAgIHJldHVybiBuSXNCYWNrQnVmZmVyUHJlc2VydmVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbklzQmFja0J1ZmZlclByZXNlcnZlZCgpOyAgICAKICAgICAKICAgICBAT3ZlcnJpZGUKICAgICB2b2lkIG9uUHJlRHJhdyhSZWN0IGRpcnR5KSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dyYXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR3Jhdml0eS5qYXZhCmluZGV4IGNmNzk2MzguLmJhMDY3OTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR3Jhdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR3Jhdml0eS5qYXZhCkBAIC04MCw5ICs4MCwxMiBAQAogICAgIC8qKiBGbGFnIHRvIGNsaXAgdGhlIGVkZ2VzIG9mIHRoZSBvYmplY3QgdG8gaXRzIGNvbnRhaW5lciBhbG9uZyB0aGUKICAgICAgKiAgaG9yaXpvbnRhbCBheGlzLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSVBfSE9SSVpPTlRBTCA9IEFYSVNfQ0xJUDw8QVhJU19YX1NISUZUOwotICAgIAorCisgICAgLyoqIFJhdyBiaXQgY29udHJvbGxpbmcgd2hldGhlciB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24gaXMgcmVsYXRpdmUgKGJlZm9yZS9hZnRlcikgb3Igbm90LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSVZFX0hPUklaT05UQUxfRElSRUNUSU9OID0gMHgwMDgwMDAwMDsKKwogICAgIC8qKgotICAgICAqIEJpbmFyeSBtYXNrIHRvIGdldCB0aGUgaG9yaXpvbnRhbCBncmF2aXR5IG9mIGEgZ3Jhdml0eS4KKyAgICAgKiBCaW5hcnkgbWFzayB0byBnZXQgdGhlIGFic29sdXRlIGhvcml6b250YWwgZ3Jhdml0eSBvZiBhIGdyYXZpdHkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTF9HUkFWSVRZX01BU0sgPSAoQVhJU19TUEVDSUZJRUQgfAogICAgICAgICAgICAgQVhJU19QVUxMX0JFRk9SRSB8IEFYSVNfUFVMTF9BRlRFUikgPDwgQVhJU19YX1NISUZUOwpAQCAtMTA2LDggKzEwOSwxOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfQ0xJUF9IT1JJWk9OVEFMID0gMHgwMTAwMDAwMDsKICAgICAKKyAgICAvKiogUHVzaCBvYmplY3QgdG8geC1heGlzIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlQgPSBSRUxBVElWRV9IT1JJWk9OVEFMX0RJUkVDVElPTiB8IExFRlQ7CisKKyAgICAvKiogUHVzaCBvYmplY3QgdG8geC1heGlzIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgaXRzIGNvbnRhaW5lciwgbm90IGNoYW5naW5nIGl0cyBzaXplLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORCA9IFJFTEFUSVZFX0hPUklaT05UQUxfRElSRUNUSU9OIHwgUklHSFQ7CisKICAgICAvKioKLSAgICAgKiBBcHBseSBhIGdyYXZpdHkgY29uc3RhbnQgdG8gYW4gb2JqZWN0LgorICAgICAqIEJpbmFyeSBtYXNrIGZvciB0aGUgaG9yaXpvbnRhbCBncmF2aXR5IGFuZCBzY3JpcHQgc3BlY2lmaWMgZGlyZWN0aW9uIGJpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElWRV9IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSyA9IFNUQVJUIHwgRU5EOworCisgICAgLyoqCisgICAgICogQXBwbHkgYSBncmF2aXR5IGNvbnN0YW50IHRvIGFuIG9iamVjdC4gVGhpcyBzdXBwb3NlIHRoYXQgdGhlIGxheW91dCBkaXJlY3Rpb24gaXMgTFRSLgogICAgICAqIAogICAgICAqIEBwYXJhbSBncmF2aXR5IFRoZSBkZXNpcmVkIHBsYWNlbWVudCBvZiB0aGUgb2JqZWN0LCBhcyBkZWZpbmVkIGJ5IHRoZQogICAgICAqICAgICAgICAgICAgICAgIGNvbnN0YW50cyBpbiB0aGlzIGNsYXNzLgpAQCAtMTE5LDEyICsxMzMsMzMgQEAKICAgICAgKiBAcGFyYW0gb3V0UmVjdCBSZWNlaXZlcyB0aGUgY29tcHV0ZWQgZnJhbWUgb2YgdGhlIG9iamVjdCBpbiBpdHMKICAgICAgKiAgICAgICAgICAgICAgICBjb250YWluZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5KGludCBncmF2aXR5LCBpbnQgdywgaW50IGgsIFJlY3QgY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IG91dFJlY3QpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHkoaW50IGdyYXZpdHksIGludCB3LCBpbnQgaCwgUmVjdCBjb250YWluZXIsIFJlY3Qgb3V0UmVjdCkgewogICAgICAgICBhcHBseShncmF2aXR5LCB3LCBoLCBjb250YWluZXIsIDAsIDAsIG91dFJlY3QpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFwcGx5IGEgZ3Jhdml0eSBjb25zdGFudCB0byBhbiBvYmplY3QgYW5kIHRha2UgY2FyZSBpZiBsYXlvdXQgZGlyZWN0aW9uIGlzIFJUTCBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3Jhdml0eSBUaGUgZGVzaXJlZCBwbGFjZW1lbnQgb2YgdGhlIG9iamVjdCwgYXMgZGVmaW5lZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBjb25zdGFudHMgaW4gdGhpcyBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdyBUaGUgaG9yaXpvbnRhbCBzaXplIG9mIHRoZSBvYmplY3QuCisgICAgICogQHBhcmFtIGggVGhlIHZlcnRpY2FsIHNpemUgb2YgdGhlIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBmcmFtZSBvZiB0aGUgY29udGFpbmluZyBzcGFjZSwgaW4gd2hpY2ggdGhlIG9iamVjdAorICAgICAqICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwbGFjZWQuICBTaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgICB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBvYmplY3QuCisgICAgICogQHBhcmFtIG91dFJlY3QgUmVjZWl2ZXMgdGhlIGNvbXB1dGVkIGZyYW1lIG9mIHRoZSBvYmplY3QgaW4gaXRzCisgICAgICogICAgICAgICAgICAgICAgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSBpc1J0bCBXaGV0aGVyIHRoZSBsYXlvdXQgaXMgcmlnaHQtdG8tbGVmdC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5KGludCBncmF2aXR5LCBpbnQgdywgaW50IGgsIFJlY3QgY29udGFpbmVyLAorICAgICAgICAgICAgUmVjdCBvdXRSZWN0LCBib29sZWFuIGlzUnRsKSB7CisgICAgICAgIGludCBhYnNHcmF2aXR5ID0gZ2V0QWJzb2x1dGVHcmF2aXR5KGdyYXZpdHksIGlzUnRsKTsKKyAgICAgICAgYXBwbHkoYWJzR3Jhdml0eSwgdywgaCwgY29udGFpbmVyLCAwLCAwLCBvdXRSZWN0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBcHBseSBhIGdyYXZpdHkgY29uc3RhbnQgdG8gYW4gb2JqZWN0LgogICAgICAqIAogICAgICAqIEBwYXJhbSBncmF2aXR5IFRoZSBkZXNpcmVkIHBsYWNlbWVudCBvZiB0aGUgb2JqZWN0LCBhcyBkZWZpbmVkIGJ5IHRoZQpAQCAtMTQ2LDcgKzE4MSw3IEBACiAgICAgICogICAgICAgICAgICAgICAgY29udGFpbmVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseShpbnQgZ3Jhdml0eSwgaW50IHcsIGludCBoLCBSZWN0IGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhBZGosIGludCB5QWRqLCBSZWN0IG91dFJlY3QpIHsKKyAgICAgICAgICAgIGludCB4QWRqLCBpbnQgeUFkaiwgUmVjdCBvdXRSZWN0KSB7CiAgICAgICAgIHN3aXRjaCAoZ3Jhdml0eSYoKEFYSVNfUFVMTF9CRUZPUkV8QVhJU19QVUxMX0FGVEVSKTw8QVhJU19YX1NISUZUKSkgewogICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgIG91dFJlY3QubGVmdCA9IGNvbnRhaW5lci5sZWZ0CkBAIC0zMDEsNiArMzM2LDQ4IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXBwbGllZCBncmF2aXR5IGhhcyBhbiBob3Jpem9udGFsIHB1bGwKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIb3Jpem9udGFsKGludCBncmF2aXR5KSB7Ci0gICAgICAgIHJldHVybiBncmF2aXR5ID4gMCAmJiAoZ3Jhdml0eSAmIEhPUklaT05UQUxfR1JBVklUWV9NQVNLKSAhPSAwOworICAgICAgICByZXR1cm4gZ3Jhdml0eSA+IDAgJiYgKGdyYXZpdHkgJiBSRUxBVElWRV9IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Db252ZXJ0IHNjcmlwdCBzcGVjaWZpYyBncmF2aXR5IHRvIGFic29sdXRlIGhvcml6b250YWwgdmFsdWUuPC9wPgorICAgICAqCisgICAgICogaWYgaG9yaXpvbnRhbCBkaXJlY3Rpb24gaXMgTFRSLCB0aGVuIFNUQVJUIHdpbGwgc2V0IExFRlQgYW5kIEVORCB3aWxsIHNldCBSSUdIVC4KKyAgICAgKiBpZiBob3Jpem9udGFsIGRpcmVjdGlvbiBpcyBSVEwsIHRoZW4gU1RBUlQgd2lsbCBzZXQgUklHSFQgYW5kIEVORCB3aWxsIHNldCBMRUZULgorICAgICAqCisgICAgICogQHBhcmFtIGdyYXZpdHkgVGhlIGdyYXZpdHkgdG8gY29udmVydCB0byBhYnNvbHV0ZSAoaG9yaXpvbnRhbCkgdmFsdWVzLgorICAgICAqIEBwYXJhbSBpc1J0bCBXaGV0aGVyIHRoZSBsYXlvdXQgaXMgcmlnaHQtdG8tbGVmdC4KKyAgICAgKiBAcmV0dXJuIGdyYXZpdHkgY29udmVydGVkIHRvIGFic29sdXRlIChob3Jpem9udGFsKSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0QWJzb2x1dGVHcmF2aXR5KGludCBncmF2aXR5LCBib29sZWFuIGlzUnRsKSB7CisgICAgICAgIGludCByZXN1bHQgPSBncmF2aXR5OworICAgICAgICAvLyBJZiBsYXlvdXQgaXMgc2NyaXB0IHNwZWNpZmljIGFuZCBncmF2aXR5IGlzIGhvcml6b250YWwgcmVsYXRpdmUgKFNUQVJUIG9yIEVORCkKKyAgICAgICAgaWYgKChyZXN1bHQgJiBSRUxBVElWRV9IT1JJWk9OVEFMX0RJUkVDVElPTikgPiAwKSB7CisgICAgICAgICAgICBpZiAoKHJlc3VsdCAmIEdyYXZpdHkuU1RBUlQpID09IEdyYXZpdHkuU1RBUlQpIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIFNUQVJUIGJpdAorICAgICAgICAgICAgICAgIHJlc3VsdCAmPSB+U1RBUlQ7CisgICAgICAgICAgICAgICAgaWYgKGlzUnRsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgUklHSFQgYml0CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBSSUdIVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIExFRlQgYml0CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBMRUZUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHJlc3VsdCAmIEdyYXZpdHkuRU5EKSA9PSBHcmF2aXR5LkVORCkgeworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgRU5EIGJpdAorICAgICAgICAgICAgICAgIHJlc3VsdCAmPSB+RU5EOworICAgICAgICAgICAgICAgIGlmIChpc1J0bCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIExFRlQgYml0CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBMRUZUOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgUklHSFQgYml0CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBSSUdIVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBEb24ndCBuZWVkIHRoZSBzY3JpcHQgc3BlY2lmaWMgYml0IGFueSBtb3JlLCBzbyByZW1vdmUgaXQgYXMgd2UgYXJlIGNvbnZlcnRpbmcgdG8KKyAgICAgICAgICAgIC8vIGFic29sdXRlIHZhbHVlcyAoTEVGVCBvciBSSUdIVCkKKyAgICAgICAgICAgIHJlc3VsdCAmPSB+UkVMQVRJVkVfSE9SSVpPTlRBTF9ESVJFQ1RJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhcmR3YXJlUmVuZGVyZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCmluZGV4IDYxYTI0YTAuLjI2MTFlYzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCkBAIC0zMTEsNiArMzExLDcgQEAKICAgICAgICAgUGFpbnQgbURlYnVnUGFpbnQ7CiAKICAgICAgICAgYm9vbGVhbiBtRGlydHlSZWdpb25zOworICAgICAgICBmaW5hbCBib29sZWFuIG1EaXJ0eVJlZ2lvbnNSZXF1ZXN0ZWQ7CiAKICAgICAgICAgZmluYWwgaW50IG1HbFZlcnNpb247CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gbVRyYW5zbHVjZW50OwpAQCAtMzI1LDYgKzMyNiw3IEBACiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGlydHlQcm9wZXJ0eSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KFJFTkRFUl9ESVJUWV9SRUdJT05TX1BST1BFUlRZLCAidHJ1ZSIpOwogICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24sQ29uc3RhbnRDb25kaXRpb25zCiAgICAgICAgICAgICBtRGlydHlSZWdpb25zID0gUkVOREVSX0RJUlRZX1JFR0lPTlMgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoZGlydHlQcm9wZXJ0eSk7CisgICAgICAgICAgICBtRGlydHlSZWdpb25zUmVxdWVzdGVkID0gbURpcnR5UmVnaW9uczsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNTQ1LDExICs1NDcsMjEgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VyZmFjZS5PdXRPZlJlc291cmNlc0V4Y2VwdGlvbigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RUdMRXJyb3JTdHJpbmcoc0VnbC5lZ2xHZXRFcnJvcigpKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKworICAgICAgICAgICAgLy8gSWYgbURpcnR5UmVnaW9ucyBpcyBzZXQsIHRoaXMgbWVhbnMgd2UgaGF2ZSBhbiBFR0wgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy8gd2l0aCBFR0xfU1dBUF9CRUhBVklPUl9QUkVTRVJWRURfQklUIHNldAogICAgICAgICAgICAgaWYgKG1EaXJ0eVJlZ2lvbnMpIHsKICAgICAgICAgICAgICAgICBpZiAoIUdMRVMyMENhbnZhcy5wcmVzZXJ2ZUJhY2tCdWZmZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQmFja2J1ZmZlciBjYW5ub3QgYmUgcHJlc2VydmVkIik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtRGlydHlSZWdpb25zUmVxdWVzdGVkKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbURpcnR5UmVnaW9ucyBpcyBub3Qgc2V0LCBvdXIgRUdMIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QKKyAgICAgICAgICAgICAgICAvLyBoYXZlIEVHTF9TV0FQX0JFSEFWSU9SX1BSRVNFUlZFRF9CSVQ7IGhvd2V2ZXIsIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgLy8gc3dhcCBiZWhhdmlvciBtaWdodCBiZSBFR0xfQlVGRkVSX1BSRVNFUlZFRCwgd2hpY2ggbWVhbnMgd2UKKyAgICAgICAgICAgICAgICAvLyB3YW50IHRvIHNldCBtRGlydHlSZWdpb25zLiBXZSB0cnkgdG8gZG8gdGhpcyBvbmx5IGlmIGRpcnR5CisgICAgICAgICAgICAgICAgLy8gcmVnaW9ucyB3ZXJlIGluaXRpYWxseSByZXF1ZXN0ZWQgYXMgcGFydCBvZiB0aGUgZGV2aWNlCisgICAgICAgICAgICAgICAgLy8gY29uZmlndXJhdGlvbiAoc2VlIFJFTkRFUl9ESVJUWV9SRUdJT05TKQorICAgICAgICAgICAgICAgIG1EaXJ0eVJlZ2lvbnMgPSBHTEVTMjBDYW52YXMuaXNCYWNrQnVmZmVyUHJlc2VydmVkKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBzRWdsQ29udGV4dC5nZXRHTCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93TWFuYWdlci5haWRsCmluZGV4IGFkYWZiNTkuLmFkMTdlZGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvd01hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lXaW5kb3dNYW5hZ2VyLmFpZGwKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dENvbnRleHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RDbGllbnQ7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbXBhdGliaWxpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwpAQCAtNTksNiArNjAsOSBAQAogICAgIHZvaWQgc2V0Rm9yY2VkRGlzcGxheVNpemUoaW50IGxvbmdEaW1lbiwgaW50IHNob3J0RGltZW4pOwogICAgIHZvaWQgY2xlYXJGb3JjZWREaXNwbGF5U2l6ZSgpOwogCisgICAgLy8gSXMgZGV2aWNlIGNvbmZpZ3VyZWQgd2l0aCBhIGhpZGVhYmxlIHN0YXR1cyBiYXIgb3IgYSB0YWJsZXQgc3lzdGVtIGJhcj8KKyAgICBib29sZWFuIGNhblN0YXR1c0JhckhpZGUoKTsKKwogICAgIC8vIFRoZXNlIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIGluamVjdGluZyBldmVudHMgdG8geW91ciBvd24gd2luZG93LAogICAgIC8vIG9yIGJ5IGhvbGRpbmcgdGhlIElOSkVDVF9FVkVOVFMgcGVybWlzc2lvbi4gIFRoZXNlIG1ldGhvZHMgbWF5IGJsb2NrCiAgICAgLy8gdW50aWwgcGVuZGluZyBpbnB1dCBldmVudHMgYXJlIGZpbmlzaGVkIGJlaW5nIGRpc3BhdGNoZWQgZXZlbiB3aGVuICdzeW5jJyBpcyBmYWxzZS4KQEAgLTg1LDcgKzg5LDcgQEAKICAgICB2b2lkIG92ZXJyaWRlUGVuZGluZ0FwcFRyYW5zaXRpb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgZW50ZXJBbmltLCBpbnQgZXhpdEFuaW0pOwogICAgIHZvaWQgZXhlY3V0ZUFwcFRyYW5zaXRpb24oKTsKICAgICB2b2lkIHNldEFwcFN0YXJ0aW5nV2luZG93KElCaW5kZXIgdG9rZW4sIFN0cmluZyBwa2csIGludCB0aGVtZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBub25Mb2NhbGl6ZWRMYWJlbCwgaW50IGxhYmVsUmVzLAorICAgICAgICAgICAgaW4gQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0SW5mbywgQ2hhclNlcXVlbmNlIG5vbkxvY2FsaXplZExhYmVsLCBpbnQgbGFiZWxSZXMsCiAgICAgICAgICAgICBpbnQgaWNvbiwgaW50IHdpbmRvd0ZsYWdzLCBJQmluZGVyIHRyYW5zZmVyRnJvbSwgYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCk7CiAgICAgdm9pZCBzZXRBcHBXaWxsQmVIaWRkZW4oSUJpbmRlciB0b2tlbik7CiAgICAgdm9pZCBzZXRBcHBWaXNpYmlsaXR5KElCaW5kZXIgdG9rZW4sIGJvb2xlYW4gdmlzaWJsZSk7CkBAIC0yMDEsNCArMjA1LDkgQEAKICAgICAgKiBDYWxsZWQgYnkgdGhlIHN0YXR1cyBiYXIgdG8gbm90aWZ5IFZpZXdzIG9mIGNoYW5nZXMgdG8gU3lzdGVtIFVJIHZpc2libGl0eS4KICAgICAgKi8KICAgICB2b2lkIHN0YXR1c0JhclZpc2liaWxpdHlDaGFuZ2VkKGludCB2aXNpYmlsaXR5KTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgc2V0dGluZ3MgYXBwbGljYXRpb24gdG8gdGVtcG9yYXJpbHkgc2V0IHRoZSBwb2ludGVyIHNwZWVkLgorICAgICAqLworICAgIHZvaWQgc2V0UG9pbnRlclNwZWVkKGludCBzcGVlZCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJdGVtLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJdGVtLmphdmEKaW5kZXggNzgwYzUyZS4uZGM2ODI2NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YQpAQCAtNTEsNiArNTEsMTMgQEAKICAgICAgKiBpdCBhbHNvIGhhcyBhbiBpY29uIHNwZWNpZmllZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9XSVRIX1RFWFQgPSA0OworCisgICAgLyoqCisgICAgICogVGhpcyBpdGVtJ3MgYWN0aW9uIHZpZXcgY29sbGFwc2VzIHRvIGEgbm9ybWFsIG1lbnUgaXRlbS4KKyAgICAgKiBXaGVuIGV4cGFuZGVkLCB0aGUgYWN0aW9uIHZpZXcgdGVtcG9yYXJpbHkgdGFrZXMgb3ZlcgorICAgICAqIGEgbGFyZ2VyIHNlZ21lbnQgb2YgaXRzIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9DT0xMQVBTRV9BQ1RJT05fVklFVyA9IDg7CiAgICAgCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEgbWVudSBpdGVtIGlzCkBAIC03NCw2ICs4MSwzNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbQorICAgICAqIG1hcmtlZCB3aXRoIHtAbGluayBNZW51SXRlbSNTSE9XX0FTX0FDVElPTl9DT0xMQVBTRV9BQ1RJT05fVklFV30gaXMKKyAgICAgKiBleHBhbmRlZCBvciBjb2xsYXBzZWQuCisgICAgICoKKyAgICAgKiBAc2VlIE1lbnVJdGVtI2V4cGFuZEFjdGlvblZpZXcoKQorICAgICAqIEBzZWUgTWVudUl0ZW0jY29sbGFwc2VBY3Rpb25WaWV3KCkKKyAgICAgKiBAc2VlIE1lbnVJdGVtI3NldFNob3dBc0FjdGlvbkZsYWdzKGludCkKKyAgICAgKiBAc2VlIE1lbnVJdGVtIworICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25BY3Rpb25FeHBhbmRMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lbnUgaXRlbSB3aXRoIHtAbGluayBNZW51SXRlbSNTSE9XX0FTX0FDVElPTl9DT0xMQVBTRV9BQ1RJT05fVklFV30KKyAgICAgICAgICogaXMgZXhwYW5kZWQuCisgICAgICAgICAqIEBwYXJhbSBpdGVtIEl0ZW0gdGhhdCB3YXMgZXhwYW5kZWQKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpdGVtIHNob3VsZCBleHBhbmQsIGZhbHNlIGlmIGV4cGFuc2lvbiBzaG91bGQgYmUgc3VwcHJlc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1BY3Rpb25FeHBhbmQoTWVudUl0ZW0gaXRlbSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVudSBpdGVtIHdpdGgge0BsaW5rIE1lbnVJdGVtI1NIT1dfQVNfQUNUSU9OX0NPTExBUFNFX0FDVElPTl9WSUVXfQorICAgICAgICAgKiBpcyBjb2xsYXBzZWQuCisgICAgICAgICAqIEBwYXJhbSBpdGVtIEl0ZW0gdGhhdCB3YXMgY29sbGFwc2VkCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaXRlbSBzaG91bGQgY29sbGFwc2UsIGZhbHNlIGlmIGNvbGxhcHNpbmcgc2hvdWxkIGJlIHN1cHByZXNzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtQWN0aW9uQ29sbGFwc2UoTWVudUl0ZW0gaXRlbSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBpZGVudGlmaWVyIGZvciB0aGlzIG1lbnUgaXRlbS4gIFRoZSBpZGVudGlmaWVyIGNhbiBub3QKICAgICAgKiBiZSBjaGFuZ2VkIGFmdGVyIHRoZSBtZW51IGlzIGNyZWF0ZWQuCiAgICAgICoKQEAgLTQyMSw2ICs0NTYsMjcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IGFjdGlvbkVudW0pOwogCiAgICAgLyoqCisgICAgICogU2V0cyBob3cgdGhpcyBpdGVtIHNob3VsZCBkaXNwbGF5IGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBY3Rpb24gQmFyLgorICAgICAqIFRoZSBwYXJhbWV0ZXIgYWN0aW9uRW51bSBpcyBhIGZsYWcgc2V0LiBPbmUgb2Yge0BsaW5rICNTSE9XX0FTX0FDVElPTl9BTFdBWVN9LAorICAgICAqIHtAbGluayAjU0hPV19BU19BQ1RJT05fSUZfUk9PTX0sIG9yIHtAbGluayAjU0hPV19BU19BQ1RJT05fTkVWRVJ9IHNob3VsZAorICAgICAqIGJlIHVzZWQsIGFuZCB5b3UgbWF5IG9wdGlvbmFsbHkgT1IgdGhlIHZhbHVlIHdpdGgge0BsaW5rICNTSE9XX0FTX0FDVElPTl9XSVRIX1RFWFR9LgorICAgICAqIFNIT1dfQVNfQUNUSU9OX1dJVEhfVEVYVCByZXF1ZXN0cyB0aGF0IHdoZW4gdGhlIGl0ZW0gaXMgc2hvd24gYXMgYW4gYWN0aW9uLAorICAgICAqIGl0IHNob3VsZCBiZSBzaG93biB3aXRoIGEgdGV4dCBsYWJlbC4KKyAgICAgKgorICAgICAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB7QGxpbmsgI3NldFNob3dBc0FjdGlvbihpbnQpfSBvbmx5IGluIHRoYXQgaXQKKyAgICAgKiByZXR1cm5zIHRoZSBjdXJyZW50IE1lbnVJdGVtIGluc3RhbmNlIGZvciBjYWxsIGNoYWluaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGlvbkVudW0gSG93IHRoZSBpdGVtIHNob3VsZCBkaXNwbGF5LiBPbmUgb2YKKyAgICAgKiB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0FMV0FZU30sIHtAbGluayAjU0hPV19BU19BQ1RJT05fSUZfUk9PTX0sIG9yCisgICAgICoge0BsaW5rICNTSE9XX0FTX0FDVElPTl9ORVZFUn0uIFNIT1dfQVNfQUNUSU9OX05FVkVSIGlzIHRoZSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLmFwcC5BY3Rpb25CYXIKKyAgICAgKiBAc2VlICNzZXRBY3Rpb25WaWV3KFZpZXcpCisgICAgICogQHJldHVybiBUaGlzIE1lbnVJdGVtIGluc3RhbmNlIGZvciBjYWxsIGNoYWluaW5nLgorICAgICAqLworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRTaG93QXNBY3Rpb25GbGFncyhpbnQgYWN0aW9uRW51bSk7CisKKyAgICAvKioKICAgICAgKiBTZXQgYW4gYWN0aW9uIHZpZXcgZm9yIHRoaXMgbWVudSBpdGVtLiBBbiBhY3Rpb24gdmlldyB3aWxsIGJlIGRpc3BsYXllZCBpbiBwbGFjZQogICAgICAqIG9mIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1lbnUgaXRlbSBlbGVtZW50IGluIHRoZSBVSSB3aGVuIHRoaXMgaXRlbSBpcyBzaG93bgogICAgICAqIGFzIGFuIGFjdGlvbiB3aXRoaW4gYSBwYXJlbnQuCkBAIC00NTMsNCArNTA5LDUyIEBACiAgICAgICogQHNlZSAjc2V0U2hvd0FzQWN0aW9uKGludCkKICAgICAgKi8KICAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCk7CisKKyAgICAvKioKKyAgICAgKiBFeHBhbmQgdGhlIGFjdGlvbiB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lbnUgaXRlbS4KKyAgICAgKiBUaGUgbWVudSBpdGVtIG11c3QgaGF2ZSBhbiBhY3Rpb24gdmlldyBzZXQsIGFzIHdlbGwgYXMKKyAgICAgKiB0aGUgc2hvd0FzQWN0aW9uIGZsYWcge0BsaW5rICNTSE9XX0FTX0FDVElPTl9DT0xMQVBTRV9BQ1RJT05fVklFV30uCisgICAgICogSWYgYSBsaXN0ZW5lciBoYXMgYmVlbiBzZXQgdXNpbmcge0BsaW5rICNzZXRPbkFjdGlvbkV4cGFuZExpc3RlbmVyKE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIpfQorICAgICAqIGl0IHdpbGwgaGF2ZSBpdHMge0BsaW5rIE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIjb25NZW51SXRlbUFjdGlvbkV4cGFuZChNZW51SXRlbSl9CisgICAgICogbWV0aG9kIGludm9rZWQuIFRoZSBsaXN0ZW5lciBtYXkgcmV0dXJuIGZhbHNlIGZyb20gdGhpcyBtZXRob2QgdG8gcHJldmVudCBleHBhbmRpbmcKKyAgICAgKiB0aGUgYWN0aW9uIHZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiB2aWV3IHdhcyBleHBhbmRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4cGFuZEFjdGlvblZpZXcoKTsKKworICAgIC8qKgorICAgICAqIENvbGxhcHNlIHRoZSBhY3Rpb24gdmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZW51IGl0ZW0uCisgICAgICogVGhlIG1lbnUgaXRlbSBtdXN0IGhhdmUgYW4gYWN0aW9uIHZpZXcgc2V0LCBhcyB3ZWxsIGFzIHRoZSBzaG93QXNBY3Rpb24gZmxhZworICAgICAqIHtAbGluayAjU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVd9LiBJZiBhIGxpc3RlbmVyIGhhcyBiZWVuIHNldCB1c2luZworICAgICAqIHtAbGluayAjc2V0T25BY3Rpb25FeHBhbmRMaXN0ZW5lcihPbkFjdGlvbkV4cGFuZExpc3RlbmVyKX0gaXQgd2lsbCBoYXZlIGl0cworICAgICAqIHtAbGluayBPbkFjdGlvbkV4cGFuZExpc3RlbmVyI29uTWVudUl0ZW1BY3Rpb25Db2xsYXBzZShNZW51SXRlbSl9IG1ldGhvZCBpbnZva2VkLgorICAgICAqIFRoZSBsaXN0ZW5lciBtYXkgcmV0dXJuIGZhbHNlIGZyb20gdGhpcyBtZXRob2QgdG8gcHJldmVudCBjb2xsYXBzaW5nIHRoZSBhY3Rpb24gdmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYWN0aW9uIHZpZXcgd2FzIGNvbGxhcHNlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbGxhcHNlQWN0aW9uVmlldygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWVudSBpdGVtJ3MgYWN0aW9uIHZpZXcgaGFzIGJlZW4gZXhwYW5kZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGl0ZW0ncyBhY3Rpb24gdmlldyBpcyBleHBhbmRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHNlZSAjZXhwYW5kQWN0aW9uVmlldygpCisgICAgICogQHNlZSAjY29sbGFwc2VBY3Rpb25WaWV3KCkKKyAgICAgKiBAc2VlICNTSE9XX0FTX0FDVElPTl9DT0xMQVBTRV9BQ1RJT05fVklFVworICAgICAqIEBzZWUgT25BY3Rpb25FeHBhbmRMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uVmlld0V4cGFuZGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4ge0BsaW5rIE9uQWN0aW9uRXhwYW5kTGlzdGVuZXJ9IG9uIHRoaXMgbWVudSBpdGVtIHRvIGJlIG5vdGlmaWVkIHdoZW4KKyAgICAgKiB0aGUgYXNzb2NpYXRlZCBhY3Rpb24gdmlldyBpcyBleHBhbmRlZCBvciBjb2xsYXBzZWQuIFRoZSBtZW51IGl0ZW0gbXVzdAorICAgICAqIGJlIGNvbmZpZ3VyZWQgdG8gZXhwYW5kIG9yIGNvbGxhcHNlIGl0cyBhY3Rpb24gdmlldyB1c2luZyB0aGUgZmxhZworICAgICAqIHtAbGluayAjU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVd9LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIHRoYXQgd2lsbCByZXNwb25kIHRvIGV4cGFuZC9jb2xsYXBzZSBldmVudHMKKyAgICAgKiBAcmV0dXJuIFRoaXMgbWVudSBpdGVtIGluc3RhbmNlIGZvciBjYWxsIGNoYWluaW5nCisgICAgICovCisgICAgcHVibGljIE1lbnVJdGVtIHNldE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIoT25BY3Rpb25FeHBhbmRMaXN0ZW5lciBsaXN0ZW5lcik7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WZWxvY2l0eVRyYWNrZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmVsb2NpdHlUcmFja2VyLmphdmEKaW5kZXggZmNjZWYyYi4uNWE5MWQzMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WZWxvY2l0eVRyYWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZlbG9jaXR5VHJhY2tlci5qYXZhCkBAIC01MCw2ICs1MCw3IEBACiAKICAgICBwcml2YXRlIGludCBtUHRyOwogICAgIHByaXZhdGUgVmVsb2NpdHlUcmFja2VyIG1OZXh0OworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQb29sZWQ7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUluaXRpYWxpemUoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVEaXNwb3NlKGludCBwdHIpOwpAQCAtOTMsNiArOTQsMjAgQEAKICAgICAgICAgcmV0dXJuIG1OZXh0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQb29sZWQoKSB7CisgICAgICAgIHJldHVybiBtSXNQb29sZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb29sZWQoYm9vbGVhbiBpc1Bvb2xlZCkgeworICAgICAgICBtSXNQb29sZWQgPSBpc1Bvb2xlZDsKKyAgICB9CisKICAgICBwcml2YXRlIFZlbG9jaXR5VHJhY2tlcigpIHsKICAgICAgICAgbVB0ciA9IG5hdGl2ZUluaXRpYWxpemUoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IGU1NDA0NmQuLjUxZWIxM2IgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudFNvdXJjZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKQEAgLTYzMSw3ICs2MzIsNyBAQAogICoKICAqIEBzZWUgYW5kcm9pZC52aWV3LlZpZXdHcm91cAogICovCi1wdWJsaWMgY2xhc3MgVmlldyBpbXBsZW1lbnRzIERyYXdhYmxlLkNhbGxiYWNrLCBLZXlFdmVudC5DYWxsYmFjaywgQWNjZXNzaWJpbGl0eUV2ZW50U291cmNlIHsKK3B1YmxpYyBjbGFzcyBWaWV3IGltcGxlbWVudHMgRHJhd2FibGUuQ2FsbGJhY2syLCBLZXlFdmVudC5DYWxsYmFjaywgQWNjZXNzaWJpbGl0eUV2ZW50U291cmNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwogCiAgICAgLyoqCkBAIC05ODIsMTAgKzk4MywyMSBAQAogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTF9ESVJFQ1RJT05fTUFTSyA9IDB4QzAwMDAwMDA7CiAKKyAgICAvKgorICAgICAqIEFycmF5IG9mIGhvcml6b250YWwgZGlyZWN0aW9uIGZsYWdzIGZvciBtYXBwaW5nIGF0dHJpYnV0ZSAiaG9yaXpvbnRhbERpcmVjdGlvbiIgdG8gY29ycmVjdAorICAgICAqIGZsYWcgdmFsdWUuCisgICAgICoge0BoaWRlfQorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEhPUklaT05UQUxfRElSRUNUSU9OX0ZMQUdTID0geyBIT1JJWk9OVEFMX0RJUkVDVElPTl9MVFIsCiAgICAgICAgICAgICBIT1JJWk9OVEFMX0RJUkVDVElPTl9SVEwsIEhPUklaT05UQUxfRElSRUNUSU9OX0lOSEVSSVQsIEhPUklaT05UQUxfRElSRUNUSU9OX0xPQ0FMRX07CiAKICAgICAvKioKKyAgICAgKiBEZWZhdWx0IGhvcml6b250YWxEaXJlY3Rpb24uCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIT1JJWk9OVEFMX0RJUkVDVElPTl9ERUZBVUxUID0gSE9SSVpPTlRBTF9ESVJFQ1RJT05fSU5IRVJJVDsKKworICAgIC8qKgogICAgICAqIFZpZXcgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIge0BsaW5rICNhZGRGb2N1c2FibGVzKEFycmF5TGlzdCwgaW50LCBpbnQpfQogICAgICAqIHNob3VsZCBhZGQgYWxsIGZvY3VzYWJsZSBWaWV3cyByZWdhcmRsZXNzIGlmIHRoZXkgYXJlIGZvY3VzYWJsZSBpbiB0b3VjaCBtb2RlLgogICAgICAqLwpAQCAtMTQ4MSw2ICsxNDkzLDExIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNUYWdzTG9jayA9IG5ldyBPYmplY3QoKTsKIAogICAgIC8qKgorICAgICAqIFRoZSBuZXh0IGF2YWlsYWJsZSBhY2Nlc3NpaWJsaXR5IGlkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzTmV4dEFjY2Vzc2liaWxpdHlWaWV3SWQ7CisKKyAgICAvKioKICAgICAgKiBUaGUgYW5pbWF0aW9uIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aWV3LgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC0xNTIyLDYgKzE1MzksMTEgQEAKICAgICBpbnQgbUlEID0gTk9fSUQ7CiAKICAgICAvKioKKyAgICAgKiBUaGUgc3RhYmxlIElEIG9mIHRoaXMgdmlldyBmb3IgYWNjZXNzaWJpbGl0eSBwb3Jwb3Nlcy4KKyAgICAgKi8KKyAgICBpbnQgbUFjY2Vzc2liaWxpdHlWaWV3SWQgPSBOT19JRDsKKworICAgIC8qKgogICAgICAqIFRoZSB2aWV3J3MgdGFnLgogICAgICAqIHtAaGlkZX0KICAgICAgKgpAQCAtMjQ0Miw3ICsyNDY0LDcgQEAKICAgICBwdWJsaWMgVmlldyhDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtUmVzb3VyY2VzID0gY29udGV4dCAhPSBudWxsID8gY29udGV4dC5nZXRSZXNvdXJjZXMoKSA6IG51bGw7Ci0gICAgICAgIG1WaWV3RmxhZ3MgPSBTT1VORF9FRkZFQ1RTX0VOQUJMRUQgfCBIQVBUSUNfRkVFREJBQ0tfRU5BQkxFRDsKKyAgICAgICAgbVZpZXdGbGFncyA9IFNPVU5EX0VGRkVDVFNfRU5BQkxFRCB8IEhBUFRJQ19GRUVEQkFDS19FTkFCTEVEIHwgSE9SSVpPTlRBTF9ESVJFQ1RJT05fSU5IRVJJVDsKICAgICAgICAgbVRvdWNoU2xvcCA9IFZpZXdDb25maWd1cmF0aW9uLmdldChjb250ZXh0KS5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgc2V0T3ZlclNjcm9sbE1vZGUoT1ZFUl9TQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTKTsKICAgICB9CkBAIC0yNjQxLDEyICsyNjYzLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3X2hvcml6b250YWxEaXJlY3Rpb246Ci0gICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGF5b3V0RGlyZWN0aW9uID0gYS5nZXRJbnQoYXR0ciwgMCk7Ci0gICAgICAgICAgICAgICAgICBpZiAobGF5b3V0RGlyZWN0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICB2aWV3RmxhZ1ZhbHVlcyB8PSBIT1JJWk9OVEFMX0RJUkVDVElPTl9GTEFHU1tsYXlvdXREaXJlY3Rpb25dOwotICAgICAgICAgICAgICAgICAgICAgIHZpZXdGbGFnTWFza3MgfD0gSE9SSVpPTlRBTF9ESVJFQ1RJT05fTUFTSzsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBhbnkgSE9SSVpPTlRBTF9ESVJFQ1RJT04gZmxhZyBhbHJlYWR5IHNldAorICAgICAgICAgICAgICAgICAgICB2aWV3RmxhZ1ZhbHVlcyAmPSB+SE9SSVpPTlRBTF9ESVJFQ1RJT05fTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBIT1JJWk9OVEFMX0RJUkVDVElPTiBmbGFncyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhvcml6b250YWxEaXJlY3Rpb24gPSBhLmdldEludChhdHRyLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsRGlyZWN0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWV3RmxhZ1ZhbHVlcyB8PSBIT1JJWk9OVEFMX0RJUkVDVElPTl9GTEFHU1tob3Jpem9udGFsRGlyZWN0aW9uXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0byBkZWZhdWx0IChIT1JJWk9OVEFMX0RJUkVDVElPTl9JTkhFUklUKQorICAgICAgICAgICAgICAgICAgICAgICAgdmlld0ZsYWdWYWx1ZXMgfD0gSE9SSVpPTlRBTF9ESVJFQ1RJT05fREVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2aWV3RmxhZ01hc2tzIHw9IEhPUklaT05UQUxfRElSRUNUSU9OX01BU0s7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld19kcmF3aW5nQ2FjaGVRdWFsaXR5OgogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2FjaGVRdWFsaXR5ID0gYS5nZXRJbnQoYXR0ciwgMCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZVF1YWxpdHkgIT0gMCkgewpAQCAtMzYzMiw2ICszNjYwLDcgQEAKICAgICAgKiBAc2VlICNkaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50LnNldFNvdXJjZSh0aGlzKTsKICAgICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgZXZlbnQuc2V0UGFja2FnZU5hbWUoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkpOwogICAgICAgICBldmVudC5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKQEAgLTM2NDcsNiArMzY3NiwxMTIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99IHJlcHJlc2VudGluZyB0aGlzIHZpZXcgZnJvbSB0aGUKKyAgICAgKiBwb2ludCBvZiB2aWV3IG9mIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3Igb2J0YWluaW5nIGFuIGFjY2Vzc2liaWxpdHkgbm9kZSBpbmZvIGZyb20gYQorICAgICAqIHBvb2wgb2YgcmV1c2FibGUgaW5zdGFuY2VzIGFuZCBjYWxsaW5nCisgICAgICoge0BsaW5rICNvbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oQWNjZXNzaWJpbGl0eU5vZGVJbmZvKX0gb24gdGhpcyB2aWV3IHRvCisgICAgICogaW5pdGlhbGl6ZSB0aGUgZm9ybWVyLgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIHJlY3ljbGluZyB0aGUgb2J0YWluZWQgaW5zdGFuY2UgYnkgY2FsbGluZworICAgICAqICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jcmVjeWNsZSgpfSB0byBtaW5pbWl6ZSBvYmplY3QgY3JlYXRpb24uCisgICAgICogPC9wPgorICAgICAqIEByZXR1cm4gQSBwb3B1bGF0ZWQge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb30uCisgICAgICoKKyAgICAgKiBAc2VlIEFjY2Vzc2liaWxpdHlOb2RlSW5mbworICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gY3JlYXRlQWNjZXNzaWJpbGl0eU5vZGVJbmZvKCkgeworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbyA9IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5vYnRhaW4odGhpcyk7CisgICAgICAgIG9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhpbmZvKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb30gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHZpZXcuCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gc2V0czoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRQYXJlbnQoVmlldyl9LDwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRCb3VuZHMoUmVjdCl9LDwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRQYWNrYWdlTmFtZShDaGFyU2VxdWVuY2UpfSw8L2xpPgorICAgICAqICAgPGxpPntAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jc2V0Q2xhc3NOYW1lKENoYXJTZXF1ZW5jZSl9LDwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRDb250ZW50RGVzY3JpcHRpb24oQ2hhclNlcXVlbmNlKX0sPC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3NldEVuYWJsZWQoYm9vbGVhbil9LDwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRDbGlja2FibGUoYm9vbGVhbil9LDwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRGb2N1c2FibGUoYm9vbGVhbil9LDwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRGb2N1c2VkKGJvb2xlYW4pfSw8L2xpPgorICAgICAqICAgPGxpPntAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jc2V0TG9uZ0NsaWNrYWJsZShib29sZWFuKX0sPC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3NldFNlbGVjdGVkKGJvb2xlYW4pfSw8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGNhbGwgdGhlIHN1cGVyIGltcGxlbWVudGF0aW9uLAorICAgICAqIGFuZCBzZXQgYWRkaXRpb25hbCBhdHRyaWJ1dGVzLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gaW5mbyBUaGUgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8pIHsKKyAgICAgICAgUmVjdCBib3VuZHMgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICBnZXREcmF3aW5nUmVjdChib3VuZHMpOworICAgICAgICBpbmZvLnNldEJvdW5kcyhib3VuZHMpOworCisgICAgICAgIFZpZXdQYXJlbnQgcGFyZW50ID0gZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWaWV3KSB7CisgICAgICAgICAgICBWaWV3IHBhcmVudFZpZXcgPSAoVmlldykgcGFyZW50OworICAgICAgICAgICAgaW5mby5zZXRQYXJlbnQocGFyZW50Vmlldyk7CisgICAgICAgIH0KKworICAgICAgICBpbmZvLnNldFBhY2thZ2VOYW1lKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBpbmZvLnNldENsYXNzTmFtZShnZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIGluZm8uc2V0Q29udGVudERlc2NyaXB0aW9uKGdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKKworICAgICAgICBpbmZvLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOworICAgICAgICBpbmZvLnNldENsaWNrYWJsZShpc0NsaWNrYWJsZSgpKTsKKyAgICAgICAgaW5mby5zZXRGb2N1c2FibGUoaXNGb2N1c2FibGUoKSk7CisgICAgICAgIGluZm8uc2V0Rm9jdXNlZChpc0ZvY3VzZWQoKSk7CisgICAgICAgIGluZm8uc2V0U2VsZWN0ZWQoaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgaW5mby5zZXRMb25nQ2xpY2thYmxlKGlzTG9uZ0NsaWNrYWJsZSgpKTsKKworICAgICAgICAvLyBUT0RPOiBUaGVzZSBtYWtlIHNlbnNlIG9ubHkgaWYgd2UgYXJlIGluIGFuIEFkYXB0ZXJWaWV3IGJ1dCBhbGwKKyAgICAgICAgLy8gdmlld3MgY2FuIGJlIHNlbGVjdGVkLiBNYXliZSBmcm9tIGFjY2Vzc2lpYmxpdHkgcGVyc3BlY3RpdmUKKyAgICAgICAgLy8gd2Ugc2hvdWxkIHJlcG9ydCBhcyBzZWxlY3RhYmxlIHZpZXcgaW4gYW4gQWRhcHRlclZpZXcuCisgICAgICAgIGluZm8uYWRkQWN0aW9uKEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fU0VMRUNUKTsKKyAgICAgICAgaW5mby5hZGRBY3Rpb24oQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9DTEVBUl9TRUxFQ1RJT04pOworCisgICAgICAgIGlmIChpc0ZvY3VzYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoaXNGb2N1c2VkKCkpIHsKKyAgICAgICAgICAgICAgICBpbmZvLmFkZEFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMRUFSX0ZPQ1VTKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mby5hZGRBY3Rpb24oQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9GT0NVUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHZpZXcgb24gdGhlIHNjcmVlbiBmb3IgYWNjZXNzaWJpbGl0eSBwdXJwb3Nlcy4KKyAgICAgKiBJZiB0aGlzIHtAbGluayBWaWV3fSBpcyBub3QgYXR0YWNoZWQgdG8gYW55IHdpbmRvdywge0B2YWx1ZSAjTk9fSUR9IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmlldyBhY2Nlc3NpYmlsaXR5IGlkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFjY2Vzc2liaWxpdHlWaWV3SWQoKSB7CisgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eVZpZXdJZCA9PSBOT19JRCkgeworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlWaWV3SWQgPSBzTmV4dEFjY2Vzc2liaWxpdHlWaWV3SWQrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUFjY2Vzc2liaWxpdHlWaWV3SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHdpbmRvdyBpbiB3aGljaCB0aGlzIFZpZXcgcmVzZWlkZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB3aW5kb3cgYWNjZXNzaWJpbGl0eSBpZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBY2Nlc3NpYmlsaXR5V2luZG93SWQoKSB7CisgICAgICAgIHJldHVybiBtQXR0YWNoSW5mbyAhPSBudWxsID8gbUF0dGFjaEluZm8ubUFjY2Vzc2liaWxpdHlXaW5kb3dJZCA6IE5PX0lEOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIHtAbGluayBWaWV3fSBkZXNjcmlwdGlvbi4gSXQgYnJpZWZseSBkZXNjcmliZXMgdGhlIHZpZXcgYW5kIGlzCiAgICAgICogcHJpbWFyaWx5IHVzZWQgZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gZW5hYmxlCiAgICAgICogYmV0dGVyIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCBmb3IgeW91ciBhcHBsaWNhdGlvbi4gVGhpcyBpcyBlc3BlY2lhbGx5CkBAIC00MTMwLDcgKzQyNjUsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdfaG9yaXpvbnRhbERpcmVjdGlvbgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KG1hcHBpbmcgPSB7CisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gImxheW91dCIsIG1hcHBpbmcgPSB7CiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IEhPUklaT05UQUxfRElSRUNUSU9OX0xUUiwgICAgIHRvID0gIkxUUiIpLAogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBIT1JJWk9OVEFMX0RJUkVDVElPTl9SVEwsICAgICB0byA9ICJSVEwiKSwKICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gSE9SSVpPTlRBTF9ESVJFQ1RJT05fSU5IRVJJVCwgdG8gPSAiSU5IRVJJVCIpLApAQCAtNDU1NCw2ICs0Njg5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRmluZHMgdGhlIFZpZXdzIHRoYXQgY29udGFpbiBnaXZlbiB0ZXh0LiBUaGUgY29udGFpbm1lbnQgaXMgY2FzZSBpbnNlbnNpdGl2ZS4KKyAgICAgKiBBcyBWaWV3J3MgdGV4dCBpcyBjb25zaWRlcmVkIGFueSB0ZXh0IGNvbnRlbnQgdGhhdCBWaWV3IHJlbmRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0Vmlld3MgVGhlIG91dHB1dCBsaXN0IG9mIG1hdGNoaW5nIFZpZXdzLgorICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIG1hdGNoIGFnYWluc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmluZFZpZXdzV2l0aFRleHQoQXJyYXlMaXN0PFZpZXc+IG91dFZpZXdzLCBDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgIH0KKworICAgIC8qKgogICAgICAqIEZpbmQgYW5kIHJldHVybiBhbGwgdG91Y2hhYmxlIHZpZXdzIHRoYXQgYXJlIGRlc2NlbmRhbnRzIG9mIHRoaXMgdmlldywKICAgICAgKiBwb3NzaWJseSBpbmNsdWRpbmcgdGhpcyB2aWV3IGlmIGl0IGlzIHRvdWNoYWJsZSBpdHNlbGYuCiAgICAgICoKQEAgLTQ2NjAsOCArNDgwNSw4IEBACiAKICAgICAgICAgLy8gbmVlZCB0byBiZSBmb2N1c2FibGUgaW4gdG91Y2ggbW9kZSBpZiBpbiB0b3VjaCBtb2RlCiAgICAgICAgIGlmIChpc0luVG91Y2hNb2RlKCkgJiYKLSAgICAgICAgICAgICAgICAoRk9DVVNBQkxFX0lOX1RPVUNIX01PREUgIT0gKG1WaWV3RmxhZ3MgJiBGT0NVU0FCTEVfSU5fVE9VQ0hfTU9ERSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAoRk9DVVNBQkxFX0lOX1RPVUNIX01PREUgIT0gKG1WaWV3RmxhZ3MgJiBGT0NVU0FCTEVfSU5fVE9VQ0hfTU9ERSkpKSB7CisgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBuZWVkIHRvIG5vdCBoYXZlIGFueSBwYXJlbnRzIGJsb2NraW5nIHVzCkBAIC04NTEzLDEwICs4NjU4LDE0IEBACiAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5BV0FLRU5fU0NST0xMX0JBUlNfT05fQVRUQUNIOwogICAgICAgICB9CiAgICAgICAgIGp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpOworICAgICAgICByZXNvbHZlSG9yaXpvbnRhbERpcmVjdGlvbigpOworICAgIH0KIAotICAgICAgICAvLyBXZSBhcmUgc3VwcG9zaW5nIGhlcmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdGlvbmFsaXR5IHdpbGwgYmUgcmVzb2x2ZWQgYmVmb3JlIGl0cyBjaGlsZHJlbgotICAgICAgICAvLyBWaWV3IGhvcml6b250YWxEaXJlY3Rpb24gcHVibGljIGF0dHJpYnV0ZSByZXNvbHV0aW9uIHRvIGFuIGludGVybmFsIHZhci4KLSAgICAgICAgLy8gUmVzb2x2aW5nIHRoZSBsYXlvdXQgZGlyZWN0aW9uLiBMVFIgaXMgc2V0IGluaXRpYWxseS4KKyAgICAvKioKKyAgICAgKiBSZXNvbHZpbmcgdGhlIGxheW91dCBkaXJlY3Rpb24uIExUUiBpcyBzZXQgaW5pdGlhbGx5LgorICAgICAqIFdlIGFyZSBzdXBwb3NpbmcgaGVyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0aW9uYWxpdHkgd2lsbCBiZSByZXNvbHZlZCBiZWZvcmUgaXRzIGNoaWxkcmVuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVIb3Jpem9udGFsRGlyZWN0aW9uKCkgewogICAgICAgICBtUHJpdmF0ZUZsYWdzMiAmPSB+UkVTT0xWRURfTEFZT1VUX1JUTDsKICAgICAgICAgc3dpdGNoIChnZXRIb3Jpem9udGFsRGlyZWN0aW9uKCkpIHsKICAgICAgICAgICAgIGNhc2UgSE9SSVpPTlRBTF9ESVJFQ1RJT05fSU5IRVJJVDoKQEAgLTEwMDIyLDYgKzEwMTcxLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGF5b3V0IGlzIHJpZ2h0LXRvLWxlZnQuCiAgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gImxheW91dCIpCiAgICAgcHVibGljIGJvb2xlYW4gaXNMYXlvdXRSdGwoKSB7CiAgICAgICAgIHJldHVybiAobVByaXZhdGVGbGFnczIgJiBSRVNPTFZFRF9MQVlPVVRfUlRMKSA9PSBSRVNPTFZFRF9MQVlPVVRfUlRMOwogICAgIH0KQEAgLTEwMjM4LDYgKzEwMzg4LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSBnaXZlbiBEcmF3YWJsZSBpcyBpbiBSVEwgbGF5b3V0IGRpcmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aG8gdGhlIHJlY2lwaWVudCBvZiB0aGUgYWN0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMYXlvdXRSdGwoRHJhd2FibGUgd2hvKSB7CisgICAgICAgIHJldHVybiAod2hvID09IG1CR0RyYXdhYmxlKSAmJiBpc0xheW91dFJ0bCgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIElmIHlvdXIgdmlldyBzdWJjbGFzcyBpcyBkaXNwbGF5aW5nIGl0cyBvd24gRHJhd2FibGUgb2JqZWN0cywgaXQgc2hvdWxkCiAgICAgICogb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBhbmQgcmV0dXJuIHRydWUgZm9yIGFueSBEcmF3YWJsZSBpdCBpcwpAQCAtMTI2ODgsNiArMTI4NDcsNyBAQAogICAgICAgICAgICAgKTsKIAogICAgICAgICAgICAgcHJpdmF0ZSBJbnZhbGlkYXRlSW5mbyBtTmV4dDsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQb29sZWQ7CiAKICAgICAgICAgICAgIFZpZXcgdGFyZ2V0OwogCkBAIC0xMjcxMSw2ICsxMjg3MSwxNCBAQAogICAgICAgICAgICAgdm9pZCByZWxlYXNlKCkgewogICAgICAgICAgICAgICAgIHNQb29sLnJlbGVhc2UodGhpcyk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUG9vbGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtSXNQb29sZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFBvb2xlZChib29sZWFuIGlzUG9vbGVkKSB7CisgICAgICAgICAgICAgICAgbUlzUG9vbGVkID0gaXNQb29sZWQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBJV2luZG93U2Vzc2lvbiBtU2Vzc2lvbjsKQEAgLTEyOTIxLDYgKzEzMDg5LDExIEBACiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxWaWV3PiBtRm9jdXNhYmxlc1RlbXBMaXN0ID0gbmV3IEFycmF5TGlzdDxWaWV3PigyNCk7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpZCBvZiB0aGUgd2luZG93IGZvciBhY2Nlc3NpYmlsaXR5IHB1cnBvc2VzLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IG1BY2Nlc3NpYmlsaXR5V2luZG93SWQgPSBWaWV3Lk5PX0lEOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IHNldCBvZiBhdHRhY2htZW50IGluZm9ybWF0aW9uIHdpdGggdGhlIHNwZWNpZmllZAogICAgICAgICAgKiBldmVudHMgaGFuZGxlciBhbmQgdGhyZWFkLgogICAgICAgICAgKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3QW5jZXN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0FuY2VzdG9yLmphdmEKaW5kZXggYmQzM2E2YS4uOWFiNGM4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3QW5jZXN0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdBbmNlc3Rvci5qYXZhCkBAIC01MCwxOCArNTAsMjggQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2w7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2xhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Qb29sYWJsZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2xzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXIuQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXI7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LkJhc2VTdXJmYWNlSG9sZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RTZXNzaW9uOwpAQCAtNzEsNiArODEsNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKICAqIFRoZSB0b3Agb2YgYSB2aWV3IGhpZXJhcmNoeSwgaW1wbGVtZW50aW5nIHRoZSBuZWVkZWQgcHJvdG9jb2wgYmV0d2VlbiBWaWV3CkBAIC0yNDgsNiArMjU5LDEyIEBACiAgICAgICovCiAgICAgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7CiAKKyAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7CisKKyAgICBBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db250cm9sbGVyIG1BY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db250cnRvbGxlcjsKKworICAgIEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25NYW5hZ2VyIG1BY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uTWFuYWdlcjsKKwogICAgIHByaXZhdGUgZmluYWwgaW50IG1EZW5zaXR5OwogCiAgICAgLyoqCkBAIC0yODUsNyArMzAyLDcgQEAKICAgICAgICAgLy8gZG9uZSBoZXJlIGluc3RlYWQgb2YgaW4gdGhlIHN0YXRpYyBibG9jayBiZWNhdXNlIFp5Z290ZSBkb2VzIG5vdAogICAgICAgICAvLyBhbGxvdyB0aGUgc3Bhd25pbmcgb2YgdGhyZWFkcy4KICAgICAgICAgZ2V0V2luZG93U2Vzc2lvbihjb250ZXh0LmdldE1haW5Mb29wZXIoKSk7Ci0gICAgICAgIAorCiAgICAgICAgIG1UaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwogICAgICAgICBtTG9jYXRpb24gPSBuZXcgV2luZG93TGVha2VkKG51bGwpOwogICAgICAgICBtTG9jYXRpb24uZmlsbEluU3RhY2tUcmFjZSgpOwpAQCAtMzAyLDYgKzMxOSwxMSBAQAogICAgICAgICBtUHJldmlvdXNUcmFuc3BhcmVudFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKICAgICAgICAgbUZpcnN0ID0gdHJ1ZTsgLy8gdHJ1ZSBmb3IgdGhlIGZpcnN0IHRpbWUgdGhlIHZpZXcgaXMgYWRkZWQKICAgICAgICAgbUFkZGVkID0gZmFsc2U7CisgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICBtQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbk1hbmFnZXIgPQorICAgICAgICAgICAgbmV3IEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5hZGRBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbk1hbmFnZXIpOwogICAgICAgICBtQXR0YWNoSW5mbyA9IG5ldyBWaWV3LkF0dGFjaEluZm8oc1dpbmRvd1Nlc3Npb24sIG1XaW5kb3csIHRoaXMsIHRoaXMpOwogICAgICAgICBtVmlld0NvbmZpZ3VyYXRpb24gPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQoY29udGV4dCk7CiAgICAgICAgIG1EZW5zaXR5ID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CkBAIC00OTAsMTAgKzUxMiwxNCBAQAogICAgICAgICAgICAgICAgICAgICBJbnB1dFF1ZXVlLnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwsIG1JbnB1dEhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyLm15UXVldWUoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgdmlldy5hc3NpZ25QYXJlbnQodGhpcyk7CiAgICAgICAgICAgICAgICAgbUFkZGVkVG91Y2hNb2RlID0gKHJlcyZXaW5kb3dNYW5hZ2VySW1wbC5BRERfRkxBR19JTl9UT1VDSF9NT0RFKSAhPSAwOwogICAgICAgICAgICAgICAgIG1BcHBWaXNpYmxlID0gKHJlcyZXaW5kb3dNYW5hZ2VySW1wbC5BRERfRkxBR19BUFBfVklTSUJMRSkgIT0gMDsKKworICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25NYW5hZ2VyLmVuc3VyZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC03NjUsMTAgKzc5MSwxNyBAQAogICAgICAgICAgICAgZnVsbFJlZHJhd05lZWRlZCA9IHRydWU7CiAgICAgICAgICAgICBtTGF5b3V0UmVxdWVzdGVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgRGlzcGxheU1ldHJpY3MgcGFja2FnZU1ldHJpY3MgPQotICAgICAgICAgICAgICAgIG1WaWV3LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICAgICAgZGVzaXJlZFdpbmRvd1dpZHRoID0gcGFja2FnZU1ldHJpY3Mud2lkdGhQaXhlbHM7Ci0gICAgICAgICAgICBkZXNpcmVkV2luZG93SGVpZ2h0ID0gcGFja2FnZU1ldHJpY3MuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgaWYgKGxwLnR5cGUgPT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMKSB7CisgICAgICAgICAgICAgICAgLy8gTk9URSAtLSBzeXN0ZW0gY29kZSwgd29uJ3QgdHJ5IHRvIGRvIGNvbXBhdCBtb2RlLgorICAgICAgICAgICAgICAgIERpc3BsYXkgZGlzcCA9IFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5nZXREZWZhdWx0RGlzcGxheSgpOworICAgICAgICAgICAgICAgIGRlc2lyZWRXaW5kb3dXaWR0aCA9IGRpc3AuZ2V0UmVhbFdpZHRoKCk7CisgICAgICAgICAgICAgICAgZGVzaXJlZFdpbmRvd0hlaWdodCA9IGRpc3AuZ2V0UmVhbEhlaWdodCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5TWV0cmljcyBwYWNrYWdlTWV0cmljcyA9CisgICAgICAgICAgICAgICAgICAgIG1WaWV3LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgICAgIGRlc2lyZWRXaW5kb3dXaWR0aCA9IHBhY2thZ2VNZXRyaWNzLndpZHRoUGl4ZWxzOworICAgICAgICAgICAgICAgIGRlc2lyZWRXaW5kb3dIZWlnaHQgPSBwYWNrYWdlTWV0cmljcy5oZWlnaHRQaXhlbHM7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEZvciB0aGUgdmVyeSBmaXJzdCB0aW1lLCB0ZWxsIHRoZSB2aWV3IGhpZXJhcmNoeSB0aGF0IGl0CiAgICAgICAgICAgICAvLyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93LiAgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHN1cmZhY2UKQEAgLTkxMiw5ICs5NDUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxwLmhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewogICAgICAgICAgICAgICAgICAgICB3aW5kb3dTaXplTWF5Q2hhbmdlID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TWV0cmljcyBwYWNrYWdlTWV0cmljcyA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICAgICAgICAgICAgICBkZXNpcmVkV2luZG93V2lkdGggPSBwYWNrYWdlTWV0cmljcy53aWR0aFBpeGVsczsKLSAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFdpbmRvd0hlaWdodCA9IHBhY2thZ2VNZXRyaWNzLmhlaWdodFBpeGVsczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxwLnR5cGUgPT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFIC0tIHN5c3RlbSBjb2RlLCB3b24ndCB0cnkgdG8gZG8gY29tcGF0IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGRpc3AgPSBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdERpc3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRXaW5kb3dXaWR0aCA9IGRpc3AuZ2V0UmVhbFdpZHRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkV2luZG93SGVpZ2h0ID0gZGlzcC5nZXRSZWFsSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TWV0cmljcyBwYWNrYWdlTWV0cmljcyA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFdpbmRvd1dpZHRoID0gcGFja2FnZU1ldHJpY3Mud2lkdGhQaXhlbHM7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkV2luZG93SGVpZ2h0ID0gcGFja2FnZU1ldHJpY3MuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xOTkwLDYgKzIwMzAsMTAgQEAKICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCk7CiAgICAgICAgIH0KIAorICAgICAgICBtQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbk1hbmFnZXIuZW5zdXJlTm9Db25uZWN0aW9uKCk7CisgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5yZW1vdmVBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbk1hbmFnZXIpOworCiAgICAgICAgIG1WaWV3ID0gbnVsbDsKICAgICAgICAgbUF0dGFjaEluZm8ubVJvb3RWaWV3ID0gbnVsbDsKICAgICAgICAgbUF0dGFjaEluZm8ubVN1cmZhY2UgPSBudWxsOwpAQCAtMjAwNiw3ICsyMDUwLDYgQEAKICAgICAgICAgICAgICAgICBJbnB1dFF1ZXVlLnVucmVnaXN0ZXJJbnB1dENoYW5uZWwobUlucHV0Q2hhbm5lbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzV2luZG93U2Vzc2lvbi5yZW1vdmUobVdpbmRvdyk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC0yMDg0LDYgKzIxMjcsMTAgQEAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVNQQVRDSF9EUkFHX0xPQ0FUSU9OX0VWRU5UID0gMTAxNjsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVNQQVRDSF9TWVNURU1fVUlfVklTSUJJTElUWSA9IDEwMTc7CiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRElTUEFUQ0hfR0VORVJJQ19NT1RJT04gPSAxMDE4OworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERPX1BFUkZPUk1fQUNDRVNTSUJJTElUWV9BQ1RJT04gPSAxMDE5OworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERPX0ZJTkRfQUNDRVNTSUJMSVRZX05PREVfSU5GT19CWV9BQ0NFU1NJQklMSVRZX0lEID0gMTAyMDsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBET19GSU5EX0FDQ0VTU0lCTElUWV9OT0RFX0lORk9fQllfVklFV19JRCA9IDEwMjE7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRE9fRklORF9BQ0NFU1NJQkxJVFlfTk9ERV9JTkZPX0JZX1ZJRVdfVEVYVCA9IDEwMjI7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CkBAIC0yMjg0LDkgKzIzMzEsMjUgQEAKICAgICAgICAgY2FzZSBESVNQQVRDSF9TWVNURU1fVUlfVklTSUJJTElUWTogewogICAgICAgICAgICAgaGFuZGxlRGlzcGF0Y2hTeXN0ZW1VaVZpc2liaWxpdHlDaGFuZ2VkKG1zZy5hcmcxKTsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBET19GSU5EX0FDQ0VTU0lCTElUWV9OT0RFX0lORk9fQllfQUNDRVNTSUJJTElUWV9JRDogeworICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeUFjY2Vzc2liaWxpdHlJZFVpVGhyZWFkKG1zZyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRE9fUEVSRk9STV9BQ0NFU1NJQklMSVRZX0FDVElPTjogeworICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgLnBlcmZyb21BY2Nlc3NpYmlsaXR5QWN0aW9uVWlUaHJlYWQobXNnKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBET19GSU5EX0FDQ0VTU0lCTElUWV9OT0RFX0lORk9fQllfVklFV19JRDogeworICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZFVpVGhyZWFkKG1zZyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRE9fRklORF9BQ0NFU1NJQkxJVFlfTk9ERV9JTkZPX0JZX1ZJRVdfVEVYVDogeworICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3VGV4dFVpVGhyZWFkKG1zZyk7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHZvaWQgc3RhcnRJbnB1dEV2ZW50KElucHV0UXVldWUuRmluaXNoZWRDYWxsYmFjayBmaW5pc2hlZENhbGxiYWNrKSB7CiAgICAgICAgIGlmIChtRmluaXNoZWRDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICBTbG9nLncoVEFHLCAiUmVjZWl2ZWQgYSBuZXcgaW5wdXQgZXZlbnQgZnJvbSB0aGUgaW5wdXQgcXVldWUgYnV0IHRoZXJlIGlzICIKQEAgLTMyMDYsNiArMzI2OSwxNyBAQAogICAgICAgICByZXR1cm4gbUF1ZGlvTWFuYWdlcjsKICAgICB9CiAKKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlciBnZXRBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db250cm9sbGVyKCkgeworICAgICAgICBpZiAobVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlciIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIG1WaWV3Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db250cnRvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJ0b2xsZXIgPSBuZXcgQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJ0b2xsZXI7CisgICAgfQorCiAgICAgcHJpdmF0ZSBpbnQgcmVsYXlvdXRXaW5kb3coV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgcGFyYW1zLCBpbnQgdmlld1Zpc2liaWxpdHksCiAgICAgICAgICAgICBib29sZWFuIGluc2V0c1BlbmRpbmcpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogCkBAIC0zNTAzLDcgKzM1NzcsNyBAQAogICAgICAqIHNlbmQgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gdG8gYW5ub3VuY2UgdGhhdC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc2VuZEFjY2Vzc2liaWxpdHlFdmVudHMoKSB7Ci0gICAgICAgIGlmICghQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UobVZpZXcuZ2V0Q29udGV4dCgpKS5pc0VuYWJsZWQoKSkgeworICAgICAgICBpZiAoIW1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG1WaWV3LnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XX1NUQVRFX0NIQU5HRUQpOwpAQCAtMzUzMSw3ICszNjA1LDcgQEAKICAgICAgICAgaWYgKG1WaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShjaGlsZC5tQ29udGV4dCkuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7CisgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC0zNTk0LDE4ICszNjY4LDE4IEBACiAgICAgc3RhdGljIGNsYXNzIElucHV0TWV0aG9kQ2FsbGJhY2sgZXh0ZW5kcyBJSW5wdXRNZXRob2RDYWxsYmFjay5TdHViIHsKICAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFZpZXdBbmNlc3Rvcj4gbVZpZXdBbmNlc3RvcjsKIAotICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RDYWxsYmFjayhWaWV3QW5jZXN0b3Igdmlld1Jvb3QpIHsKLSAgICAgICAgICAgIG1WaWV3QW5jZXN0b3IgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3QW5jZXN0b3I+KHZpZXdSb290KTsKKyAgICAgICAgcHVibGljIElucHV0TWV0aG9kQ2FsbGJhY2soVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvcikgeworICAgICAgICAgICAgbVZpZXdBbmNlc3RvciA9IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXdBbmNlc3Rvcj4odmlld0FuY2VzdG9yKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaGVkRXZlbnQoaW50IHNlcSwgYm9vbGVhbiBoYW5kbGVkKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld1Jvb3QgPSBtVmlld0FuY2VzdG9yLmdldCgpOwotICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaEZpbmlzaGVkRXZlbnQoc2VxLCBoYW5kbGVkKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IgPSBtVmlld0FuY2VzdG9yLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXdBbmNlc3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlld0FuY2VzdG9yLmRpc3BhdGNoRmluaXNoZWRFdmVudChzZXEsIGhhbmRsZWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2Vzc2lvbkNyZWF0ZWQoSUlucHV0TWV0aG9kU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2Vzc2lvbkNyZWF0ZWQoSUlucHV0TWV0aG9kU2Vzc2lvbiBzZXNzaW9uKSB7CiAgICAgICAgICAgICAvLyBTdHViIC0tIG5vdCBmb3IgdXNlIGluIHRoZSBjbGllbnQuCiAgICAgICAgIH0KICAgICB9CkBAIC0zNjEzLDM2ICszNjg3LDM3IEBACiAgICAgc3RhdGljIGNsYXNzIFcgZXh0ZW5kcyBJV2luZG93LlN0dWIgewogICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Vmlld0FuY2VzdG9yPiBtVmlld0FuY2VzdG9yOwogCi0gICAgICAgIFcoVmlld0FuY2VzdG9yIHZpZXdSb290KSB7Ci0gICAgICAgICAgICBtVmlld0FuY2VzdG9yID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlld0FuY2VzdG9yPih2aWV3Um9vdCk7CisgICAgICAgIFcoVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvcikgeworICAgICAgICAgICAgbVZpZXdBbmNlc3RvciA9IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXdBbmNlc3Rvcj4odmlld0FuY2VzdG9yKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2l6ZWQoaW50IHcsIGludCBoLCBSZWN0IGNvdmVyZWRJbnNldHMsIFJlY3QgdmlzaWJsZUluc2V0cywKICAgICAgICAgICAgICAgICBib29sZWFuIHJlcG9ydERyYXcsIENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld1Jvb3QgPSBtVmlld0FuY2VzdG9yLmdldCgpOwotICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaFJlc2l6ZWQodywgaCwgY292ZXJlZEluc2V0cywgdmlzaWJsZUluc2V0cywgcmVwb3J0RHJhdywgbmV3Q29uZmlnKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IgPSBtVmlld0FuY2VzdG9yLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXdBbmNlc3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlld0FuY2VzdG9yLmRpc3BhdGNoUmVzaXplZCh3LCBoLCBjb3ZlcmVkSW5zZXRzLCB2aXNpYmxlSW5zZXRzLCByZXBvcnREcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQXBwVmlzaWJpbGl0eShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3Um9vdCA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZpZXdSb290LmRpc3BhdGNoQXBwVmlzaWJpbGl0eSh2aXNpYmxlKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IgPSBtVmlld0FuY2VzdG9yLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXdBbmNlc3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlld0FuY2VzdG9yLmRpc3BhdGNoQXBwVmlzaWJpbGl0eSh2aXNpYmxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoR2V0TmV3U3VyZmFjZSgpIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3Um9vdCA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZpZXdSb290LmRpc3BhdGNoR2V0TmV3U3VyZmFjZSgpOworICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvciA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlld0FuY2VzdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aWV3QW5jZXN0b3IuZGlzcGF0Y2hHZXROZXdTdXJmYWNlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNGb2N1cywgYm9vbGVhbiBpblRvdWNoTW9kZSkgewotICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdSb290ID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3Qud2luZG93Rm9jdXNDaGFuZ2VkKGhhc0ZvY3VzLCBpblRvdWNoTW9kZSk7CisgICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld0FuY2VzdG9yID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3QW5jZXN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdBbmNlc3Rvci53aW5kb3dGb2N1c0NoYW5nZWQoaGFzRm9jdXMsIGluVG91Y2hNb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zNjYwLDkgKzM3MzUsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXJhbWV0ZXJzLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBvdXQpIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3Um9vdCA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IHZpZXdSb290Lm1WaWV3OworICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvciA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlld0FuY2VzdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSB2aWV3QW5jZXN0b3IubVZpZXc7CiAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApICE9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CkBAIC0zNjkxLDkgKzM3NjYsOSBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZVN5c3RlbURpYWxvZ3MoU3RyaW5nIHJlYXNvbikgewotICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdSb290ID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hDbG9zZVN5c3RlbURpYWxvZ3MocmVhc29uKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IgPSBtVmlld0FuY2VzdG9yLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXdBbmNlc3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlld0FuY2VzdG9yLmRpc3BhdGNoQ2xvc2VTeXN0ZW1EaWFsb2dzKHJlYXNvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCkBAIC0zNzA2LDcgKzM3ODEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFdhbGxwYXBlckNvbW1hbmQoU3RyaW5nIGFjdGlvbiwgaW50IHgsIGludCB5LAogICAgICAgICAgICAgICAgIGludCB6LCBCdW5kbGUgZXh0cmFzLCBib29sZWFuIHN5bmMpIHsKICAgICAgICAgICAgIGlmIChzeW5jKSB7CkBAIC0zNzE5LDE3ICszNzk0LDE2IEBACiAKICAgICAgICAgLyogRHJhZy9kcm9wICovCiAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRHJhZ0V2ZW50KERyYWdFdmVudCBldmVudCkgewotICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdSb290ID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvciA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlld0FuY2VzdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aWV3QW5jZXN0b3IuZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU3lzdGVtVWlWaXNpYmlsaXR5Q2hhbmdlZChpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdSb290ID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hTeXN0ZW1VaVZpc2liaWxpdHlDaGFuZ2VkKHZpc2liaWxpdHkpOworICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvciA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlld0FuY2VzdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aWV3QW5jZXN0b3IuZGlzcGF0Y2hTeXN0ZW1VaVZpc2liaWxpdHlDaGFuZ2VkKHZpc2liaWxpdHkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDAzOSw1ICs0MTEzLDM5NSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ2xhc3MgZm9yIG1hbmFnaW5nIHRoZSBhY2Nlc3NpYmlsaXR5IGludGVyYWN0aW9uIGNvbm5lY3Rpb24KKyAgICAgKiBiYXNlZCBvbiB0aGUgZ2xvYmFsIGFjY2Vzc2liaWxpdHkgc3RhdGUuCisgICAgICovCisgICAgZmluYWwgY2xhc3MgQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbk1hbmFnZXIKKyAgICAgICAgICAgIGltcGxlbWVudHMgQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGVuc3VyZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW5zdXJlTm9Db25uZWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbnN1cmVDb25uZWN0aW9uKCkgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWdpc3RlcmVkID0gbUF0dGFjaEluZm8ubUFjY2Vzc2liaWxpdHlXaW5kb3dJZCAhPSBWaWV3Lk5PX0lEOworICAgICAgICAgICAgaWYgKCFyZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUFjY2Vzc2liaWxpdHlXaW5kb3dJZCA9CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5hZGRBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uKG1XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24oVmlld0FuY2VzdG9yLnRoaXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuc3VyZU5vQ29ubmVjdGlvbigpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVnaXN0ZXJlZCA9IG1BdHRhY2hJbmZvLm1BY2Nlc3NpYmlsaXR5V2luZG93SWQgIT0gVmlldy5OT19JRDsKKyAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUFjY2Vzc2liaWxpdHlXaW5kb3dJZCA9IFZpZXcuTk9fSUQ7CisgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLnJlbW92ZUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24obVdpbmRvdyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIGFuIGludGVyZmFjZSB0aGlzIFZpZXdBbmNlc3RvciBwcm92aWRlcyB0byB0aGUKKyAgICAgKiBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UgdG8gdGhlIGxhdHRlciBjYW4gaW50ZXJhY3Qgd2l0aAorICAgICAqIHRoZSB2aWV3IGhpZXJhcmNoeSBpbiB0aGlzIFZpZXdBbmNlc3Rvci4KKyAgICAgKi8KKyAgICBmaW5hbCBjbGFzcyBBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uCisgICAgICAgICAgICBleHRlbmRzIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uLlN0dWIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Vmlld0FuY2VzdG9yPiBtVmlld0FuY2VzdG9yOworCisgICAgICAgIEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24oVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvcikgeworICAgICAgICAgICAgbVZpZXdBbmNlc3RvciA9IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXdBbmNlc3Rvcj4odmlld0FuY2VzdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeUFjY2Vzc2liaWxpdHlJZChpbnQgYWNjZXNzaWJpbGl0eUlkLAorICAgICAgICAgICAgICAgIGludCBpbnRlcmFjdGlvbklkLCBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld0FuY2VzdG9yID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3QW5jZXN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRyb2xsZXIoKQorICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlBY2Nlc3NpYmlsaXR5SWRDbGllbnRUaHJlYWQoYWNjZXNzaWJpbGl0eUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb25JZCwgY2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb24oaW50IGFjY2Vzc2liaWxpdHlJZCwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICBpbnQgaW50ZXJhY3Rpb25JZCwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvciA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlld0FuY2VzdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXRBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db250cm9sbGVyKCkKKyAgICAgICAgICAgICAgICAucGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25DbGllbnRUaHJlYWQoYWNjZXNzaWJpbGl0eUlkLCBhY3Rpb24sIGludGVyYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWQoaW50IHZpZXdJZCwKKyAgICAgICAgICAgICAgICBpbnQgaW50ZXJhY3Rpb25JZCwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvciA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlld0FuY2VzdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXRBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db250cm9sbGVyKCkKKyAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkQ2xpZW50VGhyZWFkKHZpZXdJZCwgaW50ZXJhY3Rpb25JZCwgY2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdUZXh0KFN0cmluZyB0ZXh0LCBpbnQgaW50ZXJhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld0FuY2VzdG9yID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3QW5jZXN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRyb2xsZXIoKQorICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld1RleHRDbGllbnRUaHJlYWQodGV4dCwgaW50ZXJhY3Rpb25JZCwgY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgZm9yIG1hbmFnaW5nIGFjY2Vzc2liaWxpdHkgaW50ZXJhY3Rpb25zIGluaXRpYXRlZCBmcm9tIHRoZSBzeXN0ZW0KKyAgICAgKiBhbmQgdGFyZ2V0aW5nIHRoZSB2aWV3IGhpZXJhcmNoeS4gQSAqQ2xpZW50VGhyZWFkIG1ldGhvZCBpcyB0byBiZQorICAgICAqIGNhbGxlZCBmcm9tIHRoZSBpbnRlcmFjdGlvbiBjb25uZWN0aW9uIHRoaXMgVmlld0FuY2VzdG9yIGdpdmVzIHRoZQorICAgICAqIHN5c3RlbSB0byB0YWxrIHRvIGl0IGFuZCBhIGNvcnJlc3BvbmRpbmcgKlVpVGhyZWFkIG1ldGhvZCB0aGF0IGlzIGV4ZWN1dGVkCisgICAgICogb24gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBmaW5hbCBjbGFzcyBBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db250cm9sbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPT0xfU0laRSA9IDU7CisKKyAgICAgICAgcHJpdmF0ZSBGaW5kQnlBY2Nlc3NpYmlsaXR5dElkUHJlZGljYXRlIG1GaW5kQnlBY2Nlc3NpYmlsaXR5SWRQcmVkaWNhdGUgPQorICAgICAgICAgICAgbmV3IEZpbmRCeUFjY2Vzc2liaWxpdHl0SWRQcmVkaWNhdGUoKTsKKworICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IG1UZW1wQWNjZXNzaWJpbGl0eU5vZGVJbmZvTGlzdCA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4oKTsKKworICAgICAgICAvLyBSZXVzYWJsZSBwb29sYWJsZSBhcmd1bWVudHMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIHZpZXcgaGllcmFyY2h5CisgICAgICAgIC8vIHRvIGZpdCBtb3JlIGFyZ3VtZW50cyB0aGFuIE1lc3NhZ2UgYW5kIHRvIGF2b2lkIHNoYXJpbmcgb2JqZWN0cyBiZXR3ZWVuCisgICAgICAgIC8vIHR3byBtZXNzYWdlcyBzaW5jZSBzZXZlcmFsIHRocmVhZHMgY2FuIHNlbmQgbWVzc2FnZXMgY29uY3VycmVudGx5LgorICAgICAgICBwcml2YXRlIGZpbmFsIFBvb2w8U29tZUFyZ3M+IG1Qb29sID0gUG9vbHMuc3luY2hyb25pemVkUG9vbChQb29scy5maW5pdGVQb29sKAorICAgICAgICAgICAgICAgIG5ldyBQb29sYWJsZU1hbmFnZXI8U29tZUFyZ3M+KCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU29tZUFyZ3MgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNvbWVBcmdzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFjcXVpcmVkKFNvbWVBcmdzIGluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZWQoU29tZUFyZ3MgaW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgUE9PTF9TSVpFKQorICAgICAgICApOworCisgICAgICAgIHB1YmxpYyBjbGFzcyBTb21lQXJncyBpbXBsZW1lbnRzIFBvb2xhYmxlPFNvbWVBcmdzPiB7CisgICAgICAgICAgICBwcml2YXRlIFNvbWVBcmdzIG1OZXh0OworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Bvb2xlZDsKKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBhcmcxOworICAgICAgICAgICAgcHVibGljIE9iamVjdCBhcmcyOworICAgICAgICAgICAgcHVibGljIGludCBhcmdpMTsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgYXJnaTI7CisgICAgICAgICAgICBwdWJsaWMgaW50IGFyZ2kzOworCisgICAgICAgICAgICBwdWJsaWMgU29tZUFyZ3MgZ2V0TmV4dFBvb2xhYmxlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtTmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQb29sZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Jc1Bvb2xlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dFBvb2xhYmxlKFNvbWVBcmdzIGFyZ3MpIHsKKyAgICAgICAgICAgICAgICBtTmV4dCA9IGFyZ3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFBvb2xlZChib29sZWFuIGlzUG9vbGVkKSB7CisgICAgICAgICAgICAgICAgbUlzUG9vbGVkID0gaXNQb29sZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgICAgICBhcmcxID0gbnVsbDsKKyAgICAgICAgICAgICAgICBhcmcyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBhcmdpMSA9IDA7CisgICAgICAgICAgICAgICAgYXJnaTIgPSAwOworICAgICAgICAgICAgICAgIGFyZ2kzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeUFjY2Vzc2liaWxpdHlJZENsaWVudFRocmVhZChpbnQgYWNjZXNzaWJpbGl0eUlkLAorICAgICAgICAgICAgICAgIGludCBpbnRlcmFjdGlvbklkLCBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlLm9idGFpbigpOworICAgICAgICAgICAgbWVzc2FnZS53aGF0ID0gRE9fRklORF9BQ0NFU1NJQkxJVFlfTk9ERV9JTkZPX0JZX0FDQ0VTU0lCSUxJVFlfSUQ7CisgICAgICAgICAgICBtZXNzYWdlLmFyZzEgPSBhY2Nlc3NpYmlsaXR5SWQ7CisgICAgICAgICAgICBtZXNzYWdlLmFyZzIgPSBpbnRlcmFjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS5vYmogPSBjYWxsYmFjazsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkVWlUaHJlYWQoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWNjZXNzaWJpbGl0eUlkID0gbWVzc2FnZS5hcmcxOworICAgICAgICAgICAgZmluYWwgaW50IGludGVyYWN0aW9uSWQgPSBtZXNzYWdlLmFyZzI7CisgICAgICAgICAgICBmaW5hbCBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAoSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjaykgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgIFZpZXcgcm9vdCA9IFZpZXdBbmNlc3Rvci50aGlzLm1WaWV3OworICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmluZEJ5QWNjZXNzaWJpbGl0eXRJZFByZWRpY2F0ZSBwcmVkaWNhdGUgPSBtRmluZEJ5QWNjZXNzaWJpbGl0eUlkUHJlZGljYXRlOworICAgICAgICAgICAgcHJlZGljYXRlLmluaXQoYWNjZXNzaWJpbGl0eUlkKTsKKworICAgICAgICAgICAgVmlldyB0YXJnZXQgPSByb290LmZpbmRWaWV3QnlQcmVkaWNhdGUocHJlZGljYXRlKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvID0gdGFyZ2V0LmNyZWF0ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnNldEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9SZXN1bHQoaW5mbywgaW50ZXJhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAtIHRoZSBvdGhlciBzaWRlIHdpbGwgdGltZSBvdXQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWRDbGllbnRUaHJlYWQoaW50IHZpZXdJZCwgaW50IGludGVyYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIG1lc3NhZ2Uud2hhdCA9IERPX0ZJTkRfQUNDRVNTSUJMSVRZX05PREVfSU5GT19CWV9WSUVXX0lEOworICAgICAgICAgICAgbWVzc2FnZS5hcmcxID0gdmlld0lkOworICAgICAgICAgICAgbWVzc2FnZS5hcmcyID0gaW50ZXJhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2Uub2JqID0gY2FsbGJhY2s7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZFVpVGhyZWFkKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgZmluYWwgaW50IHZpZXdJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgIGZpbmFsIGludCBpbnRlcmFjdGlvbklkID0gbWVzc2FnZS5hcmcyOworICAgICAgICAgICAgZmluYWwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgKElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2spIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICBWaWV3IHJvb3QgPSBWaWV3QW5jZXN0b3IudGhpcy5tVmlldzsKKyAgICAgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBWaWV3IHRhcmdldCA9IHJvb3QuZmluZFZpZXdCeUlkKHZpZXdJZCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbyA9IHRhcmdldC5jcmVhdGVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5zZXRGaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvUmVzdWx0KGluZm8sIGludGVyYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgLSB0aGUgb3RoZXIgc2lkZSB3aWxsIHRpbWUgb3V0ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdUZXh0Q2xpZW50VGhyZWFkKFN0cmluZyB0ZXh0LCBpbnQgaW50ZXJhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlLm9idGFpbigpOworICAgICAgICAgICAgbWVzc2FnZS53aGF0ID0gRE9fRklORF9BQ0NFU1NJQkxJVFlfTk9ERV9JTkZPX0JZX1ZJRVdfVEVYVDsKKyAgICAgICAgICAgIFNvbWVBcmdzIGFyZ3MgPSBtUG9vbC5hY3F1aXJlKCk7CisgICAgICAgICAgICBhcmdzLmFyZzEgPSB0ZXh0OworICAgICAgICAgICAgYXJncy5hcmdpMSA9IGludGVyYWN0aW9uSWQ7CisgICAgICAgICAgICBhcmdzLmFyZzIgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIG1lc3NhZ2Uub2JqID0gYXJnczsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdUZXh0VWlUaHJlYWQoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gKFNvbWVBcmdzKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gKFN0cmluZykgYXJncy5hcmcxOworICAgICAgICAgICAgZmluYWwgaW50IGludGVyYWN0aW9uSWQgPSBhcmdzLmFyZ2kxOworICAgICAgICAgICAgZmluYWwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgKElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2spIGFyZ3MuYXJnMjsKKyAgICAgICAgICAgIG1Qb29sLnJlbGVhc2UoYXJncyk7CisKKyAgICAgICAgICAgIFZpZXcgcm9vdCA9IFZpZXdBbmNlc3Rvci50aGlzLm1WaWV3OworICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXJyYXlMaXN0PFZpZXc+IGZvdW5kVmlld3MgPSBtQXR0YWNoSW5mby5tRm9jdXNhYmxlc1RlbXBMaXN0OworICAgICAgICAgICAgZm91bmRWaWV3cy5jbGVhcigpOworCisgICAgICAgICAgICByb290LmZpbmRWaWV3c1dpdGhUZXh0KGZvdW5kVmlld3MsIHRleHQpOworICAgICAgICAgICAgaWYgKGZvdW5kVmlld3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4gaW5mb3MgPSBtVGVtcEFjY2Vzc2liaWxpdHlOb2RlSW5mb0xpc3Q7CisgICAgICAgICAgICBpbmZvcy5jbGVhcigpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgdmlld0NvdW50ID0gZm91bmRWaWV3cy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZpZXdDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgVmlldyBmb3VuZFZpZXcgPSBmb3VuZFZpZXdzLmdldChpKTsKKyAgICAgICAgICAgICAgICBpbmZvcy5hZGQoZm91bmRWaWV3LmNyZWF0ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5zZXRGaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc1Jlc3VsdChpbmZvcywgaW50ZXJhY3Rpb25JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgLSB0aGUgb3RoZXIgc2lkZSB3aWxsIHRpbWUgb3V0ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbkNsaWVudFRocmVhZChpbnQgYWNjZXNzaWJpbGl0eUlkLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgIGludCBpbnRlcmFjdGlvbklkLCBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlLm9idGFpbigpOworICAgICAgICAgICAgbWVzc2FnZS53aGF0ID0gRE9fUEVSRk9STV9BQ0NFU1NJQklMSVRZX0FDVElPTjsKKyAgICAgICAgICAgIFNvbWVBcmdzIGFyZ3MgPSBtUG9vbC5hY3F1aXJlKCk7CisgICAgICAgICAgICBhcmdzLmFyZ2kxID0gYWNjZXNzaWJpbGl0eUlkOworICAgICAgICAgICAgYXJncy5hcmdpMiA9IGFjdGlvbjsKKyAgICAgICAgICAgIGFyZ3MuYXJnaTMgPSBpbnRlcmFjdGlvbklkOworICAgICAgICAgICAgYXJncy5hcmcxID0gY2FsbGJhY2s7CisgICAgICAgICAgICBtZXNzYWdlLm9iaiA9IGFyZ3M7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBlcmZyb21BY2Nlc3NpYmlsaXR5QWN0aW9uVWlUaHJlYWQoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gKFNvbWVBcmdzKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY2Nlc3NpYmlsaXR5SWQgPSBhcmdzLmFyZ2kxOworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGFyZ3MuYXJnaTI7CisgICAgICAgICAgICBmaW5hbCBpbnQgaW50ZXJhY3Rpb25JZCA9IGFyZ3MuYXJnaTM7CisgICAgICAgICAgICBmaW5hbCBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAoSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjaykgYXJncy5hcmcxOworICAgICAgICAgICAgbVBvb2wucmVsZWFzZShhcmdzKTsKKworICAgICAgICAgICAgaWYgKFZpZXdBbmNlc3Rvci50aGlzLm1WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VlZGVkID0gZmFsc2U7CisgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9GT0NVUzogeworICAgICAgICAgICAgICAgICAgICBzdWNjZWVkZWQgPSBwZXJmb3JtQWN0aW9uRm9jdXMoYWNjZXNzaWJpbGl0eUlkKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9DTEVBUl9GT0NVUzogeworICAgICAgICAgICAgICAgICAgICBzdWNjZWVkZWQgPSBwZXJmb3JtQWN0aW9uQ2xlYXJGb2N1cyhhY2Nlc3NpYmlsaXR5SWQpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX1NFTEVDVDogeworICAgICAgICAgICAgICAgICAgICBzdWNjZWVkZWQgPSBwZXJmb3JtQWN0aW9uU2VsZWN0KGFjY2Vzc2liaWxpdHlJZCk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQ0xFQVJfU0VMRUNUSU9OOiB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRlZCA9IHBlcmZvcm1BY3Rpb25DbGVhclNlbGVjdGlvbihhY2Nlc3NpYmlsaXR5SWQpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0UGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25SZXN1bHQoc3VjY2VlZGVkLCBpbnRlcmFjdGlvbklkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAtIHRoZSBvdGhlciBzaWRlIHdpbGwgdGltZSBvdXQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwZXJmb3JtQWN0aW9uRm9jdXMoaW50IGFjY2Vzc2liaWxpdHlJZCkgeworICAgICAgICAgICAgVmlldyB0YXJnZXQgPSBmaW5kVmlld0J5QWNjZXNzaWJpbGl0eUlkKGFjY2Vzc2liaWxpdHlJZCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBHZXQgb3V0IG9mIHRvdWNoIG1vZGUgc2luY2UgYWNjZXNzaWJpbGl0eSB3YW50cyB0byBtb3ZlIGZvY3VzIGFyb3VuZC4KKyAgICAgICAgICAgIGVuc3VyZVRvdWNoTW9kZShmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LnJlcXVlc3RGb2N1cygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1BY3Rpb25DbGVhckZvY3VzKGludCBhY2Nlc3NpYmlsaXR5SWQpIHsKKyAgICAgICAgICAgIFZpZXcgdGFyZ2V0ID0gZmluZFZpZXdCeUFjY2Vzc2liaWxpdHlJZChhY2Nlc3NpYmlsaXR5SWQpOworICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNGb2N1c2VkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YXJnZXQuY2xlYXJGb2N1cygpOworICAgICAgICAgICAgcmV0dXJuICF0YXJnZXQuaXNGb2N1c2VkKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUFjdGlvblNlbGVjdChpbnQgYWNjZXNzaWJpbGl0eUlkKSB7CisgICAgICAgICAgICBWaWV3IHRhcmdldCA9IGZpbmRWaWV3QnlBY2Nlc3NpYmlsaXR5SWQoYWNjZXNzaWJpbGl0eUlkKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0YXJnZXQuaXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0LnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5pc1NlbGVjdGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUFjdGlvbkNsZWFyU2VsZWN0aW9uKGludCBhY2Nlc3NpYmlsaXR5SWQpIHsKKyAgICAgICAgICAgIFZpZXcgdGFyZ2V0ID0gZmluZFZpZXdCeUFjY2Vzc2liaWxpdHlJZChhY2Nlc3NpYmlsaXR5SWQpOworICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0LnNldFNlbGVjdGVkKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiAhdGFyZ2V0LmlzU2VsZWN0ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgVmlldyBmaW5kVmlld0J5QWNjZXNzaWJpbGl0eUlkKGludCBhY2Nlc3NpYmlsaXR5SWQpIHsKKyAgICAgICAgICAgIFZpZXcgcm9vdCA9IFZpZXdBbmNlc3Rvci50aGlzLm1WaWV3OworICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZpbmRCeUFjY2Vzc2liaWxpdHlJZFByZWRpY2F0ZS5pbml0KGFjY2Vzc2liaWxpdHlJZCk7CisgICAgICAgICAgICByZXR1cm4gcm9vdC5maW5kVmlld0J5UHJlZGljYXRlKG1GaW5kQnlBY2Nlc3NpYmlsaXR5SWRQcmVkaWNhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBGaW5kQnlBY2Nlc3NpYmlsaXR5dElkUHJlZGljYXRlIGltcGxlbWVudHMgUHJlZGljYXRlPFZpZXc+IHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbVNlcmNoZWRJZDsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgaW5pdChpbnQgc2VhcmNoZWRJZCkgeworICAgICAgICAgICAgICAgIG1TZXJjaGVkSWQgPSBzZWFyY2hlZElkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHZpZXcuZ2V0QWNjZXNzaWJpbGl0eVZpZXdJZCgpID09IG1TZXJjaGVkSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2hvd0ZQUyhDYW52YXMgY2FudmFzLCBpbnQgZHVyYXRpb25NaWxsaXMpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKaW5kZXggZjUwNGI5MC4uNTdlZThhMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CkBAIC03NzIsNiArNzczLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5kVmlld3NXaXRoVGV4dChBcnJheUxpc3Q8Vmlldz4gb3V0Vmlld3MsIENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CisgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoY2hpbGQubVZpZXdGbGFncyAmIFZJU0lCSUxJVFlfTUFTSykgPT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgIGNoaWxkLmZpbmRWaWV3c1dpdGhUZXh0KG91dFZpZXdzLCB0ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KQEAgLTIwMDcsNiArMjAyMCwxNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Jbml0aWFsaXplQWNjZXNzaWJpbGl0eU5vZGVJbmZvKEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvKSB7CisgICAgICAgIHN1cGVyLm9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhpbmZvKTsKKworICAgICAgICBmb3IgKGludCBpID0gMCwgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBtQ2hpbGRyZW5baV07CisgICAgICAgICAgICBpbmZvLmFkZENoaWxkKGNoaWxkKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKaW5kZXggOTM5NWQ1Yy4uYjAxODFiYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTc3LDggKzc3LDggQEAKICAgICAgICAgICAgIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBYIHBvc2l0aW9uIGZvciB0aGlzIHdpbmRvdy4gIFdpdGggdGhlIGRlZmF1bHQgZ3Jhdml0eSBpdCBpcyBpZ25vcmVkLgotICAgICAgICAgKiBXaGVuIHVzaW5nIHtAbGluayBHcmF2aXR5I0xFRlR9IG9yIHtAbGluayBHcmF2aXR5I1JJR0hUfSBpdCBwcm92aWRlcwotICAgICAgICAgKiBhbiBvZmZzZXQgZnJvbSB0aGUgZ2l2ZW4gZWRnZS4KKyAgICAgICAgICogV2hlbiB1c2luZyB7QGxpbmsgR3Jhdml0eSNMRUZUfSBvciB7QGxpbmsgR3Jhdml0eSNTVEFSVH0gb3Ige0BsaW5rIEdyYXZpdHkjUklHSFR9IG9yCisgICAgICAgICAqIHtAbGluayBHcmF2aXR5I0VORH0gaXQgcHJvdmlkZXMgYW4gb2Zmc2V0IGZyb20gdGhlIGdpdmVuIGVkZ2UuCiAgICAgICAgICAqLwogICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGludCB4OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyUG9saWN5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXJQb2xpY3kuamF2YQppbmRleCA2NGIxYWM4Li44YTMwYzdiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXJQb2xpY3kuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXJQb2xpY3kuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbXBhdGliaWxpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtNDY2LDYgKzQ2NywxMiBAQAogICAgIHB1YmxpYyBpbnQgZ2V0TWF4V2FsbHBhcGVyTGF5ZXIoKTsKICAgICAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcG9saWN5IGFsbG93cyB0aGUgc3RhdHVzIGJhciB0byBoaWRlLiAgT3RoZXJ3aXNlLAorICAgICAqIGl0IGlzIGEgdGFibGV0LXN0eWxlIHN5c3RlbSBiYXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuU3RhdHVzQmFySGlkZSgpOworCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBkaXNwbGF5IHdpZHRoIGF2YWlsYWJsZSBhZnRlciBleGNsdWRpbmcgYW55IHNjcmVlbgogICAgICAqIGRlY29yYXRpb25zIHRoYXQgY2FuIG5ldmVyIGJlIHJlbW92ZWQuICBUaGF0IGlzLCBzeXN0ZW0gYmFyIG9yCiAgICAgICogYnV0dG9uIGJhci4KQEAgLTUzMyw3ICs1NDAsNyBAQAogICAgICAqIEBzZWUgI3JlbW92ZVN0YXJ0aW5nV2luZG93CiAgICAgICovCiAgICAgcHVibGljIFZpZXcgYWRkU3RhcnRpbmdXaW5kb3coSUJpbmRlciBhcHBUb2tlbiwgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgaW50IHRoZW1lLCBDaGFyU2VxdWVuY2Ugbm9uTG9jYWxpemVkTGFiZWwsCisgICAgICAgICAgICBpbnQgdGhlbWUsIENvbXBhdGliaWxpdHlJbmZvIGNvbXBhdEluZm8sIENoYXJTZXF1ZW5jZSBub25Mb2NhbGl6ZWRMYWJlbCwKICAgICAgICAgICAgIGludCBsYWJlbFJlcywgaW50IGljb24sIGludCB3aW5kb3dGbGFncyk7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5RXZlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5RXZlbnQuamF2YQppbmRleCA1ZTE4ZjU1Li4zMmJmYTJmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUV2ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlFdmVudC5qYXZhCkBAIC0xNiw5ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5OwogCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5JQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIApAQCAtMTU5LDYgKzE2Miw3IEBACiAgKiBAc2VlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEFjY2Vzc2liaWxpdHlFdmVudCBleHRlbmRzIEFjY2Vzc2liaWxpdHlSZWNvcmQgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBJbnZhbGlkIHNlbGVjdGlvbi9mb2N1cyBwb3NpdGlvbi4KQEAgLTI1NiwyMSArMjYwLDM4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNQb29sTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBwcml2YXRlIHN0YXRpYyBBY2Nlc3NpYmlsaXR5RXZlbnQgc1Bvb2w7CiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNQb29sU2l6ZTsKLQogICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUV2ZW50IG1OZXh0OwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNJblBvb2w7CiAKICAgICBwcml2YXRlIGludCBtRXZlbnRUeXBlOworICAgIHByaXZhdGUgaW50IG1Tb3VyY2VBY2Nlc3NpYmlsaXR5Vmlld0lkOworICAgIHByaXZhdGUgaW50IG1Tb3VyY2VBY2Nlc3NpYmlsaXR5V2luZG93SWQ7CiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVBhY2thZ2VOYW1lOwogICAgIHByaXZhdGUgbG9uZyBtRXZlbnRUaW1lOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8QWNjZXNzaWJpbGl0eVJlY29yZD4gbVJlY29yZHMgPSBuZXcgQXJyYXlMaXN0PEFjY2Vzc2liaWxpdHlSZWNvcmQ+KCk7CiAKKyAgICBwcml2YXRlIElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24gbUNvbm5lY3Rpb247CisKICAgICAvKgogICAgICAqIEhpZGUgY29uc3RydWN0b3IgZnJvbSBjbGllbnRzLgogICAgICAqLwogICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUV2ZW50KCkgeworICAgIH0KIAorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYW4gZXZlbnQgZnJvbSBhbm90aGVyIG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gaW5pdGlhbGl6ZSBmcm9tLgorICAgICAqLworICAgIHZvaWQgaW5pdChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgc3VwZXIuaW5pdChldmVudCk7CisgICAgICAgIG1FdmVudFR5cGUgPSBldmVudC5tRXZlbnRUeXBlOworICAgICAgICBtRXZlbnRUaW1lID0gZXZlbnQubUV2ZW50VGltZTsKKyAgICAgICAgbVNvdXJjZUFjY2Vzc2liaWxpdHlXaW5kb3dJZCA9IGV2ZW50Lm1Tb3VyY2VBY2Nlc3NpYmlsaXR5V2luZG93SWQ7CisgICAgICAgIG1Tb3VyY2VBY2Nlc3NpYmlsaXR5Vmlld0lkID0gZXZlbnQubVNvdXJjZUFjY2Vzc2liaWxpdHlWaWV3SWQ7CisgICAgICAgIG1QYWNrYWdlTmFtZSA9IGV2ZW50Lm1QYWNrYWdlTmFtZTsKKyAgICAgICAgbUNvbm5lY3Rpb24gPSBldmVudC5tQ29ubmVjdGlvbjsKICAgICB9CiAKICAgICAvKioKQEAgLTI4Niw4ICszMDcsMTEgQEAKICAgICAgKiBBcHBlbmRzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5UmVjb3JkfSB0byB0aGUgZW5kIG9mIGV2ZW50IHJlY29yZHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVjb3JkIFRoZSByZWNvcmQgdG8gYXBwZW5kLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYXBwZW5kUmVjb3JkKEFjY2Vzc2liaWxpdHlSZWNvcmQgcmVjb3JkKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbVJlY29yZHMuYWRkKHJlY29yZCk7CiAgICAgfQogCkBAIC0zMTEsMTEgKzMzNSw4OSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIGV2ZW50IHNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShWaWV3IHNvdXJjZSkgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNvdXJjZUFjY2Vzc2liaWxpdHlXaW5kb3dJZCA9IHNvdXJjZS5nZXRBY2Nlc3NpYmlsaXR5V2luZG93SWQoKTsKKyAgICAgICAgICAgIG1Tb3VyY2VBY2Nlc3NpYmlsaXR5Vmlld0lkID0gc291cmNlLmdldEFjY2Vzc2liaWxpdHlWaWV3SWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Tb3VyY2VBY2Nlc3NpYmlsaXR5V2luZG93SWQgPSBWaWV3Lk5PX0lEOworICAgICAgICAgICAgbVNvdXJjZUFjY2Vzc2liaWxpdHlWaWV3SWQgPSBWaWV3Lk5PX0lEOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb30gb2YgdGhlIGV2ZW50IHNvdXJjZS4KKyAgICAgKiA8cD4KKyAgICAgKiAgIDxzdHJvbmc+CisgICAgICogICAgIEl0IGlzIGEgY2xpZW50IHJlc3BvbnNpYmlsaXR5IHRvIHJlY3ljbGUgdGhlIHJlY2VpdmVkIGluZm8gYnkKKyAgICAgKiAgICAgY2FsbGluZyB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3JlY3ljbGUoKX0gdG8gYXZvaWQgY3JlYXRpbmcKKyAgICAgKiAgICAgb2YgbXVsdGlwbGUgaW5zdGFuY2VzLgorICAgICAqICAgPC9zdHJvbmc+CisgICAgICogPC9wPgorICAgICAqIEByZXR1cm4gVGhlIGluZm8uCisgICAgICovCisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBnZXRTb3VyY2UoKSB7CisgICAgICAgIGVuZm9yY2VTZWFsZWQoKTsKKyAgICAgICAgaWYgKG1Tb3VyY2VBY2Nlc3NpYmlsaXR5V2luZG93SWQgPT0gVmlldy5OT19JRAorICAgICAgICAgICAgICAgIHx8IG1Tb3VyY2VBY2Nlc3NpYmlsaXR5Vmlld0lkID09IFZpZXcuTk9fSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkKAorICAgICAgICAgICAgICAgICAgICBtU291cmNlQWNjZXNzaWJpbGl0eVdpbmRvd0lkLCBtU291cmNlQWNjZXNzaWJpbGl0eVZpZXdJZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGlkIG9mIHRoZSB3aW5kb3cgZnJvbSB3aGljaCB0aGUgZXZlbnQgY29tZXMgZnJvbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHdpbmRvdyBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFjY2Vzc2liaWxpdHlXaW5kb3dJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2VBY2Nlc3NpYmlsaXR5V2luZG93SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xpZW50IHRva2VuIGZvciB0aGUgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIHRoYXQKKyAgICAgKiBwcm92aWRlZCB0aGlzIG5vZGUgaW5mby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDb25uZWN0aW9uKElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICBtQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYWNjZXNzaWJpbGl0eSB3aW5kb3cgaWQgb2YgdGhlIHNvdXJjZSB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBpZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTb3VyY2VBY2Nlc3NpYmlsaXR5V2luZG93SWQoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlQWNjZXNzaWJpbGl0eVdpbmRvd0lkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGV2ZW50IHR5cGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIFRoZSBldmVudCB0eXBlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RXZlbnRUeXBlKGludCBldmVudFR5cGUpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtRXZlbnRUeXBlID0gZXZlbnRUeXBlOwogICAgIH0KIApAQCAtMzMyLDggKzQzNCwxMSBAQAogICAgICAqIFNldHMgdGhlIHRpbWUgaW4gd2hpY2ggdGhpcyBldmVudCB3YXMgc2VudC4KICAgICAgKgogICAgICAqIEBwYXJhbSBldmVudFRpbWUgVGhlIGV2ZW50IHRpbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFdmVudFRpbWUobG9uZyBldmVudFRpbWUpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtRXZlbnRUaW1lID0gZXZlbnRUaW1lOwogICAgIH0KIApAQCAtMzUwLDggKzQ1NSwxMSBAQAogICAgICAqIFNldHMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgc291cmNlLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlIG5hbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlTmFtZShDaGFyU2VxdWVuY2UgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKICAgICB9CiAKQEAgLTM3MCw2ICs0NzgsMjcgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBjYWNoZWQgaW5zdGFuY2UgaWYgc3VjaCBpcyBhdmFpbGFibGUgb3IgYSBuZXcgb25lIGlzCisgICAgICogaW5zdGFudGlhdGVkIHdpdGggdHlwZSBwcm9wZXJ0eSBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIG90aGVyIGV2ZW50LgorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5RXZlbnQgb2J0YWluKEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgeworICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnRDbG9uZSA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZXZlbnRDbG9uZS5pbml0KGV2ZW50KTsKKworICAgICAgICBmaW5hbCBpbnQgcmVjb3JkQ291bnQgPSBldmVudC5tUmVjb3Jkcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3JkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVJlY29yZCByZWNvcmQgPSBldmVudC5tUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5UmVjb3JkIHJlY29yZENsb25lID0gQWNjZXNzaWJpbGl0eVJlY29yZC5vYnRhaW4ocmVjb3JkKTsKKyAgICAgICAgICAgIGV2ZW50Q2xvbmUubVJlY29yZHMuYWRkKHJlY29yZENsb25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBldmVudENsb25lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjYWNoZWQgaW5zdGFuY2UgaWYgc3VjaCBpcyBhdmFpbGFibGUgb3IgYSBuZXcgb25lIGlzCiAgICAgICogaW5zdGFudGlhdGVkLgogICAgICAqCiAgICAgICogQHJldHVybiBBbiBpbnN0YW5jZS4KQEAgLTQxMywxMSArNTQyLDE2IEBACiAKICAgICAvKioKICAgICAgKiBDbGVhcnMgdGhlIHN0YXRlIG9mIHRoaXMgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewogICAgICAgICBzdXBlci5jbGVhcigpOworICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgIG1FdmVudFR5cGUgPSAwOworICAgICAgICBtU291cmNlQWNjZXNzaWJpbGl0eVZpZXdJZCA9IFZpZXcuTk9fSUQ7CisgICAgICAgIG1Tb3VyY2VBY2Nlc3NpYmlsaXR5V2luZG93SWQgPSBWaWV3Lk5PX0lEOwogICAgICAgICBtUGFja2FnZU5hbWUgPSBudWxsOwogICAgICAgICBtRXZlbnRUaW1lID0gMDsKICAgICAgICAgd2hpbGUgKCFtUmVjb3Jkcy5pc0VtcHR5KCkpIHsKQEAgLTQzMiw3ICs1NjYsMTQgQEAKICAgICAgKiBAcGFyYW0gcGFyY2VsIEEgcGFyY2VsIGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGEge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5pdEZyb21QYXJjZWwoUGFyY2VsIHBhcmNlbCkgeworICAgICAgICBpZiAocGFyY2VsLnJlYWRJbnQoKSA9PSAxKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24uU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgcGFyY2VsLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0U2VhbGVkKHBhcmNlbC5yZWFkSW50KCkgPT0gMSk7CiAgICAgICAgIG1FdmVudFR5cGUgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBtU291cmNlQWNjZXNzaWJpbGl0eVdpbmRvd0lkID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgbVNvdXJjZUFjY2Vzc2liaWxpdHlWaWV3SWQgPSBwYXJjZWwucmVhZEludCgpOwogICAgICAgICBtUGFja2FnZU5hbWUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgbUV2ZW50VGltZSA9IHBhcmNlbC5yZWFkTG9uZygpOwogICAgICAgICByZWFkQWNjZXNzaWJpbGl0eVJlY29yZEZyb21QYXJjZWwodGhpcywgcGFyY2VsKTsKQEAgLTQ3MSw3ICs2MTIsMTYgQEAKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgcGFyY2VsLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmNlbC53cml0ZUludCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmNlbC53cml0ZUludCgxKTsKKyAgICAgICAgICAgIHBhcmNlbC53cml0ZVN0cm9uZ0JpbmRlcihtQ29ubmVjdGlvbi5hc0JpbmRlcigpKTsKKyAgICAgICAgfQorICAgICAgICBwYXJjZWwud3JpdGVJbnQoaXNTZWFsZWQoKSA/IDEgOiAwKTsKICAgICAgICAgcGFyY2VsLndyaXRlSW50KG1FdmVudFR5cGUpOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobVNvdXJjZUFjY2Vzc2liaWxpdHlXaW5kb3dJZCk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtU291cmNlQWNjZXNzaWJpbGl0eVZpZXdJZCk7CiAgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1QYWNrYWdlTmFtZSwgcGFyY2VsLCAwKTsKICAgICAgICAgcGFyY2VsLndyaXRlTG9uZyhtRXZlbnRUaW1lKTsKICAgICAgICAgd3JpdGVBY2Nlc3NpYmlsaXR5UmVjb3JkVG9QYXJjZWwodGhpcywgcGFyY2VsLCBmbGFncyk7CkBAIC01MTYsMjUgKzY2Niw3OSBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IEV2ZW50VHlwZTogIiArIG1FdmVudFR5cGUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBFdmVudFRpbWU6ICIgKyBtRXZlbnRUaW1lKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgUGFja2FnZU5hbWU6ICIgKyBtUGFja2FnZU5hbWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiIFxue1xuIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IEV2ZW50VHlwZTogIikuYXBwZW5kKGV2ZW50VHlwZVRvU3RyaW5nKG1FdmVudFR5cGUpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgRXZlbnRUaW1lOiAiKS5hcHBlbmQobUV2ZW50VGltZSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IFBhY2thZ2VOYW1lOiAiKS5hcHBlbmQobVBhY2thZ2VOYW1lKTsKICAgICAgICAgYnVpbGRlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1SZWNvcmRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5UmVjb3JkIHJlY29yZCA9IG1SZWNvcmRzLmdldChpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgIFJlY29yZCAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjoiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHJlY29yZC50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IHNvdXJjZUFjY2Vzc2liaWxpdHlXaW5kb3dJZDogIikuYXBwZW5kKG1Tb3VyY2VBY2Nlc3NpYmlsaXR5V2luZG93SWQpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgc291cmNlQWNjZXNzaWJpbGl0eVZpZXdJZDogIikuYXBwZW5kKG1Tb3VyY2VBY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVJlY29yZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5UmVjb3JkIHJlY29yZCA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiICBSZWNvcmQgIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoaSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIFsgQ2xhc3NOYW1lOiAiICsgcmVjb3JkLm1DbGFzc05hbWUpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IFRleHQ6ICIgKyByZWNvcmQubVRleHQpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IENvbnRlbnREZXNjcmlwdGlvbjogIiArIHJlY29yZC5tQ29udGVudERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBJdGVtQ291bnQ6ICIgKyByZWNvcmQubUl0ZW1Db3VudCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgQ3VycmVudEl0ZW1JbmRleDogIiArIHJlY29yZC5tQ3VycmVudEl0ZW1JbmRleCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgSXNFbmFibGVkOiAiICsgcmVjb3JkLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBJc1Bhc3N3b3JkOiAiICsgcmVjb3JkLmlzUGFzc3dvcmQoKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgSXNDaGVja2VkOiAiICsgcmVjb3JkLmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBJc0Z1bGxTY3JlZW46ICIgKyByZWNvcmQuaXNGdWxsU2NyZWVuKCkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IEJlZm9yZVRleHQ6ICIgKyByZWNvcmQubUJlZm9yZVRleHQpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IEZyb21JbmRleDogIiArIHJlY29yZC5tRnJvbUluZGV4KTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBBZGRlZENvdW50OiAiICsgcmVjb3JkLm1BZGRlZENvdW50KTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBSZW1vdmVkQ291bnQ6ICIgKyByZWNvcmQubVJlbW92ZWRDb3VudCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgUGFyY2VsYWJsZURhdGE6ICIgKyByZWNvcmQubVBhcmNlbGFibGVEYXRhKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIF0iKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IHJlY29yZENvdW50OiAiKS5hcHBlbmQoZ2V0QWRkZWRDb3VudCgpKTsKICAgICAgICAgfQotICAgICAgICBidWlsZGVyLmFwcGVuZCgifVxuIik7CiAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGV2ZW50IHR5cGUuIEZvciBleGFtcGxlLAorICAgICAqIHtAbGluayAjVFlQRV9WSUVXX0NMSUNLRUR9IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgVFlQRV9WSUVXX0NMSUNLRUQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmVlZGJhY2tUeXBlIFRoZSBldmVudCB0eXBlCisgICAgICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV2ZW50VHlwZVRvU3RyaW5nKGludCBmZWVkYmFja1R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChmZWVkYmFja1R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9WSUVXX0NMSUNLRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX1ZJRVdfQ0xJQ0tFRCI7CisgICAgICAgICAgICBjYXNlIFRZUEVfVklFV19MT05HX0NMSUNLRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX1ZJRVdfTE9OR19DTElDS0VEIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9WSUVXX1NFTEVDVEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiVFlQRV9WSUVXX1NFTEVDVEVEIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9WSUVXX0ZPQ1VTRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX1ZJRVdfRk9DVVNFRCI7CisgICAgICAgICAgICBjYXNlIFRZUEVfVklFV19URVhUX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX1ZJRVdfVEVYVF9DSEFOR0VEIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9XSU5ET1dfU1RBVEVfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRZUEVfV0lORE9XX1NUQVRFX0NIQU5HRUQiOworICAgICAgICAgICAgY2FzZSBUWVBFX1ZJRVdfSE9WRVJfRU5URVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX1ZJRVdfSE9WRVJfRU5URVIiOworICAgICAgICAgICAgY2FzZSBUWVBFX1ZJRVdfSE9WRVJfRVhJVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRZUEVfVklFV19IT1ZFUl9FWElUIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQiOyAgCisgICAgICAgICAgICBjYXNlIFRZUEVfVE9VQ0hfRVhQTE9SQVRJT05fR0VTVFVSRV9TVEFSVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRZUEVfVE9VQ0hfRVhQTE9SQVRJT05fR0VTVFVSRV9TVEFSVCI7CisgICAgICAgICAgICBjYXNlIFRZUEVfVE9VQ0hfRVhQTE9SQVRJT05fR0VTVFVSRV9FTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfRU5EIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAc2VlIFBhcmNlbGFibGUuQ3JlYXRvcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEFjY2Vzc2liaWxpdHlFdmVudD4gQ1JFQVRPUiA9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCmluZGV4IGRkNzcxOTMuLmVlY2U2NGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHk7CiAKLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKQEAgLTI5LDkgKzI4LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKIAogLyoqCiAgKiBTeXN0ZW0gbGV2ZWwgc2VydmljZSB0aGF0IHNlcnZlcyBhcyBhbiBldmVudCBkaXNwYXRjaCBmb3Ige0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH1zLgpAQCAtNjIsNiArNjUsMjEgQEAKIAogICAgIGJvb2xlYW4gbUlzRW5hYmxlZDsKIAorICAgIGZpbmFsIENvcHlPbldyaXRlQXJyYXlMaXN0PEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyPiBtQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXJzID0KKyAgICAgICAgbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyPigpOworCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgZm9yIHRoZSBhY2Nlc3NpYmlsaXR5IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIGJhY2sgb24gY2hhbmdlIGluIHRoZSBhY2Nlc3NpYmlsaXR5IHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZW5hYmxlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VkKGJvb2xlYW4gZW5hYmxlZCk7CisgICAgfQorCiAgICAgZmluYWwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50LlN0dWIgbUNsaWVudCA9IG5ldyBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQuU3R1YigpIHsKICAgICAgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRE9fU0VUX0VOQUJMRUQsIGVuYWJsZWQgPyAxIDogMCwgMCkuc2VuZFRvVGFyZ2V0KCk7CkBAIC03OCw5ICs5Niw4IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewogICAgICAgICAgICAgICAgIGNhc2UgRE9fU0VUX0VOQUJMRUQgOgotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNFbmFibGVkID0gKG1lc3NhZ2UuYXJnMSA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRW5hYmxlZCA9IChtZXNzYWdlLmFyZzEgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIHNldEFjY2Vzc2liaWxpdHlTdGF0ZShpc0VuYWJsZWQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgZGVmYXVsdCA6CiAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVbmtub3duIG1lc3NhZ2UgdHlwZTogIiArIG1lc3NhZ2Uud2hhdCk7CkBAIC0xMTcsNyArMTM0LDggQEAKICAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSXNFbmFibGVkID0gbVNlcnZpY2UuYWRkQ2xpZW50KG1DbGllbnQpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0VuYWJsZWQgPSBtU2VydmljZS5hZGRDbGllbnQobUNsaWVudCk7CisgICAgICAgICAgICBzZXRBY2Nlc3NpYmlsaXR5U3RhdGUoaXNFbmFibGVkKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlIGlzIGRlYWQiLCByZSk7CiAgICAgICAgIH0KQEAgLTIwMSwxMSArMjE5LDMwIEBACiAgICAgICogUmV0dXJucyB0aGUge0BsaW5rIFNlcnZpY2VJbmZvfXMgb2YgdGhlIGluc3RhbGxlZCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzLgogICAgICAqCiAgICAgICogQHJldHVybiBBbiB1bm1vZGlmaWFibGUgbGlzdCB3aXRoIHtAbGluayBTZXJ2aWNlSW5mb31zLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0SW5zdGFsbGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCl9CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgTGlzdDxTZXJ2aWNlSW5mbz4gZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkgewotICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBzZXJ2aWNlcyA9IG51bGw7CisgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPiBpbmZvcyA9IGdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOworICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBzZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8U2VydmljZUluZm8+KCk7CisgICAgICAgIGZpbmFsIGludCBpbmZvQ291bnQgPSBpbmZvcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5mb0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gaW5mb3MuZ2V0KGkpOworICAgICAgICAgICAgc2VydmljZXMuYWRkKGluZm8uZ2V0UmVzb2x2ZUluZm8oKS5zZXJ2aWNlSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qoc2VydmljZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm99cyBvZiB0aGUgaW5zdGFsbGVkIGFjY2Vzc2liaWxpdHkgc2VydmljZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIHVubW9kaWZpYWJsZSBsaXN0IHdpdGgge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb31zLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gZ2V0SW5zdGFsbGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkgeworICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gc2VydmljZXMgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZXMgPSBtU2VydmljZS5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKTsKKyAgICAgICAgICAgIHNlcnZpY2VzID0gbVNlcnZpY2UuZ2V0SW5zdGFsbGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CiAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiSW5zdGFsbGVkIEFjY2Vzc2liaWxpdHlTZXJ2aWNlcyAiICsgc2VydmljZXMpOwogICAgICAgICAgICAgfQpAQCAtMjE2LDIwICsyNTMsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2VydmljZUluZm99cyBvZiB0aGUgZW5hYmxlZCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb31zIG9mIHRoZSBlbmFibGVkIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKICAgICAgKiBmb3IgYSBnaXZlbiBmZWVkYmFjayB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtIGZlZWRiYWNrVHlwZSBUaGUgdHlwZSBvZiBmZWVkYmFjay4KLSAgICAgKiBAcmV0dXJuIEFuIHVubW9kaWZpYWJsZSBsaXN0IHdpdGgge0BsaW5rIFNlcnZpY2VJbmZvfXMuCi0gICAgICoKLSAgICAgKiBAc2VlIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNGRUVEQkFDS19BVURJQkxFCi0gICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jRkVFREJBQ0tfSEFQVElDCi0gICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jRkVFREJBQ0tfU1BPS0VOCi0gICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jRkVFREJBQ0tfVklTVUFMCi0gICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jRkVFREJBQ0tfR0VORVJJQworICAgICAqIEBwYXJhbSBmZWVkYmFja1R5cGUgVGhlIGZlZWRiYWNrIHR5cGUgKGNhbiBiZSBiaXR3aXNlIG9yIG9mIG11bHRpcGxlIHR5cGVzKS4KKyAgICAgKiBAcmV0dXJuIEFuIHVubW9kaWZpYWJsZSBsaXN0IHdpdGgge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb31zLgogICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFNlcnZpY2VJbmZvPiBnZXRFbmFibGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KGludCBmZWVkYmFja1R5cGUpIHsKLSAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gc2VydmljZXMgPSBudWxsOworICAgIHB1YmxpYyBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gZ2V0RW5hYmxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdChpbnQgZmVlZGJhY2tUeXBlKSB7CisgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPiBzZXJ2aWNlcyA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzZXJ2aWNlcyA9IG1TZXJ2aWNlLmdldEVuYWJsZWRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoZmVlZGJhY2tUeXBlKTsKICAgICAgICAgICAgIGlmIChERUJVRykgewpAQCAtMjQwLDQgKzI3MSw4MSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHNlcnZpY2VzKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIuCisgICAgICogQHJldHVybiBUcnVlIGlmIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lci4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgc3VjY2Vzc2Z1bGx5IHVucmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZW5hYmxlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc0VuYWJsZWQgVGhlIGFjY2Vzc2liaWxpdHkgc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2liaWxpdHlTdGF0ZShib29sZWFuIGlzRW5hYmxlZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1IYW5kbGVyKSB7CisgICAgICAgICAgICBpZiAoaXNFbmFibGVkICE9IG1Jc0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBtSXNFbmFibGVkID0gaXNFbmFibGVkOworICAgICAgICAgICAgICAgIG5vdGlmeUFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSByZWdpc3RlcmVkIHtAbGluayBBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcn1zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBub3RpZnlBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VkKCkgeworICAgICAgICBmaW5hbCBpbnQgbGlzdGVuZXJDb3VudCA9IG1BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVycy5nZXQoaSkub25BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VkKG1Jc0VuYWJsZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBhY2Nlc3NpYmlsaXR5IGludGVyYWN0aW9uIGNvbm5lY3Rpb24gaW50ZXJmYWNlIGZvciBhIGdpdmVuIHdpbmRvdy4KKyAgICAgKiBAcGFyYW0gd2luZG93VG9rZW4gVGhlIHdpbmRvdyB0b2tlbiB0byB3aGljaCBhIGNvbm5lY3Rpb24gaXMgYWRkZWQuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgYWRkQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuLAorICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmFkZEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24od2luZG93VG9rZW4sIGNvbm5lY3Rpb24pOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciB3aGlsZSBhZGRpbmcgYW4gYWNjZXNzaWJpbGl0eSBpbnRlcmFjdGlvbiBjb25uZWN0aW9uLiAiLCByZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZpZXcuTk9fSUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlZCBhbiBhY2Nlc3NpYmlsaXR5IGludGVyYWN0aW9uIGNvbm5lY3Rpb24gaW50ZXJmYWNlIGZvciBhIGdpdmVuIHdpbmRvdy4KKyAgICAgKiBAcGFyYW0gd2luZG93VG9rZW4gVGhlIHdpbmRvdyB0b2tlbiB0byB3aGljaCBhIGNvbm5lY3Rpb24gaXMgcmVtb3ZlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5yZW1vdmVBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uKHdpbmRvd1Rva2VuKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3Igd2hpbGUgcmVtb3ZpbmcgYW4gYWNjZXNzaWJpbGl0eSBpbnRlcmFjdGlvbiBjb25uZWN0aW9uLiAiLCByZSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVJbmZvLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVJbmZvLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxNzVjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uYWlkbApAQCAtMCwwICsxLDE5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHk7CisKK3BhcmNlbGFibGUgQWNjZXNzaWJpbGl0eU5vZGVJbmZvOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmY4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVJbmZvLmphdmEKQEAgLTAsMCArMSw5NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5OworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5JQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgb2YgdGhlIHNjcmVlbiBjb250ZW50LiBGcm9tIHRoZSBwb2ludCBvZgorICogdmlldyBvZiBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgdGhlIHNjcmVlbiBjb250ZW50IGlzIHByZXNlbnRlZCBhcyB0cmVlCisgKiBvZiBhY2Nlc3NpYmlsaXR5IG5vZGVzLgorICoKKyAqIFRPRE8oc3ZlcnRvc2xhdmdhbm92KTogVXBkYXRlIHRoZSBkb2N1bWVudGF0aW9uLCBhZGQgc2FtcGxlLCBhbmQgZGVzY3JpYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlY3VyaXR5IHBvbGljeS4KKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgLy8gQWN0aW9ucy4KKworICAgIC8qKgorICAgICAqIEFjdGlvbiB0aGF0IGZvY3VzZXMgdGhlIG5vZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0ZPQ1VTID0gIDB4MDAwMDAwMDE7CisKKyAgICAvKioKKyAgICAgKiBBY3Rpb24gdGhhdCB1bmZvY3VzZXMgdGhlIG5vZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0NMRUFSX0ZPQ1VTID0gIDB4MDAwMDAwMDI7CisKKyAgICAvKioKKyAgICAgKiBBY3Rpb24gdGhhdCBzZWxlY3RzIHRoZSBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TRUxFQ1QgPSAgMHgwMDAwMDAwNDsKKworICAgIC8qKgorICAgICAqIEFjdGlvbiB0aGF0IHVuc2VsZWN0cyB0aGUgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ0xFQVJfU0VMRUNUSU9OID0gIDB4MDAwMDAwMDg7CisKKyAgICAvLyBCb29sZWFuIGF0dHJpYnV0ZXMuCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQ0hFQ0tBQkxFID0gMHgwMDAwMDAwMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DSEVDS0VEID0gMHgwMDAwMDAwMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GT0NVU0FCTEUgPSAweDAwMDAwMDA0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZPQ1VTRUQgPSAweDAwMDAwMDA4OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NFTEVDVEVEID0gMHgwMDAwMDAxMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DTElDS0FCTEUgPSAweDAwMDAwMDIwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0xPTkdfQ0xJQ0tBQkxFID0gMHgwMDAwMDA0MDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTkFCTEVEID0gMHgwMDAwMDA4MDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QQVNTV09SRCA9IDB4MDAwMDAxMDA7CisKKyAgICAvLyBSZWFkYWJsZSByZXByZXNlbnRhdGlvbnMgLSBsYXppbHkgaW5pdGlhbGl6ZWQuCisgICAgcHJpdmF0ZSBzdGF0aWMgU3BhcnNlQXJyYXk8U3RyaW5nPiBzQWN0aW9uU3ltYm9saWNOYW1lczsKKworICAgIC8vIEhvdXNla2VlcGluZy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BPT0xfU0laRSA9IDUwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzUG9vbExvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNQb29sOworICAgIHByaXZhdGUgc3RhdGljIGludCBzUG9vbFNpemU7CisgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gbU5leHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0luUG9vbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNlYWxlZDsKKworICAgIC8vIERhdGEuCisgICAgcHJpdmF0ZSBpbnQgbUFjY2Vzc2liaWxpdHlWaWV3SWQ7CisgICAgcHJpdmF0ZSBpbnQgbUFjY2Vzc2liaWxpdHlXaW5kb3dJZDsKKyAgICBwcml2YXRlIGludCBtUGFyZW50QWNjZXNzaWJpbGl0eVZpZXdJZDsKKyAgICBwcml2YXRlIGludCBtQm9vbGVhblByb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1Cb3VuZHMgPSBuZXcgUmVjdCgpOworCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVBhY2thZ2VOYW1lOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1DbGFzc05hbWU7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUNvbnRlbnREZXNjcmlwdGlvbjsKKworICAgIHByaXZhdGUgZmluYWwgU3BhcnNlSW50QXJyYXkgbUNoaWxkQWNjZXNzaWJpbGl0eUlkcyA9IG5ldyBTcGFyc2VJbnRBcnJheSgpOworICAgIHByaXZhdGUgaW50IG1BY3Rpb25zOworCisgICAgcHJpdmF0ZSBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIG1Db25uZWN0aW9uOworCisgICAgLyoqCisgICAgICogSGlkZSBjb25zdHJ1Y3RvciBmcm9tIGNsaWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oKSB7CisgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBpbmZvIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVmlldyBzb3VyY2UpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOworICAgICAgICBtQWNjZXNzaWJpbGl0eVZpZXdJZCA9IHNvdXJjZS5nZXRBY2Nlc3NpYmlsaXR5Vmlld0lkKCk7CisgICAgICAgIG1BY2Nlc3NpYmlsaXR5V2luZG93SWQgPSBzb3VyY2UuZ2V0QWNjZXNzaWJpbGl0eVdpbmRvd0lkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaWQgb2YgdGhlIHdpbmRvdyBmcm9tIHdoaWNoIHRoZSBpbmZvIGNvbWVzIGZyb20uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB3aW5kb3cgaWQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBY2Nlc3NpYmlsaXR5V2luZG93SWQoKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzaWJpbGl0eVdpbmRvd0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjaGlsZHJlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNoaWxkIGNvdW50LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1DaGlsZEFjY2Vzc2liaWxpdHlJZHMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2hpbGQgYXQgZ2l2ZW4gaW5kZXguCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPgorICAgICAqICAgICBJdCBpcyBhIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byByZWN5Y2xlIHRoZSByZWNlaXZlZCBpbmZvIGJ5CisgICAgICogICAgIGNhbGxpbmcge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNyZWN5Y2xlKCl9IHRvIGF2b2lkIGNyZWF0aW5nCisgICAgICogICAgIG9mIG11bHRpcGxlIGluc3RhbmNlcy4KKyAgICAgKiAgIDwvc3Ryb25nPgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGNoaWxkIGluZGV4LgorICAgICAqIEByZXR1cm4gVGhlIGNoaWxkIG5vZGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgb3V0c2lkZSBvZiBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisgICAgICAgIGVuZm9yY2VTZWFsZWQoKTsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQWNjZXNzaWJpbGl0eVZpZXdJZCA9IG1DaGlsZEFjY2Vzc2liaWxpdHlJZHMuZ2V0KGluZGV4KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbi5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlBY2Nlc3NpYmlsaXR5SWQobUFjY2Vzc2liaWxpdHlXaW5kb3dJZCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRBY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjaGlsZC4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBjaGlsZCBUaGUgY2hpbGQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChWaWV3IGNoaWxkKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQWNjZXNzaWJpbGl0eVZpZXdJZCA9IGNoaWxkLmdldEFjY2Vzc2liaWxpdHlWaWV3SWQoKTsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbUNoaWxkQWNjZXNzaWJpbGl0eUlkcy5zaXplKCk7CisgICAgICAgIG1DaGlsZEFjY2Vzc2liaWxpdHlJZHMucHV0KGluZGV4LCBjaGlsZEFjY2Vzc2liaWxpdHlWaWV3SWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIHRoZSBub2RlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgYml0IG1hc2sgb2Ygd2l0aCBhY3Rpb25zLgorICAgICAqCisgICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jQUNUSU9OX0ZPQ1VTCisgICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jQUNUSU9OX0NMRUFSX0ZPQ1VTCisgICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jQUNUSU9OX1NFTEVDVAorICAgICAqIEBzZWUgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI0FDVElPTl9DTEVBUl9TRUxFQ1RJT04KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFjdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGFjdGlvbiB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIG5vZGUuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBY3Rpb24oaW50IGFjdGlvbikgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CisgICAgICAgIG1BY3Rpb25zIHw9IGFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhbiBhY3Rpb24gb24gdGhlIG5vZGUuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBBbiBhY3Rpb24gY2FuIGJlIHBlcmZvcm1lZCBvbmx5IGlmIHRoZSByZXF1ZXN0IGlzIG1hZGUKKyAgICAgKiAgIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gdG8gcGVyZm9ybS4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFjdGlvbiB3YXMgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIG91dHNpZGUgb2YgYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjdGlvbihpbnQgYWN0aW9uKSB7CisgICAgICAgIGVuZm9yY2VTZWFsZWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbi5wZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbihtQWNjZXNzaWJpbGl0eVdpbmRvd0lkLAorICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eVZpZXdJZCwgYWN0aW9uKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGlzIG5vZGUncyBwYXJlbnQuCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPgorICAgICAqICAgICBJdCBpcyBhIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byByZWN5Y2xlIHRoZSByZWNlaXZlZCBpbmZvIGJ5CisgICAgICogICAgIGNhbGxpbmcge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNyZWN5Y2xlKCl9IHRvIGF2b2lkIGNyZWF0aW5nCisgICAgICogICAgIG9mIG11bHRpcGxlIGluc3RhbmNlcy4KKyAgICAgKiAgIDwvc3Ryb25nPgorICAgICAqIDwvcD4KKyAgICAgKiBAcmV0dXJuIFRoZSBub2RlJ3MgcGF0ZW50IGlkLgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0UGFyZW50KCkgeworICAgICAgICBlbmZvcmNlU2VhbGVkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkKG1BY2Nlc3NpYmlsaXR5V2luZG93SWQsCisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnRBY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGFyZW50LgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFZpZXcgcGFyZW50KSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgbVBhcmVudEFjY2Vzc2liaWxpdHlWaWV3SWQgPSBwYXJlbnQuZ2V0QWNjZXNzaWJpbGl0eVZpZXdJZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5vZGUgYm91bmRzIGluIHBhcmVudCBjb29yZGluYXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRCb3VuZHMgVGhlIG91dHB1dCBub2RlIGJvdW5kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRCb3VuZHMoUmVjdCBvdXRCb3VuZHMpIHsKKyAgICAgICAgb3V0Qm91bmRzLnNldChtQm91bmRzLmxlZnQsIG1Cb3VuZHMudG9wLCBtQm91bmRzLnJpZ2h0LCBtQm91bmRzLmJvdHRvbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbm9kZSBib3VuZHMgaW4gcGFyZW50IGNvb3JkaW5hdGVzLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGJvdW5kcyBUaGUgbm9kZSBib3VuZHMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZHMoUmVjdCBib3VuZHMpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOworICAgICAgICBtQm91bmRzLnNldChib3VuZHMubGVmdCwgYm91bmRzLnRvcCwgYm91bmRzLnJpZ2h0LCBib3VuZHMuYm90dG9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGNoZWNrYWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbm9kZSBpcyBjaGVja2FibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2FibGUoKSB7CisgICAgICAgIHJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ0hFQ0tBQkxFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGNoZWNrYWJsZS4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBjaGVja2FibGUgVHJ1ZSBpZiB0aGUgbm9kZSBpcyBjaGVja2FibGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2FibGUoYm9vbGVhbiBjaGVja2FibGUpIHsKKyAgICAgICAgc2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0NIRUNLQUJMRSwgY2hlY2thYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGNoZWNrZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5vZGUgaXMgY2hlY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ0hFQ0tFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBjaGVja2VkLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGNoZWNrZWQgVHJ1ZSBpZiB0aGUgbm9kZSBpcyBjaGVja2VkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgc2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0NIRUNLRUQsIGNoZWNrZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgZm9jdXNhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlIGlzIGZvY3VzYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9GT0NVU0FCTEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgZm9jdXNhYmxlLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGZvY3VzYWJsZSBUcnVlIGlmIHRoZSBub2RlIGlzIGZvY3VzYWJsZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZShib29sZWFuIGZvY3VzYWJsZSkgeworICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfRk9DVVNBQkxFLCBmb2N1c2FibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgZm9jdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbm9kZSBpcyBmb2N1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9GT0NVU0VEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGZvY3VzZWQuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gZm9jdXNlZCBUcnVlIGlmIHRoZSBub2RlIGlzIGZvY3VzZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb2N1c2VkKGJvb2xlYW4gZm9jdXNlZCkgeworICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfRk9DVVNFRCwgZm9jdXNlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBzZWxlY3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbm9kZSBpcyBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgeworICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX1NFTEVDVEVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIHNlbGVjdGVkLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIHNlbGVjdGVkIFRydWUgaWYgdGhlIG5vZGUgaXMgc2VsZWN0ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7CisgICAgICAgIHNldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9TRUxFQ1RFRCwgc2VsZWN0ZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgY2xpY2thYmxlLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlIGlzIGNsaWNrYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsaWNrYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9DTElDS0FCTEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgY2xpY2thYmxlLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGNsaWNrYWJsZSBUcnVlIGlmIHRoZSBub2RlIGlzIGNsaWNrYWJsZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsaWNrYWJsZShib29sZWFuIGNsaWNrYWJsZSkgeworICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ0xJQ0tBQkxFLCBjbGlja2FibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgbG9uZyBjbGlja2FibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5vZGUgaXMgbG9uZyBjbGlja2FibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMb25nQ2xpY2thYmxlKCkgeworICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0xPTkdfQ0xJQ0tBQkxFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGxvbmcgY2xpY2thYmxlLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGxvbmdDbGlja2FibGUgVHJ1ZSBpZiB0aGUgbm9kZSBpcyBsb25nIGNsaWNrYWJsZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvbmdDbGlja2FibGUoYm9vbGVhbiBsb25nQ2xpY2thYmxlKSB7CisgICAgICAgIHNldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9MT05HX0NMSUNLQUJMRSwgbG9uZ0NsaWNrYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBlbmFibGVkLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0VOQUJMRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgZW5hYmxlZC4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgdGhlIG5vZGUgaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIHNldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9FTkFCTEVELCBlbmFibGVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGEgcGFzc3dvcmQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5vZGUgaXMgYSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Bhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX1BBU1NXT1JEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGEgcGFzc3dvcmQuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIHBhc3N3b3JkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoYm9vbGVhbiBwYXNzd29yZCkgeworICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfUEFTU1dPUkQsIHBhc3N3b3JkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwYWNrYWdlIHRoaXMgbm9kZSBjb21lcyBmcm9tLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcGFja2FnZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGFja2FnZSB0aGlzIG5vZGUgY29tZXMgZnJvbS4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBUaGUgcGFja2FnZSBuYW1lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZU5hbWUoQ2hhclNlcXVlbmNlIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY2xhc3MgdGhpcyBub2RlIGNvbWVzIGZyb20uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gbUNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGFzcyB0aGlzIG5vZGUgY29tZXMgZnJvbS4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGNsYXNzIG5hbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoQ2hhclNlcXVlbmNlIGNsYXNzTmFtZSkgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CisgICAgICAgIG1DbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGV4dCBvZiB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRleHQgb2YgdGhpcyBub2RlLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgbVRleHQgPSB0ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gb2YgdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY29udGVudCBkZXNjcmlwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldENvbnRlbnREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZW50RGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29udGVudCBkZXNjcmlwdGlvbiBvZiB0aGlzIG5vZGUuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gY29udGVudERlc2NyaXB0aW9uIFRoZSBjb250ZW50IGRlc2NyaXB0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudERlc2NyaXB0aW9uKENoYXJTZXF1ZW5jZSBjb250ZW50RGVzY3JpcHRpb24pIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOworICAgICAgICBtQ29udGVudERlc2NyaXB0aW9uID0gY29udGVudERlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgYm9vbGVhbiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkuCisgICAgICogQHJldHVybiBUaGUgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShpbnQgcHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIChtQm9vbGVhblByb3BlcnRpZXMgJiBwcm9wZXJ0eSkgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgYm9vbGVhbiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRCb29sZWFuUHJvcGVydHkoaW50IHByb3BlcnR5LCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBtQm9vbGVhblByb3BlcnRpZXMgfD0gcHJvcGVydHk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQm9vbGVhblByb3BlcnRpZXMgJj0gfnByb3BlcnR5OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29ubmVjdGlvbiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNsaWVudCB0b2tlbi4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q29ubmVjdGlvbihJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgbUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaWYgdGhpcyBpbnN0YW5jZSBpcyBzZWFsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VhbGVkIFdoZXRoZXIgaXMgc2VhbGVkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWFsZWQoYm9vbGVhbiBzZWFsZWQpIHsKKyAgICAgICAgbVNlYWxlZCA9IHNlYWxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGlmIHRoaXMgaW5zdGFuY2UgaXMgc2VhbGVkLgorICAgICAqCisgICAgICogQHJldHVybiBXaGV0aGVyIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWFsZWQoKSB7CisgICAgICAgIHJldHVybiBtU2VhbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZm9yY2VzIHRoYXQgdGhpcyBpbnN0YW5jZSBpcyBzZWFsZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGlzIGluc3RhbmNlIGlzIG5vdCBzZWFsZWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGVuZm9yY2VTZWFsZWQoKSB7CisgICAgICAgIGlmICghaXNTZWFsZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHBlcmZvcm0gdGhpcyAiCisgICAgICAgICAgICAgICAgICAgICsgImFjdGlvbiBvbiBhIG5vdCBzZWFsZWQgaW5zdGFuY2UuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmZvcmNlcyB0aGF0IHRoaXMgaW5zdGFuY2UgaXMgbm90IHNlYWxlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHRoaXMgaW5zdGFuY2UgaXMgc2VhbGVkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmZvcmNlTm90U2VhbGVkKCkgeworICAgICAgICBpZiAoaXNTZWFsZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHBlcmZvcm0gdGhpcyAiCisgICAgICAgICAgICAgICAgICAgICsgImFjdGlvbiBvbiBhbiBzZWFsZWQgaW5zdGFuY2UuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY2FjaGVkIGluc3RhbmNlIGlmIHN1Y2ggaXMgYXZhaWxhYmxlIG90aGVyd2lzZSBhIG5ldyBvbmUKKyAgICAgKiBhbmQgc2V0cyB0aGUgc291cmNlLgorICAgICAqCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFNvdXJjZShWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIG9idGFpbihWaWV3IHNvdXJjZSkgeworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbyA9IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5vYnRhaW4oKTsKKyAgICAgICAgaW5mby5zZXRTb3VyY2Uoc291cmNlKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNhY2hlZCBpbnN0YW5jZSBpZiBzdWNoIGlzIGF2YWlsYWJsZSBvdGhlcndpc2UgYSBuZXcgb25lLgorICAgICAqCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBvYnRhaW4oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1Bvb2xMb2NrKSB7CisgICAgICAgICAgICBpZiAoc1Bvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvID0gc1Bvb2w7CisgICAgICAgICAgICAgICAgc1Bvb2wgPSBzUG9vbC5tTmV4dDsKKyAgICAgICAgICAgICAgICBzUG9vbFNpemUtLTsKKyAgICAgICAgICAgICAgICBpbmZvLm1OZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbmZvLm1Jc0luUG9vbCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSBiYWNrIHRvIGJlIHJldXNlZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5Ob3RlOiBZb3UgbXVzdCBub3QgdG91Y2ggdGhlIG9iamVjdCBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uPC9iPgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhlIGluZm8gaXMgYWxyZWFkeSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICBpZiAobUlzSW5Qb29sKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbmZvIGFscmVhZHkgcmVjeWNsZWQhIik7CisgICAgICAgIH0KKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChzUG9vbExvY2spIHsKKyAgICAgICAgICAgIGlmIChzUG9vbFNpemUgPD0gTUFYX1BPT0xfU0laRSkgeworICAgICAgICAgICAgICAgIG1OZXh0ID0gc1Bvb2w7CisgICAgICAgICAgICAgICAgc1Bvb2wgPSB0aGlzOworICAgICAgICAgICAgICAgIG1Jc0luUG9vbCA9IHRydWU7CisgICAgICAgICAgICAgICAgc1Bvb2xTaXplKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogICA8Yj5Ob3RlOiBBZnRlciB0aGUgaW5zdGFuY2UgaXMgd3JpdHRlbiB0byBhIHBhcmNlbCBpdCBpcyByZWN5Y2xlZC4KKyAgICAgKiAgICAgIFlvdSBtdXN0IG5vdCB0b3VjaCB0aGUgb2JqZWN0IGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi48L2I+CisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIHBhcmNlbCwgaW50IGZsYWdzKSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBwYXJjZWwud3JpdGVTdHJvbmdCaW5kZXIobUNvbm5lY3Rpb24uYXNCaW5kZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcGFyY2VsLndyaXRlSW50KGlzU2VhbGVkKCkgPyAxIDogMCk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtQWNjZXNzaWJpbGl0eVZpZXdJZCk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtQWNjZXNzaWJpbGl0eVdpbmRvd0lkKTsKKyAgICAgICAgcGFyY2VsLndyaXRlSW50KG1QYXJlbnRBY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKworICAgICAgICBTcGFyc2VJbnRBcnJheSBjaGlsZElkcyA9IG1DaGlsZEFjY2Vzc2liaWxpdHlJZHM7CisgICAgICAgIGZpbmFsIGludCBjaGlsZElkc1NpemUgPSBjaGlsZElkcy5zaXplKCk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChjaGlsZElkc1NpemUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkSWRzU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQoY2hpbGRJZHMudmFsdWVBdChpKSk7CisgICAgICAgIH0KKworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUJvdW5kcy50b3ApOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUJvdW5kcy5ib3R0b20pOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUJvdW5kcy5sZWZ0KTsKKyAgICAgICAgcGFyY2VsLndyaXRlSW50KG1Cb3VuZHMucmlnaHQpOworCisgICAgICAgIHBhcmNlbC53cml0ZUludChtQWN0aW9ucyk7CisKKyAgICAgICAgcGFyY2VsLndyaXRlSW50KG1Cb29sZWFuUHJvcGVydGllcyk7CisKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobVBhY2thZ2VOYW1lLCBwYXJjZWwsIGZsYWdzKTsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobUNsYXNzTmFtZSwgcGFyY2VsLCBmbGFncyk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1UZXh0LCBwYXJjZWwsIGZsYWdzKTsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobUNvbnRlbnREZXNjcmlwdGlvbiwgcGFyY2VsLCBmbGFncyk7CisKKyAgICAgICAgLy8gU2luY2UgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIGZldGNoZWQgdmlhIHN5bmNocm9ub3VzIGkuZS4gYmxvY2tpbmcKKyAgICAgICAgLy8gY2FsbHMgaW4gSVBDcyBhbmQgd2UgYWx3YXlzIHJlY3ljbGUgYXMgc29vbiBhcyB0aGUgaW5zdGFuY2UgaXMgbWFyc2hhbGVkLgorICAgICAgICByZWN5Y2xlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBmcm9tIGEge0BsaW5rIFBhcmNlbH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyY2VsIEEgcGFyY2VsIGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGEge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb30uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRGcm9tUGFyY2VsKFBhcmNlbCBwYXJjZWwpIHsKKyAgICAgICAgaWYgKHBhcmNlbC5yZWFkSW50KCkgPT0gMSkgeworICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgIHBhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIG1TZWFsZWQgPSAocGFyY2VsLnJlYWRJbnQoKSAgPT0gMSk7CisgICAgICAgIG1BY2Nlc3NpYmlsaXR5Vmlld0lkID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgbUFjY2Vzc2liaWxpdHlXaW5kb3dJZCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIG1QYXJlbnRBY2Nlc3NpYmlsaXR5Vmlld0lkID0gcGFyY2VsLnJlYWRJbnQoKTsKKworICAgICAgICBTcGFyc2VJbnRBcnJheSBjaGlsZElkcyA9IG1DaGlsZEFjY2Vzc2liaWxpdHlJZHM7CisgICAgICAgIGZpbmFsIGludCBjaGlsZHJlblNpemUgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRJZCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgICAgICBjaGlsZElkcy5wdXQoaSwgY2hpbGRJZCk7CisgICAgICAgIH0KKworICAgICAgICBtQm91bmRzLnRvcCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIG1Cb3VuZHMuYm90dG9tID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgbUJvdW5kcy5sZWZ0ID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgbUJvdW5kcy5yaWdodCA9IHBhcmNlbC5yZWFkSW50KCk7CisKKyAgICAgICAgbUFjdGlvbnMgPSBwYXJjZWwucmVhZEludCgpOworCisgICAgICAgIG1Cb29sZWFuUHJvcGVydGllcyA9IHBhcmNlbC5yZWFkSW50KCk7CisKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIG1DbGFzc05hbWUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgbVRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgbUNvbnRlbnREZXNjcmlwdGlvbiA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgc3RhdGUgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1TZWFsZWQgPSBmYWxzZTsKKyAgICAgICAgbUNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICBtQWNjZXNzaWJpbGl0eVZpZXdJZCA9IFZpZXcuTk9fSUQ7CisgICAgICAgIG1QYXJlbnRBY2Nlc3NpYmlsaXR5Vmlld0lkID0gVmlldy5OT19JRDsKKyAgICAgICAgbUNoaWxkQWNjZXNzaWJpbGl0eUlkcy5jbGVhcigpOworICAgICAgICBtQm91bmRzLnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgbUJvb2xlYW5Qcm9wZXJ0aWVzID0gMDsKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gbnVsbDsKKyAgICAgICAgbUNsYXNzTmFtZSA9IG51bGw7CisgICAgICAgIG1UZXh0ID0gbnVsbDsKKyAgICAgICAgbUNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7CisgICAgICAgIG1BY3Rpb25zID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBodW1hbiByZWFkYWJsZSBhY3Rpb24gc3ltYm9saWMgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbi4KKyAgICAgKiBAcmV0dXJuIFRoZSBzeW1ib2xpYyBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25TeW1ib2xpY05hbWUoaW50IGFjdGlvbikgeworICAgICAgICBTcGFyc2VBcnJheTxTdHJpbmc+IGFjdGlvblN5bWJvbGljTmFtZXMgPSBzQWN0aW9uU3ltYm9saWNOYW1lczsKKyAgICAgICAgaWYgKGFjdGlvblN5bWJvbGljTmFtZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgYWN0aW9uU3ltYm9saWNOYW1lcyA9IHNBY3Rpb25TeW1ib2xpY05hbWVzID0gbmV3IFNwYXJzZUFycmF5PFN0cmluZz4oKTsKKyAgICAgICAgICAgIGFjdGlvblN5bWJvbGljTmFtZXMucHV0KEFDVElPTl9GT0NVUywgIkFDVElPTl9GT0NVUyIpOworICAgICAgICAgICAgYWN0aW9uU3ltYm9saWNOYW1lcy5wdXQoQUNUSU9OX0NMRUFSX0ZPQ1VTLCAiQUNUSU9OX1VORk9DVVMiKTsKKyAgICAgICAgICAgIGFjdGlvblN5bWJvbGljTmFtZXMucHV0KEFDVElPTl9TRUxFQ1QsICJBQ1RJT05fU0VMRUNUIik7CisgICAgICAgICAgICBhY3Rpb25TeW1ib2xpY05hbWVzLnB1dChBQ1RJT05fQ0xFQVJfU0VMRUNUSU9OLCAiQUNUSU9OX1VOU0VMRUNUIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdGlvblN5bWJvbGljTmFtZXMuZ2V0KGFjdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIG1BY2Nlc3NpYmlsaXR5Vmlld0lkOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIG1BY2Nlc3NpYmlsaXR5V2luZG93SWQ7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBhY2Nlc3NpYmlsaXR5SWQ6ICIgKyBtQWNjZXNzaWJpbGl0eVZpZXdJZCk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBwYXJlbnRBY2Nlc3NpYmlsaXR5SWQ6ICIgKyBtUGFyZW50QWNjZXNzaWJpbGl0eVZpZXdJZCk7CisgICAgICAgICAgICBTcGFyc2VJbnRBcnJheSBjaGlsZElkcyA9IG1DaGlsZEFjY2Vzc2liaWxpdHlJZHM7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBjaGlsZEFjY2Vzc2liaWxpdHlJZHM6IFsiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBjb3VudCA9IGNoaWxkSWRzLnNpemUoKTsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaGlsZElkcy52YWx1ZUF0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IGNvdW50IC0gMSkgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IGJvdW5kczogIiArIG1Cb3VuZHMpOworCisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IHBhY2thZ2VOYW1lOiAiKS5hcHBlbmQobVBhY2thZ2VOYW1lKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgY2xhc3NOYW1lOiAiKS5hcHBlbmQobUNsYXNzTmFtZSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IHRleHQ6ICIpLmFwcGVuZChtVGV4dCk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IGNvbnRlbnREZXNjcmlwdGlvbjogIikuYXBwZW5kKG1Db250ZW50RGVzY3JpcHRpb24pOworCisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IGNoZWNrYWJsZTogIikuYXBwZW5kKGlzQ2hlY2thYmxlKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBjaGVja2VkOiAiKS5hcHBlbmQoaXNDaGVja2VkKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBmb2N1c2FibGU6ICIpLmFwcGVuZChpc0ZvY3VzYWJsZSgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgZm9jdXNlZDogIikuYXBwZW5kKGlzRm9jdXNlZCgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgc2VsZWN0ZWQ6ICIpLmFwcGVuZChpc1NlbGVjdGVkKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBjbGlja2FibGU6ICIpLmFwcGVuZChpc0NsaWNrYWJsZSgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgbG9uZ0NsaWNrYWJsZTogIikuYXBwZW5kKGlzTG9uZ0NsaWNrYWJsZSgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgZW5hYmxlZDogIikuYXBwZW5kKGlzRW5hYmxlZCgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgcGFzc3dvcmQ6ICIpLmFwcGVuZChpc1Bhc3N3b3JkKCkpOworCisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IFsiKTsKKworICAgICAgICBmb3IgKGludCBhY3Rpb25CaXRzID0gbUFjdGlvbnM7IGFjdGlvbkJpdHMgIT0gMDspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSAxIDw8IEludGVnZXIubnVtYmVyT2ZUcmFpbGluZ1plcm9zKGFjdGlvbkJpdHMpOworICAgICAgICAgICAgYWN0aW9uQml0cyAmPSB+YWN0aW9uOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QWN0aW9uU3ltYm9saWNOYW1lKGFjdGlvbikpOworICAgICAgICAgICAgaWYgKGFjdGlvbkJpdHMgIT0gMCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgUGFyY2VsYWJsZS5DcmVhdG9yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBDUkVBVE9SID0KKyAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPigpIHsKKyAgICAgICAgcHVibGljIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBwYXJjZWwpIHsKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvID0gQWNjZXNzaWJpbGl0eU5vZGVJbmZvLm9idGFpbigpOworICAgICAgICAgICAgaW5mby5pbml0RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICAgICAgcmV0dXJuIGluZm87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU5vZGVJbmZvW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWNjZXNzaWJpbGl0eU5vZGVJbmZvW3NpemVdOworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVjb3JkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlY29yZC5qYXZhCmluZGV4IDc4MTliMTcuLjRiZjAzYTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVjb3JkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZWNvcmQuamF2YQpAQCAtMzgsMTMgKzM4LDE0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BBU1NXT1JEID0gMHgwMDAwMDAwNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRlVMTF9TQ1JFRU4gPSAweDAwMDAwMDgwOwogCisgICAgLy8gSG91c2VrZWVwaW5nCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QT09MX1NJWkUgPSAxMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc1Bvb2xMb2NrID0gbmV3IE9iamVjdCgpOwogICAgIHByaXZhdGUgc3RhdGljIEFjY2Vzc2liaWxpdHlSZWNvcmQgc1Bvb2w7CiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNQb29sU2l6ZTsKLQogICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eVJlY29yZCBtTmV4dDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzSW5Qb29sOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2VhbGVkOwogCiAgICAgcHJvdGVjdGVkIGludCBtQm9vbGVhblByb3BlcnRpZXM7CiAgICAgcHJvdGVjdGVkIGludCBtQ3VycmVudEl0ZW1JbmRleDsKQEAgLTY4LDYgKzY5LDI2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHJlY29yZCBmcm9tIGFub3RoZXIgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY29yZCBUaGUgdG8gaW5pdGlhbGl6ZSBmcm9tLgorICAgICAqLworICAgIHZvaWQgaW5pdChBY2Nlc3NpYmlsaXR5UmVjb3JkIHJlY29yZCkgeworICAgICAgICBtU2VhbGVkID0gcmVjb3JkLmlzU2VhbGVkKCk7CisgICAgICAgIG1Cb29sZWFuUHJvcGVydGllcyA9IHJlY29yZC5tQm9vbGVhblByb3BlcnRpZXM7CisgICAgICAgIG1DdXJyZW50SXRlbUluZGV4ID0gcmVjb3JkLm1DdXJyZW50SXRlbUluZGV4OworICAgICAgICBtSXRlbUNvdW50ID0gcmVjb3JkLm1JdGVtQ291bnQ7CisgICAgICAgIG1Gcm9tSW5kZXggPSByZWNvcmQubUZyb21JbmRleDsKKyAgICAgICAgbUFkZGVkQ291bnQgPSByZWNvcmQubUFkZGVkQ291bnQ7CisgICAgICAgIG1SZW1vdmVkQ291bnQgPSByZWNvcmQubVJlbW92ZWRDb3VudDsKKyAgICAgICAgbUNsYXNzTmFtZSA9IHJlY29yZC5tQ2xhc3NOYW1lOworICAgICAgICBtQ29udGVudERlc2NyaXB0aW9uID0gcmVjb3JkLm1Db250ZW50RGVzY3JpcHRpb247CisgICAgICAgIG1CZWZvcmVUZXh0ID0gcmVjb3JkLm1CZWZvcmVUZXh0OworICAgICAgICBtUGFyY2VsYWJsZURhdGEgPSByZWNvcmQubVBhcmNlbGFibGVEYXRhOworICAgICAgICBtVGV4dC5hZGRBbGwocmVjb3JkLm1UZXh0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHZXRzIGlmIHRoZSBzb3VyY2UgaXMgY2hlY2tlZC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBpcyBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2UuCkBAIC04MCw4ICsxMDEsMTEgQEAKICAgICAgKiBTZXRzIGlmIHRoZSBzb3VyY2UgaXMgY2hlY2tlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBpc0NoZWNrZWQgVHJ1ZSBpZiB0aGUgdmlldyBpcyBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgc2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0NIRUNLRUQsIGlzQ2hlY2tlZCk7CiAgICAgfQogCkBAIC05OCw4ICsxMjIsMTEgQEAKICAgICAgKiBTZXRzIGlmIHRoZSBzb3VyY2UgaXMgZW5hYmxlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBpc0VuYWJsZWQgVHJ1ZSBpZiB0aGUgdmlldyBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgc2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0VOQUJMRUQsIGlzRW5hYmxlZCk7CiAgICAgfQogCkBAIC0xMTYsMjEgKzE0MywxNSBAQAogICAgICAqIFNldHMgaWYgdGhlIHNvdXJjZSBpcyBhIHBhc3N3b3JkIGZpZWxkLgogICAgICAqCiAgICAgICogQHBhcmFtIGlzUGFzc3dvcmQgVHJ1ZSBpZiB0aGUgdmlldyBpcyBhIHBhc3N3b3JkIGZpZWxkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChib29sZWFuIGlzUGFzc3dvcmQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfUEFTU1dPUkQsIGlzUGFzc3dvcmQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgaWYgdGhlIHNvdXJjZSBpcyB0YWtpbmcgdGhlIGVudGlyZSBzY3JlZW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXNGdWxsU2NyZWVuIFRydWUgaWYgdGhlIHNvdXJjZSBpcyBmdWxsIHNjcmVlbiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxTY3JlZW4oYm9vbGVhbiBpc0Z1bGxTY3JlZW4pIHsKLSAgICAgICAgc2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0ZVTExfU0NSRUVOLCBpc0Z1bGxTY3JlZW4pOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldHMgaWYgdGhlIHNvdXJjZSBpcyB0YWtpbmcgdGhlIGVudGlyZSBzY3JlZW4uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNvdXJjZSBpcyBmdWxsIHNjcmVlbiwgZmFsc2Ugb3RoZXJ3aXNlLgpAQCAtMTQwLDYgKzE2MSwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgaWYgdGhlIHNvdXJjZSBpcyB0YWtpbmcgdGhlIGVudGlyZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNGdWxsU2NyZWVuIFRydWUgaWYgdGhlIHNvdXJjZSBpcyBmdWxsIHNjcmVlbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnVsbFNjcmVlbihib29sZWFuIGlzRnVsbFNjcmVlbikgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CisgICAgICAgIHNldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9GVUxMX1NDUkVFTiwgaXNGdWxsU2NyZWVuKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgdmlzaXRlZC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBpdGVtcy4KQEAgLTE1Miw4ICsxODUsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgdmlzaXRlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBpdGVtQ291bnQgVGhlIG51bWJlciBvZiBpdGVtcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1Db3VudChpbnQgaXRlbUNvdW50KSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbUl0ZW1Db3VudCA9IGl0ZW1Db3VudDsKICAgICB9CiAKQEAgLTE3MCw4ICsyMDYsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBpbmRleCBvZiB0aGUgc291cmNlIGluIHRoZSBsaXN0IG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHZpc2l0ZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY3VycmVudEl0ZW1JbmRleCBUaGUgY3VycmVudCBpdGVtIGluZGV4LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3VycmVudEl0ZW1JbmRleChpbnQgY3VycmVudEl0ZW1JbmRleCkgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CiAgICAgICAgIG1DdXJyZW50SXRlbUluZGV4ID0gY3VycmVudEl0ZW1JbmRleDsKICAgICB9CiAKQEAgLTE4OCw4ICsyMjcsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBjaGFuZ2VkIHNlcXVlbmNlLgogICAgICAqCiAgICAgICogQHBhcmFtIGZyb21JbmRleCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZyb21JbmRleChpbnQgZnJvbUluZGV4KSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbUZyb21JbmRleCA9IGZyb21JbmRleDsKICAgICB9CiAKQEAgLTIwNiw4ICsyNDgsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgYWRkZWQgY2hhcmFjdGVycy4KICAgICAgKgogICAgICAqIEBwYXJhbSBhZGRlZENvdW50IFRoZSBudW1iZXIgb2YgYWRkZWQgY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFkZGVkQ291bnQoaW50IGFkZGVkQ291bnQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtQWRkZWRDb3VudCA9IGFkZGVkQ291bnQ7CiAgICAgfQogCkBAIC0yMjQsOCArMjY5LDExIEBACiAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHJlbW92ZWQgY2hhcmFjdGVycy4KICAgICAgKgogICAgICAqIEBwYXJhbSByZW1vdmVkQ291bnQgVGhlIG51bWJlciBvZiByZW1vdmVkIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVkQ291bnQoaW50IHJlbW92ZWRDb3VudCkgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CiAgICAgICAgIG1SZW1vdmVkQ291bnQgPSByZW1vdmVkQ291bnQ7CiAgICAgfQogCkBAIC0yNDIsOCArMjkwLDExIEBACiAgICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc291cmNlLgogICAgICAqCiAgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgbGFzcyBuYW1lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKENoYXJTZXF1ZW5jZSBjbGFzc05hbWUpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgIH0KIApAQCAtMjcwLDggKzMyMSwxMSBAQAogICAgICAqIFNldHMgdGhlIHRleHQgYmVmb3JlIGEgY2hhbmdlLgogICAgICAqCiAgICAgICogQHBhcmFtIGJlZm9yZVRleHQgVGhlIHRleHQgYmVmb3JlIHRoZSBjaGFuZ2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCZWZvcmVUZXh0KENoYXJTZXF1ZW5jZSBiZWZvcmVUZXh0KSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbUJlZm9yZVRleHQgPSBiZWZvcmVUZXh0OwogICAgIH0KIApAQCAtMjg4LDggKzM0MiwxMSBAQAogICAgICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzb3VyY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29udGVudERlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnREZXNjcmlwdGlvbihDaGFyU2VxdWVuY2UgY29udGVudERlc2NyaXB0aW9uKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbUNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnREZXNjcmlwdGlvbjsKICAgICB9CiAKQEAgLTMwNiwxOCArMzYzLDcxIEBACiAgICAgICogU2V0cyB0aGUge0BsaW5rIFBhcmNlbGFibGV9IGRhdGEgb2YgdGhlIGV2ZW50LgogICAgICAqCiAgICAgICogQHBhcmFtIHBhcmNlbGFibGVEYXRhIFRoZSBwYXJjZWxhYmxlIGRhdGEuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXJjZWxhYmxlRGF0YShQYXJjZWxhYmxlIHBhcmNlbGFibGVEYXRhKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbVBhcmNlbGFibGVEYXRhID0gcGFyY2VsYWJsZURhdGE7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyBpZiB0aGlzIGluc3RhbmNlIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWFsZWQgV2hldGhlciBpcyBzZWFsZWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlYWxlZChib29sZWFuIHNlYWxlZCkgeworICAgICAgICBtU2VhbGVkID0gc2VhbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgaWYgdGhpcyBpbnN0YW5jZSBpcyBzZWFsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgaXMgc2VhbGVkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlYWxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TZWFsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5mb3JjZXMgdGhhdCB0aGlzIGluc3RhbmNlIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHRoaXMgaW5zdGFuY2UgaXMgbm90IHNlYWxlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZW5mb3JjZVNlYWxlZCgpIHsKKyAgICAgICAgaWYgKCFpc1NlYWxlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgcGVyZm9ybSB0aGlzICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYWN0aW9uIG9uIGEgbm90IHNlYWxlZCBpbnN0YW5jZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZm9yY2VzIHRoYXQgdGhpcyBpbnN0YW5jZSBpcyBub3Qgc2VhbGVkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhpcyBpbnN0YW5jZSBpcyBzZWFsZWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGVuZm9yY2VOb3RTZWFsZWQoKSB7CisgICAgICAgIGlmIChpc1NlYWxlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgcGVyZm9ybSB0aGlzICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYWN0aW9uIG9uIGFuIHNlYWxlZCBpbnN0YW5jZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgYm9vbGVhbiBwcm9wZXJ0eS4KICAgICAgKgogICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkuCiAgICAgICogQHJldHVybiBUaGUgdmFsdWUuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KGludCBwcm9wZXJ0eSkgeworICAgIHByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoaW50IHByb3BlcnR5KSB7CiAgICAgICAgIHJldHVybiAobUJvb2xlYW5Qcm9wZXJ0aWVzICYgcHJvcGVydHkpID09IHByb3BlcnR5OwogICAgIH0KIApAQCAtMzM3LDYgKzQ0NywxOSBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGNhY2hlZCBpbnN0YW5jZSBpZiBzdWNoIGlzIGF2YWlsYWJsZSBvciBhIG5ldyBvbmUgaXMKKyAgICAgKiBpbnN0YW50aWF0ZWQuIFRoZSBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCB3aXRoIGRhdGEgZnJvbSB0aGUKKyAgICAgKiBnaXZlbiByZWNvcmQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eVJlY29yZCBvYnRhaW4oQWNjZXNzaWJpbGl0eVJlY29yZCByZWNvcmQpIHsKKyAgICAgICBBY2Nlc3NpYmlsaXR5UmVjb3JkIGNsb25lID0gQWNjZXNzaWJpbGl0eVJlY29yZC5vYnRhaW4oKTsKKyAgICAgICBjbG9uZS5pbml0KHJlY29yZCk7CisgICAgICAgcmV0dXJuIGNsb25lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjYWNoZWQgaW5zdGFuY2UgaWYgc3VjaCBpcyBhdmFpbGFibGUgb3IgYSBuZXcgb25lIGlzCiAgICAgICogaW5zdGFudGlhdGVkLgogICAgICAqCiAgICAgICogQHJldHVybiBBbiBpbnN0YW5jZS4KQEAgLTM3OSw4ICs1MDIsMTEgQEAKIAogICAgIC8qKgogICAgICAqIENsZWFycyB0aGUgc3RhdGUgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1TZWFsZWQgPSBmYWxzZTsKICAgICAgICAgbUJvb2xlYW5Qcm9wZXJ0aWVzID0gMDsKICAgICAgICAgbUN1cnJlbnRJdGVtSW5kZXggPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICBtSXRlbUNvdW50ID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbi5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkY2QwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbi5haWRsCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5OworCitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2s7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UKKyAqIGFuZCB0aGUgVmlld1Jvb3QgaW4gYSBnaXZlbiB3aW5kb3cuCisgKgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbiB7CisKKyAgICB2b2lkIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeUFjY2Vzc2liaWxpdHlJZChpbnQgYWNjZXNzaWJpbGl0eVZpZXdJZCwgaW50IGludGVyYWN0aW9uSWQsCisgICAgICAgIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spOworCisgICAgdm9pZCBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWQoaW50IGlkLCBpbnQgaW50ZXJhY3Rpb25JZCwKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICB2b2lkIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3VGV4dChTdHJpbmcgdGV4dCwgaW50IGludGVyYWN0aW9uSWQsCisgICAgICAgIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spOworCisgICAgdm9pZCBwZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbihpbnQgYWNjZXNzaWJpbGl0eUlkLCBpbnQgYWN0aW9uLCBpbnQgaW50ZXJhY3Rpb25JZCwKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjay5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2suYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzVlOGRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2suYWlkbApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eTsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBDYWxsYmFjayBmb3Igc3BlY2lmeWluZyB0aGUgcmVzdWx0IGZvciBhbiBhc3luY2hyb25vdXMgcmVxdWVzdCBtYWRlCisgKiB2aWEgY2FsbGluZyBhIG1ldGhvZCBvbiBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrLgorICoKKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayB7CisKKyAgICB2b2lkIHNldEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9SZXN1bHQoaW4gQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8sIGludCBpbnRlcmFjdGlvbklkKTsKKworICAgIHZvaWQgc2V0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NSZXN1bHQoaW4gTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IGluZm9zLAorICAgICAgICBpbnQgaW50ZXJhY3Rpb25JZCk7CisKKyAgICB2b2lkIHNldFBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uUmVzdWx0KGJvb2xlYW4gc3VjY2VlZGVkLCBpbnQgaW50ZXJhY3Rpb25JZCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKaW5kZXggYWFhYWUzMi4uYjE0ZjAyYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbApAQCAtMTcsOSArMTcsMTQgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLklFdmVudExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvdzsKIAogLyoqCiAgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSBjYWxsZWQgYnkKQEAgLTMzLDkgKzM4LDE2IEBACiAKICAgICBib29sZWFuIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoaW4gQWNjZXNzaWJpbGl0eUV2ZW50IHVpRXZlbnQpOwogCi0gICAgTGlzdDxTZXJ2aWNlSW5mbz4gZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CisgICAgTGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IGdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOwogCi0gICAgTGlzdDxTZXJ2aWNlSW5mbz4gZ2V0RW5hYmxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdChpbnQgZmVlZGJhY2tUeXBlKTsKKyAgICBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gZ2V0RW5hYmxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdChpbnQgZmVlZGJhY2tUeXBlKTsKIAogICAgIHZvaWQgaW50ZXJydXB0KCk7CisKKyAgICBpbnQgYWRkQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuLAorICAgICAgICBpbiBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uKTsKKworICAgIHZvaWQgcmVtb3ZlQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuKTsKKworICAgIElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24gcmVnaXN0ZXJFdmVudExpc3RlbmVyKElFdmVudExpc3RlbmVyIGNsaWVudCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZEluZm8uamF2YQppbmRleCAxZjc0NDFkLi5mZWU2OWUwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEKQEAgLTE0NSw3ICsxNDUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlTW9kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVFeHRyYVZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlRXh0cmFWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pc0F1eGlsaWFyeSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgICAgICAgbVN1YnR5cGVzLmFkZChzdWJ0eXBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZE1hbmFnZXIuamF2YQppbmRleCBlYTY2ZDY3Li40ZGYyMzdiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyLmphdmEKQEAgLTEwMjQsMTMgKzEwMjQsMTMgQEAKICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlNUQVJUIElOUFVUOiAiICsgdmlldyArICIgaWM9IgogICAgICAgICAgICAgICAgICAgICAgICAgKyBpYyArICIgdGJhPSIgKyB0YmEgKyAiIGluaXRpYWw9IiArIGluaXRpYWwpOwogICAgICAgICAgICAgICAgIElucHV0QmluZFJlc3VsdCByZXMgPSBtU2VydmljZS5zdGFydElucHV0KG1DbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZWRDb250ZXh0LCB0YmEsIGluaXRpYWwsIG1DdXJNZXRob2QgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZWRDb250ZXh0LCB0YmEsIGluaXRpYWwsIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU3RhcnRpbmcgaW5wdXQ6IEJpbmQgcmVzdWx0PSIgKyByZXMpOwogICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmlkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CaW5kU2VxdWVuY2UgPSByZXMuc2VxdWVuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyTWV0aG9kID0gcmVzLm1ldGhvZDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VyTWV0aG9kID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlcmUgaXMgbm8gaW5wdXQgbWV0aG9kIGF2YWlsYWJsZS4KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQUJPUlQgaW5wdXQ6IG5vIGlucHV0IG1ldGhvZCEiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RTdWJ0eXBlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kU3VidHlwZS5qYXZhCmluZGV4IGRlMzhmYmUuLjIwY2Y5M2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RTdWJ0eXBlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZFN1YnR5cGUuamF2YQpAQCAtMTcsOCArMTcsMTAgQEAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xMzcsNiArMTM5LDMxIEBACiAgICAgICAgIHJldHVybiBtSXNBdXhpbGlhcnk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aWxsIGJlIHVzZWQgZm9yIGdldHRpbmcgTG9jYWxlIGFuZCBQYWNrYWdlTWFuYWdlci4KKyAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgSU1FCisgICAgICogQHBhcmFtIGFwcEluZm8gVGhlIGFwcGxpY2F0aW9uIGluZm8gb2YgdGhlIElNRQorICAgICAqIEByZXR1cm4gYSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgc3VidHlwZS4gVGhlIHN0cmluZyByZXNvdXJjZSBvZiB0aGUgbGFiZWwgKG1TdWJ0eXBlTmFtZVJlc0lkKQorICAgICAqIGNhbiBoYXZlIG9ubHkgb25lICVzIGluIGl0LiBJZiB0aGVyZSBpcywgdGhlICVzIHBhcnQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBsb2NhbGUncworICAgICAqIGRpc3BsYXkgbmFtZSBieSB0aGUgZm9ybWF0dGVyLiBJZiB0aGVyZSBpcyBub3QsIHRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSBzdHJpbmcKKyAgICAgKiBzcGVjaWZpZWQgYnkgbVN1YnR5cGVOYW1lUmVzSWQuIElmIG1TdWJ0eXBlTmFtZVJlc0lkIGlzIG5vdCBzcGVjaWZpZWQgKD09IDApLCBpdCdzIHVwIHRvIHRoZQorICAgICAqIGZyYW1ld29yayB0byBnZW5lcmF0ZSBhbiBhcHByb3ByaWF0ZSBkaXNwbGF5IG5hbWUuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXREaXNwbGF5TmFtZSgKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBBcHBsaWNhdGlvbkluZm8gYXBwSW5mbykgeworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkubG9jYWxlLmdldERpc3BsYXlOYW1lKCk7CisgICAgICAgIGlmIChtU3VidHlwZU5hbWVSZXNJZCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbG9jYWxlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBzdWJ0eXBlTmFtZSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRUZXh0KAorICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBtU3VidHlwZU5hbWVSZXNJZCwgYXBwSW5mbykudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzdWJ0eXBlTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KHN1YnR5cGVOYW1lLCBsb2NhbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RXh0cmFWYWx1ZUhhc2hNYXAoKSB7CiAgICAgICAgIGlmIChtRXh0cmFWYWx1ZUhhc2hNYXBDYWNoZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBtRXh0cmFWYWx1ZUhhc2hNYXBDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RhdGFMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EYXRhTG9hZGVyLmphdmEKaW5kZXggMjM1ZGM1YmUuLmU4ZDkwNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EYXRhTG9hZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RhdGFMb2FkZXIuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuQmFzZTY0OworaW1wb3J0IGxpYmNvcmUuaW8uQmFzZTY0OwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBTdHJlYW1Mb2FkZXIgdGhhdCB1c2VzIHRoZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9GdWxsU2NyZWVuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb0Z1bGxTY3JlZW4uamF2YQppbmRleCAxMDA0YjVmLi41N2NkYTk3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb0Z1bGxTY3JlZW4uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb0Z1bGxTY3JlZW4uamF2YQpAQCAtMTk5LDYgKzE5OSw5IEBACiAgICAgICAgIG1WaWRlb1N1cmZhY2VWaWV3LmdldEhvbGRlcigpLnNldEZpeGVkU2l6ZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBmdWxsU2NyZWVuRXhpdGVkKCkgeworICAgICAgICByZXR1cm4gKG1MYXlvdXQgPT0gbnVsbCk7CisgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJDaHJvbWVDbGllbnQuQ3VzdG9tVmlld0NhbGxiYWNrIG1DYWxsYmFjayA9CiAgICAgICAgIG5ldyBXZWJDaHJvbWVDbGllbnQuQ3VzdG9tVmlld0NhbGxiYWNrKCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9JbmxpbmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvSW5saW5lLmphdmEKaW5kZXggMjU5MjFiYy4uZWYxOTA2YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9JbmxpbmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb0lubGluZS5qYXZhCkBAIC0xMiwxMCArMTIsMTUgQEAKICAqLwogcHVibGljIGNsYXNzIEhUTUw1VmlkZW9JbmxpbmUgZXh0ZW5kcyBIVE1MNVZpZGVvVmlld3sKIAotICAgIC8vIER1ZSB0byB0aGUgZmFjdCB0aGF0IFN1cmZhY2VUZXh0dXJlIGNvbnN1bWUgYSBsb3Qgb2YgbWVtb3J5LCB3ZSBtYWtlIGl0Ci0gICAgLy8gYXMgc3RhdGljLiBtX3RleHR1cmVOYW1lcyBpcyB0aGUgdGV4dHVyZSBib3VuZCB3aXRoIHRoaXMgU3VyZmFjZVRleHR1cmUuCisgICAgLy8gRHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGRlY29kZXIgY29uc3VtZSBhIGxvdCBvZiBtZW1vcnksIHdlIG1ha2UgdGhlCisgICAgLy8gc3VyZmFjZSB0ZXh0dXJlIGFzIHNpbmdsZXRvbi4gQnV0IHRoZSBHTCB0ZXh0dXJlIChtX3RleHR1cmVOYW1lcykKKyAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cmZhY2UgdGV4dHVyZSBjYW4gYmUgdXNlZCBmb3Igc2hvd2luZyB0aGUgc2NyZWVuCisgICAgLy8gc2hvdCB3aGVuIHBhdXNlZCwgc28gdGhleSBhcmUgbm90IHNpbmdsZXRvbi4KICAgICBwcml2YXRlIHN0YXRpYyBTdXJmYWNlVGV4dHVyZSBtU3VyZmFjZVRleHR1cmUgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIGludFtdIG1UZXh0dXJlTmFtZXM7CisgICAgcHJpdmF0ZSBpbnRbXSBtVGV4dHVyZU5hbWVzOworICAgIC8vIEV2ZXJ5IHRpbWUgd2hlbiB0aGUgVmlkZW9MYXllciBJZCBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlCisgICAgLy8gU3VyZmFjZVRleHR1cmUgaW4gb3JkZXIgdG8gZGVsZXRlIHRoZSBvbGQgdmlkZW8ncyBkZWNvZGVyIG1lbW9yeS4KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbVZpZGVvTGF5ZXJVc2luZ1N1cmZhY2VUZXh0dXJlID0gLTE7CiAKICAgICAvLyBWaWRlbyBjb250cm9sIEZVTkNUSU9OUzoKICAgICBAT3ZlcnJpZGUKQEAgLTI4LDExICszMywxMiBAQAogICAgIEhUTUw1VmlkZW9JbmxpbmUoaW50IHZpZGVvTGF5ZXJJZCwgaW50IHBvc2l0aW9uLAogICAgICAgICAgICAgYm9vbGVhbiBhdXRvU3RhcnQpIHsKICAgICAgICAgaW5pdCh2aWRlb0xheWVySWQsIHBvc2l0aW9uLCBhdXRvU3RhcnQpOworICAgICAgICBtVGV4dHVyZU5hbWVzID0gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkZWNpZGVEaXNwbGF5TW9kZSgpIHsKLSAgICAgICAgbVBsYXllci5zZXRUZXh0dXJlKGdldFN1cmZhY2VUZXh0dXJlSW5zdGFuY2UoKSk7CisgICAgICAgIG1QbGF5ZXIuc2V0VGV4dHVyZShnZXRTdXJmYWNlVGV4dHVyZShnZXRWaWRlb0xheWVySWQoKSkpOwogICAgIH0KIAogICAgIC8vIE5vcm1hbGx5IGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBzZXRWaWRlb1VSSS4gQnV0IGZvciBmdWxsIHNjcmVlbiwKQEAgLTUyLDMxICs1OCwzOCBAQAogICAgIC8vIElubGluZSBWaWRlbyBzcGVjaWZpYyBGVU5DVElPTlM6CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3VyZmFjZVRleHR1cmUgZ2V0U3VyZmFjZVRleHR1cmUoKSB7CisgICAgcHVibGljIFN1cmZhY2VUZXh0dXJlIGdldFN1cmZhY2VUZXh0dXJlKGludCB2aWRlb0xheWVySWQpIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBzdXJmYWNlIHRleHR1cmUuCisgICAgICAgIGlmICh2aWRlb0xheWVySWQgIT0gbVZpZGVvTGF5ZXJVc2luZ1N1cmZhY2VUZXh0dXJlCisgICAgICAgICAgICB8fCBtU3VyZmFjZVRleHR1cmUgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1UZXh0dXJlTmFtZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UZXh0dXJlTmFtZXMgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIEdMRVMyMC5nbEdlblRleHR1cmVzKDEsIG1UZXh0dXJlTmFtZXMsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gbmV3IFN1cmZhY2VUZXh0dXJlKG1UZXh0dXJlTmFtZXNbMF0pOworICAgICAgICB9CisgICAgICAgIG1WaWRlb0xheWVyVXNpbmdTdXJmYWNlVGV4dHVyZSA9IHZpZGVvTGF5ZXJJZDsKICAgICAgICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXJmYWNlVGV4dHVyZURlbGV0ZWQoKSB7CisgICAgICAgIHJldHVybiAobVN1cmZhY2VUZXh0dXJlID09IG51bGwpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVN1cmZhY2VUZXh0dXJlKCkgewogICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBudWxsOworICAgICAgICBtVmlkZW9MYXllclVzaW5nU3VyZmFjZVRleHR1cmUgPSAtMTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFN1cmZhY2VUZXh0dXJlIGlzIGEgc2luZ2xldG9uIGhlcmUgLCB0b28KLSAgICBwcml2YXRlIFN1cmZhY2VUZXh0dXJlIGdldFN1cmZhY2VUZXh0dXJlSW5zdGFuY2UoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgc3VyZmFjZSB0ZXh0dXJlLgotICAgICAgICBpZiAobVN1cmZhY2VUZXh0dXJlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1UZXh0dXJlTmFtZXMgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgR0xFUzIwLmdsR2VuVGV4dHVyZXMoMSwgbVRleHR1cmVOYW1lcywgMCk7Ci0gICAgICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBuZXcgU3VyZmFjZVRleHR1cmUobVRleHR1cmVOYW1lc1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFRleHR1cmVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVRleHR1cmVOYW1lc1swXTsKKyAgICAgICAgaWYgKG1UZXh0dXJlTmFtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXh0dXJlTmFtZXNbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKFN1cmZhY2VUZXh0dXJlLk9uRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvVmlldy5qYXZhCmluZGV4IGMwNTQ5OGEuLjU5ODNhNDQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvVmlldy5qYXZhCkBAIC0yODcsNyArMjg3LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHB1YmxpYyBTdXJmYWNlVGV4dHVyZSBnZXRTdXJmYWNlVGV4dHVyZSgpIHsKKyAgICBwdWJsaWMgU3VyZmFjZVRleHR1cmUgZ2V0U3VyZmFjZVRleHR1cmUoaW50IHZpZGVvTGF5ZXJJZCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTMxNSw0ICszMTUsMTQgQEAKICAgICAgICAgLy8gT25seSB1c2VkIGluIEhUTUw1VmlkZW9GdWxsU2NyZWVuCiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gc3VyZmFjZVRleHR1cmVEZWxldGVkKCkgeworICAgICAgICAvLyBPbmx5IG1lYW5pbmdmdWwgZm9yIEhUTUw1VmlkZW9JbmxpbmUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGZ1bGxTY3JlZW5FeGl0ZWQoKSB7CisgICAgICAgIC8vIE9ubHkgbWVhbmluZ2Z1bCBmb3IgSFRNTDVWaWRlb0Z1bGxTY3JlZW4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9WaWV3UHJveHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvVmlld1Byb3h5LmphdmEKaW5kZXggN2Q4NjY5YmYuLmQwMjM3YjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvVmlld1Byb3h5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9WaWV3UHJveHkuamF2YQpAQCAtMTA2LDEyICsxMDYsMTQgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJhc2VMYXllcihpbnQgbGF5ZXIpIHsKICAgICAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgZm9yIGZ1bGwgc2NyZWVuIG1vZGUuCiAgICAgICAgICAgICBpZiAobUhUTUw1VmlkZW9WaWV3ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIW1IVE1MNVZpZGVvVmlldy5pc0Z1bGxTY3JlZW5Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAmJiAhbUhUTUw1VmlkZW9WaWV3LmlzRnVsbFNjcmVlbk1vZGUoKQorICAgICAgICAgICAgICAgICYmICFtSFRNTDVWaWRlb1ZpZXcuc3VyZmFjZVRleHR1cmVEZWxldGVkKCkpIHsKICAgICAgICAgICAgICAgICBtQmFzZUxheWVyID0gbGF5ZXI7Ci0gICAgICAgICAgICAgICAgU3VyZmFjZVRleHR1cmUgc3VyZlRleHR1cmUgPSBtSFRNTDVWaWRlb1ZpZXcuZ2V0U3VyZmFjZVRleHR1cmUoKTsKLSAgICAgICAgICAgICAgICBpbnQgdGV4dHVyZU5hbWUgPSBtSFRNTDVWaWRlb1ZpZXcuZ2V0VGV4dHVyZU5hbWUoKTsKIAogICAgICAgICAgICAgICAgIGludCBjdXJyZW50VmlkZW9MYXllcklkID0gbUhUTUw1VmlkZW9WaWV3LmdldFZpZGVvTGF5ZXJJZCgpOworICAgICAgICAgICAgICAgIFN1cmZhY2VUZXh0dXJlIHN1cmZUZXh0dXJlID0gbUhUTUw1VmlkZW9WaWV3LmdldFN1cmZhY2VUZXh0dXJlKGN1cnJlbnRWaWRlb0xheWVySWQpOworICAgICAgICAgICAgICAgIGludCB0ZXh0dXJlTmFtZSA9IG1IVE1MNVZpZGVvVmlldy5nZXRUZXh0dXJlTmFtZSgpOworCiAgICAgICAgICAgICAgICAgaWYgKGxheWVyICE9IDAgJiYgc3VyZlRleHR1cmUgIT0gbnVsbCAmJiBjdXJyZW50VmlkZW9MYXllcklkICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5ZXJTdGF0ZSA9IG1IVE1MNVZpZGVvVmlldy5nZXRDdXJyZW50U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1IVE1MNVZpZGVvVmlldy5nZXRQbGF5ZXJCdWZmZXJpbmcoKSkKQEAgLTE3MSwxNCArMTczLDEyIEBACiAgICAgICAgICAgICBib29sZWFuIGJhY2tGcm9tRnVsbFNjcmVlbk1vZGUgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChtSFRNTDVWaWRlb1ZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGN1cnJlbnRWaWRlb0xheWVySWQgPSBtSFRNTDVWaWRlb1ZpZXcuZ2V0VmlkZW9MYXllcklkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1IVE1MNVZpZGVvVmlldyBpbnN0YW5jZW9mIEhUTUw1VmlkZW9GdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhY2tGcm9tRnVsbFNjcmVlbk1vZGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiYWNrRnJvbUZ1bGxTY3JlZW5Nb2RlID0gbUhUTUw1VmlkZW9WaWV3LmZ1bGxTY3JlZW5FeGl0ZWQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGJhY2tGcm9tRnVsbFNjcmVlbk1vZGUKLSAgICAgICAgICAgICAgICB8fCAgY3VycmVudFZpZGVvTGF5ZXJJZCAhPSB2aWRlb0xheWVySWQKLSAgICAgICAgICAgICAgICB8fCBtSFRNTDVWaWRlb1ZpZXcuZ2V0U3VyZmFjZVRleHR1cmUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgfHwgY3VycmVudFZpZGVvTGF5ZXJJZCAhPSB2aWRlb0xheWVySWQKKyAgICAgICAgICAgICAgICB8fCBtSFRNTDVWaWRlb1ZpZXcuc3VyZmFjZVRleHR1cmVEZWxldGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBzd2l0Y2hpbmcgdG8gYSBuZXcgdmlkZW8sCiAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIGluc2lkZSBhIFdlYlZpZXcgb3IgYWNyb3NzIFdlYlZpZXdzCiAgICAgICAgICAgICAgICAgLy8gRm9yIHN3aXRjaGluZyB2aWRlb3Mgd2l0aGluIGEgV2ViVmlldyBvciBhY3Jvc3MgdGhlIFdlYlZpZXcsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKaW5kZXggMTIzOTFkZi4uNWI3ODU4NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHlQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtMjk0LDYgKzI5NSwyMCBAQAogICAgICAgICBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAucHV0KGNvbnRlbnRVcmksIHBhdGgpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3h5KFByb3h5UHJvcGVydGllcyBwcm94eVByb3BlcnRpZXMpIHsKKyAgICAgICAgaWYgKHByb3h5UHJvcGVydGllcyA9PSBudWxsKSB7CisgICAgICAgICAgICBuYXRpdmVVcGRhdGVQcm94eSgiIiwgIiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBwcm94eVByb3BlcnRpZXMuZ2V0SG9zdCgpOworICAgICAgICBpbnQgcG9ydCA9IHByb3h5UHJvcGVydGllcy5nZXRQb3J0KCk7CisgICAgICAgIGlmIChwb3J0ICE9IDApCisgICAgICAgICAgICBob3N0ICs9ICI6IiArIHBvcnQ7CisKKyAgICAgICAgbmF0aXZlVXBkYXRlUHJveHkoaG9zdCwgcHJveHlQcm9wZXJ0aWVzLmdldEV4Y2x1c2lvbkxpc3QoKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDb25zdHJ1Y3RvcigpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlRmluYWxpemUoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNoYXJlZFRpbWVyRmlyZWQoKTsKQEAgLTMwNCw1ICszMTksNSBAQAogICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBhZGRQYWNrYWdlTmFtZXMoU2V0PFN0cmluZz4gcGFja2FnZU5hbWVzKTsKICAgICBwdWJsaWMgbmF0aXZlIHZvaWQgYWRkUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKTsKICAgICBwdWJsaWMgbmF0aXZlIHZvaWQgcmVtb3ZlUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKTsKLSAgICBwdWJsaWMgbmF0aXZlIHZvaWQgdXBkYXRlUHJveHkoU3RyaW5nIG5ld1Byb3h5KTsKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgbmF0aXZlVXBkYXRlUHJveHkoU3RyaW5nIG5ld1Byb3h5LCBTdHJpbmcgZXhjbHVzaW9uTGlzdCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luRnVsbFNjcmVlbkhvbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbkZ1bGxTY3JlZW5Ib2xkZXIuamF2YQppbmRleCBhZTMyNmQ1Li40MmJhN2M5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luRnVsbFNjcmVlbkhvbGRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5GdWxsU2NyZWVuSG9sZGVyLmphdmEKQEAgLTI0LDM0ICsyNCw0NCBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiAKLWNsYXNzIFBsdWdpbkZ1bGxTY3JlZW5Ib2xkZXIgZXh0ZW5kcyBEaWFsb2cgeworY2xhc3MgUGx1Z2luRnVsbFNjcmVlbkhvbGRlciB7CiAKICAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU5wcDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtT3JpZW50YXRpb247CisKKyAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgcGx1Z2luIHZpZXcKKyAgICBwcml2YXRlIHN0YXRpYyBDdXN0b21GcmFtZUxheW91dCBtTGF5b3V0OworCiAgICAgcHJpdmF0ZSBWaWV3IG1Db250ZW50VmlldzsKIAotICAgIFBsdWdpbkZ1bGxTY3JlZW5Ib2xkZXIoV2ViVmlldyB3ZWJWaWV3LCBpbnQgbnBwKSB7Ci0gICAgICAgIHN1cGVyKHdlYlZpZXcuZ2V0Q29udGV4dCgpLCBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfTm9UaXRsZUJhcl9GdWxsc2NyZWVuKTsKKyAgICBQbHVnaW5GdWxsU2NyZWVuSG9sZGVyKFdlYlZpZXcgd2ViVmlldywgaW50IG9yaWVudGF0aW9uLCBpbnQgbnBwKSB7CiAgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKICAgICAgICAgbU5wcCA9IG5wcDsKKyAgICAgICAgbU9yaWVudGF0aW9uID0gb3JpZW50YXRpb247CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoVmlldyBjb250ZW50VmlldykgewotICAgICAgICAvLyBhcyB3ZSBhcmUgc2hhcmluZyB0aGUgVmlldyBiZXR3ZWVuIGZ1bGwgc2NyZWVuIGFuZAotICAgICAgICAvLyBlbWJlZGRlZCBtb2RlLCB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUKLSAgICAgICAgLy8gQWJzb2x1dGVMYXlvdXQuTGF5b3V0UGFyYW1zIHNldCBieSBlbWJlZGRlZCBtb2RlIHRvCi0gICAgICAgIC8vIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgZGlhbG9nCi0gICAgICAgIGNvbnRlbnRWaWV3LnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworCisgICAgICAgIC8vIENyZWF0ZSBhIEZyYW1lTGF5b3V0IHRoYXQgd2lsbCBjb250YWluIHRoZSBwbHVnaW4ncyB2aWV3CisgICAgICAgIG1MYXlvdXQgPSBuZXcgQ3VzdG9tRnJhbWVMYXlvdXQobVdlYlZpZXcuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zIGxheW91dFBhcmFtcyA9IG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3Jhdml0eS5DRU5URVIpOworCisgICAgICAgIG1MYXlvdXQuYWRkVmlldyhjb250ZW50VmlldywgbGF5b3V0UGFyYW1zKTsKKyAgICAgICAgbUxheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisKICAgICAgICAgLy8gZml4ZWQgc2l6ZSBpcyBvbmx5IHVzZWQgZWl0aGVyIGR1cmluZyBwaW5jaCB6b29tIG9yIHN1cmZhY2UgaXMgdG9vCiAgICAgICAgIC8vIGJpZy4gTWFrZSBzdXJlIGl0IGlzIG5vdCBmaXhlZCBzaXplIGJlZm9yZSBzZXR0aW5nIGl0IHRvIHRoZSBmdWxsCiAgICAgICAgIC8vIHNjcmVlbiBjb250ZW50IHZpZXcuIFRoZSBTdXJmYWNlVmlldyB3aWxsIGJlIHNldCB0byB0aGUgY29ycmVjdCBtb2RlCkBAIC02Miw1OSArNzIsNzkgQEAKICAgICAgICAgICAgICAgICBzVmlldy5nZXRIb2xkZXIoKS5zZXRTaXplRnJvbUxheW91dCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldENvbnRlbnRWaWV3KGNvbnRlbnRWaWV3KTsKKwogICAgICAgICBtQ29udGVudFZpZXcgPSBjb250ZW50VmlldzsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkJhY2tQcmVzc2VkKCkgewotICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZShXZWJWaWV3LkhJREVfRlVMTFNDUkVFTikKLSAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgLy8gT3RoZXIgcGx1Z2lucyBtYXkgYXR0ZW1wdCB0byBkcmF3IHNvIGhpZGUgdGhlbSB3aGlsZSB3ZSdyZSBhY3RpdmUuCisgICAgICAgIGlmIChtV2ViVmlldy5nZXRWaWV3TWFuYWdlcigpICE9IG51bGwpCisgICAgICAgICAgICBtV2ViVmlldy5nZXRWaWV3TWFuYWdlcigpLmhpZGVBbGwoKTsKKworICAgICAgICBXZWJDaHJvbWVDbGllbnQgY2xpZW50ID0gbVdlYlZpZXcuZ2V0V2ViQ2hyb21lQ2xpZW50KCk7CisgICAgICAgIGNsaWVudC5vblNob3dDdXN0b21WaWV3KG1MYXlvdXQsIG1PcmllbnRhdGlvbiwgbUNhbGxiYWNrKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBXZWJDaHJvbWVDbGllbnQgY2xpZW50ID0gbVdlYlZpZXcuZ2V0V2ViQ2hyb21lQ2xpZW50KCk7CisgICAgICAgIGNsaWVudC5vbkhpZGVDdXN0b21WaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDdXN0b21GcmFtZUxheW91dCBleHRlbmRzIEZyYW1lTGF5b3V0IHsKKworICAgICAgICBDdXN0b21GcmFtZUxheW91dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwogICAgICAgICB9Ci0gICAgICAgIG1XZWJWaWV3Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgIC8vIGFsd2F5cyByZXR1cm4gdHJ1ZSBhcyB3ZSBhcmUgdGhlIGhhbmRsZXIKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtV2ViVmlldy5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgLy8gYWx3YXlzIHJldHVybiB0cnVlIGFzIHdlIGFyZSB0aGUgaGFuZGxlcgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgbVdlYlZpZXcub25LZXlVcChrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgIC8vIGFsd2F5cyByZXR1cm4gdHJ1ZSBhcyB3ZSBhcmUgdGhlIGhhbmRsZXIKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIGFsd2F5cyByZXR1cm4gdHJ1ZSBhcyB3ZSBkb24ndCB3YW50IHRoZSBldmVudCB0byBwcm9wYWdhdGUgYW55IGZ1cnRoZXIKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBtV2ViVmlldy5vblRyYWNrYmFsbEV2ZW50KGV2ZW50KTsKLSAgICAgICAgLy8gYWx3YXlzIHJldHVybiB0cnVlIGFzIHdlIGFyZSB0aGUgaGFuZGxlcgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICAvLyBtYW51YWxseSByZW1vdmUgdGhlIGNvbnRlbnRWaWV3J3MgcGFyZW50IHNpbmNlIHRoZSBkaWFsb2cgZG9lcyBub3QKLSAgICAgICAgaWYgKG1Db250ZW50VmlldyAhPSBudWxsICYmIG1Db250ZW50Vmlldy5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBWaWV3R3JvdXAgdmcgPSAoVmlld0dyb3VwKSBtQ29udGVudFZpZXcuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICB2Zy5yZW1vdmVWaWV3KG1Db250ZW50Vmlldyk7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25LZXlVcChrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtV2ViVmlldy5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgICAgIC8vIGFsd2F5cyByZXR1cm4gdHJ1ZSBhcyB3ZSBhcmUgdGhlIGhhbmRsZXIKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIG1XZWJWaWV3LmdldFdlYlZpZXdDb3JlKCkuc2VuZE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuRXZlbnRIdWIuSElERV9GVUxMU0NSRUVOLCBtTnBwLCAwKTsKLSAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgLy8gYWx3YXlzIHJldHVybiB0cnVlIGFzIHdlIGRvbid0IHdhbnQgdGhlIGV2ZW50IHRvIHByb3BhZ2F0ZSBhbnkgZnVydGhlcgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgbVdlYlZpZXcub25UcmFja2JhbGxFdmVudChldmVudCk7CisgICAgICAgICAgICAvLyBhbHdheXMgcmV0dXJuIHRydWUgYXMgd2UgYXJlIHRoZSBoYW5kbGVyCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIFdlYkNocm9tZUNsaWVudC5DdXN0b21WaWV3Q2FsbGJhY2sgbUNhbGxiYWNrID0KKyAgICAgICAgbmV3IFdlYkNocm9tZUNsaWVudC5DdXN0b21WaWV3Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbVZpZXdIaWRkZW4oKSB7CisKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZShXZWJWaWV3LkhJREVfRlVMTFNDUkVFTikKKyAgICAgICAgICAgICAgICAgICAgLnNlbmRUb1RhcmdldCgpOworCisgICAgICAgICAgICAgICAgbVdlYlZpZXcuZ2V0V2ViVmlld0NvcmUoKS5zZW5kTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLkV2ZW50SHViLkhJREVfRlVMTFNDUkVFTiwgbU5wcCwgMCk7CisKKyAgICAgICAgICAgICAgICBtTGF5b3V0LnJlbW92ZVZpZXcobUNvbnRlbnRWaWV3KTsKKyAgICAgICAgICAgICAgICBtTGF5b3V0ID0gbnVsbDsKKworICAgICAgICAgICAgICAgIC8vIFJlIGVuYWJsZSBwbHVnaW4gdmlld3MuCisgICAgICAgICAgICAgICAgbVdlYlZpZXcuZ2V0Vmlld01hbmFnZXIoKS5zaG93QWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvVmlld1N0YXRlU2VyaWFsaXplci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1ZpZXdTdGF0ZVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmM3NmZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1ZpZXdTdGF0ZVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkRyYXdEYXRhOworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBAaGlkZQorICovCitjbGFzcyBWaWV3U3RhdGVTZXJpYWxpemVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXT1JLSU5HX1NUUkVBTV9TVE9SQUdFID0gMTYgKiAxMDI0OworCisgICAgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OID0gMTsKKworICAgIHN0YXRpYyBib29sZWFuIHNlcmlhbGl6ZVZpZXdTdGF0ZShPdXRwdXRTdHJlYW0gc3RyZWFtLCBXZWJWaWV3IHdlYikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgZG9zLndyaXRlSW50KFZFUlNJT04pOworICAgICAgICBkb3Mud3JpdGVJbnQod2ViLmdldENvbnRlbnRXaWR0aCgpKTsKKyAgICAgICAgZG9zLndyaXRlSW50KHdlYi5nZXRDb250ZW50SGVpZ2h0KCkpOworICAgICAgICByZXR1cm4gbmF0aXZlU2VyaWFsaXplVmlld1N0YXRlKHdlYi5nZXRCYXNlTGF5ZXIoKSwgZG9zLAorICAgICAgICAgICAgICAgIG5ldyBieXRlW1dPUktJTkdfU1RSRUFNX1NUT1JBR0VdKTsKKyAgICB9CisKKyAgICBzdGF0aWMgRHJhd0RhdGEgZGVzZXJpYWxpemVWaWV3U3RhdGUoSW5wdXRTdHJlYW0gc3RyZWFtLCBXZWJWaWV3IHdlYikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKHN0cmVhbSk7CisgICAgICAgIGludCB2ZXJzaW9uID0gZGlzLnJlYWRJbnQoKTsKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHZlcnNpb246ICIgKyB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgY29udGVudFdpZHRoID0gZGlzLnJlYWRJbnQoKTsKKyAgICAgICAgaW50IGNvbnRlbnRIZWlnaHQgPSBkaXMucmVhZEludCgpOworICAgICAgICBpbnQgYmFzZUxheWVyID0gbmF0aXZlRGVzZXJpYWxpemVWaWV3U3RhdGUoZGlzLAorICAgICAgICAgICAgICAgIG5ldyBieXRlW1dPUktJTkdfU1RSRUFNX1NUT1JBR0VdKTsKKworICAgICAgICBmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3ID0gbmV3IFdlYlZpZXdDb3JlLkRyYXdEYXRhKCk7CisgICAgICAgIGRyYXcubVZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgaW50IHZpZXdXaWR0aCA9IHdlYi5nZXRWaWV3V2lkdGgoKTsKKyAgICAgICAgaW50IHZpZXdIZWlnaHQgPSB3ZWIuZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC0gd2ViLmdldFRpdGxlSGVpZ2h0KCk7CisgICAgICAgIGRyYXcubVZpZXdTaXplID0gbmV3IFBvaW50KHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIGRyYXcubUNvbnRlbnRTaXplID0gbmV3IFBvaW50KGNvbnRlbnRXaWR0aCwgY29udGVudEhlaWdodCk7CisgICAgICAgIGRyYXcubVZpZXdTdGF0ZS5tRGVmYXVsdFNjYWxlID0gd2ViLmdldERlZmF1bHRab29tU2NhbGUoKTsKKyAgICAgICAgZHJhdy5tQmFzZUxheWVyID0gYmFzZUxheWVyOworICAgICAgICBkcmF3Lm1JbnZhbFJlZ2lvbiA9IG5ldyBSZWdpb24oMCwgMCwgY29udGVudFdpZHRoLCBjb250ZW50SGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGRyYXc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlU2VyaWFsaXplVmlld1N0YXRlKGludCBiYXNlTGF5ZXIsCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3RyZWFtLCBieXRlW10gc3RvcmFnZSk7CisKKyAgICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQmFzZUxheWVyCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVEZXNlcmlhbGl6ZVZpZXdTdGF0ZSgKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSwgYnl0ZVtdIHN0b3JhZ2UpOworCisgICAgcHJpdmF0ZSBWaWV3U3RhdGVTZXJpYWxpemVyKCkge30KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQppbmRleCA3NTUzNjZjLi5hZTQwZGVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CkBAIC03Nyw2ICs3OCwxOCBAQAogCiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSB3b3VsZAorICAgICAqIGxpa2UgdG8gc2hvdyBhIGN1c3RvbSBWaWV3IGluIGEgcGFydGljdWxhciBvcmllbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmlldyBpcyB0aGUgVmlldyBvYmplY3QgdG8gYmUgc2hvd24uCisgICAgICogQHBhcmFtIHJlcXVlc3RlZE9yaWVudGF0aW9uIEFuIG9yaWVudGF0aW9uIGNvbnN0YW50IGFzIHVzZWQgaW4KKyAgICAgKiB7QGxpbmsgQWN0aXZpdHlJbmZvI3NjcmVlbk9yaWVudGF0aW9uIEFjdGl2aXR5SW5mby5zY3JlZW5PcmllbnRhdGlvbn0uCisgICAgICogQHBhcmFtIGNhbGxiYWNrIGlzIHRoZSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGlmIGFuZCB3aGVuIHRoZSB2aWV3CisgICAgICogaXMgZGlzbWlzc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2hvd0N1c3RvbVZpZXcoVmlldyB2aWV3LCBpbnQgcmVxdWVzdGVkT3JpZW50YXRpb24sCisgICAgICAgICAgICBDdXN0b21WaWV3Q2FsbGJhY2sgY2FsbGJhY2spIHt9OworICAgIAorICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHRoZSBjdXJyZW50IHBhZ2Ugd291bGQKICAgICAgKiBsaWtlIHRvIGhpZGUgaXRzIGN1c3RvbSB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uSGlkZUN1c3RvbVZpZXcoKSB7fQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YQppbmRleCA3ZjRmMTAzLi5kNTQyMzBjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5EeW5hbWljTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LklucHV0VHlwZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKQEAgLTg1Myw3ICs4NTQsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXJDdXN0b20oQXV0b0NvbXBsZXRlQWRhcHRlciBhZGFwdGVyKSB7CiAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHNldElucHV0VHlwZShnZXRJbnB1dFR5cGUoKQotICAgICAgICAgICAgICAgICAgICB8IEVkaXRvckluZm8uVFlQRV9URVhUX0ZMQUdfQVVUT19DT01QTEVURSk7CisgICAgICAgICAgICAgICAgICAgIHwgSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0FVVE9fQ09NUExFVEUpOwogICAgICAgICAgICAgYWRhcHRlci5zZXRUZXh0Vmlldyh0aGlzKTsKICAgICAgICAgICAgIGlmIChtQXV0b0ZpbGxhYmxlKSB7CiAgICAgICAgICAgICAgICAgc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcih0aGlzKTsKQEAgLTkzNCw3ICs5MzUsNyBAQAogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRJblBhc3N3b3JkKGJvb2xlYW4gaW5QYXNzd29yZCkgewogICAgICAgICBpZiAoaW5QYXNzd29yZCkgewotICAgICAgICAgICAgc2V0SW5wdXRUeXBlKEVkaXRvckluZm8uVFlQRV9DTEFTU19URVhUIHwgRWRpdG9ySW5mby4KKyAgICAgICAgICAgIHNldElucHV0VHlwZShJbnB1dFR5cGUuVFlQRV9DTEFTU19URVhUIHwgRWRpdG9ySW5mby4KICAgICAgICAgICAgICAgICBUWVBFX1RFWFRfVkFSSUFUSU9OX1dFQl9QQVNTV09SRCk7CiAgICAgICAgICAgICBjcmVhdGVCYWNrZ3JvdW5kKCk7CiAgICAgICAgIH0KQEAgLTExNDYsOCArMTE0Nyw4IEBACiAgICAgICAgIGJvb2xlYW4gc2luZ2xlID0gdHJ1ZTsKICAgICAgICAgYm9vbGVhbiBpblBhc3N3b3JkID0gZmFsc2U7CiAgICAgICAgIGludCBtYXhMZW5ndGggPSAtMTsKLSAgICAgICAgaW50IGlucHV0VHlwZSA9IEVkaXRvckluZm8uVFlQRV9DTEFTU19URVhUCi0gICAgICAgICAgICAgICAgfCBFZGl0b3JJbmZvLlRZUEVfVEVYVF9WQVJJQVRJT05fV0VCX0VESVRfVEVYVDsKKyAgICAgICAgaW50IGlucHV0VHlwZSA9IElucHV0VHlwZS5UWVBFX0NMQVNTX1RFWFQKKyAgICAgICAgICAgICAgICB8IElucHV0VHlwZS5UWVBFX1RFWFRfVkFSSUFUSU9OX1dFQl9FRElUX1RFWFQ7CiAgICAgICAgIGludCBpbWVPcHRpb25zID0gRWRpdG9ySW5mby5JTUVfRkxBR19OT19FWFRSQUNUX1VJCiAgICAgICAgICAgICAgICAgfCBFZGl0b3JJbmZvLklNRV9GTEFHX05PX0ZVTExTQ1JFRU47CiAgICAgICAgIGlmIChURVhUX0FSRUEgIT0gdHlwZQpAQCAtMTE2MCw5ICsxMTYxLDkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVEVYVF9BUkVBOgogICAgICAgICAgICAgICAgIHNpbmdsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlucHV0VHlwZSB8PSBFZGl0b3JJbmZvLlRZUEVfVEVYVF9GTEFHX01VTFRJX0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgRWRpdG9ySW5mby5UWVBFX1RFWFRfRkxBR19DQVBfU0VOVEVOQ0VTCi0gICAgICAgICAgICAgICAgICAgICAgICB8IEVkaXRvckluZm8uVFlQRV9URVhUX0ZMQUdfQVVUT19DT1JSRUNUOworICAgICAgICAgICAgICAgIGlucHV0VHlwZSB8PSBJbnB1dFR5cGUuVFlQRV9URVhUX0ZMQUdfTVVMVElfTElORQorICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnB1dFR5cGUuVFlQRV9URVhUX0ZMQUdfQ0FQX1NFTlRFTkNFUworICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnB1dFR5cGUuVFlQRV9URVhUX0ZMQUdfQVVUT19DT1JSRUNUOwogICAgICAgICAgICAgICAgIGltZU9wdGlvbnMgfD0gRWRpdG9ySW5mby5JTUVfQUNUSU9OX05PTkU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgpAQCAtMTE3MywxNyArMTE3NCwyMSBAQAogICAgICAgICAgICAgICAgIGltZU9wdGlvbnMgfD0gRWRpdG9ySW5mby5JTUVfQUNUSU9OX1NFQVJDSDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRU1BSUw6Ci0gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gRWRpdG9ySW5mby5UWVBFX1RFWFRfVkFSSUFUSU9OX1dFQl9FTUFJTF9BRERSRVNTOworICAgICAgICAgICAgICAgIC8vIGlucHV0VHlwZSBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgdGV4dCB2YXJpYXRpb24uCisgICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gSW5wdXRUeXBlLlRZUEVfQ0xBU1NfVEVYVAorICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnB1dFR5cGUuVFlQRV9URVhUX1ZBUklBVElPTl9XRUJfRU1BSUxfQUREUkVTUzsKICAgICAgICAgICAgICAgICBpbWVPcHRpb25zIHw9IEVkaXRvckluZm8uSU1FX0FDVElPTl9HTzsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTlVNQkVSOgotICAgICAgICAgICAgICAgIGlucHV0VHlwZSB8PSBFZGl0b3JJbmZvLlRZUEVfQ0xBU1NfTlVNQkVSOworICAgICAgICAgICAgICAgIC8vIGlucHV0VHlwZSBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgY2xhc3MuCisgICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gSW5wdXRUeXBlLlRZUEVfQ0xBU1NfTlVNQkVSIHwgSW5wdXRUeXBlLlRZUEVfTlVNQkVSX1ZBUklBVElPTl9OT1JNQUw7CiAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIGFuZCB0ZWxlcGhvbmUgZG8gbm90IGhhdmUgYm90aCBhIFRhYiBrZXkgYW5kIGFuCiAgICAgICAgICAgICAgICAgLy8gYWN0aW9uLCBzbyBzZXQgdGhlIGFjdGlvbiB0byBORVhUCiAgICAgICAgICAgICAgICAgaW1lT3B0aW9ucyB8PSBFZGl0b3JJbmZvLklNRV9BQ1RJT05fTkVYVDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVEVMRVBIT05FOgotICAgICAgICAgICAgICAgIGlucHV0VHlwZSB8PSBFZGl0b3JJbmZvLlRZUEVfQ0xBU1NfUEhPTkU7CisgICAgICAgICAgICAgICAgLy8gaW5wdXRUeXBlIG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVudCBjbGFzcy4KKyAgICAgICAgICAgICAgICBpbnB1dFR5cGUgPSBJbnB1dFR5cGUuVFlQRV9DTEFTU19QSE9ORTsKICAgICAgICAgICAgICAgICBpbWVPcHRpb25zIHw9IEVkaXRvckluZm8uSU1FX0FDVElPTl9ORVhUOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBVUkw6CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCA2MWE2OWNhLi5hNjhjYTYwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTg0LDYgKzg0LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVGV4dFZpZXcuQXV0b0NvbXBsZXRlQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5EcmF3RGF0YTsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5FdmVudEh1YjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5Ub3VjaEV2ZW50RGF0YTsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5Ub3VjaEhpZ2hsaWdodERhdGE7CkBAIC0xMDIsNiArMTAzLDkgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTYxNiw2ICs2MjAsOSBAQAogICAgIC8vIFNldEJhc2VMYXllciB0aW1lIGFuZCB0byBwYXVzZSB3aGVuIFdlYlZpZXcgcGF1c2VkLgogICAgIHByaXZhdGUgSFRNTDVWaWRlb1ZpZXdQcm94eSBtSFRNTDVWaWRlb1ZpZXdQcm94eTsKIAorICAgIC8vIElmIHdlIGFyZSB1c2luZyBhIHNldCBwaWN0dXJlLCBkb24ndCBzZW5kIHZpZXcgdXBkYXRlcyB0byB3ZWJraXQKKyAgICBwcml2YXRlIGJvb2xlYW4gbUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzID0gZmFsc2U7CisKICAgICAvKgogICAgICAqIFByaXZhdGUgbWVzc2FnZSBpZHMKICAgICAgKi8KQEAgLTEwNjcsMjAgKzEwNzQsMTAgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZVByb3h5QnJvYWRjYXN0KEludGVudCBpbnRlbnQpIHsKICAgICAgICAgUHJveHlQcm9wZXJ0aWVzIHByb3h5UHJvcGVydGllcyA9IChQcm94eVByb3BlcnRpZXMpaW50ZW50LmdldEV4dHJhKFByb3h5LkVYVFJBX1BST1hZX0lORk8pOwogICAgICAgICBpZiAocHJveHlQcm9wZXJ0aWVzID09IG51bGwgfHwgcHJveHlQcm9wZXJ0aWVzLmdldEhvc3QoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBXZWJWaWV3Q29yZS5zZW5kU3RhdGljTWVzc2FnZShFdmVudEh1Yi5QUk9YWV9DSEFOR0VELCAiIik7CisgICAgICAgICAgICBXZWJWaWV3Q29yZS5zZW5kU3RhdGljTWVzc2FnZShFdmVudEh1Yi5QUk9YWV9DSEFOR0VELCBudWxsKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBob3N0ID0gcHJveHlQcm9wZXJ0aWVzLmdldEhvc3QoKTsKLSAgICAgICAgaW50IHBvcnQgPSBwcm94eVByb3BlcnRpZXMuZ2V0UG9ydCgpOwotICAgICAgICBpZiAocG9ydCAhPSAwKQotICAgICAgICAgICAgaG9zdCArPSAiOiIgKyBwb3J0OwotCi0gICAgICAgIC8vIFRPRE86IEhhbmRsZSBleGNsdXNpb24gbGlzdAotICAgICAgICAvLyBUaGUgcGxhbiBpcyB0byBtYWtlIGFuIEFuZHJvaWRQcm94eVJlc29sdmVyLCBhbmQgaGFuZGxlIHRoZSBibGFja2xpc3QKLSAgICAgICAgLy8gdGhlcmUKLSAgICAgICAgU3RyaW5nIGV4Y2x1c2lvbkxpc3QgPSBwcm94eVByb3BlcnRpZXMuZ2V0RXhjbHVzaW9uTGlzdCgpOwotICAgICAgICBXZWJWaWV3Q29yZS5zZW5kU3RhdGljTWVzc2FnZShFdmVudEh1Yi5QUk9YWV9DSEFOR0VELCBob3N0KTsKKyAgICAgICAgV2ViVmlld0NvcmUuc2VuZFN0YXRpY01lc3NhZ2UoRXZlbnRIdWIuUFJPWFlfQ0hBTkdFRCwgcHJveHlQcm9wZXJ0aWVzKTsKICAgICB9CiAKICAgICAvKgpAQCAtMTQxMCw3ICsxNDA3LDcgQEAKICAgICAgICAgcmV0dXJuIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIGdldFZpc2libGVUaXRsZUhlaWdodCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgaW50IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSB7CisgICAgaW50IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSB7CiAgICAgICAgIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbFNjcm9sbEJhckVuYWJsZWQoKSAmJiAhbU92ZXJsYXlIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CiAgICAgICAgICAgICBoZWlnaHQgLT0gZ2V0SG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCgpOwpAQCAtMTc5Niw2ICsxNzkzLDUyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIHZpZXcgZGF0YSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gVGhlIG91dHB1dCBpcyBoaWdobHkKKyAgICAgKiB2ZXJzaW9uIHNwZWNpZmljLCBhbmQgbWF5IG5vdCBiZSBhYmxlIHRvIGJlIGxvYWRlZCBieSBuZXdlciB2ZXJzaW9ucworICAgICAqIG9mIFdlYlZpZXcuCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUge0BsaW5rIE91dHB1dFN0cmVhbX0gdG8gc2F2ZSB0bworICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzYXZlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNhdmVWaWV3U3RhdGUoT3V0cHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFZpZXdTdGF0ZVNlcmlhbGl6ZXIuc2VyaWFsaXplVmlld1N0YXRlKHN0cmVhbSwgdGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkZhaWxlZCB0byBzYXZlVmlld1N0YXRlIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIHRoZSB2aWV3IGRhdGEgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiBTZWUKKyAgICAgKiB7QGxpbmsgI3NhdmVWaWV3U3RhdGUoT3V0cHV0U3RyZWFtKX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUge0BsaW5rIElucHV0U3RyZWFtfSB0byBsb2FkIGZyb20KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgbG9hZGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbG9hZFZpZXdTdGF0ZShJbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERyYXdEYXRhIGRyYXcgPSBWaWV3U3RhdGVTZXJpYWxpemVyLmRlc2VyaWFsaXplVmlld1N0YXRlKHN0cmVhbSwgdGhpcyk7CisgICAgICAgICAgICBtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMgPSB0cnVlOworICAgICAgICAgICAgc2V0TmV3UGljdHVyZShkcmF3KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJGYWlsZWQgdG8gbG9hZFZpZXdTdGF0ZSIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIHZpZXcgc3RhdGUgc2V0IHdpdGgge0BsaW5rICNsb2FkVmlld1N0YXRlKElucHV0U3RyZWFtKX0uCisgICAgICogVGhpcyBXZWJWaWV3IHdpbGwgdGhlbiBzd2l0Y2ggdG8gc2hvd2luZyB0aGUgY29udGVudCBmcm9tIHdlYmtpdAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJWaWV3U3RhdGUoKSB7CisgICAgICAgIG1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcyA9IGZhbHNlOworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhpcyBXZWJWaWV3IGZyb20gdGhlIGdpdmVuIG1hcCB1c2VkIGluCiAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUmVzdG9yZUluc3RhbmNlU3RhdGV9LiBUaGlzIG1ldGhvZCBzaG91bGQKICAgICAgKiBiZSBjYWxsZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIFdlYlZpZXcgYmVmb3JlIHVzaW5nIHRoZSBvYmplY3QuIElmCkBAIC0yNjc0LDEwICsyNzE3LDEyIEBACiAgICAgICAgIGNhbGNPdXJDb250ZW50VmlzaWJsZVJlY3QocmVjdCk7CiAgICAgICAgIC8vIFJlY3QuZXF1YWxzKCkgY2hlY2tzIGZvciBudWxsIGlucHV0LgogICAgICAgICBpZiAoIXJlY3QuZXF1YWxzKG1MYXN0VmlzaWJsZVJlY3RTZW50KSkgewotICAgICAgICAgICAgUG9pbnQgcG9zID0gbmV3IFBvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApOwotICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnJlbW92ZU1lc3NhZ2VzKEV2ZW50SHViLlNFVF9TQ1JPTExfT0ZGU0VUKTsKLSAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfU0NST0xMX09GRlNFVCwKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlTW92ZUdlbmVyYXRpb24oKSwgbVNlbmRTY3JvbGxFdmVudCA/IDEgOiAwLCBwb3MpOworICAgICAgICAgICAgaWYgKCFtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMpIHsKKyAgICAgICAgICAgICAgICBQb2ludCBwb3MgPSBuZXcgUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnJlbW92ZU1lc3NhZ2VzKEV2ZW50SHViLlNFVF9TQ1JPTExfT0ZGU0VUKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX1NDUk9MTF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVNb3ZlR2VuZXJhdGlvbigpLCBtU2VuZFNjcm9sbEV2ZW50ID8gMSA6IDAsIHBvcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTGFzdFZpc2libGVSZWN0U2VudCA9IHJlY3Q7CiAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoU1dJVENIX1RPX0xPTkdQUkVTUyk7CiAgICAgICAgIH0KQEAgLTI2OTIsNyArMjczNyw5IEBACiAgICAgICAgICAgICAvLyBUT0RPOiB0aGUgZ2xvYmFsIG9mZnNldCBpcyBvbmx5IHVzZWQgYnkgd2luZG93UmVjdCgpCiAgICAgICAgICAgICAvLyBpbiBDaHJvbWVDbGllbnRBbmRyb2lkIDsgb3RoZXIgY2xpZW50cyBzdWNoIGFzIHRvdWNoCiAgICAgICAgICAgICAvLyBhbmQgbW91c2UgZXZlbnRzIGNvdWxkIHJldHVybiB2aWV3ICsgc2NyZWVuIHJlbGF0aXZlIHBvaW50cy4KLSAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfR0xPQkFMX0JPVU5EUywgZ2xvYmFsUmVjdCk7CisgICAgICAgICAgICBpZiAoIW1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcykgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfR0xPQkFMX0JPVU5EUywgZ2xvYmFsUmVjdCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTGFzdEdsb2JhbFJlY3QgPSBnbG9iYWxSZWN0OwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZWN0OwpAQCAtMjc1Nyw2ICsyODA0LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmV3IHZhbHVlcyB3ZXJlIHNlbnQKICAgICAgKi8KICAgICBib29sZWFuIHNlbmRWaWV3U2l6ZVpvb20oYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBpZiAobUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNQcmV2ZW50aW5nV2Via2l0VXBkYXRlcygpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwpAQCAtMzM2OSw5ICszNDE3LDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFib3J0QW5pbWF0aW9uKCk7CiAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZKTsKLSAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVQcmlvcml0eSgpOwotICAgICAgICAgICAgICAgIGlmICghbVNlbGVjdGluZ1RleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOworICAgICAgICAgICAgICAgIGlmICghbUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzKSB7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVNlbGVjdGluZ1RleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRPdXJWaXNpYmxlUmVjdCgpOwpAQCAtNDIwMiw2ICs0MjUyLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQgZ2V0QmFzZUxheWVyKCkgeworICAgICAgICByZXR1cm4gbmF0aXZlR2V0QmFzZUxheWVyKCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCkgewogICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3IG1pc3BsYWNlZC4KICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewpAQCAtNDIyNSw3ICs0Mjc5LDcgQEAKICAgICB9CiAKICAgICB2b2lkIG9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uRW5kKCkgewotICAgICAgICBpZiAoIW1TZWxlY3RpbmdUZXh0KSB7CisgICAgICAgIGlmICghbUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzICYmICFtU2VsZWN0aW5nVGV4dCkgewogICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwogICAgICAgICB9CiAgICAgICAgIG9uWm9vbUFuaW1hdGlvbkVuZCgpOwpAQCAtNDMyNiw3ICs0MzgwLDcgQEAKICAgICAgICAgICAgIC8vIHN5bmNocm9uaXphdGlvbiBwcm9ibGVtIHdpdGggbGF5ZXJzLgogICAgICAgICAgICAgaW50IGNvbnRlbnQgPSBuYXRpdmVEcmF3KGNhbnZhcywgY29sb3IsIGV4dHJhcywgZmFsc2UpOwogICAgICAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobnVsbCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIW1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcyAmJiBjb250ZW50ICE9IDApIHsKICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQsIGNvbnRlbnQsIDApOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00NzMwLDYgKzQ3ODQsOSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlNdWx0aXBsZShpbnQga2V5Q29kZSwgaW50IHJlcGVhdENvdW50LCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAobUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgLy8gc2VuZCBjb21wbGV4IGNoYXJhY3RlcnMgdG8gd2Via2l0IGZvciB1c2UgYnkgSlMgYW5kIHBsdWdpbnMKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOICYmIGV2ZW50LmdldENoYXJhY3RlcnMoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBwYXNzIHRoZSBrZXkgdG8gRE9NCkBAIC00NzU0LDYgKzQ4MTEsOSBAQAogICAgICAgICAgICAgICAgICAgICArICJrZXlDb2RlPSIgKyBrZXlDb2RlCiAgICAgICAgICAgICAgICAgICAgICsgIiwgIiArIGV2ZW50ICsgIiwgdW5pY29kZT0iICsgZXZlbnQuZ2V0VW5pY29kZUNoYXIoKSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKICAgICAgICAgLy8gZG9uJ3QgaW1wbGVtZW50IGFjY2VsZXJhdG9yIGtleXMgaGVyZTsgZGVmZXIgdG8gaG9zdCBhcHBsaWNhdGlvbgogICAgICAgICBpZiAoZXZlbnQuaXNDdHJsUHJlc3NlZCgpKSB7CkBAIC00OTU3LDYgKzUwMTcsOSBAQAogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAia2V5VXAgYXQgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCiAgICAgICAgICAgICAgICAgICAgICsgIiwgIiArIGV2ZW50ICsgIiwgdW5pY29kZT0iICsgZXZlbnQuZ2V0VW5pY29kZUNoYXIoKSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01NTQxLDEwICs1NjA0LDEyIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEZvcndhcmRUb3VjaEV2ZW50KCkgewotICAgICAgICByZXR1cm4gbUZ1bGxTY3JlZW5Ib2xkZXIgIT0gbnVsbCB8fCAobUZvcndhcmRUb3VjaEV2ZW50cworICAgICAgICBpZiAobUZ1bGxTY3JlZW5Ib2xkZXIgIT0gbnVsbCkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG1Gb3J3YXJkVG91Y2hFdmVudHMKICAgICAgICAgICAgICAgICAmJiAhbVNlbGVjdGluZ1RleHQKICAgICAgICAgICAgICAgICAmJiBtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX0lHTk9SRQotICAgICAgICAgICAgICAgICYmIG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfTk8pOworICAgICAgICAgICAgICAgICYmIG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfTk87CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGluRnVsbFNjcmVlbk1vZGUoKSB7CkBAIC01NTUzLDcgKzU2MTgsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGRpc21pc3NGdWxsU2NyZWVuTW9kZSgpIHsKICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuZGlzbWlzcygpOworICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuaGlkZSgpOwogICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIgPSBudWxsOwogICAgICAgICB9CiAgICAgfQpAQCAtNTY3NSwyNSArNTc0MCwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0IHRoZSBzaG9ydCBwcmVzcyBhY3Rpb24gZm9yIHRoZSBwcmV2aW91cyB0YXAKICAgICAgICAgICAgICAgICAgICAgICAgIGRvU2hvcnRQcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICghaW5GdWxsU2NyZWVuTW9kZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Gb3J3YXJkVG91Y2hFdmVudHMpID8gaGl0Rm9jdXNlZFBsdWdpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFgsIGNvbnRlbnRZKSA6IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hQcm9jZXNzID0gIW1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWluRnVsbFNjcmVlbk1vZGUoKSAmJiBtRm9yd2FyZFRvdWNoRXZlbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGhpdEZvY3VzZWRQbHVnaW4oY29udGVudFgsIGNvbnRlbnRZKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGhlIG5vcm1hbCBjYXNlCiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICghaW5GdWxsU2NyZWVuTW9kZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUZvcndhcmRUb3VjaEV2ZW50cykgPyBoaXRGb2N1c2VkUGx1Z2luKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLlVQREFURV9GUkFNRV9DQUNIRV9JRl9MT0FESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hQcm9jZXNzID0gIW1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghaW5GdWxsU2NyZWVuTW9kZSgpICYmIG1Gb3J3YXJkVG91Y2hFdmVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBoaXRGb2N1c2VkUGx1Z2luKGNvbnRlbnRYLCBjb250ZW50WSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5VUERBVEVfRlJBTUVfQ0FDSEVfSUZfTE9BRElORyk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEhpZ2hsaWdodERhdGEgZGF0YSA9IG5ldyBUb3VjaEhpZ2hsaWdodERhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVggPSBjb250ZW50WDsKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVNsb3AgPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKG1OYXZTbG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZURlbGF5ZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZURlbGF5ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5HRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19UT1VDSF9ISUdITElHSFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IChpbnQpIHggKyBtU2Nyb2xsWDsKQEAgLTU3MjksNyArNTgwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dJVENIX1RPX0xPTkdQUkVTUywgTE9OR19QUkVTU19USU1FT1VUKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSB8fCBtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2ZW50RGVmYXVsdCA9IFBSRVZFTlRfREVGQVVMVF9ZRVM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZvcndhcmRUb3VjaEV2ZW50cykgeworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMgJiYgbUZvcndhcmRUb3VjaEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZlbnREZWZhdWx0ID0gUFJFVkVOVF9ERUZBVUxUX01BWUJFX1lFUzsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2ZW50RGVmYXVsdCA9IFBSRVZFTlRfREVGQVVMVF9OTzsKQEAgLTY0MzIsNiArNjUwMyw4IEBACiAgICAgLy8gYXJyb3cga2V5IGV2ZW50cywgbm90IHRyYWNrYmFsbCBldmVudHMsIGZyb20gb25lIGNoaWxkIHRvIHRoZSBuZXh0CiAgICAgcHJpdmF0ZSBib29sZWFuIG1NYXBUcmFja2JhbGxUb0Fycm93S2V5cyA9IHRydWU7CiAKKyAgICBwcml2YXRlIERyYXdEYXRhIG1EZWxheVNldFBpY3R1cmU7CisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXBUcmFja2JhbGxUb0Fycm93S2V5cyhib29sZWFuIHNldE1hcCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBtTWFwVHJhY2tiYWxsVG9BcnJvd0tleXMgPSBzZXRNYXA7CkBAIC03ODQxLDYgKzc5MTQsMTEgQEAKICAgICAgICAgICAgICAgICAvLyBhZnRlciBXZWJWaWV3J3MgZGVzdHJveSgpIGlzIGNhbGxlZCwgc2tpcCBoYW5kbGluZyBtZXNzYWdlcy4KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICYmIG1zZy53aGF0ICE9IFdFQkNPUkVfSU5JVElBTElaRURfTVNHX0lEKSB7CisgICAgICAgICAgICAgICAgLy8gQmxvY2tpbmcgbWVzc2FnZXMgZnJvbSB3ZWJraXQKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSBSRU1FTUJFUl9QQVNTV09SRDogewogICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VXNlcm5hbWVQYXNzd29yZCgKQEAgLTc5NzYsNjYgKzgwNTQsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgTkVXX1BJQ1RVUkVfTVNHX0lEOiB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmb3IgbmV3IGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9IChXZWJWaWV3Q29yZS5EcmF3RGF0YSkgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IGRyYXcubVZpZXdTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0ID0gdmlld1N0YXRlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNldEJhc2VMYXllcihkcmF3Lm1CYXNlTGF5ZXIsIGRyYXcubUludmFsUmVnaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNldHRpbmdzKCkuZ2V0U2hvd1Zpc3VhbEluZGljYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXcubVZpZXdTaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGxhc3Qgc2VudCBkYXRhIGhlcmUgc2luY2UgZGVhbGluZyB3aXRoIG5ldyBwYWdlLgotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uRmlyc3RMYXlvdXQoZHJhdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzZW5kIHRoZSBzY3JvbGwgZXZlbnQgZm9yIHRoaXMgcGFydGljdWxhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcm9sbCBtZXNzYWdlLiAgTm90ZSB0aGF0IGEgc2Nyb2xsIGV2ZW50IG1heQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGJlIGZpcmVkIGlmIHRoZSB1c2VyIHNjcm9sbHMgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgY2FuIGJlIGhhbmRsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRTY3JvbGxFdmVudCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyh2aWV3U3RhdGUubVNjcm9sbFgsIHZpZXdTdGF0ZS5tU2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRTY3JvbGxFdmVudCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZSBhcmUgb24gYSBuZXcgcGFnZSwgcmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lY2Vzc2FyeSBmb3IgcGFnZSBsb2FkcyBkcml2ZW4gYnkgd2Via2l0LCBhbmQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIHdoZW4gdGhlIHVzZXIgd2FzIG9uIGEgcGFzc3dvcmQgZmllbGQsIHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IHdhcyB2aXNpYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIGxheW91dCAoaS5lLiByZXF1ZXN0IGEgbGF5b3V0IGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIHZpZXcgc3lzdGVtKSBpZiB0aGUgbGFzdCB2aWV3IHNpemUgdGhhdCB3ZSBzZW50IHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlYkNvcmUgbWF0Y2hlcyB0aGUgdmlldyBzaXplIG9mIHRoZSBwaWN0dXJlIHdlIGp1c3QKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVjZWl2ZWQgaW4gdGhlIGZpeGVkIGRpbWVuc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVMYXlvdXQgPSB2aWV3U2l6ZS54ID09IG1MYXN0V2lkdGhTZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmlld1NpemUueSA9PSBtTGFzdEhlaWdodFNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNlbmQgc2Nyb2xsIGV2ZW50IGZvciBwaWN0dXJlIGNvbWluZyBmcm9tIHdlYmtpdCwKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIG5ldyBwaWN0dXJlIG1heSBjYXVzZSBhIHNjcm9sbCBldmVudCB0byBvdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2F2ZWQgaGlzdG9yeSBzY3JvbGwgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgICAgIG1TZW5kU2Nyb2xsRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUoZHJhdy5tQ29udGVudFNpemUueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1Db250ZW50U2l6ZS55LCB1cGRhdGVMYXlvdXQpOwotICAgICAgICAgICAgICAgICAgICBtU2VuZFNjcm9sbEV2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgYiA9IGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTkVXX1BJQ1RVUkVfTVNHX0lEIHsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5sZWZ0KyIsIitiLnRvcCsiLCIrYi5yaWdodCsiLCIrYi5ib3R0b20rIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQ29udGVudFJlY3QoZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtUGljdHVyZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QaWN0dXJlTGlzdGVuZXIub25OZXdQaWN0dXJlKFdlYlZpZXcudGhpcywgY2FwdHVyZVBpY3R1cmUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIG5ldyBwaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5vbk5ld1BpY3R1cmUoZHJhdyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXcubUZvY3VzU2l6ZUNoYW5nZWQgJiYgaW5FZGl0aW5nTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRm9jdXNTaXplQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3TWFuYWdlci5wb3N0UmVhZHlUb0RyYXdBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXROZXdQaWN0dXJlKGRyYXcpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBXRUJDT1JFX0lOSVRJQUxJWkVEX01TR19JRDoKQEAgLTgwNDQsNiArODA2MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb3dzZXJGcmFtZS5EUkFXQUJMRURJUiwgbUNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICBBc3NldE1hbmFnZXIgYW0gPSBtQ29udGV4dC5nZXRBc3NldHMoKTsKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ3JlYXRlKG1zZy5hcmcxLCBkcmF3YWJsZURpciwgYW0pOworICAgICAgICAgICAgICAgICAgICBpZiAobURlbGF5U2V0UGljdHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdQaWN0dXJlKG1EZWxheVNldFBpY3R1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5U2V0UGljdHVyZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEOgogICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdGV4dGZpZWxkIGlzIGN1cnJlbnRseSBmb2N1c2VkCkBAIC04MjA4LDE2ICs4MjMxLDE1IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIFNIT1dfRlVMTFNDUkVFTjogewogICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSAoVmlldykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5wcCA9IG1zZy5hcmcxOworICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZW50YXRpb24gPSBtc2cuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5wcCA9IG1zZy5hcmcyOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlNob3VsZCBub3QgaGF2ZSBhbm90aGVyIGZ1bGwgc2NyZWVuLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzc0Z1bGxTY3JlZW5Nb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIgPSBuZXcgUGx1Z2luRnVsbFNjcmVlbkhvbGRlcihXZWJWaWV3LnRoaXMsIG5wcCk7CisgICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuSG9sZGVyID0gbmV3IFBsdWdpbkZ1bGxTY3JlZW5Ib2xkZXIoV2ViVmlldy50aGlzLCBvcmllbnRhdGlvbiwgbnBwKTsKICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuc2V0Q29udGVudFZpZXcodmlldyk7Ci0gICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuSG9sZGVyLnNldENhbmNlbGFibGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlci5zZXRDYW5jZWxlZE9uVG91Y2hPdXRzaWRlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuc2hvdygpOwogCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtODM1NSw2ICs4Mzc3LDc4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICB2b2lkIHNldE5ld1BpY3R1cmUoZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdykgeworICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHsKKyAgICAgICAgICAgIGlmIChtRGVsYXlTZXRQaWN0dXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRyaWVkIHRvIHNldE5ld1BpY3R1cmUgd2l0aCBhIGRlbGF5IHBpY3R1cmUgYWxyZWFkeSBzZXQhIChtZW1vcnkgbGVhaykiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdCBpbml0aWFsaXplZCB5ZXQsIGRlbGF5IHNldAorICAgICAgICAgICAgbURlbGF5U2V0UGljdHVyZSA9IGRyYXc7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IGRyYXcubVZpZXdTdGF0ZTsKKyAgICAgICAgYm9vbGVhbiBpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0ID0gdmlld1N0YXRlICE9IG51bGw7CisgICAgICAgIHNldEJhc2VMYXllcihkcmF3Lm1CYXNlTGF5ZXIsIGRyYXcubUludmFsUmVnaW9uLAorICAgICAgICAgICAgICAgIGdldFNldHRpbmdzKCkuZ2V0U2hvd1Zpc3VhbEluZGljYXRvcigpLAorICAgICAgICAgICAgICAgIGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpOworICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXcubVZpZXdTaXplOworICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgeworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGxhc3Qgc2VudCBkYXRhIGhlcmUgc2luY2UgZGVhbGluZyB3aXRoIG5ldyBwYWdlLgorICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSAwOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uRmlyc3RMYXlvdXQoZHJhdyk7CisgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzZW5kIHRoZSBzY3JvbGwgZXZlbnQgZm9yIHRoaXMgcGFydGljdWxhcgorICAgICAgICAgICAgICAgIC8vIHNjcm9sbCBtZXNzYWdlLiAgTm90ZSB0aGF0IGEgc2Nyb2xsIGV2ZW50IG1heQorICAgICAgICAgICAgICAgIC8vIHN0aWxsIGJlIGZpcmVkIGlmIHRoZSB1c2VyIHNjcm9sbHMgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgY2FuIGJlIGhhbmRsZWQuCisgICAgICAgICAgICAgICAgbVNlbmRTY3JvbGxFdmVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyh2aWV3U3RhdGUubVNjcm9sbFgsIHZpZXdTdGF0ZS5tU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgbVNlbmRTY3JvbGxFdmVudCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAvLyBBcyB3ZSBhcmUgb24gYSBuZXcgcGFnZSwgcmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4gVGhpcworICAgICAgICAgICAgICAgIC8vIGlzIG5lY2Vzc2FyeSBmb3IgcGFnZSBsb2FkcyBkcml2ZW4gYnkgd2Via2l0LCBhbmQgaW4KKyAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIHdoZW4gdGhlIHVzZXIgd2FzIG9uIGEgcGFzc3dvcmQgZmllbGQsIHNvCisgICAgICAgICAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IHdhcyB2aXNpYmxlLgorICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIGxheW91dCAoaS5lLiByZXF1ZXN0IGEgbGF5b3V0IGZyb20gdGhlCisgICAgICAgIC8vIHZpZXcgc3lzdGVtKSBpZiB0aGUgbGFzdCB2aWV3IHNpemUgdGhhdCB3ZSBzZW50IHRvCisgICAgICAgIC8vIFdlYkNvcmUgbWF0Y2hlcyB0aGUgdmlldyBzaXplIG9mIHRoZSBwaWN0dXJlIHdlIGp1c3QKKyAgICAgICAgLy8gcmVjZWl2ZWQgaW4gdGhlIGZpeGVkIGRpbWVuc2lvbi4KKyAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVMYXlvdXQgPSB2aWV3U2l6ZS54ID09IG1MYXN0V2lkdGhTZW50CisgICAgICAgICAgICAgICAgJiYgdmlld1NpemUueSA9PSBtTGFzdEhlaWdodFNlbnQ7CisgICAgICAgIC8vIERvbid0IHNlbmQgc2Nyb2xsIGV2ZW50IGZvciBwaWN0dXJlIGNvbWluZyBmcm9tIHdlYmtpdCwKKyAgICAgICAgLy8gc2luY2UgdGhlIG5ldyBwaWN0dXJlIG1heSBjYXVzZSBhIHNjcm9sbCBldmVudCB0byBvdmVycmlkZQorICAgICAgICAvLyB0aGUgc2F2ZWQgaGlzdG9yeSBzY3JvbGwgcG9zaXRpb24uCisgICAgICAgIG1TZW5kU2Nyb2xsRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUoZHJhdy5tQ29udGVudFNpemUueCwKKyAgICAgICAgICAgICAgICBkcmF3Lm1Db250ZW50U2l6ZS55LCB1cGRhdGVMYXlvdXQpOworICAgICAgICBtU2VuZFNjcm9sbEV2ZW50ID0gdHJ1ZTsKKyAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKKyAgICAgICAgICAgIFJlY3QgYiA9IGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpOworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTkVXX1BJQ1RVUkVfTVNHX0lEIHsiICsKKyAgICAgICAgICAgICAgICAgICAgYi5sZWZ0KyIsIitiLnRvcCsiLCIrYi5yaWdodCsiLCIrYi5ib3R0b20rIn0iKTsKKyAgICAgICAgfQorICAgICAgICBpbnZhbGlkYXRlQ29udGVudFJlY3QoZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCkpOworCisgICAgICAgIGlmIChtUGljdHVyZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QaWN0dXJlTGlzdGVuZXIub25OZXdQaWN0dXJlKFdlYlZpZXcudGhpcywgY2FwdHVyZVBpY3R1cmUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIG5ldyBwaWN0dXJlCisgICAgICAgIG1ab29tTWFuYWdlci5vbk5ld1BpY3R1cmUoZHJhdyk7CisKKyAgICAgICAgaWYgKGRyYXcubUZvY3VzU2l6ZUNoYW5nZWQgJiYgaW5FZGl0aW5nTW9kZSgpKSB7CisgICAgICAgICAgICBtRm9jdXNTaXplQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpIHsKKyAgICAgICAgICAgIG1WaWV3TWFuYWdlci5wb3N0UmVhZHlUb0RyYXdBbGwoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFVzZWQgd2hlbiByZWNlaXZpbmcgbWVzc2FnZXMgZm9yIFJFUVVFU1RfS0VZQk9BUkRfV0lUSF9TRUxFQ1RJT05fTVNHX0lECiAgICAgICogYW5kIFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQuICBVcGRhdGUgdGhlIHNlbGVjdGlvbiBvZiBXZWJUZXh0Vmlldy4KQEAgLTkwNTcsNiArOTE1MSw3IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0SGVpZ2h0Q2FuTWVhc3VyZShib29sZWFuIG1lYXN1cmUpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEJhc2VMYXllcihpbnQgbGF5ZXIsIFJlZ2lvbiBpbnZhbFJlZ2lvbiwKICAgICAgICAgICAgIGJvb2xlYW4gc2hvd1Zpc3VhbEluZGljYXRvciwgYm9vbGVhbiBpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVHZXRCYXNlTGF5ZXIoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTaG93Q3Vyc29yVGltZWQoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZXBsYWNlQmFzZUNvbnRlbnQoaW50IGNvbnRlbnQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUNvcHlCYXNlQ29udGVudFRvUGljdHVyZShQaWN0dXJlIHBpY3QpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQppbmRleCBkYjVmZjU0Li4xNmU0NTcxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRmlsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKQEAgLTcwOCw3ICs3MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFdlYlZpZXcgaGFzIGJlZW4gY3JlYXRlZCBpbiB0aGlzIHByb2Nlc3MhIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnVwZGF0ZVByb3h5KChTdHJpbmcpIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcm93c2VyRnJhbWUuc0phdmFCcmlkZ2UudXBkYXRlUHJveHkoKFByb3h5UHJvcGVydGllcyltc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTI2MjIsMTQgKzI2MjMsMTUgQEAKIAogICAgIC8vIGNhbGxlZCBieSBKTkkuIFBsdWdpbldpZGdldCBmdW5jdGlvbiB0byBsYXVuY2ggYSBmdWxsLXNjcmVlbiB2aWV3IHVzaW5nIGEKICAgICAvLyBWaWV3IG9iamVjdCBwcm92aWRlZCBieSB0aGUgcGx1Z2luIGNsYXNzLgotICAgIHByaXZhdGUgdm9pZCBzaG93RnVsbFNjcmVlblBsdWdpbihWaWV3TWFuYWdlci5DaGlsZFZpZXcgY2hpbGRWaWV3LCBpbnQgbnBwKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNob3dGdWxsU2NyZWVuUGx1Z2luKFZpZXdNYW5hZ2VyLkNoaWxkVmlldyBjaGlsZFZpZXcsIGludCBvcmllbnRhdGlvbiwgaW50IG5wcCkgewogICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoV2ViVmlldy5TSE9XX0ZVTExTQ1JFRU4pOwogICAgICAgICBtZXNzYWdlLm9iaiA9IGNoaWxkVmlldy5tVmlldzsKLSAgICAgICAgbWVzc2FnZS5hcmcxID0gbnBwOworICAgICAgICBtZXNzYWdlLmFyZzEgPSBvcmllbnRhdGlvbjsKKyAgICAgICAgbWVzc2FnZS5hcmcyID0gbnBwOwogICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQppbmRleCBlNDFkZDFjLi43ODAzMzkxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpAQCAtOTA2LDcgKzkwNiw3IEBACiAgICAgICAgIC8vIHNjYWxlQWxsKCksIHdlIG5lZWQgdG8gcG9zdCBhIFJ1bm5hYmxlIHRvIGVuc3VyZSByZXF1ZXN0TGF5b3V0KCkuCiAgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgb25seSB1cGRhdGUgdGhlIHRleHQgd3JhcCBzY2FsZSBpZiB0aGUgd2lkdGggY2hhbmdlZC4KICAgICAgICAgbVdlYlZpZXcucG9zdChuZXcgUG9zdFNjYWxlKHcgIT0gb3cgJiYKLSAgICAgICAgICAgICFtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldFVzZUZpeGVkVmlld3BvcnQoKSwgbUluWm9vbU92ZXJ2aWV3KSk7CisgICAgICAgICAgICAhbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VGaXhlZFZpZXdwb3J0KCksIG1Jblpvb21PdmVydmlldywgdyA8IG93KSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBQb3N0U2NhbGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CkBAIC05MTUsMTAgKzkxNSwxNCBAQAogICAgICAgICAvLyBpdCBjb3VsZCBiZSBjaGFuZ2VkIGJldHdlZW4gdGhlIHRpbWUgdGhpcyBjYWxsYmFjayBpcyBpbml0aWF0ZWQgYW5kCiAgICAgICAgIC8vIHRoZSB0aW1lIGl0J3MgYWN0dWFsbHkgcnVuLgogICAgICAgICBmaW5hbCBib29sZWFuIG1Jblpvb21PdmVydmlld0JlZm9yZVNpemVDaGFuZ2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbUluUG9ydHJhaXRNb2RlOwogCi0gICAgICAgIHB1YmxpYyBQb3N0U2NhbGUoYm9vbGVhbiB1cGRhdGVUZXh0V3JhcCwgYm9vbGVhbiBpblpvb21PdmVydmlldykgeworICAgICAgICBwdWJsaWMgUG9zdFNjYWxlKGJvb2xlYW4gdXBkYXRlVGV4dFdyYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpblpvb21PdmVydmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluUG9ydHJhaXRNb2RlKSB7CiAgICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKICAgICAgICAgICAgIG1Jblpvb21PdmVydmlld0JlZm9yZVNpemVDaGFuZ2UgPSBpblpvb21PdmVydmlldzsKKyAgICAgICAgICAgIG1JblBvcnRyYWl0TW9kZSA9IGluUG9ydHJhaXRNb2RlOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewpAQCAtOTI3LDEwICs5MzEsMTAgQEAKICAgICAgICAgICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvdmVyIHRvIHdlYmtpdC4KICAgICAgICAgICAgICAgICAvLyBLZWVwIG92ZXJ2aWV3IG1vZGUgdW5jaGFuZ2VkIHdoZW4gcm90YXRpbmcuCiAgICAgICAgICAgICAgICAgZmxvYXQgbmV3U2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgem9vbU92ZXJ2aWV3U2NhbGUgPSBnZXRab29tT3ZlcnZpZXdTY2FsZSgpOwotICAgICAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IChtSW5ab29tT3ZlcnZpZXdCZWZvcmVTaXplQ2hhbmdlKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICB6b29tT3ZlcnZpZXdTY2FsZSA6IE1hdGgubWF4KG1BY3R1YWxTY2FsZSwgem9vbU92ZXJ2aWV3U2NhbGUpOworICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldFVzZVdpZGVWaWV3UG9ydCgpICYmCisgICAgICAgICAgICAgICAgICAgIG1JblBvcnRyYWl0TW9kZSAmJgorICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXdCZWZvcmVTaXplQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1NjYWxlID0gZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKG5ld1NjYWxlLCBtVXBkYXRlVGV4dFdyYXAsIHRydWUpOwogICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZApAQCAtMTAwMiw4ICsxMDA2LDkgQEAKICAgICAgICAgYm9vbGVhbiBtb2JpbGVTaXRlSW5PdmVydmlldyA9IG1Jblpvb21PdmVydmlldyAmJgogICAgICAgICAgICAgICAgICFleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobmV3Wm9vbU92ZXJ2aWV3U2NhbGUsIDEuMGYpOwogICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkgJiYKLSAgICAgICAgICAgICAgICAobUluaXRpYWxab29tT3ZlcnZpZXcgfHwgc2NhbGVMZXNzVGhhbk92ZXJ2aWV3IHx8IG1vYmlsZVNpdGVJbk92ZXJ2aWV3KSAmJgotICAgICAgICAgICAgICAgIHNjYWxlSGFzRGlmZiAmJiB6b29tT3ZlcnZpZXdXaWR0aENoYW5nZWQpIHsKKyAgICAgICAgICAgIChzY2FsZUxlc3NUaGFuT3ZlcnZpZXcgfHwKKyAgICAgICAgICAgICAgICAoKG1Jbml0aWFsWm9vbU92ZXJ2aWV3IHx8IG1vYmlsZVNpdGVJbk92ZXJ2aWV3KSAmJgorICAgICAgICAgICAgICAgICAgICBzY2FsZUhhc0RpZmYgJiYgem9vbU92ZXJ2aWV3V2lkdGhDaGFuZ2VkKSkpIHsKICAgICAgICAgICAgIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CiAgICAgICAgICAgICBzZXRab29tU2NhbGUobmV3Wm9vbU92ZXJ2aWV3U2NhbGUsICF3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkgJiYKICAgICAgICAgICAgICAgICAhbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VGaXhlZFZpZXdwb3J0KCkpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YQppbmRleCBmNDMwMGE1Li44MmRkNWRiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YQpAQCAtMjU3MiwxNyArMjU3Miw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25SZXF1ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudChWaWV3IGNoaWxkLCBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy8gQWRkIGEgcmVjb3JkIGZvciBvdXJzZWx2ZXMgYXMgd2VsbC4KLSAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY29yZCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKLSAgICAgICAgLy8gU2V0IHRoZSBjbGFzcyBzaW5jZSBpdCBpcyBub3QgcG9wdWxhdGVkIGluICNkaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50Ci0gICAgICAgIHJlY29yZC5zZXRDbGFzc05hbWUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBjaGlsZC5kaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50KHJlY29yZCk7Ci0gICAgICAgIGV2ZW50LmFwcGVuZFJlY29yZChyZWNvcmQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC00NjcyLDYgKzQ2NjEsNyBAQAogICAgICAgICBzZWxlY3RlZFBvcyA9IGxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oc2VsZWN0ZWRQb3MsIGRvd24pOwogICAgICAgICBpZiAoc2VsZWN0ZWRQb3MgPj0gZmlyc3RQb3NpdGlvbiAmJiBzZWxlY3RlZFBvcyA8PSBnZXRMYXN0VmlzaWJsZVBvc2l0aW9uKCkpIHsKICAgICAgICAgICAgIG1MYXlvdXRNb2RlID0gTEFZT1VUX1NQRUNJRklDOworICAgICAgICAgICAgdXBkYXRlU2VsZWN0b3JTdGF0ZSgpOwogICAgICAgICAgICAgc2V0U2VsZWN0aW9uSW50KHNlbGVjdGVkUG9zKTsKICAgICAgICAgICAgIGludm9rZU9uSXRlbVNjcm9sbExpc3RlbmVyKCk7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldy5qYXZhCmluZGV4IDE0ZWE4NTMuLmM0ZDA1ZTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldy5qYXZhCkBAIC04ODcsMTQgKzg4NywyOCBAQAogICAgICAgICAvLyBXZSBmaXJzdCBnZXQgYSBjaGFuY2UgdG8gcG9wdWxhdGUgdGhlIGV2ZW50LgogICAgICAgICBvblBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKIAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Qb3B1bGF0ZUFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgLy8gV2Ugc2VuZCBzZWxlY3Rpb24gZXZlbnRzIG9ubHkgZnJvbSBBZGFwdGVyVmlldyB0byBhdm9pZAogICAgICAgICAvLyBnZW5lcmF0aW9uIG9mIHN1Y2ggZXZlbnQgZm9yIGVhY2ggY2hpbGQuCiAgICAgICAgIFZpZXcgc2VsZWN0ZWRWaWV3ID0gZ2V0U2VsZWN0ZWRWaWV3KCk7CiAgICAgICAgIGlmIChzZWxlY3RlZFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVmlldy5kaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIHNlbGVjdGVkVmlldy5kaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25SZXF1ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudChWaWV3IGNoaWxkLCBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gQWRkIGEgcmVjb3JkIGZvciBvdXJzZWx2ZXMgYXMgd2VsbC4KKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY29yZCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgLy8gU2V0IHRoZSBjbGFzcyBzaW5jZSBpdCBpcyBub3QgcG9wdWxhdGVkIGluICNkaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50CisgICAgICAgIHJlY29yZC5zZXRDbGFzc05hbWUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBjaGlsZC5kaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50KHJlY29yZCk7CisgICAgICAgIGV2ZW50LmFwcGVuZFJlY29yZChyZWNvcmQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcHBTZWN1cml0eVBlcm1pc3Npb25zLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXBwU2VjdXJpdHlQZXJtaXNzaW9ucy5qYXZhCmluZGV4IGQzYWE0MmYuLjk4ODc2MGQgMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcHBTZWN1cml0eVBlcm1pc3Npb25zLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FwcFNlY3VyaXR5UGVybWlzc2lvbnMuamF2YQpAQCAtMjE4LDE1ICsyMTgsMTQgQEAKICAgICAgICAgbVNob3dNb3JlLnNldENsaWNrYWJsZSh0cnVlKTsKICAgICAgICAgbVNob3dNb3JlLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbVNob3dNb3JlLnNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgbVNob3dNb3JlLnNldEJhY2tncm91bmRSZXNvdXJjZShhbmRyb2lkLlIuZHJhd2FibGUubGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kKTsKIAogICAgICAgICAvLyBQaWNrIHVwIGZyb20gZnJhbWV3b3JrIHJlc291cmNlcyBpbnN0ZWFkLgogICAgICAgICBtRGVmYXVsdEdycExhYmVsID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmRlZmF1bHRfcGVybWlzc2lvbl9ncm91cCk7CiAgICAgICAgIG1QZXJtRm9ybWF0ID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLnBlcm1pc3Npb25zX2Zvcm1hdCk7CiAgICAgICAgIG1Ob3JtYWxJY29uID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY190ZXh0X2RvdCk7CiAgICAgICAgIG1EYW5nZXJvdXNJY29uID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19idWxsZXRfa2V5X3Blcm1pc3Npb24pOwotICAgICAgICBtU2hvd01heEljb24gPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmV4cGFuZGVyX2ljX21heGltaXplZCk7Ci0gICAgICAgIG1TaG93TWluSWNvbiA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuZXhwYW5kZXJfaWNfbWluaW1pemVkKTsKKyAgICAgICAgbVNob3dNYXhJY29uID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5leHBhbmRlcl9jbG9zZV9ob2xvX2RhcmspOworICAgICAgICBtU2hvd01pbkljb24gPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmV4cGFuZGVyX29wZW5faG9sb19kYXJrKTsKICAgICAgICAgCiAgICAgICAgIC8vIFNldCBwZXJtaXNzaW9ucyB2aWV3CiAgICAgICAgIHNldFBlcm1pc3Npb25zKG1QZXJtc0xpc3QpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQppbmRleCAwNjU5MDYzLi42YjQ5OGZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKQEAgLTIzLDE0ICsyNSwxMiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KIAogLyoqCiAgKiBGcmFtZUxheW91dCBpcyBkZXNpZ25lZCB0byBibG9jayBvdXQgYW4gYXJlYSBvbiB0aGUgc2NyZWVuIHRvIGRpc3BsYXkKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERlc2NyaWJlcyBob3cgdGhlIGZvcmVncm91bmQgaXMgcG9zaXRpb25lZC4gRGVmYXVsdHMgdG8gRklMTC4KKyAgICAgKiBEZXNjcmliZXMgaG93IHRoZSBmb3JlZ3JvdW5kIGlzIHBvc2l0aW9uZWQuIERlZmF1bHRzIHRvIFNUQVJUIGFuZCBUT1AuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZm9yZWdyb3VuZEdyYXZpdHkgU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuR3Jhdml0eX0KICAgICAgKgpAQCAtMTI0LDggKzEyNCw4IEBACiAgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCiAgICAgcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZEdyYXZpdHkoaW50IGZvcmVncm91bmRHcmF2aXR5KSB7CiAgICAgICAgIGlmIChtRm9yZWdyb3VuZEdyYXZpdHkgIT0gZm9yZWdyb3VuZEdyYXZpdHkpIHsKLSAgICAgICAgICAgIGlmICgoZm9yZWdyb3VuZEdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yZWdyb3VuZEdyYXZpdHkgfD0gR3Jhdml0eS5MRUZUOworICAgICAgICAgICAgaWYgKChmb3JlZ3JvdW5kR3Jhdml0eSAmIEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kR3Jhdml0eSB8PSBHcmF2aXR5LlNUQVJUOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKGZvcmVncm91bmRHcmF2aXR5ICYgR3Jhdml0eS5WRVJUSUNBTF9HUkFWSVRZX01BU0spID09IDApIHsKQEAgLTM2NCwxMCArMzY0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGdyYXZpdHkgPSBERUZBVUxUX0NISUxEX0dSQVZJVFk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGhvcml6b250YWxHcmF2aXR5ID0gZ3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0s7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic29sdXRlR3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KGdyYXZpdHksIGlzTGF5b3V0UnRsKCkpOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCB2ZXJ0aWNhbEdyYXZpdHkgPSBncmF2aXR5ICYgR3Jhdml0eS5WRVJUSUNBTF9HUkFWSVRZX01BU0s7CiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGhvcml6b250YWxHcmF2aXR5KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhYnNvbHV0ZUdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5MRUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMZWZ0ID0gcGFyZW50TGVmdCArIGxwLmxlZnRNYXJnaW47CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTQzNiw3ICs0MzYsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEdyYXZpdHkuYXBwbHkobUZvcmVncm91bmRHcmF2aXR5LCBmb3JlZ3JvdW5kLmdldEludHJpbnNpY1dpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kLmdldEludHJpbnNpY0hlaWdodCgpLCBzZWxmQm91bmRzLCBvdmVybGF5Qm91bmRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVncm91bmQuZ2V0SW50cmluc2ljSGVpZ2h0KCksIHNlbGZCb3VuZHMsIG92ZXJsYXlCb3VuZHMsIGlzTGF5b3V0UnRsKCkpOwogICAgICAgICAgICAgICAgIGZvcmVncm91bmQuc2V0Qm91bmRzKG92ZXJsYXlCb3VuZHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZExheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRMYXlvdXQuamF2YQppbmRleCA0ODg5MTAxLi5iOTljZDdmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZExheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkTGF5b3V0LmphdmEKQEAgLTM4LDYgKzM4LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC5tYXg7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLm1pbjsKIApAQCAtNDYsNyArNDgsNyBAQAogICogPHA+CiAgKiBUaGUgZ3JpZCBpcyBjb21wb3NlZCBvZiBhIHNldCBvZiBpbmZpbml0ZWx5IHRoaW4gbGluZXMgdGhhdCBzZXBhcmF0ZSB0aGUKICAqIHZpZXdpbmcgYXJlYSBpbnRvIDxlbT5jZWxsczwvZW0+LiBUaHJvdWdob3V0IHRoZSBBUEksIGdyaWQgbGluZXMgYXJlIHJlZmVyZW5jZWQKLSAqIGJ5IGdyaWQgPGVtPmluZGljZXM8L2VtPi4gQSBncmlkIHRoYXQgaGFzIDxjb2RlPk48L2NvZGU+IGNvbHVtbnMKKyAqIGJ5IGdyaWQgPGVtPmluZGljZXM8L2VtPi4gQSBncmlkIHdpdGggPGNvZGU+TjwvY29kZT4gY29sdW1ucwogICogaGFzIDxjb2RlPk4gKyAxPC9jb2RlPiBncmlkIGluZGljZXMgdGhhdCBydW4gZnJvbSA8Y29kZT4wPC9jb2RlPgogICogdGhyb3VnaCA8Y29kZT5OPC9jb2RlPiBpbmNsdXNpdmUuIFJlZ2FyZGxlc3Mgb2YgaG93IEdyaWRMYXlvdXQgaXMKICAqIGNvbmZpZ3VyZWQsIGdyaWQgaW5kZXggPGNvZGU+MDwvY29kZT4gaXMgZml4ZWQgdG8gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUKQEAgLTExNiwxNiArMTE4LDI3IEBACiAgICAgICogVGhlIGhvcml6b250YWwgb3JpZW50YXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTCA9IExpbmVhckxheW91dC5IT1JJWk9OVEFMOworCiAgICAgLyoqCiAgICAgICogVGhlIHZlcnRpY2FsIG9yaWVudGF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlRJQ0FMID0gTGluZWFyTGF5b3V0LlZFUlRJQ0FMOwogCisgICAgLyoqCisgICAgICogVGhlIGNvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIHZhbHVlIGlzIHVuZGVmaW5lZC4KKyAgICAgKiBGaWVsZHMgY2FuIHVzZSB0aGlzIHZhbHVlIHRvIGluZGljYXRlIHRoYXQgdGhlaXIgdmFsdWVzCisgICAgICogaGF2ZSBub3QgeWV0IGJlZW4gc2V0LiBTaW1pbGFybHksIG1ldGhvZHMgY2FuIHJldHVybiB0aGlzIHZhbHVlCisgICAgICogdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBzdWl0YWJsZSB2YWx1ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIGNhbiByZXR1cm4uCisgICAgICogVGhlIHZhbHVlIHVzZWQgZm9yIHRoZSBjb25zdGFudCAoY3VycmVudGx5IHtAbGluayBJbnRlZ2VyI01JTl9WQUxVRX0pIGlzCisgICAgICogaW50ZW5kZWQgdG8gYXZvaWQgY29uZnVzaW9uIGJldHdlZW4gdmFsaWQgdmFsdWVzIHdob3NlIHNpZ24gbWF5IG5vdCBiZSBrbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKwogICAgIC8vIE1pc2MgY29uc3RhbnRzCiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gR3JpZExheW91dC5jbGFzcy5nZXROYW1lKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYWludCBHUklEX1BBSU5UID0gbmV3IFBhaW50KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEdPTERFTl9SQVRJTyA9ICgxICsgTWF0aC5zcXJ0KDUpKSAvIDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTiA9IDA7CkBAIC0xMzgsNiArMTUxLDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT1VOVCA9IFVOREVGSU5FRDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfVVNFX0RFRkFVTFRfTUFSR0lOUyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9PUkRFUl9QUkVTRVJWRUQgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfTUFSR0lOU19JTkNMVURFRCA9IHRydWU7CisgICAgLy8gdG9kbyByZW1vdmUgdGhpcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTlRBSU5FUl9NQVJHSU4gPSAyMDsKIAogICAgIC8vIFR5cGVkQXJyYXkgaW5kaWNlcwogCkBAIC0xNDUsOSArMTYxLDE2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPV19DT1VOVCA9IHN0eWxlYWJsZS5HcmlkTGF5b3V0X3Jvd0NvdW50OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ09VTlQgPSBzdHlsZWFibGUuR3JpZExheW91dF9jb2x1bW5Db3VudDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVNFX0RFRkFVTFRfTUFSR0lOUyA9IHN0eWxlYWJsZS5HcmlkTGF5b3V0X3VzZURlZmF1bHRNYXJnaW5zOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVJHSU5TX0lOQ0xVREVEID0gc3R5bGVhYmxlLkdyaWRMYXlvdXRfbWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPV19PUkRFUl9QUkVTRVJWRUQgPSBzdHlsZWFibGUuR3JpZExheW91dF9yb3dPcmRlclByZXNlcnZlZDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX09SREVSX1BSRVNFUlZFRCA9IHN0eWxlYWJsZS5HcmlkTGF5b3V0X2NvbHVtbk9yZGVyUHJlc2VydmVkOwogCisgICAgLy8gU3RhdGljIGluaXRpYWxpemF0aW9uCisKKyAgICBzdGF0aWMgeworICAgICAgICBHUklEX1BBSU5ULnNldENvbG9yKENvbG9yLmFyZ2IoNTAsIDI1NSwgMjU1LCAyNTUpKTsKKyAgICB9CisKICAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMKIAogICAgIHByaXZhdGUgZmluYWwgQXhpcyBtSG9yaXpvbnRhbEF4aXMgPSBuZXcgQXhpcyh0cnVlKTsKQEAgLTE1NSw5ICsxNzgsMTAgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUxheW91dFBhcmFtc1ZhbGlkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBpbnQgbU9yaWVudGF0aW9uID0gREVGQVVMVF9PUklFTlRBVElPTjsKICAgICBwcml2YXRlIGJvb2xlYW4gbVVzZURlZmF1bHRNYXJnaW5zID0gREVGQVVMVF9VU0VfREVGQVVMVF9NQVJHSU5TOworICAgIHByaXZhdGUgYm9vbGVhbiBtTWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQgPSBERUZBVUxUX01BUkdJTlNfSU5DTFVERUQ7CiAgICAgcHJpdmF0ZSBpbnQgbURlZmF1bHRHcmF2aXR5ID0gR3Jhdml0eS5OT19HUkFWSVRZOwotICAgIGJvb2xlYW4gbWF4aW1pemluZyA9IGZhbHNlOwotICAgIGJvb2xlYW4gYWNjb21tb2RhdGVCb3RoTWluQW5kTWF4ID0gZmFsc2U7CisKKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gYWNjb21tb2RhdGVCb3RoTWluQW5kTWF4ID0gZmFsc2U7CiAKICAgICAvLyBDb25zdHJ1Y3RvcnMKIApAQCAtMTk0LDYgKzIxOCw3IEBACiAgICAgICAgICAgICBzZXRDb2x1bW5Db3VudChhLmdldEludGVnZXIoQ09MVU1OX0NPVU5ULCBERUZBVUxUX0NPVU5UKSk7CiAgICAgICAgICAgICBtT3JpZW50YXRpb24gPSBhLmdldEludGVnZXIoT1JJRU5UQVRJT04sIERFRkFVTFRfT1JJRU5UQVRJT04pOwogICAgICAgICAgICAgbVVzZURlZmF1bHRNYXJnaW5zID0gYS5nZXRCb29sZWFuKFVTRV9ERUZBVUxUX01BUkdJTlMsIERFRkFVTFRfVVNFX0RFRkFVTFRfTUFSR0lOUyk7CisgICAgICAgICAgICBtTWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQgPSBhLmdldEJvb2xlYW4oTUFSR0lOU19JTkNMVURFRCwgREVGQVVMVF9NQVJHSU5TX0lOQ0xVREVEKTsKICAgICAgICAgICAgIHNldFJvd09yZGVyUHJlc2VydmVkKGEuZ2V0Qm9vbGVhbihST1dfT1JERVJfUFJFU0VSVkVELCBERUZBVUxUX09SREVSX1BSRVNFUlZFRCkpOwogICAgICAgICAgICAgc2V0Q29sdW1uT3JkZXJQcmVzZXJ2ZWQoYS5nZXRCb29sZWFuKENPTFVNTl9PUkRFUl9QUkVTRVJWRUQsIERFRkFVTFRfT1JERVJfUFJFU0VSVkVEKSk7CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC0zMjAsMTAgKzM0NSwxNSBAQAogICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBsYXlvdXQgcGFyYW1ldGVyLgogICAgICAqIDxwPgogICAgICAqIFdoZW4gZmFsc2UsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFsbCBtYXJnaW5zIGlzIHplcm8uCisgICAgICogPHA+CisgICAgICogV2hlbiBzZXR0aW5nIHRvIHRydWUsIGNvbnNpZGVyIHNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZQorICAgICAqIHtAbGluayAjc2V0TWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQoYm9vbGVhbikgbWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnR9CisgICAgICogcHJvcGVydHkgdG8gZmFsc2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdXNlRGVmYXVsdE1hcmdpbnMgdXNlIHRydWUgdG8gbWFrZSBHcmlkTGF5b3V0IGFsbG9jYXRlIGRlZmF1bHQgbWFyZ2lucwogICAgICAqCiAgICAgICogQHNlZSAjZ2V0VXNlRGVmYXVsdE1hcmdpbnMoKQorICAgICAqIEBzZWUgI3NldE1hcmdpbnNJbmNsdWRlZEluQWxpZ25tZW50KGJvb2xlYW4pCiAgICAgICoKICAgICAgKiBAc2VlIE1hcmdpbkxheW91dFBhcmFtcyNsZWZ0TWFyZ2luCiAgICAgICogQHNlZSBNYXJnaW5MYXlvdXRQYXJhbXMjdG9wTWFyZ2luCkBAIC0zMzQsNiArMzY0LDM5IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdE1hcmdpbnMoYm9vbGVhbiB1c2VEZWZhdWx0TWFyZ2lucykgewogICAgICAgICBtVXNlRGVmYXVsdE1hcmdpbnMgPSB1c2VEZWZhdWx0TWFyZ2luczsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBHcmlkTGF5b3V0IGFsaWducyB0aGUgZWRnZXMgb2YgdGhlIHZpZXcgb3IgdGhlIGVkZ2VzCisgICAgICogb2YgdGhlIGxhcmdlciByZWN0YW5nbGUgY3JlYXRlZCBieSBleHRlbmRpbmcgdGhlIHZpZXcgYnkgaXRzIGFzc29jaWF0ZWQKKyAgICAgKiBtYXJnaW5zLgorICAgICAqCisgICAgICogQHNlZSAjc2V0TWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQoYm9vbGVhbikKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGlnbm1lbnQgaXMgYmV0d2VlbiBlZGdlcyBpbmNsdWRpbmcgbWFyZ2lucy4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0dyaWRMYXlvdXRfbWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHRydWUsIHRoZSBib3VuZHMgb2YgYSB2aWV3IGFyZSBleHRlbmRlZCBvdXR3YXJkcyBhY2NvcmRpbmcgdG8gaXRzCisgICAgICogbWFyZ2lucyBiZWZvcmUgdGhlIGVkZ2VzIG9mIHRoZSByZXN1bHRpbmcgcmVjdGFuZ2xlIGFyZSBhbGlnbmVkLgorICAgICAqIFdoZW4gZmFsc2UsIGFsaWdubWVudCBvY2N1cnMgYmV0d2VlbiB0aGUgYm91bmRzIG9mIHRoZSB2aWV3IC0gaS5lLgorICAgICAqIHtAbGluayAjTEVGVH0gYWxpZ25tZW50IG1lYW5zIGFsaWduIHRoZSBsZWZ0IGVkZ2VzIG9mIHRoZSB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIG1hcmdpbnNJbmNsdWRlZEluQWxpZ25tZW50IHRydWUgaWYgYWxpZ25tZW50IGlzIGJldHdlZW4gZWRnZXMgaW5jbHVkaW5nIG1hcmdpbnMuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRNYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudCgpCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNHcmlkTGF5b3V0X21hcmdpbnNJbmNsdWRlZEluQWxpZ25tZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQoYm9vbGVhbiBtYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudCkgeworICAgICAgICBtTWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQgPSBtYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudDsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzUzLDExICs0MTYsOSBAQAogICAgIC8qKgogICAgICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBkZWZhdWx0IHN0YXRlLCBHcmlkTGF5b3V0CiAgICAgICogaXMgYXQgbGliZXJ0eSB0byBjaG9vc2UgYW4gb3JkZXIgdGhhdCBiZXR0ZXIgc3VpdHMgdGhlIGhlaWdodHMgb2YgaXRzIGNoaWxkcmVuLgotICAgICAgIDxwPgotICAgICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgR3JpZExheW91dCBpcyBmb3JjZWQgdG8gcGxhY2Ugcm93IGJvdW5kYXJpZXMKLSAgICAgKiAodGhlIHtAbGluayBJbnRlcnZhbCNtaW4gbWlufSBhbmQge0BsaW5rIEludGVydmFsI21heCBtYXh9IHZhbHVlcyBvZgotICAgICAqIGEge0BsaW5rIExheW91dFBhcmFtcyNyb3dHcm91cCByb3dHcm91cH0ncyB7QGxpbmsgR3JvdXAjc3BhbiBzcGFufSkKLSAgICAgKiBzbyB0aGF0IHRoZXkgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlciBpbiB0aGUgdmlldy4KKyAgICAgPHA+CisgICAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIDxjb2RlPnRydWU8L2NvZGU+LCBHcmlkTGF5b3V0IGlzIGZvcmNlZCB0byBwbGFjZSB0aGUgcm93IGJvdW5kYXJpZXMKKyAgICAgKiBzbyB0aGF0IHRoZWlyIGFzc29jaWF0ZWQgZ3JpZCBpbmRpY2VzIGFyZSBpbiBhc2NlbmRpbmcgb3JkZXIgaW4gdGhlIHZpZXcuCiAgICAgICogPHA+CiAgICAgICogR3JpZExheW91dCBpbXBsZW1lbnRzIHRoaXMgc3BlY2lmaWNhdGlvbiBieSBjcmVhdGluZyBvcmRlcmluZyBjb25zdHJhaW50cyBiZXR3ZWVuCiAgICAgICogdGhlIHZhcmlhYmxlcyB0aGF0IHJlcHJlc2VudCB0aGUgbG9jYXRpb25zIG9mIHRoZSByb3cgYm91bmRhcmllcy4KQEAgLTM3Nyw2ICs0MzgsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJvd09yZGVyUHJlc2VydmVkKGJvb2xlYW4gcm93T3JkZXJQcmVzZXJ2ZWQpIHsKICAgICAgICAgbVZlcnRpY2FsQXhpcy5zZXRPcmRlclByZXNlcnZlZChyb3dPcmRlclByZXNlcnZlZCk7CisgICAgICAgIGludmFsaWRhdGVTdHJ1Y3R1cmUoKTsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzk2LDExICs0NTksOSBAQAogICAgIC8qKgogICAgICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBkZWZhdWx0IHN0YXRlLCBHcmlkTGF5b3V0CiAgICAgICogaXMgYXQgbGliZXJ0eSB0byBjaG9vc2UgYW4gb3JkZXIgdGhhdCBiZXR0ZXIgc3VpdHMgdGhlIHdpZHRocyBvZiBpdHMgY2hpbGRyZW4uCi0gICAgICAgPHA+Ci0gICAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIDxjb2RlPnRydWU8L2NvZGU+LCBHcmlkTGF5b3V0IGlzIGZvcmNlZCB0byBwbGFjZSBjb2x1bW4gYm91bmRhcmllcwotICAgICAqICh0aGUge0BsaW5rIEludGVydmFsI21pbiBtaW59IGFuZCB7QGxpbmsgSW50ZXJ2YWwjbWF4IG1heH0gdmFsdWVzIG9mCi0gICAgICogYSB7QGxpbmsgTGF5b3V0UGFyYW1zI2NvbHVtbkdyb3VwIGNvbHVtbkdyb3VwfSdzIHtAbGluayBHcm91cCNzcGFuIHNwYW59KQotICAgICAqIHNvIHRoYXQgdGhleSBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyIGluIHRoZSB2aWV3LgorICAgICA8cD4KKyAgICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIEdyaWRMYXlvdXQgaXMgZm9yY2VkIHRvIHBsYWNlIHRoZSBjb2x1bW4gYm91bmRhcmllcworICAgICAqIHNvIHRoYXQgdGhlaXIgYXNzb2NpYXRlZCBncmlkIGluZGljZXMgYXJlIGluIGFzY2VuZGluZyBvcmRlciBpbiB0aGUgdmlldy4KICAgICAgKiA8cD4KICAgICAgKiBHcmlkTGF5b3V0IGltcGxlbWVudHMgdGhpcyBzcGVjaWZpY2F0aW9uIGJ5IGNyZWF0aW5nIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGJldHdlZW4KICAgICAgKiB0aGUgdmFyaWFibGVzIHRoYXQgcmVwcmVzZW50IHRoZSBsb2NhdGlvbnMgb2YgdGhlIGNvbHVtbiBib3VuZGFyaWVzLgpAQCAtNDIwLDEzICs0ODEsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5PcmRlclByZXNlcnZlZChib29sZWFuIGNvbHVtbk9yZGVyUHJlc2VydmVkKSB7CiAgICAgICAgIG1Ib3Jpem9udGFsQXhpcy5zZXRPcmRlclByZXNlcnZlZChjb2x1bW5PcmRlclByZXNlcnZlZCk7CisgICAgICAgIGludmFsaWRhdGVTdHJ1Y3R1cmUoKTsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBjb21wYXJlKGludCBpLCBpbnQgaikgewotICAgICAgICByZXR1cm4gaSA8IGogPyAtMSA6IGkgPiBqID8gMSA6IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHN1bShpbnRbXSBhKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHN1bShmbG9hdFtdIGEpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICByZXN1bHQgKz0gYVtpXTsKQEAgLTQ0MCwxMyArNDk5LDEyIEBACiAgICAgICAgIC8vIGdhcHMgYXJlIGluIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBnb2xkZW4gcmF0aW8uCiAgICAgICAgIC8vIFRvIGVmZmVjdCB0aGlzIHdpdGggZXF1YWwgbWFyZ2lucyBhdCBlYWNoIGVkZ2UsIHNldCBlYWNoIG9mIHRoZQogICAgICAgICAvLyBmb3VyIG1hcmdpbiB2YWx1ZXMgdG8gaGFsZiB0aGlzIGFtb3VudC4KLSAgICAgICAgYy5tZWFzdXJlKDAsIDApOwogICAgICAgICByZXR1cm4gKGludCkgKGMuZ2V0TWVhc3VyZWRIZWlnaHQoKSAvIEdPTERFTl9SQVRJTyAvIDIpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldERlZmF1bHRNYXJnaW4oVmlldyBjLCBib29sZWFuIGlzQXRFZGdlLCBib29sZWFuIGxlYWRpbmcsIGJvb2xlYW4gaG9yaXpvbnRhbCkgewotICAgICAgICAvLyB0b2RvIHJlbW92ZSAyMCAtIHVzZSBwYWRkaW5nIGhlcmU/Ci0gICAgICAgIHJldHVybiBpc0F0RWRnZSA/IDIwIDogZ2V0RGVmYXVsdE1hcmdpbihjLCBsZWFkaW5nLCBob3Jpem9udGFsKTsKKyAgICAgICAgLy8gdG9kbyByZW1vdmUgREVGQVVMVF9DT05UQUlORVJfTUFSR0lOLiBVc2UgcGFkZGluZz8gU2VlayBhZHZpY2Ugb24gVGhlbWVzL1N0eWxlcywgZXRjLgorICAgICAgICByZXR1cm4gaXNBdEVkZ2UgPyBERUZBVUxUX0NPTlRBSU5FUl9NQVJHSU4gOiBnZXREZWZhdWx0TWFyZ2luKGMsIGxlYWRpbmcsIGhvcml6b250YWwpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldERlZmF1bHRNYXJnaW5WYWx1ZShWaWV3IGMsIExheW91dFBhcmFtcyBwLCBib29sZWFuIGxlYWRpbmcsIGJvb2xlYW4gaG9yaXpvbnRhbCkgewpAQCAtNDU2LDcgKzUxNCw3IEBACiAgICAgICAgIEdyb3VwIGdyb3VwID0gaG9yaXpvbnRhbCA/IHAuY29sdW1uR3JvdXAgOiBwLnJvd0dyb3VwOwogICAgICAgICBBeGlzIGF4aXMgPSBob3Jpem9udGFsID8gbUhvcml6b250YWxBeGlzIDogbVZlcnRpY2FsQXhpczsKICAgICAgICAgSW50ZXJ2YWwgc3BhbiA9IGdyb3VwLnNwYW47Ci0gICAgICAgIGJvb2xlYW4gaXNBdEVkZ2UgPSBsZWFkaW5nID8gc3Bhbi5taW4gPT0gMCA6IHNwYW4ubWF4ID09IGF4aXMuZ2V0Q291bnQoKTsKKyAgICAgICAgYm9vbGVhbiBpc0F0RWRnZSA9IGxlYWRpbmcgPyAoc3Bhbi5taW4gPT0gMCkgOiAoc3Bhbi5tYXggPT0gYXhpcy5nZXRDb3VudCgpKTsKIAogICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdE1hcmdpbihjLCBpc0F0RWRnZSwgbGVhZGluZywgaG9yaXpvbnRhbCk7CiAgICAgfQpAQCAtNDY0LDggKzUyMiw4IEBACiAgICAgcHJpdmF0ZSBpbnQgZ2V0TWFyZ2luKFZpZXcgdmlldywgYm9vbGVhbiBsZWFkaW5nLCBib29sZWFuIGhvcml6b250YWwpIHsKICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gZ2V0TGF5b3V0UGFyYW1zKHZpZXcpOwogICAgICAgICBpbnQgbWFyZ2luID0gaG9yaXpvbnRhbCA/Ci0gICAgICAgICAgICAgICAgbGVhZGluZyA/IGxwLmxlZnRNYXJnaW4gOiBscC5yaWdodE1hcmdpbiA6Ci0gICAgICAgICAgICAgICAgbGVhZGluZyA/IGxwLnRvcE1hcmdpbiA6IGxwLmJvdHRvbU1hcmdpbjsKKyAgICAgICAgICAgICAgICAobGVhZGluZyA/IGxwLmxlZnRNYXJnaW4gOiBscC5yaWdodE1hcmdpbikgOgorICAgICAgICAgICAgICAgIChsZWFkaW5nID8gbHAudG9wTWFyZ2luIDogbHAuYm90dG9tTWFyZ2luKTsKICAgICAgICAgcmV0dXJuIG1hcmdpbiA9PSBVTkRFRklORUQgPyBnZXREZWZhdWx0TWFyZ2luVmFsdWUodmlldywgbHAsIGxlYWRpbmcsIGhvcml6b250YWwpIDogbWFyZ2luOwogICAgIH0KIApAQCAtNDc1LDcgKzUzMyw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVMYXlvdXRQYXJhbXMoKSB7CiAgICAgICAgIC8vIGluc3RhbGwgZGVmYXVsdCBpbmRpY2VzIGZvciBjZWxscyBpZiAqbm9uZSogYXJlIGRlZmluZWQKLSAgICAgICAgaWYgKG1Ib3Jpem9udGFsQXhpcy5tYXhJbmRleDEoKSA9PSBVTkRFRklORUQgfHwgbVZlcnRpY2FsQXhpcy5tYXhJbmRleDEoKSA9PSBVTkRFRklORUQpIHsKKyAgICAgICAgaWYgKG1Ib3Jpem9udGFsQXhpcy5tYXhJbmRleDEoKSA9PSBVTkRFRklORUQgfHwgKG1WZXJ0aWNhbEF4aXMubWF4SW5kZXgxKCkgPT0gVU5ERUZJTkVEKSkgewogICAgICAgICAgICAgYm9vbGVhbiBob3Jpem9udGFsID0gbU9yaWVudGF0aW9uID09IEhPUklaT05UQUw7CiAgICAgICAgICAgICBpbnQgY291bnQgPSBob3Jpem9udGFsID8gbUhvcml6b250YWxBeGlzLmNvdW50IDogbVZlcnRpY2FsQXhpcy5jb3VudDsKICAgICAgICAgICAgIGlmIChjb3VudCA9PSBVTkRFRklORUQpIHsKQEAgLTUzOSwxNCArNTk3LDE3IEBACiAgICAgICAgIG1MYXlvdXRQYXJhbXNWYWxpZCA9IGZhbHNlOwogICAgICAgICBtSG9yaXpvbnRhbEF4aXMuaW52YWxpZGF0ZVN0cnVjdHVyZSgpOwogICAgICAgICBtVmVydGljYWxBeGlzLmludmFsaWRhdGVTdHJ1Y3R1cmUoKTsKLQogICAgICAgICAvLyBUaGlzIGNhbiBlbmQgdXAgYmVpbmcgZG9uZSB0d2ljZS4gQnV0IGJldHRlciB0aGF0IHRoYW4gbm90IGF0IGFsbC4KICAgICAgICAgaW52YWxpZGF0ZVZhbHVlcygpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkYXRlVmFsdWVzKCkgewotICAgICAgICBtSG9yaXpvbnRhbEF4aXMuaW52YWxpZGF0ZVZhbHVlcygpOwotICAgICAgICBtVmVydGljYWxBeGlzLmludmFsaWRhdGVWYWx1ZXMoKTsKKyAgICAgICAgLy8gTmVlZCBudWxsIGNoZWNrIGJlY2F1c2UgcmVxdWVzdExheW91dCgpIGlzIGNhbGxlZCBpbiBWaWV3J3MgaW5pdGlhbGl6ZXIsCisgICAgICAgIC8vIGJlZm9yZSB3ZSBhcmUgc2V0IHVwLgorICAgICAgICBpZiAobUhvcml6b250YWxBeGlzICE9IG51bGwgJiYgbVZlcnRpY2FsQXhpcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtSG9yaXpvbnRhbEF4aXMuaW52YWxpZGF0ZVZhbHVlcygpOworICAgICAgICAgICAgbVZlcnRpY2FsQXhpcy5pbnZhbGlkYXRlVmFsdWVzKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIExheW91dFBhcmFtcyBnZXRMYXlvdXRQYXJhbXMxKFZpZXcgYykgewpAQCAtNjA1LDEwICs2NjYsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdGljIHsKLSAgICAgICAgR1JJRF9QQUlOVC5zZXRDb2xvcihDb2xvci5hcmdiKDUwLCAyNTUsIDI1NSwgMjU1KSk7Ci0gICAgfQotCiAgICAgLy8gQWRkL3JlbW92ZQogCiAgICAgQE92ZXJyaWRlCkBAIC02NDMsMTggKzcwMCw0OSBAQAogCiAgICAgLy8gTWVhc3VyZW1lbnQKIAorICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRDaGlsZE1lYXN1cmVTcGVjMihpbnQgc3BlYywgaW50IHBhZGRpbmcsIGludCBjaGlsZERpbWVuc2lvbikgeworICAgICAgICBpbnQgcmVzdWx0U2l6ZTsKKyAgICAgICAgaW50IHJlc3VsdE1vZGU7CisKKyAgICAgICAgaWYgKGNoaWxkRGltZW5zaW9uID49IDApIHsKKyAgICAgICAgICAgIHJlc3VsdFNpemUgPSBjaGlsZERpbWVuc2lvbjsKKyAgICAgICAgICAgIHJlc3VsdE1vZGUgPSBFWEFDVExZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIHVzaW5nIHRoZSBmb2xsb3dpbmcgbGluZXMgd291bGQgcmVwbGljYXRlIHRoZSBsb2dpYyBvZiBWaWV3R3JvdXAuZ2V0Q2hpbGRNZWFzdXJlU3BlYygpCisKKyAgICAgICAgICAgIGludCBzcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoc3BlYyk7CisgICAgICAgICAgICBpbnQgc3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHNwZWMpOworICAgICAgICAgICAgaW50IHNpemUgPSBNYXRoLm1heCgwLCBzcGVjU2l6ZSAtIHBhZGRpbmcpOworCisgICAgICAgICAgICByZXN1bHRTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIHJlc3VsdE1vZGUgPSAoc3BlY01vZGUgPT0gRVhBQ1RMWSAmJiBjaGlsZERpbWVuc2lvbiA9PSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSA/CisgICAgICAgICAgICAgICAgICAgIEFUX01PU1QgOiBzcGVjTW9kZTsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICByZXN1bHRTaXplID0gMDsKKyAgICAgICAgICAgIHJlc3VsdE1vZGUgPSBVTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKHJlc3VsdFNpemUsIHJlc3VsdE1vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG1lYXN1cmVDaGlsZChWaWV3IGNoaWxkLCBpbnQgcGFyZW50V2lkdGhTcGVjLCBpbnQgcGFyZW50SGVpZ2h0U3BlYykgeworICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgaW50IGNoaWxkV2lkdGhNZWFzdXJlU3BlYyA9IGdldENoaWxkTWVhc3VyZVNwZWMyKHBhcmVudFdpZHRoU3BlYywKKyAgICAgICAgICAgICAgICBtUGFkZGluZ0xlZnQgKyBtUGFkZGluZ1JpZ2h0LCBscC53aWR0aCk7CisgICAgICAgIGludCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gZ2V0Q2hpbGRNZWFzdXJlU3BlYzIocGFyZW50SGVpZ2h0U3BlYywKKyAgICAgICAgICAgICAgICBtUGFkZGluZ1RvcCArIG1QYWRkaW5nQm90dG9tLCBscC5oZWlnaHQpOworCisgICAgICAgIGNoaWxkLm1lYXN1cmUoY2hpbGRXaWR0aE1lYXN1cmVTcGVjLCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoU3BlYywgaW50IGhlaWdodFNwZWMpIHsKLSAgICAgICAgaW52YWxpZGF0ZVZhbHVlcygpOwotICAgICAgICAvLyBpbnQgd2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoU3BlYyk7Ci0gICAgICAgIC8vIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoU3BlYyk7Ci0gICAgICAgIC8vIGludCBoZWlnaHQgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodFNwZWMpOwotICAgICAgICAvLyBpbnQgaGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0U3BlYyk7CisgICAgICAgIG1lYXN1cmVDaGlsZHJlbih3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwogCi0gICAgICAgIC8vIHRvZG8gLSBoYW5kbGUgd2lkdGhTcGVjIGFuZCBoZWlnaHRTcGVjIHByb3Blcmx5Ci0KLSAgICAgICAgaW50IGNvbXB1dGVkV2lkdGggPSBnZXRQYWRkaW5nTGVmdCgpICsgbUhvcml6b250YWxBeGlzLmdldFByZWYoKSArIGdldFBhZGRpbmdSaWdodCgpOwotICAgICAgICBpbnQgY29tcHV0ZWRIZWlnaHQgPSBnZXRQYWRkaW5nVG9wKCkgKyBtVmVydGljYWxBeGlzLmdldFByZWYoKSArIGdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgaW50IGNvbXB1dGVkV2lkdGggPSBnZXRQYWRkaW5nTGVmdCgpICsgbUhvcml6b250YWxBeGlzLmdldE1pbigpICsgZ2V0UGFkZGluZ1JpZ2h0KCk7CisgICAgICAgIGludCBjb21wdXRlZEhlaWdodCA9IGdldFBhZGRpbmdUb3AoKSArIG1WZXJ0aWNhbEF4aXMuZ2V0TWluKCkgKyBnZXRQYWRkaW5nQm90dG9tKCk7CiAKICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oCiAgICAgICAgICAgICAgICAgcmVzb2x2ZVNpemVBbmRTdGF0ZShjb21wdXRlZFdpZHRoLCB3aWR0aFNwZWMsIDApLApAQCAtNjYyLDQxICs3NTAsNTQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGludCBwcm90ZWN0KGludCBhbGlnbm1lbnQpIHsKLSAgICAgICAgcmV0dXJuIGFsaWdubWVudCA9PSBVTkRFRklORUQgPyAwIDogYWxpZ25tZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldExvY2F0aW9uSW5jbHVkaW5nTWFyZ2luKEF4aXMgc3RhdGUsIGludCBpbmRleCwgYm9vbGVhbiBsZWFkaW5nKSB7Ci0gICAgICAgIGludCBtYXJnaW4gPSBsZWFkaW5nID8gc3RhdGUubGVhZGluZ01hcmdpbnNbaW5kZXhdIDogLXN0YXRlLnRyYWlsaW5nTWFyZ2luc1tpbmRleF07Ci0gICAgICAgIHJldHVybiBzdGF0ZS5sb2NhdGlvbnNbaW5kZXhdICsgbWFyZ2luOworICAgICAgICByZXR1cm4gKGFsaWdubWVudCA9PSBVTkRFRklORUQpID8gMCA6IGFsaWdubWVudDsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXRNZWFzdXJlbWVudChWaWV3IGMsIGJvb2xlYW4gaG9yaXpvbnRhbCwgaW50IG1lYXN1cmVtZW50VHlwZSkgewotICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBjLmdldExheW91dFBhcmFtcygpOwotICAgICAgICAvLyBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGUgc2l6ZS4KLSAgICAgICAgLy8gSWYgc28sIHJldHVybiB0aGUgc3BlY2lmaWVkIHNpemUuCi0gICAgICAgIGludCBzaXplID0gaG9yaXpvbnRhbCA/IGxwLndpZHRoIDogbHAuaGVpZ2h0OwotICAgICAgICBpZiAoc2l6ZSA+PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gaG9yaXpvbnRhbCA/IGMuZ2V0TWVhc3VyZWRXaWR0aCgpIDogYy5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgIH0KIAotICAgICAgICAvLyBtZWFzdXJlQ2hpbGQoYywgMCwgMCk7Ci0gICAgICAgIGMubWVhc3VyZSgwLCAwKTsvLyB0b2RvIHdvcmsgb3V0IGNvcnJlY3Qgb3JkZXIgb2YgZXZlbnRzIGZvciBtZWFzdXJlbWVudCBjYWxscwotICAgICAgICBpbnQgcmVzdWx0ID0gaG9yaXpvbnRhbCA/IGMuZ2V0TWVhc3VyZWRXaWR0aCgpIDogYy5nZXRNZWFzdXJlZEhlaWdodCgpOwotCi0gICAgICAgIGZsb2F0IHdlaWdodCA9IGhvcml6b250YWwgPyBscC5jb2x1bW5XZWlnaHQgOiBscC5yb3dXZWlnaHQ7Ci0gICAgICAgIEF4aXMgYXhpcyA9IGhvcml6b250YWwgPyBtSG9yaXpvbnRhbEF4aXMgOiBtVmVydGljYWxBeGlzOwotICAgICAgICBpZiAod2VpZ2h0ICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyBheGlzLnByZWZTaXplT2ZXZWlnaHRlZENvbXBvbmVudDsKKyAgICBwcml2YXRlIGludCBnZXRNZWFzdXJlbWVudEluY2x1ZGluZ01hcmdpbihWaWV3IGMsIGJvb2xlYW4gaG9yaXpvbnRhbCwgaW50IG1lYXN1cmVtZW50VHlwZSkgeworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0TWVhc3VyZW1lbnQoYywgaG9yaXpvbnRhbCwgbWVhc3VyZW1lbnRUeXBlKTsKKyAgICAgICAgaWYgKG1NYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudCkgeworICAgICAgICAgICAgaW50IGxlYWRpbmdNYXJnaW4gPSBnZXRNYXJnaW4oYywgdHJ1ZSwgaG9yaXpvbnRhbCk7CisgICAgICAgICAgICBpbnQgdHJhaWxpbmdNYXJnaW4gPSBnZXRNYXJnaW4oYywgZmFsc2UsIGhvcml6b250YWwpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIGxlYWRpbmdNYXJnaW4gKyB0cmFpbGluZ01hcmdpbjsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIC8vIExheW91dCBjb250YWluZXIKKyAgICBwcml2YXRlIGludCBnZXRBbGlnbm1lbnRWYWx1ZShBbGlnbm1lbnQgYWxpZ25tZW50LCBWaWV3IGMsIGludCBkaW0sIGJvb2xlYW4gaG9yaXpvbnRhbCwgVmlldyBjMSkgeworICAgICAgICBpbnQgcmVzdWx0ID0gYWxpZ25tZW50LmdldEFsaWdubWVudFZhbHVlKGMsIGRpbSk7CisgICAgICAgIGlmIChtTWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQpIHsKKyAgICAgICAgICAgIGludCBsZWFkaW5nTWFyZ2luID0gZ2V0TWFyZ2luKGMxLCB0cnVlLCBob3Jpem9udGFsKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyBsZWFkaW5nTWFyZ2luOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RMYXlvdXQoKSB7CisgICAgICAgIHN1cGVyLnJlcXVlc3RMYXlvdXQoKTsKICAgICAgICAgaW52YWxpZGF0ZVZhbHVlcygpOworICAgIH0KIAorICAgIC8vIExheW91dCBjb250YWluZXIKKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICAvKgorICAgICBUaGUgbGF5b3V0IG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBieSBkZWxlZ2F0aW5nIHRoZSBoZWF2eSBsaWZ0aW5nIHRvIHRoZQorICAgICB0byB0aGUgbUhvcml6b250YWxBeGlzIGFuZCBtVmVydGljYWxBeGlzIGluc3RhbmNlcyBvZiB0aGUgaW50ZXJuYWwgQXhpcyBjbGFzcy4KKyAgICAgVG9nZXRoZXIgdGhleSBjb21wdXRlIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGxpbmVzIG9mCisgICAgIHRoZSBncmlkIChyZXNwZWN0aXZlbHkhKS4KKworICAgICBUaGlzIG1ldGhvZCBpcyB0aGVuIGxlZnQgd2l0aCB0aGUgc2ltcGxlciB0YXNrIG9mIGFwcGx5aW5nIG1hcmdpbnMsIGdyYXZpdHkKKyAgICAgYW5kIHNpemluZyB0byBlYWNoIGNoaWxkIHZpZXcgYW5kIHRoZW4gcGxhY2luZyBpdCBpbiBpdHMgY2VsbC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CiAgICAgICAgIGludCB0YXJnZXRXaWR0aCA9IHIgLSBsOwogICAgICAgICBpbnQgdGFyZ2V0SGVpZ2h0ID0gYiAtIHQ7CiAKQEAgLTcxMCwzMyArODExLDQzIEBACiAKICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBnZXRDaGlsZENvdW50KCk7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBMYXlvdXRQYXJhbXMgY29uc3RyYWludHMgPSBnZXRMYXlvdXRQYXJhbXModmlldyk7Ci0gICAgICAgICAgICBJbnRlcnZhbCBoUmFuZ2UgPSBjb25zdHJhaW50cy5jb2x1bW5Hcm91cC5zcGFuOwotICAgICAgICAgICAgSW50ZXJ2YWwgdlJhbmdlID0gY29uc3RyYWludHMucm93R3JvdXAuc3BhbjsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IGdldExheW91dFBhcmFtcyh2aWV3KTsKKyAgICAgICAgICAgIEdyb3VwIGNvbHVtbkdyb3VwID0gbHAuY29sdW1uR3JvdXA7CisgICAgICAgICAgICBHcm91cCByb3dHcm91cCA9IGxwLnJvd0dyb3VwOwogCi0gICAgICAgICAgICBpbnQgeDEgPSBnZXRMb2NhdGlvbkluY2x1ZGluZ01hcmdpbihtSG9yaXpvbnRhbEF4aXMsIGhSYW5nZS5taW4sIHRydWUpOwotICAgICAgICAgICAgaW50IHkxID0gZ2V0TG9jYXRpb25JbmNsdWRpbmdNYXJnaW4obVZlcnRpY2FsQXhpcywgdlJhbmdlLm1pbiwgdHJ1ZSk7CisgICAgICAgICAgICBJbnRlcnZhbCBjb2xTcGFuID0gY29sdW1uR3JvdXAuc3BhbjsKKyAgICAgICAgICAgIEludGVydmFsIHJvd1NwYW4gPSByb3dHcm91cC5zcGFuOwogCi0gICAgICAgICAgICBpbnQgeDIgPSBnZXRMb2NhdGlvbkluY2x1ZGluZ01hcmdpbihtSG9yaXpvbnRhbEF4aXMsIGhSYW5nZS5tYXgsIGZhbHNlKTsKLSAgICAgICAgICAgIGludCB5MiA9IGdldExvY2F0aW9uSW5jbHVkaW5nTWFyZ2luKG1WZXJ0aWNhbEF4aXMsIHZSYW5nZS5tYXgsIGZhbHNlKTsKKyAgICAgICAgICAgIGludCB4MSA9IG1Ib3Jpem9udGFsQXhpcy5nZXRMb2NhdGlvbkluY2x1ZGluZ01hcmdpbih2aWV3LCB0cnVlLCBjb2xTcGFuLm1pbik7CisgICAgICAgICAgICBpbnQgeTEgPSBtVmVydGljYWxBeGlzLmdldExvY2F0aW9uSW5jbHVkaW5nTWFyZ2luKHZpZXcsIHRydWUsIHJvd1NwYW4ubWluKTsKKworICAgICAgICAgICAgaW50IHgyID0gbUhvcml6b250YWxBeGlzLmdldExvY2F0aW9uSW5jbHVkaW5nTWFyZ2luKHZpZXcsIGZhbHNlLCBjb2xTcGFuLm1heCk7CisgICAgICAgICAgICBpbnQgeTIgPSBtVmVydGljYWxBeGlzLmdldExvY2F0aW9uSW5jbHVkaW5nTWFyZ2luKHZpZXcsIGZhbHNlLCByb3dTcGFuLm1heCk7CiAKICAgICAgICAgICAgIGludCBjZWxsV2lkdGggPSB4MiAtIHgxOwogICAgICAgICAgICAgaW50IGNlbGxIZWlnaHQgPSB5MiAtIHkxOwogCi0gICAgICAgICAgICBCb3VuZHMgbWluTWF4WCA9IG1Ib3Jpem9udGFsQXhpcy5nZXRHcm91cEJvdW5kcygpLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgQm91bmRzIG1pbk1heFkgPSBtVmVydGljYWxBeGlzLmdldEdyb3VwQm91bmRzKCkuZ2V0VmFsdWUoaSk7Ci0KICAgICAgICAgICAgIGludCBwV2lkdGggPSBnZXRNZWFzdXJlbWVudCh2aWV3LCB0cnVlLCBQUkYpOwogICAgICAgICAgICAgaW50IHBIZWlnaHQgPSBnZXRNZWFzdXJlbWVudCh2aWV3LCBmYWxzZSwgUFJGKTsKIAotICAgICAgICAgICAgQWxpZ25tZW50IGhBbGlnbm1lbnQgPSBjb25zdHJhaW50cy5jb2x1bW5Hcm91cC5hbGlnbm1lbnQ7Ci0gICAgICAgICAgICBBbGlnbm1lbnQgdkFsaWdubWVudCA9IGNvbnN0cmFpbnRzLnJvd0dyb3VwLmFsaWdubWVudDsKKyAgICAgICAgICAgIEFsaWdubWVudCBoQWxpZ25tZW50ID0gY29sdW1uR3JvdXAuYWxpZ25tZW50OworICAgICAgICAgICAgQWxpZ25tZW50IHZBbGlnbm1lbnQgPSByb3dHcm91cC5hbGlnbm1lbnQ7CiAKLSAgICAgICAgICAgIGludCBkZHggPSBwcm90ZWN0KGhBbGlnbm1lbnQuZ2V0QWxpZ25tZW50VmFsdWUobnVsbCwgY2VsbFdpZHRoIC0gbWluTWF4WC5zaXplKCkpKTsKLSAgICAgICAgICAgIGludCBkZHkgPSBwcm90ZWN0KHZBbGlnbm1lbnQuZ2V0QWxpZ25tZW50VmFsdWUobnVsbCwgY2VsbEhlaWdodCAtIG1pbk1heFkuc2l6ZSgpKSk7CisgICAgICAgICAgICBpbnQgZHgsIGR5OwogCi0gICAgICAgICAgICBpbnQgZHggPSBkZHggKyAtbWluTWF4WC5iZWxvdyAtIGhBbGlnbm1lbnQuZ2V0QWxpZ25tZW50VmFsdWUodmlldywgcFdpZHRoKTsKLSAgICAgICAgICAgIGludCBkeSA9IGRkeSArIC1taW5NYXhZLmJlbG93IC0gdkFsaWdubWVudC5nZXRBbGlnbm1lbnRWYWx1ZSh2aWV3LCBwSGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChtTWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQpIHsKKyAgICAgICAgICAgICAgICBkeCA9IHByb3RlY3QoaEFsaWdubWVudC5nZXRBbGlnbm1lbnRWYWx1ZSh2aWV3LCBjZWxsV2lkdGggLSBwV2lkdGgpKTsKKyAgICAgICAgICAgICAgICBkeSA9IHByb3RlY3QodkFsaWdubWVudC5nZXRBbGlnbm1lbnRWYWx1ZSh2aWV3LCBjZWxsSGVpZ2h0IC0gcEhlaWdodCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBCb3VuZHMgY29sQm91bmRzID0gbUhvcml6b250YWxBeGlzLmdldEdyb3VwQm91bmRzKCkuZ2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgQm91bmRzIHJvd0JvdW5kcyA9IG1WZXJ0aWNhbEF4aXMuZ2V0R3JvdXBCb3VuZHMoKS5nZXRWYWx1ZShpKTsKKworICAgICAgICAgICAgICAgIGludCBteCA9IHByb3RlY3QoaEFsaWdubWVudC5nZXRBbGlnbm1lbnRWYWx1ZShudWxsLCBjZWxsV2lkdGggLSBjb2xCb3VuZHMuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgaW50IG15ID0gcHJvdGVjdCh2QWxpZ25tZW50LmdldEFsaWdubWVudFZhbHVlKG51bGwsIGNlbGxIZWlnaHQgLSByb3dCb3VuZHMuc2l6ZSgpKSk7CisKKyAgICAgICAgICAgICAgICBkeCA9IG14ICsgLWNvbEJvdW5kcy5iZWxvdyAtIGhBbGlnbm1lbnQuZ2V0QWxpZ25tZW50VmFsdWUodmlldywgcFdpZHRoKTsKKyAgICAgICAgICAgICAgICBkeSA9IG15ICsgLXJvd0JvdW5kcy5iZWxvdyAtIHZBbGlnbm1lbnQuZ2V0QWxpZ25tZW50VmFsdWUodmlldywgcEhlaWdodCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCB3aWR0aCA9IGhBbGlnbm1lbnQuZ2V0U2l6ZUluQ2VsbCh2aWV3LCBwV2lkdGgsIGNlbGxXaWR0aCk7CiAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gdkFsaWdubWVudC5nZXRTaXplSW5DZWxsKHZpZXcsIHBIZWlnaHQsIGNlbGxIZWlnaHQpOwpAQCAtNzQ5LDkgKzg2MCwxNCBAQAogCiAgICAgLy8gSW5uZXIgY2xhc3NlcwogCisgICAgLyoKKyAgICAgVGhpcyBpbnRlcm5hbCBjbGFzcyBob3VzZXMgdGhlIGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIHRoZSBsb2NhdGlvbnMgb2YgZ3JpZCBsaW5lczsKKyAgICAgYWxvbmcgZWl0aGVyIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGF4aXMuIEEgR3JpZExheW91dCB1c2VzIHR3byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyAtCisgICAgIGRpc3Rpbmd1aXNoZWQgYnkgdGhlICJob3Jpem9udGFsIiBmbGFnIHdoaWNoIGlzIHRydWUgZm9yIHRoZSBob3Jpem9udGFsIGF4aXMgYW5kIGZhbHNlCisgICAgIGZvciB0aGUgdmVydGljYWwgb25lLgorICAgICAqLwogICAgIHByaXZhdGUgY2xhc3MgQXhpcyB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fVkFMVUUgPSAtMTAwMDAwMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9WQUxVRSA9IDEwMDAwMDA7CiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOVklTSVRFRCA9IDA7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRU5ESU5HID0gMTsKQEAgLTc2NiwyMCArODgyLDI1IEBACiAgICAgICAgIFBhY2tlZE1hcDxHcm91cCwgQm91bmRzPiBncm91cEJvdW5kczsKICAgICAgICAgcHVibGljIGJvb2xlYW4gZ3JvdXBCb3VuZHNWYWxpZCA9IGZhbHNlOwogCi0gICAgICAgIFBhY2tlZE1hcDxJbnRlcnZhbCwgSW50PiBzcGFuU2l6ZXM7CisgICAgICAgIFBhY2tlZE1hcDxJbnRlcnZhbCwgTXV0YWJsZUludD4gc3BhblNpemVzOwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBzcGFuU2l6ZXNWYWxpZCA9IGZhbHNlOwogCi0gICAgICAgIHB1YmxpYyBpbnRbXSBsb2NhdGlvbnM7Ci0KICAgICAgICAgcHVibGljIGludFtdIGxlYWRpbmdNYXJnaW5zOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsZWFkaW5nTWFyZ2luc1ZhbGlkID0gZmFsc2U7CisKICAgICAgICAgcHVibGljIGludFtdIHRyYWlsaW5nTWFyZ2luczsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdHJhaWxpbmdNYXJnaW5zVmFsaWQgPSBmYWxzZTsKIAogICAgICAgICBwdWJsaWMgQXJjW10gYXJjczsKICAgICAgICAgcHVibGljIGJvb2xlYW4gYXJjc1ZhbGlkID0gZmFsc2U7CiAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1PcmRlclByZXNlcnZlZCA9IERFRkFVTFRfT1JERVJfUFJFU0VSVkVEOworICAgICAgICBwdWJsaWMgaW50W10gbWluaW1hOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtaW5pbWFWYWxpZCA9IGZhbHNlOwogCi0gICAgICAgIHB1YmxpYyBpbnQgcHJlZlNpemVPZldlaWdodGVkQ29tcG9uZW50OworICAgICAgICBwdWJsaWMgZmxvYXRbXSB3ZWlnaHRzOworICAgICAgICBwdWJsaWMgaW50W10gbG9jYXRpb25zOworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT3JkZXJQcmVzZXJ2ZWQgPSBERUZBVUxUX09SREVSX1BSRVNFUlZFRDsKIAogICAgICAgICBwcml2YXRlIEF4aXMoYm9vbGVhbiBob3Jpem9udGFsKSB7CiAgICAgICAgICAgICB0aGlzLmhvcml6b250YWwgPSBob3Jpem9udGFsOwpAQCAtODQ0LDE3ICs5NjUsMTcgQEAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBCb3VuZHMudmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZ3JvdXBCb3VuZHMudmFsdWVzW2ldLnJlc2V0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGdldENoaWxkQ291bnQoKTsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIE4gPSBnZXRDaGlsZENvdW50KCk7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgICAgICBWaWV3IGMgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IGdldExheW91dFBhcmFtcyhjKTsKICAgICAgICAgICAgICAgICBHcm91cCBnID0gaG9yaXpvbnRhbCA/IGxwLmNvbHVtbkdyb3VwIDogbHAucm93R3JvdXA7CiAKICAgICAgICAgICAgICAgICBCb3VuZHMgYm91bmRzID0gZ3JvdXBCb3VuZHMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgaW50IGRpbSA9IGdldE1lYXN1cmVtZW50KGMsIGhvcml6b250YWwsIFBSRik7CisKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGdldE1lYXN1cmVtZW50SW5jbHVkaW5nTWFyZ2luKGMsIGhvcml6b250YWwsIFBSRik7CiAgICAgICAgICAgICAgICAgLy8gdG9kbyB0ZXN0IHRoaXMgd29ya3MgY29ycmVjdGx5IHdoZW4gdGhlIHJldHVybmVkIHZhbHVlIGlzIFVOREVGSU5FRAotICAgICAgICAgICAgICAgIGludCBiZWxvdyA9IGcuYWxpZ25tZW50LmdldEFsaWdubWVudFZhbHVlKGMsIGRpbSk7Ci0gICAgICAgICAgICAgICAgaW50IGFib3ZlID0gZGltIC0gYmVsb3c7Ci0gICAgICAgICAgICAgICAgYm91bmRzLmluY2x1ZGUoLWJlbG93LCBhYm92ZSk7CisgICAgICAgICAgICAgICAgaW50IGJlbG93ID0gZ2V0QWxpZ25tZW50VmFsdWUoZy5hbGlnbm1lbnQsIGMsIHNpemUsIGhvcml6b250YWwsIGMpOworICAgICAgICAgICAgICAgIGJvdW5kcy5pbmNsdWRlKC1iZWxvdywgc2l6ZSAtIGJlbG93KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC04NzAsMzYgKzk5MSwzNiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gQWRkIHZhbHVlcyBjb21wdXRlZCBieSBhbGlnbm1lbnQgLSB0YWtpbmcgdGhlIG1heCBvZiBhbGwgYWxpZ25tZW50cyBpbiBlYWNoIHNwYW4KLSAgICAgICAgcHJpdmF0ZSBQYWNrZWRNYXA8SW50ZXJ2YWwsIEludD4gY3JlYXRlU3BhblNpemVzKCkgeworICAgICAgICBwcml2YXRlIFBhY2tlZE1hcDxJbnRlcnZhbCwgTXV0YWJsZUludD4gY3JlYXRlU3BhblNpemVzKCkgewogICAgICAgICAgICAgUGFja2VkTWFwPEdyb3VwLCBCb3VuZHM+IGdyb3VwQm91bmRzID0gZ2V0R3JvdXBCb3VuZHMoKTsKICAgICAgICAgICAgIGludCBOID0gZ3JvdXBCb3VuZHMua2V5cy5sZW5ndGg7CiAgICAgICAgICAgICBJbnRlcnZhbFtdIHNwYW5zID0gbmV3IEludGVydmFsW05dOwotICAgICAgICAgICAgSW50W10gdmFsdWVzID0gbmV3IEludFtOXTsKKyAgICAgICAgICAgIE11dGFibGVJbnRbXSB2YWx1ZXMgPSBuZXcgTXV0YWJsZUludFtOXTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgSW50ZXJ2YWwga2V5ID0gZ3JvdXBCb3VuZHMua2V5c1tpXS5zcGFuOwogCiAgICAgICAgICAgICAgICAgc3BhbnNbaV0gPSBrZXk7Ci0gICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gbmV3IEludCgpOworICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ldyBNdXRhYmxlSW50KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBhY2tlZE1hcDxJbnRlcnZhbCwgSW50PihzcGFucywgdmFsdWVzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFja2VkTWFwPEludGVydmFsLCBNdXRhYmxlSW50PihzcGFucywgdmFsdWVzKTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlU3BhblNpemVzKCkgewotICAgICAgICAgICAgSW50W10gc3BhbnMgPSBzcGFuU2l6ZXMudmFsdWVzOworICAgICAgICAgICAgTXV0YWJsZUludFtdIHNwYW5zID0gc3BhblNpemVzLnZhbHVlczsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICBzcGFuc1tpXS5yZXNldCgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBCb3VuZHNbXSBib3VuZHMgPSBnZXRHcm91cEJvdW5kcygpLnZhbHVlczsgIC8vIHVzIGdldCB0byB0cmlnZ2VyIGEgcmUtZXZhbHVhdGlvbgorICAgICAgICAgICAgQm91bmRzW10gYm91bmRzID0gZ2V0R3JvdXBCb3VuZHMoKS52YWx1ZXM7ICAvLyB1c2UgZ2V0dGVyIHRvIHRyaWdnZXIgYSByZS1ldmFsdWF0aW9uCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJvdW5kcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IGJvdW5kc1tpXS5zaXplKCk7CiAKLSAgICAgICAgICAgICAgICBJbnQgdmFsdWVIb2xkZXIgPSBzcGFuU2l6ZXMuZ2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgTXV0YWJsZUludCB2YWx1ZUhvbGRlciA9IHNwYW5TaXplcy5nZXRWYWx1ZShpKTsKICAgICAgICAgICAgICAgICB2YWx1ZUhvbGRlci52YWx1ZSA9IG1heCh2YWx1ZUhvbGRlci52YWx1ZSwgdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBQYWNrZWRNYXA8SW50ZXJ2YWwsIEludD4gZ2V0U3BhblNpemVzKCkgeworICAgICAgICBwcml2YXRlIFBhY2tlZE1hcDxJbnRlcnZhbCwgTXV0YWJsZUludD4gZ2V0U3BhblNpemVzKCkgewogICAgICAgICAgICAgaWYgKHNwYW5TaXplcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc3BhblNpemVzID0gY3JlYXRlU3BhblNpemVzKCk7CiAgICAgICAgICAgICB9CkBAIC05MTAsOSArMTAzMSw3IEBACiAgICAgICAgICAgICByZXR1cm4gc3BhblNpemVzOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluY2x1ZGUoTGlzdDxBcmM+IGFyY3MsIEludGVydmFsIGtleSwgSW50IHNpemUsIGJvb2xlYW4gbWF4aW1pemluZykgewotICAgICAgICAgICAga2V5ID0gbWF4aW1pemluZyA/IGtleS5pbnZlcnNlKCkgOiBrZXk7Ci0gICAgICAgICAgICBzaXplID0gbWF4aW1pemluZyA/IHNpemUubmVnKCkgOiBzaXplOworICAgICAgICBwcml2YXRlIHZvaWQgaW5jbHVkZShMaXN0PEFyYz4gYXJjcywgSW50ZXJ2YWwga2V5LCBNdXRhYmxlSW50IHNpemUpIHsKICAgICAgICAgICAgIC8vIHRoaXMgYml0IGJlbG93IHNob3VsZCByZWFsbHkgYmUgY29tcHV0ZWQgb3V0c2lkZSBoZXJlIC0KICAgICAgICAgICAgIC8vIGl0cyBqdXN0IHRvIHN0b3AgZGVmYXVsdCAoY29sPjApIGNvbnN0cmFpbnRzIG9ibGl0ZXJhdGluZyB2YWxpZCBlbnRyaWVzCiAgICAgICAgICAgICBmb3IgKEFyYyBhcmMgOiBhcmNzKSB7CkBAIC05MjQsMjIgKzEwNDMsMjIgQEAKICAgICAgICAgICAgIGFyY3MuYWRkKG5ldyBBcmMoa2V5LCBzaXplKSk7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgaW5jbHVkZTIoTGlzdDxBcmM+IGFyY3MsIEludGVydmFsIHNwYW4sIEludCBtaW4sIEludCBtYXgsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBib3RoLCBib29sZWFuIG1heGltaXppbmcpIHsKLSAgICAgICAgICAgIGluY2x1ZGUoYXJjcywgc3BhbiwgbWluLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGluY2x1ZGUyKExpc3Q8QXJjPiBhcmNzLCBJbnRlcnZhbCBzcGFuLCBNdXRhYmxlSW50IG1pbiwgTXV0YWJsZUludCBtYXgsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBib3RoKSB7CisgICAgICAgICAgICBpbmNsdWRlKGFyY3MsIHNwYW4sIG1pbik7CiAgICAgICAgICAgICBpZiAoYm90aCkgewotICAgICAgICAgICAgICAgIGluY2x1ZGUoYXJjcywgc3Bhbi5pbnZlcnNlKCksIG1heC5uZWcoKSwgbWF4aW1pemluZyk7CisgICAgICAgICAgICAgICAgLy8gdG9kbworLy8gICAgICAgICAgICAgICAgaW5jbHVkZShhcmNzLCBzcGFuLmludmVyc2UoKSwgbWF4Lm5lZygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbmNsdWRlMihMaXN0PEFyYz4gYXJjcywgSW50ZXJ2YWwgc3BhbiwgaW50IG1pbiwgaW50IG1heCwKLSAgICAgICAgICAgICAgICBib29sZWFuIGJvdGgsIGJvb2xlYW4gbWF4aW1pemluZykgewotICAgICAgICAgICAgaW5jbHVkZTIoYXJjcywgc3BhbiwgbmV3IEludChtaW4pLCBuZXcgSW50KG1heCksIGJvdGgsIG1heGltaXppbmcpOworICAgICAgICBwcml2YXRlIHZvaWQgaW5jbHVkZTIoTGlzdDxBcmM+IGFyY3MsIEludGVydmFsIHNwYW4sIGludCBtaW4sIGludCBtYXgsIGJvb2xlYW4gYm90aCkgeworICAgICAgICAgICAgaW5jbHVkZTIoYXJjcywgc3BhbiwgbmV3IE11dGFibGVJbnQobWluKSwgbmV3IE11dGFibGVJbnQobWF4KSwgYm90aCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBHcm91cCBhcmNzIGJ5IHRoZWlyIGZpcnN0IGluZGV4LCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYXJyYXlzLgorICAgICAgICAvLyBHcm91cCBhcmNzIGJ5IHRoZWlyIGZpcnN0IHZlcnRleCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFycmF5cy4KICAgICAgICAgLy8gVGhpcyBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBhcmNzLgotICAgICAgICBwcml2YXRlIEFyY1tdW10gaW5kZXgoQXJjW10gYXJjcykgeworICAgICAgICBwcml2YXRlIEFyY1tdW10gZ3JvdXBBcmNzQnlGaXJzdFZlcnRleChBcmNbXSBhcmNzKSB7CiAgICAgICAgICAgICBpbnQgTiA9IGdldENvdW50KCkgKyAxOy8vIHRoZSBudW1iZXIgb2YgdmVydGljZXMKICAgICAgICAgICAgIEFyY1tdW10gcmVzdWx0ID0gbmV3IEFyY1tOXVtdOwogICAgICAgICAgICAgaW50W10gc2l6ZXMgPSBuZXcgaW50W05dOwpAQCAtOTU5LDE4ICsxMDc4LDIxIEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgLy8gdG9kbyBkbyB3ZSBhbHdheXMgYWRkIGZpcnN0IGVsZW1lbnQ/Ci0gICAgICAgIHByaXZhdGUgQXJjW10gc29ydChmaW5hbCBBcmNbXSBhcmNzLCBpbnQgc3RhcnQpIHsKKyAgICAgICAgLyoKKyAgICAgICAgVG9wb2xvZ2ljYWwgc29ydC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgQXJjW10gdG9wb2xvZ2ljYWxTb3J0KGZpbmFsIEFyY1tdIGFyY3MsIGludCBzdGFydCkgeworICAgICAgICAvLyB0b2RvIGVuc3VyZSB0aGUgPHN0YXJ0PiB2ZXJ0ZXggaXMgYWRkZWQgaW4gZWRnZSBjYXNlcwogICAgICAgICAgICAgZmluYWwgTGlzdDxBcmM+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QXJjPigpOwogICAgICAgICAgICAgbmV3IE9iamVjdCgpIHsKLSAgICAgICAgICAgICAgICBBcmNbXVtdIGluZGV4ID0gaW5kZXgoYXJjcyk7CisgICAgICAgICAgICAgICAgQXJjW11bXSBhcmNzQnlGaXJzdFZlcnRleCA9IGdyb3VwQXJjc0J5Rmlyc3RWZXJ0ZXgoYXJjcyk7CiAgICAgICAgICAgICAgICAgaW50W10gdmlzaXRlZCA9IG5ldyBpbnRbZ2V0Q291bnQoKSArIDFdOwogCiAgICAgICAgICAgICAgICAgYm9vbGVhbiBjb21wbGV0ZXNDeWNsZShpbnQgbG9jKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IHZpc2l0ZWRbbG9jXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFVOVklTSVRFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRlZFtsb2NdID0gUEVORElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQXJjIGFyYyA6IGluZGV4W2xvY10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQXJjIGFyYyA6IGFyY3NCeUZpcnN0VmVydGV4W2xvY10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbCBzcGFuID0gYXJjLnNwYW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlY3Vyc2l2ZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlc0N5Y2xlKHNwYW4ubWF4KSkgewpAQCAtMTAwNiw3ICsxMTI4LDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICAvLyB0b2RvIHVuaWZ5IHdpdGggZmluZFVzZWQgYWJvdmUKKyAgICAgICAgLy8gdG9kbyB1bmlmeSB3aXRoIGZpbmRVc2VkIGFib3ZlLiBCb3RoIHJvdXRpbmVzIGFuYWx5emUgd2hpY2ggcm93cy9jb2x1bW5zIGFyZSBlbXB0eS4KICAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEludGVydmFsPiBnZXRTcGFjZXJzKCkgewogICAgICAgICAgICAgTGlzdDxJbnRlcnZhbD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJbnRlcnZhbD4oKTsKICAgICAgICAgICAgIGludCBOID0gZ2V0Q291bnQoKSArIDE7CkBAIC0xMDM4LDE2ICsxMTYwLDE2IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBBcmNbXSBjcmVhdGVBcmNzKGJvb2xlYW4gbWF4aW1pemluZykgeworICAgICAgICBwcml2YXRlIEFyY1tdIGNyZWF0ZUFyY3MoKSB7CiAgICAgICAgICAgICBMaXN0PEFyYz4gc3BhblRvU2l6ZSA9IG5ldyBBcnJheUxpc3Q8QXJjPigpOwogCiAgICAgICAgICAgICAvLyBBZGQgYWxsIHRoZSBwcmVmZXJyZWQgZWxlbWVudHMgdGhhdCB3ZXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSB1c2VyLgotICAgICAgICAgICAgUGFja2VkTWFwPEludGVydmFsLCBJbnQ+IHNwYW5TaXplcyA9IGdldFNwYW5TaXplcygpOworICAgICAgICAgICAgUGFja2VkTWFwPEludGVydmFsLCBNdXRhYmxlSW50PiBzcGFuU2l6ZXMgPSBnZXRTcGFuU2l6ZXMoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhblNpemVzLmtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICBJbnRlcnZhbCBrZXkgPSBzcGFuU2l6ZXMua2V5c1tpXTsKLSAgICAgICAgICAgICAgICBJbnQgdmFsdWUgPSBzcGFuU2l6ZXMudmFsdWVzW2ldOworICAgICAgICAgICAgICAgIE11dGFibGVJbnQgdmFsdWUgPSBzcGFuU2l6ZXMudmFsdWVzW2ldOwogICAgICAgICAgICAgICAgIC8vIHRvZG8gcmVtb3ZlIHZhbHVlIGR1cGxpY2F0ZQotICAgICAgICAgICAgICAgIGluY2x1ZGUyKHNwYW5Ub1NpemUsIGtleSwgdmFsdWUsIHZhbHVlLCBhY2NvbW1vZGF0ZUJvdGhNaW5BbmRNYXgsIG1heGltaXppbmcpOworICAgICAgICAgICAgICAgIGluY2x1ZGUyKHNwYW5Ub1NpemUsIGtleSwgdmFsdWUsIHZhbHVlLCBhY2NvbW1vZGF0ZUJvdGhNaW5BbmRNYXgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBGaW5kIHJlZHVuZGFudCByb3dzL2NvbHMgYW5kIGdsdWUgdGhlbSB0b2dldGhlciB3aXRoIDAtbGVuZ3RoIGFyY3MgdG8gbGluayB0aGUgdHJlZQpAQCAtMTA1NSw4ICsxMTc3LDggQEAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Q291bnQoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKCF1c2VkW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgIEludGVydmFsIHNwYW4gPSBuZXcgSW50ZXJ2YWwoaSwgaSArIDEpOwotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlKHNwYW5Ub1NpemUsIHNwYW4sIG5ldyBJbnQoMCksIG1heGltaXppbmcpOwotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlKHNwYW5Ub1NpemUsIHNwYW4uaW52ZXJzZSgpLCBuZXcgSW50KDApLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZShzcGFuVG9TaXplLCBzcGFuLCBuZXcgTXV0YWJsZUludCgwKSk7CisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUoc3BhblRvU2l6ZSwgc3Bhbi5pbnZlcnNlKCksIG5ldyBNdXRhYmxlSW50KDApKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTEwNjQsMjEgKzExODYsMjEgQEAKICAgICAgICAgICAgICAgICAvLyBBZGQgcHJlZmVycmVkIGdhcHMKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldENvdW50KCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAodXNlZFtpXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZTIoc3BhblRvU2l6ZSwgbmV3IEludGVydmFsKGksIGkgKyAxKSwgMCwgMCwgZmFsc2UsIG1heGltaXppbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZTIoc3BhblRvU2l6ZSwgbmV3IEludGVydmFsKGksIGkgKyAxKSwgMCwgMCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmb3IgKEludGVydmFsIGdhcCA6IGdldFNwYWNlcnMoKSkgewotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlMihzcGFuVG9TaXplLCBnYXAsIDAsIDAsIGZhbHNlLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZTIoc3BhblRvU2l6ZSwgZ2FwLCAwLCAwLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQXJjW10gYXJjcyA9IHNwYW5Ub1NpemUudG9BcnJheShuZXcgQXJjW3NwYW5Ub1NpemUuc2l6ZSgpXSk7Ci0gICAgICAgICAgICByZXR1cm4gc29ydChhcmNzLCBtYXhpbWl6aW5nID8gZ2V0Q291bnQoKSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHRvcG9sb2dpY2FsU29ydChhcmNzLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBBcmNbXSBnZXRBcmNzKGJvb2xlYW4gbWF4aW1pemluZykgeworICAgICAgICBwdWJsaWMgQXJjW10gZ2V0QXJjcygpIHsKICAgICAgICAgICAgIGlmIChhcmNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmNzID0gY3JlYXRlQXJjcyhtYXhpbWl6aW5nKTsKKyAgICAgICAgICAgICAgICBhcmNzID0gY3JlYXRlQXJjcygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFhcmNzVmFsaWQpIHsKICAgICAgICAgICAgICAgICBnZXRTcGFuU2l6ZXMoKTsKQEAgLTEwODcsMjEgKzEyMDksNTQgQEAKICAgICAgICAgICAgIHJldHVybiBhcmNzOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlbGF4KGludFtdIGxvY2F0aW9ucywgQXJjIGVudHJ5LCBib29sZWFuIG1heGltaXppbmcpIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlbGF4KGludFtdIGxvY2F0aW9ucywgQXJjIGVudHJ5KSB7CiAgICAgICAgICAgICBJbnRlcnZhbCBzcGFuID0gZW50cnkuc3BhbjsKICAgICAgICAgICAgIGludCB1ID0gc3Bhbi5taW47CiAgICAgICAgICAgICBpbnQgdiA9IHNwYW4ubWF4OwogICAgICAgICAgICAgaW50IHZhbHVlID0gZW50cnkudmFsdWUudmFsdWU7CiAgICAgICAgICAgICBpbnQgY2FuZGlkYXRlID0gbG9jYXRpb25zW3VdICsgdmFsdWU7Ci0gICAgICAgICAgICBpZiAobWF4aW1pemluZyA/IGNhbmRpZGF0ZSA8IGxvY2F0aW9uc1t2XSA6IGNhbmRpZGF0ZSA+IGxvY2F0aW9uc1t2XSkgeworICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+IGxvY2F0aW9uc1t2XSkgewogICAgICAgICAgICAgICAgIGxvY2F0aW9uc1t2XSA9IGNhbmRpZGF0ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEJlbGxtYW4tRm9yZCB2YXJpYW50Ci0gICAgICAgIHByaXZhdGUgaW50W10gc29sdmUoQXJjW10gYXJjcywgaW50W10gbG9jYXRpb25zLCBib29sZWFuIG1heGltaXppbmcpIHsKKyAgICAgICAgLyoKKyAgICAgICAgQmVsbG1hbi1Gb3JkIHZhcmlhbnQgLSBtb2RpZmllZCB0byByZWR1Y2UgdHlwaWNhbCBydW5uaW5nIHRpbWUgZnJvbSBPKE5eMikgdG8gTyhOKQorCisgICAgICAgIEdyaWRMYXlvdXQgY29udmVydHMgaXRzIHJlcXVpcmVtZW50cyBpbnRvIGEgc3lzdGVtIG9mIGxpbmVhciBjb25zdHJhaW50cyBvZiB0aGUKKyAgICAgICAgZm9ybToKKworICAgICAgICB4W2ldIC0geFtqXSA8IGFba10KKworICAgICAgICBXaGVyZSB0aGUgeFtpXSBhcmUgdmFyaWFibGVzIGFuZCB0aGUgYVtrXSBhcmUgY29uc3RhbnRzLgorCisgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgdmFyaWFibGVzIHdlcmUgaW5zdGVhZCBsYWJlbGVkIHgsIHksIHogd2UgbWlnaHQgaGF2ZToKKworICAgICAgICAgICAgeCAtIHkgPCAxNworICAgICAgICAgICAgeSAtIHogPCAyMworICAgICAgICAgICAgeiAtIHggPCA0MgorCisgICAgICAgIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIExpbmVhciBQcm9ncmFtbWluZyBwcm9ibGVtIHRoYXQgaXMsIGluIHR1cm4sCisgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHNpbmdsZS1zb3VyY2Ugc2hvcnRlc3QgcGF0aHMgcHJvYmxlbSBvbiBhIGRpZ3JhcGgsIGZvcgorICAgICAgICB3aGljaCB0aGUgTyhuXjIpIEJlbGxtYW4tRm9yZCBhbGdvcml0aG0gdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBnZW5lcmFsIHNvbHV0aW9uLgorCisgICAgICAgIE90aGVyIGFsZ29yaXRobXMgYXJlIGZhc3RlciBpbiB0aGUgY2FzZSB3aGVyZSBubyBhcmNzIGhhdmUgbmVnYXRpdmUgd2VpZ2h0cworICAgICAgICBidXQgYWxsb3dpbmcgbmVnYXRpdmUgd2VpZ2h0cyB0dXJucyBvdXQgdG8gYmUgdGhlIHNhbWUgYXMgYWNjb21tb2RhdGluZyBtYXhpbXVtCisgICAgICAgIHNpemUgcmVxdWlyZW1lbnRzIGFzIHdlbGwgYXMgbWluaW11bSBvbmVzLgorCisgICAgICAgIEJlbGxtYW4tRm9yZCB3b3JrcyBieSBpdGVyYXRpdmVseSAncmVsYXhpbmcnIGNvbnN0cmFpbnRzIG92ZXIgYWxsIG5vZGVzIChhbiBPKE4pCisgICAgICAgIHByb2Nlc3MpIGFuZCBwZXJmb3JtaW5nIHRoaXMgc3RlcCBOIHRpbWVzLiBQcm9vZiBvZiBjb3JyZWN0bmVzcyBoaW5nZXMgb24gdGhlCisgICAgICAgIGZhY3QgdGhhdCB0aGVyZSBjYW4gYmUgbm8gbmVnYXRpdmUgd2VpZ2h0IGNoYWlucyBvZiBsZW5ndGggPiBOIC0gdW5sZXNzIGEKKyAgICAgICAgJ25lZ2F0aXZlIHdlaWdodCBsb29wJyBleGlzdHMuIFRoZSBhbGdvcml0aG0gY2F0Y2hlcyB0aGlzIGNhc2UgaW4gYSBmaW5hbAorICAgICAgICBjaGVja2luZyBwaGFzZSB0aGF0IHJlcG9ydHMgZmFpbHVyZS4KKworICAgICAgICBCeSB0b3BvbG9naWNhbGx5IHNvcnRpbmcgdGhlIG5vZGVzIGFuZCBjaGVja2luZyB0aGlzIGNvbmRpdGlvbiBhdCBlYWNoIHN0ZXAKKyAgICAgICAgdHlwaWNhbCBsYXlvdXQgcHJvYmxlbXMgY29tcGxldGUgYWZ0ZXIgdGhlIGZpcnN0IGl0ZXJhdGlvbiBhbmQgdGhlIGFsZ29yaXRobQorICAgICAgICBjb21wbGV0ZXMgaW4gTyhOKSBzdGVwcyB3aXRoIHZlcnkgbG93IGNvbnN0YW50cy4KKyAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBzb2x2ZShBcmNbXSBhcmNzLCBpbnRbXSBsb2NhdGlvbnMpIHsKICAgICAgICAgICAgIGludCBOID0gZ2V0Q291bnQoKSArIDE7IC8vIFRoZSBudW1iZXIgb2YgdmVydGljZXMgaXMgdGhlIG51bWJlciBvZiBjb2x1bW5zL3Jvd3MgKyAxLgogCiAgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKQEAgLTExMDksMTEgKzEyNjQsMTEgQEAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCBsZW5ndGggPSBhcmNzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHwgcmVsYXgobG9jYXRpb25zLCBhcmNzW2pdLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfCByZWxheChsb2NhdGlvbnMsIGFyY3Nbal0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJdGVyYXRpb24gIiArIChtYXhpbWl6aW5nID8gIihtYXgpIiA6ICIobWluKSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkl0ZXJhdGlvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjb21wbGV0ZWQgYWZ0ZXIgIiArICgxICsgaSkgKyAiIHN0ZXBzIG91dCBvZiAiICsgTik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTI1LDExOSArMTI4MCwxNTggQEAKICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnM7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIGludFtdIGluaXQoaW50IGRlZmF1bHRWYWx1ZSwgaW50IG1pbiwgaW50IG1heCkgewotICAgICAgICAgICAgaW50IE4gPSBnZXRDb3VudCgpICsgMTsgLy8gVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMvcm93cyArIDEuCi0gICAgICAgICAgICBpbnRbXSBsb2NhdGlvbnMgPSBuZXcgaW50W05dOwotICAgICAgICAgICAgQXJyYXlzLmZpbGwobG9jYXRpb25zLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgbG9jYXRpb25zWzBdID0gbWluOwotICAgICAgICAgICAgbG9jYXRpb25zW04gLSAxXSA9IG1heDsKLSAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludFtdIGNvbXB1dGVNYXJnaW5zKGJvb2xlYW4gbGVhZGluZykgewotICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtnZXRDb3VudCgpICsgMV07CisgICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlTWFyZ2lucyhib29sZWFuIGxlYWRpbmcpIHsKKyAgICAgICAgICAgIGludFtdIG1hcmdpbnMgPSBsZWFkaW5nID8gbGVhZGluZ01hcmdpbnMgOiB0cmFpbGluZ01hcmdpbnM7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGdldENoaWxkQ291bnQoKTsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgICAgIFZpZXcgYyA9IGdldENoaWxkQXQoaSk7CiAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gZ2V0TGF5b3V0UGFyYW1zKGMpOwogICAgICAgICAgICAgICAgIEdyb3VwIGcgPSBob3Jpem9udGFsID8gbHAuY29sdW1uR3JvdXAgOiBscC5yb3dHcm91cDsKICAgICAgICAgICAgICAgICBJbnRlcnZhbCBzcGFuID0gZy5zcGFuOwogICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGxlYWRpbmcgPyBzcGFuLm1pbiA6IHNwYW4ubWF4OwotICAgICAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBtYXgocmVzdWx0W2luZGV4XSwgZ2V0TWFyZ2luKGMsIGxlYWRpbmcsIGhvcml6b250YWwpKTsKKyAgICAgICAgICAgICAgICBtYXJnaW5zW2luZGV4XSA9IG1heChtYXJnaW5zW2luZGV4XSwgZ2V0TWFyZ2luKGMsIGxlYWRpbmcsIGhvcml6b250YWwpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBoYXMgc2lkZSBlZmZlY3RzCi0gICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlTG9jYXRpb25zKGludFtdIGxvY2F0aW9ucywgYm9vbGVhbiBtYXhpbWl6aW5nKSB7Ci0gICAgICAgICAgICBsZWFkaW5nTWFyZ2lucyA9IGNvbXB1dGVNYXJnaW5zKHRydWUpOwotICAgICAgICAgICAgdHJhaWxpbmdNYXJnaW5zID0gY29tcHV0ZU1hcmdpbnMoZmFsc2UpOworICAgICAgICBwcml2YXRlIGludFtdIGdldExlYWRpbmdNYXJnaW5zKCkgeworICAgICAgICAgICAgaWYgKGxlYWRpbmdNYXJnaW5zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsZWFkaW5nTWFyZ2lucyA9IG5ldyBpbnRbZ2V0Q291bnQoKSArIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsZWFkaW5nTWFyZ2luc1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgY29tcHV0ZU1hcmdpbnModHJ1ZSk7CisgICAgICAgICAgICAgICAgbGVhZGluZ01hcmdpbnNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVhZGluZ01hcmdpbnM7CisgICAgICAgIH0KIAotICAgICAgICAgICAgc29sdmUoZ2V0QXJjcyhtYXhpbWl6aW5nKSwgbG9jYXRpb25zLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBnZXRUcmFpbGluZ01hcmdpbnMoKSB7CisgICAgICAgICAgICBpZiAodHJhaWxpbmdNYXJnaW5zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cmFpbGluZ01hcmdpbnMgPSBuZXcgaW50W2dldENvdW50KCkgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJhaWxpbmdNYXJnaW5zVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBjb21wdXRlTWFyZ2lucyhmYWxzZSk7CisgICAgICAgICAgICAgICAgdHJhaWxpbmdNYXJnaW5zVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRyYWlsaW5nTWFyZ2luczsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBBZGQgbWFyZ2lucworICAgICAgICBwcml2YXRlIHZvaWQgYWRkTWFyZ2lucygpIHsKKyAgICAgICAgICAgIGludFtdIGxlYWRpbmdNYXJnaW5zID0gZ2V0TGVhZGluZ01hcmdpbnMoKTsKKyAgICAgICAgICAgIGludFtdIHRyYWlsaW5nTWFyZ2lucyA9IGdldFRyYWlsaW5nTWFyZ2lucygpOworCiAgICAgICAgICAgICBpbnQgZGVsdGEgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBOID0gZ2V0Q291bnQoKTsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgIGludCBtYXJnaW5zID0gbGVhZGluZ01hcmdpbnNbaV0gKyB0cmFpbGluZ01hcmdpbnNbaSArIDFdOwogICAgICAgICAgICAgICAgIGRlbHRhICs9IG1hcmdpbnM7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb25zW2kgKyAxXSArPSBkZWx0YTsKKyAgICAgICAgICAgICAgICBtaW5pbWFbaSArIDFdICs9IGRlbHRhOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0TG9jYXRpb25JbmNsdWRpbmdNYXJnaW4oVmlldyB2aWV3LCBib29sZWFuIGxlYWRpbmcsIGludCBpbmRleCkgeworICAgICAgICAgICAgaW50IGxvY2F0aW9uID0gbG9jYXRpb25zW2luZGV4XTsKKyAgICAgICAgICAgIGludCBtYXJnaW47CisgICAgICAgICAgICBpZiAoIW1NYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudCkgeworICAgICAgICAgICAgICAgIG1hcmdpbiA9IChsZWFkaW5nID8gbGVhZGluZ01hcmdpbnMgOiB0cmFpbGluZ01hcmdpbnMpW2luZGV4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFyZ2luID0gZ2V0TWFyZ2luKHZpZXcsIGxlYWRpbmcsIGhvcml6b250YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmcgPyAobG9jYXRpb24gKyBtYXJnaW4pIDogKGxvY2F0aW9uIC0gbWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlTWluaW1hKGludFtdIGEpIHsKKyAgICAgICAgICAgIEFycmF5cy5maWxsKGEsIE1JTl9WQUxVRSk7CisgICAgICAgICAgICBhWzBdID0gMDsKKyAgICAgICAgICAgIHNvbHZlKGdldEFyY3MoKSwgYSk7CisgICAgICAgICAgICBpZiAoIW1NYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudCkgeworICAgICAgICAgICAgICAgIGFkZE1hcmdpbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50W10gZ2V0TWluaW1hKCkgeworICAgICAgICAgICAgaWYgKG1pbmltYSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IE4gPSBnZXRDb3VudCgpICsgMTsKKyAgICAgICAgICAgICAgICBtaW5pbWEgPSBuZXcgaW50W05dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtaW5pbWFWYWxpZCkgeworICAgICAgICAgICAgICAgIGNvbXB1dGVNaW5pbWEobWluaW1hKTsKKyAgICAgICAgICAgICAgICBtaW5pbWFWYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWluaW1hOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVXZWlnaHRzKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIE4gPSBnZXRDaGlsZENvdW50KCk7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBnZXRMYXlvdXRQYXJhbXMoZ2V0Q2hpbGRBdChpKSk7CisgICAgICAgICAgICAgICAgR3JvdXAgZyA9IGhvcml6b250YWwgPyBscC5jb2x1bW5Hcm91cCA6IGxwLnJvd0dyb3VwOworICAgICAgICAgICAgICAgIEludGVydmFsIHNwYW4gPSBnLnNwYW47CisgICAgICAgICAgICAgICAgaW50IHBlbnVsdGltYXRlSW5kZXggPSBzcGFuLm1heCAtIDE7CisgICAgICAgICAgICAgICAgd2VpZ2h0c1twZW51bHRpbWF0ZUluZGV4XSArPSBob3Jpem9udGFsID8gbHAuY29sdW1uV2VpZ2h0IDogbHAucm93V2VpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdFtdIGdldFdlaWdodHMoKSB7CisgICAgICAgICAgICBpZiAod2VpZ2h0cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IE4gPSBnZXRDb3VudCgpICsgMTsKKyAgICAgICAgICAgICAgICB3ZWlnaHRzID0gbmV3IGZsb2F0W05dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tcHV0ZVdlaWdodHMoKTsKKyAgICAgICAgICAgIHJldHVybiB3ZWlnaHRzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBnZXRMb2NhdGlvbnMoKSB7CisgICAgICAgICAgICBpZiAobG9jYXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgTiA9IGdldENvdW50KCkgKyAxOworICAgICAgICAgICAgICAgIGxvY2F0aW9ucyA9IG5ldyBpbnRbTl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0ZXJuYWwgZW50cnkgcG9pbnRzCisKICAgICAgICAgcHJpdmF0ZSBpbnQgc2l6ZShpbnRbXSBsb2NhdGlvbnMpIHsKICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnNbbG9jYXRpb25zLmxlbmd0aCAtIDFdIC0gbG9jYXRpb25zWzBdOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBpbnRbXSBnZXRMaW1pdChib29sZWFuIGxvd2VyQm91bmQsIGJvb2xlYW4gbWF4aW1pemluZykgewotICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSA9IG1heGltaXppbmcgPyBNQVhfVkFMVUUgOiBNSU5fVkFMVUU7Ci0gICAgICAgICAgICBpZiAobG93ZXJCb3VuZCkgewotICAgICAgICAgICAgICAgIC8vIGFzIGxvbmcgYXMgaXQgYXZvaWRzIG92ZXJmbG93LCB0aGUgdXBwZXIgYm91bmQgY2FuIGJlIGFueXRoaW5nIChpbmNsdWRpbmcgemVybykKLSAgICAgICAgICAgICAgICBpbnRbXSByZXN1bHQgPSBpbml0KGRlZmF1bHRWYWx1ZSwgZGVmYXVsdFZhbHVlLCAxMDAwKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlTG9jYXRpb25zKHJlc3VsdCwgbWF4aW1pemluZyk7Ci0gICAgICAgICAgICAgICAgaW50IGRlbHRhID0gcmVzdWx0WzBdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSAtPSBkZWx0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gaW5pdChkZWZhdWx0VmFsdWUsIDAsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29tcHV0ZUxvY2F0aW9ucyhyZXN1bHQsIG1heGltaXppbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeHRlcm5hbCBlbnRyeSBwb2ludHMKLQogICAgICAgICBwcml2YXRlIGludCBnZXRNaW4oKSB7Ci0gICAgICAgICAgICBpbnRbXSBtaW5zID0gZ2V0TGltaXQobWF4aW1pemluZywgbWF4aW1pemluZyk7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZShtaW5zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldFByZWYoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWNjb21tb2RhdGVCb3RoTWluQW5kTWF4ID8gZ2V0TWF4KCkgOiBnZXRNaW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldE1heCgpIHsKLSAgICAgICAgICAgIGludFtdIG1heHMgPSBnZXRMaW1pdCghbWF4aW1pemluZywgbWF4aW1pemluZyk7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZShtYXhzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IHRvdGFsTWFyZ2luU2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdW0obGVhZGluZ01hcmdpbnMpICsgc3VtKHRyYWlsaW5nTWFyZ2lucyk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZShnZXRNaW5pbWEoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgbGF5b3V0KGludCB0YXJnZXRTaXplKSB7Ci0gICAgICAgICAgICBpbnQgTiA9IGdldENvdW50KCkgKyAxOwotICAgICAgICAgICAgaW50IG1pbiA9IGdldE1pbigpOwotICAgICAgICAgICAgaW50IG1heCA9IGdldE1heCgpOworICAgICAgICAgICAgaW50W10gbWlucyA9IGdldE1pbmltYSgpOwogCi0gICAgICAgICAgICBpbnQgY2xpcHBlZFRhcmdldFNpemUgPSBtYXgobWluKG1heCwgdGFyZ2V0U2l6ZSksIG1pbik7IC8vIGNvbmZpbmUgc2l6ZSB0byB2YWxpZCByYW5nZQorICAgICAgICAgICAgaW50IHRvdGFsRGVsdGEgPSBtYXgoMCwgdGFyZ2V0U2l6ZSAtIHNpemUobWlucykpOyAvLyBjb25maW5lIHRvIGV4cGFuc2lvbgogCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb21wdXRpbmcgc2l6ZXMgZm9yIHRhcmdldCAiICsgY2xpcHBlZFRhcmdldFNpemUgKyAiIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChob3Jpem9udGFsID8gImNvbCIgOiAicm93IikgKyAicyBmcm9tOiAiICsgYXJjcyk7CisgICAgICAgICAgICBmbG9hdFtdIHdlaWdodHMgPSBnZXRXZWlnaHRzKCk7CisgICAgICAgICAgICBmbG9hdCB0b3RhbFdlaWdodCA9IHN1bSh3ZWlnaHRzKTsKKworICAgICAgICAgICAgaWYgKHRvdGFsV2VpZ2h0ID09IDBmKSB7CisgICAgICAgICAgICAgICAgd2VpZ2h0c1t3ZWlnaHRzLmxlbmd0aCAtIDFdID0gMTsKKyAgICAgICAgICAgICAgICB0b3RhbFdlaWdodCA9IDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgZGVsdGEgPSBjbGlwcGVkVGFyZ2V0U2l6ZSAtIG1pbjsKLSAgICAgICAgICAgIHByZWZTaXplT2ZXZWlnaHRlZENvbXBvbmVudCA9IGRlbHRhOwotICAgICAgICAgICAgaW52YWxpZGF0ZVZhbHVlcygpOwotICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSA9IG1heGltaXppbmcgPyBNQVhfVkFMVUUgOiBNSU5fVkFMVUU7Ci0gICAgICAgICAgICBsb2NhdGlvbnMgPSBpbml0KGRlZmF1bHRWYWx1ZSwgMCwgY2xpcHBlZFRhcmdldFNpemUgLSB0b3RhbE1hcmdpblNpemUoKSk7Ci0gICAgICAgICAgICBjb21wdXRlTG9jYXRpb25zKGxvY2F0aW9ucywgbWF4aW1pemluZyk7Ci0gICAgICAgICAgICBwcmVmU2l6ZU9mV2VpZ2h0ZWRDb21wb25lbnQgPSAwOwogCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJsb2NhdGlvbnMgPSAiICsgQXJyYXlzLnRvU3RyaW5nKGxvY2F0aW9ucykpOwotICAgICAgICAgICAgICAgIGludFtdIGNvbXB1dGVkU2l6ZXMgPSBuZXcgaW50W04gLSAxXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE4gLSAxOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWRTaXplc1tpXSA9IGxvY2F0aW9uc1tpICsgMV0gLSBsb2NhdGlvbnNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNpemVzID0gIiArIEFycmF5cy50b1N0cmluZyhjb21wdXRlZFNpemVzKSk7CisgICAgICAgICAgICBpbnRbXSBsb2NhdGlvbnMgPSBnZXRMb2NhdGlvbnMoKTsKKyAgICAgICAgICAgIGludCBjdW11bGF0aXZlRGVsdGEgPSAwOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IHdlaWdodHNbaV07CisgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gKGludCkgKHRvdGFsRGVsdGEgKiB3ZWlnaHQgLyB0b3RhbFdlaWdodCk7CisgICAgICAgICAgICAgICAgY3VtdWxhdGl2ZURlbHRhICs9IGRlbHRhOworICAgICAgICAgICAgICAgIGxvY2F0aW9uc1tpXSA9IG1pbnNbaV0gKyBjdW11bGF0aXZlRGVsdGE7CisKKyAgICAgICAgICAgICAgICB0b3RhbERlbHRhIC09IGRlbHRhOworICAgICAgICAgICAgICAgIHRvdGFsV2VpZ2h0IC09IHdlaWdodDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkYXRlU3RydWN0dXJlKCkgewogICAgICAgICAgICAgY291bnRWYWxpZCA9IGZhbHNlOworCiAgICAgICAgICAgICBncm91cEJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgICBzcGFuU2l6ZXMgPSBudWxsOworICAgICAgICAgICAgbGVhZGluZ01hcmdpbnMgPSBudWxsOworICAgICAgICAgICAgdHJhaWxpbmdNYXJnaW5zID0gbnVsbDsKKyAgICAgICAgICAgIG1pbmltYSA9IG51bGw7CisgICAgICAgICAgICB3ZWlnaHRzID0gbnVsbDsKKyAgICAgICAgICAgIGxvY2F0aW9ucyA9IG51bGw7CiAKICAgICAgICAgICAgIGludmFsaWRhdGVWYWx1ZXMoKTsKICAgICAgICAgfQpAQCAtMTI0Niw2ICsxNDQwLDkgQEAKICAgICAgICAgICAgIGdyb3VwQm91bmRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgIHNwYW5TaXplc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICBhcmNzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGxlYWRpbmdNYXJnaW5zVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyYWlsaW5nTWFyZ2luc1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICBtaW5pbWFWYWxpZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjU5LDggKzE0NTYsOCBAQAogICAgICAqIHtAbGluayBHcm91cCBHcm91cHN9IGFyZSBpbW11dGFibGUgc3RydWN0dXJlcyBhbmQgbWF5IGJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBsYXlvdXQKICAgICAgKiBwYXJhbWV0ZXJzIG9mIGRpZmZlcmVudCBjaGlsZHJlbi4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUge0BsaW5rIEdyb3VwI3NwYW4gc3Bhbn0gZmllbGRzIG9mIHRoZSByb3cgYW5kIGNvbHVtbiBncm91cHMgdG9nZXRoZXIgc3BlY2lmeQotICAgICAqIHRoZSBmb3VyIGdyaWQgaW5kaWNlcyB0aGF0IGRlbGltaXQgdGhlIGNlbGxzIG9mIHRoaXMgY2VsbCBncm91cC4KKyAgICAgKiBUaGUgcm93IGFuZCBjb2x1bW4gZ3JvdXBzIGNvbnRhaW4gdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGluZGljZXMgYWxvbmcgZWFjaCBheGlzCisgICAgICogYW5kIHRvZ2V0aGVyIHNwZWNpZnkgdGhlIGZvdXIgZ3JpZCBpbmRpY2VzIHRoYXQgZGVsaW1pdCB0aGUgY2VsbHMgb2YgdGhpcyBjZWxsIGdyb3VwLgogICAgICAqIDxwPgogICAgICAqIFRoZSB7QGxpbmsgR3JvdXAjYWxpZ25tZW50IGFsaWdubWVudH0gZmllbGRzIG9mIHRoZSByb3cgYW5kIGNvbHVtbiBncm91cHMgdG9nZXRoZXIgc3BlY2lmeQogICAgICAqIGJvdGggYXNwZWN0cyBvZiBhbGlnbm1lbnQgd2l0aGluIHRoZSBjZWxsIGdyb3VwLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBjaGlsZCdzCkBAIC0xMjc3LDE5ICsxNDc0LDE5IEBACiAgICAgICogICAgIDxsaT57QGxpbmsgI2hlaWdodH0gPSB7QGxpbmsgI1dSQVBfQ09OVEVOVH08L2xpPgogICAgICAqICAgICA8bGk+e0BsaW5rICN0b3BNYXJnaW59ID0gMCB3aGVuCiAgICAgICogICAgICAgICAge0BsaW5rIEdyaWRMYXlvdXQjc2V0VXNlRGVmYXVsdE1hcmdpbnMoYm9vbGVhbikgdXNlRGVmYXVsdE1hcmdpbnN9IGlzCi0gICAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+OyBvdGhlcndpc2Uge0BsaW5rIEludGVnZXIjTUlOX1ZBTFVFfSwgdG8KKyAgICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT47IG90aGVyd2lzZSB7QGxpbmsgI1VOREVGSU5FRH0sIHRvCiAgICAgICogICAgICAgICAgaW5kaWNhdGUgdGhhdCBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIGNvbXB1dGVkIG9uIGRlbWFuZC4gPC9saT4KICAgICAgKiAgICAgPGxpPntAbGluayAjbGVmdE1hcmdpbn0gPSAwIHdoZW4KICAgICAgKiAgICAgICAgICB7QGxpbmsgR3JpZExheW91dCNzZXRVc2VEZWZhdWx0TWFyZ2lucyhib29sZWFuKSB1c2VEZWZhdWx0TWFyZ2luc30gaXMKLSAgICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT47IG90aGVyd2lzZSB7QGxpbmsgSW50ZWdlciNNSU5fVkFMVUV9LCB0bworICAgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPjsgb3RoZXJ3aXNlIHtAbGluayAjVU5ERUZJTkVEfSwgdG8KICAgICAgKiAgICAgICAgICBpbmRpY2F0ZSB0aGF0IGEgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgY29tcHV0ZWQgb24gZGVtYW5kLiA8L2xpPgogICAgICAqICAgICA8bGk+e0BsaW5rICNib3R0b21NYXJnaW59ID0gMCB3aGVuCiAgICAgICogICAgICAgICAge0BsaW5rIEdyaWRMYXlvdXQjc2V0VXNlRGVmYXVsdE1hcmdpbnMoYm9vbGVhbikgdXNlRGVmYXVsdE1hcmdpbnN9IGlzCi0gICAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+OyBvdGhlcndpc2Uge0BsaW5rIEludGVnZXIjTUlOX1ZBTFVFfSwgdG8KKyAgICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT47IG90aGVyd2lzZSB7QGxpbmsgI1VOREVGSU5FRH0sIHRvCiAgICAgICogICAgICAgICAgaW5kaWNhdGUgdGhhdCBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIGNvbXB1dGVkIG9uIGRlbWFuZC4gPC9saT4KICAgICAgKiAgICAgPGxpPntAbGluayAjcmlnaHRNYXJnaW59ID0gMCB3aGVuCiAgICAgICogICAgICAgICAge0BsaW5rIEdyaWRMYXlvdXQjc2V0VXNlRGVmYXVsdE1hcmdpbnMoYm9vbGVhbikgdXNlRGVmYXVsdE1hcmdpbnN9IGlzCi0gICAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+OyBvdGhlcndpc2Uge0BsaW5rIEludGVnZXIjTUlOX1ZBTFVFfSwgdG8KKyAgICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT47IG90aGVyd2lzZSB7QGxpbmsgI1VOREVGSU5FRH0sIHRvCiAgICAgICogICAgICAgICAgaW5kaWNhdGUgdGhhdCBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIGNvbXB1dGVkIG9uIGRlbWFuZC4gPC9saT4KICAgICAgKiAgICAgPGxpPntAbGluayAjcm93R3JvdXB9PGNvZGU+LnNwYW48L2NvZGU+ID0gPGNvZGU+WzAsIDFdPC9jb2RlPiA8L2xpPgogICAgICAqICAgICA8bGk+e0BsaW5rICNyb3dHcm91cH08Y29kZT4uYWxpZ25tZW50PC9jb2RlPiA9IHtAbGluayAjQkFTRUxJTkV9IDwvbGk+CkBAIC0xMzI0LDcgKzE1MjEsOCBAQAogICAgICAgICAgICAgICAgIG5ldyBHcm91cChERUZBVUxUX1NQQU4sIERFRkFVTFRfSE9SSVpPTlRBTF9BTElHTk1FTlQpOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHcm91cCBERUZBVUxUX1ZFUlRJQ0FMX0dST1VQID0KICAgICAgICAgICAgICAgICBuZXcgR3JvdXAoREVGQVVMVF9TUEFOLCBERUZBVUxUX1ZFUlRDSUFMX0FMR0lHTk1FTlQpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XRUlHSFQgPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XRUlHSFRfMCA9IDA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dFSUdIVF8xID0gMTsKIAogICAgICAgICAvLyBNaXNjCiAKQEAgLTEzOTcsNyArMTU5NSw3IEBACiAgICAgICAgIHB1YmxpYyBMYXlvdXRQYXJhbXMoR3JvdXAgcm93R3JvdXAsIEdyb3VwIGNvbHVtbkdyb3VwKSB7CiAgICAgICAgICAgICB0aGlzKERFRkFVTFRfV0lEVEgsIERFRkFVTFRfSEVJR0hULAogICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BUkdJTiwgREVGQVVMVF9NQVJHSU4sIERFRkFVTFRfTUFSR0lOLCBERUZBVUxUX01BUkdJTiwKLSAgICAgICAgICAgICAgICAgICAgcm93R3JvdXAsIGNvbHVtbkdyb3VwLCBERUZBVUxUX1dFSUdIVCwgREVGQVVMVF9XRUlHSFQpOworICAgICAgICAgICAgICAgICAgICByb3dHcm91cCwgY29sdW1uR3JvdXAsIERFRkFVTFRfV0VJR0hUXzAsIERFRkFVTFRfV0VJR0hUXzApOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xNTE1LDIyICsxNzEzLDI2IEBACiAgICAgICAgICAgICAgICAgICAgICFkZWZpbmVzVmVydGljYWwoZ3Jhdml0eSksIGRlZmF1bHRBbGlnbm1lbnQpOwogICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0RGVmYXVsdFdlaWdodChpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIChzaXplID09IE1BVENIX1BBUkVOVCkgPyBERUZBVUxUX1dFSUdIVF8xIDogREVGQVVMVF9XRUlHSFRfMDsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmYXVsdEdyYXZpdHkpIHsKICAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgc3R5bGVhYmxlLkdyaWRMYXlvdXRfTGF5b3V0KTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaW50IGdyYXZpdHkgPSBhLmdldEludGVnZXIoR1JBVklUWSwgZGVmYXVsdEdyYXZpdHkpOwogCiAgICAgICAgICAgICAgICAgaW50IGNvbHVtbiA9IGEuZ2V0SW50ZWdlcihDT0xVTU4sIERFRkFVTFRfQ09MVU1OKTsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBhLmdldEludGVnZXIoQ09MVU1OX1NQQU4sIERFRkFVTFRfU1BBTl9TSVpFKTsKLSAgICAgICAgICAgICAgICBJbnRlcnZhbCBjb2xTcGFuID0gbmV3IEludGVydmFsKGNvbHVtbiwgY29sdW1uICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uR3JvdXAgPSBuZXcgR3JvdXAoY29sU3BhbiwgZ2V0SG9yaXpvbnRhbEFsaWdubWVudChncmF2aXR5LCB3aWR0aCkpOwotICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uV2VpZ2h0ID0gYS5nZXRGbG9hdChDT0xVTU5fV0VJR0hULCBERUZBVUxUX1dFSUdIVCk7CisgICAgICAgICAgICAgICAgaW50IGNvbHVtblNwYW4gPSBhLmdldEludGVnZXIoQ09MVU1OX1NQQU4sIERFRkFVTFRfU1BBTl9TSVpFKTsKKyAgICAgICAgICAgICAgICBJbnRlcnZhbCBoU3BhbiA9IG5ldyBJbnRlcnZhbChjb2x1bW4sIGNvbHVtbiArIGNvbHVtblNwYW4pOworICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uR3JvdXAgPSBuZXcgR3JvdXAoaFNwYW4sIGdldEhvcml6b250YWxBbGlnbm1lbnQoZ3Jhdml0eSwgd2lkdGgpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbldlaWdodCA9IGEuZ2V0RmxvYXQoQ09MVU1OX1dFSUdIVCwgZ2V0RGVmYXVsdFdlaWdodCh3aWR0aCkpOwogCiAgICAgICAgICAgICAgICAgaW50IHJvdyA9IGEuZ2V0SW50ZWdlcihST1csIERFRkFVTFRfUk9XKTsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gYS5nZXRJbnRlZ2VyKFJPV19TUEFOLCBERUZBVUxUX1NQQU5fU0laRSk7Ci0gICAgICAgICAgICAgICAgSW50ZXJ2YWwgcm93U3BhbiA9IG5ldyBJbnRlcnZhbChyb3csIHJvdyArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5yb3dHcm91cCA9IG5ldyBHcm91cChyb3dTcGFuLCBnZXRWZXJ0aWNhbEFsaWdubWVudChncmF2aXR5LCBoZWlnaHQpKTsKLSAgICAgICAgICAgICAgICB0aGlzLnJvd1dlaWdodCA9IGEuZ2V0RmxvYXQoUk9XX1dFSUdIVCwgREVGQVVMVF9XRUlHSFQpOworICAgICAgICAgICAgICAgIGludCByb3dTcGFuID0gYS5nZXRJbnRlZ2VyKFJPV19TUEFOLCBERUZBVUxUX1NQQU5fU0laRSk7CisgICAgICAgICAgICAgICAgSW50ZXJ2YWwgdlNwYW4gPSBuZXcgSW50ZXJ2YWwocm93LCByb3cgKyByb3dTcGFuKTsKKyAgICAgICAgICAgICAgICB0aGlzLnJvd0dyb3VwID0gbmV3IEdyb3VwKHZTcGFuLCBnZXRWZXJ0aWNhbEFsaWdubWVudChncmF2aXR5LCBoZWlnaHQpKTsKKyAgICAgICAgICAgICAgICB0aGlzLnJvd1dlaWdodCA9IGEuZ2V0RmxvYXQoUk9XX1dFSUdIVCwgZ2V0RGVmYXVsdFdlaWdodChoZWlnaHQpKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICB9CkBAIC0xNTYzLDEyICsxNzY1LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKgorICAgIEluIHBsYWNlIG9mIGEgSGFzaE1hcCBmcm9tIHNwYW4gdG8gSW50LCB1c2UgYW4gYXJyYXkgb2Yga2V5L3ZhbHVlIHBhaXJzIC0gc3RvcmVkIGluIEFyY3MuCisgICAgQWRkIHRoZSBtdXRhYmxlcyBjb21wbGV0ZXNDeWNsZSBmbGFnIHRvIGF2b2lkIGNyZWF0aW5nIGFub3RoZXIgaGFzaCB0YWJsZSBmb3IgZGV0ZWN0aW5nIGN5Y2xlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcmMgewogICAgICAgICBwdWJsaWMgZmluYWwgSW50ZXJ2YWwgc3BhbjsKLSAgICAgICAgcHVibGljIGZpbmFsIEludCB2YWx1ZTsKKyAgICAgICAgcHVibGljIGZpbmFsIE11dGFibGVJbnQgdmFsdWU7CiAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbXBsZXRlc0N5Y2xlOwogCi0gICAgICAgIHB1YmxpYyBBcmMoSW50ZXJ2YWwgc3BhbiwgSW50IHZhbHVlKSB7CisgICAgICAgIHB1YmxpYyBBcmMoSW50ZXJ2YWwgc3BhbiwgTXV0YWJsZUludCB2YWx1ZSkgewogICAgICAgICAgICAgdGhpcy5zcGFuID0gc3BhbjsKICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgfQpAQCAtMTU4MSwyNyArMTc4NywzNiBAQAogCiAgICAgLy8gQSBtdXRhYmxlIEludGVnZXIgLSB1c2VkIHRvIGF2b2lkIGhlYXAgYWxsb2NhdGlvbiBkdXJpbmcgdGhlIGxheW91dCBvcGVyYXRpb24KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEludCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXV0YWJsZUludCB7CiAgICAgICAgIHB1YmxpYyBpbnQgdmFsdWU7CiAKLSAgICAgICAgcHJpdmF0ZSBJbnQoKSB7CisgICAgICAgIHByaXZhdGUgTXV0YWJsZUludCgpIHsKICAgICAgICAgICAgIHJlc2V0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIEludChpbnQgdmFsdWUpIHsKKyAgICAgICAgcHJpdmF0ZSBNdXRhYmxlSW50KGludCB2YWx1ZSkgewogICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewogICAgICAgICAgICAgdmFsdWUgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKICAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSW50IG5lZygpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZAotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KICAgICB9CiAKKyAgICAvKgorICAgIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCBpbiBwbGFjZSBvZiBhIE1hcCB3aGVyZSB3ZSBoYXZlIGFuIGluZGV4IHRoYXQgcmVmZXJzIHRvIHRoZSBvcmRlcgorICAgIGluIHdoaWNoIGVhY2gga2V5L3ZhbHVlIHBhaXJzIHdlcmUgYWRkZWQgdG8gdGhlIG1hcC4gSW4gdGhpcyBjYXNlIHdlIHN0b3JlIGtleXMgYW5kIHZhbHVlcworICAgIGluIGFycmF5cyBvZiBhIGxlbmd0aCB0aGF0IGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdW5pcXVlIGtleXMuIFdlIGFsc28gbWFpbnRhaW4gYW4KKyAgICBhcnJheSBvZiBpbmRleGVzIGZyb20gaW5zZXJ0aW9uIG9yZGVyIHRvIHRoZSBjb21wYWN0ZWQgYXJyYXlzIG9mIGtleXMgYW5kIHZhbHVlcy4KKworICAgIE5vdGUgdGhhdCBiZWhhdmlvciBkaWZmZXJzIGZyb20gdGhhdCBvZiBhIExpbmtlZEhhc2hNYXAgaW4gdGhhdCByZXBlYXRlZCBlbnRyaWVzCisgICAgKmRvKiBnZXQgYWRkZWQgbXVsdGlwbGVzIHRpbWVzLiBTbyB0aGUgbGVuZ3RoIG9mIGluZGV4IGlzIGVxdWFscyB0byB0aGUgbnVtYmVyIG9mCisgICAgaXRlbXMgYWRkZWQuCisKKyAgICBUaGlzIGlzIHVzZWZ1bCBpbiB0aGUgR3JpZExheW91dCBjbGFzcyB3aGVyZSB3ZSBjYW4gcmVseSBvbiB0aGUgb3JkZXIgb2YgY2hpbGRyZW4gbm90CisgICAgY2hhbmdpbmcgZHVyaW5nIGxheW91dCAtIHRvIHVzZSBpbnRlZ2VyLWJhc2VkIGxvb2t1cCBmb3Igb3VyIGludGVybmFsIHN0cnVjdHVyZXMKKyAgICByYXRoZXIgdGhhbiB1c2luZyAoYW5kIHN0b3JpbmcpIGFuIGltcGxlbWVudGF0aW9uIG9mIE1hcDxLZXksID8+LgorICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHZhbHVlID0gInVuY2hlY2tlZCIpCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFja2VkTWFwPEssIFY+IHsKICAgICAgICAgcHVibGljIGZpbmFsIGludFtdIGluZGV4OwpAQCAtMTYxMSw4ICsxODI2LDggQEAKICAgICAgICAgcHJpdmF0ZSBQYWNrZWRNYXAoS1tdIGtleXMsIFZbXSB2YWx1ZXMpIHsKICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBjcmVhdGVJbmRleChrZXlzKTsKIAotICAgICAgICAgICAgdGhpcy5rZXlzID0gaW5kZXgoa2V5cywgaW5kZXgpOwotICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBpbmRleCh2YWx1ZXMsIGluZGV4KTsKKyAgICAgICAgICAgIHRoaXMua2V5cyA9IGNvbXBhY3Qoa2V5cywgaW5kZXgpOworICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBjb21wYWN0KHZhbHVlcywgaW5kZXgpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBLIGdldEtleShpbnQgaSkgewpAQCAtMTY0OCwxOSArMTg2MywzMyBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIDxLPiBLW10gaW5kZXgoS1tdIGtleXMsIGludFtdIGluZGV4KSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IGtleXMubGVuZ3RoOwotICAgICAgICAgICAgQ2xhc3M8Pz4gY29tcG9uZW50VHlwZSA9IGtleXMuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIC8qCisgICAgICAgIENyZWF0ZSBhIGNvbXBhY3QgYXJyYXkgb2Yga2V5cyBvciB2YWx1ZXMgdXNpbmcgdGhlIHN1cHBsaWVkIGluZGV4LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgPEs+IEtbXSBjb21wYWN0KEtbXSBhLCBpbnRbXSBpbmRleCkgeworICAgICAgICAgICAgaW50IHNpemUgPSBhLmxlbmd0aDsKKyAgICAgICAgICAgIENsYXNzPD8+IGNvbXBvbmVudFR5cGUgPSBhLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwogICAgICAgICAgICAgS1tdIHJlc3VsdCA9IChLW10pIEFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudFR5cGUsIG1heChpbmRleCwgLTEpICsgMSk7CiAKICAgICAgICAgICAgIC8vIHRoaXMgb3ZlcndyaXRlIGR1cGxpY2F0ZXMsIHJldGFpbmluZyB0aGUgbGFzdCBlcXVpdmFsZW50IGVudHJ5CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIHJlc3VsdFtpbmRleFtpXV0gPSBrZXlzW2ldOworICAgICAgICAgICAgICAgIHJlc3VsdFtpbmRleFtpXV0gPSBhW2ldOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qCisgICAgRm9yIGVhY2ggR3JvdXAgKHdpdGggYSBnaXZlbiBhbGlnbm1lbnQpIHdlIG5lZWQgdG8gc3RvcmUgdGhlIGFtb3VudCBvZiBzcGFjZSByZXF1aXJlZAorICAgIGFib3ZlIHRoZSBhbGlnbm1lbnQgcG9pbnQgYW5kIHRoZSBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQgYmVsb3cgaXQuIE9uZSBzaWRlIG9mIHRoaXMKKyAgICBjYWxjdWxhdGlvbiBpcyBhbHdheXMgMCBmb3IgTEVBRElORyBhbmQgVFJBSUxJTkcgYWxpZ25tZW50cyBidXQgd2UgZG9uJ3QgbWFrZSB1c2Ugb2YgdGhpcy4KKyAgICBGb3IgQ0VOVEVSIGFuZCBCQVNFTElORSBhbGlnbm1lbnRzIGJvdGggc2lkZXMgYXJlIG5lZWRlZCBhbmQgaW4gdGhlIEJBU0VMSU5FIGNhc2Ugbm8KKyAgICBzaW1wbGUgb3B0aW1pc2F0aW9ucyBhcmUgcG9zc2libGUuCisKKyAgICBUaGUgZ2VuZXJhbCBhbGdvcml0aG0gdGhlcmVmb3JlIGlzIHRvIGNyZWF0ZSBhIE1hcCAoYWN0dWFsbHkgYSBQYWNrZWRNYXApIGZyb20KKyAgICBHcm91cCB0byBCb3VuZHMgYW5kIHRvIGxvb3AgdGhyb3VnaCBhbGwgVmlld3MgaW4gdGhlIGdyb3VwIHRha2luZyB0aGUgbWF4aW11bQorICAgIG9mIHRoZSB2YWx1ZXMgZm9yIGVhY2ggVmlldy4KKyAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJvdW5kcyB7CiAgICAgICAgIHB1YmxpYyBpbnQgYmVsb3c7CiAgICAgICAgIHB1YmxpYyBpbnQgYWJvdmU7CkBAIC0xNzA4LDExICsxOTM3LDEyIEBACiAgICAgICogSW50ZXJ2YWxzIGFyZSBvZnRlbiB3cml0dGVuIGFzIDxjb2RlPlttaW4sIG1heF08L2NvZGU+IGFuZCByZXByZXNlbnQgdGhlIHNldCBvZiB2YWx1ZXMKICAgICAgKiA8ZW0+eDwvZW0+IHN1Y2ggdGhhdCA8ZW0+bWluIDw9IHggPCBtYXg8L2VtPi4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVydmFsIHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBJbnRlcnZhbCB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgbWluaW11bSB2YWx1ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbWluOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgbWF4aW11bSB2YWx1ZS4KICAgICAgICAgICovCkBAIC0xNzkzLDE0ICsyMDIzLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHcm91cCB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUge0BsaW5rIEludGVydmFsI21pbiBtaW59IGFuZCB7QGxpbmsgSW50ZXJ2YWwjbWF4IG1heH0gdmFsdWVzIG9mCi0gICAgICAgICAqIGEgc3BhbiBzcGVjaWZ5IHRoZSBncmlkIGluZGljZXMgb2YgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGVkZ2VzIG9mCi0gICAgICAgICAqIHRoZSBjZWxsIGdyb3VwLgorICAgICAgICAgKiBUaGUgZ3JpZCBpbmRpY2VzIG9mIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBlZGdlcyBvZiB0aGlzIGNlbGwgZ3JvdXAgZm9yIHRoZQorICAgICAgICAgKiBhcHByb3ByaWF0ZSBheGlzLgogICAgICAgICAgKiA8cD4KICAgICAgICAgICogU2VlIHtAbGluayBHcmlkTGF5b3V0fSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29udmVudGlvbnMgdXNlZCBieSBHcmlkTGF5b3V0CiAgICAgICAgICAqIGZvciBncmlkIGluZGljZXMuCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZmluYWwgSW50ZXJ2YWwgc3BhbjsKKyAgICAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBJbnRlcnZhbCBzcGFuOwogICAgICAgICAvKioKICAgICAgICAgICogU3BlY2lmaWVzIGhvdyBjZWxscyBzaG91bGQgYmUgYWxpZ25lZCBpbiB0aGlzIGdyb3VwLgogICAgICAgICAgKiBGb3Igcm93IGdyb3VwcywgdGhpcyBzcGVjaWZpZXMgdGhlIHZlcnRpY2FsIGFsaWdubWVudC4KQEAgLTE4MTgsNyArMjA0Nyw3IEBACiAgICAgICAgICAqIEBwYXJhbSBzcGFuICAgICAgdGhlIHNwYW4uCiAgICAgICAgICAqIEBwYXJhbSBhbGlnbm1lbnQgdGhlIGFsaWdubWVudC4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBHcm91cChJbnRlcnZhbCBzcGFuLCBBbGlnbm1lbnQgYWxpZ25tZW50KSB7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gR3JvdXAoSW50ZXJ2YWwgc3BhbiwgQWxpZ25tZW50IGFsaWdubWVudCkgewogICAgICAgICAgICAgdGhpcy5zcGFuID0gc3BhbjsKICAgICAgICAgICAgIHRoaXMuYWxpZ25tZW50ID0gYWxpZ25tZW50OwogICAgICAgICB9CkBAIC0xODYxLDcgKzIwOTAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUge0BsaW5rICNnZXRDbGFzcyBjbGFzc30sIHtAbGluayAjYWxpZ25tZW50fSBhbmQge0BsaW5rICNzcGFufQorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHtAbGluayAjZ2V0Q2xhc3MgY2xhc3N9LCB7QGxpbmsgI2FsaWdubWVudH0gYW5kIDxjb2RlPnNwYW48L2NvZGU+CiAgICAgICAgICAqIHByb3BlcnRpZXMgb2YgdGhpcyBHcm91cCBhbmQgdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBhcmUgcGFpcndpc2UgZXF1YWw7IGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIHRoYXQgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgZ3JvdXAgd2l0aC4KQEAgLTE4OTgsOSArMjEyNyw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBBbGlnbm1lbnRzCi0KLQogICAgIC8qKgogICAgICAqIEFsaWdubWVudHMgc3BlY2lmeSB3aGVyZSBhIHZpZXcgc2hvdWxkIGJlIHBsYWNlZCB3aXRoaW4gYSBjZWxsIGdyb3VwIGFuZAogICAgICAqIHdoYXQgc2l6ZSBpdCBzaG91bGQgYmUuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCmluZGV4IDAzODNiNWMuLjczMmNlZGMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCkBAIC0xNDA4LDE5ICsxNDA4LDIwIEBACiAgICAgICAgIGludCBjaGlsZExlZnQ7CiAgICAgICAgIGZpbmFsIGludCBjaGlsZFRvcCA9IGZsb3cgPyB5IDogeSAtIGg7CiAKLSAgICAgICAgc3dpdGNoIChtR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKLSAgICAgICAgY2FzZSBHcmF2aXR5LkxFRlQ6Ci0gICAgICAgICAgICBjaGlsZExlZnQgPSBjaGlsZHJlbkxlZnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMOgotICAgICAgICAgICAgY2hpbGRMZWZ0ID0gY2hpbGRyZW5MZWZ0ICsgKChtQ29sdW1uV2lkdGggLSB3KSAvIDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR3Jhdml0eS5SSUdIVDoKLSAgICAgICAgICAgIGNoaWxkTGVmdCA9IGNoaWxkcmVuTGVmdCArIG1Db2x1bW5XaWR0aCAtIHc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNoaWxkTGVmdCA9IGNoaWxkcmVuTGVmdDsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaW5hbCBpbnQgYWJzb2x1dGVHcmF2aXR5ID0gR3Jhdml0eS5nZXRBYnNvbHV0ZUdyYXZpdHkobUdyYXZpdHksaXNMYXlvdXRSdGwoKSk7CisgICAgICAgIHN3aXRjaCAoYWJzb2x1dGVHcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgeworICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkxFRlQ6CisgICAgICAgICAgICAgICAgY2hpbGRMZWZ0ID0gY2hpbGRyZW5MZWZ0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMOgorICAgICAgICAgICAgICAgIGNoaWxkTGVmdCA9IGNoaWxkcmVuTGVmdCArICgobUNvbHVtbldpZHRoIC0gdykgLyAyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5SSUdIVDoKKyAgICAgICAgICAgICAgICBjaGlsZExlZnQgPSBjaGlsZHJlbkxlZnQgKyBtQ29sdW1uV2lkdGggLSB3OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjaGlsZExlZnQgPSBjaGlsZHJlbkxlZnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmVlZFRvTWVhc3VyZSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ltYWdlVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ltYWdlVmlldy5qYXZhCmluZGV4IGQ4MDY4ZjkuLjRiODcwZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZVZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSW1hZ2VWaWV3LmphdmEKQEAgLTE4Nyw2ICsxODcsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xheW91dFJ0bChEcmF3YWJsZSBkcikgeworICAgICAgICByZXR1cm4gKGRyID09IG1EcmF3YWJsZSkgPyBpc0xheW91dFJ0bCgpIDogc3VwZXIuaXNMYXlvdXRSdGwoZHIpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIG9uU2V0QWxwaGEoaW50IGFscGhhKSB7CiAgICAgICAgIGlmIChnZXRCYWNrZ3JvdW5kKCkgPT0gbnVsbCkgewogICAgICAgICAgICAgaW50IHNjYWxlID0gYWxwaGEgKyAoYWxwaGEgPj4gNyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKaW5kZXggNmYzMDQ1Mi4uMzg3NjczNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQpAQCAtMTAzLDIxICsxMDMsMzkgQEAKICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoY2F0ZWdvcnkgPSAibWVhc3VyZW1lbnQiKQogICAgIHByaXZhdGUgaW50IG1PcmllbnRhdGlvbjsKIAotICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJtZWFzdXJlbWVudCIsIG1hcHBpbmcgPSB7Ci0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSAgLTEsICAgICAgICAgICAgICAgICAgICAgICB0byA9ICJOT05FIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5Lk5PX0dSQVZJVFksICAgICAgICB0byA9ICJOT05FIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LlRPUCwgICAgICAgICAgICAgICB0byA9ICJUT1AiKSwKLSAgICAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IEdyYXZpdHkuQk9UVE9NLCAgICAgICAgICAgIHRvID0gIkJPVFRPTSIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5MRUZULCAgICAgICAgICAgICAgdG8gPSAiTEVGVCIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5SSUdIVCwgICAgICAgICAgICAgdG8gPSAiUklHSFQiKSwKLSAgICAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMLCAgIHRvID0gIkNFTlRFUl9WRVJUSUNBTCIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5GSUxMX1ZFUlRJQ0FMLCAgICAgdG8gPSAiRklMTF9WRVJUSUNBTCIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTCwgdG8gPSAiQ0VOVEVSX0hPUklaT05UQUwiKSwKLSAgICAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMLCAgIHRvID0gIkZJTExfSE9SSVpPTlRBTCIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5DRU5URVIsICAgICAgICAgICAgdG8gPSAiQ0VOVEVSIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkZJTEwsICAgICAgICAgICAgICB0byA9ICJGSUxMIikKKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoY2F0ZWdvcnkgPSAibWVhc3VyZW1lbnQiLCBmbGFnTWFwcGluZyA9IHsKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSAtMSwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSAtMSwgbmFtZSA9ICJOT05FIiksCisgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gR3Jhdml0eS5OT19HUkFWSVRZLAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuTk9fR1JBVklUWSxuYW1lID0gIk5PTkUiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LlRPUCwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LlRPUCwgbmFtZSA9ICJUT1AiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LkJPVFRPTSwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LkJPVFRPTSwgbmFtZSA9ICJCT1RUT00iKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LkxFRlQsCisgICAgICAgICAgICAgICAgZXF1YWxzID0gR3Jhdml0eS5MRUZULCBuYW1lID0gIkxFRlQiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LlJJR0hULAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuUklHSFQsIG5hbWUgPSAiUklHSFQiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LlNUQVJULAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuU1RBUlQsIG5hbWUgPSAiU1RBUlQiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LkVORCwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LkVORCwgbmFtZSA9ICJFTkQiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCwgbmFtZSA9ICJDRU5URVJfVkVSVElDQUwiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LkZJTExfVkVSVElDQUwsCisgICAgICAgICAgICAgICAgZXF1YWxzID0gR3Jhdml0eS5GSUxMX1ZFUlRJQ0FMLCBuYW1lID0gIkZJTExfVkVSVElDQUwiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMLAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUwsIG5hbWUgPSAiQ0VOVEVSX0hPUklaT05UQUwiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTCwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTCwgbmFtZSA9ICJGSUxMX0hPUklaT05UQUwiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LkNFTlRFUiwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LkNFTlRFUiwgbmFtZSA9ICJDRU5URVIiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LkZJTEwsCisgICAgICAgICAgICAgICAgZXF1YWxzID0gR3Jhdml0eS5GSUxMLCBuYW1lID0gIkZJTEwiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5LlJFTEFUSVZFX0hPUklaT05UQUxfRElSRUNUSU9OLAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9ESVJFQ1RJT04sIG5hbWUgPSAiUkVMQVRJVkUiKQogICAgICAgICB9KQotICAgIHByaXZhdGUgaW50IG1HcmF2aXR5ID0gR3Jhdml0eS5MRUZUIHwgR3Jhdml0eS5UT1A7CisgICAgcHJpdmF0ZSBpbnQgbUdyYXZpdHkgPSBHcmF2aXR5LlNUQVJUIHwgR3Jhdml0eS5UT1A7CiAKICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoY2F0ZWdvcnkgPSAibWVhc3VyZW1lbnQiKQogICAgIHByaXZhdGUgaW50IG1Ub3RhbExlbmd0aDsKQEAgLTEzOTQsNyArMTQxMiw3IEBACiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldFZpcnR1YWxDaGlsZENvdW50KCk7CiAKICAgICAgICAgZmluYWwgaW50IG1ham9yR3Jhdml0eSA9IG1HcmF2aXR5ICYgR3Jhdml0eS5WRVJUSUNBTF9HUkFWSVRZX01BU0s7Ci0gICAgICAgIGZpbmFsIGludCBtaW5vckdyYXZpdHkgPSBtR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0s7CisgICAgICAgIGZpbmFsIGludCBtaW5vckdyYXZpdHkgPSBtR3Jhdml0eSAmIEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0s7CiAKICAgICAgICAgc3dpdGNoIChtYWpvckdyYXZpdHkpIHsKICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkJPVFRPTToKQEAgLTE0MjgsOCArMTQ0Niw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGdyYXZpdHkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGdyYXZpdHkgPSBtaW5vckdyYXZpdHk7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChncmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBhYnNvbHV0ZUdyYXZpdHkgPSBHcmF2aXR5LmdldEFic29sdXRlR3Jhdml0eShncmF2aXR5LCBpc0xheW91dFJ0bCgpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFic29sdXRlR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMOgogICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMZWZ0ID0gcGFkZGluZ0xlZnQgKyAoKGNoaWxkU3BhY2UgLSBjaGlsZFdpZHRoKSAvIDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luOwpAQCAtMTQ4Myw3ICsxNTAxLDcgQEAKIAogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRWaXJ0dWFsQ2hpbGRDb3VudCgpOwogCi0gICAgICAgIGZpbmFsIGludCBtYWpvckdyYXZpdHkgPSBtR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0s7CisgICAgICAgIGZpbmFsIGludCBtYWpvckdyYXZpdHkgPSBtR3Jhdml0eSAmIEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0s7CiAgICAgICAgIGZpbmFsIGludCBtaW5vckdyYXZpdHkgPSBtR3Jhdml0eSAmIEdyYXZpdHkuVkVSVElDQUxfR1JBVklUWV9NQVNLOwogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmFzZWxpbmVBbGlnbmVkID0gbUJhc2VsaW5lQWxpZ25lZDsKQEAgLTE0OTEsNyArMTUwOSw3IEBACiAgICAgICAgIGZpbmFsIGludFtdIG1heEFzY2VudCA9IG1NYXhBc2NlbnQ7CiAgICAgICAgIGZpbmFsIGludFtdIG1heERlc2NlbnQgPSBtTWF4RGVzY2VudDsKIAotICAgICAgICBzd2l0Y2ggKG1ham9yR3Jhdml0eSkgeworICAgICAgICBzd2l0Y2ggKEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KG1ham9yR3Jhdml0eSwgaXNMYXlvdXRSdGwoKSkpIHsKICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5SSUdIVDoKICAgICAgICAgICAgICAgICAvLyBtVG90YWxMZW5ndGggY29udGFpbnMgdGhlIHBhZGRpbmcgYWxyZWFkeQogICAgICAgICAgICAgICAgIGNoaWxkTGVmdCA9IG1QYWRkaW5nTGVmdCArIG1SaWdodCAtIG1MZWZ0IC0gbVRvdGFsTGVuZ3RoOwpAQCAtMTYzMCw4ICsxNjQ4LDggQEAKICAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKICAgICBwdWJsaWMgdm9pZCBzZXRHcmF2aXR5KGludCBncmF2aXR5KSB7CiAgICAgICAgIGlmIChtR3Jhdml0eSAhPSBncmF2aXR5KSB7Ci0gICAgICAgICAgICBpZiAoKGdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZ3Jhdml0eSB8PSBHcmF2aXR5LkxFRlQ7CisgICAgICAgICAgICBpZiAoKGdyYXZpdHkgJiBHcmF2aXR5LlJFTEFUSVZFX0hPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ3Jhdml0eSB8PSBHcmF2aXR5LlNUQVJUOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKGdyYXZpdHkgJiBHcmF2aXR5LlZFUlRJQ0FMX0dSQVZJVFlfTUFTSykgPT0gMCkgewpAQCAtMTY0NSw5ICsxNjYzLDkgQEAKIAogICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAogICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxHcmF2aXR5KGludCBob3Jpem9udGFsR3Jhdml0eSkgewotICAgICAgICBmaW5hbCBpbnQgZ3Jhdml0eSA9IGhvcml6b250YWxHcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSzsKLSAgICAgICAgaWYgKChtR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spICE9IGdyYXZpdHkpIHsKLSAgICAgICAgICAgIG1HcmF2aXR5ID0gKG1HcmF2aXR5ICYgfkdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHwgZ3Jhdml0eTsKKyAgICAgICAgZmluYWwgaW50IGdyYXZpdHkgPSBob3Jpem9udGFsR3Jhdml0eSAmIEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0s7CisgICAgICAgIGlmICgobUdyYXZpdHkgJiBHcmF2aXR5LlJFTEFUSVZFX0hPUklaT05UQUxfR1JBVklUWV9NQVNLKSAhPSBncmF2aXR5KSB7CisgICAgICAgICAgICBtR3Jhdml0eSA9IChtR3Jhdml0eSAmIH5HcmF2aXR5LlJFTEFUSVZFX0hPUklaT05UQUxfR1JBVklUWV9NQVNLKSB8IGdyYXZpdHk7CiAgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzI0LDYgKzE3NDIsOCBAQAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5CT1RUT00sICAgICAgICAgICAgdG8gPSAiQk9UVE9NIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkxFRlQsICAgICAgICAgICAgICB0byA9ICJMRUZUIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LlJJR0hULCAgICAgICAgICAgICB0byA9ICJSSUdIVCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5TVEFSVCwgICAgICAgICAgICB0byA9ICJTVEFSVCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5FTkQsICAgICAgICAgICAgIHRvID0gIkVORCIpLAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUwsICAgdG8gPSAiQ0VOVEVSX1ZFUlRJQ0FMIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkZJTExfVkVSVElDQUwsICAgICB0byA9ICJGSUxMX1ZFUlRJQ0FMIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMLCB0byA9ICJDRU5URVJfSE9SSVpPTlRBTCIpLApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQppbmRleCAzMDM3NGFmLi5lZDkxMTRhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQpAQCAtOTE2LDYgKzkxNiwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UnRsKERyYXdhYmxlIHdobykgeworICAgICAgICByZXR1cm4gKHdobyA9PSBtUHJvZ3Jlc3NEcmF3YWJsZSB8fCB3aG8gPT0gbUluZGV0ZXJtaW5hdGVEcmF3YWJsZSkgPworICAgICAgICAgICAgaXNMYXlvdXRSdGwoKSA6IHN1cGVyLmlzTGF5b3V0UnRsKHdobyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvbGR3LCBpbnQgb2xkaCkgewogICAgICAgICB1cGRhdGVEcmF3YWJsZUJvdW5kcyh3LCBoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVsYXRpdmVMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZWxhdGl2ZUxheW91dC5qYXZhCmluZGV4IDkwNjkyODMuLmE0NzcxZDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZWxhdGl2ZUxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZWxhdGl2ZUxheW91dC5qYXZhCkBAIC0xOCwxNyArMTgsMjMgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuUG9vbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2w7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBvb2xzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Qb29sYWJsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUG9vbGFibGVNYW5hZ2VyOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnV0aWwuTG9nLmQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2xzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnOwpAQCAtMzYsMTIgKzQyLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC51dGlsLkxvZy5kOwogCiAvKioKICAqIEEgTGF5b3V0IHdoZXJlIHRoZSBwb3NpdGlvbnMgb2YgdGhlIGNoaWxkcmVuIGNhbiBiZSBkZXNjcmliZWQgaW4gcmVsYXRpb24gdG8gZWFjaCBvdGhlciBvciB0byB0aGUKQEAgLTIyMSw4ICsyMjIsOCBAQAogICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAogICAgIHB1YmxpYyB2b2lkIHNldEdyYXZpdHkoaW50IGdyYXZpdHkpIHsKICAgICAgICAgaWYgKG1HcmF2aXR5ICE9IGdyYXZpdHkpIHsKLSAgICAgICAgICAgIGlmICgoZ3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spID09IDApIHsKLSAgICAgICAgICAgICAgICBncmF2aXR5IHw9IEdyYXZpdHkuTEVGVDsKKyAgICAgICAgICAgIGlmICgoZ3Jhdml0eSAmIEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spID09IDApIHsKKyAgICAgICAgICAgICAgICBncmF2aXR5IHw9IEdyYXZpdHkuU1RBUlQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICgoZ3Jhdml0eSAmIEdyYXZpdHkuVkVSVElDQUxfR1JBVklUWV9NQVNLKSA9PSAwKSB7CkBAIC0yMzYsOSArMjM3LDkgQEAKIAogICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAogICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxHcmF2aXR5KGludCBob3Jpem9udGFsR3Jhdml0eSkgewotICAgICAgICBmaW5hbCBpbnQgZ3Jhdml0eSA9IGhvcml6b250YWxHcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSzsKLSAgICAgICAgaWYgKChtR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spICE9IGdyYXZpdHkpIHsKLSAgICAgICAgICAgIG1HcmF2aXR5ID0gKG1HcmF2aXR5ICYgfkdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHwgZ3Jhdml0eTsKKyAgICAgICAgZmluYWwgaW50IGdyYXZpdHkgPSBob3Jpem9udGFsR3Jhdml0eSAmIEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0s7CisgICAgICAgIGlmICgobUdyYXZpdHkgJiBHcmF2aXR5LlJFTEFUSVZFX0hPUklaT05UQUxfR1JBVklUWV9NQVNLKSAhPSBncmF2aXR5KSB7CisgICAgICAgICAgICBtR3Jhdml0eSA9IChtR3Jhdml0eSAmIH5HcmF2aXR5LlJFTEFUSVZFX0hPUklaT05UQUxfR1JBVklUWV9NQVNLKSB8IGdyYXZpdHk7CiAgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzksNyArMzQwLDcgQEAKICAgICAgICAgbUhhc0Jhc2VsaW5lQWxpZ25lZENoaWxkID0gZmFsc2U7CiAKICAgICAgICAgVmlldyBpZ25vcmUgPSBudWxsOwotICAgICAgICBpbnQgZ3Jhdml0eSA9IG1HcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSzsKKyAgICAgICAgaW50IGdyYXZpdHkgPSBtR3Jhdml0eSAmIEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0s7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaG9yaXpvbnRhbEdyYXZpdHkgPSBncmF2aXR5ICE9IEdyYXZpdHkuTEVGVCAmJiBncmF2aXR5ICE9IDA7CiAgICAgICAgIGdyYXZpdHkgPSBtR3Jhdml0eSAmIEdyYXZpdHkuVkVSVElDQUxfR1JBVklUWV9NQVNLOwogICAgICAgICBmaW5hbCBib29sZWFuIHZlcnRpY2FsR3Jhdml0eSA9IGdyYXZpdHkgIT0gR3Jhdml0eS5UT1AgJiYgZ3Jhdml0eSAhPSAwOwpAQCAtNDk0LDcgKzQ5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAtIG1QYWRkaW5nQm90dG9tKTsKIAogICAgICAgICAgICAgZmluYWwgUmVjdCBjb250ZW50Qm91bmRzID0gbUNvbnRlbnRCb3VuZHM7Ci0gICAgICAgICAgICBHcmF2aXR5LmFwcGx5KG1HcmF2aXR5LCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgc2VsZkJvdW5kcywgY29udGVudEJvdW5kcyk7CisgICAgICAgICAgICBHcmF2aXR5LmFwcGx5KG1HcmF2aXR5LCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgc2VsZkJvdW5kcywgY29udGVudEJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgaXNMYXlvdXRSdGwoKSk7CiAKICAgICAgICAgICAgIGZpbmFsIGludCBob3Jpem9udGFsT2Zmc2V0ID0gY29udGVudEJvdW5kcy5sZWZ0IC0gbGVmdDsKICAgICAgICAgICAgIGZpbmFsIGludCB2ZXJ0aWNhbE9mZnNldCA9IGNvbnRlbnRCb3VuZHMudG9wIC0gdG9wOwpAQCAtMTQzOSw2ICsxNDQxLDcgQEAKICAgICAgICAgICAgICk7CiAKICAgICAgICAgICAgIHByaXZhdGUgTm9kZSBtTmV4dDsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQb29sZWQ7CiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRQb29sYWJsZShOb2RlIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICBtTmV4dCA9IGVsZW1lbnQ7CkBAIC0xNDQ4LDYgKzE0NTEsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbU5leHQ7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUG9vbGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtSXNQb29sZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFBvb2xlZChib29sZWFuIGlzUG9vbGVkKSB7CisgICAgICAgICAgICAgICAgbUlzUG9vbGVkID0gaXNQb29sZWQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN0YXRpYyBOb2RlIGFjcXVpcmUoVmlldyB2aWV3KSB7CiAgICAgICAgICAgICAgICAgZmluYWwgTm9kZSBub2RlID0gc1Bvb2wuYWNxdWlyZSgpOwogICAgICAgICAgICAgICAgIG5vZGUudmlldyA9IHZpZXc7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2VhcmNoVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NlYXJjaFZpZXcuamF2YQppbmRleCA5OTMzZDY4Li41ODZlY2U4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2VhcmNoVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TZWFyY2hWaWV3LmphdmEKQEAgLTkzLDYgKzkzLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUNsZWFyaW5nRm9jdXM7CiAgICAgcHJpdmF0ZSBpbnQgbU1heFdpZHRoOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVm9pY2VCdXR0b25FbmFibGVkOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1Vc2VyUXVlcnk7CiAKICAgICBwcml2YXRlIFNlYXJjaGFibGVJbmZvIG1TZWFyY2hhYmxlOwogICAgIHByaXZhdGUgQnVuZGxlIG1BcHBTZWFyY2hEYXRhOwpAQCAtMzcyLDYgKzM3Myw3IEBACiAgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldFRleHQocXVlcnkpOwogICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkgewogICAgICAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0U2VsZWN0aW9uKHF1ZXJ5Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIG1Vc2VyUXVlcnkgPSBxdWVyeTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIElmIHRoZSBxdWVyeSBpcyBub3QgZW1wdHkgYW5kIHN1Ym1pdCBpcyByZXF1ZXN0ZWQsIHN1Ym1pdCB0aGUgcXVlcnkKQEAgLTg4NSw2ICs4ODcsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIG5ld1RleHQpIHsKICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBtUXVlcnlUZXh0Vmlldy5nZXRUZXh0KCk7CisgICAgICAgIG1Vc2VyUXVlcnkgPSB0ZXh0OwogICAgICAgICBib29sZWFuIGhhc1RleHQgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGV4dCk7CiAgICAgICAgIGlmIChpc1N1Ym1pdEJ1dHRvbkVuYWJsZWQoKSkgewogICAgICAgICAgICAgdXBkYXRlU3VibWl0QnV0dG9uKGhhc1RleHQpOwpAQCAtMTEyNCw3ICsxMTI3LDcgQEAKICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewogICAgICAgICAgICAgaW50ZW50LnNldERhdGEoZGF0YSk7CiAgICAgICAgIH0KLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFNlYXJjaE1hbmFnZXIuVVNFUl9RVUVSWSwgcXVlcnkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoU2VhcmNoTWFuYWdlci5VU0VSX1FVRVJZLCBtVXNlclF1ZXJ5KTsKICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlFVRVJZLCBxdWVyeSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UYWJsZVJvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlUm93LmphdmEKaW5kZXggYjYxMjAwNC4uNWYyMGM4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlUm93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlUm93LmphdmEKQEAgLTIyNCw3ICsyMjQsOCBAQAogICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOwogICAgICAgICAgICAgICAgIGxwLm1PZmZzZXRbTGF5b3V0UGFyYW1zLkxPQ0FUSU9OX05FWFRdID0gY29sdW1uV2lkdGggLSBjaGlsZFdpZHRoOwogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChncmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBhYnNvbHV0ZUdyYXZpdHkgPSBHcmF2aXR5LmdldEFic29sdXRlR3Jhdml0eShncmF2aXR5LCBpc0xheW91dFJ0bCgpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFic29sdXRlR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkxFRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBvZmZzZXQgb24gWCBheGlzCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggMzg3NTc2NS4uZWJhOWQzNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTExMyw2ICsxMTMsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQmFzZUlucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQ29tcGxldGlvbkluZm87CkBAIC0yMDkzLDggKzIwOTQsOCBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2dyYXZpdHkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRHcmF2aXR5KGludCBncmF2aXR5KSB7Ci0gICAgICAgIGlmICgoZ3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spID09IDApIHsKLSAgICAgICAgICAgIGdyYXZpdHkgfD0gR3Jhdml0eS5MRUZUOworICAgICAgICBpZiAoKGdyYXZpdHkgJiBHcmF2aXR5LlJFTEFUSVZFX0hPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSAwKSB7CisgICAgICAgICAgICBncmF2aXR5IHw9IEdyYXZpdHkuU1RBUlQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChncmF2aXR5ICYgR3Jhdml0eS5WRVJUSUNBTF9HUkFWSVRZX01BU0spID09IDApIHsKICAgICAgICAgICAgIGdyYXZpdHkgfD0gR3Jhdml0eS5UT1A7CkBAIC0yMTAyLDggKzIxMDMsOCBAQAogCiAgICAgICAgIGJvb2xlYW4gbmV3TGF5b3V0ID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKChncmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgIT0KLSAgICAgICAgICAgIChtR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spKSB7CisgICAgICAgIGlmICgoZ3Jhdml0eSAmIEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spICE9CisgICAgICAgICAgICAobUdyYXZpdHkgJiBHcmF2aXR5LlJFTEFUSVZFX0hPUklaT05UQUxfR1JBVklUWV9NQVNLKSkgewogICAgICAgICAgICAgbmV3TGF5b3V0ID0gdHJ1ZTsKICAgICAgICAgfQogCkBAIC0yNTY1LDYgKzI1NjYsOSBAQAogICAgICAgICAgICAgICAgICAgICBzcC5yZW1vdmVTcGFuKGN3KTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAvLyBoaWRlQ29udHJvbGxlcnMgd291bGQgZG8gaXQsIGJ1dCBpdCBnZXRzIGNhbGxlZCBhZnRlciB0aGlzIG1ldGhvZCBvbiByb3RhdGlvbgorICAgICAgICAgICAgICAgIHNwLnJlbW92ZVNwYW4obVN1Z2dlc3Rpb25SYW5nZVNwYW4pOworCiAgICAgICAgICAgICAgICAgc3MudGV4dCA9IHNwOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzcy50ZXh0ID0gbVRleHQudG9TdHJpbmcoKTsKQEAgLTQxNDIsNiArNDE0NiwxOSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UnRsKERyYXdhYmxlIHdobykgeworICAgICAgICBpZiAod2hvID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1EcmF3YWJsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgRHJhd2FibGVzIGRyYXdhYmxlcyA9IG1EcmF3YWJsZXM7CisgICAgICAgICAgICBpZiAod2hvID09IGRyYXdhYmxlcy5tRHJhd2FibGVMZWZ0IHx8IHdobyA9PSBkcmF3YWJsZXMubURyYXdhYmxlUmlnaHQgfHwKKyAgICAgICAgICAgICAgICB3aG8gPT0gZHJhd2FibGVzLm1EcmF3YWJsZVRvcCB8fCB3aG8gPT0gZHJhd2FibGVzLm1EcmF3YWJsZUJvdHRvbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpc0xheW91dFJ0bCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5pc0xheW91dFJ0bCh3aG8pOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIG9uU2V0QWxwaGEoaW50IGFscGhhKSB7CiAgICAgICAgIC8vIEFscGhhIGlzIHN1cHBvcnRlZCBpZiBhbmQgb25seSBpZiB0aGUgZHJhd2luZyBjYW4gYmUgZG9uZSBpbiBvbmUgcGFzcy4KICAgICAgICAgLy8gVE9ETyB0ZXh0IHdpdGggc3BhbnMgd2l0aCBhIGJhY2tncm91bmQgY29sb3IgY3VycmVudGx5IGRvIG5vdCByZXNwZWN0IHRoaXMgYWxwaGEuCkBAIC00MzgwLDkgKzQzOTcsMTAgQEAKICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoY29tcG91bmRQYWRkaW5nTGVmdCwgZXh0ZW5kZWRQYWRkaW5nVG9wICsgdm9mZnNldFRleHQpOwogICAgICAgICB9CiAKKyAgICAgICAgZmluYWwgaW50IGFic29sdXRlR3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KG1HcmF2aXR5LCBpc0xheW91dFJ0bCgpKTsKICAgICAgICAgaWYgKG1FbGxpcHNpemUgPT0gVGV4dFV0aWxzLlRydW5jYXRlQXQuTUFSUVVFRSkgewogICAgICAgICAgICAgaWYgKCFtU2luZ2xlTGluZSAmJiBnZXRMaW5lQ291bnQoKSA9PSAxICYmIGNhbk1hcnF1ZWUoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSAhPSBHcmF2aXR5LkxFRlQpIHsKKyAgICAgICAgICAgICAgICAgICAgKGFic29sdXRlR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spICE9IEdyYXZpdHkuTEVGVCkgewogICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUobUxheW91dC5nZXRMaW5lUmlnaHQoMCkgLSAobVJpZ2h0IC0gbUxlZnQgLQogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcG91bmRQYWRkaW5nTGVmdCgpIC0gZ2V0Q29tcG91bmRQYWRkaW5nUmlnaHQoKSksIDAuMGYpOwogICAgICAgICAgICAgfQpAQCAtNTUyOCw3ICs1NTQ2LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIExheW91dC5BbGlnbm1lbnQgYWxpZ25tZW50OwotICAgICAgICBzd2l0Y2ggKG1HcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgeworICAgICAgICBmaW5hbCBpbnQgYWJzb2x1dGVHcmF2aXR5ID0gR3Jhdml0eS5nZXRBYnNvbHV0ZUdyYXZpdHkobUdyYXZpdHksIGlzTGF5b3V0UnRsKCkpOworICAgICAgICBzd2l0Y2ggKGFic29sdXRlR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTDoKICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX0NFTlRFUjsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTc1NjMsNyArNzU4Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwLjBmOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0TGluZUNvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobUdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic29sdXRlR3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KG1HcmF2aXR5LCBpc0xheW91dFJ0bCgpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFic29sdXRlR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkxFRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMC4wZjsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LlJJR0hUOgpAQCAtNzU4Niw3ICs3NjA2LDggQEAKICAgICAgICAgICAgICAgICBmaW5hbCBNYXJxdWVlIG1hcnF1ZWUgPSBtTWFycXVlZTsKICAgICAgICAgICAgICAgICByZXR1cm4gKG1hcnF1ZWUubU1heEZhZGVTY3JvbGwgLSBtYXJxdWVlLm1TY3JvbGwpIC8gZ2V0SG9yaXpvbnRhbEZhZGluZ0VkZ2VMZW5ndGgoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0TGluZUNvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobUdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic29sdXRlR3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KG1HcmF2aXR5LCBpc0xheW91dFJ0bCgpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFic29sdXRlR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkxFRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGV4dFdpZHRoID0gKG1SaWdodCAtIG1MZWZ0KSAtIGdldENvbXBvdW5kUGFkZGluZ0xlZnQoKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbXBvdW5kUGFkZGluZ1JpZ2h0KCk7CkBAIC03NjI3LDcgKzc2NDgsMTggQEAKICAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpIHsKICAgICAgICAgcmV0dXJuIGdldEhlaWdodCgpIC0gZ2V0Q29tcG91bmRQYWRkaW5nVG9wKCkgLSBnZXRDb21wb3VuZFBhZGRpbmdCb3R0b20oKTsKICAgICB9Ci0gICAgCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5kVmlld3NXaXRoVGV4dChBcnJheUxpc3Q8Vmlldz4gb3V0Vmlld3MsIENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0aGlzVGV4dCA9IGdldFRleHQoKTsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHRoaXNUZXh0KSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzVGV4dC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuY29udGFpbnModGV4dCkpIHsKKyAgICAgICAgICAgIG91dFZpZXdzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBlbnVtIEJ1ZmZlclR5cGUgewogICAgICAgICBOT1JNQUwsIFNQQU5OQUJMRSwgRURJVEFCTEUsCiAgICAgfQpAQCAtNzg3OSw2ICs3OTExLDE3IEBACiAgICAgICAgIGV2ZW50LnNldFBhc3N3b3JkKGlzUGFzc3dvcmQpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbykgeworICAgICAgICBzdXBlci5vbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oaW5mbyk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1Bhc3N3b3JkID0gaGFzUGFzc3dvcmRUcmFuc2Zvcm1hdGlvbk1ldGhvZCgpOworICAgICAgICBpZiAoIWlzUGFzc3dvcmQpIHsKKyAgICAgICAgICAgIGluZm8uc2V0VGV4dChnZXRUZXh0KCkpOworICAgICAgICB9CisgICAgICAgIGluZm8uc2V0UGFzc3dvcmQoaXNQYXNzd29yZCk7CisgICAgfQorCiAgICAgdm9pZCBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50VHlwZVZpZXdUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgYmVmb3JlVGV4dCwKICAgICAgICAgICAgIGludCBmcm9tSW5kZXgsIGludCByZW1vdmVkQ291bnQsIGludCBhZGRlZENvdW50KSB7CiAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9CkBAIC04NTI3LDYgKzg1NzAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gc3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9uSW5mby5zdWdnZXN0aW9uU3Bhbi5nZXRTdWdnZXN0aW9ucygpOwogICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uc1tzdWdnZXN0aW9uSW5mby5zdWdnZXN0aW9uSW5kZXhdID0gb3JpZ2luYWxUZXh0OwogCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBzb3VyY2UgSU1FIG9mIHRoZSBzdWdnZXN0aW9uIHBpY2sKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uSW5mby5zdWdnZXN0aW9uU3Bhbi5nZXROb3RpZmljYXRpb25UYXJnZXRDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbW0ubm90aWZ5U3VnZ2VzdGlvblBpY2tlZChzdWdnZXN0aW9uSW5mby5zdWdnZXN0aW9uU3Bhbiwgb3JpZ2luYWxUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uSW5mby5zdWdnZXN0aW9uSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBTdWdnZXN0aW9uU3BhbnMKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aERpZmZlcmVuY2UgPSBzdWdnZXN0aW9uLmxlbmd0aCgpIC0gKHNwYW5FbmQgLSBzcGFuU3RhcnQpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC04NzYyLDEwICs4ODEzLDIyIEBACiAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgewogICAgICAgICAgICAgVHlwZWRBcnJheSBzdHlsZWRBdHRyaWJ1dGVzID0gbUNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhSLnN0eWxlYWJsZS5UaGVtZSk7CiAKLSAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRTZWxlY3Rpb25DQUJUaXRsZSkpOworICAgICAgICAgICAgYm9vbGVhbiBhbGxvd1RleHQgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmFsbG93X2FjdGlvbl9tZW51X2l0ZW1fdGV4dF93aXRoX2ljb24pOworCisgICAgICAgICAgICBtb2RlLnNldFRpdGxlKGFsbG93VGV4dCA/IAorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcudGV4dFNlbGVjdGlvbkNBQlRpdGxlKSA6IG51bGwpOwogICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZShudWxsKTsKIAorICAgICAgICAgICAgaW50IHNlbGVjdEFsbEljb25JZCA9IDA7IC8vIE5vIGljb24gYnkgZGVmYXVsdAorICAgICAgICAgICAgaWYgKCFhbGxvd1RleHQpIHsKKyAgICAgICAgICAgICAgICAvLyBQcm92aWRlIGFuIGljb24sIHRleHQgd2lsbCBub3QgYmUgZGlzcGxheWVkIG9uIHNtYWxsZXIgc2NyZWVucy4KKyAgICAgICAgICAgICAgICBzZWxlY3RBbGxJY29uSWQgPSBzdHlsZWRBdHRyaWJ1dGVzLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5UaGVtZV9hY3Rpb25Nb2RlU2VsZWN0QWxsRHJhd2FibGUsIDApOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9TRUxFQ1RfQUxMLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RBbGwpLgorICAgICAgICAgICAgICAgICAgICBzZXRJY29uKHNlbGVjdEFsbEljb25JZCkuCiAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYScpLgogICAgICAgICAgICAgICAgICAgICBzZXRTaG93QXNBY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fQUxXQVlTIHwgTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fV0lUSF9URVhUKTsKQEAgLTkxNDAsNiArOTIwMywxMyBAQAogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5KTsKIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3NpdGlvbkF0Q3Vyc29yT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIC8vIEEgSGFuZGxlVmlldyByZWxpZXMgb24gdGhlIGxheW91dCwgd2hpY2ggbWF5IGJlIG51bGxlZCBieSBleHRlcm5hbCBtZXRob2RzLgorICAgICAgICAgICAgaWYgKG1MYXlvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFdpbGwgdXBkYXRlIGNvbnRyb2xsZXJzJyBzdGF0ZSwgaGlkaW5nIHRoZW0gYW5kIHN0b3BwaW5nIHNlbGVjdGlvbiBtb2RlIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIHByZXBhcmVDdXJzb3JDb250cm9sbGVycygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYWRkUG9zaXRpb25Ub1RvdWNoVXBGaWx0ZXIob2Zmc2V0KTsKICAgICAgICAgICAgIGZpbmFsIGludCBsaW5lID0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgbGluZUJvdHRvbSA9IG1MYXlvdXQuZ2V0TGluZUJvdHRvbShsaW5lKTsKQEAgLTkyNzEsNyArOTM0MSw2IEBACiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUNFTlRfQ1VUX0NPUFlfRFVSQVRJT04gPSAxNSAqIDEwMDA7IC8vIHNlY29uZHMKIAogICAgICAgICAvLyBVc2VkIHRvIGRldGVjdCB0YXBzIG9uIHRoZSBpbnNlcnRpb24gaGFuZGxlLCB3aGljaCB3aWxsIGFmZmVjdCB0aGUgUGFzdGVQb3B1cFdpbmRvdwotICAgICAgICBwcml2YXRlIGxvbmcgbVRvdWNoVGltZXI7CiAgICAgICAgIHByaXZhdGUgZmxvYXQgbURvd25Qb3NpdGlvblgsIG1Eb3duUG9zaXRpb25ZOwogICAgICAgICBwcml2YXRlIFBhc3RlUG9wdXBXaW5kb3cgbVBhc3RlUG9wdXBXaW5kb3c7CiAgICAgICAgIHByaXZhdGUgUnVubmFibGUgbUhpZGVyOwpAQCAtOTM0NSwyMiArOTQxNCwxOCBAQAogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CiAgICAgICAgICAgICAgICAgICAgIG1Eb3duUG9zaXRpb25YID0gZXYuZ2V0UmF3WCgpOwogICAgICAgICAgICAgICAgICAgICBtRG93blBvc2l0aW9uWSA9IGV2LmdldFJhd1koKTsKLSAgICAgICAgICAgICAgICAgICAgbVRvdWNoVGltZXIgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBkZWxheSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVRvdWNoVGltZXI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWxheSA8IFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgZGVsdGFYID0gbURvd25Qb3NpdGlvblggLSBldi5nZXRSYXdYKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBkZWx0YVkgPSBtRG93blBvc2l0aW9uWSAtIGV2LmdldFJhd1koKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGRpc3RhbmNlU3F1YXJlZCA9IGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZVNxdWFyZWQgPCBtU3F1YXJlZFRvdWNoU2xvcERpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QYXN0ZVBvcHVwV2luZG93ICE9IG51bGwgJiYgbVBhc3RlUG9wdXBXaW5kb3cuaXNTaG93aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFwcGluZyBvbiB0aGUgaGFuZGxlIGRpc21pc3NlcyB0aGUgZGlzcGxheWVkIHBhc3RlIHZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXN0ZVBvcHVwV2luZG93LmhpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgZGVsdGFYID0gbURvd25Qb3NpdGlvblggLSBldi5nZXRSYXdYKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGRlbHRhWSA9IG1Eb3duUG9zaXRpb25ZIC0gZXYuZ2V0UmF3WSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBkaXN0YW5jZVNxdWFyZWQgPSBkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZVNxdWFyZWQgPCBtU3F1YXJlZFRvdWNoU2xvcERpc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBhc3RlUG9wdXBXaW5kb3cgIT0gbnVsbCAmJiBtUGFzdGVQb3B1cFdpbmRvdy5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhcHBpbmcgb24gdGhlIGhhbmRsZSBkaXNtaXNzZXMgdGhlIGRpc3BsYXllZCBwYXN0ZSB2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXN0ZVBvcHVwV2luZG93LmhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdygwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBoaWRlRGVsYXllZCgpOwpAQCAtOTk2Myw3ICsxMDAyOCw3IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIG1TZWxlY3RBbGxPbkZvY3VzID0gZmFsc2U7CiAKLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgIG1HcmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkxFRlQ7CisgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICBtR3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5TVEFSVDsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIG1Ib3Jpem9udGFsbHlTY3JvbGxpbmc7CiAKICAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXRvTGlua01hc2s7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWN0aW9uQmFySW1wbC5qYXZhCmluZGV4IDE4M2NmYmQuLmRkYTNiZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWN0aW9uQmFySW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWN0aW9uQmFySW1wbC5qYXZhCkBAIC0xNzYsNiArMTc2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BY3Rpb25WaWV3LnNldEVtYmVkZGVkVGFiVmlldyhtVGFiU2Nyb2xsVmlldyk7CiAgICAgICAgIH0KKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q29sbGFwc2FibGUoIW1IYXNFbWJlZGRlZFRhYnMgJiYKKyAgICAgICAgICAgICAgICBnZXROYXZpZ2F0aW9uTW9kZSgpID09IE5BVklHQVRJT05fTU9ERV9UQUJTKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPSBtQ29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKG51bGwsIFIuc3R5bGVhYmxlLkFjdGlvbkJhcik7CiAgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gYS5nZXRMYXlvdXREaW1lbnNpb24oUi5zdHlsZWFibGUuQWN0aW9uQmFyX2hlaWdodCwgMCk7CkBAIC0zMDcsNyArMzA5LDkgQEAKICAgICAgICAgICAgIHNlbGVjdFRhYihudWxsKTsKICAgICAgICAgfQogICAgICAgICBtVGFicy5jbGVhcigpOwotICAgICAgICBtVGFiU2Nyb2xsVmlldy5yZW1vdmVBbGxUYWJzKCk7CisgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldy5yZW1vdmVBbGxUYWJzKCk7CisgICAgICAgIH0KICAgICAgICAgbVNhdmVkVGFiUG9zaXRpb24gPSBJTlZBTElEX1BPU0lUSU9OOwogICAgIH0KIApAQCAtMzU4LDggKzM2Miw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBtQ29udGV4dFZpZXcua2lsbE1vZGUoKTsKLSAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gbmV3IEFjdGlvbk1vZGVJbXBsKGNhbGxiYWNrKTsKLSAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgQWN0aW9uTW9kZUltcGwgbW9kZSA9IG5ldyBBY3Rpb25Nb2RlSW1wbChjYWxsYmFjayk7CisgICAgICAgIGlmIChtb2RlLmRpc3BhdGNoT25DcmVhdGUoKSkgewogICAgICAgICAgICAgbVdhc0hpZGRlbkJlZm9yZU1vZGUgPSAhaXNTaG93aW5nKCk7CiAgICAgICAgICAgICBtb2RlLmludmFsaWRhdGUoKTsKICAgICAgICAgICAgIG1Db250ZXh0Vmlldy5pbml0Rm9yTW9kZShtb2RlKTsKQEAgLTYyOSw4ICs2MzMsMjAgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sub25QcmVwYXJlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSkpIHsKLSAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIGNvbnRlbnQgaW4gYm90aCBjb250ZXh0IHZpZXdzCisgICAgICAgICAgICBtTWVudS5zdG9wRGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUHJlcGFyZUFjdGlvbk1vZGUodGhpcywgbU1lbnUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtTWVudS5zdGFydERpc3BhdGNoaW5nSXRlbXNDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaE9uQ3JlYXRlKCkgeworICAgICAgICAgICAgbU1lbnUuc3RvcERpc3BhdGNoaW5nSXRlbXNDaGFuZ2VkKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2sub25DcmVhdGVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbU1lbnUuc3RhcnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTg4Nyw2ICs5MDMsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXRDb2xsYXBzYWJsZShtb2RlID09IE5BVklHQVRJT05fTU9ERV9UQUJTICYmICFtSGFzRW1iZWRkZWRUYWJzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9zdG9yYWdlL0V4dGVybmFsU3RvcmFnZUZvcm1hdHRlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL3N0b3JhZ2UvRXh0ZXJuYWxTdG9yYWdlRm9ybWF0dGVyLmphdmEKaW5kZXggOTY1MDIyZS4uNDc3M2NlNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL3N0b3JhZ2UvRXh0ZXJuYWxTdG9yYWdlRm9ybWF0dGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL3N0b3JhZ2UvRXh0ZXJuYWxTdG9yYWdlRm9ybWF0dGVyLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuSU1vdW50U2VydmljZTsKIGltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlVm9sdW1lOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CkBAIC0zMiw2ICszMyw5IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BTFdBWVNfUkVTRVQgPSAiYWx3YXlzX3Jlc2V0IjsKIAorICAgIC8vIElmIG5vbi1udWxsLCB0aGUgdm9sdW1lIHRvIGZvcm1hdC4gT3RoZXJ3aXNlLCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBleHRlcm5hbCBzdG9yYWdlIGRpcmVjdG9yeQorICAgIHByaXZhdGUgU3RvcmFnZVZvbHVtZSBtU3RvcmFnZVZvbHVtZTsKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBDT01QT05FTlRfTkFNRQogICAgICAgICAgICAgPSBuZXcgQ29tcG9uZW50TmFtZSgiYW5kcm9pZCIsIEV4dGVybmFsU3RvcmFnZUZvcm1hdHRlci5jbGFzcy5nZXROYW1lKCkpOwogCkBAIC04MCw2ICs4NCw4IEBACiAgICAgICAgICAgICBtQWx3YXlzUmVzZXQgPSB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgbVN0b3JhZ2VWb2x1bWUgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKFN0b3JhZ2VWb2x1bWUuRVhUUkFfU1RPUkFHRV9WT0xVTUUpOworCiAgICAgICAgIGlmIChtUHJvZ3Jlc3NEaWFsb2cgPT0gbnVsbCkgewogICAgICAgICAgICAgbVByb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKHRoaXMpOwogICAgICAgICAgICAgbVByb2dyZXNzRGlhbG9nLnNldEluZGV0ZXJtaW5hdGUodHJ1ZSk7CkBAIC0xMTUsNyArMTIxLDkgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbChEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CiAgICAgICAgIElNb3VudFNlcnZpY2UgbW91bnRTZXJ2aWNlID0gZ2V0TW91bnRTZXJ2aWNlKCk7Ci0gICAgICAgIFN0cmluZyBleHRTdG9yYWdlUGF0aCA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBleHRTdG9yYWdlUGF0aCA9IG1TdG9yYWdlVm9sdW1lID09IG51bGwgPworICAgICAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLnRvU3RyaW5nKCkgOgorICAgICAgICAgICAgICAgIG1TdG9yYWdlVm9sdW1lLmdldFBhdGgoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1vdW50U2VydmljZS5tb3VudFZvbHVtZShleHRTdG9yYWdlUGF0aCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC0xMzMsMTIgKzE0MSwxNiBAQAogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlUHJvZ3Jlc3NTdGF0ZSgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXR1cyA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVN0YXRlKCk7CisgICAgICAgIFN0cmluZyBzdGF0dXMgPSBtU3RvcmFnZVZvbHVtZSA9PSBudWxsID8KKyAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VTdGF0ZSgpIDoKKyAgICAgICAgICAgICAgICBtU3RvcmFnZU1hbmFnZXIuZ2V0Vm9sdW1lU3RhdGUobVN0b3JhZ2VWb2x1bWUuZ2V0UGF0aCgpKTsKICAgICAgICAgaWYgKEVudmlyb25tZW50Lk1FRElBX01PVU5URUQuZXF1YWxzKHN0YXR1cykKICAgICAgICAgICAgICAgICB8fCBFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVEX1JFQURfT05MWS5lcXVhbHMoc3RhdHVzKSkgewogICAgICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NEaWFsb2coUi5zdHJpbmcucHJvZ3Jlc3NfdW5tb3VudGluZyk7CiAgICAgICAgICAgICBJTW91bnRTZXJ2aWNlIG1vdW50U2VydmljZSA9IGdldE1vdW50U2VydmljZSgpOwotICAgICAgICAgICAgU3RyaW5nIGV4dFN0b3JhZ2VQYXRoID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHRTdG9yYWdlUGF0aCA9IG1TdG9yYWdlVm9sdW1lID09IG51bGwgPworICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS50b1N0cmluZygpIDoKKyAgICAgICAgICAgICAgICAgICAgbVN0b3JhZ2VWb2x1bWUuZ2V0UGF0aCgpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBtb3VudFNlcnZpY2UudW5tb3VudFZvbHVtZShleHRTdG9yYWdlUGF0aCwgdHJ1ZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpAQCAtMTQ5LDkgKzE2MSwxMiBAQAogICAgICAgICAgICAgICAgIHx8IEVudmlyb25tZW50Lk1FRElBX1VOTU9VTlRBQkxFLmVxdWFscyhzdGF0dXMpKSB7CiAgICAgICAgICAgICB1cGRhdGVQcm9ncmVzc0RpYWxvZyhSLnN0cmluZy5wcm9ncmVzc19lcmFzaW5nKTsKICAgICAgICAgICAgIGZpbmFsIElNb3VudFNlcnZpY2UgbW91bnRTZXJ2aWNlID0gZ2V0TW91bnRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXh0U3RvcmFnZVBhdGggPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS50b1N0cmluZygpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4dFN0b3JhZ2VQYXRoID0gbVN0b3JhZ2VWb2x1bWUgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLnRvU3RyaW5nKCkgOgorICAgICAgICAgICAgICAgICAgICBtU3RvcmFnZVZvbHVtZS5nZXRQYXRoKCk7CiAgICAgICAgICAgICBpZiAobW91bnRTZXJ2aWNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewpAQCAtMTg1LDcgKzIwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9LnN0YXJ0KCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy53KCJNZWRpYUZvcm1hdCIsICJVbmFibGUgdG8gbG9jYXRlIElNb3VudFNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gbG9jYXRlIElNb3VudFNlcnZpY2UiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChFbnZpcm9ubWVudC5NRURJQV9CQURfUkVNT1ZBTC5lcXVhbHMoc3RhdHVzKSkgewogICAgICAgICAgICAgZmFpbChSLnN0cmluZy5tZWRpYV9iYWRfcmVtb3ZhbCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvQmFzZUlXaW5kb3cuamF2YQppbmRleCBjNDFiMmNiLi5iOTk0OGZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0Jhc2VJV2luZG93LmphdmEKQEAgLTE2LDggKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3OwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKQEAgLTI2LDggKzI0LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogCiBwdWJsaWMgY2xhc3MgQmFzZUlXaW5kb3cgZXh0ZW5kcyBJV2luZG93LlN0dWIgewogICAgIHByaXZhdGUgSVdpbmRvd1Nlc3Npb24gbVNlc3Npb247CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEKaW5kZXggMGVmNDg2MS4uYTRiY2Y2MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YQpAQCAtMjM2LDQgKzIzNiwzMSBAQAogICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KGludCByZXNJZCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0U2hvd0FzQWN0aW9uRmxhZ3MoaW50IGFjdGlvbkVudW0pIHsKKyAgICAgICAgc2V0U2hvd0FzQWN0aW9uKGFjdGlvbkVudW0pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBhbmRBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29sbGFwc2VBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBY3Rpb25WaWV3RXhwYW5kZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0T25BY3Rpb25FeHBhbmRMaXN0ZW5lcihPbkFjdGlvbkV4cGFuZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gc2F2ZSB0aGUgbGlzdGVuZXI7IEFjdGlvbk1lbnVJdGVtIGRvZXMgbm90IHN1cHBvcnQgY29sbGFwc2luZyBpdGVtcy4KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW1WaWV3LmphdmEKaW5kZXggYmVhY2Y3NS4uNDc5Nzg4ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CkBAIC0xMDMsNiArMTA0LDEyIEBACiAgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRleHRCdXR0b25WaXNpYmlsaXR5KCkgeworICAgICAgICBib29sZWFuIHZpc2libGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkobVRleHRCdXR0b24uZ2V0VGV4dCgpKTsKKyAgICAgICAgdmlzaWJsZSA9IHZpc2libGUgJiYgKG1JbWFnZUJ1dHRvbi5nZXREcmF3YWJsZSgpID09IG51bGwgfHwgbUl0ZW1EYXRhLnNob3dzVGV4dEFzQWN0aW9uKCkpOworICAgICAgICBtVGV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWSVNJQkxFIDogR09ORSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CiAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKGljb24pOwogICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CkBAIC0xMTEsOSArMTE4LDkgQEAKICAgICAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KEdPTkUpOwogICAgICAgICB9CiAKLSAgICAgICAgbVRleHRCdXR0b24uc2V0VmlzaWJpbGl0eShpY29uID09IG51bGwgfHwgbUl0ZW1EYXRhLnNob3dzVGV4dEFzQWN0aW9uKCkgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgIHVwZGF0ZVRleHRCdXR0b25WaXNpYmlsaXR5KCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKICAgICAgICAgcmV0dXJuIG1UZXh0QnV0dG9uLmdldFZpc2liaWxpdHkoKSAhPSBHT05FOwogICAgIH0KQEAgLTEyOCwxMCArMTM1LDkgQEAKICAgICAgICAgLy8gcG9wdWxhdGUgYWNjZXNzaWJpbGl0eSBkZXNjcmlwdGlvbiB3aXRoIHRpdGxlCiAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbih0aXRsZSk7CiAKLSAgICAgICAgaWYgKG1JbWFnZUJ1dHRvbi5nZXREcmF3YWJsZSgpID09IG51bGwgfHwgbUl0ZW1EYXRhLnNob3dzVGV4dEFzQWN0aW9uKCkpIHsKLSAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFRleHQobVRpdGxlKTsKLSAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVklTSUJMRSk7Ci0gICAgICAgIH0KKyAgICAgICAgbVRleHRCdXR0b24uc2V0VGV4dChtVGl0bGUpOworCisgICAgICAgIHVwZGF0ZVRleHRCdXR0b25WaXNpYmlsaXR5KCk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gc2hvd3NJY29uKCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51UHJlc2VudGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVQcmVzZW50ZXIuamF2YQppbmRleCAwMDUxZWMzLi45MWRkN2UzNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51UHJlc2VudGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51UHJlc2VudGVyLmphdmEKQEAgLTExMiw4ICsxMTIsMTEgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBWaWV3IGdldEl0ZW1WaWV3KE1lbnVJdGVtSW1wbCBpdGVtLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIFZpZXcgYWN0aW9uVmlldyA9IGl0ZW0uZ2V0QWN0aW9uVmlldygpOwotICAgICAgICByZXR1cm4gYWN0aW9uVmlldyAhPSBudWxsID8gYWN0aW9uVmlldyA6IHN1cGVyLmdldEl0ZW1WaWV3KGl0ZW0sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgICAgICBWaWV3IGFjdGlvblZpZXcgPSBpdGVtLmdldEFjdGlvblZpZXcoKTsKKyAgICAgICAgYWN0aW9uVmlldyA9IGFjdGlvblZpZXcgIT0gbnVsbCAmJiAhaXRlbS5oYXNDb2xsYXBzaWJsZUFjdGlvblZpZXcoKSA/CisgICAgICAgICAgICAgICAgYWN0aW9uVmlldyA6IHN1cGVyLmdldEl0ZW1WaWV3KGl0ZW0sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgICAgICBhY3Rpb25WaWV3LnNldFZpc2liaWxpdHkoaXRlbS5pc0FjdGlvblZpZXdFeHBhbmRlZCgpID8gVmlldy5HT05FIDogVmlldy5WSVNJQkxFKTsKKyAgICAgICAgcmV0dXJuIGFjdGlvblZpZXc7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zMDMsNyArMzA2LDcgQEAKIAogICAgICAgICAgICAgaWYgKGl0ZW0ucmVxdWlyZXNBY3Rpb25CdXR0b24oKSkgewogICAgICAgICAgICAgICAgIFZpZXcgdiA9IGl0ZW0uZ2V0QWN0aW9uVmlldygpOwotICAgICAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsIHx8IGl0ZW0uaGFzQ29sbGFwc2libGVBY3Rpb25WaWV3KCkpIHsKICAgICAgICAgICAgICAgICAgICAgdiA9IGdldEl0ZW1WaWV3KGl0ZW0sIG1TY3JhcEFjdGlvbkJ1dHRvblZpZXcsIHBhcmVudCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU2NyYXBBY3Rpb25CdXR0b25WaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TY3JhcEFjdGlvbkJ1dHRvblZpZXcgPSB2OwpAQCAtMzI5LDcgKzMzMiw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoaXNBY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgVmlldyB2ID0gaXRlbS5nZXRBY3Rpb25WaWV3KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCBpdGVtLmhhc0NvbGxhcHNpYmxlQWN0aW9uVmlldygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0SXRlbVZpZXcoaXRlbSwgbVNjcmFwQWN0aW9uQnV0dG9uVmlldywgcGFyZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2NyYXBBY3Rpb25CdXR0b25WaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2NyYXBBY3Rpb25CdXR0b25WaWV3ID0gdjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQmFzZU1lbnVQcmVzZW50ZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQmFzZU1lbnVQcmVzZW50ZXIuamF2YQppbmRleCAxNmY1MWZkLi5kZGJiMDhjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0Jhc2VNZW51UHJlc2VudGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9CYXNlTWVudVByZXNlbnRlci5qYXZhCkBAIC0xOTIsNCArMTkyLDEyIEBACiAgICAgcHVibGljIGJvb2xlYW4gZmxhZ0FjdGlvbkl0ZW1zKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXhwYW5kSXRlbUFjdGlvblZpZXcoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbGxhcHNlSXRlbUFjdGlvblZpZXcoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVJdGVtVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudUl0ZW1WaWV3LmphdmEKaW5kZXggYWZhOGEwMS4uYzMzN2E1ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudUl0ZW1WaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudUl0ZW1WaWV3LmphdmEKQEAgLTI4Miw3ICsyODIsNyBAQAogICAgICAgICBnZXRMaW5lQm91bmRzKDAsIHRtcFJlY3QpOwogICAgICAgICBtUG9zaXRpb25JY29uQXZhaWxhYmxlLnNldCgwLCAwLCBnZXRXaWR0aCgpLCB0bXBSZWN0LnRvcCk7CiAgICAgICAgIEdyYXZpdHkuYXBwbHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgfCBHcmF2aXR5LkxFRlQsIG1JY29uLmdldEludHJpbnNpY1dpZHRoKCksIG1JY29uCi0gICAgICAgICAgICAgICAgLmdldEludHJpbnNpY0hlaWdodCgpLCBtUG9zaXRpb25JY29uQXZhaWxhYmxlLCBtUG9zaXRpb25JY29uT3V0cHV0KTsKKyAgICAgICAgICAgICAgICAuZ2V0SW50cmluc2ljSGVpZ2h0KCksIG1Qb3NpdGlvbkljb25BdmFpbGFibGUsIG1Qb3NpdGlvbkljb25PdXRwdXQsIGlzTGF5b3V0UnRsKCkpOwogICAgICAgICBtSWNvbi5zZXRCb3VuZHMobVBvc2l0aW9uSWNvbk91dHB1dCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0xpc3RNZW51UHJlc2VudGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0xpc3RNZW51UHJlc2VudGVyLmphdmEKaW5kZXggMmNiMmExMC4uZjhkMjRhMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9MaXN0TWVudVByZXNlbnRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTGlzdE1lbnVQcmVzZW50ZXIuamF2YQpAQCAtMTU5LDYgKzE1OSwxNCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZXhwYW5kSXRlbUFjdGlvblZpZXcoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbGxhcHNlSXRlbUFjdGlvblZpZXcoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHNhdmVIaWVyYXJjaHlTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4gdmlld1N0YXRlcyA9IG5ldyBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPigpOwogICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQppbmRleCBlOWZjYjIzLi5mZGZhOTU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCkBAIC03NDQsMTEgKzc0NCwxNCBAQAogICAgICAgICAKICAgICAgICAgaWYgKGl0ZW1JbXBsID09IG51bGwgfHwgIWl0ZW1JbXBsLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gICAgICAgIAorICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBib29sZWFuIGludm9rZWQgPSBpdGVtSW1wbC5pbnZva2UoKTsKIAotICAgICAgICBpZiAoaXRlbS5oYXNTdWJNZW51KCkpIHsKKyAgICAgICAgaWYgKGl0ZW1JbXBsLmhhc0NvbGxhcHNpYmxlQWN0aW9uVmlldygpKSB7CisgICAgICAgICAgICBpbnZva2VkIHw9IGl0ZW1JbXBsLmV4cGFuZEFjdGlvblZpZXcoKTsKKyAgICAgICAgICAgIGlmIChpbnZva2VkKSBjbG9zZSh0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmhhc1N1Yk1lbnUoKSkgewogICAgICAgICAgICAgY2xvc2UoZmFsc2UpOwogCiAgICAgICAgICAgICBpbnZva2VkIHw9IGRpc3BhdGNoU3ViTWVudVNlbGVjdGVkKChTdWJNZW51QnVpbGRlcikgaXRlbS5nZXRTdWJNZW51KCkpOwpAQCAtMTA4MSw0ICsxMDg0LDQyIEBACiAgICAgYm9vbGVhbiBnZXRPcHRpb25hbEljb25zVmlzaWJsZSgpIHsKICAgICAgICAgcmV0dXJuIG1PcHRpb25hbEljb25zVmlzaWJsZTsKICAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBhbmRJdGVtQWN0aW9uVmlldyhNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICBpZiAobVByZXNlbnRlcnMuaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiBleHBhbmRlZCA9IGZhbHNlOworCisgICAgICAgIHN0b3BEaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCgpOworICAgICAgICBmb3IgKFdlYWtSZWZlcmVuY2U8TWVudVByZXNlbnRlcj4gcmVmIDogbVByZXNlbnRlcnMpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVQcmVzZW50ZXIgcHJlc2VudGVyID0gcmVmLmdldCgpOworICAgICAgICAgICAgaWYgKHByZXNlbnRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVByZXNlbnRlcnMucmVtb3ZlKHJlZik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChleHBhbmRlZCA9IHByZXNlbnRlci5leHBhbmRJdGVtQWN0aW9uVmlldyh0aGlzLCBpdGVtKSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGFydERpc3BhdGNoaW5nSXRlbXNDaGFuZ2VkKCk7CisKKyAgICAgICAgcmV0dXJuIGV4cGFuZGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbGxhcHNlSXRlbUFjdGlvblZpZXcoTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgaWYgKG1QcmVzZW50ZXJzLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGJvb2xlYW4gY29sbGFwc2VkID0gZmFsc2U7CisKKyAgICAgICAgc3RvcERpc3BhdGNoaW5nSXRlbXNDaGFuZ2VkKCk7CisgICAgICAgIGZvciAoV2Vha1JlZmVyZW5jZTxNZW51UHJlc2VudGVyPiByZWYgOiBtUHJlc2VudGVycykgeworICAgICAgICAgICAgZmluYWwgTWVudVByZXNlbnRlciBwcmVzZW50ZXIgPSByZWYuZ2V0KCk7CisgICAgICAgICAgICBpZiAocHJlc2VudGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUHJlc2VudGVycy5yZW1vdmUocmVmKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNvbGxhcHNlZCA9IHByZXNlbnRlci5jb2xsYXBzZUl0ZW1BY3Rpb25WaWV3KHRoaXMsIGl0ZW0pKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXJ0RGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQoKTsKKworICAgICAgICByZXR1cm4gY29sbGFwc2VkOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCmluZGV4IGM2ZDM4NmQuLmYyNDMwZTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQpAQCAtNzcsNiArNzcsOCBAQAogICAgIHByaXZhdGUgaW50IG1TaG93QXNBY3Rpb24gPSBTSE9XX0FTX0FDVElPTl9ORVZFUjsKIAogICAgIHByaXZhdGUgVmlldyBtQWN0aW9uVmlldzsKKyAgICBwcml2YXRlIE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIgbU9uQWN0aW9uRXhwYW5kTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FjdGlvblZpZXdFeHBhbmRlZCA9IGZhbHNlOwogCiAgICAgLyoqIFVzZWQgZm9yIHRoZSBpY29uIHJlc291cmNlIElEIGlmIHRoaXMgaXRlbSBkb2VzIG5vdCBoYXZlIGFuIGljb24gKi8KICAgICBzdGF0aWMgZmluYWwgaW50IE5PX0lDT04gPSAwOwpAQCAtNTYxLDQgKzU2Myw2MSBAQAogICAgIHB1YmxpYyBWaWV3IGdldEFjdGlvblZpZXcoKSB7CiAgICAgICAgIHJldHVybiBtQWN0aW9uVmlldzsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0U2hvd0FzQWN0aW9uRmxhZ3MoaW50IGFjdGlvbkVudW0pIHsKKyAgICAgICAgc2V0U2hvd0FzQWN0aW9uKGFjdGlvbkVudW0pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBhbmRBY3Rpb25WaWV3KCkgeworICAgICAgICBpZiAoKG1TaG93QXNBY3Rpb24gJiBTSE9XX0FTX0FDVElPTl9DT0xMQVBTRV9BQ1RJT05fVklFVykgPT0gMCB8fCBtQWN0aW9uVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9uQWN0aW9uRXhwYW5kTGlzdGVuZXIgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgIG1PbkFjdGlvbkV4cGFuZExpc3RlbmVyLm9uTWVudUl0ZW1BY3Rpb25FeHBhbmQodGhpcykpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudS5leHBhbmRJdGVtQWN0aW9uVmlldyh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb2xsYXBzZUFjdGlvblZpZXcoKSB7CisgICAgICAgIGlmICgobVNob3dBc0FjdGlvbiAmIFNIT1dfQVNfQUNUSU9OX0NPTExBUFNFX0FDVElPTl9WSUVXKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BY3Rpb25WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgY29sbGFwc2VkIGlmIHdlIGhhdmUgbm8gYWN0aW9uIHZpZXcuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtT25BY3Rpb25FeHBhbmRMaXN0ZW5lciA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgbU9uQWN0aW9uRXhwYW5kTGlzdGVuZXIub25NZW51SXRlbUFjdGlvbkNvbGxhcHNlKHRoaXMpKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnUuY29sbGFwc2VJdGVtQWN0aW9uVmlldyh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0T25BY3Rpb25FeHBhbmRMaXN0ZW5lcihPbkFjdGlvbkV4cGFuZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1PbkFjdGlvbkV4cGFuZExpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbGxhcHNpYmxlQWN0aW9uVmlldygpIHsKKyAgICAgICAgcmV0dXJuIChtU2hvd0FzQWN0aW9uICYgU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVcpICE9IDAgJiYgbUFjdGlvblZpZXcgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25WaWV3RXhwYW5kZWQoYm9vbGVhbiBpc0V4cGFuZGVkKSB7CisgICAgICAgIG1Jc0FjdGlvblZpZXdFeHBhbmRlZCA9IGlzRXhwYW5kZWQ7CisgICAgICAgIG1NZW51Lm9uSXRlbXNDaGFuZ2VkKGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvblZpZXdFeHBhbmRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jc0FjdGlvblZpZXdFeHBhbmRlZDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YQppbmRleCAzOGNlYzI5Li41NzY3NTE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEKQEAgLTI1MCw2ICsyNTAsMTQgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGV4cGFuZEl0ZW1BY3Rpb25WaWV3KE1lbnVCdWlsZGVyIG1lbnUsIE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb2xsYXBzZUl0ZW1BY3Rpb25WaWV3KE1lbnVCdWlsZGVyIG1lbnUsIE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIE1lbnVBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgewogICAgICAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1BZGFwdGVyTWVudTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UHJlc2VudGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQcmVzZW50ZXIuamF2YQppbmRleCA1YmFmNDE5Li5iZDY2NDQ4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQcmVzZW50ZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQcmVzZW50ZXIuamF2YQpAQCAtMTA3LDQgKzEwNywyMiBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHByZXNlbnRlciBjaGFuZ2VkIHRoZSBhY3Rpb24gc3RhdHVzIG9mIGFueSBpdGVtcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBmbGFnQWN0aW9uSXRlbXMoKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgbWVudSBpdGVtIHdpdGggYSBjb2xsYXBzYWJsZSBhY3Rpb24gdmlldyBzaG91bGQgZXhwYW5kIGl0cyBhY3Rpb24gdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51IE1lbnUgY29udGFpbmluZyB0aGUgaXRlbSB0byBiZSBleHBhbmRlZAorICAgICAqIEBwYXJhbSBpdGVtIEl0ZW0gdG8gYmUgZXhwYW5kZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwcmVzZW50ZXIgZXhwYW5kZWQgdGhlIGFjdGlvbiB2aWV3LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhwYW5kSXRlbUFjdGlvblZpZXcoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW1JbXBsIGl0ZW0pOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBtZW51IGl0ZW0gd2l0aCBhIGNvbGxhcHNhYmxlIGFjdGlvbiB2aWV3IHNob3VsZCBjb2xsYXBzZSBpdHMgYWN0aW9uIHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVudSBNZW51IGNvbnRhaW5pbmcgdGhlIGl0ZW0gdG8gYmUgY29sbGFwc2VkCisgICAgICogQHBhcmFtIGl0ZW0gSXRlbSB0byBiZSBjb2xsYXBzZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwcmVzZW50ZXIgY29sbGFwc2VkIHRoZSBhY3Rpb24gdmlldywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbGxhcHNlSXRlbUFjdGlvblZpZXcoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW1JbXBsIGl0ZW0pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9TdWJNZW51QnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9TdWJNZW51QnVpbGRlci5qYXZhCmluZGV4IDgzNDA0MWYuLmZiMWNkNWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvU3ViTWVudUJ1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L1N1Yk1lbnVCdWlsZGVyLmphdmEKQEAgLTExMSw0ICsxMTEsMTQgQEAKICAgICBwdWJsaWMgU3ViTWVudSBzZXRIZWFkZXJWaWV3KFZpZXcgdmlldykgewogICAgICAgICByZXR1cm4gKFN1Yk1lbnUpIHN1cGVyLnNldEhlYWRlclZpZXdJbnQodmlldyk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXhwYW5kSXRlbUFjdGlvblZpZXcoTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG1QYXJlbnRNZW51LmV4cGFuZEl0ZW1BY3Rpb25WaWV3KGl0ZW0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbGxhcHNlSXRlbUFjdGlvblZpZXcoTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG1QYXJlbnRNZW51LmNvbGxhcHNlSXRlbUFjdGlvblZpZXcoaXRlbSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BYnNBY3Rpb25CYXJWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0Fic0FjdGlvbkJhclZpZXcuamF2YQppbmRleCA3ODg4ODNiLi5jY2JjZTNlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0Fic0FjdGlvbkJhclZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0Fic0FjdGlvbkJhclZpZXcuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzQWN0aW9uQmFyVmlldyBleHRlbmRzIFZpZXdHcm91cCB7CiAgICAgcHJvdGVjdGVkIEFjdGlvbk1lbnVWaWV3IG1NZW51VmlldzsKLSAgICBwcm90ZWN0ZWQgQWN0aW9uTWVudVByZXNlbnRlciBtTWVudVByZXNlbnRlcjsKKyAgICBwcm90ZWN0ZWQgQWN0aW9uTWVudVByZXNlbnRlciBtQWN0aW9uTWVudVByZXNlbnRlcjsKICAgICBwcm90ZWN0ZWQgQWN0aW9uQmFyQ29udGFpbmVyIG1TcGxpdFZpZXc7CiAKICAgICBwcm90ZWN0ZWQgQW5pbWF0b3IgbVZpc2liaWxpdHlBbmltOwpAQCAtMTA4LDggKzEwOCw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gc2hvd092ZXJmbG93TWVudSgpIHsKLSAgICAgICAgaWYgKG1NZW51UHJlc2VudGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVudVByZXNlbnRlci5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIGlmIChtQWN0aW9uTWVudVByZXNlbnRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbk1lbnVQcmVzZW50ZXIuc2hvd092ZXJmbG93TWVudSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xMjMsMjYgKzEyMywyNiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7Ci0gICAgICAgIGlmIChtTWVudVByZXNlbnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lbnVQcmVzZW50ZXIuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICBpZiAobUFjdGlvbk1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25NZW51UHJlc2VudGVyLmhpZGVPdmVyZmxvd01lbnUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd01lbnVTaG93aW5nKCkgewotICAgICAgICBpZiAobU1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZW51UHJlc2VudGVyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpOworICAgICAgICBpZiAobUFjdGlvbk1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25NZW51UHJlc2VudGVyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93UmVzZXJ2ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtTWVudVByZXNlbnRlciAhPSBudWxsICYmIG1NZW51UHJlc2VudGVyLmlzT3ZlcmZsb3dSZXNlcnZlZCgpOworICAgICAgICByZXR1cm4gbUFjdGlvbk1lbnVQcmVzZW50ZXIgIT0gbnVsbCAmJiBtQWN0aW9uTWVudVByZXNlbnRlci5pc092ZXJmbG93UmVzZXJ2ZWQoKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkaXNtaXNzUG9wdXBNZW51cygpIHsKLSAgICAgICAgaWYgKG1NZW51UHJlc2VudGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZW51UHJlc2VudGVyLmRpc21pc3NQb3B1cE1lbnVzKCk7CisgICAgICAgIGlmIChtQWN0aW9uTWVudVByZXNlbnRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWN0aW9uTWVudVByZXNlbnRlci5kaXNtaXNzUG9wdXBNZW51cygpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRhaW5lci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250YWluZXIuamF2YQppbmRleCBmMTYxOGUxLi4xNzI2MzkwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRhaW5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGFpbmVyLmphdmEKQEAgLTk2LDEzICs5NiwyNiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CiAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgaW50IG5vblRhYkhlaWdodCA9IDA7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZCA9PSBtVGFiQ29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgbm9uVGFiSGVpZ2h0ID0gTWF0aC5tYXgobm9uVGFiSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpICsgbHAudG9wTWFyZ2luICsgbHAuYm90dG9tTWFyZ2luKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtVGFiQ29udGFpbmVyICE9IG51bGwgJiYgbVRhYkNvbnRhaW5lci5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgewogICAgICAgICAgICAgZmluYWwgaW50IG1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKICAgICAgICAgICAgIGlmIChtb2RlID09IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWVhc3VyZWRIZWlnaHQgPSBnZXRNZWFzdXJlZEhlaWdodCgpOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXhIZWlnaHQgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKICAgICAgICAgICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihnZXRNZWFzdXJlZFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihtZWFzdXJlZEhlaWdodCArIG1UYWJDb250YWluZXIuZ2V0TWVhc3VyZWRIZWlnaHQoKSwgbWF4SGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihub25UYWJIZWlnaHQgKyBtVGFiQ29udGFpbmVyLmdldE1lYXN1cmVkSGVpZ2h0KCksIG1heEhlaWdodCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhCmluZGV4IGM4MjMyM2UuLmU0YzQ5ODkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3LmphdmEKQEAgLTE1LDI2ICsxNSwyNiBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVQcmVzZW50ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKLQogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JTZXQ7CiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5EZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVQcmVzZW50ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKKwogLyoqCiAgKiBAaGlkZQogICovCkBAIC0xMzAsMjYgKzEzMCwyMyBAQAogICAgICAgICAgICAgbVRpdGxlTGF5b3V0ID0gKExpbmVhckxheW91dCkgZ2V0Q2hpbGRBdChnZXRDaGlsZENvdW50KCkgLSAxKTsKICAgICAgICAgICAgIG1UaXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3RpdGxlKTsKICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3N1YnRpdGxlKTsKLSAgICAgICAgICAgIGlmIChtVGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOwotICAgICAgICAgICAgICAgIGlmIChtVGl0bGVTdHlsZVJlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1UaXRsZVN0eWxlUmVzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1UaXRsZVN0eWxlUmVzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3VidGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOwotICAgICAgICAgICAgICAgIGlmIChtU3VidGl0bGVTdHlsZVJlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1TdWJ0aXRsZVN0eWxlUmVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZVN0eWxlUmVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtU3VidGl0bGVTdHlsZVJlcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOwotICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KG1TdWJ0aXRsZSAhPSBudWxsID8gVklTSUJMRSA6IEdPTkUpOwotICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dC5nZXRQYXJlbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkVmlldyhtVGl0bGVMYXlvdXQpOwotICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CisgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzVGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkobVRpdGxlKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNTdWJ0aXRsZSA9ICFUZXh0VXRpbHMuaXNFbXB0eShtU3VidGl0bGUpOworICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoaGFzU3VidGl0bGUgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgIG1UaXRsZUxheW91dC5zZXRWaXNpYmlsaXR5KGhhc1RpdGxlIHx8IGhhc1N1YnRpdGxlID8gVklTSUJMRSA6IEdPTkUpOworICAgICAgICBpZiAobVRpdGxlTGF5b3V0LmdldFBhcmVudCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTcwLDkgKzE2Nyw5IEBACiAgICAgICAgIH0pOwogCiAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnUgPSAoTWVudUJ1aWxkZXIpIG1vZGUuZ2V0TWVudSgpOwotICAgICAgICBtTWVudVByZXNlbnRlciA9IG5ldyBBY3Rpb25NZW51UHJlc2VudGVyKCk7Ci0gICAgICAgIG1lbnUuYWRkTWVudVByZXNlbnRlcihtTWVudVByZXNlbnRlcik7Ci0gICAgICAgIG1NZW51VmlldyA9IChBY3Rpb25NZW51VmlldykgbU1lbnVQcmVzZW50ZXIuZ2V0TWVudVZpZXcodGhpcyk7CisgICAgICAgIG1BY3Rpb25NZW51UHJlc2VudGVyID0gbmV3IEFjdGlvbk1lbnVQcmVzZW50ZXIoKTsKKyAgICAgICAgbWVudS5hZGRNZW51UHJlc2VudGVyKG1BY3Rpb25NZW51UHJlc2VudGVyKTsKKyAgICAgICAgbU1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBtQWN0aW9uTWVudVByZXNlbnRlci5nZXRNZW51Vmlldyh0aGlzKTsKIAogICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgbGF5b3V0UGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAogICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwpAQCAtMTgxLDEwICsxNzgsMTAgQEAKICAgICAgICAgICAgIGFkZFZpZXcobU1lbnVWaWV3KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEFsbG93IGZ1bGwgc2NyZWVuIHdpZHRoIGluIHNwbGl0IG1vZGUuCi0gICAgICAgICAgICBtTWVudVByZXNlbnRlci5zZXRXaWR0aExpbWl0KAorICAgICAgICAgICAgbUFjdGlvbk1lbnVQcmVzZW50ZXIuc2V0V2lkdGhMaW1pdCgKICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkud2lkdGhQaXhlbHMsIHRydWUpOwogICAgICAgICAgICAgLy8gTm8gbGltaXQgdG8gdGhlIGl0ZW0gY291bnQ7IHVzZSB3aGF0ZXZlciB3aWxsIGZpdC4KLSAgICAgICAgICAgIG1NZW51UHJlc2VudGVyLnNldEl0ZW1MaW1pdChJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBtQWN0aW9uTWVudVByZXNlbnRlci5zZXRJdGVtTGltaXQoSW50ZWdlci5NQVhfVkFMVUUpOwogICAgICAgICAgICAgLy8gU3BhbiB0aGUgd2hvbGUgd2lkdGgKICAgICAgICAgICAgIGxheW91dFBhcmFtcy53aWR0aCA9IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CiAgICAgICAgICAgICBtU3BsaXRWaWV3LmFkZFZpZXcobU1lbnVWaWV3KTsKQEAgLTIyOCwyMyArMjI1LDI2IEBACiAgICAgICAgIG1BbmltYXRlSW5PbkxheW91dCA9IGZhbHNlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHNob3dPdmVyZmxvd01lbnUoKSB7Ci0gICAgICAgIGlmIChtTWVudVByZXNlbnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lbnVQcmVzZW50ZXIuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICBpZiAobUFjdGlvbk1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25NZW51UHJlc2VudGVyLnNob3dPdmVyZmxvd01lbnUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaGlkZU92ZXJmbG93TWVudSgpIHsKLSAgICAgICAgaWYgKG1NZW51UHJlc2VudGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVudVByZXNlbnRlci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIGlmIChtQWN0aW9uTWVudVByZXNlbnRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbk1lbnVQcmVzZW50ZXIuaGlkZU92ZXJmbG93TWVudSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93TWVudVNob3dpbmcoKSB7Ci0gICAgICAgIGlmIChtTWVudVByZXNlbnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lbnVQcmVzZW50ZXIuaXNPdmVyZmxvd01lbnVTaG93aW5nKCk7CisgICAgICAgIGlmIChtQWN0aW9uTWVudVByZXNlbnRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbk1lbnVQcmVzZW50ZXIuaXNPdmVyZmxvd01lbnVTaG93aW5nKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJWaWV3LmphdmEKaW5kZXggZmYwNDczNS4uZWI5N2VhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJWaWV3LmphdmEKQEAgLTIxLDcgKzIxLDEwIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVQcmVzZW50ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UHJlc2VudGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyLk9uTmF2aWdhdGlvbkxpc3RlbmVyOwpAQCAtMzMsMjEgKzM2LDIyIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSG9yaXpvbnRhbFNjcm9sbFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Qcm9ncmVzc0JhcjsKQEAgLTg3LDkgKzkxLDggQEAKICAgICBwcml2YXRlIERyYXdhYmxlIG1JY29uOwogICAgIHByaXZhdGUgRHJhd2FibGUgbUxvZ287CiAKLSAgICBwcml2YXRlIFZpZXcgbUhvbWVMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBWaWV3IG1Ib21lQXNVcFZpZXc7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUljb25WaWV3OworICAgIHByaXZhdGUgSG9tZVZpZXcgbUhvbWVMYXlvdXQ7CisgICAgcHJpdmF0ZSBIb21lVmlldyBtRXhwYW5kZWRIb21lTGF5b3V0OwogICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UaXRsZUxheW91dDsKICAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OwpAQCAtMTExLDYgKzExNCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1TcGxpdEFjdGlvbkJhcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJUaXRsZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUluY2x1ZGVUYWJzOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNDb2xsYXBzYWJsZTsKIAogICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU9wdGlvbnNNZW51OwogICAgIApAQCAtMTIzLDYgKzEyNyw5IEBACiAKICAgICBwcml2YXRlIFJ1bm5hYmxlIG1UYWJTZWxlY3RvcjsKIAorICAgIHByaXZhdGUgRXhwYW5kZWRBY3Rpb25WaWV3TWVudVByZXNlbnRlciBtRXhwYW5kZWRNZW51UHJlc2VudGVyOworICAgIFZpZXcgbUV4cGFuZGVkQWN0aW9uVmlldzsKKwogICAgIHByaXZhdGUgZmluYWwgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtTmF2SXRlbVNlbGVjdGVkTGlzdGVuZXIgPQogICAgICAgICAgICAgbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKQEAgLTEzNSw3ICsxNDIsMTUgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtVGFiQ2xpY2tMaXN0ZW5lciA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBPbkNsaWNrTGlzdGVuZXIgbUV4cGFuZGVkQWN0aW9uVmlld1VwTGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbUV4cGFuZGVkTWVudVByZXNlbnRlci5tQ3VycmVudEV4cGFuZGVkSXRlbTsKKyAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpdGVtLmNvbGxhcHNlQWN0aW9uVmlldygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKIAogICAgIHB1YmxpYyBBY3Rpb25CYXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKQEAgLTE4NiwxMCArMjAxLDExIEBACiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWN0aW9uQmFyX2hvbWVMYXlvdXQsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuYWN0aW9uX2Jhcl9ob21lKTsKIAotICAgICAgICBtSG9tZUxheW91dCA9IGluZmxhdGVyLmluZmxhdGUoaG9tZVJlc0lkLCB0aGlzLCBmYWxzZSk7CisgICAgICAgIG1Ib21lTGF5b3V0ID0gKEhvbWVWaWV3KSBpbmZsYXRlci5pbmZsYXRlKGhvbWVSZXNJZCwgdGhpcywgZmFsc2UpOwogCi0gICAgICAgIG1Ib21lQXNVcFZpZXcgPSBtSG9tZUxheW91dC5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC51cCk7Ci0gICAgICAgIG1JY29uVmlldyA9IChJbWFnZVZpZXcpIG1Ib21lTGF5b3V0LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmhvbWUpOworICAgICAgICBtRXhwYW5kZWRIb21lTGF5b3V0ID0gKEhvbWVWaWV3KSBpbmZsYXRlci5pbmZsYXRlKGhvbWVSZXNJZCwgdGhpcywgZmFsc2UpOworICAgICAgICBtRXhwYW5kZWRIb21lTGF5b3V0LnNldFVwKHRydWUpOworICAgICAgICBtRXhwYW5kZWRIb21lTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihtRXhwYW5kZWRBY3Rpb25WaWV3VXBMaXN0ZW5lcik7CiAgICAgICAgIAogICAgICAgICBtVGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGVUZXh0U3R5bGUsIDApOwogICAgICAgICBtU3VidGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfc3VidGl0bGVUZXh0U3R5bGUsIDApOwpAQCAtMjg0LDYgKzMwMCw5IEBACiAgICAgcHVibGljIHZvaWQgc2V0RW1iZWRkZWRUYWJWaWV3KFNjcm9sbGluZ1RhYkNvbnRhaW5lclZpZXcgdGFicykgewogICAgICAgICBtVGFiU2Nyb2xsVmlldyA9IHRhYnM7CiAgICAgICAgIG1JbmNsdWRlVGFicyA9IHRhYnMgIT0gbnVsbDsKKyAgICAgICAgaWYgKG1JbmNsdWRlVGFicyAmJiBtTmF2aWdhdGlvbk1vZGUgPT0gQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTKSB7CisgICAgICAgICAgICBhZGRWaWV3KG1UYWJTY3JvbGxWaWV3KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKE9uTmF2aWdhdGlvbkxpc3RlbmVyIGNhbGxiYWNrKSB7CkBAIC0yOTQsNyArMzEzLDggQEAKICAgICAgICAgaWYgKG1lbnUgPT0gbU9wdGlvbnNNZW51KSByZXR1cm47CiAKICAgICAgICAgaWYgKG1PcHRpb25zTWVudSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtT3B0aW9uc01lbnUucmVtb3ZlTWVudVByZXNlbnRlcihtTWVudVByZXNlbnRlcik7CisgICAgICAgICAgICBtT3B0aW9uc01lbnUucmVtb3ZlTWVudVByZXNlbnRlcihtQWN0aW9uTWVudVByZXNlbnRlcik7CisgICAgICAgICAgICBtT3B0aW9uc01lbnUucmVtb3ZlTWVudVByZXNlbnRlcihtRXhwYW5kZWRNZW51UHJlc2VudGVyKTsKICAgICAgICAgfQogCiAgICAgICAgIE1lbnVCdWlsZGVyIGJ1aWxkZXIgPSAoTWVudUJ1aWxkZXIpIG1lbnU7CkBAIC0zMDIsMTIgKzMyMiwxNSBAQAogICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlbW92ZVZpZXcobU1lbnVWaWV3KTsKICAgICAgICAgfQotICAgICAgICBpZiAobU1lbnVQcmVzZW50ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbU1lbnVQcmVzZW50ZXIgPSBuZXcgQWN0aW9uTWVudVByZXNlbnRlcigpOwotICAgICAgICAgICAgbU1lbnVQcmVzZW50ZXIuc2V0Q2FsbGJhY2soY2IpOwotICAgICAgICAgICAgYnVpbGRlci5hZGRNZW51UHJlc2VudGVyKG1NZW51UHJlc2VudGVyKTsKKyAgICAgICAgaWYgKG1BY3Rpb25NZW51UHJlc2VudGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25NZW51UHJlc2VudGVyID0gbmV3IEFjdGlvbk1lbnVQcmVzZW50ZXIoKTsKKyAgICAgICAgICAgIG1BY3Rpb25NZW51UHJlc2VudGVyLnNldENhbGxiYWNrKGNiKTsKKyAgICAgICAgICAgIG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIgPSBuZXcgRXhwYW5kZWRBY3Rpb25WaWV3TWVudVByZXNlbnRlcigpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEFjdGlvbk1lbnVWaWV3IG1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBtTWVudVByZXNlbnRlci5nZXRNZW51Vmlldyh0aGlzKTsKKyAgICAgICAgYnVpbGRlci5hZGRNZW51UHJlc2VudGVyKG1BY3Rpb25NZW51UHJlc2VudGVyKTsKKyAgICAgICAgYnVpbGRlci5hZGRNZW51UHJlc2VudGVyKG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIpOworCisgICAgICAgIGZpbmFsIEFjdGlvbk1lbnVWaWV3IG1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBtQWN0aW9uTWVudVByZXNlbnRlci5nZXRNZW51Vmlldyh0aGlzKTsKICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGxheW91dFBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKICAgICAgICAgbWVudVZpZXcuc2V0TGF5b3V0UGFyYW1zKGxheW91dFBhcmFtcyk7CkBAIC0zMTUsMTAgKzMzOCwxMCBAQAogICAgICAgICAgICAgYWRkVmlldyhtZW51Vmlldyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBBbGxvdyBmdWxsIHNjcmVlbiB3aWR0aCBpbiBzcGxpdCBtb2RlLgotICAgICAgICAgICAgbU1lbnVQcmVzZW50ZXIuc2V0V2lkdGhMaW1pdCgKKyAgICAgICAgICAgIG1BY3Rpb25NZW51UHJlc2VudGVyLnNldFdpZHRoTGltaXQoCiAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLndpZHRoUGl4ZWxzLCB0cnVlKTsKICAgICAgICAgICAgIC8vIE5vIGxpbWl0IHRvIHRoZSBpdGVtIGNvdW50OyB1c2Ugd2hhdGV2ZXIgd2lsbCBmaXQuCi0gICAgICAgICAgICBtTWVudVByZXNlbnRlci5zZXRJdGVtTGltaXQoSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICAgICAgbUFjdGlvbk1lbnVQcmVzZW50ZXIuc2V0SXRlbUxpbWl0KEludGVnZXIuTUFYX1ZBTFVFKTsKICAgICAgICAgICAgIC8vIFNwYW4gdGhlIHdob2xlIHdpZHRoCiAgICAgICAgICAgICBsYXlvdXRQYXJhbXMud2lkdGggPSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwogICAgICAgICAgICAgaWYgKG1TcGxpdFZpZXcgIT0gbnVsbCkgewpAQCAtNDA2LDEzICs0MjksMTIgQEAKICAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldFZpc2liaWxpdHkodmlzKTsKIAogICAgICAgICAgICAgaWYgKChmbGFnc0NoYW5nZWQgJiBBY3Rpb25CYXIuRElTUExBWV9IT01FX0FTX1VQKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1VwID0gKG9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9IT01FX0FTX1VQKSAhPSAwOwotICAgICAgICAgICAgICAgIG1Ib21lQXNVcFZpZXcuc2V0VmlzaWJpbGl0eShpc1VwID8gVklTSUJMRSA6IEdPTkUpOworICAgICAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldFVwKChvcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfSE9NRV9BU19VUCkgIT0gMCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICgoZmxhZ3NDaGFuZ2VkICYgQWN0aW9uQmFyLkRJU1BMQVlfVVNFX0xPR08pICE9IDApIHsKICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGxvZ29WaXMgPSBtTG9nbyAhPSBudWxsICYmIChvcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfVVNFX0xPR08pICE9IDA7Ci0gICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEltYWdlRHJhd2FibGUobG9nb1ZpcyA/IG1Mb2dvIDogbUljb24pOworICAgICAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldEljb24obG9nb1ZpcyA/IG1Mb2dvIDogbUljb24pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKGZsYWdzQ2hhbmdlZCAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEUpICE9IDApIHsKQEAgLTQ1Miw3ICs0NzQsNyBAQAogICAgICAgICBtSWNvbiA9IGljb247CiAgICAgICAgIGlmIChpY29uICE9IG51bGwgJiYKICAgICAgICAgICAgICAgICAoKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPKSA9PSAwIHx8IG1Mb2dvID09IG51bGwpKSB7Ci0gICAgICAgICAgICBtSWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShpY29uKTsKKyAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldEljb24oaWNvbik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ2Myw3ICs0ODUsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldExvZ28oRHJhd2FibGUgbG9nbykgewogICAgICAgICBtTG9nbyA9IGxvZ287CiAgICAgICAgIGlmIChsb2dvICE9IG51bGwgJiYgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPKSAhPSAwKSB7Ci0gICAgICAgICAgICBtSWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShsb2dvKTsKKyAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldEljb24obG9nbyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ3Nyw3ICs0OTksNyBAQAogICAgIHByaXZhdGUgaW50IGdldFByZWZlcnJlZEljb25EZW5zaXR5KCkgewogICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIGZpbmFsIGludCBhdmFpbGFibGVIZWlnaHQgPSBnZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQgLQotICAgICAgICAgICAgICAgIG1JY29uVmlldy5nZXRQYWRkaW5nVG9wKCkgLSBtSWNvblZpZXcuZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICAgICAgICAgIG1Ib21lTGF5b3V0LmdldFZlcnRpY2FsSWNvblBhZGRpbmcoKTsKICAgICAgICAgaW50IGljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShhbmRyb2lkLlIuZGltZW4uYXBwX2ljb25fc2l6ZSk7CiAKICAgICAgICAgaWYgKGljb25TaXplICogRGlzcGxheU1ldHJpY3MuREVOU0lUWV9MT1cgPj0gYXZhaWxhYmxlSGVpZ2h0KSB7CkBAIC00OTUsNyArNTE3LDcgQEAKICAgICAgICAgaWYgKG1vZGUgIT0gb2xkTW9kZSkgewogICAgICAgICAgICAgc3dpdGNoIChvbGRNb2RlKSB7CiAgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfTElTVDoKLSAgICAgICAgICAgICAgICBpZiAobVNwaW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtTGlzdE5hdkxheW91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobUxpc3ROYXZMYXlvdXQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTYyOSw4ICs2NTEsMzAgQEAKICAgICAgICAgbUNvbnRleHRWaWV3ID0gdmlldzsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xsYXBzYWJsZShib29sZWFuIGNvbGxhcHNhYmxlKSB7CisgICAgICAgIG1Jc0NvbGxhcHNhYmxlID0gY29sbGFwc2FibGU7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGlmIChtSXNDb2xsYXBzYWJsZSkgeworICAgICAgICAgICAgaW50IHZpc2libGVDaGlsZHJlbiA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIShjaGlsZCA9PSBtTWVudVZpZXcgJiYgbU1lbnVWaWV3LmdldENoaWxkQ291bnQoKSA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICB2aXNpYmxlQ2hpbGRyZW4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2aXNpYmxlQ2hpbGRyZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIE5vIHNpemUgZm9yIGFuIGVtcHR5IGFjdGlvbiBiYXIgd2hlbiBjb2xsYXBzYWJsZS4KKyAgICAgICAgICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbigwLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKICAgICAgICAgaWYgKHdpZHRoTW9kZSAhPSBNZWFzdXJlU3BlYy5FWEFDVExZKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKwpAQCAtNjU4LDEwICs3MDIsMTMgQEAKICAgICAgICAgaW50IGxlZnRPZkNlbnRlciA9IGF2YWlsYWJsZVdpZHRoIC8gMjsKICAgICAgICAgaW50IHJpZ2h0T2ZDZW50ZXIgPSBsZWZ0T2ZDZW50ZXI7CiAKLSAgICAgICAgaWYgKG1Ib21lTGF5b3V0LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7Ci0gICAgICAgICAgICBtSG9tZUxheW91dC5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCisgICAgICAgIFZpZXcgaG9tZUxheW91dCA9IG1FeHBhbmRlZEFjdGlvblZpZXcgIT0gbnVsbCA/IG1FeHBhbmRlZEhvbWVMYXlvdXQgOiBtSG9tZUxheW91dDsKKworICAgICAgICBpZiAoaG9tZUxheW91dC5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgaG9tZUxheW91dC5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkFUX01PU1QpLAogICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaG9tZVdpZHRoID0gbUhvbWVMYXlvdXQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IGhvbWVXaWR0aCA9IGhvbWVMYXlvdXQuZ2V0TWVhc3VyZWRXaWR0aCgpOwogICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIGhvbWVXaWR0aCk7CiAgICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIGhvbWVXaWR0aCk7CiAgICAgICAgIH0KQEAgLTY3Miw0MCArNzE5LDQyIEBACiAgICAgICAgICAgICByaWdodE9mQ2VudGVyID0gTWF0aC5tYXgoMCwgcmlnaHRPZkNlbnRlciAtIG1NZW51Vmlldy5nZXRNZWFzdXJlZFdpZHRoKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgYm9vbGVhbiBzaG93VGl0bGUgPSBtVGl0bGVMYXlvdXQgIT0gbnVsbCAmJiBtVGl0bGVMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUgJiYKLSAgICAgICAgICAgICAgICAobURpc3BsYXlPcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19USVRMRSkgIT0gMDsKLSAgICAgICAgaWYgKHNob3dUaXRsZSkgewotICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1UaXRsZUxheW91dCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgMCk7Ci0gICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBsZWZ0T2ZDZW50ZXIgLSBtVGl0bGVMYXlvdXQuZ2V0TWVhc3VyZWRXaWR0aCgpKTsKLSAgICAgICAgfQorICAgICAgICBpZiAobUV4cGFuZGVkQWN0aW9uVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIHNob3dUaXRsZSA9IG1UaXRsZUxheW91dCAhPSBudWxsICYmIG1UaXRsZUxheW91dC5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSAmJgorICAgICAgICAgICAgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEUpICE9IDA7CisgICAgICAgICAgICBpZiAoc2hvd1RpdGxlKSB7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1UaXRsZUxheW91dCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgMCk7CisgICAgICAgICAgICAgICAgbGVmdE9mQ2VudGVyID0gTWF0aC5tYXgoMCwgbGVmdE9mQ2VudGVyIC0gbVRpdGxlTGF5b3V0LmdldE1lYXN1cmVkV2lkdGgoKSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKLSAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0xJU1Q6Ci0gICAgICAgICAgICBpZiAobUxpc3ROYXZMYXlvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBpdGVtUGFkZGluZ1NpemUgPSBzaG93VGl0bGUgPyBtSXRlbVBhZGRpbmcgKiAyIDogbUl0ZW1QYWRkaW5nOwotICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gTWF0aC5tYXgoMCwgYXZhaWxhYmxlV2lkdGggLSBpdGVtUGFkZGluZ1NpemUpOwotICAgICAgICAgICAgICAgIGxlZnRPZkNlbnRlciA9IE1hdGgubWF4KDAsIGxlZnRPZkNlbnRlciAtIGl0ZW1QYWRkaW5nU2l6ZSk7Ci0gICAgICAgICAgICAgICAgbUxpc3ROYXZMYXlvdXQubWVhc3VyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGxpc3ROYXZXaWR0aCA9IG1MaXN0TmF2TGF5b3V0LmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IE1hdGgubWF4KDAsIGF2YWlsYWJsZVdpZHRoIC0gbGlzdE5hdldpZHRoKTsKLSAgICAgICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBsZWZ0T2ZDZW50ZXIgLSBsaXN0TmF2V2lkdGgpOworICAgICAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfTElTVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0TmF2TGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpdGVtUGFkZGluZ1NpemUgPSBzaG93VGl0bGUgPyBtSXRlbVBhZGRpbmcgKiAyIDogbUl0ZW1QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIGl0ZW1QYWRkaW5nU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBsZWZ0T2ZDZW50ZXIgLSBpdGVtUGFkZGluZ1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3ROYXZMYXlvdXQubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxpc3ROYXZXaWR0aCA9IG1MaXN0TmF2TGF5b3V0LmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gTWF0aC5tYXgoMCwgYXZhaWxhYmxlV2lkdGggLSBsaXN0TmF2V2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdE9mQ2VudGVyID0gTWF0aC5tYXgoMCwgbGVmdE9mQ2VudGVyIC0gbGlzdE5hdldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UYWJTY3JvbGxWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpdGVtUGFkZGluZ1NpemUgPSBzaG93VGl0bGUgPyBtSXRlbVBhZGRpbmcgKiAyIDogbUl0ZW1QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIGl0ZW1QYWRkaW5nU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBsZWZ0T2ZDZW50ZXIgLSBpdGVtUGFkZGluZ1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRhYlNjcm9sbFZpZXcubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhYldpZHRoID0gbVRhYlNjcm9sbFZpZXcuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIHRhYldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRPZkNlbnRlciA9IE1hdGgubWF4KDAsIGxlZnRPZkNlbnRlciAtIHRhYldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKLSAgICAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGl0ZW1QYWRkaW5nU2l6ZSA9IHNob3dUaXRsZSA/IG1JdGVtUGFkZGluZyAqIDIgOiBtSXRlbVBhZGRpbmc7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIGl0ZW1QYWRkaW5nU2l6ZSk7Ci0gICAgICAgICAgICAgICAgbGVmdE9mQ2VudGVyID0gTWF0aC5tYXgoMCwgbGVmdE9mQ2VudGVyIC0gaXRlbVBhZGRpbmdTaXplKTsKLSAgICAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldy5tZWFzdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFiV2lkdGggPSBtVGFiU2Nyb2xsVmlldy5nZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIHRhYldpZHRoKTsKLSAgICAgICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBsZWZ0T2ZDZW50ZXIgLSB0YWJXaWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtSW5kZXRlcm1pbmF0ZVByb2dyZXNzVmlldyAhPSBudWxsICYmCkBAIC03MTYsOCArNzY1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHJpZ2h0T2ZDZW50ZXIgLSBtSW5kZXRlcm1pbmF0ZVByb2dyZXNzVmlldy5nZXRNZWFzdXJlZFdpZHRoKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0NVU1RPTSkgIT0gMCAmJiBtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgbHAgPSBnZW5lcmF0ZUxheW91dFBhcmFtcyhtQ3VzdG9tTmF2Vmlldy5nZXRMYXlvdXRQYXJhbXMoKSk7CisgICAgICAgIFZpZXcgY3VzdG9tVmlldyA9IG51bGw7CisgICAgICAgIGlmIChtRXhwYW5kZWRBY3Rpb25WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN1c3RvbVZpZXcgPSBtRXhwYW5kZWRBY3Rpb25WaWV3OworICAgICAgICB9IGVsc2UgaWYgKChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0NVU1RPTSkgIT0gMCAmJgorICAgICAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN1c3RvbVZpZXcgPSBtQ3VzdG9tTmF2VmlldzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXN0b21WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBscCA9IGdlbmVyYXRlTGF5b3V0UGFyYW1zKGN1c3RvbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkpOwogICAgICAgICAgICAgZmluYWwgQWN0aW9uQmFyLkxheW91dFBhcmFtcyBhYmxwID0gbHAgaW5zdGFuY2VvZiBBY3Rpb25CYXIuTGF5b3V0UGFyYW1zID8KICAgICAgICAgICAgICAgICAgICAgKEFjdGlvbkJhci5MYXlvdXRQYXJhbXMpIGxwIDogbnVsbDsKIApAQCAtNzU0LDE1ICs4MTEsMTQgQEAKICAgICAgICAgICAgICAgICBjdXN0b21OYXZXaWR0aCA9IE1hdGgubWluKGxlZnRPZkNlbnRlciwgcmlnaHRPZkNlbnRlcikgKiAyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtQ3VzdG9tTmF2Vmlldy5tZWFzdXJlKAorICAgICAgICAgICAgY3VzdG9tVmlldy5tZWFzdXJlKAogICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2V2lkdGgsIGN1c3RvbU5hdldpZHRoTW9kZSksCiAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjdXN0b21OYXZIZWlnaHQsIGN1c3RvbU5hdkhlaWdodE1vZGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQ29udGVudEhlaWdodCA8PSAwKSB7CiAgICAgICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQgPSAwOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgIFZpZXcgdiA9IGdldENoaWxkQXQoaSk7CiAgICAgICAgICAgICAgICAgaW50IHBhZGRlZFZpZXdIZWlnaHQgPSB2LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyB2ZXJ0aWNhbFBhZGRpbmc7CiAgICAgICAgICAgICAgICAgaWYgKHBhZGRlZFZpZXdIZWlnaHQgPiBtZWFzdXJlZEhlaWdodCkgewpAQCAtNzkxLDMxICs4NDcsMzkgQEAKICAgICAgICAgZmluYWwgaW50IHkgPSBnZXRQYWRkaW5nVG9wKCk7CiAgICAgICAgIGZpbmFsIGludCBjb250ZW50SGVpZ2h0ID0gYiAtIHQgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CiAKLSAgICAgICAgaWYgKG1Ib21lTGF5b3V0LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7Ci0gICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUhvbWVMYXlvdXQsIHgsIHksIGNvbnRlbnRIZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBib29sZWFuIHNob3dUaXRsZSA9IG1UaXRsZUxheW91dCAhPSBudWxsICYmIG1UaXRsZUxheW91dC5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSAmJgotICAgICAgICAgICAgICAgIChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX1RJVExFKSAhPSAwOwotICAgICAgICBpZiAoc2hvd1RpdGxlKSB7Ci0gICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRpdGxlTGF5b3V0LCB4LCB5LCBjb250ZW50SGVpZ2h0KTsKKyAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyBpZiB3ZSBjYW4ndCBzZWUgYW55dGhpbmcuCisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgewotICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0xJU1Q6Ci0gICAgICAgICAgICBpZiAobUxpc3ROYXZMYXlvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzaG93VGl0bGUpIHggKz0gbUl0ZW1QYWRkaW5nOwotICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtTGlzdE5hdkxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtSXRlbVBhZGRpbmc7CisgICAgICAgIFZpZXcgaG9tZUxheW91dCA9IG1FeHBhbmRlZEFjdGlvblZpZXcgIT0gbnVsbCA/IG1FeHBhbmRlZEhvbWVMYXlvdXQgOiBtSG9tZUxheW91dDsKKyAgICAgICAgaWYgKGhvbWVMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChob21lTGF5b3V0LCB4LCB5LCBjb250ZW50SGVpZ2h0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXhwYW5kZWRBY3Rpb25WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvd1RpdGxlID0gbVRpdGxlTGF5b3V0ICE9IG51bGwgJiYgbVRpdGxlTGF5b3V0LmdldFZpc2liaWxpdHkoKSAhPSBHT05FICYmCisgICAgICAgICAgICAobURpc3BsYXlPcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19USVRMRSkgIT0gMDsKKyAgICAgICAgICAgIGlmIChzaG93VGl0bGUpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRpdGxlTGF5b3V0LCB4LCB5LCBjb250ZW50SGVpZ2h0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKLSAgICAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3dUaXRsZSkgeCArPSBtSXRlbVBhZGRpbmc7Ci0gICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UYWJTY3JvbGxWaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1JdGVtUGFkZGluZzsKKworICAgICAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9MSVNUOgorICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3ROYXZMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dUaXRsZSkgeCArPSBtSXRlbVBhZGRpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUxpc3ROYXZMYXlvdXQsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbUl0ZW1QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgICAgICAgICBpZiAobVRhYlNjcm9sbFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dUaXRsZSkgeCArPSBtSXRlbVBhZGRpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRhYlNjcm9sbFZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbUl0ZW1QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgbWVudUxlZnQgPSByIC0gbCAtIGdldFBhZGRpbmdSaWdodCgpOwpAQCAtODMwLDEzICs4OTQsMjAgQEAKICAgICAgICAgICAgIG1lbnVMZWZ0IC09IG1JbmRldGVybWluYXRlUHJvZ3Jlc3NWaWV3LmdldE1lYXN1cmVkV2lkdGgoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsICYmIChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0NVU1RPTSkgIT0gMCkgewotICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbUN1c3RvbU5hdlZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgIFZpZXcgY3VzdG9tVmlldyA9IG51bGw7CisgICAgICAgIGlmIChtRXhwYW5kZWRBY3Rpb25WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN1c3RvbVZpZXcgPSBtRXhwYW5kZWRBY3Rpb25WaWV3OworICAgICAgICB9IGVsc2UgaWYgKChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0NVU1RPTSkgIT0gMCAmJgorICAgICAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN1c3RvbVZpZXcgPSBtQ3VzdG9tTmF2VmlldzsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VzdG9tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBjdXN0b21WaWV3LmdldExheW91dFBhcmFtcygpOwogICAgICAgICAgICAgZmluYWwgQWN0aW9uQmFyLkxheW91dFBhcmFtcyBhYmxwID0gbHAgaW5zdGFuY2VvZiBBY3Rpb25CYXIuTGF5b3V0UGFyYW1zID8KICAgICAgICAgICAgICAgICAgICAgKEFjdGlvbkJhci5MYXlvdXRQYXJhbXMpIGxwIDogbnVsbDsKIAogICAgICAgICAgICAgZmluYWwgaW50IGdyYXZpdHkgPSBhYmxwICE9IG51bGwgPyBhYmxwLmdyYXZpdHkgOiBERUZBVUxUX0NVU1RPTV9HUkFWSVRZOwotICAgICAgICAgICAgZmluYWwgaW50IG5hdldpZHRoID0gbUN1c3RvbU5hdlZpZXcuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IG5hdldpZHRoID0gY3VzdG9tVmlldy5nZXRNZWFzdXJlZFdpZHRoKCk7CiAKICAgICAgICAgICAgIGludCB0b3BNYXJnaW4gPSAwOwogICAgICAgICAgICAgaW50IGJvdHRvbU1hcmdpbiA9IDA7CkBAIC04NzYsMTcgKzk0NywxNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5DRU5URVJfVkVSVElDQUw6CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwYWRkZWRUb3AgPSBtVG9wICsgZ2V0UGFkZGluZ1RvcCgpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGFkZGVkQm90dG9tID0gbUJvdHRvbSAtIGdldFBhZGRpbmdCb3R0b20oKTsKLSAgICAgICAgICAgICAgICAgICAgeXBvcyA9ICgocGFkZGVkQm90dG9tIC0gcGFkZGVkVG9wKSAtIG1DdXN0b21OYXZWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkpIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgeXBvcyA9ICgocGFkZGVkQm90dG9tIC0gcGFkZGVkVG9wKSAtIGN1c3RvbVZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgLyAyOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuVE9QOgogICAgICAgICAgICAgICAgICAgICB5cG9zID0gZ2V0UGFkZGluZ1RvcCgpICsgdG9wTWFyZ2luOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuQk9UVE9NOgotICAgICAgICAgICAgICAgICAgICB5cG9zID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nQm90dG9tKCkgLSBtQ3VzdG9tTmF2Vmlldy5nZXRNZWFzdXJlZEhlaWdodCgpCisgICAgICAgICAgICAgICAgICAgIHlwb3MgPSBnZXRIZWlnaHQoKSAtIGdldFBhZGRpbmdCb3R0b20oKSAtIGN1c3RvbVZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYm90dG9tTWFyZ2luOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtQ3VzdG9tTmF2VmlldywgeHBvcywgeXBvcywgY29udGVudEhlaWdodCk7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQoY3VzdG9tVmlldywgeHBvcywgeXBvcywgY29udGVudEhlaWdodCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobVByb2dyZXNzVmlldyAhPSBudWxsKSB7CkBAIC04OTcsOSArOTY4LDgzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcyBscCkgeworICAgICAgICBpZiAobHAgPT0gbnVsbCkgeworICAgICAgICAgICAgbHAgPSBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpIHsKKyAgICAgICAgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgICAgICBTYXZlZFN0YXRlIHN0YXRlID0gbmV3IFNhdmVkU3RhdGUoc3VwZXJTdGF0ZSk7CisKKyAgICAgICAgaWYgKG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIgIT0gbnVsbCAmJiBtRXhwYW5kZWRNZW51UHJlc2VudGVyLm1DdXJyZW50RXhwYW5kZWRJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0YXRlLmV4cGFuZGVkTWVudUl0ZW1JZCA9IG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIubUN1cnJlbnRFeHBhbmRlZEl0ZW0uZ2V0SXRlbUlkKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZS5pc092ZXJmbG93T3BlbiA9IGlzT3ZlcmZsb3dNZW51U2hvd2luZygpOworCisgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKFBhcmNlbGFibGUgcCkgeworICAgICAgICBTYXZlZFN0YXRlIHN0YXRlID0gKFNhdmVkU3RhdGUpIHA7CisKKyAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzdGF0ZS5nZXRTdXBlclN0YXRlKCkpOworCisgICAgICAgIGlmIChzdGF0ZS5leHBhbmRlZE1lbnVJdGVtSWQgIT0gMCAmJgorICAgICAgICAgICAgICAgIG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIgIT0gbnVsbCAmJiBtT3B0aW9uc01lbnUgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgTWVudUl0ZW0gaXRlbSA9IG1PcHRpb25zTWVudS5maW5kSXRlbShzdGF0ZS5leHBhbmRlZE1lbnVJdGVtSWQpOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGl0ZW0uZXhwYW5kQWN0aW9uVmlldygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRlLmlzT3ZlcmZsb3dPcGVuKSB7CisgICAgICAgICAgICBwb3N0U2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIGludCBleHBhbmRlZE1lbnVJdGVtSWQ7CisgICAgICAgIGJvb2xlYW4gaXNPdmVyZmxvd09wZW47CisKKyAgICAgICAgU2F2ZWRTdGF0ZShQYXJjZWxhYmxlIHN1cGVyU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKHN1cGVyU3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTYXZlZFN0YXRlKFBhcmNlbCBpbikgeworICAgICAgICAgICAgc3VwZXIoaW4pOworICAgICAgICAgICAgZXhwYW5kZWRNZW51SXRlbUlkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaXNPdmVyZmxvd09wZW4gPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBvdXQsIGludCBmbGFncykgeworICAgICAgICAgICAgc3VwZXIud3JpdGVUb1BhcmNlbChvdXQsIGZsYWdzKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChleHBhbmRlZE1lbnVJdGVtSWQpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KGlzT3ZlcmZsb3dPcGVuID8gMSA6IDApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIb21lVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKICAgICAgICAgcHJpdmF0ZSBWaWV3IG1VcFZpZXc7Ci0gICAgICAgIHByaXZhdGUgVmlldyBtSWNvblZpZXc7CisgICAgICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1JY29uVmlldzsKIAogICAgICAgICBwdWJsaWMgSG9tZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwpAQCAtOTA5LDEyICsxMDU0LDI0IEBACiAgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcChib29sZWFuIGlzVXApIHsKKyAgICAgICAgICAgIG1VcFZpZXcuc2V0VmlzaWJpbGl0eShpc1VwID8gVklTSUJMRSA6IEdPTkUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgICAgICBtSWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShpY29uKTsKKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkZpbmlzaEluZmxhdGUoKSB7CiAgICAgICAgICAgICBtVXBWaWV3ID0gZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudXApOwogICAgICAgICAgICAgbUljb25WaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaG9tZSk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgaW50IGdldFZlcnRpY2FsSWNvblBhZGRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb25WaWV3LmdldFBhZGRpbmdUb3AoKSArIG1JY29uVmlldy5nZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIH0KKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKICAgICAgICAgICAgIG1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zKG1VcFZpZXcsIHdpZHRoTWVhc3VyZVNwZWMsIDAsIGhlaWdodE1lYXN1cmVTcGVjLCAwKTsKQEAgLTk1Miw0ICsxMTA5LDExMSBAQAogICAgICAgICAgICAgbUljb25WaWV3LmxheW91dChpY29uTGVmdCwgaWNvblRvcCwgaWNvbkxlZnQgKyBpY29uV2lkdGgsIGljb25Ub3AgKyBpY29uSGVpZ2h0KTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRXhwYW5kZWRBY3Rpb25WaWV3TWVudVByZXNlbnRlciBpbXBsZW1lbnRzIE1lbnVQcmVzZW50ZXIgeworICAgICAgICBNZW51QnVpbGRlciBtTWVudTsKKyAgICAgICAgTWVudUl0ZW1JbXBsIG1DdXJyZW50RXhwYW5kZWRJdGVtOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0Rm9yTWVudShDb250ZXh0IGNvbnRleHQsIE1lbnVCdWlsZGVyIG1lbnUpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIHRoZSBleHBhbmRlZCBhY3Rpb24gdmlldyB3aGVuIG1lbnVzIGNoYW5nZS4KKyAgICAgICAgICAgIG1FeHBhbmRlZEFjdGlvblZpZXcgPSBudWxsOworICAgICAgICAgICAgaWYgKG1DdXJyZW50RXhwYW5kZWRJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEV4cGFuZGVkSXRlbS5jb2xsYXBzZUFjdGlvblZpZXcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZW51ID0gbWVudTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudVZpZXcgZ2V0TWVudVZpZXcoVmlld0dyb3VwIHJvb3QpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU1lbnVWaWV3KGJvb2xlYW4gY2xlYXJlZCkgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBleHBhbmRlZCBpdGVtIHdlIGhhdmUgaXMgc3RpbGwgdGhlcmUuCisgICAgICAgICAgICBpZiAobUN1cnJlbnRFeHBhbmRlZEl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtTWVudS5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtIGl0ZW0gPSBtTWVudS5nZXRJdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBtQ3VycmVudEV4cGFuZGVkSXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpdGVtIHdlIGhhZCBleHBhbmRlZCBkaXNhcHBlYXJlZC4gQ29sbGFwc2UuCisgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlSXRlbUFjdGlvblZpZXcobU1lbnUsIG1DdXJyZW50RXhwYW5kZWRJdGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblN1Yk1lbnVTZWxlY3RlZChTdWJNZW51QnVpbGRlciBzdWJNZW51KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZU1lbnUoTWVudUJ1aWxkZXIgbWVudSwgYm9vbGVhbiBhbGxNZW51c0FyZUNsb3NpbmcpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBmbGFnQWN0aW9uSXRlbXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXhwYW5kSXRlbUFjdGlvblZpZXcoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgICAgIG1FeHBhbmRlZEFjdGlvblZpZXcgPSBpdGVtLmdldEFjdGlvblZpZXcoKTsKKyAgICAgICAgICAgIG1FeHBhbmRlZEhvbWVMYXlvdXQuc2V0SWNvbihpdGVtLmdldEljb24oKSk7CisgICAgICAgICAgICBtQ3VycmVudEV4cGFuZGVkSXRlbSA9IGl0ZW07CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkQWN0aW9uVmlldy5nZXRQYXJlbnQoKSAhPSBBY3Rpb25CYXJWaWV3LnRoaXMpIHsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1FeHBhbmRlZEFjdGlvblZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1FeHBhbmRlZEhvbWVMYXlvdXQuZ2V0UGFyZW50KCkgIT0gQWN0aW9uQmFyVmlldy50aGlzKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtRXhwYW5kZWRIb21lTGF5b3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgICAgICBtVGl0bGVMYXlvdXQuc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSBtVGFiU2Nyb2xsVmlldy5zZXRWaXNpYmlsaXR5KEdPTkUpOworICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIG1TcGlubmVyLnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgbUN1c3RvbU5hdlZpZXcuc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0QWN0aW9uVmlld0V4cGFuZGVkKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29sbGFwc2VJdGVtQWN0aW9uVmlldyhNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtRXhwYW5kZWRBY3Rpb25WaWV3KTsKKyAgICAgICAgICAgIHJlbW92ZVZpZXcobUV4cGFuZGVkSG9tZUxheW91dCk7CisgICAgICAgICAgICBpZiAoKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfSE9NRSkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVGl0bGVMYXlvdXQuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsICYmIG1OYXZpZ2F0aW9uTW9kZSA9PSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlMpIHsKKyAgICAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwgJiYgbU5hdmlnYXRpb25Nb2RlID09IEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfTElTVCkgeworICAgICAgICAgICAgICAgIG1TcGlubmVyLnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCAmJiAobURpc3BsYXlPcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19DVVNUT00pICE9IDApIHsKKyAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2Vmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV4cGFuZGVkQWN0aW9uVmlldyA9IG51bGw7CisgICAgICAgICAgICBtRXhwYW5kZWRIb21lTGF5b3V0LnNldEljb24obnVsbCk7CisgICAgICAgICAgICBtQ3VycmVudEV4cGFuZGVkSXRlbSA9IG51bGw7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICBpdGVtLnNldEFjdGlvblZpZXdFeHBhbmRlZChmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblV0aWxzLmphdmEKaW5kZXggMGRjMDQyMi4uZGZiYTQ4NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblV0aWxzLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5JTW91bnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTQ3LDcgKzQ4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAogLyoqCi0gKiBVdGlsaXRpZXMgZm9yIHRoZSBsb2NrIHBhdHRlbiBhbmQgaXRzIHNldHRpbmdzLgorICogVXRpbGl0aWVzIGZvciB0aGUgbG9jayBwYXR0ZXJuIGFuZCBpdHMgc2V0dGluZ3MuCiAgKi8KIHB1YmxpYyBjbGFzcyBMb2NrUGF0dGVyblV0aWxzIHsKIApAQCAtMzk2LDEyICszOTcsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJhZi5jbG9zZSgpOwogICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0gPSBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCk7CisgICAgICAgICAgICBLZXlTdG9yZSBrZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKCk7CiAgICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAga2V5U3RvcmUucGFzc3dvcmQocGF0dGVyblRvU3RyaW5nKHBhdHRlcm4pKTsKICAgICAgICAgICAgICAgICBzZXRCb29sZWFuKFBBVFRFUk5fRVZFUl9DSE9TRU5fS0VZLCB0cnVlKTsKICAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HKTsKICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HLCBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGtleVN0b3JlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBrZXlTdG9yZS5yZXNldCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KQEAgLTQ4NCwxMCArNDkwLDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByYWYuY2xvc2UoKTsKICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpOworICAgICAgICAgICAgS2V5U3RvcmUga2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGVuY3J5cHRpb24gcGFzc3dvcmQuCiAgICAgICAgICAgICAgICAgdXBkYXRlRW5jcnlwdGlvblBhc3N3b3JkKHBhc3N3b3JkKTsKIAorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUga2V5c3RvcmUgcGFzc3dvcmQKKyAgICAgICAgICAgICAgICBrZXlTdG9yZS5wYXNzd29yZChwYXNzd29yZCk7CisKICAgICAgICAgICAgICAgICBpbnQgY29tcHV0ZWRRdWFsaXR5ID0gY29tcHV0ZVBhc3N3b3JkUXVhbGl0eShwYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgTWF0aC5tYXgocXVhbGl0eSwgY29tcHV0ZWRRdWFsaXR5KSk7CiAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkUXVhbGl0eSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQpIHsKQEAgLTU0MCw2ICs1NTAsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2V0U3RyaW5nKFBBU1NXT1JEX0hJU1RPUllfS0VZLCBwYXNzd29yZEhpc3RvcnkpOwogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBDb25kaXRpb25hbGx5IHJlc2V0IHRoZSBrZXlzdG9yZSBpZiBlbXB0eS4gSWYKKyAgICAgICAgICAgICAgICAvLyBub24tZW1wdHksIHdlIGFyZSBqdXN0IHN3aXRjaGluZyBrZXkgZ3VhcmQgdHlwZQorICAgICAgICAgICAgICAgIGlmIChrZXlTdG9yZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U3RvcmUucmVzZXQoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgfQpAQCAtNjQ2LDcgKzY2MSw3IEBACiAgICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBnZXN0dXJlIHBhdHRlcm4uCiAgICAgICogQHJldHVybiB0aGUgaGFzaCBvZiB0aGUgcGF0dGVybiBpbiBhIGJ5dGUgYXJyYXkuCiAgICAgICovCi0gICAgIHB1YmxpYyBieXRlW10gcGFzc3dvcmRUb0hhc2goU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgcHVibGljIGJ5dGVbXSBwYXNzd29yZFRvSGFzaChTdHJpbmcgcGFzc3dvcmQpIHsKICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1RleHRQcm9ncmVzc0Jhci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9UZXh0UHJvZ3Jlc3NCYXIuamF2YQppbmRleCBhZWU3Yjc2Li5lMTEzZGQ4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1RleHRQcm9ncmVzc0Jhci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvVGV4dFByb2dyZXNzQmFyLmphdmEKQEAgLTg2LDcgKzg2LDggQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgLy8gQ2hlY2sgaWYgQ2hyb25vbWV0ZXIgc2hvdWxkIG1vdmUgd2l0aCB3aXRoIFByb2dyZXNzQmFyIAogICAgICAgICAgICAgbUNocm9ub21ldGVyRm9sbG93ID0gKHBhcmFtcy53aWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgICAgICBtQ2hyb25vbWV0ZXJHcmF2aXR5ID0gKG1DaHJvbm9tZXRlci5nZXRHcmF2aXR5KCkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKTsKKyAgICAgICAgICAgIG1DaHJvbm9tZXRlckdyYXZpdHkgPSAobUNocm9ub21ldGVyLmdldEdyYXZpdHkoKSAmCisgICAgICAgICAgICAgICAgICAgIEdyYXZpdHkuUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spOwogICAgICAgICAgICAgCiAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRJZCA9PSBQUk9HUkVTU0JBUl9JRCAmJiBjaGlsZCBpbnN0YW5jZW9mIFByb2dyZXNzQmFyKSB7CiAgICAgICAgICAgICBtUHJvZ3Jlc3NCYXIgPSAoUHJvZ3Jlc3NCYXIpIGNoaWxkOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCmluZGV4IDRhMDkyMzIuLjk0MmFhOGExIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCkBAIC03NTUsMzIgKzc1NSw0NiBAQAogICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CiAKICAgICAgICAgamludCBjb3VudCA9IGVuZCAtIHN0YXJ0OwotICAgICAgICBzcDxUZXh0TGF5b3V0Q2FjaGVWYWx1ZT4gdmFsdWUgPSBnVGV4dExheW91dENhY2hlLmdldFZhbHVlKAotICAgICAgICAgICAgICAgIHBhaW50LCB0ZXh0QXJyYXksIHN0YXJ0LCBjb3VudCwgZW5kLCBmbGFncyk7CisgICAgICAgIHNwPFRleHRMYXlvdXRDYWNoZVZhbHVlPiB2YWx1ZTsKKyNpZiBVU0VfVEVYVF9MQVlPVVRfQ0FDSEUKKyAgICAgICAgdmFsdWUgPSBnVGV4dExheW91dENhY2hlLmdldFZhbHVlKHBhaW50LCB0ZXh0QXJyYXksIHN0YXJ0LCBjb3VudCwgZW5kLCBmbGFncyk7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBMT0dFKCJDYW5ub3QgZ2V0IFRleHRMYXlvdXRDYWNoZSB2YWx1ZSIpOwogICAgICAgICAgICAgcmV0dXJuIDsKICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgdmFsdWUgPSBuZXcgVGV4dExheW91dENhY2hlVmFsdWUoKTsKKyAgICAgICAgdmFsdWUtPmNvbXB1dGVWYWx1ZXMocGFpbnQsIHRleHRBcnJheSwgc3RhcnQsIGNvdW50LCBlbmQsIGZsYWdzKTsKKyNlbmRpZgorCiAjaWYgREVCVUdfR0xZUEhTCiAgICAgICAgIGxvZ0dseXBocyh2YWx1ZSk7CiAjZW5kaWYKLSAgICAgICAgZG9EcmF3R2x5cGhzKGNhbnZhcywgdmFsdWUtPmdldEdseXBocygpLCAwLCB2YWx1ZS0+Z2V0R2x5cGhzQ291bnQoKSwKLSAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgcGFpbnQpOworCisgICAgZG9EcmF3R2x5cGhzKGNhbnZhcywgdmFsdWUtPmdldEdseXBocygpLCAwLCB2YWx1ZS0+Z2V0R2x5cGhzQ291bnQoKSwKKyAgICAgICAgICAgIHgsIHksIGZsYWdzLCBwYWludCk7CiAgICAgfQogCiAgICAgc3RhdGljIHZvaWQgZHJhd1RleHRXaXRoR2x5cGhzKFNrQ2FudmFzKiBjYW52YXMsIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXksCiAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGNvbnRleHRDb3VudCwKICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewogCi0gICAgICAgIHNwPFRleHRMYXlvdXRDYWNoZVZhbHVlPiB2YWx1ZSA9IGdUZXh0TGF5b3V0Q2FjaGUuZ2V0VmFsdWUoCi0gICAgICAgICAgICAgICAgcGFpbnQsIHRleHRBcnJheSwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzKTsKKyAgICAgICAgc3A8VGV4dExheW91dENhY2hlVmFsdWU+IHZhbHVlOworI2lmIFVTRV9URVhUX0xBWU9VVF9DQUNIRQorICAgICAgICB2YWx1ZSA9IGdUZXh0TGF5b3V0Q2FjaGUuZ2V0VmFsdWUocGFpbnQsIHRleHRBcnJheSwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzKTsKICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgICAgIExPR0UoIkNhbm5vdCBnZXQgVGV4dExheW91dENhY2hlIHZhbHVlIik7CiAgICAgICAgICAgICByZXR1cm4gOwogICAgICAgICB9CisjZWxzZQorICAgICAgICB2YWx1ZSA9IG5ldyBUZXh0TGF5b3V0Q2FjaGVWYWx1ZSgpOworICAgICAgICB2YWx1ZS0+Y29tcHV0ZVZhbHVlcyhwYWludCwgdGV4dEFycmF5LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgZmxhZ3MpOworI2VuZGlmCisKICNpZiBERUJVR19HTFlQSFMKICAgICAgICAgbG9nR2x5cGhzKHZhbHVlKTsKICNlbmRpZgorCiAgICAgICAgIGRvRHJhd0dseXBocyhjYW52YXMsIHZhbHVlLT5nZXRHbHlwaHMoKSwgMCwgdmFsdWUtPmdldEdseXBoc0NvdW50KCksCiAgICAgICAgICAgICAgICAgeCwgeSwgZmxhZ3MsIHBhaW50KTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BpY3R1cmUuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QaWN0dXJlLmNwcAppbmRleCA1YWI2ZGQzLi5mMjhmYzI2IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BpY3R1cmUuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGljdHVyZS5jcHAKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAKICAgICBzdGF0aWMgdm9pZCBraWxsUGljdHVyZShKTklFbnYqIGVudiwgam9iamVjdCwgU2tQaWN0dXJlKiBwaWN0dXJlKSB7CiAgICAgICAgIFNrQVNTRVJUKHBpY3R1cmUpOwotICAgICAgICBkZWxldGUgcGljdHVyZTsKKyAgICAgICAgcGljdHVyZS0+dW5yZWYoKTsKICAgICB9CiAgICAgCiAgICAgc3RhdGljIHZvaWQgZHJhdyhKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCmluZGV4IDQ2ZTZjMmIuLjdlODlhMzcgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmNwcApAQCAtMjU0LDIxICsyNTQsMjEgQEAKIHZvaWQgVGV4dExheW91dDo6Z2V0VGV4dFJ1bkFkdmFuY2VzKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogY2hhcnMsIGppbnQgc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBkaXJGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCogcmVzdWx0QWR2YW5jZXMsIGpmbG9hdCYgcmVzdWx0VG90YWxBZHZhbmNlKSB7CisgICAgc3A8VGV4dExheW91dENhY2hlVmFsdWU+IHZhbHVlOwogI2lmIFVTRV9URVhUX0xBWU9VVF9DQUNIRQogICAgIC8vIFJldHVybiBhZHZhbmNlcyBmcm9tIHRoZSBjYWNoZS4gQ29tcHV0ZSB0aGVtIGlmIG5lZWRlZAotICAgIHNwPFRleHRMYXlvdXRDYWNoZVZhbHVlPiBsYXlvdXQgPSBnVGV4dExheW91dENhY2hlLmdldFZhbHVlKAorICAgIHZhbHVlID0gZ1RleHRMYXlvdXRDYWNoZS5nZXRWYWx1ZSgKICAgICAgICAgICAgIHBhaW50LCBjaGFycywgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGRpckZsYWdzKTsKLSAgICBpZiAobGF5b3V0ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHJlc3VsdEFkdmFuY2VzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lbWNweShyZXN1bHRBZHZhbmNlcywgbGF5b3V0LT5nZXRBZHZhbmNlcygpLCBsYXlvdXQtPmdldEFkdmFuY2VzQ291bnQoKSAqIHNpemVvZihqZmxvYXQpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHRUb3RhbEFkdmFuY2UgPSBsYXlvdXQtPmdldFRvdGFsQWR2YW5jZSgpOwotICAgIH0KICNlbHNlCi0gICAgLy8gQ29tcHV0ZSBhZHZhbmNlcyBhbmQgcmV0dXJuIHRoZW0KLSAgICBUZXh0TGF5b3V0Q2FjaGVWYWx1ZTo6Y29tcHV0ZVZhbHVlc1dpdGhIYXJmYnV6eihwYWludCwgY2hhcnMsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LAotICAgICAgICAgICAgZGlyRmxhZ3MsIHJlc3VsdEFkdmFuY2VzLCAmcmVzdWx0VG90YWxBZHZhbmNlLCBOVUxMLCBOVUxMICk7CisgICAgdmFsdWUgPSBuZXcgVGV4dExheW91dENhY2hlVmFsdWUoKTsKKyAgICB2YWx1ZS0+Y29tcHV0ZVZhbHVlcyhwYWludCwgY2hhcnMsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBkaXJGbGFncyk7CiAjZW5kaWYKKyAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICBpZiAocmVzdWx0QWR2YW5jZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgbWVtY3B5KHJlc3VsdEFkdmFuY2VzLCB2YWx1ZS0+Z2V0QWR2YW5jZXMoKSwgdmFsdWUtPmdldEFkdmFuY2VzQ291bnQoKSAqIHNpemVvZihqZmxvYXQpKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHRUb3RhbEFkdmFuY2UgPSB2YWx1ZS0+Z2V0VG90YWxBZHZhbmNlKCk7CisgICAgfQogfQogCiB2b2lkIFRleHRMYXlvdXQ6OmdldFRleHRSdW5BZHZhbmNlc0hCKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogY2hhcnMsIGppbnQgc3RhcnQsCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX25mY19OZGVmTWVzc2FnZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25mY19OZGVmTWVzc2FnZS5jcHAKaW5kZXggOWJlZWYyYS4uZDliNjRhYSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZmNfTmRlZk1lc3NhZ2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbmZjX05kZWZNZXNzYWdlLmNwcApAQCAtODYsNyArODYsNyBAQAogICAgIGlmIChyZWNvcmRzX2FycmF5ID09IE5VTEwpCiAgICAgICAgIGdvdG8gZW5kOwogCi0gICAgY3RvciA9IGUtPkdldE1ldGhvZElEKHJlY29yZF9jbHMsICI8aW5pdD4iLCAiKFNbQltCW0IpViIpOworICAgIGN0b3IgPSBlLT5HZXRNZXRob2RJRChyZWNvcmRfY2xzLCAiPGluaXQ+IiwgIihTW0JbQltCQilWIik7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX29mX3JlY29yZHM7IGkrKykgewogICAgICAgICBqYnl0ZUFycmF5IHR5cGUsIGlkLCBwYXlsb2FkOwpAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgICAgICAgICAgICAgKGpieXRlICopcmVjb3JkLlBheWxvYWREYXRhKTsKIAogICAgICAgICBuZXdfcmVjb3JkID0gZS0+TmV3T2JqZWN0KHJlY29yZF9jbHMsIGN0b3IsCi0gICAgICAgICAgICAgICAgKGpzaG9ydClyZWNvcmQuVG5mLCB0eXBlLCBpZCwgcGF5bG9hZCk7CisgICAgICAgICAgICAgICAgKGpzaG9ydClyZWNvcmQuVG5mLCB0eXBlLCBpZCwgcGF5bG9hZCwgKGpieXRlKXJlY29yZC5GbGFncyk7CiAKICAgICAgICAgZS0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJlY29yZHNfYXJyYXksIGksIG5ld19yZWNvcmQpOwogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX25mY19OZGVmUmVjb3JkLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbmZjX05kZWZSZWNvcmQuY3BwCmluZGV4IGE3YTgwYzguLmU4Y2M0YzYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfbmZjX05kZWZSZWNvcmQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbmZjX05kZWZSZWNvcmQuY3BwCkBAIC05MSw3ICs5MSw3IEBACiAgICAgamludCByZXQgPSAtMTsKICAgICBwaEZyaU5mY19OZGVmUmVjb3JkX3QgcmVjb3JkOwogCi0gICAgamZpZWxkSUQgbVR5cGUsIG1JZCwgbVBheWxvYWQsIG1UbmY7CisgICAgamZpZWxkSUQgbVR5cGUsIG1JZCwgbVBheWxvYWQsIG1UbmYsIG1GbGFnczsKICAgICBqYnl0ZUFycmF5IHR5cGUgPSBOVUxMOwogICAgIGpieXRlQXJyYXkgaWQgPSBOVUxMOwogICAgIGpieXRlQXJyYXkgcGF5bG9hZCA9IE5VTEw7CkBAIC0xNDIsMTAgKzE0MiwxNSBAQAogICAgIGlmIChwYXlsb2FkID09IE5VTEwpIHsKICAgICAgICAgZ290byBjbGVhbl9hbmRfcmV0dXJuOwogICAgIH0KKwogICAgIGUtPlNldEJ5dGVBcnJheVJlZ2lvbihwYXlsb2FkLCAwLCByZWNvcmQuUGF5bG9hZExlbmd0aCwKICAgICAgICAgICAgIChqYnl0ZSAqKXJlY29yZC5QYXlsb2FkRGF0YSk7CiAgICAgZS0+U2V0T2JqZWN0RmllbGQobywgbVBheWxvYWQsIHBheWxvYWQpOwogCisgICAgLyogU2V0IGZsYWdzIGZpZWxkICovCisgICAgbUZsYWdzID0gZS0+R2V0RmllbGRJRChyZWNvcmRfY2xzLCAibUZsYWdzIiwgIkIiKTsKKyAgICBlLT5TZXRJbnRGaWVsZChvLCBtRmxhZ3MsIHJlY29yZC5GbGFncyk7CisKICAgICByZXQgPSAwOwogCiBjbGVhbl9hbmRfcmV0dXJuOgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcAppbmRleCA1YzY5NThhLi5hYzc1NjM0IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcApAQCAtMjUwLDE1ICsyNTAsMTUgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBzdG9wRGlzY292ZXJ5TmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKK3N0YXRpYyBqYm9vbGVhbiBzdG9wRGlzY292ZXJ5TmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKICNpZmRlZiBIQVZFX0JMVUVUT09USAogICAgIERCdXNNZXNzYWdlICptc2cgPSBOVUxMOwogICAgIERCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CiAgICAgREJ1c0Vycm9yIGVycjsKICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIGpzdHJpbmcgcmV0OwogICAgIG5hdGl2ZV9kYXRhX3QgKm5hdDsKKyAgICBqYm9vbGVhbiByZXQgPSBKTklfRkFMU0U7CiAKICAgICBkYnVzX2Vycm9yX2luaXQoJmVycik7CiAKQEAgLTI4OCwxMSArMjg4LDE2IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUl9XSVRIX01TRygmZXJyLCBtc2cpOwogICAgICAgICB9CisgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKKyAgICByZXQgPSBKTklfVFJVRTsKIGRvbmU6CiAgICAgaWYgKG1zZykgZGJ1c19tZXNzYWdlX3VucmVmKG1zZyk7CiAgICAgaWYgKHJlcGx5KSBkYnVzX21lc3NhZ2VfdW5yZWYocmVwbHkpOworICAgIHJldHVybiByZXQ7CisjZWxzZQorICAgIHJldHVybiBKTklfRkFMU0U7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF91dGlsX1Byb2Nlc3MuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF91dGlsX1Byb2Nlc3MuY3BwCmluZGV4IGU1YzI4NDg5Li4wOTYwYjI1IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3V0aWxfUHJvY2Vzcy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF91dGlsX1Byb2Nlc3MuY3BwCkBAIC0zOCwxOCArMzgsNyBAQAogI2luY2x1ZGUgPGdycC5oPgogI2luY2x1ZGUgPHB3ZC5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBkZXNrdG9wIExpbnV4IG5lZWRzIGEgbGl0dGxlIGhlbHAgd2l0aCBnZXR0aWQoKSAqLwotI2lmIGRlZmluZWQoSEFWRV9HRVRUSUQpICYmICFkZWZpbmVkKEhBVkVfQU5EUk9JRF9PUykKLSNkZWZpbmUgX19LRVJORUxfXwotIyBpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpZmRlZiBfc3lzY2FsbDAKLV9zeXNjYWxsMChwaWRfdCxnZXR0aWQpCi0jZWxzZQotcGlkX3QgZ2V0dGlkKCkgeyByZXR1cm4gc3lzY2FsbChfX05SX2dldHRpZCk7fQotI2VuZGlmCi0jdW5kZWYgX19LRVJORUxfXwotI2VuZGlmCisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNkZWZpbmUgUE9MSUNZX0RFQlVHIDAKICNkZWZpbmUgR1VBUkRfVEhSRUFEX1BSSU9SSVRZIDAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAKaW5kZXggZTUzOWNkMi4uNTdhOTdiZCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxTa2lhQ29sb3JGaWx0ZXIuaD4KICNpbmNsdWRlIDxSZWN0Lmg+CiAKLSNpbmNsdWRlICJUZXh0TGF5b3V0LmgiCisjaW5jbHVkZSA8VGV4dExheW91dC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTkxLDExICs5MSwyOSBAQAogICAgIGVnbFN1cmZhY2VBdHRyaWIoZGlzcGxheSwgc3VyZmFjZSwgRUdMX1NXQVBfQkVIQVZJT1IsIEVHTF9CVUZGRVJfUFJFU0VSVkVEKTsKIAogICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7Ci0gICAgUkVOREVSRVJfTE9HRCgiQ291bGQgbm90IGVuYWJsZSBidWZmZXIgcHJlc2VydmVkIHN3YXAgYmVoYXZpb3IgKCV4KSIsIGVycm9yKTsKKyAgICBpZiAoZXJyb3IgIT0gRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgUkVOREVSRVJfTE9HRCgiQ291bGQgbm90IGVuYWJsZSBidWZmZXIgcHJlc2VydmVkIHN3YXAgYmVoYXZpb3IgKCV4KSIsIGVycm9yKTsKKyAgICB9CiAKICAgICByZXR1cm4gZXJyb3IgPT0gRUdMX1NVQ0NFU1M7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2lzQmFja0J1ZmZlclByZXNlcnZlZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eikgeworICAgIEVHTERpc3BsYXkgZGlzcGxheSA9IGVnbEdldEN1cnJlbnREaXNwbGF5KCk7CisgICAgRUdMU3VyZmFjZSBzdXJmYWNlID0gZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMX0RSQVcpOworICAgIEVHTGludCB2YWx1ZTsKKworICAgIGVnbEdldEVycm9yKCk7CisgICAgZWdsUXVlcnlTdXJmYWNlKGRpc3BsYXksIHN1cmZhY2UsIEVHTF9TV0FQX0JFSEFWSU9SLCAmdmFsdWUpOworCisgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKKyAgICBpZiAoZXJyb3IgIT0gRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgUkVOREVSRVJfTE9HRCgiQ291bGQgbm90IHF1ZXJ5IGJ1ZmZlciBwcmVzZXJ2ZWQgc3dhcCBiZWhhdmlvciAoJXgpIiwgZXJyb3IpOworICAgIH0KKworICAgIHJldHVybiBlcnJvciA9PSBFR0xfU1VDQ0VTUyAmJiB2YWx1ZSA9PSBFR0xfQlVGRkVSX1BSRVNFUlZFRDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQ29uc3RydWN0b3JzCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MTksMTkgKzQzNywyNSBAQAogCiBzdGF0aWMgdm9pZCByZW5kZXJUZXh0KE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgY29uc3QgamNoYXIqIHRleHQsIGludCBjb3VudCwKICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7Ci0jaWYgMCAvLyBUT0RPOiByZXBsYWNlICIwIiBieSAiUlRMX1VTRV9IQVJGQlVaWiIgd2hlbiByZW5kZXJlci0+ZHJhd0dseXBocygpIGlzIGltcGxlbWVudGVkCi0gICAgc3A8VGV4dExheW91dENhY2hlVmFsdWU+IHZhbHVlID0gZ1RleHRMYXlvdXRDYWNoZS5nZXRWYWx1ZSgKLSAgICAgICAgICAgIHBhaW50LCB0ZXh0LCAwLCBjb3VudCwgY291bnQsIGZsYWdzKTsKKyNpZiBSVExfVVNFX0hBUkZCVVpaCisgICAgc3A8VGV4dExheW91dENhY2hlVmFsdWU+IHZhbHVlOworI2lmIFVTRV9URVhUX0xBWU9VVF9DQUNIRQorICAgIHZhbHVlID0gZ1RleHRMYXlvdXRDYWNoZS5nZXRWYWx1ZShwYWludCwgdGV4dCwgMCwgY291bnQsIGNvdW50LCBmbGFncyk7CiAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgTE9HRSgiQ2Fubm90IGdldCBUZXh0TGF5b3V0Q2FjaGUgdmFsdWUiKTsKICAgICAgICAgcmV0dXJuIDsKICAgICB9CisjZWxzZQorICAgIHZhbHVlID0gbmV3IFRleHRMYXlvdXRDYWNoZVZhbHVlKCk7CisgICAgdmFsdWUtPmNvbXB1dGVWYWx1ZXMocGFpbnQsIHRleHQsIDAsIGNvdW50LCBjb3VudCwgZmxhZ3MpOworI2VuZGlmCiAjaWYgREVCVUdfR0xZUEhTCiAgICAgbG9nR2x5cGhzKHZhbHVlKTsKICNlbmRpZgogICAgIGNvbnN0IGpjaGFyKiBnbHlwaEFycmF5ID0gdmFsdWUtPmdldEdseXBocygpOwogICAgIGludCBnbHlwaENvdW50ID0gdmFsdWUtPmdldEdseXBoc0NvdW50KCk7Ci0gICAgcmVuZGVyZXItPmRyYXdHbHlwaHMoKGNvbnN0IGNoYXIqKSBnbHlwaEFycmF5LCAwLCBnbHlwaENvdW50IDw8IDEsIHgsIHksIHBhaW50KTsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IGdseXBoQ291bnQgKiBzaXplb2YoamNoYXIpOworICAgIHJlbmRlcmVyLT5kcmF3VGV4dCgoY29uc3QgY2hhciopIGdseXBoQXJyYXksIGJ5dGVzQ291bnQsIGdseXBoQ291bnQsIHgsIHksIHBhaW50KTsKICNlbHNlCiAgICAgY29uc3QgamNoYXIgKndvcmtUZXh0OwogICAgIGpjaGFyKiBidWZmZXIgPSBOVUxMOwpAQCAtNDQ2LDE5ICs0NzAsMjUgQEAKIHN0YXRpYyB2b2lkIHJlbmRlclRleHRSdW4oT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBjb25zdCBqY2hhciogdGV4dCwKICAgICAgICAgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGpmbG9hdCB4LCBqZmxvYXQgeSwKICAgICAgICAgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewotI2lmIDAgLy8gVE9ETzogcmVwbGFjZSAiMCIgYnkgIlJUTF9VU0VfSEFSRkJVWloiIHdoZW4gcmVuZGVyZXItPmRyYXdHbHlwaHMoKSBpcyBpbXBsZW1lbnRlZAotICAgIHNwPFRleHRMYXlvdXRDYWNoZVZhbHVlPiB2YWx1ZSA9IGdUZXh0TGF5b3V0Q2FjaGUuZ2V0VmFsdWUoCi0gICAgICAgICAgICBwYWludCwgdGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzKTsKKyNpZiBSVExfVVNFX0hBUkZCVVpaCisgICAgc3A8VGV4dExheW91dENhY2hlVmFsdWU+IHZhbHVlOworI2lmIFVTRV9URVhUX0xBWU9VVF9DQUNIRQorICAgIHZhbHVlID0gZ1RleHRMYXlvdXRDYWNoZS5nZXRWYWx1ZShwYWludCwgdGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzKTsKICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJDYW5ub3QgZ2V0IFRleHRMYXlvdXRDYWNoZSB2YWx1ZSIpOwogICAgICAgICByZXR1cm4gOwogICAgIH0KKyNlbHNlCisgICAgdmFsdWUgPSBuZXcgVGV4dExheW91dENhY2hlVmFsdWUoKTsKKyAgICB2YWx1ZS0+Y29tcHV0ZVZhbHVlcyhwYWludCwgdGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzKTsKKyNlbmRpZgogI2lmIERFQlVHX0dMWVBIUwogICAgIGxvZ0dseXBocyh2YWx1ZSk7CiAjZW5kaWYKICAgICBjb25zdCBqY2hhciogZ2x5cGhBcnJheSA9IHZhbHVlLT5nZXRHbHlwaHMoKTsKICAgICBpbnQgZ2x5cGhDb3VudCA9IHZhbHVlLT5nZXRHbHlwaHNDb3VudCgpOwotICAgIHJlbmRlcmVyLT5kcmF3R2x5cGhzKChjb25zdCBjaGFyKikgZ2x5cGhBcnJheSwgMCwgZ2x5cGhDb3VudCA8PCAxLCB4LCB5LCBwYWludCk7CisgICAgaW50IGJ5dGVzQ291bnQgPSBnbHlwaENvdW50ICogc2l6ZW9mKGpjaGFyKTsKKyAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSBnbHlwaEFycmF5LCBieXRlc0NvdW50LCBnbHlwaENvdW50LCB4LCB5LCBwYWludCk7CiAjZWxzZQogICAgIHVpbnQ4X3QgcnRsID0gZmxhZ3MgJiAweDE7CiAgICAgaWYgKHJ0bCkgewpAQCAtNjc0LDcgKzcwNCw4IEBACiAgICAgeyAibklzQXZhaWxhYmxlIiwgICAgICAgIigpWiIsICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19pc0F2YWlsYWJsZSB9LAogCiAjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgotICAgIHsgIm5QcmVzZXJ2ZUJhY2tCdWZmZXIiLCAiKClaIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcHJlc2VydmVCYWNrQnVmZmVyIH0sCisgICAgeyAibklzQmFja0J1ZmZlclByZXNlcnZlZCIsICIoKVoiLCAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19pc0JhY2tCdWZmZXJQcmVzZXJ2ZWQgfSwKKyAgICB7ICJuUHJlc2VydmVCYWNrQnVmZmVyIiwgICAgIigpWiIsICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3ByZXNlcnZlQmFja0J1ZmZlciB9LAogCiAgICAgeyAibkNyZWF0ZVJlbmRlcmVyIiwgICAgIigpSSIsICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVSZW5kZXJlciB9LAogICAgIHsgIm5EZXN0cm95UmVuZGVyZXIiLCAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZGVzdHJveVJlbmRlcmVyIH0sCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0MTk1NzhjLi4zZWZiODNjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTY3Nyw2ICs2NzcsMTQgQEAKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX2R1bXAiCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfZHVtcCIgLz4KIAorICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IG9mIHRoZSBhY3RpdmUgd2luZG93CisgICAgICAgICBBbiBhY3RpdmUgd2luZG93IGlzIHRoZSB3aW5kb3cgdGhhdCBoYXMgZmlyZWQgYW4gYWNjZXNzaWJpbGl0eSBldmVudC4gLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVUUklFVkVfV0lORE9XX0NPTlRFTlQiCisgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuUEVSU09OQUxfSU5GTyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZU9yU3lzdGVtIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfcmV0cmlldmVfd2luZG93X2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfcmV0cmlldmVfd2luZG93X2NvbnRlbnQiIC8+CisKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBvcGVuIHdpbmRvd3MgdXNpbmcgdGhlIHR5cGUKICAgICAgICAgIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjVFlQRV9TWVNURU1fQUxFUlR9LAogICAgICAgICAgc2hvd24gb24gdG9wIG9mIGFsbCBvdGhlciBhcHBsaWNhdGlvbnMuICBWZXJ5IGZldyBhcHBsaWNhdGlvbnMKQEAgLTEwOTgsNiArMTEwNiwxMyBAQAogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX3NldE9yaWVudGF0aW9uIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgogCisgICAgPCEtLSBBbGxvd3MgbG93LWxldmVsIGFjY2VzcyB0byBzZXR0aW5nIHRoZSBwb2ludGVyIHNwZWVkLgorICAgICAgICAgTm90IGZvciB1c2UgYnkgbm9ybWFsIGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1BPSU5URVJfU1BFRUQiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9zZXRQb2ludGVyU3BlZWQiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gaW5zdGFsbCBwYWNrYWdlcy4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5TVEFMTF9QQUNLQUdFUyIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX2luc3RhbGxQYWNrYWdlcyIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZwppbmRleCBhYmFlYTJkLi5lZTEwNTRlZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcKaW5kZXggODk4MjM5Ni4uYjdkZGJiNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ190b3BfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWxlY3RhbGxfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTc5NDQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWxlY3RhbGxfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2VsZWN0YWxsX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzQ5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX2Fycm93LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfYXJyb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDE4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX2Fycm93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX2Fycm93X2ljb24ueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9hcnJvd19pY29uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjU2NzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9hcnJvd19pY29uLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cG9pbnRlci1pY29uIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmJpdG1hcD0iQGRyYXdhYmxlL3BvaW50ZXJfYXJyb3ciCisgICAgYW5kcm9pZDpob3RTcG90WD0iNiIKKyAgICBhbmRyb2lkOmhvdFNwb3RZPSI2IiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2FuY2hvci5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfYW5jaG9yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FjYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2FuY2hvci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2FuY2hvcl9pY29uLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF9hbmNob3JfaWNvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyMmI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF9hbmNob3JfaWNvbi54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHBvaW50ZXItaWNvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpiaXRtYXA9IkBkcmF3YWJsZS9wb2ludGVyX3Nwb3RfYW5jaG9yIgorICAgIGFuZHJvaWQ6aG90U3BvdFg9IjMzIgorICAgIGFuZHJvaWQ6aG90U3BvdFk9IjMzIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2hvdmVyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF9ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0MWFhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF9ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2hvdmVyX2ljb24ueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2hvdmVyX2ljb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjJhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfaG92ZXJfaWNvbi54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHBvaW50ZXItaWNvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpiaXRtYXA9IkBkcmF3YWJsZS9wb2ludGVyX3Nwb3RfaG92ZXIiCisgICAgYW5kcm9pZDpob3RTcG90WD0iMzMiCisgICAgYW5kcm9pZDpob3RTcG90WT0iMzMiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfdG91Y2gucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X3RvdWNoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGE0MmExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X3RvdWNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfdG91Y2hfaWNvbi54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfdG91Y2hfaWNvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZmVlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF90b3VjaF9pY29uLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cG9pbnRlci1pY29uIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmJpdG1hcD0iQGRyYXdhYmxlL3BvaW50ZXJfc3BvdF90b3VjaCIKKyAgICBhbmRyb2lkOmhvdFNwb3RYPSIyNCIKKyAgICBhbmRyb2lkOmhvdFNwb3RZPSIyNCIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdG9hc3RfZnJhbWUuOS5wbmcKaW5kZXggMDhiMTYzYS4uOTc2OWJiYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90b2FzdF9mcmFtZV9ob2xvLjkucG5nCmluZGV4IDdmODMwYmMuLjk3NjliYmI3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90b2FzdF9mcmFtZV9ob2xvLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nCmluZGV4IDY4ZjllNTcuLmVjMDZjMTdkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ190b3BfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ190b3BfaG9sb19saWdodC45LnBuZwppbmRleCA2MGFhOGNiLi43YTJiZjhkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VsZWN0YWxsX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWMyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VsZWN0YWxsX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZWxlY3RhbGxfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0ZjVkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VsZWN0YWxsX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RvYXN0X2ZyYW1lLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWUuOS5wbmcKaW5kZXggODYwM2U5My4uMDZjZmM3MCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWVfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RvYXN0X2ZyYW1lX2hvbG8uOS5wbmcKaW5kZXggOTExZjg2ZC4uMDZjZmM3MCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWVfaG9sby45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90b2FzdF9mcmFtZV9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nCmluZGV4IDU1YzYwYjguLmJkYjY4MjQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2RpYWxvZ190b3BfaG9sb19saWdodC45LnBuZwppbmRleCBkMzNkMDMzLi5hYTg0MDFkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL3RvYXN0X2ZyYW1lLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL3RvYXN0X2ZyYW1lLjkucG5nCmluZGV4IDljMGZmNDcuLmY3ZGViZWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS90b2FzdF9mcmFtZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvdG9hc3RfZnJhbWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL3RvYXN0X2ZyYW1lX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvdG9hc3RfZnJhbWVfaG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RlYmVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL3RvYXN0X2ZyYW1lX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQtc3c2MDBkcC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzNDVjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQtc3c2MDBkcC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwKQEAgLTAsMCArMSwxMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl90b3BfbWFyZ2luIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9ib3R0b21fbWFyZ2luIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiPgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVycyIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbl9uZWdhdGl2ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iQGludGVnZXIvcHJlZmVyZW5jZXNfbGVmdF9wYW5lX3dlaWdodCI+CisKKyAgICAgICAgICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjE2ZHAiCisKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmNhY2hlQ29sb3JIaW50PSJAYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0PSI0OGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2s9InRydWUiIC8+CisKKyAgICAgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xpc3RfZm9vdGVyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIiAvPgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ByZWZzX2ZyYW1lIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSJAaW50ZWdlci9wcmVmZXJlbmNlc19yaWdodF9wYW5lX3dlaWdodCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSJAZGltZW4vcHJlZmVyZW5jZV9zY3JlZW5fc2lkZV9tYXJnaW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hdHRyL2RldGFpbHNFbGVtZW50QmFja2dyb3VuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiID4KKworICAgICAgICAgICAgPCEtLSBCcmVhZGNydW1iIGluc2VydGVkIGhlcmUsIGluIGNlcnRhaW4gc2NyZWVuIHNpemVzLiBJbiBvdGhlcnMsIGl0IHdpbGwgYmUgYW4KKyAgICAgICAgICAgICAgICBlbXB0eSBsYXlvdXQgb3IganVzdCBwYWRkaW5nLCBhbmQgUHJlZmVyZW5jZUFjdGl2aXR5IHdpbGwgcHV0IHRoZSBicmVhZGNydW1icyBpbgorICAgICAgICAgICAgICAgIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9icmVhZGNydW1ic19pbl9mcmFnbWVudCIgLz4KKworICAgICAgICAgICAgPGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9wcmVmcyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9idXR0b25fYmFyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2JvdHRvbV9iYXIiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19idG5fYmFjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JhY2tfYnV0dG9uX2xhYmVsIgorICAgICAgICAvPgorICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSI+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9za2lwX2J1dHRvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2tpcF9idXR0b25fbGFiZWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHRfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVSaWdodD0iQGRyYXdhYmxlL2ljX2J0bl9uZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9uZXh0X2J1dHRvbl9sYWJlbCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X3RpY2tlci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfdGlja2VyLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfdGlja2VyLnhtbApyZW5hbWUgdG8gY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X3RpY2tlci54bWwKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X3RpY2tlcl9sYXJnZV9pY29uLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF90aWNrZXJfbGFyZ2VfaWNvbi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X3RpY2tlcl9sYXJnZV9pY29uLnhtbApyZW5hbWUgdG8gY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X3RpY2tlcl9sYXJnZV9pY29uLnhtbApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudF9zaW5nbGVfbGFyZ2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC13NjAwZHAvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnRfc2luZ2xlLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudF9zaW5nbGVfbGFyZ2UueG1sCnJlbmFtZSB0byBjb3JlL3Jlcy9yZXMvbGF5b3V0LXc2MDBkcC9wcmVmZXJlbmNlX2xpc3RfY29udGVudF9zaW5nbGUueG1sCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9icmVhZGNydW1ic19pbl9mcmFnbWVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9icmVhZGNydW1ic19pbl9mcmFnbWVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0YzRmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2JyZWFkY3J1bWJzX2luX2ZyYWdtZW50LnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iQGRpbWVuL3ByZWZlcmVuY2VfZnJhZ21lbnRfcGFkZGluZ19zaWRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iQGRpbWVuL3ByZWZlcmVuY2VfZnJhZ21lbnRfcGFkZGluZ19zaWRlIgorICAgID4KKyAgICA8YW5kcm9pZC5hcHAuRnJhZ21lbnRCcmVhZENydW1icworICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjcyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxsZWZ0IgorICAgICAgICAvPgorCisgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSIjNDA0MDQwIgorICAgICAgICAvPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hbV9jb21wYXRfbW9kZV9kaWFsb2cueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbV9jb21wYXRfbW9kZV9kaWFsb2cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDM5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FtX2NvbXBhdF9tb2RlX2RpYWxvZy54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNDBkcCIgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVkcCIgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNWRwIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJ0cnVlIj4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZHAiIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSI/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDxTd2l0Y2gKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbXBhdF9jaGVja2JveCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkcCIKKyAgICAgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZHAiIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgICAgICAgICAvPgorCisgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvYXNrX2NoZWNrYm94IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zY3JlZW5fY29tcGF0X21vZGVfc2hvdyIKKyAgICAgICAgICAgIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmVhc2tfaGludCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYXBwX3Blcm1zX3N1bW1hcnkueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hcHBfcGVybXNfc3VtbWFyeS54bWwKaW5kZXggYmRiYmZjYi4uM2Y5OWRkZSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9hcHBfcGVybXNfc3VtbWFyeS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hcHBfcGVybXNfc3VtbWFyeS54bWwKQEAgLTYwLDEwICs2MCwxMSBAQAogICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTZkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjEyZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTZkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmR1cGxpY2F0ZVBhcmVudFN0YXRlPSJ0cnVlIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjEyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmR1cGxpY2F0ZVBhcmVudFN0YXRlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZCI+CiAKICAgICAgICAgICAgIDxUZXh0VmlldwogICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2hvd19tb3JlX3RleHQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2JyZWFkY3J1bWJzX2luX2ZyYWdtZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYnJlYWRjcnVtYnNfaW5fZnJhZ21lbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZmZmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2JyZWFkY3J1bWJzX2luX2ZyYWdtZW50LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVGhpcyBsYXlvdXQgZGlzYWJsZXMgYnJlYWRjcnVtYnMgaW4gdGhlIGZyYWdtZW50IGFyZWEgYW5kIGNhdXNlcyBQcmVmZXJlbmNlQWN0aXZpdHkgdG8KKyAgICBwdXQgdGhlIGJyZWFkY3J1bWJzIGluIHRoZSBhY3Rpb24gYmFyLiAtLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vcHJlZmVyZW5jZV9mcmFnbWVudF9wYWRkaW5nX3NpZGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9pbnB1dF9tZXRob2RfZXh0cmFjdF92aWV3LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvaW5wdXRfbWV0aG9kX2V4dHJhY3Rfdmlldy54bWwKaW5kZXggN2Q1OWQwMi4uNjBiYzI0YyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9pbnB1dF9tZXRob2RfZXh0cmFjdF92aWV3LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2lucHV0X21ldGhvZF9leHRyYWN0X3ZpZXcueG1sCkBAIC0xOCw3ICsxOCw3IEBACiAqLwogLS0+CiAKLTxMaW5lYXJMYXlvdXQKKzxhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5FeHRyYWN0RWRpdExheW91dAogICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgogICAgICAgICAKQEAgLTM4LDggKzM4LDggQEAKICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5wdXRFeHRyYWN0QWNjZXNzb3JpZXMiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iOGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUva2V5Ym9hcmRfYWNjZXNzb3J5X2JnX2xhbmRzY2FwZSIKICAgICAgICAgPgogICAgICAgICAKQEAgLTQ4LDcgKzQ4LDE0IEBACiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKICAgICAgICAgICAgIC8+CisgICAgICAgIDxhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5FeHRyYWN0QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvaW5wdXRFeHRyYWN0RWRpdEJ1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9leHRyYWN0X2VkaXRfbWVudV9idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIKKyAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAKICAgICA8L0ZyYW1lTGF5b3V0PgogICAgIAotPC9MaW5lYXJMYXlvdXQ+Cis8L2FuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLkV4dHJhY3RFZGl0TGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9sb2NhbGVfcGlja2VyX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9sb2NhbGVfcGlja2VyX2l0ZW0ueG1sCmluZGV4IGI2M2Y1YWIuLjE5YzBkZWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbG9jYWxlX3BpY2tlcl9pdGVtLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xvY2FsZV9waWNrZXJfaXRlbS54bWwKQEAgLTIwLDExICsyMCwxNCBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCiAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCi0gICAgYW5kcm9pZDpwYWRkaW5nPSI1ZGlwIj4KKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iOGRwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iOGRwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRwIj4KIAogICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xvY2FsZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKICAgICAvPgogPC9MaW5lYXJMYXlvdXQgPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2NhdGVnb3J5X2hvbG8ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2NhdGVnb3J5X2hvbG8ueG1sCmluZGV4IDVmZThiMjguLmE0ZTIwZDIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9jYXRlZ29yeV9ob2xvLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfY2F0ZWdvcnlfaG9sby54bWwKQEAgLTE4LDUgKzE4LDUgQEAKIDxUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvbGlzdFNlcGFyYXRvclRleHRWaWV3U3R5bGUiCiAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3RpdGxlIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjMyZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkcCIKIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfY2hpbGRfaG9sby54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfY2hpbGRfaG9sby54bWwKaW5kZXggMmU3MGQ3Ny4uMDZjODQ2YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2NoaWxkX2hvbG8ueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9jaGlsZF9ob2xvLnhtbApAQCAtMjYsNyArMjYsNyBAQAogICAgIDxMaW5lYXJMYXlvdXQKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bWluV2lkdGg9IkBkaW1lbi9wcmVmZXJlbmNlX3dpZGdldF93aWR0aCIKKyAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iQGRpbWVuL3ByZWZlcmVuY2VfaWNvbl9taW5XaWR0aCIKICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgogICAgICAgICA8SW1hZ2VWaWV3CkBAIC00MCw2ICs0MCw3IEBACiAgICAgPFJlbGF0aXZlTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzMmRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2hvbG8ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2hvbG8ueG1sCmluZGV4IGM0NDhmNjQuLmU1ZWQzM2MgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9ob2xvLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfaG9sby54bWwKQEAgLTI3LDIxICsyNywyMyBAQAogICAgIDxMaW5lYXJMYXlvdXQKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bWluV2lkdGg9IkBkaW1lbi9wcmVmZXJlbmNlX3dpZGdldF93aWR0aCIKICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6bWluV2lkdGg9IkBkaW1lbi9wcmVmZXJlbmNlX2ljb25fbWluV2lkdGgiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgogICAgICAgICA8SW1hZ2VWaWV3CiAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvaWNvbiIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWluV2lkdGg9IjQ4ZHAiCiAgICAgICAgICAgICAvPgogICAgIDwvTGluZWFyTGF5b3V0PgogCiAgICAgPFJlbGF0aXZlTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9pbmZvcm1hdGlvbl9ob2xvLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9pbmZvcm1hdGlvbl9ob2xvLnhtbAppbmRleCBkNmNjMDYzLi5kMTVjZDdiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfaW5mb3JtYXRpb25faG9sby54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2luZm9ybWF0aW9uX2hvbG8ueG1sCkBAIC0yNCwxMyArMjQsMjQgQEAKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iP2FuZHJvaWQ6YXR0ci9zY3JvbGxiYXJTaXplIj4KIAotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vcHJlZmVyZW5jZV93aWRnZXRfd2lkdGgiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bWluV2lkdGg9IkBkaW1lbi9wcmVmZXJlbmNlX2ljb25fbWluV2lkdGgiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL2ljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgogCiAgICAgPFJlbGF0aXZlTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNmRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZzcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2c3AiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNnNwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAppbmRleCA5MjViNzE1Li44MmIzYTRjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbApAQCAtMjcsNiArMjcsOCBAQAogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSJAZGltZW4vcHJlZmVyZW5jZV9zY3JlZW5fdG9wX21hcmdpbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSJAZGltZW4vcHJlZmVyZW5jZV9zY3JlZW5fYm90dG9tX21hcmdpbiIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KIAogICAgICAgICA8TGluZWFyTGF5b3V0CkBAIC0zNiwxMiArMzgsMTQgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbl9uZWdhdGl2ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMTAiPgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSJAaW50ZWdlci9wcmVmZXJlbmNlc19sZWZ0X3BhbmVfd2VpZ2h0Ij4KIAogICAgICAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTZkcCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmNhY2hlQ29sb3JIaW50PSJAYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0PSI0OGRwIgpAQCAtNTgsMTUgKzYyLDIxIEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcmVmc19mcmFtZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMjAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSJAaW50ZWdlci9wcmVmZXJlbmNlc19yaWdodF9wYW5lX3dlaWdodCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSJAZGltZW4vcHJlZmVyZW5jZV9zY3JlZW5fc2lkZV9tYXJnaW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbiIKICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiID4KIAorICAgICAgICAgICAgPCEtLSBCcmVhZGNydW1iIGluc2VydGVkIGhlcmUsIGluIGNlcnRhaW4gc2NyZWVuIHNpemVzLiBJbiBvdGhlcnMsIGl0IHdpbGwgYmUgYW4KKyAgICAgICAgICAgICAgICBlbXB0eSBsYXlvdXQgb3IganVzdCBwYWRkaW5nLCBhbmQgUHJlZmVyZW5jZUFjdGl2aXR5IHdpbGwgcHV0IHRoZSBicmVhZGNydW1icyBpbgorICAgICAgICAgICAgICAgIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9icmVhZGNydW1ic19pbl9mcmFnbWVudCIgLz4KKwogICAgICAgICAgICAgPGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9wcmVmcyIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iLTFkaXAiCiAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CiAgICAgPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50X2xhcmdlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnRfbGFyZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQxODhlLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnRfbGFyZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0vKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCi0qKgotKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiPgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVycyIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbl9uZWdhdGl2ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMzJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMzJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMTAiPgotCi0gICAgICAgICAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNhY2hlQ29sb3JIaW50PSJAYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2s9InRydWUiIC8+Ci0KLSAgICAgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xpc3RfZm9vdGVyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIiAvPgotCi0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ByZWZzX2ZyYW1lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIyMCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSJAZGltZW4vcHJlZmVyZW5jZV9zY3JlZW5fc2lkZV9tYXJnaW4iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE2ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNmRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2F0dHIvZGV0YWlsc0VsZW1lbnRCYWNrZ3JvdW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgPgotCi0gICAgICAgICAgICA8IS0tIEJyZWFkY3J1bWIgaW5zZXJ0ZWQgaGVyZSAtLT4KLSAgICAgICAgICAgIDxhbmRyb2lkLmFwcC5GcmFnbWVudEJyZWFkQ3J1bWJzCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGl0bGUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI3MmRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI4ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGxlZnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNDhkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjQ4ZGlwIgotICAgICAgICAgICAgICAgIC8+Ci0KLSAgICAgICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIzMmRpcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjMyZGlwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iIzQwNDA0MCIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgPGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9wcmVmcyIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iLTFkaXAiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9idXR0b25fYmFyIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2JvdHRvbV9iYXIiCi0gICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tfYnV0dG9uIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19idG5fYmFjayIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JhY2tfYnV0dG9uX2xhYmVsIgotICAgICAgICAvPgotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSI+Ci0KLSAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9za2lwX2J1dHRvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2tpcF9idXR0b25fbGFiZWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgLz4KLQotICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHRfYnV0dG9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVSaWdodD0iQGRyYXdhYmxlL2ljX2J0bl9uZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9uZXh0X2J1dHRvbl9sYWJlbCIKLSAgICAgICAgICAgIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2ZyYWdtZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2ZyYWdtZW50LnhtbAppbmRleCA0MDQ0MzcxLi45ODY1MzZlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9mcmFnbWVudC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfZnJhZ21lbnQueG1sCkBAIC0yOCw2ICsyOCwxMCBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iQGRpbWVuL3ByZWZlcmVuY2VfZnJhZ21lbnRfcGFkZGluZ19ib3R0b20iCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9wcmVmZXJlbmNlX2ZyYWdtZW50X3BhZGRpbmdfc2lkZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IkBkaW1lbi9wcmVmZXJlbmNlX2ZyYWdtZW50X3BhZGRpbmdfc2lkZSIKICAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCiAgICAgICAgIGFuZHJvaWQ6Y2FjaGVDb2xvckhpbnQ9IkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50IgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfZnJhZ21lbnRfbGFyZ2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfZnJhZ21lbnRfbGFyZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4NGZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2ZyYWdtZW50X2xhcmdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0vKgotKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X3JlbW92ZUJvcmRlcnM9InRydWUiPgotCi0gICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMGRpcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0OGRpcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMzJkaXAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzMmRpcCIKLSAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6Y2FjaGVDb2xvckhpbnQ9IkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50IgotICAgICAgICBhbmRyb2lkOnNjcm9sbGJhckFsd2F5c0RyYXdWZXJ0aWNhbFRyYWNrPSJ0cnVlIiAvPgotCi0gICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uX2JhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9ib3R0b21fYmFyIgotICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgotCi0gICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9iYWNrX2J1dHRvbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfYnRuX2JhY2siCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iM2RpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9iYWNrX2J1dHRvbl9sYWJlbCIKLSAgICAgICAgLz4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiPgotCi0gICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc2tpcF9idXR0b24iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NraXBfYnV0dG9uX2xhYmVsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgIC8+Ci0KLSAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0X2J1dHRvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUmlnaHQ9IkBkcmF3YWJsZS9pY19idG5fbmV4dCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iM2RpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbmV4dF9idXR0b25fbGFiZWwiCi0gICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX3ZpZXcueG1sCmluZGV4IGZhY2U4YjIuLjk5ZmRmNWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX3ZpZXcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX3ZpZXcueG1sCkBAIC0zMyw4ICszMyw4IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIyZGlwIgogICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iMGRpcCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgotICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeSIKICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgogICAgIC8+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCmluZGV4IDc2NGVjODUuLmNhYjQzYWMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbApAQCAtNDEyLDYgKzQxMiwxMCBAQAogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0T3JpZW50YXRpb24gKDMzNjU5NDc3MTcxNjM4NjY4NDQpIC0tPgogICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJMYWF0IFwnbiBwcm9ncmFtIHRvZSBvbSBkaWUgc2tlcm0gdGUgZW5pZ2UgdHlkIHRlIGRyYWFpLiBCZWhvb3J0IHZpciBnZXdvbmUgcHJvZ3JhbW1lIG5vb2l0IG5vZGlnIHRlIHdlZXMgbmllLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMgKDQyNTU0NjcyNTU0ODg2NTM4NTQpIC0tPgogICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IkxhYXQgcHJvZ3JhbSB0b2Ugb20gdGUgdmVyc29layBkYXQgZGllIHZvb3JzaWVuZGUgbWF0ZXJpYWFsIGFhbiBhbGxlIGFhbmhvdWRlbmRlIHByb3Nlc3NlIGdlc3R1dXIgd29yZC4iPC9zdHJpbmc+CkBAIC0xMjM1LDYgKzEyMzksMTIgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgogICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNtdl9hcHBsaWNhdGlvbiAoMjk1NTgzODA0MzYxMjM2Mjg4KSAtLT4KICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNtdl9wcm9jZXNzICg1MTIwMzk3MDEyMDQ3NDYyNDQ2KSAtLT4KQEAgLTE1NDAsNCArMTU1MCw2IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdG9yYWdlX3VzYiAoMzAxNzk1NDA1OTUzODUxNzI3OCkgLS0+CiAgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKaW5kZXggOWI2NzdjMi4uYjk3YmM3YSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCkBAIC0zOTYsNiArMzk2LDEwIEBACiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRPcmllbnRhdGlvbiAoMzM2NTk0NzcxNzE2Mzg2Njg0NCkgLS0+CiAgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IuGJteGMjeGJoOGIq+GLjSDhiaDhiJvhipXhipvhi43hiJ0g4Yiw4YuT4Ym1IOGLqOGIm+GLq+GKleGIm+GIveGKqOGIreGKqOGIquGLq+GIiOGImOGIiOGLiOGMpSDhi63hjYjhiYXhi7PhiI3hjaLhiIjhiJjhi7DhiaDhipsg4Ym14YyN4Ymg4Yir4YuO4Ym9IOGJoOGNjeGNgeGInSDhiqDhi6vhiLXhjYjhiI3hjI3hiJ3hjaIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzICg0MjU1NDY3MjU1NDg4NjUzODU0KSAtLT4KICAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiLhibXhjI3hiaDhiKvhi47hib0g4YiI4YiB4YiJ4YidIOGJsOGKqOGJs+GJs+GLrSDhiILhi7Dhibbhib0g4YiN4Yqo4YuNIOGLqOGImuGLq+GJgOGIreGJp+GJuOGLjSDhiLLhjI3hipPhiI7hib3hipUg4YiI4YiY4Yyg4Yuo4YmFIOGLreGNiOGJheGLs+GIjeGNoiI8L3N0cmluZz4KQEAgLTExNTQsNiArMTE1OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i4Ym14YyN4Ymg4YirIOGJsOGLmOGLi+GLjeGIr+GIjSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDhiqXhi6jhiIThi7Ag4YqQ4YuN4Y2iIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IOGJoOGLi+GKk+GKkOGJtSDhi6jhibDhipDhiLPhi43hjaIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i4Ym14YyN4Ymg4Yir4YuNIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4oPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+IOGIguGLsOGJtSkg4Ymg4Yir4Yi1IOGJsOGKkOGIs+GIuiBTdHJpY3RNb2RlIOGNluGIiuGIsuGKlSDhi63hibDhiIvhiIjhjYvhiI3hjaIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLhiILhi7DhibEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IOGJoOGIq+GItSDhibDhipDhiLPhiLogU3RyaWN0TW9kZSDhjZbhiIrhiLLhipUg4Yut4Ymw4YiL4YiI4Y2L4YiN4Y2iIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiDhiqDhiILhi7UiPC9zdHJpbmc+CkBAIC0xNDIzLDQgKzE0MzMsNiBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3RvcmFnZV91c2IgKDMwMTc5NTQwNTk1Mzg1MTcyNzgpIC0tPgogICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sCmluZGV4IDY3OTUzNDguLjhkNWVjYjggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+ItmE2YTYs9mF2KfYrSDZhNmE2YXYp9mE2YMg2KjYpdix2LPYp9mEINin2YTYo9mH2K/Yp9mBINil2YTZiSDYo9it2K8g2YXYtNix2YHZiiDYp9mE2KzZh9in2LIuINmE2Kcg2YrYrNioINin2LPYqtiu2K/Yp9mF2Ycg2LnZhNmJINin2YTYpdi32YTYp9mCINmE2YTYqti32KjZitmC2KfYqiDYp9mE2LnYp9iv2YrYqS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+Itiq2LrZitmK2LEg2KfYqtis2KfZhyDYp9mE2LTYp9i02KkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLZhNmE2LPZhdin2K0g2YTYqti32KjZitmCINmF2Kcg2KjYqti62YrZitixINiq2K/ZiNmK2LEg2KfZhNi02KfYtNipINmB2Yog2KPZiiDZiNmC2KouINmE2Kcg2YrYrNioINin2LPYqtiu2K/Yp9mF2Ycg2LnZhNmJINin2YTYpdi32YTYp9mCINmE2YTYqti32KjZitmC2KfYqiDYp9mE2LnYp9iv2YrYqS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4i2KXYsdiz2KfZhCDYpdi02KfYsdin2KogTGludXgg2YTZhNiq2LfYqNmK2YLYp9iqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiLZhNmE2LPZhdin2K0g2YTZhNiq2LfYqNmK2YIg2KjYt9mE2Kgg2KXYsdiz2KfZhCDYp9mE2KXYtNin2LHYqSDYp9mE2YXYstmI2ZHYr9ipINmE2KzZhdmK2Lkg2KfZhNi52YXZhNmK2KfYqiDYp9mE2YXYs9iq2YXYsdipLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+Itiq2LTYutmK2YQg2KfZhNiq2LfYqNmK2YIg2K/Yp9im2YXZi9inIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i2KrZhdiqINil2LnYp9iv2Kkg2KrZiNis2YrZhyDYp9mE2KrYt9io2YrZgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDZgtmK2K8g2KfZhNiq2LTYutmK2YQg2KfZhNii2YYuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLYqtmFINiq2LTYutmK2YQgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDZhdmGINin2YTYo9i12YQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+Itin2YbYqtmH2YMg2KfZhNiq2LfYqNmK2YIgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAo2KfZhNi52YXZhNmK2KkgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDYs9mK2KfYs9ipLlN0cmljdE1vZGUg2KfZhNmF2YHYsdmI2LbYqSDYsNin2KrZitmL2KcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i2KfZhtiq2YfZg9iqINin2YTYudmF2YTZitipIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDYs9mK2KfYs9ipIFN0cmljdE1vZGUg2KfZhNmF2YHYsdmI2LbYqSDYsNin2KrZitmL2KcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiDZiti52YXZhCI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+ItmI2K3Yr9ipINin2YTYqtiu2LLZitmGINin2YTYr9in2K7ZhNmK2KkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4i2KjYt9in2YLYqSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+ItmI2K3Yr9ipINiq2K7YstmK2YYgVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbAppbmRleCA0NzEwMjI2Li5iNDNiNTBmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiLQoNCw0LfRgNC10YjQsNCy0LAg0L3QsCDQv9GA0LjRgtC10LbQsNGC0LXQu9GPINC00LAg0LjQt9C/0YDQsNGJ0LAg0L3QsNC80LXRgNC10L3QuNGPINC00L4g0LDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YAg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4uINCd0L7RgNC80LDQu9C90LjRgtC1INC/0YDQuNC70L7QttC10L3QuNGPINCx0Lgg0YLRgNGP0LHQstCw0LvQviDQvdC40LrQvtCz0LAg0LTQsCDQvdC1INGB0LUg0L3Rg9C20LTQsNGP0YIg0L7RgiDRgtC+0LLQsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+ItC/0YDQvtC80Y/QvdCwINC90LAg0L7RgNC40LXQvdGC0LDRhtC40Y/RgtCwINC90LAg0LXQutGA0LDQvdCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4i0KDQsNC30YDQtdGI0LDQstCwINC90LAg0L/RgNC40LvQvtC20LXQvdC40LXRgtC+INC00LAg0L/RgNC+0LzQtdC90Y8g0L7RgNC40LXQvdGC0LDRhtC40Y/RgtCwINC90LAg0LXQutGA0LDQvdCwINC/0L4g0LLRgdGP0LrQviDQstGA0LXQvNC1LiDQndC+0YDQvNCw0LvQvdC40YLQtSDQv9GA0LjQu9C+0LbQtdC90LjRjyDQsdC4INGC0YDRj9Cx0LLQsNC70L4g0L3QuNC60L7Qs9CwINC00LAg0L3QtSDRgdC1INC90YPQttC00LDRj9GCINC+0YIg0YLQvtCy0LAuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ItC40LfQv9GA0LDRidCw0L3QtSDQvdCwINGB0LjQs9C90LDQu9C4INC+0YIgTGludXgg0LTQviDQv9GA0LjQu9C+0LbQtdC90LjRj9GC0LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+ItCg0LDQt9GA0LXRiNCw0LLQsCDQvdCwINC/0YDQuNC70L7QttC10L3QuNC10YLQviDQtNCwINC/0L7QtNCw0LTQtSDQt9Cw0Y/QstC60LAg0L/RgNC10LTQvtGB0YLQsNCy0LXQvdC40Y/RgiDRgdC40LPQvdCw0Lsg0LTQsCDRgdC1INC40LfQv9GA0LDRgtC4INC00L4g0LLRgdC40YfQutC4INC/0L7RgdGC0L7Rj9C90L3QuCDQv9GA0L7RhtC10YHQuC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiLQt9Cw0LTQsNCy0LDQvdC1INC90LAg0L/QvtGB0YLQvtGP0L3QvdC+INC40LfQv9GK0LvQvdC10L3QuNC1INC90LAg0L/RgNC40LvQvtC20LXQvdC40LXRgtC+Ijwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i0J/RgNC40LvQvtC20LXQvdC40LXRgtC+INGB0LUg0L/RgNC10L3QsNGB0L7Rh9C4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+INGB0LUg0LjQt9C/0YrQu9C90Y/QstCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4i0J/RitGA0LLQvtC90LDRh9Cw0LvQvdC+INCx0LUg0YHRgtCw0YDRgtC40YDQsNC90L46IDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+ItCf0YDQuNC70L7QttC10L3QuNC10YLQviA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjQv9GA0L7RhtC10YEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDQvdCw0YDRg9GI0Lgg0L/RgNCw0LLQuNC70L7RgtC+INC30LAg0YHRgtGA0LjQutGC0LXQvSDRgNC10LbQuNC8LCDQvdCw0LvQvtC20LXQvdC+INC+0YIg0YHQsNC80L7RgtC+INC90LXQs9C+LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+ItCf0YDQvtGG0LXRgdGK0YIgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+INC90LDRgNGD0YjQuCDQv9GA0LDQstC40LvQvtGC0L4g0LfQsCDRgdGC0YDQuNC60YLQtdC9INGA0LXQttC40LwsINC90LDQu9C+0LbQtdC90L4g0L7RgiDRgdCw0LzQuNGPINC90LXQs9C+LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g0YHQtSDQuNC30L/RitC70L3Rj9Cy0LAiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiLQktGK0YLRgNC10YjQvdC+INGF0YDQsNC90LjQu9C40YnQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRCDQutCw0YDRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCINGF0YDQsNC90LjQu9C40YnQtSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKaW5kZXggZTJhZWM1Ni4uMjk0N2I5MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iUGVybWV0IGFsIHRpdHVsYXIgZW52aWFyIGludGVuY2lvbnMgYSB1biBhZG1pbmlzdHJhZG9yIGRlbCBzaXN0ZW1hLiBObyBzXCdoYXVyaWEgZGUgbmVjZXNzaXRhciBtYWkgcGVyIGEgbGVzIGFwbGljYWNpb25zIG5vcm1hbHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJjYW52aWFyIGxcJ29yaWVudGFjacOzIGRlIGxhIHBhbnRhbGxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iUGVybWV0IGEgdW5hIGFwbGljYWNpw7MgY2FudmlhciBlbCBnaXIgZGUgbGEgcGFudGFsbGEgZW4gcXVhbHNldm9sIG1vbWVudC4gTm8gc1wnaGF1cmlhIGRlIG5lY2Vzc2l0YXIgbWFpIHBlciBhIGxlcyBhcGxpY2FjaW9ucyBub3JtYWxzLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJlbnZpYXIgc2VueWFscyBMaW51eCBhIGxlcyBhcGxpY2FjaW9ucyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iUGVybWV0IGEgbFwnYXBsaWNhY2nDsyBzb2zCt2xpY2l0YXIgcXVlIGVsIHNlbnlhbCBzdWJtaW5pc3RyYXQgc1wnZW52acOvIGEgdG90cyBlbHMgcHJvY2Vzc29zIHBlcnNpc3RlbnRzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImZlciBxdWUgbFwnYXBsaWNhY2nDsyBzXCdleGVjdXRpIHNlbXByZSI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwbGljYWNpw7MgcmVkaXJpZ2lkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBzXCdlc3TDoCBleGVjdXRhbnQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGVzIHZhIGluaWNpYXIgb3JpZ2luYWxtZW50LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMXCdhcGxpY2FjacOzIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2PDqXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYSBpbmNvbXBsZXJ0IGxhIHNldmEgcG9sw610aWNhIGF1dG9pbXBvc2FkYSBkZSBtb2RlIGVzdHJpY3RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkVsIHByb2PDqXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIGluY29tcGxlcnQgbGEgc2V2YSBwb2zDrXRpY2EgZGUgbW9kZSBlc3RyaWN0ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IHNcJ2VzdMOgIGV4ZWN1dGFudCI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkVtbWFnYXR6ZW1hdGdlIGludGVybiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJUYXJnZXRhIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iRW1tYWdhdHplbWF0Z2UgVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAppbmRleCA3ZjkyNDEwLi45MmRlYWNhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJVbW/FvsWIdWplIGRyxb5pdGVsaSBvcHLDoXZuxJtuw60gb2Rlc8OtbGF0IGluZm9ybWFjZSBzcHLDoXZjaSB6YcWZw616ZW7DrS4gQsSbxb5uw6kgYXBsaWthY2UgYnkgdG90byBvcHLDoXZuxJtuw60gbmlrZHkgbmVtxJtseSBwb8W+YWRvdmF0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iem3Em25hIG9yaWVudGFjZSBvYnJhem92a3kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJVbW/FvsWIdWplIGFwbGlrYWNpIGtkeWtvbGkgem3Em25pdCBvcmllbnRhY2kgb2JyYXpvdmt5LiBCxJvFvm7DqSBhcGxpa2FjZSBieSB0b3RvIG5hc3RhdmVuw60gbmlrZHkgbmVtxJtseSB2eXXFvsOtdmF0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJvZGVzbMOhbsOtIHNpZ27DoWzFryBMaW51eCBhcGxpa2Fjw61tIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJVbW/FvsWIdWplIGFwbGlrYWNpIHZ5xb7DoWRhdCB6YXNsw6Fuw60gcG9za3l0bnV0w6lobyBzaWduw6FsdSB2xaFlbSB0cnZhbMO9bSBwcm9jZXPFr20uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4idHJ2YWzDqSBzcHXFoXTEm27DrSBhcGxpa2FjZSI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwbGlrYWNlIHDFmWVzbcSbcm92w6FuYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iSmUgc3B1xaF0xJtuYSBhcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iUMWvdm9kbsSbIGJ5bGEgc3B1xaF0xJtuYSBhcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJBcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBwb3J1xaFpbGEgc3bDqSB2bGFzdG7DrSB2eW51Y2Vuw6kgesOhc2FkeSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gcG9ydcWhaWwgc3bDqSB2bGFzdG7DrSB2eW51Y2Vuw6kgesOhc2FkeSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iQsSbxb7DrSBhcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkludGVybsOtIMO6bG/FvmnFoXTEmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJLYXJ0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IsOabG/FvmnFoXTEmyBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCmluZGV4IDdiMDVhMGUuLmEzMTQ5YTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlRpbGxhZGVyIGJydWdlcmVuIGF0IHNlbmRlIGhlbnNpZ3RlciB0aWwgZW4gZW5oZWRzYWRtaW5pc3RyYXRvci4gQsO4ciBhbGRyaWcgdsOmcmUgbsO4ZHZlbmRpZ3QgZm9yIGFsbWluZGVsaWdlIHByb2dyYW1tZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJza2lmdCBza8Omcm1yZXRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gw6ZuZHJlciByb3RhdGlvbmVuIGFmIHNrw6ZybWVuIG7DpXIgc29tIGhlbHN0LiBCw7hyIGFsZHJpZyB2w6ZyZSBuw7hkdmVuZGlndCB0aWwgbm9ybWFsZSBwcm9ncmFtbWVyLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJzZW5kIExpbnV4LXNpZ25hbGVyIHRpbCBwcm9ncmFtbWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJUaWxsYWRlciwgYXQgcHJvZ3JhbW1ldCBrYW4gYW5tb2RlIG9tLCBhdCBkZXQgbGV2ZXJlZGUgc2lnbmFsIHNlbmRlcyB0aWwgYWxsZSB2ZWRob2xkZW5kZSBwcm9jZXNzZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4ibGFkIGFsdGlkIHByb2dyYW1tZXQga8O4cmUiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJQcm9ncmFtbWV0IGVyIG9tZGlyaWdlcmV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGvDuHJlciBudS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gYmxldiBvcHJpbmRlbGlndCDDpWJuZXQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IlByb2dyYW1tZXQgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGFyIG92ZXJ0csOlZHQgc2luIGVnZW4gU3RyaWN0TW9kZS1wb2xpdGlrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2Nlc3NlbiA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGFyIG92ZXJ0csOlZHQgc2luIGVnZW4gU3RyaWN0TW9kZS1wb2xpdGlrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gZXIgaSBnYW5nIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iSW50ZXJudCBsYWdlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRC1rb3J0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCLWxhZ2VyIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAppbmRleCAzOGM4ZjZjLi5iNmI2YmU1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJFcm3DtmdsaWNodCBkZW0gSGFsdGVyLCBJbnRlbnRzIGFuIGVpbmVuIEdlcsOkdGVhZG1pbmlzdHJhdG9yIHp1IHNlbmRlbi4gU29sbHRlIG5pZSBmw7xyIG5vcm1hbGUgQW53ZW5kdW5nZW4gYmVuw7Z0aWd0IHdlcmRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+IkJpbGRzY2hpcm1hdXNyaWNodHVuZyDDpG5kZXJuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZywgZGllIEJpbGRzY2hpcm1kcmVodW5nIGplZGVyemVpdCB6dSDDpG5kZXJuLiBTb2xsdGUgbmljaHQgZsO8ciBub3JtYWxlIEFud2VuZHVuZ2VuIGJlbsO2dGlndCB3ZXJkZW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+IkxpbnV4LVNpZ25hbGUgYW4gQW53ZW5kdW5nZW4gc2VuZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBkYXMgU2VuZGVuIGRlcyBnZWxpZWZlcnRlbiBTaWduYWxzIGFuIGFsbGUgYW5oYWx0ZW5kZW4gUHJvemVzc2UgenUgZm9yZGVybiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+IkFud2VuZHVuZ2VuIHBlcm1hbmVudCBhdXNmw7xocmVuIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQW53ZW5kdW5nIHVtZ2VsZWl0ZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gd2lyZCBqZXR6dCBhdXNnZWbDvGhydC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gd3VyZGUgdXJzcHLDvG5nbGljaCBnZXN0YXJ0ZXQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkRpZSBBbndlbmR1bmcgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAoUHJvemVzcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhdCBnZWdlbiBpaHJlIHNlbGJzdGVyend1bmdlbmUgU3RyaWN0TW9kZS1SaWNodGxpbmllIHZlcnN0b8OfZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iRGVyIFByb3plc3MgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhdCBnZWdlbiBzZWluZSBzZWxic3Rlcnp3dW5nZW5lIFN0cmljdE1vZGUtUmljaHRsaW5pZSB2ZXJzdG/Dn2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gbMOkdWZ0Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iSW50ZXJuZXIgU3BlaWNoZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0QtS2FydGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0ItU3BlaWNoZXIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCmluZGV4IDAxN2JlOWIuLmE1ZTEzZjEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg8+Ezr/OvSDOus6sz4TOv8+Hzr8gz4TOt869IM6xz4DOv8+Dz4TOv867zq4gz4PPhM+Mz4fPic69IM+DzrUgzq3Ovc6xzr0gzrTOuc6xz4fOtc65z4HOuc+Dz4TOriDPg8+Fz4POus61z4XOrs+CLiDOlM61zr0gzrjOsSDPh8+BzrXOuc6xz4PPhM61zq8gz4DOv8+Ezq0gzrPOuc6xIM66zrHOvc6/zr3Ouc66zq3PgiDOtc+GzrHPgc68zr/Os86tz4IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLOsc67zrvOsc6zzq4gz4DPgc6/z4POsc69zrHPhM6/zrvOuc+DzrzOv8+NIM6/zrjPjM69zrfPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOsc67zrvOsc6zzq4gz4TOt8+CIM+AzrXPgc65z4PPhM+Bzr/Phs6uz4Igz4TOt8+CIM6/zrjPjM69zrfPgiDOv8+Azr/Ouc6xzrTOrs+Azr/PhM61IM+Dz4TOuc6zzrzOri4gzpTOtc69IM61zq/Ovc6xzrkgzrHPgM6xz4HOsc6vz4TOt8+Ezr8gzrPOuc6xIM66zrHOvc6/zr3Ouc66zq3PgiDOtc+GzrHPgc68zr/Os86tz4IuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+Is6xz4DOv8+Dz4TOv867zq4gz4POt868zqzPhM+Jzr0gTGludXggz4POtSDOtc+GzrHPgc68zr/Os86tz4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOsc+Azr/Pg8+Ezr/Ou86uIM6xzrnPhM6uzrzOsc+Ezr/PgiDOs865zrEgz4TOt869IM6xz4DOv8+Dz4TOv867zq4gz4TOv8+FIM+AzrHPgc61z4fPjM68zrXOvc6/z4Ugz4POrs68zrHPhM6/z4Igz4POtSDPjM67zrXPgiDPhM65z4Igz4XPgM6sz4HPh86/z4XPg861z4IgzrTOuc6xzrTOuc66zrHPg86vzrXPgi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiLOtyDOtc+GzrHPgc68zr/Os86uIM69zrEgzrXOus+EzrXOu861zq/PhM6xzrkgz4PPhc69zrXPh8+Oz4IiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLOkc69zrHOus6xz4TOtc+NzrjPhc69z4POtyDOtc+GzrHPgc68zr/Os86uz4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Is6XIM61z4bOsc+BzrzOv86zzq4gPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDOtc66z4TOtc67zrXOr8+EzrHOuSDPhM+Oz4HOsS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Is6IzrPOuc69zrUgzrXOus66zq/Ovc63z4POtyDPgM+Bz47PhM6xIM+EzrfPgiDOtc+GzrHPgc68zr/Os86uz4IgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4izpcgzrXPhs6xz4HOvM6/zrPOriA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjOtM65zrXPgc6zzrHPg86vzrEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDPgM6xz4HOsc6yzq/Osc+DzrUgz4TOt869IM6xz4XPhM6/zrXPgM65zrLOsc67z4zOvM61zr3OtyDPgM6/zrvOuc+EzrnOus6uIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4izpcgzrTOuc61z4HOs86xz4POr86xIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDPgM6xz4HOsc6yzq/Osc+DzrUgz4TOt869IM6xz4XPhM6/zrXPgM65zrLOsc67z4zOvM61zr3OtyDPgM6/zrvOuc+EzrnOus6uIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiLOlyDOtc+GzrHPgc68zr/Os86uIDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IM61zrrPhM61zrvOtc6vz4TOsc65Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4izpXPg8+Jz4TOtc+BzrnOus+Mz4Igz4fPjs+Bzr/PgiDOsc+Azr/OuM6uzrrOtc+Fz4POt8+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+Is6azqzPgc+EzrEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiLOp8+Oz4HOv8+CIM6xz4DOv864zq7Ous61z4XPg863z4IgVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCmluZGV4IGFiZjE4ZjEuLmQ1ZWY5OGIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iQWxsb3dzIHRoZSBob2xkZXIgdG8gc2VuZCBpbnRlbnRzIHRvIGEgZGV2aWNlIGFkbWluaXN0cmF0b3IuIFNob3VsZCBuZXZlciBiZSBuZWVkZWQgZm9yIG5vcm1hbCBhcHBsaWNhdGlvbnMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJjaGFuZ2Ugc2NyZWVuIG9yaWVudGF0aW9uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNoYW5nZSB0aGUgcm90YXRpb24gb2YgdGhlIHNjcmVlbiBhdCBhbnkgdGltZS4gU2hvdWxkIG5ldmVyIGJlIG5lZWRlZCBmb3Igbm9ybWFsIGFwcGxpY2F0aW9ucy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ic2VuZCBMaW51eCBzaWduYWxzIHRvIGFwcGxpY2F0aW9ucyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iQWxsb3dzIGFwcGxpY2F0aW9uIHRvIHJlcXVlc3QgdGhhdCB0aGUgc3VwcGxpZWQgc2lnbmFsIGJlIHNlbnQgdG8gYWxsIHBlcnNpc3RlbnQgcHJvY2Vzc2VzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+Im1ha2UgYXBwbGljYXRpb24gYWx3YXlzIHJ1biI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwcGxpY2F0aW9uIHJlZGlyZWN0ZWQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gaXMgbm93IHJ1bm5pbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHdhcyBvcmlnaW5hbGx5IGxhdW5jaGVkLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJUaGUgYXBwbGljYXRpb24gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhcyB2aW9sYXRlZCBpdHMgc2VsZi1lbmZvcmNlZCBTdHJpY3RNb2RlIHBvbGljeS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJUaGUgcHJvY2VzcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGFzIHZpb2xhdGVkIGl0cyBzZWxmLWVuZm9yY2VkIFN0cmljdE1vZGUgcG9saWN5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gcnVubmluZyI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkludGVybmFsIFN0b3JhZ2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0QgQ2FyZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IlVTQiBzdG9yYWdlIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCmluZGV4IDE3OGUwNzYuLjNjYjYxZTQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iUGVybWl0ZSBxdWUgZWwgcHJvcGlldGFyaW8gZW52w61lIHN1cyBpbnRlbnRvcyBhIHVuIGFkbWluaXN0cmFkb3IgZGUgZGlzcG9zaXRpdm9zLiBObyBzZSBuZWNlc2l0YSBwYXJhIGxhcyBhcGxpY2FjaW9uZXMgbm9ybWFsZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJjYW1iaWFyIGxhIG9yaWVudGFjacOzbiBkZSBsYSBwYW50YWxsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IkFkbWl0ZSB1bmEgYXBsaWNhY2nDs24gcXVlIGNhbWJpYSBsYSByb3RhY2nDs24gZGUgbGEgcGFudGFsbGEgZW4gY3VhbHF1aWVyIG1vbWVudG8uIFNlIGRlYmUgZXZpdGFyIHV0aWxpemFybG8gZW4gYXBsaWNhY2lvbmVzIG5vcm1hbGVzLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJlbnZpYXIgc2XDsWFsZXMgZGUgTGludXggYSBsYXMgYXBsaWNhY2lvbmVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJBZG1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIHNvbGljaXRlIGVsIGVudsOtbyBkZSBsYSBzZcOxYWwgc3VtaW5pc3RyYWRhIGEgdG9kb3MgbG9zIHByb2Nlc29zIGNvbnRpbnVvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJoYWNlciBxdWUgc2llbXByZSBzZSBlamVjdXRlIGxhIGFwbGljYWNpw7NuIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iU2UgcmVkaXJpZ2nDsyBsYSBhcGxpY2FjacOzbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBzZSBlc3TDoSBlamVjdXRhbmRvIGFob3JhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBzZSBpbmljacOzIG9yaWdpbmFsbWVudGUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkxhIGFwbGljYWNpw7NuIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYSB2aW9sYWRvIHN1IHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG9pbXB1ZXN0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJFbCBwcm9jZXNvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYSB2aW9sYWRvIHN1IHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG9pbXB1ZXN0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGVuIGVqZWN1Y2nDs24iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJBbG1hY2VuYW1pZW50byBpbnRlcm5vIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlRhcmpldGEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJBbG1hY2VuYW1pZW50byBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmluZGV4IDk2OGEzYmUuLjlkYjgwY2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbApAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JhY2t1cCIgbXNnaWQ9IjQ3MDAxMzAyMjg2NTQ1MzkyMCI+ImNvbnRyb2xhciBsYXMgY29waWFzIGRlIHNlZ3VyaWRhZCB5IGxhcyByZXN0YXVyYWNpb25lcyBkZWwgc2lzdGVtYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JhY2t1cCIgbXNnaWQ9IjQ4Mzc0OTMwNjUxNTQyNTY1MjUiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBjb250cm9sZSBlbCBtZWNhbmlzbW8gZGUgY29waWEgZGUgc2VndXJpZGFkIHkgcmVzdGF1cmFjacOzbiBkZWwgc2lzdGVtYS4gRXN0ZSBwZXJtaXNvIG5vIGVzdMOhIGRlc3RpbmFkbyBhIGFwbGljYWNpb25lcyBub3JtYWxlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NvbmZpcm1fZnVsbF9iYWNrdXAiIG1zZ2lkPSI1NTU3MDcxMzI1ODA0NDY5MTAyIj4iY29uZmlybWFyIHJlc3RhdXJhY2nDs24gbyBjb3BpYSBkZSBzZWd1cmlkYWQgY29tcGxldGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jb25maXJtX2Z1bGxfYmFja3VwIiBtc2dpZD0iOTAwNTAxNzc1NDE3NTg5Nzk1NCI+IlBlcm1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIGluaWNpZSBsYSBpbnRlcmZheiBkZSB1c3VhcmlvIGRlIGNvbmZpcm1hY2nDs24gZGUgY29waWEgZGUgc2VndXJpZGFkIGNvbXBsZXRhIChuaW5ndW5hIGFwbGljYWNpw7NuIGRlYmUgdXRpbGl6YXJsYSkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjkwMDUwMTc3NTQxNzU4OTc5NTQiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBpbmljaWUgbGEgaW50ZXJmYXogZGUgdXN1YXJpbyBkZSBjb25maXJtYWNpw7NuIGRlIGNvcGlhIGRlIHNlZ3VyaWRhZCBjb21wbGV0YSAobmluZ3VuYSBhcGxpY2FjacOzbiBkZWJlcsOtYSB1dGlsaXphcmxhKS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2ludGVybmFsU3lzdGVtV2luZG93IiBtc2dpZD0iMjE0ODU2MzYyODE0MDE5MzIzMSI+Im1vc3RyYXIgdmVudGFuYXMgbm8gYXV0b3JpemFkYXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19pbnRlcm5hbFN5c3RlbVdpbmRvdyIgbXNnaWQ9IjU4OTUwODIyNjgyODQ5OTg0NjkiPiJQZXJtaXRlIGxhIGNyZWFjacOzbiBkZSB2ZW50YW5hcyBkZXN0aW5hZGFzIGFsIHVzbyBwb3IgcGFydGUgZGUgbGEgaW50ZXJmYXogZGUgdXN1YXJpbyBpbnRlcm5hIGRlbCBzaXN0ZW1hLiBObyBlc3TDoSBkZXN0aW5hZG8gYWwgdXNvIHBvciBwYXJ0ZSBkZSBhcGxpY2FjaW9uZXMgbm9ybWFsZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zeXN0ZW1BbGVydFdpbmRvdyIgbXNnaWQ9IjMzNzIzMjE5NDI5NDExNjgzMjQiPiJtb3N0cmFyIGFsZXJ0YXMgZGUgbml2ZWwgZGVsIHNpc3RlbWEiPC9zdHJpbmc+CkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iUGVybWl0ZSBlbnZpYXIgaW50ZW50b3MgYSB1biBhZG1pbmlzdHJhZG9yIGRlIGRpc3Bvc2l0aXZvcy4gRXN0ZSBwZXJtaXNvIG51bmNhIGRlYmVyw61hIHNlciBuZWNlc2FyaW8gcGFyYSBsYXMgYXBsaWNhY2lvbmVzIG5vcm1hbGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iY2FtYmlhciBvcmllbnRhY2nDs24gZGUgbGEgcGFudGFsbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gY2FtYmllIGxhIHJvdGFjacOzbiBkZSBsYSBwYW50YWxsYSBlbiBjdWFscXVpZXIgbW9tZW50by4gTm8gZGViZXLDrWEgc2VyIG5lY2VzYXJpbyBudW5jYSBwYXJhIGxhcyBhcGxpY2FjaW9uZXMgbm9ybWFsZXMuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ImVudmlhciBzZcOxYWxlcyBMaW51eCBhIGFwbGljYWNpb25lcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iUGVybWl0ZSBxdWUgbGEgYXBsaWNhY2nDs24gc29saWNpdGUgcXVlIGxhIHNlw7FhbCBzdW1pbmlzdHJhZGEgc2UgZW52w61lIGEgdG9kb3MgbG9zIHByb2Nlc29zIHBlcnNpc3RlbnRlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJoYWNlciBxdWUgbGEgYXBsaWNhY2nDs24gc2UgZWplY3V0ZSBzaWVtcHJlIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWNhY2nDs24gcmVkaXJlY2Npb25hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gc2UgZXN0w6EgZWplY3V0YW5kby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IkluaWNpYWxtZW50ZSwgc2UgaW5pY2nDsyBsYSBhcGxpY2FjacOzbiA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMYSBhcGxpY2FjacOzbiA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGEgaW5mcmluZ2lkbyBzdSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBhdXRvYXBsaWNhYmxlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkVsIHByb2Nlc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIGluZnJpbmdpZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2FwbGljYWJsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGVuIGVqZWN1Y2nDs24iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJBbG1hY2VuYW1pZW50byBpbnRlcm5vIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlRhcmpldGEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJBbG1hY2VuYW1pZW50byBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmluZGV4IGRmNzQ4Y2QuLjNmY2IyMWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+Itio2Ycg2Ybar9mH2K/Yp9ix2YbYr9mHINin2KzYp9iy2Ycg2YXbjCDYr9mH2K8g2YXZgdin2K8g2LHYpyDYqNmHINuM2qkg2LPYsdm+2LHYs9iqINiv2LPYqtqv2KfZhyDYp9ix2LPYp9mEINqp2YbYry4g2YfYsdqv2LIg2KjYsdin24wg2KjYsdmG2KfZhdmHINmH2KfbjCDZhdi52YXZiNmE24wg2YXZiNix2K8g2YbbjNin2LIg2YbbjNiz2KouIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLYqti624zbjNixINis2YfYqiDYtdmB2K3ZhyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+Itio2Ycg24zaqSDYqNix2YbYp9mF2Ycg2qnYp9ix2KjYsdiv24wg2KfYrNin2LLZhyDZhduMINiv2YfYryDahtix2K7YtCDYtdmB2K3ZhyDYsdinINiv2LEg2YfYsSDYstmF2KfZhtuMINiq2LrbjNuM2LEg2K/Zh9ivLiDZh9ix2q/YsiDYqNix2KfbjCDYqNix2YbYp9mF2Ycg2YfYp9uMINmF2LnZhdmI2YTbjCDZhdmI2LHYryDZhtuM2KfYsiDZhtuM2LPYqi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4i2KfYsdiz2KfZhCDYs9uM2q/Zhtin2YQg2YfYp9uMIExpbnV4INio2LHYp9uMINio2LHZhtin2YXZhyDZh9inIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiLYqNmHINio2LHZhtin2YXZhyDaqdin2LHYqNix2K/bjCDYp9is2KfYstmHINmF24wg2K/Zh9ivINiv2LHYrtmI2KfYs9iqINqp2YbYryDaqdmHINiz24zar9mG2KfZhCDYp9ix2KfYptmHINi02K/ZhyDYsdinINio2Ycg2KrZhdin2YUg2YHYsdin24zZhtiv2YfYp9uMINir2KfYqNiqINin2LHYs9in2YQg2qnZhtivLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+Itio2LHZhtin2YXZhyDZh9mF24zYtNmHINin2KzYsdinINi02YjYryI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+Itio2LHZhtin2YXZhyDZh9iv2KfbjNiqINmF2KzYr9ivINi02K8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g2KfaqdmG2YjZhiDYr9ixINit2KfZhCDYp9is2LHYpyDYp9iz2KouIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+INin2LIg2KfYqNiq2K/YpyDYsdin2Ycg2KfZhtiv2KfYstuMINi02K8uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+Itio2LHZhtin2YXZhyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjZvtix2K/Yp9iy2LQgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDYrti3INmF2LTbjCBTdHJpY3RNb2RlINin2KzYsdin24wg2K7ZiNiv2qnYp9ixINix2Kcg2YbZgti2INqp2LHYr9mHINin2LPYqi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLZgdix2KLbjNmG2K8gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+INiu2Lcg2YXYtNuMIFN0cmljdE1vZGUg2KfYrNix2KfbjCDYrtmI2K/aqdin2LEg2K7ZiNivINix2Kcg2YbZgti2INqp2LHYr9mHINin2LPYqi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+INiv2LEg2K3Yp9mEINin2KzYsdinIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4i2K3Yp9mB2LjZhyDYr9in2K7ZhNuMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+Itqp2KfYsdiqIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4i2K3Yp9mB2LjZhyBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCmluZGV4IDZiMDYxOTcuLjcwZTVmZjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IkFudGFhIHNvdmVsbHVrc2VuIGzDpGhldHTDpMOkIGt5c2VseWl0w6QgbGFpdHRlZW4gasOkcmplc3RlbG3DpG52YWx2b2phbGxlLiBFaSB0YXZhbGxpc3RlbiBzb3ZlbGx1a3NpZW4ga8OkeXR0w7bDtm4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJtdXV0YSBuw6R5dMO2biBzdXVudGFhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iQW50YWEgc292ZWxsdWtzZW4gdmFpaHRhYSBuw6R5dMO2biBzdXVudGFhIG1pbGxvaW4gdGFoYW5zYS4gRWkgdGF2YWxsaXN0ZW4gc292ZWxsdWtzaWVuIGvDpHl0dMO2w7ZuLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJsw6RoZXR0w6TDpCBzb3ZlbGx1a3NpaW4gTGludXgtc2lnbmFhbGVqYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iQW50YWEgc292ZWxsdWtzZW4gcHl5dMOkw6QsIGV0dMOkIHNpZ25hYWxpIGzDpGhldGV0w6TDpG4ga2Fpa2lsbGUga2lpbnRlaWxsZSBwcm9zZXNzZWlsbGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4iYXNldGEgc292ZWxsdXMgb2xlbWFhbiBqYXRrdXZhc3RpIGvDpHlubmlzc8OkIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iU292ZWxsdXMgdXVkZWxsZWVub2hqYXNpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IG9uIG55dCBrw6R5bm5pc3PDpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4ga8OkeW5uaXN0ZXR0aWluIGFsdW4gcGVyaW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IlNvdmVsbHVzIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb3Nlc3NpIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgb24gcmlra29udXQgaXRzZSBrw6R5dHTDtsO2biBvdHRhbWFhbnNhIFN0cmljdE1vZGUta8OkeXTDpG50w7bDpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9zZXNzaSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gb24gcmlra29udXQgaXRzZSBrw6R5dHTDtsO2biBvdHRhbWFhbnNhIFN0cmljdE1vZGUta8OkeXTDpG50w7bDpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGvDpHlubmlzc8OkIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iU2lzw6RpbmVuIHRhbGxlbm51c3RpbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qta29ydHRpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCLXRhbGxlbm51c3RpbGEiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmluZGV4IDdiMmY5YzAuLmM2MThlZGYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JhY2t1cCIgbXNnaWQ9IjQ3MDAxMzAyMjg2NTQ1MzkyMCI+ImNvbnRyw7RsZXIgbGEgc2F1dmVnYXJkZSBldCBsYSByZXN0YXVyYXRpb24gZHUgc3lzdMOobWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iYWNrdXAiIG1zZ2lkPSI0ODM3NDkzMDY1MTU0MjU2NTI1Ij4iQXV0b3Jpc2UgbFwnYXBwbGljYXRpb24gw6AgY29udHLDtGxlciBsZSBtw6ljYW5pc21lIGRlIHNhdXZlZ2FyZGUgZXQgZGUgcmVzdGF1cmF0aW9uIGR1IHN5c3TDqG1lLiBOZSBwYXMgdXRpbGlzZXIgcG91ciBsZXMgYXBwbGljYXRpb25zIHN0YW5kYXJkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjU1NTcwNzEzMjU4MDQ0NjkxMDIiPiJjb25maXJtZXIgdW5lIHNhdXZlZ2FyZGUgY29tcGzDqHRlIG91IHVuZSByZXN0YXVyYXRpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jb25maXJtX2Z1bGxfYmFja3VwIiBtc2dpZD0iOTAwNTAxNzc1NDE3NTg5Nzk1NCI+IlBlcm1ldCDDoCBsXCdhcHBsaWNhdGlvbiBkZSBsYW5jZXIgbFwnaW50ZXJmYWNlIHV0aWxpc2F0ZXVyIGRlIGNvbmZpcm1hdGlvbiBkZSBsYSBzYXV2ZWdhcmRlIGNvbXBsw6h0ZS4gU2V1bGVzIGNlcnRhaW5lcyBhcHBsaWNhdGlvbnMgcGV1dmVudCBiw6luw6lmaWNpZXIgZGUgY2V0dGUgcGVybWlzc2lvbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jb25maXJtX2Z1bGxfYmFja3VwIiBtc2dpZD0iOTAwNTAxNzc1NDE3NTg5Nzk1NCI+IlBlcm1ldCDDoCBsXCdhcHBsaWNhdGlvbiBkZSBsYW5jZXIgbFwnaW50ZXJmYWNlIGRlIGNvbmZpcm1hdGlvbiBkZSBzYXV2ZWdhcmRlIGNvbXBsw6h0ZS4gU2V1bGVzIGNlcnRhaW5lcyBhcHBsaWNhdGlvbnMgcGV1dmVudCBiw6luw6lmaWNpZXIgZGUgY2V0dGUgcGVybWlzc2lvbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2ludGVybmFsU3lzdGVtV2luZG93IiBtc2dpZD0iMjE0ODU2MzYyODE0MDE5MzIzMSI+IkFmZmljaGFnZSBkZSBmZW7DqnRyZXMgbm9uIGF1dG9yaXPDqWVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfaW50ZXJuYWxTeXN0ZW1XaW5kb3ciIG1zZ2lkPSI1ODk1MDgyMjY4Mjg0OTk4NDY5Ij4iUGVybWV0IGRlIGNyw6llciBkZXMgZmVuw6p0cmVzIGNvbsOndWVzIHBvdXIgbFwnaW50ZXJmYWNlIHV0aWxpc2F0ZXVyIGR1IHN5c3TDqG1lIGludGVybmUuIExlcyBhcHBsaWNhdGlvbnMgbm9ybWFsZXMgblwndXRpbGlzZW50IHBhcyBjZXR0ZSBmb25jdGlvbm5hbGl0w6kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zeXN0ZW1BbGVydFdpbmRvdyIgbXNnaWQ9IjMzNzIzMjE5NDI5NDExNjgzMjQiPiJBZmZpY2hhZ2UgZFwnYWxlcnRlcyBzeXN0w6htZSI8L3N0cmluZz4KQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJQZXJtZXQgw6AgbFwnYXBwbGljYXRpb24gZFwnZW52b3llciBkZXMgaW50ZW50aW9ucyDDoCBsXCdhZG1pbmlzdHJhdGV1ciBkZSBsXCdhcHBhcmVpbC4gTGVzIGFwcGxpY2F0aW9ucyBzdGFuZGFyZCBuZSBkZXZyYWllbnQgamFtYWlzIGF2b2lyIHJlY291cnMgw6AgY2V0dGUgZm9uY3Rpb25uYWxpdMOpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iQ2hhbmdlbWVudCBkXCdvcmllbnRhdGlvbiBkZSBsXCfDqWNyYW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIG1vZGlmaWVyIGxhIHJvdGF0aW9uIGRlIGxcJ8OpY3JhbiDDoCB0b3V0IG1vbWVudC4gTGVzIGFwcGxpY2F0aW9ucyBub3JtYWxlcyBuZSBkZXZyYWllbnQgamFtYWlzIGF2b2lyIHJlY291cnMgw6AgY2V0dGUgZm9uY3Rpb25uYWxpdMOpLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJFbnZvaSBkZSBzaWduYXV4IExpbnV4IGF1eCBhcHBsaWNhdGlvbnMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgZGVtYW5kZXIgcXVlIGxlIHNpZ25hbCBmb3Vybmkgc29pdCBlbnZvecOpIMOgIHRvdXMgbGVzIHByb2Nlc3N1cyBwZXJzaXN0YW50cy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJFeMOpY3V0aW9uIGRlIGxcJ2FwcGxpY2F0aW9uIGVuIGNvbnRpbnUiPC9zdHJpbmc+CkBAIC00NDksNyArNDUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbmZjIiBtc2dpZD0iNDQyMzM1MTI3NDc1Nzg3Njk1MyI+ImNvbnRyw7RsZXIgbGEgY29tbXVuaWNhdGlvbiBlbiBjaGFtcCBwcm9jaGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19uZmMiIG1zZ2lkPSI5MTcxNDAxODUxOTU0NDA3MjI2Ij4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkZSBjb21tdW5pcXVlciBhdmVjIGRlcyB0YWdzLCBjYXJ0ZXMgZXQgbGVjdGV1cnMgcHJlbmFudCBlbiBjaGFyZ2UgbGEgY29tbXVuaWNhdGlvbiBlbiBjaGFtcCBwcm9jaGUgKE5GQykuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl92cG4iIG1zZ2lkPSI4MzQ1ODAwNTg0NTMyMTc1MzEyIj4iaW50ZXJjZXB0ZXIgZXQgbW9kaWZpZXIgbFwnZW5zZW1ibGUgZHUgdHJhZmljIHLDqXNlYXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY192cG4iIG1zZ2lkPSI1NjE3ODkzMDc4OTg5OTQ0MjE5Ij4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkXCdpbnRlcmNlcHRlciBldCBkXCdpbnNwZWN0ZXIgbFwnZW5zZW1ibGUgZHUgdHJhZmljIHLDqXNlYXUsIHBhciBleGVtcGxlIHBvdXIgw6l0YWJsaXIgdW5lIGNvbm5leGlvbiBWUE4uIERlcyBhcHBsaWNhdGlvbnMgbWFsdmVpbGxhbnRlcyBzb250IHN1c2NlcHRpYmxlcyBkZSBzdXJ2ZWlsbGVyLCByZWRpcmlnZXIgb3UgbW9kaWZpZXIgbGVzIHBhcXVldHMgcsOpc2VhdSDDoCB2b3RyZSBpbnN1LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3ZwbiIgbXNnaWQ9IjU2MTc4OTMwNzg5ODk5NDQyMTkiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRcJ2ludGVyY2VwdGVyIGV0IGRlIGNvbnRyw7RsZXIgbFwnZW5zZW1ibGUgZHUgdHJhZmljIHLDqXNlYXUsIHBhciBleGVtcGxlIHBvdXIgw6l0YWJsaXIgdW5lIGNvbm5leGlvbiBWUE4uIERlcyBhcHBsaWNhdGlvbnMgbWFsdmVpbGxhbnRlcyBzb250IHN1c2NlcHRpYmxlcyBkZSBzdXJ2ZWlsbGVyLCByZWRpcmlnZXIgb3UgbW9kaWZpZXIgbGVzIHBhcXVldHMgcsOpc2VhdSDDoCB2b3RyZSBpbnN1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+IkTDqXNhY3RpdmF0aW9uIGR1IHZlcnJvdWlsbGFnZSBkZXMgdG91Y2hlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIGTDqXNhY3RpdmVyIGxlIHZlcnJvdWlsbGFnZSBkZXMgdG91Y2hlcyBldCB0b3V0ZSBzw6ljdXJpdMOpIHBhciBtb3QgZGUgcGFzc2UuIEV4ZW1wbGXCoDogVm90cmUgdMOpbMOpcGhvbmUgZMOpc2FjdGl2ZSBsZSB2ZXJyb3VpbGxhZ2UgZHUgY2xhdmllciBsb3JzcXVlIHZvdXMgcmVjZXZleiB1biBhcHBlbCwgcHVpcyBsZSByw6lhY3RpdmUgbG9yc3F1ZSB2b3VzIHJhY2Nyb2NoZXouIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+IkxlY3R1cmUgZGVzIHBhcmFtw6h0cmVzIGRlIHN5bmNocm9uaXNhdGlvbiI8L3N0cmluZz4KQEAgLTQ5Miw4ICs0OTYsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiJJbmRpcXVlciBsZSBwcm94eSBnbG9iYWwgw6AgdXRpbGlzZXIgcG91ciBjZSBtb2JpbGUgbG9yc3F1ZSBsZXMgcsOoZ2xlcyBzb250IGFjdGl2w6llcy4gU2V1bCBsXCdhZG1pbmlzdHJhdGV1ciBwcmluY2lwYWwgZHUgbW9iaWxlIHBldXQgZMOpZmluaXIgbGUgcHJveHkgZ2xvYmFsIHV0aWxpc8OpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9leHBpcmVQYXNzd29yZCIgbXNnaWQ9Ijg4NTI3OTE1MTg0NzI1NDA1NiI+IkTDqWZpbmlyIGV4cC4gbW90IHBhc3NlIHZlcnIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19leHBpcmVQYXNzd29yZCIgbXNnaWQ9IjQ4NDQ0MzAzNTQyMjQ4MjIwNzQiPiJDb250csO0bGVyIGxhIGZyw6lxdWVuY2UgZGUgbW9kaWZpY2F0aW9uIGR1IG1vdCBkZSBwYXNzZSBkZSB2ZXJyb3VpbGxhZ2UgZGUgbFwnw6ljcmFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2VuY3J5cHRlZFN0b3JhZ2UiIG1zZ2lkPSI4OTAxMzI2MTk5OTA5MTMyOTE1Ij4iRMOpZmluaXIgY3J5cHRhZ2UgZHUgc3RvY2thZ2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2VuY3J5cHRlZFN0b3JhZ2UiIG1zZ2lkPSIyNTA0OTg0NzMyNjMxNDc5Mzk5Ij4iRXhpZ2VyIHF1ZSBsZXMgZG9ubsOpZXMgZFwnYXBwbGljYXRpb24gc3RvY2vDqWVzIHNvaWVudCBjcnlwdMOpZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZW5jcnlwdGVkU3RvcmFnZSIgbXNnaWQ9Ijg5MDEzMjYxOTk5MDkxMzI5MTUiPiJEw6lmaW5pciBjaGlmZnJlbWVudCBkdSBzdG9ja2FnZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZW5jcnlwdGVkU3RvcmFnZSIgbXNnaWQ9IjI1MDQ5ODQ3MzI2MzE0NzkzOTkiPiJFeGlnZXIgcXVlIGxlcyBkb25uw6llcyBkXCdhcHBsaWNhdGlvbiBzdG9ja8OpZXMgc29pZW50IGNoaWZmcsOpZXMiPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJEb21pY2lsZSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsZSI8L2l0ZW0+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcHBsaWNhdGlvbiByZWRpcmlnw6llIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGVzdCBtYWludGVuYW50IGxhbmPDqWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiJBcHBsaWNhdGlvbiBsYW5jw6llIGluaXRpYWxlbWVudMKgOiA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMXCdhcHBsaWNhdGlvbiA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzdXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBhIGVuZnJlaW50IHNlcyBwcm9wcmVzIHLDqGdsZXMgZHUgbW9kZSBzdHJpY3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iTGUgcHJvY2Vzc3VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBhIGVuZnJlaW50IHNlcyBwcm9wcmVzIHLDqGdsZXMgZHUgbW9kZSBzdHJpY3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPsKgZW4gY291cnMgZFwnZXjDqWN1dGlvbiI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+Ik3DqW1vaXJlIGRlIHN0b2NrYWdlIGludGVybmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iQ2FydGUgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJNw6ltb2lyZSBkZSBzdG9ja2FnZSBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaDcyMGRwL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWg3MjBkcC9kaW1lbnMueG1sCmluZGV4IDdmNDM5NDYuLmMwOWNiNWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaDcyMGRwL2RpbWVucy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1oNzIwZHAvZGltZW5zLnhtbApAQCAtMjEsNCArMjEsMTAgQEAKICAgICA8ZGltZW4gbmFtZT0iYWxlcnRfZGlhbG9nX3RpdGxlX2hlaWdodCI+NTRkaXA8L2RpbWVuPgogICAgIDwhLS0gRGlhbG9nIGJ1dHRvbiBiYXIgaGVpZ2h0IC0tPgogICAgIDxkaW1lbiBuYW1lPSJhbGVydF9kaWFsb2dfYnV0dG9uX2Jhcl9oZWlnaHQiPjU0ZGlwPC9kaW1lbj4KKyAgICA8IS0tIFByZWZlcmVuY2UgZnJhZ21lbnQgcGFkZGluZywgYm90dG9tIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwcmVmZXJlbmNlX2ZyYWdtZW50X3BhZGRpbmdfYm90dG9tIj4xNmRwPC9kaW1lbj4KKyAgICA8IS0tIFByZWZlcmVuY2UgYWN0aXZpdHkgdG9wIG1hcmdpbiAtLT4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9zY3JlZW5fdG9wX21hcmdpbiI+MTZkcDwvZGltZW4+CisgICAgPCEtLSBQcmVmZXJlbmNlIGFjdGl2aXR5IGJvdHRvbSBtYXJnaW4gLS0+CisgICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2Vfc2NyZWVuX2JvdHRvbV9tYXJnaW4iPjE2ZHA8L2RpbWVuPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAppbmRleCA5YTNlYjBlLi5mMTdhMjcyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKQEAgLTI0MCw3ICsyNDAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmF0dGVyeVN0YXRzIiBtc2dpZD0iNTg0NzMxOTgyMzc3MjIzMDU2MCI+Ik9tb2d1xId1amUgaXptamVudSBwcmlrdXBsamVuZSBzdGF0aXN0aWtlIG8gYmF0ZXJpamkuIE5pamUgemEgdXBvdHJlYnUgbmEgdW9iacSNYWplbmltIGFwbGlrYWNpamFtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JhY2t1cCIgbXNnaWQ9IjQ3MDAxMzAyMjg2NTQ1MzkyMCI+InNpZ3Vybm9zbmEga29waWphIGkgb3BvcmF2YWsgbmFkem9ybm9nIHN1c3RhdmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iYWNrdXAiIG1zZ2lkPSI0ODM3NDkzMDY1MTU0MjU2NTI1Ij4iQXBsaWthY2lqaSBvbW9ndcSHdWplIG5hZHpvciBuYWQgbWVoYW5pem1vbSBzdHZhcmFuamEgc2lndXJub3NuaWgga29waWphIGkgb3BvcmF2a2Egc3VzdGF2YS4gTmlqZSB6YSB1cG90cmVidSBuYSB1b2JpxI1hamVuaW0gYXBsaWthY2lqYW1hLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjU1NTcwNzEzMjU4MDQ0NjkxMDIiPiJwb3R2cmRpdGkgcG90cHVudSBzaWd1cm5vc251IGtvcGlqdSBpbGkgdnJhdGl0aSByYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NvbmZpcm1fZnVsbF9iYWNrdXAiIG1zZ2lkPSI1NTU3MDcxMzI1ODA0NDY5MTAyIj4icG90dnJkaXRpIHBvc3R1cGFrIGl6cmFkZSBzaWd1cm5vc25lIGtvcGlqZSBpbGkgb2Jub3ZlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjkwMDUwMTc3NTQxNzU4OTc5NTQiPiJPbW9ndcSHdWplIGFwbGlrYWNpamkgcG9rcmV0YW5qZSBrb3Jpc25pxI1rb2cgc3XEjWVsamEgemEgcG90dnJkdSBwb3RwdW5lIHNpZ3Vybm9zbmUga29waWplLiBBcGxpa2FjaWplIG5lIGJpIHRyZWJhbGUgdXBvdHJlYmxqYXZhdGkgdHUgb3BjaWp1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfaW50ZXJuYWxTeXN0ZW1XaW5kb3ciIG1zZ2lkPSIyMTQ4NTYzNjI4MTQwMTkzMjMxIj4icHJpa2F6IG5lb3ZsYcWhdGVuaWggcHJvem9yYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2ludGVybmFsU3lzdGVtV2luZG93IiBtc2dpZD0iNTg5NTA4MjI2ODI4NDk5ODQ2OSI+Ik9tb2d1xId1amUgc3R2YXJhbmplIHByb3pvcmEga29qaW1hIGplIG5hbWplbmEgZGEgc2Uga29yaXN0ZSB1IGtvcmlzbmnEjWtvbSBzdcSNZWxqdSBpbnRlcm5vZyBzdXN0YXZhLiBOaWplIHphIHVwb3RyZWJ1IG5hIHVvYmnEjWFqZW5pbSBhcGxpa2FjaWphbWEuIjwvc3RyaW5nPgpAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+Ik5vc2l0ZWxqdSBvbW9ndcSHdWplIHNsYW5qZSBuYW1qZXJhIGFkbWluaXN0cmF0b3J1IHVyZcSRYWphLiBOaWthZCBuZSBiaSB0cmViYWxvIGtvcmlzdGl0aSB6YSB1b2JpxI1hamVuZSBhcGxpa2FjaWplLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4icHJvbWplbmEgb3JpamVudGFjaWplIHphc2xvbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJBcGxpa2FjaWppIG9tb2d1xId1amUgcHJvbWplbnUgcm90YWNpamUgemFzbG9uYSB1IHN2YWtvbSB0cmVudXRrdS4gTmlrYWQgbmUgYmkgdHJlYmFsbyBrb3Jpc3RpdGkgemEgdW9iacSNYWplbmUgYXBsaWthY2lqZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ic2xhbmplIExpbnV4IHNpZ25hbGEgdSBhcGxpa2FjaWp1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJBcGxpa2FjaWphbWEgb21vZ3XEh3VqZSB0cmHFvmVuamUgemFodGpldmEgZGEgc2UgZG9iaXZlbmkgc2lnbmFsIHBvxaFhbGplIG5hIHN2ZSB0cmFqbmUgcG9zdHVwa2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4idXZpamVrIHBva3JlbnV0YSBhcGxpa2FjaWphIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWthY2lqYSBwcmV1c21qZXJlbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gc2UgaXp2b2RpIHNhZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiJBcGxpa2FjaWphIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gcG9rcmVudXRhIGplIHBydmEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkFwbGlrYWNpamEgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgcHJla3LFoWlsYSBqZSBzdm9qZSB2bGFzdGl0byBwcmF2aWxvIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBwcmVrcsWhaW8gamUgc3ZvamUgdmxhc3RpdG8gcHJhdmlsbyBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iSXp2b2RpIHNlIDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iVW51dGFybmphIHBvaHJhbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qga2FydGljYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IlVTQiBwb2hyYW5hIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbAppbmRleCAxODQyNmY0Li4wYzJhZWYzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJMZWhldMWRdsOpIHRlc3ppIGEgaGFzem7DoWzDsyBzesOhbcOhcmEsIGhvZ3kgY8OpbG9rYXQga8O8bGRqw7ZuIGVneSBlc3prw7Z6a2V6ZWzFkW5lay4gQSBub3Jtw6FsIGFsa2FsbWF6w6Fzb2tuYWsgZXJyZSBzb2hhIG5pbmNzIHN6w7xrc8OpZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJrw6lwZXJuecWRIGlyw6FuecOhbmFrIG3Ds2Rvc8OtdMOhc2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJMZWhldMWRdsOpIHRlc3ppIGVneSBhbGthbG1hesOhcyBzesOhbcOhcmEgYSBrw6lwZXJuecWRIGVsZm9yZ2F0w6Fzw6FuYWsgbcOzZG9zw610w6Fzw6F0LiBBIG5vcm3DoWwgYWxrYWxtYXrDoXNva25hayBlcnJlIHNvaGEgbmluY3Mgc3rDvGtzw6lnZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4iTGludXggamVsZWsga8O8bGTDqXNlIGFsa2FsbWF6w6Fzb2tuYWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IkxlaGV0xZF2w6kgdGVzemkgYXogYWxrYWxtYXrDoXMgc3rDoW3DoXJhLCBob2d5IGEgbWVnYWRvdHQgamVsZXQgZWxrw7xsZGplIGF6IMO2c3N6ZXMgw6FsbGFuZMOzIGZvbHlhbWF0bmFrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImFsa2FsbWF6w6Fzb2sgZm9seWFtYXRvcyBmdXR0YXTDoXNhIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQWxrLiDDoXRpcsOhbnnDrXR2YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDDqXBwZW4gZnV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiB2b2x0IGVyZWRldGlsZWcgZWxpbmTDrXR2YS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiBhbGthbG1hesOhcyAoPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+IGZvbHlhbWF0KSBtZWdzw6lydGV0dGUgYXogw6FsdGFsYSBrw6lueXN6ZXLDrXRldHQgU3ppZ29yw7ogw7x6ZW1tw7NkIGlyw6FueWVsdmV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+Ijx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBmb2x5YW1hdCBtZWdzw6lydGV0dGUgYXogw6FsdGFsYSBrw6lueXN6ZXLDrXRldHQgU3ppZ29yw7ogw7x6ZW1tw7NkIGlyw6FueWVsdmV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gZnV0Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iQmVsc8WRIHTDoXJoZWx5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNELWvDoXJ0eWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0ItdMOhciI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKaW5kZXggZmRkNjczNS4uMDBlMmRkNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iTWVuZ2l6aW5rYW4gcGVtZWdhbmcgbWVuZ2lyaW1rYW4gdHVqdWFuIGtlcGFkYSBhZG1pbmlzdHJhdG9yIHBlcmFuZ2thdC4gVGlkYWsgZGlwZXJsdWthbiB1bnR1ayBhcGxpa2FzaSBub3JtYWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJ1YmFoIG9yaWVudGFzaSBsYXlhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+Ik1lbmdpemlua2FuIGFwbGlrYXNpIG1lbmd1YmFoIHJvdGFzaSBsYXlhciBrYXBhbiBzYWphLiBUaWRhayBkaXBlcmx1a2FuIHVudHVrIGFwbGlrYXNpIG5vcm1hbC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ia2lyaW0gc2lueWFsIExpbnV4IGtlIGFwbGlrYXNpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJNZW5naXppbmthbiBhcGxpa2FzaSBtZW1pbnRhIHNpbnlhbCB5YW5nIGRpYmVyaWthbiB1bnR1ayBkaWtpcmlta2FuIGtlIHNlbXVhIHByb3NlcyB5YW5nIGFkYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJqYWRpa2FuIGFwbGlrYXNpIHNlbGFsdSBiZXJqYWxhbiI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwbGlrYXNpIGRpYWxpaGthbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBzZWRhbmcgYmVyamFsYW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHRlbGFoIGRpbHVuY3Vya2FuIGFzbGlueWEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkFwbGlrYXNpIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb3NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIHRlbGFoIG1lbGFuZ2dhciBrZWJpamFrYW4gU3RyaWN0TW9kZSB5YW5nIGRpYmVybGFrdWthbiBzZWNhcmEgb3RvbWF0aXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvc2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiB0ZWxhaCBtZWxhbmdnYXIga2ViaWpha2FuIFN0cmljdE1vZGUgeWFuZyBkaWJlcmxha3VrYW4gc2VjYXJhIG90b21hdGlzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gYmVyamFsYW4iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJQZW55aW1wYW5hbiBJbnRlcm5hbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJLYXJ0dSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IlBlbnlpbXBhbmFuIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKaW5kZXggN2NmZjljOS4uMGQ3ODg2MSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmFja3VwIiBtc2dpZD0iNDcwMDEzMDIyODY1NDUzOTIwIj4iY29udHJvbGxvIGRlbCBiYWNrdXAgZGkgc2lzdGVtYSBlIHJpcHJpc3Rpbm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iYWNrdXAiIG1zZ2lkPSI0ODM3NDkzMDY1MTU0MjU2NTI1Ij4iQ29uc2VudGUgYWxsXCdhcHBsaWNhemlvbmUgZGkgY29udHJvbGxhcmUgaWwgbWVjY2FuaXNtbyBkaSBiYWNrdXAgZSByaXByaXN0aW5vIGRlbCBzaXN0ZW1hLiBEYSBub24gdXNhcmUgcGVyIG5vcm1hbGkgYXBwbGljYXppb25pLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjU1NTcwNzEzMjU4MDQ0NjkxMDIiPiJjb25mZXJtYSBkaSB1blwnb3BlcmF6aW9uZSBjb21wbGV0YSBkaSBiYWNrdXAgbyBkaSByaXByaXN0aW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjkwMDUwMTc3NTQxNzU4OTc5NTQiPiJDb25zZW50ZSBhbGxcJ2FwcGxpY2F6aW9uZSBkaSBsYW5jaWFyZSBsXCdpbnRlcmZhY2NpYSB1dGVudGUgZGkgY29uZmVybWEgZGVsIGJhY2t1cCBjb21wbGV0by4gTm9uIHV0aWxpenphYmlsZSBkYSBxdWFsc2lhc2kgYXBwbGljYXppb25lLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NvbmZpcm1fZnVsbF9iYWNrdXAiIG1zZ2lkPSI5MDA1MDE3NzU0MTc1ODk3OTU0Ij4iQ29uc2VudGUgYWxsXCdhcHBsaWNhemlvbmUgZGkgbGFuY2lhcmUgbFwnaW50ZXJmYWNjaWEgdXRlbnRlIGRpIGNvbmZlcm1hIGRlbCBiYWNrdXAgY29tcGxldG8uIE5vbiB1dGlsaXp6YXJlIHBlciBuZXNzdW5hIGFwcGxpY2F6aW9uZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2ludGVybmFsU3lzdGVtV2luZG93IiBtc2dpZD0iMjE0ODU2MzYyODE0MDE5MzIzMSI+InZpc3VhbGl6emF6aW9uZSBmaW5lc3RyZSBub24gYXV0b3JpenphdGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19pbnRlcm5hbFN5c3RlbVdpbmRvdyIgbXNnaWQ9IjU4OTUwODIyNjgyODQ5OTg0NjkiPiJDb25zZW50ZSBsYSBjcmVhemlvbmUgZGkgZmluZXN0cmUgZGVzdGluYXRlIGFsbFwndXNvIG5lbGxcJ2ludGVyZmFjY2lhIHV0ZW50ZSBkaSBzaXN0ZW1hIGludGVybmEuIERhIG5vbiB1c2FyZSBwZXIgbm9ybWFsaSBhcHBsaWNhemlvbmkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zeXN0ZW1BbGVydFdpbmRvdyIgbXNnaWQ9IjMzNzIzMjE5NDI5NDExNjgzMjQiPiJ2aXN1YWxpenphemlvbmUgYXZ2aXNpIGRpIHNpc3RlbWEiPC9zdHJpbmc+CkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iQ29uc2VudGUgbFwnaW52aW8gZGkgaW50ZW50IGEgdW4gYW1taW5pc3RyYXRvcmUgZGVsIGRpc3Bvc2l0aXZvLiBMXCdhdXRvcml6emF6aW9uZSBub24gZGV2ZSBtYWkgZXNzZXJlIG5lY2Vzc2FyaWEgcGVyIGxlIG5vcm1hbGkgYXBwbGljYXppb25pLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4ibW9kaWZpY2Egb3JpZW50YW1lbnRvIGRlbGxvIHNjaGVybW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgY2FtYmlhcmUgbGEgcm90YXppb25lIGRlbGxvIHNjaGVybW8gaW4gcXVhbHNpYXNpIG1vbWVudG8uIE5vbiBkb3ZyZWJiZSBlc3NlcmUgbWFpIG5lY2Vzc2FyaW8gcGVyIGxlIG5vcm1hbGkgYXBwbGljYXppb25pLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJpbnZpbyBzZWduYWxpIExpbnV6IGFsbGUgYXBwbGljYXppb25pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJDb25zZW50ZSBhbGxcJ2FwcGxpY2F6aW9uZSBkaSByaWNoaWVkZXJlIGxcJ2ludmlvIGRlbCBzZWduYWxlIGZvcm5pdG8gYSB0dXR0aSBpIHByb2Nlc3NpIHBlcnNpc3RlbnRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImVzZWN1emlvbmUgcGVybWFuZW50ZSBkZWxsZSBhcHBsaWNhemlvbmkiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcHBsaWNhemlvbmUgcmVpbmRpcml6emF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDDqCBvcmEgaW4gZXNlY3V6aW9uZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gZ2nDoCBhdnZpYXRhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMXCdhcHBsaWNhemlvbmUgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYSB2aW9sYXRvIGxhIG5vcm1hIFN0cmljdE1vZGUgYXV0b2ltcG9zdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iSWwgcHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIHZpb2xhdG8gbGEgbm9ybWEgU3RyaWN0TW9kZSBhdXRvaW1wb3N0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGluIGVzZWN1emlvbmUiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJBcmNoaXZpbyBpbnRlcm5vIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNjaGVkYSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IkFyY2hpdmlvIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKaW5kZXggZmQ4YWU0Ny4uNmI1MDk4MiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i157XkNek16nXqCDXnNee16nXqtee16kg15zXqdec15XXlyDXm9eV15XXoNeV16og15zXnteg15TXnCDXlNeq16fXny4g15zXkCDXkNee15XXqCDXnNeU15nXk9eo16kg15zXoteV15zXnSDXkdeZ15nXqdeV157XmdedINeo15LXmdec15nXnS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+Itep16DXlCDXkNeqINeb15nXldeV158g15TXnteh15oiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLXnteQ16TXqdeoINec15nXmdep15XXnSDXnNep16DXldeqINeQ16og16HXmdeR15XXkSDXlNee16HXmiDXkdeb15wg16LXqi4g15zXkCDXkNee15XXqCDXnNeU15nXk9eo16kg15zXoteV15zXnSDXkdeZ15nXqdeV157XmdedINeo15LXmdec15nXnS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4i16nXnNeXINeQ15XXqteV16ogTGludXgg15zXmdeZ16nXldee15nXnSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4i157XkNek16nXqCDXnNeZ15nXqdeV150g15zXkden16kg16nXlNeQ15XXqiDXlNee16HXldek16cg15nXmdep15zXlyDXnNeb15wg15TXqteU15zXmdeb15nXnSDXlNee16rXntep15vXmdedLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+IteU15LXk9eoINeQ16og15TXmdeZ16nXldedINec16TXoteV15wg16rXnteZ15MiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLXlNeZ15nXqdeV150g16DXldeq15Eg157Xl9eT16kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g16TXldei15wg15vXoteqLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDXlNeV16TXotecINeR157Xp9eV16guIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IteU15nXmdep15XXnSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjXqteU15zXmdeaIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikg15TXpNeoINeQ16og157Xk9eZ16DXmdeV16ogU3RyaWN0TW9kZSDXkdeQ15vXmdek15Qg16LXptee15nXqi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLXlNeq15TXnNeZ15ogPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+INeU16TXqCDXkNeqINee15PXmdeg15nXldeqIFN0cmljdE1vZGUg15HXkNeb15nXpNeUINei16bXnteZ16ouIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiDXpNeV16LXnCI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IteQ15fXodeV158g16TXoNeZ157XmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiLXm9eo15jXmdehIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4i15DXntem16LXmSDXkNeX16HXldefINee16HXldeSIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKaW5kZXggMTAwZDY4MS4uYmRhZDdiNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i44OH44OQ44Kk44K5566h55CG6ICF44G444GuaW50ZW5044Gu6YCB5L+h44KS5omA5pyJ6ICF44Gr6Kix5Y+v44GX44G+44GZ44CC6YCa5bi444Gu44Ki44OX44Oq44Kx44O844K344On44Oz44Gn44Gv5LiN6KaB44Gn44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLnlLvpnaLjga7lkJHjgY3jga7lpInmm7QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLjgYTjgaTjgafjgoLnlLvpnaLjga7lm57ou6LjgpLlpInmm7TjgZnjgovjgZPjgajjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgILpgJrluLjjga7jgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7Pjgavjga/jgb7jgaPjgZ/jgY/lv4XopoHjgYLjgorjgb7jgZvjgpPjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4iTGludXjjga7jgrfjgrDjg4rjg6vjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavpgIHkv6EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IuWPl+S/oeOBl+OBn+mbu+azouOCkue2mee2muODl+ODreOCu+OCueOBq+mAgeS/oeOBmeOCi+OBk+OBqOOCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+IuOCouODl+ODquOCseODvOOCt+ODp+ODs+OCkuW4uOOBq+Wun+ihjOOBmeOCiyI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IuOCouODl+ODquOBruODquODgOOCpOODrOOCr+ODiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuOBjOWun+ihjOS4reOBp+OBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuOBjOacgOWIneOBq+i1t+WLleOBl+OBpuOBhOOBvuOBl+OBn+OAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7M8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+77yI44OX44Ot44K744K5PHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+77yJ44GnU3RyaWN0TW9kZeODneODquOCt+ODvOmBleWPjeOBjOOBguOCiuOBvuOBl+OBn+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IuODl+ODreOCu+OCuTx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPuOBp1N0cmljdE1vZGXjg53jg6rjgrfjg7zpgZXlj43jgYzjgYLjgorjgb7jgZfjgZ/jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+44KS5a6f6KGM5LitIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4i5YaF6YOo44K544OI44Os44O844K4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNE44Kr44O844OJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNC44K544OI44Os44O844K4Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAppbmRleCAwZDVhNDFlLi41YTM1ODRhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiLrs7TsnKDsnpDqsIAg6riw6riwIOq0gOumrOyekOyXkOqyjCDsnbjthZDtirjrpbwg67O064K8IOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDsnbzrsJgg7JWg7ZSM66as7LyA7J207IWY7JeQ64qUIOygiOuMgOuhnCDtlYTsmpTtlZjsp4Ag7JWK7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4i7ZmU66m0IOuwqe2WpSDrs4Dqsr0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7Ja47KCc65Og7KeAIO2ZlOuptCDtmozsoITsnYQg67OA6rK97ZWgIOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDsnbzrsJgg7JWg7ZSM66as7LyA7J207IWY7JeQ64qUIOygiOuMgOuhnCDtlYTsmpTtlZjsp4Ag7JWK7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiLslaDtlIzrpqzsvIDsnbTshZjsl5AgTGludXgg7Iuc6re464SQIOuztOuCtOq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4i7JWg7ZSM66as7LyA7J207IWY7J20IOygnOqzteuQnCDsi5zqt7jrhJDsnYQg66qo65OgIOyYgeq1rCDtlITroZzshLjsiqTroZwg67O064K064+E66GdIOyalOyyre2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7ZWt7IOBIOyLpO2WieuQmOuPhOuhnSDshKTsoJUiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLslaDtlIzrpqzsvIDsnbTshZgg66as65SU66CJ7IWY65CoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+7J20KOqwgCkg7Iuk7ZaJIOykkeyeheuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IuybkOuemCA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+7J2EKOulvCkg7Iuk7ZaJ7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLslaDtlIzrpqzsvIDsnbTshZggPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPijtlITroZzshLjsiqQgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KeydtCjqsIApIOyekOyytCDsi5ztlokgU3RyaWN0TW9kZSDsoJXssYXsnYQg7JyE67CY7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+Iu2UhOuhnOyEuOyKpCg8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4p6rCAIOyekOyytCDsi5ztlokgU3RyaWN0TW9kZSDsoJXssYXsnYQg7JyE67CY7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g7Iuk7ZaJIOykkSI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IuuCtOu2gCDsoIDsnqXqs7XqsIQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qg7Lm065OcIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCIOyggOyepeyGjCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAppbmRleCA4ZGVmNTc4Li5kYmFhZDEzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbApAQCAtMjUsOCArMjUsOCBAQAogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X251bWVyaWMiPjYwZGlwPC9kaW1lbj4KICAgICA8IS0tIERlZmF1bHQgY29ycmVjdGlvbiBmb3IgdGhlIHNwYWNlIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgLS0+CiAgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX3NwYWNlYmFyX3ZlcnRpY2FsX2NvcnJlY3Rpb24iPjJkaXA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJwcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbiI+OTZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2Vfc2NyZWVuX3NpZGVfbWFyZ2luX25lZ2F0aXZlIj4tMTAwZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJwcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbiI+MTZkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2Vfc2NyZWVuX3NpZGVfbWFyZ2luX25lZ2F0aXZlIj4tMjBkcDwvZGltZW4+CiAgICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2Vfd2lkZ2V0X3dpZHRoIj43MmRwPC9kaW1lbj4KIAogICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYW4gYWN0aW9uIGJhci4gLS0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhcmdlL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhcmdlL2NvbmZpZy54bWwKaW5kZXggYzk0MjU2ZS4uOTMyNzIwMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sYXJnZS9jb25maWcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbGFyZ2UvY29uZmlnLnhtbApAQCAtMjMsOCArMjMsNiBAQAogICAgIDwhLS0gc2VlIGNvbW1lbnQgaW4gdmFsdWVzL2NvbmZpZy54bWwgLS0+CiAgICAgPGRpbWVuIG5hbWU9ImNvbmZpZ19wcmVmRGlhbG9nV2lkdGgiPjQ0MGRwPC9kaW1lbj4KIAotICAgIDxib29sIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlIj5mYWxzZTwvYm9vbD4KLQogICAgIDwhLS0gc2VlIGNvbW1lbnQgaW4gdmFsdWVzL2NvbmZpZy54bWwgLS0+CiAgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2xvbmdQcmVzc09uUG93ZXJCZWhhdmlvciI+MjwvaW50ZWdlcj4KIApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sYXJnZS9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1sYXJnZS9zdHlsZXMueG1sCmluZGV4IDk2YThjODQuLjUyMDZkN2MgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbGFyZ2Uvc3R5bGVzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhcmdlL3N0eWxlcy54bWwKQEAgLTE1LDEwICsxNSwxMSBAQAogLS0+CiAKIDxyZXNvdXJjZXM+Ci0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlByZWZlcmVuY2VGcmFtZUxheW91dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Ym9yZGVyVG9wIj4wZGlwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJvcmRlckJvdHRvbSI+NDhkaXA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Ym9yZGVyTGVmdCI+MzJkaXA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Ym9yZGVyUmlnaHQiPjMyZGlwPC9pdGVtPgorICAgIDxzdHlsZSBuYW1lPSJQcmVmZXJlbmNlUGFuZWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0Ij5AZGltZW4vcHJlZmVyZW5jZV9zY3JlZW5fc2lkZV9tYXJnaW48L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0Ij5AZGltZW4vcHJlZmVyZW5jZV9zY3JlZW5fc2lkZV9tYXJnaW48L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcCI+NDhkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbSI+NDhkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+P2F0dHIvZGV0YWlsc0VsZW1lbnRCYWNrZ3JvdW5kPC9pdGVtPgogICAgIDwvc3R5bGU+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCmluZGV4IGUzYmRlYTYuLmVhYjkyYzYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IkxlaWTFvmlhIHNhdmluaW5rdWkgc2nFs3N0aSB0aWtzbHVzIMSvcmVuZ2luaW8gYWRtaW5pc3RyYXRvcml1aS4gTmV0dXLEl3TFsyByZWlrxJd0aSDEr3ByYXN0b3NlIHByb2dyYW1vc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJrZWlzdGkgZWtyYW5vIHBhZMSXdMSvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iTGVpZMW+aWEgcHJvZ3JhbWFpIGJldCBrdXJpdW8gbWV0dSBrZWlzdGkgZWtyYW5vIHN1a2ltxIUuIE5ldHVyxJd0xbMgcmVpa8SXdGkgxK9wcmFzdG9tcyBwcm9ncmFtb21zLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJwcm9ncmFtb21zIHNpxbNzdGkg4oCeTGludXjigJwgc2lnbmFsdXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IkxlaWTFvmlhIHByb2dyYW1haSBwYXRlaWt0aSB1xb5rbGF1c8SFLCBrYWQgdGVpa2lhbWFzIHNpZ25hbGFzIGLFq3TFsyBzaXVuxI1pYW1hcyB2aXNpZW1zIG51b2xhdGluaWFtcyBwcm9jZXNhbXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4ibnVzdGF0eXRpLCBrYWQgcHJvZ3JhbWEgYsWrdMWzIHZpc2FkYSBwYWxlaXN0YSI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlByb2dyYW1hIG51a3JlaXB0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4i4oCePHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuKAnCBkYWJhciB2eWtkb21hLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4i4oCePHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuKAnCBidXZvIGnFoSBwcmFkxb5pxbMgcGFsZWlzdGEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IlByb2dyYW1hIOKAnjx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz7igJwgKHByb2Nlc2FzIOKAnjx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPuKAnCkgcGHFvmVpZMSXIHNhdm8gdnlrZG9txIUg4oCeU3RyaWN0TW9kZeKAnCBwb2xpdGlrxIUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i4oCePHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+4oCcIHByb2Nlc2FzIHBhxb5laWTElyBzYXZvIHZ5a2RvbcSFIOKAnlN0cmljdE1vZGXigJwgcG9saXRpa8SFLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iVnlrZG9tYSDigJ48eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPuKAnCI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IlZpZGluxJcgYXRtaW50aXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qga29ydGVsxJciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0IgYXRtaW50aXMiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCmluZGV4IGRiMmIxZDMuLjVjNTUyNWMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IsS7YXVqIMSrcGHFoW5pZWthbSBzxat0xKt0IG5vbMWra3VzIGllcsSrY2VzIGFkbWluaXN0cmF0b3JhbS4gTmVrYWQgbmF2IG5lcGllY2llxaFhbXMgcGFyYXN0YWrEgW0gbGlldG9qdW1wcm9ncmFtbcSBbS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+Im1haW7Eq3QgZWtyxIFuYSBvcmllbnTEgWNpanUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLEu2F1aiBsaWV0b2p1bXByb2dyYW1tYWkgamVia3VyxIEgYnLEq2TEqyBtYWluxKt0IGVrcsSBbmEgcGFncmllxaFhbmFzIGllc3RhdMSranVtdS4gUGFyYXN0YWrEgW0gbGlldG9qdW1wcm9ncmFtbcSBbSBuZWthZCBuYXYgbmVwaWVjaWXFoWFtYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ic8WrdMSrdCBMaW51eCBzaWduxIFsdXMgdXogbGlldG9qdW1wcm9ncmFtbcSBbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4ixLthdWogbGlldG9qdW1wcm9ncmFtbWFpIHBpZXByYXPEq3QsIGxhaSBwaWVnxIFkxIF0YWlzIHNpZ27EgWxzIHRpa3R1IHPFq3TEq3RzIHV6IHZpc2llbSBwYXN0xIF2xKtnYWppZW0gcHJvY2VzaWVtLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+Imxpa3QgbGlldG9qdW1wcm9ncmFtbWFpIHZpZW5txJNyIGRhcmJvdGllcyI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkxpZXRvanVtcHIuIGlyIG5vdmlyesSrdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gdGFnYWQgZGFyYm9qYXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiJTxIFrb3RuxJNqaSB0aWthIHBhbGFpc3RhIGxpZXRvanVtcHJvZ3JhbW1hIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkxpZXRvanVtcHJvZ3JhbW1hIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc3MgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBpciBwxIFya8SBcHVzaSBzYXZ1IHBhxaFpZXZpZXN0byBTdHJpY3RNb2RlIHBvbGl0aWt1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2Nlc3MgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGlyIHDEgXJrxIFwaXMgc2F2dSBwYcWhaWV2aWVzdG8gU3RyaWN0TW9kZSBwb2xpdGlrdS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGRhcmJvamFzIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iSWVrxaHEk2rEgSBhdG1pxYZhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNEwqBrYXJ0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IlVTQsKgYXRtacWGYSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKaW5kZXggMDkyMzRiZC4uNmIwZTE4ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCkBAIC0yOTcsNiArMjk3LDEwIEBACiAgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4idHVrYXIgb3JpZW50YXNpIHNrcmluIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iTWVtYm9sZWhrYW4gYXBsaWthc2kgdW50dWsgbWVudWthciBwdXRhcmFuIHNrcmluIHBhZGEgYmlsYS1iaWxhIG1hc2EuIFRpZGFrIHNlaGFydXNueWEgZGlwZXJsdWthbiB1bnR1ayBhcGxpa2FzaSBiaWFzYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4iaGFudGFyIGlzeWFyYXQgTGludXgga2VwYWRhIGFwbGlrYXNpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJNZW1iZW5hcmthbiBhcGxpa2FzaSBtZW1pbnRhIGlzeWFyYXQgeWFuZyBkaWJla2Fsa2FuIGRpaGFudGFyIGtlcGFkYSBzZW11YSBwcm9zZXMgZ2lnaWguIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4iYnVhdGthbiBhcGxpa2FzaSBzZW50aWFzYSBiZXJqYWxhbiI8L3N0cmluZz4KQEAgLTEwNDYsNiArMTA1MCwxMiBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CiAgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc212X2FwcGxpY2F0aW9uICgyOTU1ODM4MDQzNjEyMzYyODgpIC0tPgogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc212X3Byb2Nlc3MgKDUxMjAzOTcwMTIwNDc0NjI0NDYpIC0tPgpAQCAtMTM1MSw0ICsxMzYxLDYgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN0b3JhZ2VfdXNiICgzMDE3OTU0MDU5NTM4NTE3Mjc4KSAtLT4KICAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAppbmRleCBhNjg2N2FjLi4yNDEzNjg1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJUaWxsYXRlciBpbm5laGF2ZXJlbiDDpSBzZW5kZSBoZW5zaWt0ZXIgdGlsIGVuaGV0c2FkbWluaXN0cmF0b3IuIELDuHIgYWxkcmkgdsOmcmUgbsO4ZHZlbmRpZyBmb3Igbm9ybWFsZSBwcm9ncmFtbWVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4ic251IHNramVybWVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iTGFyIGFwcGxpa2Fzam9uZW4gcm90ZXJlIHNramVybWVuIG7DpXIgc29tIGhlbHN0LiBWYW5saWdlIGFwcGxpa2Fzam9uZXIgYsO4ciBhbGRyaSB0cmVuZ2UgZGV0dGUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+InNlbmRlIExpbnV4LXNpZ25hbGVyIHRpbCBhcHBsaWthc2pvbmVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJMYXIgYXBwbGlrYXNqb25lbiBzcMO4cnJlIG9tIGF0IGV0IGdpdHQgc2lnbmFsIGJsaXIgc2VuZHQgdGlsIGFsbGUgdmFyaWdlIHByb3Nlc3Nlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJmb3JibGkga2rDuHJlbmRlIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iUHJvZ3JhbW1ldCBlciBvbWRpcmlnZXJ0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGtqw7hyZXIgbsOlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBibGUgb3BwcmlubmVsaWcgc3RhcnRldC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iUHJvZ3JhbW1ldCA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9zZXNzZW4gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYXIgYnJ1dHQgZGUgc2VsdnDDpWxhZ3RlIFN0cmljdE1vZGUtcmV0bmluZ3NsaW5qZW5lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb3Nlc3Nlbjx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYXIgYnJ1dHQgZGUgc2VsdnDDpWxhZ3RlIFN0cmljdE1vZGUtcmV0bmluZ3NsaW5qZW5lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4ga2rDuHJlciI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkludGVybiBsYWdyaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNELWtvcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0ItbGFncmluZyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKaW5kZXggZDA3ODA4MS4uZGJiN2U5OCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iU3RhYXQgZGUgaG91ZGVyIHRvZSBpbnRlbnRpZXMgdGUgdmVyemVuZGVuIG5hYXIgZWVuIGFwcGFyYWF0YmVoZWVyZGVyLiBOb29pdCB2ZXJlaXN0IHZvb3Igbm9ybWFsZSB0b2VwYXNzaW5nZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJzY2hlcm1zdGFuZCB3aWp6aWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IkhpZXJtZWUga2FuIGVlbiBhcHAgb3AgZWxrIGdld2Vuc3QgbW9tZW50IGRlIG9yacOrbnRhdGllIHZhbiBoZXQgc2NoZXJtIHdpanppZ2VuLiBOb29pdCB2ZXJlaXN0IHZvb3Igbm9ybWFsZSBhcHBzLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJMaW51eC1zaWduYWxlbiB2ZXJ6ZW5kZW4gbmFhciB0b2VwYXNzaW5nZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IkhpZXJtZWUga2FuIGRlIGFwcCBlcnZvb3Igem9yZ2VuIGRhdCBoZXQgZ2VsZXZlcmRlIHNpZ25hYWwgd29yZHQgdmVyem9uZGVuIG5hYXIgYWxsZSBwZXJzaXN0ZW50ZSBwcm9jZXNzZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4iYXBwIGFsdGlqZCBsYXRlbiB1aXR2b2VyZW4iPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcHAgb21nZWxlaWQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gaXMgbnUgYWN0aWVmLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiB3YXMgaGV0IGVlcnN0IGdlc3RhcnQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkRlIGFwcCA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoZWVmdCBoZXQgemVsZiBhZmdlZHdvbmdlbiBTdHJpY3RNb2RlLWJlbGVpZCBnZXNjaG9uZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkhldCBwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhlZWZ0IGhldCB6ZWxmIGFmZ2Vkd29uZ2VuIFN0cmljdE1vZGUtYmVsZWlkIGdlc2Nob25kZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiB3b3JkdCB1aXRnZXZvZXJkIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iSW50ZXJuZSBvcHNsYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qta2FhcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0Itb3BzbGFnIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAppbmRleCA4ZGQzY2M3Li4zNmQzY2RkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJaZXp3YWxhIHBvc2lhZGFjem93aSBuYSB3eXN5xYJhbmllIGluZm9ybWFjamkgbyB6YW1pYXJhY2ggZG8gYWRtaW5pc3RyYXRvcmEgdXJ6xIVkemVuaWEuIE9wY2phIG5pZSBwb3dpbm5hIGJ5xIcgbmlnZHkgcG90cnplYm5hIHcgcHJ6eXBhZGt1IHp3eWvFgnljaCBhcGxpa2FjamkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJ6bWllbmlhbmllIG9yaWVudGFjamkgZWtyYW51Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iUG96d2FsYSBhcGxpa2FjamkgbmEgem1pYW7EmSBvcmllbnRhY2ppIGVrcmFudSB3IGRvd29sbnltIG1vbWVuY2llLiBOaWdkeSBuaWUgcG93aW5ubyBiecSHIHBvdHJ6ZWJ5IHN0b3Nvd2FuaWEgdyBub3JtYWxueWNoIGFwbGlrYWNqYWNoLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJ3eXN5xYJhbmllIHN5Z25hxYLDs3cgc3lzdGVtdSBMaW51eCBkbyBhcGxpa2FjamkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlBvendhbGEgYXBsaWthY2pvbSDFvMSFZGHEhywgYWJ5IGRvc3RhcmN6YW55IHN5Z25hxYIgYnnFgiB3eXN5xYJhbnkgZG8gd3N6eXN0a2ljaCB0cndhasSFY3ljaCBwcm9jZXPDs3cuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4ic3ByYXdpYW5pZSwgxbxlIGFwbGlrYWNqYSBqZXN0IGNhxYJ5IGN6YXMgdXJ1Y2hvbWlvbmEiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcGxpa2FjamEgcHJ6ZWtpZXJvd2FuYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iQXBsaWthY2phIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gamVzdCB1cnVjaG9taW9uYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IkFwbGlrYWNqYSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHpvc3RhxYJhIHBpZXJ3b3RuaWUgdXJ1Y2hvbWlvbmEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkFwbGlrYWNqYSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBuYXJ1c3p5xYJhIHd5bXVzem9uZSBwcnpleiBzaWViaWUgemFzYWR5IFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBuYXJ1c3p5xYIgd3ltdXN6b25lIHByemV6IHNpZWJpZSB6YXNhZHkgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+IkR6aWHFgmEgPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJQYW1pxJnEhyB3ZXduxJl0cnpuYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJLYXJ0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+Ik5vxZtuaWsgVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCmluZGV4IDlhZTc0ZGQuLjljZWM0YjYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iUGVybWl0ZSBhbyB0aXR1bGFyIGVudmlhciBpbnRlbsOnw7VlcyBwYXJhIHVtIGFkbWluaXN0cmFkb3IgZG8gZGlzcG9zaXRpdm8uIE51bmNhIGRldmVyw6Egc2VyIG5lY2Vzc8OhcmlvIHBhcmEgYXBsaWNhw6fDtWVzIG5vcm1haXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJtdWRhciBvcmllbnRhw6fDo28gZG8gZWNyw6MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIG11ZGFyIGEgcm90YcOnw6NvIGRvIGVjcsOjIGVtIHF1YWxxdWVyIG1vbWVudG8uIE51bmNhIGRldmUgc2VyIG5lY2Vzc8OhcmlvIHBhcmEgYXBsaWNhw6fDtWVzIG5vcm1haXMuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ImVudmlhciBzaW5haXMgTGludXggcGFyYSBhcGxpY2HDp8O1ZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlBlcm1pdGUgw6AgYXBsaWNhw6fDo28gcGVkaXIgcXVlIG8gc2luYWwgZm9ybmVjaWRvIHNlamEgZW52aWFkbyBhIHRvZG9zIG9zIHByb2Nlc3NvcyBwZXJzaXN0ZW50ZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4iZmF6ZXIgY29tIHF1ZSBhIGFwbGljYcOnw6NvIHNlamEgc2VtcHJlIGV4ZWN1dGFkYSI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwbGljYcOnw6NvIHJlZGlyZWNjaW9uYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGVzdMOhIGFnb3JhIGEgc2VyIGV4ZWN1dGFkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gZm9pIG9yaWdpbmFsbWVudGUgaW5pY2lhZG8uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkEgYXBsaWNhw6fDo28gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSB2aW9sb3UgYSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBhdXRvLWltcG9zdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iTyBwcm9jZXNzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gdmlvbG91IGEgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0by1pbXBvc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gZW0gZXhlY3XDp8OjbyI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkFybWF6ZW5hbWVudG8gSW50ZXJubyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJDYXJ0w6NvIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iQXJtYXplbmFtZW50byBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCmluZGV4IDVlMzcxNTMuLjU3NzM3YzkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlBlcm1pdGUgcXVlIG8gZGV0ZW50b3IgZW52aWUgdGVudGF0aXZhcyBhbyBhZG1pbmlzdHJhZG9yIGRlIHVtIGRpc3Bvc2l0aXZvLiBOw6NvIMOpIG5lY2Vzc8OhcmlvIHBhcmEgYXBsaWNhdGl2b3Mgbm9ybWFpcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+ImFsdGVyYXIgb3JpZW50YcOnw6NvIGRhIHRlbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGFsdGVyZSBhIHJvdGHDp8OjbyBkYSB0ZWxhIGEgcXVhbHF1ZXIgbW9tZW50by4gQXBsaWNhdGl2b3Mgbm9ybWFpcyBuw6NvIGRldmVtIHByZWNpc2FyIGRpc3NvIGVtIG1vbWVudG8gYWxndW0uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ImVudmlhciBzaW5haXMgZGUgTGludXggcGFyYSBvcyBhcGxpY2F0aXZvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iUGVybWl0ZSBxdWUgbyBhcGxpY2F0aXZvIHNvbGljaXRlIHF1ZSBvIHNpbmFsIGZvcm5lY2lkbyBzZWphIGVudmlhZG8gYSB0b2RvcyBvcyBwcm9jZXNzb3MgcGVyc2lzdGVudGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImV4ZWN1dGFyIHNlbXByZSBvIGFwbGljYXRpdm8iPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcGxpY2F0aXZvIHJlZGlyZWNpb25hZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gbsOjbyBlc3TDoSBlbSBleGVjdcOnw6NvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBmb2kgaW5pY2lhZG8uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+Ik8gYXBsaWNhdGl2byA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIHZpb2xvdSBhIHBvbMOtdGljYSBTdHJpY3RNb2RlIGltcG9zdGEgYXV0b21hdGljYW1lbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+Ik8gcHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IHZpb2xvdSBhIHBvbMOtdGljYSBTdHJpY3RNb2RlIGltcG9zdGEgYXV0b21hdGljYW1lbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gZW0gZXhlY3XDp8OjbyI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkFybWF6ZW5hbWVudG8gaW50ZXJubyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJDYXJ0w6NvIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iQXJtYXplbmFtZW50byBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sCmluZGV4IDRiZjljM2UuLjYwZjYwNDkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbApAQCAtMjc1LDYgKzI3NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlBlcm1ldHRhIGFsIHBvc3Nlc3N1ciBkYSB0cmFtZXR0ZXIgaW50ZW56aXVucyBhIGxcJ2FkbWluaXN0cmF0dXIgZGFsIGFwcGFyYXQgcGVyaWZlcmljLiBCZXRnIHByZXZpcyBwZXIgYXBwbGljYXppdW5zIG5vcm1hbGFzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4ibWlkYXIgbFwnb3JpZW50YXppdW4gZGFsIHZpc3VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iUGVybWV0dGEgYSBsXCdhcHBsaWNheml1biBkYSBtaWRhciBkYSB0dXQgdGVtcCBsYSBvcmllbnRheml1biBkYWwgdmlzdXIuIEJldGcgcHJldmlzIHBlciBhcHBsaWNheml1bnMgbm9ybWFsYXMuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+InRyYW1ldHRlciBzaWduYWxzIExpbnV4IGEgbGFzIGFwcGxpY2F6aXVucyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iUGVybWV0dGEgYSBsXCdhcHBsaWNheml1biBkYSBwcmV0ZW5kZXIgY2hcJ2lsIHNpZ25hbCBmdXJuw6wgdmVnbmlhIHRyYW1lc3MgYSB0dXQgaWxzIHByb2Nlc3MgcGVyc2lzdGVudHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4iZXhlcXVpciBwZXJtYW5lbnRhbWFpbiBhcHBsaWNheml1bnMiPC9zdHJpbmc+CkBAIC04OTksNiArOTAzLDEyIEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KICAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkxcJ2FwcGxpY2F6aXVuIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc3MgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYSB2aW9sw6Agc2lhIGF0Z25hIGRpcmVjdGl2YSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IklsIHByb2Nlc3MgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIHZpb2zDoCBzaWEgYXRnbmEgZGlyZWN0aXZhIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPsKgdmVnbiBleGVxdWlkYSI8L3N0cmluZz4KQEAgLTExNDcsNCArMTE1Nyw2IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdG9yYWdlX3VzYiAoMzAxNzk1NDA1OTUzODUxNzI3OCkgLS0+CiAgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKaW5kZXggYzg4ZjA2ZC4uMTk2MTkwMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iUGVybWl0ZSBwcm9wcmlldGFydWx1aSBzxIMgdHJpbWl0xIMgaW50ZW7Fo2lpIGPEg3RyZSB1biBhZG1pbmlzdHJhdG9yIGFsIGRpc3Bveml0aXZ1bHVpLiBOdSBhciB0cmVidWkgc8SDIGZpZSBuaWNpb2RhdMSDIG5lY2VzYXLEgyBwZW50cnUgYXBsaWNhxaNpaWxlIG9iacWfbnVpdGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJtb2RpZmljYXJlIG9yaWVudGFyZSBlY3JhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IlBlcm1pdGUgdW5laSBhcGxpY2HFo2lpIHPEgyBtb2RpZmljZSByb3RhxaNpYSBlY3JhbnVsdWkgw65uIG9yaWNlIG1vbWVudC4gTnUgYXIgdHJlYnVpIHPEgyBmaWUgbmljaW9kYXTEgyBuZWNlc2FyxIMgcGVudHJ1IGFwbGljYcWjaWlsZSBvYmnFn251aXRlLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJ0cmltaXRlcmUgc2VtbmFsZSBMaW51eCBjxIN0cmUgYXBsaWNhxaNpaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iUGVybWl0ZSBhcGxpY2HFo2llaSBzxIMgc29saWNpdGUgdHJpbWl0ZXJlYSBzZW1uYWx1bHVpIGZ1cm5pemF0IGPEg3RyZSB0b2F0ZSBwcm9jZXNlbGUgcGVyc2lzdGVudGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4icnVsYXJlIMOubnRvdGRlYXVuYSBhIGFwbGljYcWjaWVpIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWNhxaNpZSByZWRpcmVjxaNpb25hdMSDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGZ1bmPFo2lvbmVhesSDIGFjdW0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGEgZm9zdCBsYW5zYXTEgyBpbmnFo2lhbC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQXBsaWNhxaNpYSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXN1bCA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGEgw65uY8SDbGNhdCBwcm9wcmlhIHBvbGl0aWPEgyBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2Nlc3VsIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBhIMOubmPEg2xjYXQgcHJvcHJpYSBwb2xpdGljxIMgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+IlJ1bGVhesSDIDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iU3RvY2FyZSBpbnRlcm7EgyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJDYXJkIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iRHNpcG96aXRpdiBkZSBzdG9jYXJlIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKaW5kZXggZTdkNDI2OC4uODNkYzMwZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i0J/QvtC30LLQvtC70Y/QtdGCINCy0LvQsNC00LXQu9GM0YbRgyDQvtGC0L/RgNCw0LLQu9GP0YLRjCDRhtC10LvQtdCy0YvQtSDQt9C90LDRh9C10L3QuNGPINCw0LTQvNC40L3QuNGB0YLRgNCw0YLQvtGA0YMg0YPRgdGC0YDQvtC50YHRgtCy0LAuINCd0LjQutC+0LPQtNCwINC90LUg0LjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINC+0LHRi9GH0L3Ri9C80Lgg0L/RgNC40LvQvtC20LXQvdC40Y/QvNC4LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4i0LjQt9C80LXQvdGP0YLRjCDQvtGA0LjQtdC90YLQsNGG0LjRjiDRjdC60YDQsNC90LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0LjQt9C80LXQvdGP0YLRjCDQvtGA0LjQtdC90YLQsNGG0LjRjiDRjdC60YDQsNC90LAg0LIg0LvRjtCx0L7QtSDQstGA0LXQvNGPLiDQndC1INGC0YDQtdCx0YPQtdGC0YHRjyDQtNC70Y8g0L7QsdGL0YfQvdGL0YUg0L/RgNC40LvQvtC20LXQvdC40LkuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ItC+0YLQv9GA0LDQstC70Y/RgtGMINC/0YDQuNC70L7QttC10L3QuNGP0Lwg0YHQuNCz0L3QsNC70YsgTGludXgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQvdCw0L/RgNCw0LLQu9GP0YLRjCDQt9Cw0L/RgNC+0YEg0L3QsCDQv9C10YDQtdC00LDRh9GDINC/0YDQtdC00L7RgdGC0LDQstC70LXQvdC90L7Qs9C+INGB0LjQs9C90LDQu9CwINCy0YHQtdC8INC/0L7RgdGC0L7Rj9C90L3Ri9C8INC/0YDQvtGG0LXRgdGB0LDQvC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiLQt9Cw0L/Rg9GB0LrQsNGC0Ywg0L/QvtGB0YLQvtGP0L3QvdGD0Y4g0YDQsNCx0L7RgtGDINC/0YDQuNC70L7QttC10L3QuNGPIjwvc3RyaW5nPgpAQCAtNDQ5LDcgKzQ1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX25mYyIgbXNnaWQ9IjQ0MjMzNTEyNzQ3NTc4NzY5NTMiPiLRg9C/0YDQsNCy0LvRj9GC0Ywg0YDQsNC00LjQvtGB0LLRj9C30YzRjiDQsdC70LjQttC90LXQs9C+INC00LXQudGB0YLQstC40Y8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19uZmMiIG1zZ2lkPSI5MTcxNDAxODUxOTU0NDA3MjI2Ij4i0J/QvtC30LLQvtC70Y/QtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC+0LHQvNC10L3QuNCy0LDRgtGM0YHRjyDQtNCw0L3QvdGL0LzQuCDRgSDQvNC10YLQutCw0LzQuCwg0LrQsNGA0YLQsNC80Lgg0Lgg0YHRh9C40YLRi9Cy0LDRgtC10LvRj9C80Lgg0YfQtdGA0LXQtyDRgNCw0LTQuNC+0YHQstGP0LfRjCDQsdC70LjQttC90LXQs9C+INC00LXQudGB0YLQstC40Y8gKE5GQykuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl92cG4iIG1zZ2lkPSI4MzQ1ODAwNTg0NTMyMTc1MzEyIj4i0L/QtdGA0LXRhdCy0LDRgtGL0LLQsNGC0Ywg0Lgg0LjQt9C80LXQvdGP0YLRjCDRgdC10YLQtdCy0L7QuSDRgtGA0LDRhNC40LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY192cG4iIG1zZ2lkPSI1NjE3ODkzMDc4OTg5OTQ0MjE5Ij4i0J/QvtC30LLQvtC70Y/QtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC/0LXRgNC10YXQstCw0YLRi9Cy0LDRgtGMINC4INC/0YDQvtCy0LXRgNGP0YLRjCDQstC10YHRjCDRgdC10YLQtdCy0L7QuSDRgtGA0LDRhNC40LosINC90LDQv9GA0LjQvNC10YAsINGH0YLQvtCx0Ysg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0YHQvtC10LTQuNC90LXQvdC40LUgVlBOLiDQktGA0LXQtNC+0L3QvtGB0L3QvtC1INCf0J4g0LzQvtC20LXRgiDQvtGC0YHQu9C10LbQuNCy0LDRgtGMLCDQv9C10YDQtdC90LDQv9GA0LDQstC70Y/RgtGMINC40LvQuCDQuNC30LzQtdC90Y/RgtGMINGB0LXRgtC10LLRi9C1INC/0LDQutC10YLRiyDQsdC10Lcg0LLQsNGI0LXQs9C+INCy0LXQtNC+0LzQsC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY192cG4iIG1zZ2lkPSI1NjE3ODkzMDc4OTg5OTQ0MjE5Ij4i0J/QvtC30LLQvtC70Y/QtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC/0LXRgNC10YXQstCw0YLRi9Cy0LDRgtGMINC4INC/0YDQvtCy0LXRgNGP0YLRjCDQstC10YHRjCDRgdC10YLQtdCy0L7QuSDRgtGA0LDRhNC40LosINC90LDQv9GA0LjQvNC10YAg0YfRgtC+0LHRiyDRg9GB0YLQsNC90L7QstC40YLRjCDRgdC+0LXQtNC40L3QtdC90LjQtSBWUE4uINCS0YDQtdC00L7QvdC+0YHQvdC+0LUg0J/QniDQvNC+0LbQtdGCINC+0YLRgdC70LXQttC40LLQsNGC0YwsINC/0LXRgNC10L3QsNC/0YDQsNCy0LvRj9GC0Ywg0LjQu9C4INC40LfQvNC10L3Rj9GC0Ywg0YHQtdGC0LXQstGL0LUg0L/QsNC60LXRgtGLINCx0LXQtyDQstCw0YjQtdCz0L4g0LLQtdC00L7QvNCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+ItC+0YLQutC70Y7Rh9Cw0YLRjCDQsdC70L7QutC40YDQvtCy0LrRgyDQutC70LDQstC40LDRgtGD0YDRiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0L7RgtC60LvRjtGH0LjRgtGMINCx0LvQvtC60LjRgNC+0LLQutGDINC60LvQsNCy0LjQsNGC0YPRgNGLINC4INC00YDRg9Cz0LjQtSDRhNGD0L3QutGG0LjQuCDQt9Cw0YnQuNGC0Ysg0L/QsNGA0L7Qu9C10LwuINCf0YDQuNC80LXRgNC+0Lwg0LTQvtC/0YPRgdGC0LjQvNC+0LPQviDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDRjdGC0L7QuSDRhNGD0L3QutGG0LjQuCDRj9Cy0LvRj9C10YLRgdGPINC+0YLQutC70Y7Rh9C10L3QuNC1INCx0LvQvtC60LjRgNC+0LLQutC4INC60LvQsNCy0LjQsNGC0YPRgNGLINC/0YDQuCDQv9C+0LvRg9GH0LXQvdC40Lgg0LLRhdC+0LTRj9GJ0LXQs9C+INCy0YvQt9C+0LLQsCDQuCDQstC60LvRjtGH0LXQvdC40LUg0LHQu9C+0LrQuNGA0L7QstC60Lgg0L/QvtGB0LvQtSDQt9Cw0LLQtdGA0YjQtdC90LjRjyDRgNCw0LfQs9C+0LLQvtGA0LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+ItGB0YfQuNGC0YvQstCw0YLRjCDQvdCw0YHRgtGA0L7QudC60Lgg0YHQuNC90YXRgNC+0L3QuNC30LDRhtC40LgiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSDQv9C10YDQtdC90LDQv9GA0LDQstC70LXQvdC+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+INCy0YvQv9C+0LvQvdGP0LXRgtGB0Y8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLQmNC30L3QsNGH0LDQu9GM0L3QviDQsdGL0LvQviDQt9Cw0L/Rg9GJ0LXQvdC+INC/0YDQuNC70L7QttC10L3QuNC1IDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+ItCf0YDQuNC70L7QttC10L3QuNC1IDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKNC/0YDQvtGG0LXRgdGBIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikg0L3QsNGA0YPRiNC40LvQviDRgdC+0LHRgdGC0LLQtdC90L3Rg9GOINC/0L7Qu9C40YLQuNC60YMgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLQn9GA0L7RhtC10YHRgSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4g0L3QsNGA0YPRiNC40Lsg0YHQvtCx0YHRgtCy0LXQvdC90YPRjiDQv9C+0LvQuNGC0LjQutGDIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiDQt9Cw0L/Rg9GJ0LXQvdC+Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4i0JLQvdGD0YLRgNC10L3QvdGP0Y8g0L/QsNC80Y/RgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNELdC60LDRgNGC0LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0It0L3QsNC60L7Qv9C40YLQtdC70YwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCmluZGV4IDMxMWRhOTQuLjM0MzlmNTkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlVtb8W+xYh1amUgZHLFvml0ZcS+b3ZpIG9kb3NpZWxhxaUgaW5mb3Jtw6FjaWUgc3Byw6F2Y292aSB6YXJpYWRlbmlhLiBCZcW+bsOpIGFwbGlrw6FjaWUgYnkgdG90byBvcHLDoXZuZW5pZSBuZW1hbGkgbmlrZHkgcG/FvmFkb3ZhxaUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJ6bWVuYSBvcmllbnTDoWNpZSBvYnJhem92a3kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJVbW/FvsWIdWplIGFwbGlrw6FjaWkga2VkeWtvxL52ZWsgem1lbmnFpSBvcmllbnTDoWNpdSBvYnJhem92a3kuIEJlxb5uw6kgYXBsaWvDoWNpZSBieSB0b3RvIG5hc3RhdmVuaWUgbmVtYWxpIHbDtGJlYyB2eXXFvsOtdmHFpS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ib2Rvc2xhbmllIHNpZ27DoWxvdiBzeXN0w6ltdSBMaW51eCBhcGxpa8OhY2nDoW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlVtb8W+xYh1amUgYXBsaWvDoWNpaSB2ecW+aWFkYcWlIHphc2xhbmllIHBvc2t5dG51dMOpaG8gc2lnbsOhbHUgdsWhZXRrw71tIHRydmFsw71tIHByb2Nlc29tLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+InRydmFsw6kgc3B1c3RlbmllIGFwbGlrw6FjaWUiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcGxpa8OhY2lhIGJvbGEgcHJlc21lcm92LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iSmUgc3B1c3RlbsOhIGFwbGlrw6FjaWEgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IlDDtHZvZG5lIGJvbGEgc3B1c3RlbsOhIGFwbGlrw6FjaWEgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQXBsaWvDoWNpYSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBwb3J1xaFpbGEgc3ZvamUgdmxhc3Ruw6kgdnluw7p0ZW7DqSBwcmF2aWRsw6EgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IHBvcnXFoWlsIHN2b2plIHZsYXN0bsOpIHZ5bsO6dGVuw6kgcHJhdmlkbMOhIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiJTcHVzdGVuw6EgYXBsaWvDoWNpYTogPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJJbnRlcm7DvSB1a2xhZGFjw60gcHJpZXN0b3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iS2FydGEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVa2xhZGFjw60gcHJpZXN0b3IgVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbAppbmRleCAyYmEzMjQyLi5jZDRjZDA3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJEb3ZvbGp1amUgbGFzdG5pa3UsIGRhIHBvxaFsamUgbmFtZXJlIHNrcmJuaWt1IG5hcHJhdmUuIE5pa29saSBzZSBuZSB1cG9yYWJsamEgemEgbmF2YWRuZSBwcm9ncmFtZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+InNwcmVtaW5qYW5qZSB1c21lcmplbm9zdGkgemFzbG9uYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IkRvdm9sanVqZSwgZGEgcHJvZ3JhbSBrYWRhciBrb2xpIHNwcmVtZW5pIHNtZXIgc3VrYW5qYSB6YXNsb25hLiBUZWdhIG5pa29saSBuaSB0cmViYSB1cG9yYWJpdGkgemEgbmF2YWRuZSBwcm9ncmFtZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4icG/FoWlsamFuamUgc2lnbmFsb3YgTGludXhhIHByb2dyYW1vbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iRG92b2xqdWplLCBkYSBwcm9ncmFtIHphaHRldmEsIGRhIGplIHBvc3JlZG92YW4gc2lnbmFsIHBvc2xhbiB2c2VtIHRyYWpuaW0gcHJvY2Vzb20uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4ibmVwcmVraW5qZW5vIGl6dmFqYW5qZSBwcm9ncmFtb3YiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJQcmV1c21lcml0ZXYgcHJvZ3JhbWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gc2UgaXp2YWphLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iUHJ2b3RubyBqZSBiaWwgemFnbmFuIHByb2dyYW0gPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iUHJvZ3JhbSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBrcsWhaSBzdm9qIHNhbW9penZlZGxqaXZpIHByYXZpbG5payBvIHN0cm9nZW0gbmHEjWludS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGtyxaFpIHN2b2ogc2Ftb2l6dmVkbGppdmkgcHJhdmlsbmlrIG8gc3Ryb2dlbSBuYcSNaW51LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gc2UgaXp2YWphIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iTm90cmFuamkgcG9tbmlsbmlrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IkthcnRpY2EgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJQb21uaWxuaWsgVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbAppbmRleCA4ZDhiNzNmLi41OTMyOWI0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiLQntC80L7Qs9GD0ZvQsNCy0LAg0LLQu9Cw0YHQvdC40LrRgyDQtNCwINGI0LDRmdC1INGB0LLQvtGY0LUg0L3QsNC80LXRgNC1INCw0LTQvNC40L3QuNGB0YLRgNCw0YLQvtGA0YMg0YPRgNC10ZLQsNGY0LAuINCe0LHQuNGH0L3QtSDQsNC/0LvQuNC60LDRhtC40ZjQtSDQvdC40LrQsNC00LAg0L3QtSDQsdC4INGC0YDQtdCx0LDQu9C+INC00LAg0ZjQtSDQutC+0YDQuNGB0YLQtS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+ItC/0YDQvtC80LXQvdCwINC/0L7Qu9C+0LbQsNGY0LAg0LXQutGA0LDQvdCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4i0J7QvNC+0LPRg9Gb0LDQstCwINC00LAg0LDQv9C70LjQutCw0YbQuNGY0LAg0YMg0YHQstCw0LrQvtC8INGC0YDQtdC90YPRgtC60YMg0L/RgNC+0LzQtdC90Lgg0YDQvtGC0LDRhtC40ZjRgyDQtdC60YDQsNC90LAuINCe0LHQuNGH0L3QtSDQsNC/0LvQuNC60LDRhtC40ZjQtSDQvdC40LrQsNC00LAg0L3QtSDQsdC4INGC0YDQtdCx0LDQu9C+INC00LAg0ZjQtSDQutC+0YDQuNGB0YLQtS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4i0YHQu9Cw0ZrQtSBMaW51eCDRgdC40LPQvdCw0LvQsCDQsNC/0LvQuNC60LDRhtC40ZjQsNC80LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+ItCe0LzQvtCz0YPRm9Cw0LLQsCDQtNCwINCw0L/Qu9C40LrQsNGG0LjRmNCwINC30LDRhdGC0LXQstCwINC00LAg0LjRgdC/0L7RgNGD0YfQtdC90Lgg0YHQuNCz0L3QsNC7INCx0YPQtNC1INC/0L7RgdC70LDRgiDRgdCy0LjQvCDRgtGA0LDRmNC90LjQvCDQv9GA0L7RhtC10YHQuNC80LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4i0L7QvNC+0LPRg9Gb0LDQstCw0ZrQtSDQvdC10L/RgNC10LrQuNC00L3QtSDQsNC60YLQuNCy0L3QvtGB0YLQuCDQsNC/0LvQuNC60LDRhtC40ZjQtSI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+ItCQ0L/Qu9C40LrQsNGG0LjRmNCwINGY0LUg0L/RgNC10YPRgdC80LXRgNC10L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4i0JDQv9C70LjQutCw0YbQuNGY0LAgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDRmNC1INGB0LDQtNCwINC/0L7QutGA0LXQvdGD0YLQsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+ItCf0YDQstC+0LHQuNGC0L3QviDRmNC1INC/0L7QutGA0LXQvdGD0YLQsCDQsNC/0LvQuNC60LDRhtC40ZjQsCA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLQkNC/0LvQuNC60LDRhtC40ZjQsCA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjQv9GA0L7RhtC10YEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDRmNC1INC/0YDQtdC60YDRiNC40LvQsCDRgdCw0LzQvtC90LDQvNC10YLQvdGD0YLQtSBTdHJpY3RNb2RlINGB0LzQtdGA0L3QuNGG0LUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i0J/RgNC+0YbQtdGBIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDRmNC1INC/0YDQtdC60YDRiNC40L4g0YHQsNC80L7QvdCw0LzQtdGC0L3Rg9GC0LUgU3RyaWN0TW9kZSDRgdC80LXRgNC90LjRhtC1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4i0JDQv9C70LjQutCw0YbQuNGY0LAgPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g0ZjQtSDQv9C+0LrRgNC10L3Rg9GC0LAiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiLQmNC90YLQtdGA0L3QsCDQvNC10LzQvtGA0LjRmNCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNEINC60LDRgNGC0LjRhtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCINC80LXQvNC+0YDQuNGY0LAiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCmluZGV4IGIyNzQwYTAuLmEzMzUwZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlRpbGzDpXRlciBhdHQgaW5uZWhhdmFyZW4gc2tpY2thciBhdnNpa3RlciB0aWxsIGVuIGVuaGV0c2FkbWluaXN0cmF0w7ZyLiBWYW5saWdhIHByb2dyYW0gYmVow7Z2ZXIgYWxkcmlnIGfDtnJhIGRldHRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iw6RuZHJhIGJpbGRza8Okcm1lbnMgcmlrdGluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gbsOkciBzb20gaGVsc3Qgw6RuZHJhciBza8Okcm1lbnMgcm90ZXJpbmcuIEJlaMO2dnMgaW50ZSBmw7ZyIHZhbmxpZ2EgcHJvZ3JhbS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ic2tpY2thIExpbnV4LXNpZ25hbGVyIHRpbGwgYXBwYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlRpbGzDpXRlciBhdHQgcHJvZ3JhbW1ldCBiZWfDpHIgYXR0IGRlbiBhbmdpdm5hIHNpZ25hbGVuIHNraWNrYXMgdGlsbCBhbGxhIGJlc3TDpG5kaWdhIHByb2Nlc3Nlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJzZSB0aWxsIGF0dCBwcm9ncmFtbWV0IGFsbHRpZCBrw7ZycyI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlByb2dyYW1tZXQgb21kaXJpZ2VyYWRlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBrw7Zycy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gc3RhcnRhZGVzIGbDtnJzdC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iUHJvZ3JhbW1ldCA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzZW4gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYXIgYnJ1dGl0IG1vdCBzaW4gZWdlbiBTdHJpY3RNb2RlLXBvbGljeS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXNzZW4gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhciBicnV0aXQgbW90IHNpbiBlZ2VuIFN0cmljdE1vZGUtcG9saWN5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4ga8O2cnMiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJJbnRlcm50IGxhZ3JpbmdzdXRyeW1tZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRC1rb3J0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCLWxhZ3JpbmciPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCmluZGV4IDA0MTM2NWUuLmZmMTkwN2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbApAQCAtMzk2LDYgKzM5NiwxMCBAQAogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0T3JpZW50YXRpb24gKDMzNjU5NDc3MTcxNjM4NjY4NDQpIC0tPgogICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJIdXJ1aHVzdSBwcm9ncmFtdSBrdWJhZGlsaXNoYSB1enVuZ3VrYWppIHdhIHNrcmluaSB3YWthdGkgd293b3RlLiBIYWlwYXN3aSBrdWhpdGFqaWthIGt3YSBwcm9ncmFtdSB6YSBrYXdhaWRhIHphIGtvbXB5dXRhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMgKDQyNTU0NjcyNTU0ODg2NTM4NTQpIC0tPgogICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+Ikh1cnVodXN1IHByb2dyYW11IGt1b21iYSBrd2FtYmEgbWF3aW1iaSB5YWxpeW90b2xld2EgeWF0dW13ZSBrd2EgbWljaGFrYXRvIHlvdGUgaXNpeW9rb21hLiI8L3N0cmluZz4KQEAgLTExNTQsNiArMTE1OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iUHJvZ3JhbXUgaW1lZWxla2V6d2EgdXB5YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPmluYWVuZGVzaGEgc2FzYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gaWxpemluZHVsaXdhIG13YW56b25pLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJTaHVnaHVsaSB5YSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9ncmFtdSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGltZWVuZGEga2lueXVtZSBuYSBzZXJhIHlha2UgeWEgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJTaHVnaHVsaSB5YSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaW1lZW5kYSBraW55dW1lIG5hIGt1bGF6aW1pc2hhIHNlcmEgeWFrZSB5YSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gaW5hZW5kZWxlYSI8L3N0cmluZz4KQEAgLTE0MjMsNCArMTQzMyw2IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdG9yYWdlX3VzYiAoMzAxNzk1NDA1OTUzODUxNzI3OCkgLS0+CiAgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdzYwMGRwL2Jvb2xzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9ib29scy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0MDMxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9ib29scy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8Ym9vbCBuYW1lPSJwcmVmZXJlbmNlc19wcmVmZXJfZHVhbF9wYW5lIj50cnVlPC9ib29sPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3NjAwZHAvY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9jb25maWcueG1sCmluZGV4IDQ5YWNlMzQuLmQ2YTBjZGQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9jb25maWcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9jb25maWcueG1sCkBAIC0yMCw4ICsyMCw2IEBACiA8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKICAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgogPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPGJvb2wgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNhbkhpZGUiPmZhbHNlPC9ib29sPgotCiAgICAgPCEtLSBzZWUgY29tbWVudCBpbiB2YWx1ZXMvY29uZmlnLnhtbCAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbG9uZ1ByZXNzT25Qb3dlckJlaGF2aW9yIj4yPC9pbnRlZ2VyPgogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTU5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9hbnkvZGltZW5zLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzPgorICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzdGF0dXMgYmFyIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2hlaWdodCI+NDhkaXA8L2RpbWVuPgorICAgIDwhLS0gV2lkdGggYW5kIGhlaWdodCBvZiBhIHNpbmdsZSBub3RpZmljYXRpb24gaWNvbiBpbiB0aGUgc3RhdHVzIGJhciAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3NpemUiPjMyZGlwPC9kaW1lbj4KKyAgICA8IS0tIFNpemUgb2YgdGhlIGdpYW50IG51bWJlciAodW5yZWFkIGNvdW50KSBpbiB0aGUgbm90aWZpY2F0aW9ucyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9jb250ZW50X251bWJlcl9zaXplIj40OHNwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3NjAwZHAvc3R5bGVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTVjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3NjAwZHAvc3R5bGVzLnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFN0YXR1cyBCYXIgU3R5bGVzIC0tPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGlja2VyIj4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JY29uIj4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPiNmZjk5OTk5OTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LlRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlRhYldpZGdldCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci90YWJfaW5kaWNhdG9yX3RleHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICAKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uVGFiV2lkZ2V0IiBwYXJlbnQ9IldpZGdldC5UYWJXaWRnZXQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj5Ac3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuVGFiV2lkZ2V0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRhYlN0cmlwTGVmdCI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGFiU3RyaXBSaWdodCI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGFiU3RyaXBFbmFibGVkIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5sZWZ0fGNlbnRlcl92ZXJ0aWNhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0YWJMYXlvdXQiPkBhbmRyb2lkOmxheW91dC90YWJfaW5kaWNhdG9yX2hvbG9fbGFyZ2U8L2l0ZW0+CisgICAgPC9zdHlsZT4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbAppbmRleCBmMDU0MDljLi5iZTk1OGRjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiLguK3guJnguLjguI3guLLguJXguYPguKvguYnguJzguLnguYnguJbguLfguK3guKrguYjguIfguYDguJnguLfguYnguK3guKvguLLguYTguJvguKLguLHguIfguYLguJvguKPguYHguIHguKPguKHguITguKfguJrguITguLjguKHguK3guLjguJvguIHguKPguJPguYwg4LmE4Lih4LmI4LiE4Lin4Lij4LiV4LmJ4Lit4LiH4LmD4LiK4LmJ4Liq4Liz4Lir4Lij4Lix4Lia4LmB4Lit4Lib4Lie4Lil4Li04LmA4LiE4LiK4Lix4LiZ4LiX4Lix4LmI4Lin4LmE4LibIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLguYDguJvguKXguLXguYjguKLguJnguIHguLLguKPguKfguLLguIfguYHguJnguKfguKvguJnguYnguLLguIjguK0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLguK3guJnguLjguI3guLLguJXguYPguKvguYnguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJnguYDguJvguKXguLXguYjguKLguJnguIHguLLguKPguKvguKHguLjguJnguKvguJnguYnguLLguIjguK3guYTguJTguYnguJXguKXguK3guJTguYDguKfguKXguLIg4LmE4Lih4LmI4LiE4Lin4Lij4LiV4LmJ4Lit4LiH4LmD4LiK4LmJ4Liq4Liz4Lir4Lij4Lix4Lia4LmB4Lit4Lib4Lie4Lil4Li04LmA4LiE4LiK4Lix4LiZ4LiX4Lix4LmI4Lin4LmE4LibIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+IuC4quC5iOC4h+C4quC4seC4jeC4jeC4suC4kyBMaW51eCDguYTguJvguKLguLHguIfguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IuC4reC4meC4uOC4jeC4suC4leC5g+C4q+C5ieC5geC4reC4m+C4nuC4peC4tOC5gOC4hOC4iuC4seC4meC4o+C5ieC4reC4h+C4guC4reC5g+C4q+C5ieC4quC5iOC4h+C4quC4seC4jeC4jeC4suC4k+C5geC4iOC5ieC4h+C5hOC4m+C4ouC4seC4h+C4geC4o+C4sOC4muC4p+C4meC4geC4suC4o+C4l+C4teC5iOC4ouC4seC4h+C4l+C4s+C4h+C4suC4meC4reC4ouC4ueC5iOC4l+C4seC5ieC4h+C4q+C4oeC4lCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+IuC4l+C4s+C5g+C4q+C5ieC5geC4reC4m+C4nuC4peC4tOC5gOC4hOC4iuC4seC4meC4l+C4s+C4h+C4suC4meC4leC4peC4reC4lOC5gOC4p+C4peC4siI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IuC5gOC4m+C4peC4teC5iOC4ouC4meC5gOC4quC5ieC4meC4l+C4suC4h+C5geC4reC4m+C4nuC4peC4tOC5gOC4hOC4iuC4seC4mSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDguIHguLPguKXguLHguIfguJfguLPguIfguLLguJnguK3guKLguLnguYjguYPguJnguILguJPguLDguJnguLXguYkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LmE4Lin4LmJ4LmB4Lil4LmJ4LinIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IuC5geC4reC4m+C4nuC4peC4tOC5gOC4hOC4iuC4seC4mSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjguIHguKPguLDguJrguKfguJnguIHguLLguKMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDguKXguLDguYDguKHguLTguJTguJnguYLguKLguJrguLLguKIgU3RyaWN0TW9kZSDguJfguLXguYjguJrguLHguIfguITguLHguJrguYPguIrguYnguJTguYnguKfguKLguJXguLHguKfguYDguK3guIciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLguIHguKPguLDguJrguKfguJnguIHguLLguKMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IOC4peC4sOC5gOC4oeC4tOC4lOC4meC5guC4ouC4muC4suC4oiBTdHJpY3RNb2RlIOC4l+C4teC5iOC4muC4seC4h+C4hOC4seC4muC5g+C4iuC5ieC4lOC5ieC4p+C4ouC4leC4seC4p+C5gOC4reC4hyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g4LiB4Liz4Lil4Lix4LiH4LiX4Liz4LiH4Liy4LiZIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4i4LiX4Li14LmI4LmA4LiB4LmH4Lia4LiC4LmJ4Lit4Lih4Li54Lil4Lig4Liy4Lii4LmD4LiZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IuC4geC4suC4o+C5jOC4lCBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IuC4l+C4teC5iOC5gOC4geC5h+C4muC4guC5ieC4reC4oeC4ueC4pSBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCmluZGV4IDcyZDM2MWIuLmI2OTQyYTQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlBpbmFwYXlhZ2FuIGFuZyBob2xkZXIgbmEgbWFncGFkYWxhIG5nIG1nYSBpbnRlbnN5b24gc2EgYWRtaW5pc3RyYXRvciBuZyBkZXZpY2UuIEhpbmRpIGthaWxhbm1hbiBkYXBhdCBrYWlsYW5nYW5pbiBwYXJhIHNhIG1nYSBub3JtYWwgbmEgYXBwbGljYXRpb24uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJiYWd1aGluIGFuZyBvcmllbnRhdGlvbiBuZyBzY3JlZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJQaW5hcGF5YWdhbiBhbmcgaXNhbmcgYXBwbGljYXRpb24gbmEgYmFndWhpbiBhbmcgcGFnLXJvdGF0ZSBuZyBzY3JlZW4gYW51bWFuZyBvcmFzLiBIaW5kaSBrYWlsYW5tYW4gZGFwYXQga2FpbGFuZ2FuaW4gcGFyYSBzYSBtZ2Egbm9ybWFsIG5hIGFwcGxpY2F0aW9uLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJtYWdwYWRhbGEgbmcgbWdhIExpbnV4IHNpZ25hbCBzYSBtZ2EgYXBwbGljYXRpb24iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlBpbmFwYXlhZ2FuIGFuZyBhcHBsaWNhdGlvbiBuYSBoaWxpbmdpbmcgaXBhZGFsYSBhbmcgbmEtc3VwcGx5IG5hIHNpZ25hbCBzYSBsYWhhdCBuZyBtZ2EgcGF1bGl0LXVsaXQgbmEgcHJvc2Vzby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJwYWxhZ2luZyBwYXRha2J1aGluIGFuZyBtZ2EgYXBwbGljYXRpb24iPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJOaS1yZWRpcmVjdCBhcHBsaWNhdGlvbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iVHVtYXRha2JvIG5hIG5nYXlvbiBhbmcgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ik9yaWhpbmFsIG5hIG5hbHVuc2FkIGFuZyA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJBbmcgYXBwbGljYXRpb24gbmEgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvc2Vzb25nIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgYXkgbHVtYWJhZyBzYSBzYXJpbGkgbml0b25nIGlwaW5hcGF0dXBhZCBuYSBwYXRha2FyYW5nIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iQW5nIHByb3Nlc29uZyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gYXkgbHVtYWJhZyBzYSBzYXJpbGkgbml0b25nIGlwaW5hcGF0dXBhZCBuYSBwYXRha2FyYW5nIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiJUdW1hdGFrYm8gYW5nIDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iUGFubG9vYiBuYSBTdG9yYWdlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNEIENhcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0Igc3RvcmFnZSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKaW5kZXggODY4OGRkOC4uZTk3ZDgzNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iQ2loYXrEsW4gc2FoaWJpbmluIGNpaGF6IHnDtm5ldGljaXNpbmUgYW1hw6cgZ8O2bmRlcm1lc2luZSBpemluIHZlcmlyLiBOb3JtYWwgdXlndWxhbWFsYXJkYSBoacOnYmlyIHphbWFuIGdlcmVrIGR1eXVsbWFtYWzEsWTEsXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJla3JhbiB5w7Zuw7xuw7wgZGXEn2nFn3RpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IlV5Z3VsYW1hbGFyxLFuIGVrcmFuIHnDtm7DvG7DvCBpc3RlZGlrbGVyaSB6YW1hbiBkZcSfacWfdGlybWVzaW5lIGl6aW4gdmVyaXIuIE5vcm1hbCB1eWd1bGFtYWxhcmRhIGhpw6diaXIgemFtYW4gZ2VyZWttZW1lbGlkaXIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+InV5Z3VsYW1hbGFyYSBMaW51eCBzaW55YWxsZXJpIGfDtm5kZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlV5Z3VsYW1hbGFyxLFuLCBzYcSfbGFuYW4gc2lueWFsaW4gdMO8bSBrYWzEsWPEsSBpxZ9sZW1sZXJlIGfDtm5kZXJpbG1lc2luaSBpc3RlbWVzaW5lIGl6aW4gdmVyaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4idXlndWxhbWF5xLEgaGVyIHphbWFuIMOnYWzEscWfdMSxciI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlV5Z3VsYW1hIHnDtm5sZW5kaXJpbGRpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IMWfaW1kaSDDp2FsxLHFn8SxeW9yLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4ixLBsayBvbGFyYWsgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBiYcWfbGF0xLFsZMSxLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiI8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IHV5Z3VsYW1hc8SxICg8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4gacWfbGVtaSkga2VuZGlsacSfaW5kZW4gdXlndWxhZMSxxJ/EsSBTdHJpY3RNb2RlIHBvbGl0aWthc8SxbsSxIGlobGFsIGV0dGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGnFn2xlbWkga2VuZGlsacSfaW5kZW4gdXlndWxhZMSxxJ/EsSBTdHJpY3RNb2RlIHBvbGl0aWthc8SxbsSxIGlobGFsIGV0dGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiDDp2FsxLHFn8SxeW9yIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iRGFoaWxpIERlcG9sYW1hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNEIEthcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0IgZGVwb2xhbWEgYmlyaW1pIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbAppbmRleCA3Y2Q5Y2UxLi4wN2IxMWY3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiLQlNC+0LfQstC+0LvRj9GUINCy0LvQsNGB0L3QuNC60YMg0L3QsNC00YHQuNC70LDRgtC4INGG0ZbQu9GWINCw0LTQvNGW0L3RltGB0YLRgNCw0YLQvtGA0YMg0L/RgNC40YHRgtGA0L7Rji4g0J3RltC60L7Qu9C4INC90LUg0L/QvtGC0YDRltCx0L3QuNC5INC00LvRjyDQt9Cy0LjRh9Cw0LnQvdC40YUg0L/RgNC+0LPRgNCw0LwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLQt9C80ZbQvdGO0LLQsNGC0Lgg0L7RgNGW0ZTQvdGC0LDRhtGW0Y4g0LXQutGA0LDQvdCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4i0JTQvtC30LLQvtC70Y/RlCDQv9GA0L7Qs9GA0LDQvNGWINCx0YPQtNGMLdC60L7Qu9C4INC30LzRltC90Y7QstCw0YLQuCDQvtCx0LXRgNGC0LDQvdC90Y8g0LXQutGA0LDQvdCwLiDQndGW0LrQvtC70Lgg0L3QtSDQv9C+0YLRgNGW0LHQvdC40Lkg0LTQu9GPINC30LLQuNGH0LDQudC90LjRhSDQv9GA0L7Qs9GA0LDQvC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4i0L3QsNC00YHQuNC70LDRgtC4INGB0LjQs9C90LDQu9C4IExpbnV4INC/0YDQvtCz0YDQsNC80LDQvCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4i0JTQvtC30LLQvtC70Y/RlCDQv9GA0L7Qs9GA0LDQvNGWINC/0L7QtNCw0LLQsNGC0Lgg0LfQsNC/0LjRgiDRidC+0LTQviDQvdCw0LTRgdC40LvQsNC90L3RjyDQvdCw0LTQsNC90L7Qs9C+INGB0LjQs9C90LDQu9GDINCy0YHRltC8INC/0L7RgdGC0ZbQudC90LjQvCDQv9GA0L7RhtC10YHQsNC8LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ItC30LHQtdGALiDQv9GA0L7Qs9GA0LDQvNGDINC30LDQstC20LTQuCDQt9Cw0L/Rg9GJLiI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+ItCf0YDQvtCz0YDQsNC80YMg0L/QtdGA0LXQsNC00YDQtdGB0L7QstCw0L3QviI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4i0JfQsNGA0LDQtyDQv9GA0LDRhtGO0ZQgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+ItCh0L/QvtGH0LDRgtC60YMg0LHRg9C70L4g0LfQsNC/0YPRidC10L3QviA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLQn9GA0L7Qs9GA0LDQvNCwIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKNC/0YDQvtGG0LXRgSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pINC/0L7RgNGD0YjQuNC70LAg0YHQstC+0Y4g0YHQsNC80L7Qt9Cw0YHRgtC+0YHQvtCy0L3RgyDQv9C+0LvRltGC0LjQutGDIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i0J/RgNC+0YbQtdGBIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDQv9C+0YDRg9GI0LjQsiDRgdCy0L7RjiDRgdCw0LzQvtC30LDRgdGC0L7RgdC+0LLQvdGDINC/0L7Qu9GW0YLQuNC60YMgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+ItCf0YDQsNGG0Y7RlCA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+ItCS0L3Rg9GC0YDRltGI0L3RjyDQv9Cw0LzigJnRj9GC0YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4i0JrQsNGA0YLQutCwIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4i0J3QvtGB0ZbQuSBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCmluZGV4IGViNGFlZTMuLmNmYjUzYWMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IkNobyBwaMOpcCBjaOG7pyBuaMOibiBn4butaSBjw6FjIMO9IMSR4buLbmggxJHhur9uIHF14bqjbiB0cuG7iyB2acOqbiB0aGnhur90IGLhu4suIEtow7RuZyBj4bqnbiB0aGnhur90IGNobyBjw6FjIOG7qW5nIGThu6VuZyB0aMO0bmcgdGjGsOG7nW5nLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4idGhheSDEkeG7lWkgaMaw4bubbmcgbcOgbiBow6xuaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IkNobyBwaMOpcCDhu6luZyBk4bulbmcgdGhheSDEkeG7lWkgdmnhu4djIHhvYXkgbcOgbiBow6xuaCBi4bqldCBr4buzIGtoaSBuw6BvLiBLaMO0bmcgY+G6p24gdGhp4bq/dCBjaG8gY8OhYyDhu6luZyBk4bulbmcgdGjDtG5nIHRoxrDhu51uZy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4iZ+G7rWkgdMOtbiBoaeG7h3UgTGludXggxJHhur9uIOG7qW5nIGThu6VuZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iQ2hvIHBow6lwIOG7qW5nIGThu6VuZyB5w6p1IGPhuqd1IHTDrW4gaGnhu4d1IMSRw6MgY3VuZyBj4bqlcCDEkcaw4bujYyBn4butaSDEkeG6v24gdOG6pXQgY+G6oyBjw6FjIHF1w6EgdHLDrG5oIGxpw6puIHThu6VjLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+IsSR4bq3dCDhu6luZyBk4bulbmcgbHXDtG4gY2jhuqF5Ijwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i4buobmcgZOG7pW5nIMSRw6MgxJHGsOG7o2MgY2h1eeG7g24gaMaw4bubbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gaGnhu4duIMSRYW5nIGNo4bqheS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gxJHGsOG7o2Mga2jhu59pIGNo4bqheSB0csaw4bubYyB0acOqbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i4buobmcgZOG7pW5nIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHF1w6EgdHLDrG5oIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgxJHDoyB2aSBwaOG6oW0gY2jDrW5oIHPDoWNoIFN0cmljdE1vZGUgdOG7sSB0aGkgaMOgbmggY+G7p2EgbcOsbmguIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUXXDoSB0csOsbmggPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IMSRw6MgdmkgcGjhuqFtIGNow61uaCBzw6FjaCBTdHJpY3RNb2RlIHThu7EgdGhpIGjDoG5oIGPhu6dhIG3DrG5oLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gxJFhbmcgaG/huqF0IMSR4buZbmciPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJC4buZIG5o4bubIHRyb25nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlRo4bq7IFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iQuG7mSBsxrB1IHRy4buvIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy13MTI4MGRwL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXcxMjgwZHAvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjdiM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy13MTI4MGRwL2RpbWVucy54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9zY3JlZW5fc2lkZV9tYXJnaW4iPjk2ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJwcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbl9uZWdhdGl2ZSI+LTEwMGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV93aWRnZXRfd2lkdGgiPjY0ZHA8L2RpbWVuPgorICAgIDwhLS0gUHJlZmVyZW5jZSBmcmFnbWVudCBwYWRkaW5nLCBib3R0b20gLS0+CisgICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2VfZnJhZ21lbnRfcGFkZGluZ19ib3R0b20iPjQ4ZHA8L2RpbWVuPgorICAgIDwhLS0gUHJlZmVyZW5jZSBmcmFnbWVudCBwYWRkaW5nLCBzaWRlcyAtLT4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9mcmFnbWVudF9wYWRkaW5nX3NpZGUiPjQ4ZHA8L2RpbWVuPgorICAgIDwhLS0gUGFkZGluZyB0byB0aGUgbGVmdCBvZiB0aGUgcHJlZmVyZW5jZSBwYW5lbCBicmVhZGNydW1iIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwcmVmZXJlbmNlX2JyZWFkY3J1bWJfcGFkZGluZ0xlZnQiPjQ4ZHA8L2RpbWVuPgorICAgIDwhLS0gUGFkZGluZyB0byB0aGUgcmlnaHQgb2YgdGhlIHByZWZlcmVuY2UgcGFuZWwgYnJlYWRjcnVtYiAtLT4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9icmVhZGNydW1iX3BhZGRpbmdSaWdodCI+NDhkcDwvZGltZW4+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy13NzIwZHAvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdzcyMGRwL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxMTk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdzcyMGRwL2RpbWVucy54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFByZWZlcmVuY2UgZnJhZ21lbnQgcGFkZGluZywgc2lkZXMgLS0+CisgICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2VfZnJhZ21lbnRfcGFkZGluZ19zaWRlIj4zMmRwPC9kaW1lbj4KKyAgICA8IS0tIFBhZGRpbmcgdG8gdGhlIGxlZnQgb2YgdGhlIHByZWZlcmVuY2UgcGFuZWwgYnJlYWRjcnVtYiAtLT4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9icmVhZGNydW1iX3BhZGRpbmdMZWZ0Ij4zMmRwPC9kaW1lbj4KKyAgICA8IS0tIFBhZGRpbmcgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwcmVmZXJlbmNlIHBhbmVsIGJyZWFkY3J1bWIgLS0+CisgICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2VfYnJlYWRjcnVtYl9wYWRkaW5nUmlnaHQiPjMyZHA8L2RpbWVuPgorICAgIDwhLS0gV2VpZ2h0IG9mIHRoZSBsZWZ0IHBhbmUgaW4gYSBtdWx0aS1wYW5lIHByZWZlcmVuY2UgbGF5b3V0LiAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJwcmVmZXJlbmNlc19sZWZ0X3BhbmVfd2VpZ2h0Ij4xPC9pbnRlZ2VyPgorICAgIDwhLS0gV2VpZ2h0IG9mIHRoZSByaWdodCBwYW5lIGluIGEgbXVsdGktcGFuZSBwcmVmZXJlbmNlIGxheW91dC4gU28gdGhlIHNwbGl0IGlzIDE6MiAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJwcmVmZXJlbmNlc19yaWdodF9wYW5lX3dlaWdodCI+MjwvaW50ZWdlcj4KKyAgICA8IS0tIE1pbmltdW0gc3BhY2UgdG8gYWxsb2NhdGUgdG8gdGhlIGxlZnQgb2YgYSBwcmVmZXJlbmNlIGl0ZW0gZm9yIGFuIGljb24uCisgICAgICAgIFRoaXMgaGVscHMgaW4gYWxpZ25pbmcgdGl0bGVzIHdoZW4gc29tZSBpdGVtcyBoYXZlIGljb25zIGFuZCBzb21lIGRvbid0LiBXaGVuIHNwYWNlIGlzCisgICAgICAgIGF0IGEgcHJlbWl1bSwgd2UgZG9uJ3QgcHJlLWFsbG9jYXRlIGFueSBzcGFjZS4gLS0+CisgICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2VfaWNvbl9taW5XaWR0aCI+NDhkcDwvZGltZW4+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCmluZGV4IGI5MDZlMWEuLmMxNTc3MGQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbApAQCAtMTgsMTMgKzE4LDYgQEAKICovCiAtLT4KIDxyZXNvdXJjZXM+Ci0gICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaGVpZ2h0Ij40OGRpcDwvZGltZW4+Ci0gICAgPCEtLSBXaWR0aCBhbmQgaGVpZ2h0IG9mIGEgc2luZ2xlIG5vdGlmaWNhdGlvbiBpY29uIGluIHRoZSBzdGF0dXMgYmFyIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fc2l6ZSI+MzJkaXA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiB0aGUgZ2lhbnQgbnVtYmVyICh1bnJlYWQgY291bnQpIGluIHRoZSBub3RpZmljYXRpb25zIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2NvbnRlbnRfbnVtYmVyX3NpemUiPjQ4c3A8L2RpbWVuPgotCiAgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIGFscGhhIC0tPgogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIj43NWRpcDwvZGltZW4+CiAgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIG51bWVyaWMgLS0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3R5bGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5ZDlkNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTdGF0dXMgQmFyIFN0eWxlcyAtLT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciI+Ci0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpdGxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSWNvbiI+Ci0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4jZmY5OTk5OTk8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudC5UaXRsZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5UYWJXaWRnZXQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3IvdGFiX2luZGljYXRvcl90ZXh0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0gICAgCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlRhYldpZGdldCIgcGFyZW50PSJXaWRnZXQuVGFiV2lkZ2V0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+QHN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlRhYldpZGdldDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0YWJTdHJpcExlZnQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRhYlN0cmlwUmlnaHQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRhYlN0cmlwRW5hYmxlZCI+ZmFsc2U8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGl2aWRlciI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+bGVmdHxjZW50ZXJfdmVydGljYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGFiTGF5b3V0Ij5AYW5kcm9pZDpsYXlvdXQvdGFiX2luZGljYXRvcl9ob2xvX2xhcmdlPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0gICAgCi0gICAgPHN0eWxlIG5hbWU9IlByZWZlcmVuY2VQYW5lbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQiPkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQiPkBkaW1lbi9wcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wIj40OGRpcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tIj40OGRpcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj4/YXR0ci9kZXRhaWxzRWxlbWVudEJhY2tncm91bmQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLTwvcmVzb3VyY2VzPgotCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmluZGV4IDEzNDg0NWEuLmI0NWIzNDYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i5YWB6K645oyB5pyJ5a+56LGh5bCG5oSP5ZCR5Y+R6YCB5Yiw6K6+5aSH566h55CG5Zmo44CC5pmu6YCa55qE5bqU55So56iL5bqP5LiA5b6L5peg6ZyA5q2k5p2D6ZmQ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLmm7TmlLnlsY/luZXmmL7npLrmlrnlkJEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLlhYHorrjlupTnlKjnqIvluo/pmo/ml7bmm7TmlLnlsY/luZXnmoTml4vovazmlrnlkJHjgILmma7pgJrlupTnlKjnqIvluo/ku47kuI3pnIDopoHkvb/nlKjmraTmnYPpmZDjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4i5ZCR5bqU55So56iL5bqP5Y+R6YCBIExpbnV4IOS/oeWPtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4i5YWB6K645bqU55So56iL5bqP6K+35rGC5bCG5omA5o+Q5L6b55qE5L+h5Y+35Y+R6YCB57uZ5omA5pyJ5oyB5LmF6L+b56iL44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4i6K6p5bqU55So56iL5bqP5aeL57uI6L+Q6KGMIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i5bqU55So56iL5bqP5bey6YeN5a6a5ZCRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+55uu5YmN5q2j5Zyo6L+Q6KGM44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+5bey5ZCv5Yqo44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IuW6lOeUqOeoi+W6jzx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz7vvIg8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4g6L+b56iL77yJ6L+d5Y+N5LqG6Ieq5oiR5by65Yi25omn6KGM55qE5Lil5qC85qih5byPIChTdHJpY3RNb2RlKSDmlL/nrZbjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLov5vnqIsgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IOi/neWPjeS6huiHquaIkeW8uuWItuaJp+ihjOeahOS4peagvOaooeW8jyAoU3RyaWN0TW9kZSkg5pS/562W44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPuato+WcqOi/kOihjCI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IuWGheWtmOepuumXtCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRCDljaEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0Ig5a2Y5YKo5ZmoIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCmluZGV4IDcwNzU2NzcuLjM5OWE1YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmFja3VwIiBtc2dpZD0iNDcwMDEzMDIyODY1NDUzOTIwIj4i5o6n5Yi257O757Wx5YKZ5Lu96IiH6YKE5Y6fIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmFja3VwIiBtc2dpZD0iNDgzNzQ5MzA2NTE1NDI1NjUyNSI+IuWFgeioseaHieeUqOeoi+W8j+aOp+WItuezu+e1seeahOWCmeS7veiIh+mChOWOn+apn+WItuOAguS4gOiIrOaHieeUqOeoi+W8j+S4jeaHieS9v+eUqOmAmemgheWKn+iDveOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjU1NTcwNzEzMjU4MDQ0NjkxMDIiPiLnorroqo3lrozmlbTlgpnku73miJbpgoTljp/kvZzmpa0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jb25maXJtX2Z1bGxfYmFja3VwIiBtc2dpZD0iOTAwNTAxNzc1NDE3NTg5Nzk1NCI+IuWFgeioseaHieeUqOeoi+W8j+WVn+WLleWujOaVtOWCmeS7veeiuuiqjeS9v+eUqOiAheeVjOmdou+8jOS7u+S9leaHieeUqOeoi+W8j+Wdh+S4jeaHieS9v+eUqOmAmemgheWKn+iDveOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NvbmZpcm1fZnVsbF9iYWNrdXAiIG1zZ2lkPSI5MDA1MDE3NzU0MTc1ODk3OTU0Ij4i5YWB6Kix5oeJ55So56iL5byP5ZWf5YuV5a6M5pW05YKZ5Lu956K66KqN5L2/55So6ICF5LuL6Z2i77yM5Lu75L2V5oeJ55So56iL5byP5Z2H5LiN5oeJ5L2/55So6YCZ6aCF5Yqf6IO944CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9pbnRlcm5hbFN5c3RlbVdpbmRvdyIgbXNnaWQ9IjIxNDg1NjM2MjgxNDAxOTMyMzEiPiLpoa/npLrmnKrmjojmrIroppbnqpciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19pbnRlcm5hbFN5c3RlbVdpbmRvdyIgbXNnaWQ9IjU4OTUwODIyNjgyODQ5OTg0NjkiPiLlhYHoqLHlhafpg6jns7vntbHkvb/nlKjku4vpnaLlu7rnq4voppbnqpfjgILkuIDoiKzmh4nnlKjnqIvlvI/kuI3mnIPkvb/nlKjmraTlip/og73jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N5c3RlbUFsZXJ0V2luZG93IiBtc2dpZD0iMzM3MjMyMTk0Mjk0MTE2ODMyNCI+Iumhr+ekuuezu+e1seitpuekuiI8L3N0cmluZz4KQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiLlhYHoqLHmh4nnlKjnqIvlvI/lsIfoqr/nlKjoq4vmsYIgKGludGVudCkg5YKz6YCB6Iez6KOd572u566h55CG5ZOh77yb5LiA6Iis5oeJ55So56iL5byP5LiN6ZyA5L2/55So5q2k6YG46aCF44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLorormm7TonqLluZXpoa/npLrmlrnlkJEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLlhYHoqLHmh4nnlKjnqIvlvI/lj6/pmqjmmYLorormm7TonqLluZXml4vovYnmlrnlkJHjgILkuIDoiKzmh4nnlKjkuI3mh4nkvb/nlKjpgJnpoIXlip/og73jgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4i5YKz6YCBIExpbnV4IOioiuiZn+WIsOaHieeUqOeoi+W8jyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4i5YWB6Kix5oeJ55So56iL5byP6KaB5rGC5bCH5pSv5o+055qE6KiK6Jmf5YKz6YCB5Yiw5omA5pyJ5oyB57qM55qE56iL5bqP44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4i6Kit5a6a5oeJ55So56iL5byP5oyB57qM5Z+36KGMIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i5oeJ55So56iL5byP5bey6YeN5paw5bCO5ZCRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiLjgIw8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+44CN54++5Zyo5q2j5Zyo5Z+36KGM44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLjgIw8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+44CN5Y6f5YWI5bey5ZWf5YuV44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IuaHieeUqOeoi+W8jyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjomZXnkIbnqIvluo8gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDlt7LpgZXlj43lhbboh6rooYzlvLfliLblr6bmlr3nmoTlmrTmoLzmqKHlvI8gKFN0cmljdE1vZGUpIOaUv+etluOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IuiZleeQhueoi+W6jyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4g5bey6YGV5Y+N5YW26Ieq6KGM5by35Yi25a+m5pa955qE5Zq05qC85qih5byPIChTdHJpY3RNb2RlKSDmlL/nrZbjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IOWft+ihjOS4rSI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IuWFp+mDqOWEsuWtmOepuumWkyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRCDljaEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0Ig5YSy5a2Y6KOd572uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAppbmRleCA5ZmRhMzUwLi42ZjE0N2U3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKQEAgLTM5Niw2ICszOTYsMTAgQEAKICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldE9yaWVudGF0aW9uICgzMzY1OTQ3NzE3MTYzODY2ODQ0KSAtLT4KICAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iSXZ1bWVsYSB1aGxlbG8gbG9rdXNlYmVuemEgdWt1c2hpbnRzaGEgdWt1amlrZWxlbGV6YSBrd2VzaWtyaW5pIG5nYW5vbWEgaXNpcGhpIGlzaWtoYXRoaS4gQXlpc296ZSB5YWRpbmdla2EgaXppbmhsZWxvIHpva3VzZWJlbnphIGV6aXZhbWlsZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzICg0MjU1NDY3MjU1NDg4NjUzODU0KSAtLT4KICAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJJdnVtZWxhIHVobGVsbyBsb2t1c2ViZW56YSB1a3VjZWxhIHVrdXRoaSBpc2lnaW5hbGkgZW5pa2V6aXdlIGl0aHVueWVsd2Uga3V6byB6b25rZSBpemlucXVibyBlemlwaGlrZWxlbGF5byI8L3N0cmluZz4KQEAgLTExNTQsNiArMTE1OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iVWhsZWxvIGxva3VzZWJlbnphIGx1cW9uZGlzaXdlIGZ1dGhpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGl5YXNlYmVuemEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGlxYWxpc2l3ZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iSW5xdWJvIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHlvaGxlbG8gbG9rdXNlYmVuemEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBpcGh1bGUgaW5xdWJvbWdvbW8gb3ppcGhvcWVsZWxhIHlvbmEgWWVtb2RpIEVidWtoYWxpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IklucXVibyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4geWVwaHVsZSBpbnF1Ym9tZ29tbyB5b2t1emlwaG9xZWxlbGEgWWVtb2RpIEVidWtoYWxpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gaXlhc2ViZW56YSI8L3N0cmluZz4KQEAgLTE0MjMsNCArMTQzMyw2IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdG9yYWdlX3VzYiAoMzAxNzk1NDA1OTUzODUxNzI3OCkgLS0+CiAgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAppbmRleCBmODU0ZTkzLi45YzU1NjI3IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtNjE5LDYgKzYxOSw4IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVDb3B5RHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIERyYXdhYmxlIHRvIHVzZSBmb3IgdGhlIFBhc3RlIGFjdGlvbiBidXR0b24gaW4gQ29udGV4dHVhbCBBY3Rpb24gQmFyIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlUGFzdGVEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRHJhd2FibGUgdG8gdXNlIGZvciB0aGUgU2VsZWN0IGFsbCBhY3Rpb24gYnV0dG9uIGluIENvbnRleHR1YWwgQWN0aW9uIEJhciAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uTW9kZVNlbGVjdEFsbERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEcmF3YWJsZSB0byB1c2UgZm9yIHRoZSBTaGFyZSBhY3Rpb24gYnV0dG9uIGluIFdlYlZpZXcgc2VsZWN0aW9uIGFjdGlvbiBtb2RlcyAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uTW9kZVNoYXJlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIERyYXdhYmxlIHRvIHVzZSBmb3IgdGhlIEZpbmQgYWN0aW9uIGJ1dHRvbiBpbiBXZWJWaWV3IHNlbGVjdGlvbiBhY3Rpb24gbW9kZXMgLS0+CkBAIC0xMTI4LDYgKzExMzAsMTAgQEAKICAgICAgICAgICAgICBUaGUgY2xpcCB3aWxsIGJlIGJhc2VkIG9uIHRoZSBob3Jpem9udGFsIGdyYXZpdHk6IGEgbGVmdCBncmF2aXR5IHdpbGwgY2xpcCB0aGUgcmlnaHQKICAgICAgICAgICAgICBlZGdlLCBhIHJpZ2h0IGdyYXZpdHkgd2lsbCBjbGlwIHRoZSBsZWZ0IGVkZ2UsIGFuZCBuZWl0aGVyIHdpbGwgY2xpcCBib3RoIGVkZ2VzLiAtLT4KICAgICAgICAgPGZsYWcgbmFtZT0iY2xpcF9ob3Jpem9udGFsIiB2YWx1ZT0iMHgwOCIgLz4KKyAgICAgICAgPCEtLSBQdXNoIG9iamVjdCB0byB0aGUgYmVnaW5uaW5nIG9mIGl0cyBjb250YWluZXIsIG5vdCBjaGFuZ2luZyBpdHMgc2l6ZS4gLS0+CisgICAgICAgIDxmbGFnIG5hbWU9ImJlZm9yZSIgdmFsdWU9IjB4MDA4MDAwMDMiIC8+CisgICAgICAgIDwhLS0gUHVzaCBvYmplY3QgdG8gdGhlIGVuZCBvZiBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuIC0tPgorICAgICAgICA8ZmxhZyBuYW1lPSJhZnRlciIgdmFsdWU9IjB4MDA4MDAwMDUiIC8+CiAgICAgPC9hdHRyPgogCiAgICAgPCEtLSBDb250cm9scyB3aGV0aGVyIGxpbmtzIHN1Y2ggYXMgdXJscyBhbmQgZW1haWwgYWRkcmVzc2VzIGFyZQpAQCAtMTE4NCw2ICsxMTkwLDEwIEBACiAgICAgICAgICAgICAgVGhlIGNsaXAgd2lsbCBiZSBiYXNlZCBvbiB0aGUgaG9yaXpvbnRhbCBncmF2aXR5OiBhIGxlZnQgZ3Jhdml0eSB3aWxsIGNsaXAgdGhlIHJpZ2h0CiAgICAgICAgICAgICAgZWRnZSwgYSByaWdodCBncmF2aXR5IHdpbGwgY2xpcCB0aGUgbGVmdCBlZGdlLCBhbmQgbmVpdGhlciB3aWxsIGNsaXAgYm90aCBlZGdlcy4gLS0+CiAgICAgICAgIDxmbGFnIG5hbWU9ImNsaXBfaG9yaXpvbnRhbCIgdmFsdWU9IjB4MDgiIC8+CisgICAgICAgIDwhLS0gUHVzaCBvYmplY3QgdG8gdGhlIGJlZ2lubmluZyBvZiBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuIC0tPgorICAgICAgICA8ZmxhZyBuYW1lPSJiZWZvcmUiIHZhbHVlPSIweDAwODAwMDAzIiAvPgorICAgICAgICA8IS0tIFB1c2ggb2JqZWN0IHRvIHRoZSBlbmQgb2YgaXRzIGNvbnRhaW5lciwgbm90IGNoYW5naW5nIGl0cyBzaXplLiAtLT4KKyAgICAgICAgPGZsYWcgbmFtZT0iYWZ0ZXIiIHZhbHVlPSIweDAwODAwMDA1IiAvPgogICAgIDwvYXR0cj4KIAogICAgIDwhLS0gU3RhbmRhcmQgb3JpZW50YXRpb24gY29uc3RhbnQuIC0tPgpAQCAtMjEyOSwxMSArMjEzOSw5MiBAQAogICAgICAgICAgICAgIHN0cmluZyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlCiAgICAgICAgICAgICAgc3VidHlwZS4gIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU2V0IHRydWUgaWYgdGhlIHN1YnR5cGUgaXMgYXV4aWxpYXJ5LiAgQW4gYXV4aWxpYXJ5IHN1YnR5cGUgd29uJ3QgYmUgc2hvd24gaW4gdGhlCisgICAgICAgICAgICAgaW5wdXQgbWV0aG9kIHNlbGVjdGlvbiBsaXN0IGluIHRoZSBzZXR0aW5ncyBhcHAuCisgICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyI3N3aXRjaFRvTGFzdElucHV0TWV0aG9kIHdpbGwgaWdub3JlIGF1eGlsaWFyeSBzdWJ0eXBlcyB3aGVuIGl0CisgICAgICAgICAgICAgY2hvb3NlcyBhIHRhcmdldCBzdWJ0eXBlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaXNBdXhpbGlhcnkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICAgICAgPCEtLSBUaGUgZXh0cmEgdmFsdWUgb2YgdGhlIHN1YnR5cGUuIFRoaXMgc3RyaW5nIGNhbiBiZSBhbnkgc3RyaW5nIGFuZCB3aWxsIGJlIHBhc3NlZCB0bwogICAgICAgICAgICAgIHRoZSBJTUUgd2hlbiB0aGUgZnJhbWV3b3JrIGNhbGxzIHRoZSBJTUUgd2l0aCB0aGUgc3VidHlwZS4gIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJpbWVTdWJ0eXBlRXh0cmFWYWx1ZSIgZm9ybWF0PSJzdHJpbmciIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDwhLS0gVXNlIDxjb2RlPmFjY2Vzc2liaWxpdHktc2VydmljZTwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAorICAgICAgICAgZGVzY3JpYmVzIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfSBzZXJ2aWNlLAorICAgICAgICAgd2hpY2ggaXMgcmVmZXJlbmNlZCBmcm9tIGl0cworICAgICAgICAge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UjU0VSVklDRV9NRVRBX0RBVEF9CisgICAgICAgICBtZXRhLWRhdGEgZW50cnkuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBY2Nlc3NpYmlsaXR5U2VydmljZSI+CisgICAgICAgIDwhLS0gVGhlIGV2ZW50IHR5cGVzIHRoaXMgc2VyaXZjZSB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgYXMgc3BlY2lmaWVkIGluCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudH0uIFRoaXMgc2V0dGluZworICAgICAgICAgICAgIGNhbiBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUgYnkgY2FsbGluZworICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlI3NldFNlcnZpY2VJbmZvKGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKX0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY2Nlc3NpYmlsaXR5RXZlbnRUeXBlcyI+CisgICAgICAgICAgICA8IS0tIFJlY2VpdmVzIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX0NMSUNLRUR9IGV2ZW50cy4tLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVWaWV3Q2xpY2tlZCIgdmFsdWU9IjB4MDAwMDAwMDEiIC8+CisgICAgICAgICAgICA8IS0tIFJlY2VpdmVzIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX0xPTkdfQ0xJQ0tFRH0gZXZlbnRzLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVWaWV3TG9uZ0NsaWNrZWQiIHZhbHVlPSIweDAwMDAwMDAyIiAvPgorICAgICAgICAgICAgPCEtLSBSZWNlaXZlcyB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19TRUxFQ1RFRH0gZXZlbnRzLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVWaWV3U2VsZWN0ZWQiIHZhbHVlPSIweDAwMDAwMDA0IiAvPgorICAgICAgICAgICAgPCEtLSBSZWNlaXZlcyB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19GT0NVU0VEfSBldmVudHMuIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0idHlwZVZpZXdGb2N1c2VkIiB2YWx1ZT0iMHgwMDAwMDAwOCIgLz4KKyAgICAgICAgICAgIDwhLS0gUmVjZWl2ZXMge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1ZJRVdfVEVYVF9DSEFOR0VEfSBldmVudHMuIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0idHlwZVZpZXdUZXh0Q2hhbmdlZCIgdmFsdWU9IjB4MDAwMDAwMTAiIC8+CisgICAgICAgICAgICA8IS0tIFJlY2VpdmVzIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9XSU5ET1dfU1RBVEVfQ0hBTkdFRH0gZXZlbnRzLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVXaW5kb3dTdGF0ZUNoYW5nZWQiIHZhbHVlPSIweDAwMDAwMDIwIiAvPgorICAgICAgICAgICAgPCEtLSBSZWNlaXZlcyB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUR9IGV2ZW50cy4gLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ0eXBlTm90aWZpY2F0aW9uU3RhdGVDaGFuZ2VkIiB2YWx1ZT0iMHgwMDAwMDA0MCIgLz4KKyAgICAgICAgICAgIDwhLS0gUmVjZWl2ZXMge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1ZJRVdfSE9WRVJfRU5URVJ9IGV2ZW50cy4gLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ0eXBlVmlld0hvdmVyRW50ZXIiIHZhbHVlPSIweDAwMDAwMDgwIiAvPgorICAgICAgICAgICAgPCEtLSBSZWNlaXZlcyB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19IT1ZFUl9FWElUfSBldmVudHMuIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0idHlwZVZpZXdIb3ZlckV4aXQiIHZhbHVlPSIweDAwMDAwMTAwIiAvPgorICAgICAgICAgICAgPCEtLSBSZWNlaXZlcyB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVE9VQ0hfRVhQTE9SQVRJT05fR0VTVFVSRV9TVEFSVH0gZXZlbnRzLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVUb3VjaEV4cGxvcmF0aW9uR2VzdHVyZVN0YXJ0IiB2YWx1ZT0iMHgwMDAwMDIwMCIgLz4KKyAgICAgICAgICAgIDwhLS0gUmVjZWl2ZXMge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfRU5EfSBldmVudHMuIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0idHlwZVRvdWNoRXhwbG9yYXRpb25HZXN0dXJlRW5kIiB2YWx1ZT0iMHgwMDAwMDQwMCIgLz4KKyAgICAgICAgICAgIDwhLS0gUmVjZWl2ZXMge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFU19BTExfTUFTS30gaS5lLiBhbGwgZXZlbnRzLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVBbGxNYXNrIiB2YWx1ZT0iMHhmZmZmZmZmZiIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIENvbW1hIHNlcGFyYXRlZCBwYWNrYWdlIG5hbWVzIGZyb20gd2hpY2ggdGhpcyBzZXJpdmNlIHdvdWxkIGxpa2UgdG8gcmVjZWl2ZSBldmVudHMgKGxlYXZlIG91dCBmb3IgYWxsIHBhY2thZ2VzKS4KKyAgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSBieSBjYWxsaW5nCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2Ujc2V0U2VydmljZUluZm8oYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pfS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBhY2thZ2VOYW1lcyIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIGZlZWRiYWNrIHR5cGVzIHRoaXMgc2VyaXZjZSBwcm92aWRlcyBhcyBzcGVjaWZpZWQgaW4KKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm99LiBUaGlzIHNldHRpbmcKKyAgICAgICAgICAgICBjYW4gYmUgY2hhbmdlZCBhdCBydW50aW1lIGJ5IGNhbGxpbmcKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSNzZXRTZXJ2aWNlSW5mbyhhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyl9LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWNjZXNzaWJpbGl0eUZlZWRiYWNrVHlwZSI+CisgICAgICAgICAgICA8IS0tIFByb3ZpZGVzIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNGRUVEQkFDS19TUE9LRU59IGZlZWRiYWNrLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9ImZlZWRiYWNrU3Bva2VuIiB2YWx1ZT0iMHgwMDAwMDAwMSIgLz4KKyAgICAgICAgICAgIDwhLS0gUHJvdmlkZXMge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI0ZFRURCQUNLX0hBUFRJQ30gZmVlZGJhY2suIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iZmVlZGJhY2tIYXB0aWMiIHZhbHVlPSIweDAwMDAwMDAyIiAvPgorICAgICAgICAgICAgPCEtLSBQcm92aWRlcyB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jRkVFREJBQ0tfQVVESUJMRX0gZmVlZGJhY2suIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iZmVlZGJhY2tBdWRpYmxlIiB2YWx1ZT0iMHgwMDAwMDAwNCIgLz4KKyAgICAgICAgICAgIDwhLS0gUHJvdmlkZXMge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI0ZFRURCQUNLX1ZJU1VBTH0gZmVlZGJhY2suIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iZmVlZGJhY2tWaXN1YWwiIHZhbHVlPSIweDAwMDAwMDA4IiAvPgorICAgICAgICAgICAgPCEtLSBQcm92aWRlcyB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jRkVFREJBQ0tfR0VORVJJQ30gZmVlZGJhY2suIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iZmVlZGJhY2tHZW5lcmljIiB2YWx1ZT0iMHgwMDAwMDAxMCIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIFRoZSBtaW5pbWFsIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0d28gYWNjZXNzaWJpbGl0eSBldmVudHMgYXJlIHNlbnQKKyAgICAgICAgICAgICB0byB0aGlzIHNlcml2Y2UuIFRoaXMgc2V0dGluZyBjYW4gYmUgY2hhbmdlZCBhdCBydW50aW1lIGJ5IGNhbGxpbmcKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSNzZXRTZXJ2aWNlSW5mbyhhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyl9LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibm90aWZpY2F0aW9uVGltZW91dCIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8IS0tIEFkZGl0aW9uYWwgZmxhZ3MgYXMgc3BlY2lmaWVkIGluCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvfS4KKyAgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSBieSBjYWxsaW5nCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2Ujc2V0U2VydmljZUluZm8oYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pfS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjY2Vzc2liaWxpdHlGbGFncyI+CisgICAgICAgICAgICA8IS0tIEhhcyBmbGFnIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNERUZBVUxUfSAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9ImZsYWdEZWZhdWx0IiB2YWx1ZT0iMHgwMDAwMDAwMSIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIENvbXBvbmVudCBuYW1lIG9mIGFuIGFjdGl2aXR5IHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIG1vZGlmeQorICAgICAgICAgICAgIHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBzZXJ2aWNlLiBUaGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgYXQgcnVudGltZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNldHRpbmdzQWN0aXZpdHkiIC8+CisgICAgICAgIDwhLS0gRmxhZyB3aGV0aGVyIHRoZSBhY2Nlc3NpYmlsaXR5IHNlcnZpY2Ugd2FudHMgdG8gYmUgYWJsZSB0byByZXRyaWV2ZSB0aGUKKyAgICAgICAgICAgICBmb2N1c2VkIHdpbmRvdyBjb250ZW50LiBUaGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgYXQgcnVudGltZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImNhblJldHJpZXZlV2luZG93Q29udGVudCIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBXaWRnZXQgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTI0MzEsMTAgKzI1MjIsMTAgQEAKICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJHcmlkTGF5b3V0Ij4KICAgICAgICAgPCEtLSBUaGUgb3JpZW50YXRpb24gcHJvcGVydHkgaXMgbm90IHVzZWQgZHVyaW5nIGxheW91dC4gSXQgaXMgb25seSB1c2VkIHRvCi0gICAgICAgIGFsbG9jYXRlIHJvdyBhbmQgY29sdW1uIHByYW1ldGVycyB3aGVuIHRoZXkgYXJlIG5vdCBzcGVjaWZpZWQgYnkgaXRzIGNoaWxkcmVuJ3MKKyAgICAgICAgYWxsb2NhdGUgcm93IGFuZCBjb2x1bW4gcGFyYW1ldGVycyB3aGVuIHRoZXkgYXJlIG5vdCBzcGVjaWZpZWQgYnkgaXRzIGNoaWxkcmVuJ3MKICAgICAgICAgbGF5b3V0IHBhcmFtdGVycy4gR3JpZExheW91dCB3b3JrcyBsaWtlIExpbmVhckxheW91dCBpbiB0aGlzIGNhc2U7CiAgICAgICAgIHB1dHRpbmcgYWxsIHRoZSBjb21wb25lbnRzIGVpdGhlciBpbiBhIHNpbmdsZSByb3cgb3IgaW4gYSBzaW5nbGUgY29sdW1uIC0KLSAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcuIEluIHRoZSBob3JvemludGFsIGNhc2UsIGEgY29sdW1uQ291bnQKKyAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcuIEluIHRoZSBob3Jpem9udGFsIGNhc2UsIGEgY29sdW1uQ291bnQKICAgICAgICAgcHJvcGVydHkgbWF5IGJlIGFkZGl0aW9uYWxseSBzdXBwbGllZCB0byBmb3JjZSBuZXcgcm93cyB0byBiZSBjcmVhdGVkIHdoZW4gYQogICAgICAgICByb3cgaXMgZnVsbC4gVGhlIHJvd0NvdW50IGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCBzaW1pbGFybHkgaW4gdGhlIHZlcnRpY2FsIGNhc2UuCiAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGhvcml6b250YWwuIC0tPgpAQCAtMjQ0OCw2ICsyNTM5LDEyIEBACiAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgogICAgICAgICBTZWUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQjc2V0VXNlRGVmYXVsdE1hcmdpbnMoYm9vbGVhbil9Li0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ1c2VEZWZhdWx0TWFyZ2lucyIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIFdoZW4gc2V0IHRvIHRydWUsIGNhdXNlcyBhbGlnbm1lbnQgdG8gdGFrZSBwbGFjZSBiZXR3ZWVuIHRoZSBvdXRlcgorICAgICAgICBib3VuZGFyeSBvZiBhIHZpZXcsIGFzIGRlZmluZWQgYnkgaXRzIG1hcmdpbnMuIFdoZW4gc2V0IHRvIGZhbHNlLAorICAgICAgICBjYXVzZXMgYWxpZ25tZW50IHRvIHRha2UgcGxhY2UgYmV0d2VlbiB0aGUgZWRnZXMgb2YgdGhlIHZpZXcuCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRydWUuCisgICAgICAgIFNlZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dCNzZXRNYXJnaW5zSW5jbHVkZWRJbkFsaWdubWVudChib29sZWFuKX0uLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im1hcmdpbnNJbmNsdWRlZEluQWxpZ25tZW50IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgZm9yY2VzIHJvdyBib3VuZGFyaWVzIHRvIGFwcGVhciBpbiB0aGUgc2FtZSBvcmRlcgogICAgICAgICBhcyByb3cgaW5kaWNlcy4KICAgICAgICAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuCkBAIC0zMTY1LDkgKzMyNjIsOSBAQAogICAgICAgICA8IS0tIFRoZSByb3cgc3BhbjogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYm90dG9tIGFuZCB0b3AKICAgICAgICAgYm91bmRhcmllcyBkZWxpbWl0aW5nIHRoZSBncm91cCBvZiBjZWxscyBvY2N1cGllZCBieSB0aGlzIHZpZXcuCiAgICAgICAgIFRoZSBkZWZhdWx0IGlzIG9uZS4KLSAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0Lkdyb3VwI3NwYW59LiAtLT4KKyAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0Lkdyb3VwfS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxheW91dF9yb3dTcGFuIiBmb3JtYXQ9ImludGVnZXIiIG1pbj0iMSIgLz4KLSAgICAgICAgPCEtLSBBIG51bWJlciBpbmRpY2F0aW5nIHRoZSByZWxhdGl2ZSBwcm9wb3J0aW9uIG9mIGF2YWlsaWJsZSBzcGFjZSB0aGF0CisgICAgICAgIDwhLS0gQSBudW1iZXIgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgcHJvcG9ydGlvbiBvZiBhdmFpbGFibGUgc3BhY2UgdGhhdAogICAgICAgICBzaG91bGQgYmUgdGFrZW4gYnkgdGhpcyBncm91cCBvZiBjZWxscy4KICAgICAgICAgVGhlIGRlZmF1bHQgaXMgemVyby4KICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0LkxheW91dFBhcmFtcyNjb2x1bW5XZWlnaHR9LiAtLT4KQEAgLTMxNzgsOSArMzI3NSw5IEBACiAgICAgICAgIDwhLS0gVGhlIGNvbHVtbiBzcGFuOiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByaWdodCBhbmQgbGVmdAogICAgICAgICBib3VuZGFyaWVzIGRlbGltaXRpbmcgdGhlIGdyb3VwIG9mIGNlbGxzIG9jY3VwaWVkIGJ5IHRoaXMgdmlldy4KICAgICAgICAgVGhlIGRlZmF1bHQgaXMgb25lLgotICAgICAgICBTZWUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuR3JvdXAjc3Bhbn0uIC0tPgorICAgICAgICBTZWUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuR3JvdXB9LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X2NvbHVtblNwYW4iIGZvcm1hdD0iaW50ZWdlciIgbWluPSIxIiAvPgotICAgICAgICA8IS0tIEEgbnVtYmVyIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIHByb3BvcnRpb24gb2YgYXZhaWxpYmxlIHNwYWNlIHRoYXQKKyAgICAgICAgPCEtLSBBIG51bWJlciBpbmRpY2F0aW5nIHRoZSByZWxhdGl2ZSBwcm9wb3J0aW9uIG9mIGF2YWlsYWJsZSBzcGFjZSB0aGF0CiAgICAgICAgIHNob3VsZCBiZSB0YWtlbiBieSB0aGlzIGdyb3VwIG9mIGNlbGxzLgogICAgICAgICBUaGUgZGVmYXVsdCBpcyB6ZXJvLgogICAgICAgICBTZWUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuTGF5b3V0UGFyYW1zI2NvbHVtbldlaWdodH0uLS0+CkBAIC00MzkxLDYgKzQ0ODgsMTAgQEAKICAgICAgICAgICAgIDwhLS0gV2hlbiB0aGlzIGl0ZW0gaXMgc2hvd24gYXMgYW4gYWN0aW9uIGluIHRoZSBhY3Rpb24gYmFyLCBzaG93IGEgdGV4dAogICAgICAgICAgICAgICAgICBsYWJlbCB3aXRoIGl0IGV2ZW4gaWYgaXQgaGFzIGFuIGljb24gcmVwcmVzZW50YXRpb24uIC0tPgogICAgICAgICAgICAgPGZsYWcgbmFtZT0id2l0aFRleHQiIHZhbHVlPSI0IiAvPgorICAgICAgICAgICAgPCEtLSBUaGlzIGl0ZW0ncyBhY3Rpb24gdmlldyBjb2xsYXBzZXMgdG8gYSBub3JtYWwgbWVudQorICAgICAgICAgICAgICAgICBpdGVtLiBXaGVuIGV4cGFuZGVkLCB0aGUgYWN0aW9uIHZpZXcgdGFrZXMgb3ZlciBhCisgICAgICAgICAgICAgICAgIGxhcmdlciBzZWdtZW50IG9mIGl0cyBjb250YWluZXIuIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iY29sbGFwc2VBY3Rpb25WaWV3IiB2YWx1ZT0iOCIgLz4KICAgICAgICAgPC9hdHRyPgogCiAgICAgICAgIDwhLS0gQW4gb3B0aW9uYWwgbGF5b3V0IHRvIGJlIHVzZWQgYXMgYW4gYWN0aW9uIHZpZXcuCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCmluZGV4IDZiN2MyYTYuLmY3OTc0ZTkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCkBAIC0xMDE5LDYgKzEwMTksNDEgQEAKICAgICAgICAgIDxwPlRoaXMgYXBwZWFycyBhcyBhIGNoaWxkIHRhZyBvZiB0aGUKICAgICAgICAgIHtAbGluayAjQW5kcm9pZE1hbmlmZXN0IG1hbmlmZXN0fSB0YWcuIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBbmRyb2lkTWFuaWZlc3RTdXBwb3J0c1NjcmVlbnMiIHBhcmVudD0iQW5kcm9pZE1hbmlmZXN0Ij4KKyAgICAgICAgPCEtLSBTdGFydGluZyB3aXRoIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CX01SMn0sCisgICAgICAgICAgICAgdGhpcyBpcyB0aGUgbmV3IHdheSB0byBzcGVjaWZ5IHRoZSBzY3JlZW5zIGFuIGFwcGxpY2F0aW9uIGlzCisgICAgICAgICAgICAgY29tcGF0aWJsZSB3aXRoLiAgVGhpcyBhdHRyaWJ1dGUgcHJvdmlkZXMgdGhlIHJlcXVpcmVkIG1pbmltdW0KKyAgICAgICAgICAgICAic21hbGxlc3Qgc2NyZWVuIHdpZHRoIiAoYXMgcGVyIHRoZSAtc3dOTk5kcCByZXNvdXJjZSBjb25maWd1cmF0aW9uKQorICAgICAgICAgICAgIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiBydW4gb24uICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIHBob25lCisgICAgICAgICAgICAgc2NyZWVuIGlzIDMyMCwgYSA3IiB0YWJsZXQgNjAwLCBhbmQgYSAxMCIgdGFibGV0IDcyMC4gIElmIHRoZQorICAgICAgICAgICAgIHNtYWxsZXN0IHNjcmVlbiB3aWR0aCBvZiB0aGUgZGV2aWNlIGlzIGJlbG93IHRoZSB2YWx1ZSBzdXBwbGllZCBoZXJlLAorICAgICAgICAgICAgIHRoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGNvbnNpZGVyZWQgaW5jb21wYXRpYmxlIHdpdGggdGhhdCBkZXZpY2UuCisgICAgICAgICAgICAgSWYgbm90IHN1cHBsaWVkLCB0aGVuIGFueSBvbGQgc21hbGxTY3JlZW5zLCBub3JtYWxTY3JlZW5zLCBsYXJnZVNjcmVlbnMsCisgICAgICAgICAgICAgb3IgeGxhcmdlU2NyZWVucyBhdHRyaWJ1dGVzIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAiIGZvcm1hdD0iaW50ZWdlciIgLz4KKyAgICAgICAgPCEtLSBTdGFydGluZyB3aXRoIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CX01SMn0sCisgICAgICAgICAgICAgdGhpcyBpcyB0aGUgbmV3IHdheSB0byBzcGVjaWZ5IHRoZSBzY3JlZW5zIGFuIGFwcGxpY2F0aW9uIGlzCisgICAgICAgICAgICAgY29tcGF0aWJsZSB3aXRoLiAgVGhpcyBhdHRyaWJ1dGUgcHJvdmlkZXMgdGhlIG1heGltdW0KKyAgICAgICAgICAgICAic21hbGxlc3Qgc2NyZWVuIHdpZHRoIiAoYXMgcGVyIHRoZSAtc3dOTk5kcCByZXNvdXJjZSBjb25maWd1cmF0aW9uKQorICAgICAgICAgICAgIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGRlc2lnbmVkIGZvci4gIElmIHRoaXMgdmFsdWUgaXMgc21hbGxlciB0aGFuCisgICAgICAgICAgICAgdGhlICJzbWFsbGVzdCBzY3JlZW4gd2lkdGgiIG9mIHRoZSBkZXZpY2UgaXQgaXMgcnVubmluZyBvbiwgdGhlIHVzZXIKKyAgICAgICAgICAgICB3aWxsIG9mIG9mZmVyZWQgdG8gcnVuIGl0IGluIGEgY29tcGF0aWJpbGl0eSBtb2RlIHRoYXQgZW11bGF0ZXMgYQorICAgICAgICAgICAgIHNtYWxsZXIgc2NyZWVuLiAgQ3VycmVudGx5IHRoZSBjb21wYXRpYmlsaXR5IG1vZGUgb25seSBlbXVsYXRlcworICAgICAgICAgICAgIHBob25lIHNjcmVlbnMsIHNvIGl0IHdpbGwgbm90IGJlIHVzZWQgaXQgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzCisgICAgICAgICAgICAgYSByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCB0aGF0IGlzIGxhcmdlciB0aGFuIDMyMC4gIFR5cGljYWwgdmFsdWVzCisgICAgICAgICAgICAgdXNlZCB3aXRoIHRoaXMgYXR0cmlidXRlIGFyZSAzMjAgZm9yIGEgcGhvbmUgc2NyZWVuLCA2MDAgZm9yIGEKKyAgICAgICAgICAgICA3IiB0YWJsZXQsIGFuZCA3MjAgZm9yIGEgMTAiIHRhYmxldC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImNvbXBhdGlibGVXaWR0aExpbWl0RHAiIGZvcm1hdD0iaW50ZWdlciIgLz4KKyAgICAgICAgPCEtLSBTdGFydGluZyB3aXRoIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CX01SMn0sCisgICAgICAgICAgICAgdGhpcyBpcyB0aGUgbmV3IHdheSB0byBzcGVjaWZ5IHRoZSBzY3JlZW5zIGFuIGFwcGxpY2F0aW9uIGlzCisgICAgICAgICAgICAgY29tcGF0aWJsZSB3aXRoLiAgVGhpcyBhdHRyaWJ1dGUgcHJvdmlkZXMgdGhlIG1heGltdW0KKyAgICAgICAgICAgICAic21hbGxlc3Qgc2NyZWVuIHdpZHRoIiAoYXMgcGVyIHRoZSAtc3dOTk5kcCByZXNvdXJjZSBjb25maWd1cmF0aW9uKQorICAgICAgICAgICAgIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiB3b3JrIHdlbGwgb24uICBJZiB0aGlzIHZhbHVlIGlzIHNtYWxsZXIgdGhhbgorICAgICAgICAgICAgIHRoZSAic21hbGxlc3Qgc2NyZWVuIHdpZHRoIiBvZiB0aGUgZGV2aWNlIGl0IGlzIHJ1bm5pbmcgb24sIHRoZQorICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHdpbGwgYmUgZm9yY2VkIGluIHRvIHNjcmVlbiBjb21wYXRpYmlsaXR5IG1vZGUgd2l0aAorICAgICAgICAgICAgIG5vIHdheSBmb3IgdGhlIHVzZXIgdG8gdHVybiBpdCBvZmYuICBDdXJyZW50bHkgdGhlIGNvbXBhdGliaWxpdHkgbW9kZQorICAgICAgICAgICAgIG9ubHkgZW11bGF0ZXMgcGhvbmUgc2NyZWVucywgc28gZXZlbiBpZiB0aGlzIHZhbHVlIGlzIGxhcmdlciB0aGFuIDMyMAorICAgICAgICAgICAgIHRoZSB3aWR0aCB0aGUgYXBwIHJ1bnMgaW4gd2lsbCBiZSBhIDMyMCBwaG9uZSBkaW1lbnNpb24uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsYXJnZXN0V2lkdGhMaW1pdERwIiBmb3JtYXQ9ImludGVnZXIiIC8+CiAgICAgICAgIDwhLS0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHN1cHBvcnRzIHNtYWxsZXIgc2NyZWVuIGZvcm0tZmFjdG9ycy4KICAgICAgICAgICAgICBBIHNtYWxsIHNjcmVlbiBpcyBkZWZpbmVkIGFzIG9uZSB3aXRoIGEgc21hbGxlciBhc3BlY3QgcmF0aW8gdGhhbgogICAgICAgICAgICAgIHRoZSB0cmFkaXRpb25hbCBIVkdBIHNjcmVlbjsgdGhhdCBpcywgZm9yIGEgcG9ydHJhaXQgc2NyZWVuLCBsZXNzCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2Jvb2xzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYm9vbHMueG1sCmluZGV4IDhlMjdiZTQuLjlkNjMwOWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYm9vbHMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYm9vbHMueG1sCkBAIC0xLDIzICsxLDIyIEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotLyoKLSoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLworPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgorCiA8cmVzb3VyY2VzPgogICAgIDxib29sIG5hbWU9ImFsbG93X2FjdGlvbl9tZW51X2l0ZW1fdGV4dF93aXRoX2ljb24iPmZhbHNlPC9ib29sPgogICAgIDxib29sIG5hbWU9ImFjdGlvbl9iYXJfZW1iZWRfdGFicyI+ZmFsc2U8L2Jvb2w+CiAgICAgPGJvb2wgbmFtZT0ic3BsaXRfYWN0aW9uX2Jhcl9pc19uYXJyb3ciPnRydWU8L2Jvb2w+CisgICAgPGJvb2wgbmFtZT0icHJlZmVyZW5jZXNfcHJlZmVyX2R1YWxfcGFuZSI+ZmFsc2U8L2Jvb2w+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAppbmRleCBhZjA4ZDQ1Li5mOWZhNTFjIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC0yMCw4ICsyMCw2IEBACiA8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKICAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgogPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPGJvb2wgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNhbkhpZGUiPnRydWU8L2Jvb2w+Ci0KICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuIERlZmluZXMgdGhlIHNsb3RzIGZvciB0aGUgcmlnaHQtaGFuZCBzaWRlIGljb25zLiAgVGhhdCBpcyB0byBzYXksIHRoZQogICAgICAgICAgaWNvbnMgaW4gdGhlIHN0YXR1cyBiYXIgdGhhdCBhcmUgbm90IG5vdGlmaWNhdGlvbnMuIC0tPgogICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iY29uZmlnX3N0YXR1c0Jhckljb25zIj4KQEAgLTE1OCw2ICsxNTYsNyBAQAogCiAgICAgPCEtLSBSZWdleCBhcnJheSBvZiBhbGxvd2FibGUgdXBzdHJlYW0gaWZhY2VzIGZvciB0ZXRoZXJpbmcgLSBmb3IgZXhhbXBsZSBpZiB5b3Ugd2FudAogICAgICAgICAgdGV0aGVyaW5nIG9uIGEgbmV3IGludGVyZmFjZSBjYWxsZWQgImZvbzIiIGFkZCA8aXRlbT4iZm9vXFxkIjwvaXRlbT4gdG8gdGhlIGFycmF5IC0tPgorICAgIDwhLS0gSW50ZXJmYWNlcyB3aWxsIGJlIHByaW9yaXRpemVkIGFjY29yZGluZyB0byB0aGUgb3JkZXIgbGlzdGVkIC0tPgogICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX3RldGhlcl91cHN0cmVhbV9yZWdleHMiPgogICAgIDwvc3RyaW5nLWFycmF5PgogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKaW5kZXggM2Y0MDEwYi4uNzI0YzUyOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApAQCAtMzIsMTAgKzMyLDE0IEBACiAgICAgPGRpbWVuIG5hbWU9InRvYXN0X3lfb2Zmc2V0Ij42NGRpcDwvZGltZW4+CiAgICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaGVpZ2h0Ij4yNWRpcDwvZGltZW4+Ci0gICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+CisgICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN5c3RlbSBiYXIgLS0+CisgICAgPGRpbWVuIG5hbWU9InN5c3RlbV9iYXJfaGVpZ2h0Ij40OGRpcDwvZGltZW4+CisgICAgPCEtLSBIZWlnaHQgb2Ygbm90aWZpY2F0aW9uIGljb25zIGluIHRoZSBzdGF0dXMgYmFyIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fc2l6ZSI+MjVkaXA8L2RpbWVuPgogICAgIDwhLS0gU2l6ZSBvZiB0aGUgZ2lhbnQgbnVtYmVyICh1bnJlYWQgY291bnQpIGluIHRoZSBub3RpZmljYXRpb25zIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2NvbnRlbnRfbnVtYmVyX3NpemUiPjQ4c3A8L2RpbWVuPgorICAgIDwhLS0gSGVpZ2h0IG9mIG5vdGlmaWNhdGlvbiBpY29ucyBpbiB0aGUgc3lzdGVtIGJhciAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3lzdGVtX2Jhcl9pY29uX3NpemUiPjMyZGlwPC9kaW1lbj4KICAgICA8IS0tIE1hcmdpbiBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuIHRvIGlnbm9yZSB0b3VjaCBldmVudHMgZm9yIGluIHRoZSB3aW5kb3dzaGFkZS4gLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfZWRnZV9pZ25vcmUiPjVkcDwvZGltZW4+CiAgICAgPCEtLSBTaXplIG9mIHRoZSBmYXN0c2Nyb2xsIGhpbnQgbGV0dGVyIC0tPgpAQCAtNTcsOSArNjEsMjggQEAKICAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9zY3JlZW5fc2lkZV9tYXJnaW4iPjBkcDwvZGltZW4+CiAgICAgPCEtLSBQcmVmZXJlbmNlIGFjdGl2aXR5IHNpZGUgbWFyZ2lucyBuZWdhdGl2ZS0tPgogICAgIDxkaW1lbiBuYW1lPSJwcmVmZXJlbmNlX3NjcmVlbl9zaWRlX21hcmdpbl9uZWdhdGl2ZSI+MGRwPC9kaW1lbj4KKyAgICA8IS0tIFByZWZlcmVuY2UgYWN0aXZpdHkgdG9wIG1hcmdpbiAtLT4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9zY3JlZW5fdG9wX21hcmdpbiI+MGRwPC9kaW1lbj4KKyAgICA8IS0tIFByZWZlcmVuY2UgYWN0aXZpdHkgYm90dG9tIG1hcmdpbiAtLT4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9zY3JlZW5fYm90dG9tX21hcmdpbiI+MGRwPC9kaW1lbj4KICAgICA8IS0tIFByZWZlcmVuY2Ugd2lkZ2V0IGFyZWEgd2lkdGggKHRvIHRoZSBsZWZ0IG9mIHRoZSB0ZXh0KSAtLT4KLSAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV93aWRnZXRfd2lkdGgiPjhkcDwvZGltZW4+Ci0KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV93aWRnZXRfd2lkdGgiPjQ4ZHA8L2RpbWVuPgorICAgIDwhLS0gUHJlZmVyZW5jZSBmcmFnbWVudCBwYWRkaW5nLCBib3R0b20gLS0+CisgICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2VfZnJhZ21lbnRfcGFkZGluZ19ib3R0b20iPjBkcDwvZGltZW4+CisgICAgPCEtLSBQcmVmZXJlbmNlIGZyYWdtZW50IHBhZGRpbmcsIHNpZGVzIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwcmVmZXJlbmNlX2ZyYWdtZW50X3BhZGRpbmdfc2lkZSI+MGRwPC9kaW1lbj4KKyAgICA8IS0tIFdlaWdodCBvZiB0aGUgbGVmdCBwYW5lIGluIGEgbXVsdGktcGFuZSBwcmVmZXJlbmNlIGxheW91dC4gLS0+CisgICAgPGludGVnZXIgbmFtZT0icHJlZmVyZW5jZXNfbGVmdF9wYW5lX3dlaWdodCI+NDwvaW50ZWdlcj4KKyAgICA8IS0tIFdlaWdodCBvZiB0aGUgcmlnaHQgcGFuZSBpbiBhIG11bHRpLXBhbmUgcHJlZmVyZW5jZSBsYXlvdXQuIFNvIHRoZSBzcGxpdCBpcyA0MDo2MCAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJwcmVmZXJlbmNlc19yaWdodF9wYW5lX3dlaWdodCI+NjwvaW50ZWdlcj4KKyAgICA8IS0tIFBhZGRpbmcgdG8gdGhlIGxlZnQgb2YgdGhlIHByZWZlcmVuY2UgcGFuZWwgYnJlYWRjcnVtYiAtLT4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9icmVhZGNydW1iX3BhZGRpbmdMZWZ0Ij4wZHA8L2RpbWVuPgorICAgIDwhLS0gUGFkZGluZyB0byB0aGUgcmlnaHQgb2YgdGhlIHByZWZlcmVuY2UgcGFuZWwgYnJlYWRjcnVtYiAtLT4KKyAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9icmVhZGNydW1iX3BhZGRpbmdSaWdodCI+MGRwPC9kaW1lbj4KKyAgICA8IS0tIE1pbmltdW0gc3BhY2UgdG8gYWxsb2NhdGUgdG8gdGhlIGxlZnQgb2YgYSBwcmVmZXJlbmNlIGl0ZW0gZm9yIGFuIGljb24uCisgICAgICAgIFRoaXMgaGVscHMgaW4gYWxpZ25pbmcgdGl0bGVzIHdoZW4gc29tZSBpdGVtcyBoYXZlIGljb25zIGFuZCBzb21lIGRvbid0LiBXaGVuIHNwYWNlIGlzCisgICAgICAgIGF0IGEgcHJlbWl1bSwgd2UgZG9uJ3QgcHJlLWFsbG9jYXRlIGFueSBzcGFjZS4gLS0+CisgICAgPGRpbWVuIG5hbWU9InByZWZlcmVuY2VfaWNvbl9taW5XaWR0aCI+MGRwPC9kaW1lbj4KICAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgbWluaW11bSBzaXplIGZvciBhIGRpYWxvZydzIHdpZHRoIHdoZW4gaXQKICAgICAgICAgIGlzIGFsb25nIHRoZSBtYWpvciBheGlzICh0aGF0IGlzIHRoZSBzY3JlZW4gaXMgbGFuZHNjYXBlKS4gIFRoaXMgbWF5CiAgICAgICAgICBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4gLS0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKaW5kZXggMGJkOTM5ZS4uODFmODg4ZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbApAQCAtMTY0MywxMSArMTY0MywxOSBAQAogICA8cHVibGljIHR5cGU9Im1pcG1hcCIgbmFtZT0ic3ltX2RlZl9hcHBfaWNvbiIgaWQ9IjB4MDEwZDAwMDAiIC8+CiAKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDEyIG9mIHRoZSBwbGF0Zm9ybSAoSG9uZXljb21iIC8gMy4xKQorICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiAxMiBvZiB0aGUgcGxhdGZvcm0gKEhvbmV5Y29tYiBNUiAxIC8gMy4xKQogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgIDxlYXQtY29tbWVudCAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRleHRDdXJzb3JEcmF3YWJsZSIgaWQ9IjB4MDEwMTAzNjIiIC8+Ci0gIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icmVzaXplTW9kZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJyZXNpemVNb2RlIiBpZD0iMHgwMTAxMDM2MyIgLz4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gMTMgb2YgdGhlIHBsYXRmb3JtIChIb25leWNvbWIgTVIgMikKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8ZWF0LWNvbW1lbnQgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJyZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCIgaWQ9IjB4MDEwMTAzNjQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29tcGF0aWJsZVdpZHRoTGltaXREcCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsYXJnZXN0V2lkdGhMaW1pdERwIiAvPgogCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiAxMyBvZiB0aGUgcGxhdGZvcm0gKEljZSBDcmVhbSBTYW5kd2ljaCkKQEAgLTE2NzcsNiArMTY4NSw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29sdW1uQ291bnQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29sdW1uT3JkZXJQcmVzZXJ2ZWQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idXNlRGVmYXVsdE1hcmdpbnMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQiIC8+CiAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsYXlvdXRfcm93IiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImxheW91dF9yb3dTcGFuIiAvPgpAQCAtMTY4NCw1ICsxNjkzLDE0IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibGF5b3V0X3Jvd1dlaWdodCIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsYXlvdXRfY29sdW1uU3BhbiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsYXlvdXRfY29sdW1uV2VpZ2h0IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbk1vZGVTZWxlY3RBbGxEcmF3YWJsZSIgLz4KIAorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImlzQXV4aWxpYXJ5IiAvPgorCisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWNjZXNzaWJpbGl0eUV2ZW50VHlwZXMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icGFja2FnZU5hbWVzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjY2Vzc2liaWxpdHlGZWVkYmFja1R5cGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibm90aWZpY2F0aW9uVGltZW91dCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY2Nlc3NpYmlsaXR5RmxhZ3MiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY2FuUmV0cmlldmVXaW5kb3dDb250ZW50IiAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA4MTY1NDZiLi4yOWMyM2E2IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTU2Miw2ICs1NjIsMTMgQEAKICAgICAgICAgbmV2ZXIgbm9ybWFsbHkgbmVlZC48L3N0cmluZz4KIAogICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZXRyaWV2ZV93aW5kb3dfY29udGVudCI+cmV0cmlldmUgc2NyZWVuIGNvbnRlbnQ8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JldHJpZXZlX3dpbmRvd19jb250ZW50Ij5BbGxvd3MgYXBwbGljYXRpb24gdG8gcmV0cmlldmUKKyAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIGFjdGl2ZSB3aW5kb3cuIE1hbGljaW91cyBhcHBsaWNhdGlvbnMgbWF5IHJldHJpZXZlCisgICAgICAgIHRoZSBlbnRpcmUgd2luZG93IGNvbnRlbnQgYW5kIGV4YW1pbmUgYWxsIGl0cyB0ZXh0IGV4Y2VwdCBwYXNzd29yZHMuPC9zdHJpbmc+CisKKyAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2h1dGRvd24iPnBhcnRpYWwgc2h1dGRvd248L3N0cmluZz4KICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NodXRkb3duIj5QdXRzIHRoZSBhY3Rpdml0eSBtYW5hZ2VyIGludG8gYSBzaHV0ZG93bgpAQCAtNzExLDYgKzcxOCwxMyBAQAogICAgICAgICB0aGUgcm90YXRpb24gb2YgdGhlIHNjcmVlbiBhdCBhbnkgdGltZS4gU2hvdWxkIG5ldmVyIGJlIG5lZWRlZCBmb3IKICAgICAgICAgbm9ybWFsIGFwcGxpY2F0aW9ucy48L3N0cmluZz4KIAorICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIFtDSEFSIExJTUlUPTMwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0UG9pbnRlclNwZWVkIj5jaGFuZ2UgcG9pbnRlciBzcGVlZDwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkIj5BbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gY2hhbmdlCisgICAgICAgIHRoZSBtb3VzZSBvciB0cmFja3BhZCBwb2ludGVyIHNwZWVkIGF0IGFueSB0aW1lLiBTaG91bGQgbmV2ZXIgYmUgbmVlZGVkIGZvcgorICAgICAgICBub3JtYWwgYXBwbGljYXRpb25zLjwvc3RyaW5nPgorCiAgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiPnNlbmQgTGludXggc2lnbmFscyB0byBhcHBsaWNhdGlvbnM8L3N0cmluZz4KICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KQEAgLTE4NTIsNyArMTg2Niw3IEBACiAKICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgc3RyaW5nIC0tPgogICAgIDxzdHJpbmcgbmFtZT0id2ViX3VzZXJfYWdlbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPk1vemlsbGEvNS4wIChMaW51eDsgVTsgPHhsaWZmOmcgaWQ9IngiPkFuZHJvaWQgJXM8L3hsaWZmOmc+KQotICAgICAgICBBcHBsZVdlYktpdC81MzQuMjAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCA8eGxpZmY6ZyBpZD0ibW9iaWxlIj4lczwveGxpZmY6Zz5TYWZhcmkvNTM0LjIwPC9zdHJpbmc+CisgICAgICAgIEFwcGxlV2ViS2l0LzUzNC4yNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIDx4bGlmZjpnIGlkPSJtb2JpbGUiPiVzPC94bGlmZjpnPlNhZmFyaS81MzQuMjQ8L3N0cmluZz4KICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgdGFyZ2V0ZWQgY29udGVudCAtLT4KICAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj4iTW9iaWxlICI8L3N0cmluZz4KIApAQCAtMjM2MCw2ICsyMzc0LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIj48eGxpZmY6ZyBpZD0iYXBwX25hbWUiPiUxJHM8L3hsaWZmOmc+IGlzIG5vdyBydW5uaW5nLjwvc3RyaW5nPgogICAgIDwhLS0gW0NIQVIgTElNSVQ9NTBdIFRpdGxlIG9mIHRoZSBhbGVydCB3aGVuIGFwcGxpY2F0aW9uIGxhdW5jaGVzIG9uIHRvcCBvZiBhbm90aGVyLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIj48eGxpZmY6ZyBpZD0iYXBwX25hbWUiPiUxJHM8L3hsaWZmOmc+IHdhcyBvcmlnaW5hbGx5IGxhdW5jaGVkLjwvc3RyaW5nPgorICAgIDwhLS0gW0NIQVIgTElNSVQ9NTBdIENvbXBhdCBtb2RlIGRpYWxvZzogY29tcGF0IG1vZGUgc3dpdGNoIGxhYmVsLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSI+U2NhbGU8L3N0cmluZz4KKyAgICA8IS0tIFtDSEFSIExJTUlUPTUwXSBDb21wYXQgbW9kZSBkaWFsb2c6IGNvbXBhdCBtb2RlIHN3aXRjaCBsYWJlbC4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzY3JlZW5fY29tcGF0X21vZGVfc2hvdyI+QWx3YXlzIHNob3c8L3N0cmluZz4KKyAgICA8IS0tIFtDSEFSIExJTUlUPTIwMF0gQ29tcGF0IG1vZGUgZGlhbG9nOiBoaW50IHRvIHJlLWVuYWJsZSBjb21wYXQgbW9kZSBkaWFsb2cuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQiPlJlLWVuYWJsZSB0aGlzIHdpdGggU2V0dGluZ3MgJmd0OyBBcHBsaWNhdGlvbnMgJmd0OyBNYW5hZ2UgYXBwbGljYXRpb25zLjwvc3RyaW5nPgogCiAgICAgPCEtLSBUZXh0IG9mIHRoZSBhbGVydCB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGFuIGFwcGxpY2F0aW9uIGhhcyB2aW9sYXRlZCBTdHJpY3RNb2RlLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiI+VGhlIGFwcGxpY2F0aW9uIDx4bGlmZjpnIGlkPSJhcHBsaWNhdGlvbiI+JTEkczwveGxpZmY6Zz4KQEAgLTI4NTQsNCArMjg3NCw3IEBACiAKICAgICA8IS0tIFN0b3JhZ2UgZGVzY3JpcHRpb24gZm9yIFVTQiBzdG9yYWdlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIj5VU0Igc3RvcmFnZTwvc3RyaW5nPgorCisgICAgPCEtLSBCdXR0b24gdGV4dCBmb3IgdGhlIGVkaXQgbWVudSBpbiBpbnB1dCBtZXRob2QgZXh0cmFjdCBtb2RlLiBbQ0hBUiBMSU1JVD0xNl0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJleHRyYWN0X2VkaXRfbWVudV9idXR0b24iPkVkaXQuLi48L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmluZGV4IGU5NTA5NGYwLi4wNjM1NTI4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC0xNDY2LDcgKzE0NjYsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJkaXZpZGVyIj4/YW5kcm9pZDphdHRyL2RpdmlkZXJWZXJ0aWNhbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2hvd0RpdmlkZXJzIj5taWRkbGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImRpdmlkZXJQYWRkaW5nIj44ZGlwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fZ3JvdXBfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IkhvbG8uU2VnbWVudGVkQnV0dG9uIiBwYXJlbnQ9IlNlZ21lbnRlZEJ1dHRvbiI+CkBAIC0xODc1LDcgKzE4NzUsNiBAQAogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iSG9sby5MaWdodC5CdXR0b25CYXIiIHBhcmVudD0iSG9sby5CdXR0b25CYXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9ncm91cF9ob2xvX2xpZ2h0PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iSG9sby5MaWdodC5CdXR0b25CYXIuQWxlcnREaWFsb2ciPgpAQCAtMjIxOSw5ICsyMjE4LDkgQEAKIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5QcmVmZXJlbmNlRnJhbWVMYXlvdXQiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJvcmRlclRvcCI+MGRpcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpib3JkZXJCb3R0b20iPjBkaXA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Ym9yZGVyTGVmdCI+MGRpcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpib3JkZXJSaWdodCI+MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpib3JkZXJCb3R0b20iPkBkaW1lbi9wcmVmZXJlbmNlX2ZyYWdtZW50X3BhZGRpbmdfc2lkZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpib3JkZXJMZWZ0Ij5AZGltZW4vcHJlZmVyZW5jZV9mcmFnbWVudF9wYWRkaW5nX3NpZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Ym9yZGVyUmlnaHQiPkBkaW1lbi9wcmVmZXJlbmNlX2ZyYWdtZW50X3BhZGRpbmdfc2lkZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPCEtLSBQb2ludGVyIHN0eWxlcyAtLT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAppbmRleCAwYTYxNGIyLi40ZjM5ZGE0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCkBAIC0yNjcsNiArMjY3LDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUN1dERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2N1dF9ob2xvX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDb3B5RHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfY29weV9ob2xvX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVQYXN0ZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3Bhc3RlX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVNlbGVjdEFsbERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVTaGFyZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NoYXJlX2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUZpbmREcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9maW5kX2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVdlYlNlYXJjaERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlYXJjaDwvaXRlbT4KQEAgLTM5Niw2ICszOTcsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ3V0RHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfY3V0X2hvbG9fbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDb3B5RHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfY29weV9ob2xvX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlUGFzdGVEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9wYXN0ZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlU2VsZWN0QWxsRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2VsZWN0YWxsX2hvbG9fbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVTaGFyZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NoYXJlX2hvbG9fbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVGaW5kRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfZmluZF9ob2xvX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlV2ViU2VhcmNoRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2VhcmNoX2hvbG9fbGlnaHQ8L2l0ZW0+CkBAIC0xMDI5LDYgKzEwMzEsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ3V0RHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfY3V0X2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNvcHlEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9jb3B5X2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVBhc3RlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfcGFzdGVfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlU2VsZWN0QWxsRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2VsZWN0YWxsX2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVNoYXJlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2hhcmVfaG9sb19kYXJrPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlRmluZERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2ZpbmRfaG9sb19kYXJrPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlV2ViU2VhcmNoRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2VhcmNoX2hvbG9fZGFyazwvaXRlbT4KQEAgLTEzMTYsNiArMTMxOSw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDdXREcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9jdXRfaG9sb19saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNvcHlEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9jb3B5X2hvbG9fbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVQYXN0ZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3Bhc3RlX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVTZWxlY3RBbGxEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zZWxlY3RhbGxfaG9sb19saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVNoYXJlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2hhcmVfaG9sb19saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUZpbmREcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9maW5kX2hvbG9fbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVXZWJTZWFyY2hEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zZWFyY2hfaG9sb19saWdodDwvaXRlbT4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvQW5kcm9pZC5tayBiL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTFkMThjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgV2Ugb25seSB3YW50IHRoaXMgYXBrIGJ1aWxkIGZvciB0ZXN0cy4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKKyMgSW5jbHVkZSBhbGwgdGVzdCBqYXZhIGZpbGVzLgorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwkkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEJsdWV0b290aFRlc3RzCitMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGIwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2JsdWV0b290aHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5ibHVldG9vdGgudGVzdHMiID4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkxVRVRPT1RIIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkxVRVRPT1RIX0FETUlOIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0VUVElOR1MiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiIC8+CisKKyAgICA8YXBwbGljYXRpb24gPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhUZXN0UnVubmVyIgorICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5ibHVldG9vdGgudGVzdHMiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJCbHVldG9vdGggVGVzdHMiIC8+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUmVib290U3RyZXNzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUmVib290U3RyZXNzVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUmVib290U3RyZXNzVGVzdC5qYXZhCnJlbmFtZSB0byBjb3JlL3Rlc3RzL2JsdWV0b290aHRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhSZWJvb3RTdHJlc3NUZXN0LmphdmEKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQ3ZDlhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKKworLyoqCisgKiBTdHJlc3MgdGVzdCBzdWl0ZSBmb3IgQmx1ZXRvb3RoIHJlbGF0ZWQgZnVuY3Rpb25zLgorICoKKyAqIEluY2x1ZGVzIHRlc3RzIGZvciBlbmFibGluZy9kaXNhYmxpbmcgYmx1ZXRvb3RoLCBlbmFibGluZy9kaXNhYmxpbmcgZGlzY292ZXJhYmxlIG1vZGUsCisgKiBzdGFydGluZy9zdG9wcGluZyBzY2FucywgY29ubmVjdGluZy9kaXNjb25uZWN0aW5nIHRvIEhGUCwgQTJEUCwgSElELCBQQU4gcHJvZmlsZXMsIGFuZCB2ZXJpZnlpbmcKKyAqIHRoYXQgcmVtb3RlIGNvbm5lY3Rpb25zL2Rpc2Nvbm5lY3Rpb25zIG9jY3VyIGZvciB0aGUgUEFOIHByb2ZpbGUuCisgKiA8cD4KKyAqIFRoaXMgdGVzdCBzdWl0ZSB1c2VzIHtAbGluayBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhUZXN0UnVubmVyfSB0byBmb3IgcGFyYW1ldGVycyBzdWNoIGFzIHRoZQorICogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYW5kIHRoZSBhZGRyZXNzZXMgb2YgcmVtb3RlIEJsdWV0b290aCBkZXZpY2VzLgorICovCitwdWJsaWMgY2xhc3MgQmx1ZXRvb3RoU3RyZXNzVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFN0cmVzc1Rlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRklMRSA9ICJCbHVldG9vdGhTdHJlc3NUZXN0T3V0cHV0LnR4dCI7CisKKyAgICBwcml2YXRlIEJsdWV0b290aFRlc3RVdGlscyBtVGVzdFV0aWxzOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIG1UZXN0VXRpbHMgPSBuZXcgQmx1ZXRvb3RoVGVzdFV0aWxzKGNvbnRleHQsIFRBRywgT1VUUFVUX0ZJTEUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisKKyAgICAgICAgbVRlc3RVdGlscy5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmVzcyB0ZXN0IGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nIEJsdWV0b290aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlKCkgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0VuYWJsZUl0ZXJhdGlvbnM7CisgICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJlbmFibGUgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmVzcyB0ZXN0IGZvciBwdXR0aW5nIHRoZSBkZXZpY2UgaW4gYW5kIHRha2luZyB0aGUgZGV2aWNlIG91dCBvZiBkaXNjb3ZlcmFibGUgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzY292ZXJhYmxlKCkgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Rpc2NvdmVyYWJsZUl0ZXJhdGlvbnM7CisgICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy51bmRpc2NvdmVyYWJsZShhZGFwdGVyKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiZGlzY292ZXJhYmxlIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOworICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb3ZlcmFibGUoYWRhcHRlcik7CisgICAgICAgICAgICBtVGVzdFV0aWxzLnVuZGlzY292ZXJhYmxlKGFkYXB0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmVzcyB0ZXN0IGZvciBzdGFydGluZyBhbmQgc3RvcHBpbmcgQmx1ZXRvb3RoIHNjYW5zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FuKCkgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc1NjYW5JdGVyYXRpb25zOworICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuc3RvcFNjYW4oYWRhcHRlcik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoInNjYW4gaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLnN0YXJ0U2NhbihhZGFwdGVyKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuc3RvcFNjYW4oYWRhcHRlcik7CisgICAgICAgIH0KKworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyZXNzIHRlc3QgZm9yIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgdGhlIFBBTiBOQVAgcHJvZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlUGFuKCkgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0VuYWJsZVBhbkl0ZXJhdGlvbnM7CisgICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZVBhbihhZGFwdGVyKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgidGVzdEVuYWJsZVBhbiBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIKKyAgICAgICAgICAgICAgICAgICAgKyBpdGVyYXRpb25zKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlUGFuKGFkYXB0ZXIpOworICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlUGFuKGFkYXB0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmVzcyB0ZXN0IGZvciBwYWlyaW5nIGFuZCB1bnBhaXJpbmcgd2l0aCBhIHJlbW90ZSBkZXZpY2UuCisgICAgICogPHA+CisgICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIGluaXRpYXRlcyBwYWlyaW5nIHdpdGggYSByZW1vdGUgZGV2aWNlLCBhbmQgdGhlbiB1bnBhaXJzIHdpdGgKKyAgICAgKiB0aGUgZGV2aWNlIGFmdGVyIHRoZSBwYWlyaW5nIGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQYWlyKCkgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc1BhaXJJdGVyYXRpb25zOworICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgicGFpciBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAorICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmVzcyB0ZXN0IGZvciBhY2NlcHRpbmcgYSBwYWlyaW5nIHJlcXVlc3QgYW5kIHVucGFpcmluZyB3aXRoIGEgcmVtb3RlIGRldmljZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2Ugd2FpdHMgZm9yIGEgcGFpcmluZyByZXF1ZXN0IGZyb20gYSByZW1vdGUgZGV2aWNlLiAgSXQgYWNjZXB0cworICAgICAqIHRoZSByZXF1ZXN0IGFuZCB0aGVuIHVucGFpcnMgYWZ0ZXIgdGhlIHBhcmluZyBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0UGFpcigpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNQYWlySXRlcmF0aW9uczsKKyAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJhY2NlcHRQYWlyIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOworICAgICAgICAgICAgbVRlc3RVdGlscy5hY2NlcHRQYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCisgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOworICAgICAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyZXNzIHRlc3QgZm9yIGNvbm5lY3RpbmcgYW5kIGRpc2Nvbm5lY3Rpbmcgd2l0aCBhbiBBMkRQIHNvdXJjZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2UgcGxheXMgdGhlIHJvbGUgb2YgYW4gQTJEUCBzaW5rLCBhbmQgaW5pdGlhdGVzIGNvbm5lY3Rpb25zIGFuZAorICAgICAqIGRpc2Nvbm5lY3Rpb25zIHdpdGggYW4gQTJEUCBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RBMmRwKCkgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RBMmRwSXRlcmF0aW9uczsKKyAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAorICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOworICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQLCBudWxsKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdEEyZHAgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLmNvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJjb25uZWN0QTJkcChkZXZpY2U9JXMpIiwgZGV2aWNlKSk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0QTJkcChkZXZpY2U9JXMpIiwgZGV2aWNlKSk7CisgICAgICAgIH0KKworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyZXNzIHRlc3QgZm9yIGNvbm5lY3RpbmcgYW5kIGRpc2Nvbm5lY3RpbmcgdGhlIEhGUCB3aXRoIGEgaGFuZHMgZnJlZSBkZXZpY2UuCisgICAgICogPHA+CisgICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHBsYXlzIHRoZSByb2xlIG9mIGFuIEhGUCBhdWRpbyBnYXRld2F5LCBhbmQgaW5pdGlhdGVzCisgICAgICogY29ubmVjdGlvbnMgYW5kIGRpc2Nvbm5lY3Rpb25zIHdpdGggYSBoYW5kcyBmcmVlIGRldmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdEhlYWRzZXQoKSB7CisgICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zOworICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsIG51bGwpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJjb25uZWN0SGVhZHNldCBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoImNvbm5lY3RIZWFkc2V0KGRldmljZT0lcykiLCBkZXZpY2UpKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RIZWFkc2V0KGRldmljZT0lcykiLCBkZXZpY2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJlc3MgdGVzdCBmb3IgY29ubmVjdGluZyBhbmQgZGlzY29ubmVjdGluZyB3aXRoIGEgSElEIGRldmljZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2UgcGxheXMgdGhlIHJvbGUgb2YgYSBISUQgaG9zdCwgYW5kIGluaXRpYXRlcyBjb25uZWN0aW9ucyBhbmQKKyAgICAgKiBkaXNjb25uZWN0aW9ucyB3aXRoIGEgSElEIGRldmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdElucHV0KCkgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RJbnB1dEl0ZXJhdGlvbnM7CisgICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFLCBudWxsKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdElucHV0IGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOworICAgICAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJjb25uZWN0SW5wdXQoZGV2aWNlPSVzKSIsIGRldmljZSkpOworICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0SW5wdXQoZGV2aWNlPSVzKSIsIGRldmljZSkpOworICAgICAgICB9CisKKyAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmVzcyB0ZXN0IGZvciBjb25uZWN0aW5nIGFuZCBkaXNjb25uZWN0aW5nIHdpdGggYSBQQU4gTkFQLgorICAgICAqIDxwPgorICAgICAqIEluIHRoaXMgdGVzdCwgdGhlIGxvY2FsIGRldmljZSBwbGF5cyB0aGUgcm9sZSBvZiBhIFBBTlUsIGFuZCBpbml0aWF0ZXMgY29ubmVjdGlvbnMgYW5kCisgICAgICogZGlzY29ubmVjdGlvbnMgd2l0aCBhIE5BUC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdFBhbigpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0UGFuSXRlcmF0aW9uczsKKyAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAorICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJjb25uZWN0UGFuIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOworICAgICAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0UGFuKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQYW4oYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJlc3MgdGVzdCBmb3IgdmVyaWZ5aW5nIGEgUEFOVSBjb25uZWN0aW5nIGFuZCBkaXNjb25uZWN0aW5nIHdpdGggdGhlIGRldmljZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2UgcGxheXMgdGhlIHJvbGUgb2YgYSBOQVAgd2hpY2ggYSByZW1vdGUgUEFOVSBjb25uZWN0cyBhbmQKKyAgICAgKiBkaXNjb25uZWN0cyBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNvbWluZ1BhbkNvbm5lY3Rpb24oKSB7CisgICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQ29ubmVjdFBhbkl0ZXJhdGlvbnM7CisgICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGVQYW4oYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlUGFuKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICBtVGVzdFV0aWxzLmFjY2VwdFBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiaW5jb21pbmdQYW5Db25uZWN0aW9uIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIgorICAgICAgICAgICAgICAgICAgICArIGl0ZXJhdGlvbnMpOworICAgICAgICAgICAgbVRlc3RVdGlscy5pbmNvbWluZ1BhbkNvbm5lY3Rpb24oYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuaW5jb21pbmdQYW5EaXNjb25uZWN0aW9uKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIH0KKworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGVQYW4oYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJlc3MgdGVzdCBmb3IgdmVyaWZ5aW5nIHRoYXQgQXVkaW9NYW5hZ2VyIGNhbiBvcGVuIGFuZCBjbG9zZSBTQ08gY29ubmVjdGlvbnMuCisgICAgICogPHA+CisgICAgICogSW4gdGhpcyB0ZXN0LCBhIEhTUCBjb25uZWN0aW9uIGlzIG9wZW5lZCB3aXRoIGFuIGV4dGVybmFsIGhlYWRzZXQgYW5kIHRoZSBTQ08gY29ubmVjdGlvbiBpcworICAgICAqIHJlcGVhdGlibHkgb3BlbmVkIGFuZCBjbG9zZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0U3RvcFNjbygpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNTdGFydFN0b3BTY29JdGVyYXRpb25zOworICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsIG51bGwpOworICAgICAgICBtVGVzdFV0aWxzLmNvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULCBudWxsKTsKKyAgICAgICAgbVRlc3RVdGlscy5zdG9wU2NvKGFkYXB0ZXIsIGRldmljZSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoInN0YXJ0U3RvcFNjbyBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuc3RhcnRTY28oYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuc3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCwgbnVsbCk7CisgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhCnJlbmFtZSB0byBjb3JlL3Rlc3RzL2JsdWV0b290aHRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0YzIyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTQ4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CisKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQmx1ZXRvb3RoVGVzdFV0aWxzIGV4dGVuZHMgQXNzZXJ0IHsKKworICAgIC8qKiBUaW1lb3V0IGZvciBlbmFibGUvZGlzYWJsZSBpbiBtcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0RJU0FCTEVfVElNRU9VVCA9IDIwMDAwOworICAgIC8qKiBUaW1lb3V0IGZvciBkaXNjb3ZlcmFibGUvdW5kaXNjb3ZlcmFibGUgaW4gbXMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPVkVSQUJMRV9VTkRJU0NPVkVSQUJMRV9USU1FT1VUID0gNTAwMDsKKyAgICAvKiogVGltZW91dCBmb3Igc3RhcnRpbmcvc3RvcHBpbmcgYSBzY2FuIGluIG1zLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9TVE9QX1NDQU5fVElNRU9VVCA9IDUwMDA7CisgICAgLyoqIFRpbWVvdXQgZm9yIHBhaXIvdW5wYWlyIGluIG1zLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1VOUEFJUl9USU1FT1VUID0gMjAwMDA7CisgICAgLyoqIFRpbWVvdXQgZm9yIGNvbm5lY3RpbmcvZGlzY29ubmVjdGluZyBhIHByb2ZpbGUgaW4gbXMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfRElTQ09OTkVDVF9QUk9GSUxFX1RJTUVPVVQgPSAyMDAwMDsKKyAgICAvKiogVGltZW91dCB0byBzdGFydCBvciBzdG9wIGEgU0NPIGNoYW5uZWwgaW4gbXMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1NUT1BfU0NPX1RJTUVPVVQgPSAxMDAwMDsKKyAgICAvKiogVGltZW91dCB0byBjb25uZWN0IGEgcHJvZmlsZSBwcm94eSBpbiBtcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9QUk9YWV9USU1FT1VUID0gNTAwMDsKKyAgICAvKiogVGltZSBiZXR3ZWVuIHBvbGxzIGluIG1zLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xMX1RJTUUgPSAxMDA7CisKKyAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIEZsYWdSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUV4cGVjdGVkRmxhZ3MgPSAwOworICAgICAgICBwcml2YXRlIGludCBtRmlyZWRGbGFncyA9IDA7CisgICAgICAgIHByaXZhdGUgbG9uZyBtQ29tcGxldGVkVGltZSA9IC0xOworCisgICAgICAgIHB1YmxpYyBGbGFnUmVjZWl2ZXIoaW50IGV4cGVjdGVkRmxhZ3MpIHsKKyAgICAgICAgICAgIG1FeHBlY3RlZEZsYWdzID0gZXhwZWN0ZWRGbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RmlyZWRGbGFncygpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIHJldHVybiBtRmlyZWRGbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldENvbXBsZXRlZFRpbWUoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbXBsZXRlZFRpbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRGaXJlZEZsYWcoaW50IGZsYWcpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIG1GaXJlZEZsYWdzIHw9IGZsYWc7CisgICAgICAgICAgICAgICAgaWYgKChtRmlyZWRGbGFncyAmIG1FeHBlY3RlZEZsYWdzKSA9PSBtRXhwZWN0ZWRGbGFncykgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQmx1ZXRvb3RoUmVjZWl2ZXIgZXh0ZW5kcyBGbGFnUmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09WRVJZX1NUQVJURURfRkxBRyA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT1ZFUllfRklOSVNIRURfRkxBRyA9IDEgPDwgMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fTU9ERV9OT05FX0ZMQUcgPSAxIDw8IDI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX01PREVfQ09OTkVDVEFCTEVfRkxBRyA9IDEgPDwgMzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEVfRkxBRyA9IDEgPDwgNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX09GRl9GTEFHID0gMSA8PCA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVFVSTklOR19PTl9GTEFHID0gMSA8PCA2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfT05fRkxBRyA9IDEgPDwgNzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RVUk5JTkdfT0ZGX0ZMQUcgPSAxIDw8IDg7CisKKyAgICAgICAgcHVibGljIEJsdWV0b290aFJlY2VpdmVyKGludCBleHBlY3RlZEZsYWdzKSB7CisgICAgICAgICAgICBzdXBlcihleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fRElTQ09WRVJZX1NUQVJURUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoRElTQ09WRVJZX1NUQVJURURfRkxBRyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX0RJU0NPVkVSWV9GSU5JU0hFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhESVNDT1ZFUllfRklOSVNIRURfRkxBRyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NDQU5fTU9ERV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgaW50IG1vZGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQWRhcHRlci5FWFRSQV9TQ0FOX01PREUsIC0xKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKC0xLCBtb2RlKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9OT05FOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNDQU5fTU9ERV9OT05FX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEVfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQWRhcHRlci5FWFRSQV9TVEFURSwgLTEpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkY6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfT0ZGX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09OOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX1RVUk5JTkdfT05fRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX09OX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09GRjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9UVVJOSU5HX09GRl9GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUGFpclJlY2VpdmVyIGV4dGVuZHMgRmxhZ1JlY2VpdmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0JPTkRFRF9GTEFHID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0JPTkRJTkdfRkxBRyA9IDEgPDwgMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX05PTkVfRkxBRyA9IDEgPDwgMjsKKworICAgICAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtRGV2aWNlOworICAgICAgICBwcml2YXRlIGludCBtUGFzc2tleTsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gbVBpbjsKKworICAgICAgICBwdWJsaWMgUGFpclJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LCBieXRlW10gcGluLCBpbnQgZXhwZWN0ZWRGbGFncykgeworICAgICAgICAgICAgc3VwZXIoZXhwZWN0ZWRGbGFncyk7CisKKyAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICBtUGFzc2tleSA9IHBhc3NrZXk7CisgICAgICAgICAgICBtUGluID0gcGluOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGlmICghbURldmljZS5lcXVhbHMoaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1BBSVJJTkdfUkVRVUVTVC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIGludCB2YXJpZW50ID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9QQUlSSU5HX1ZBUklBTlQsIC0xKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKC0xLCB2YXJpZW50KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhcmllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX1BJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2Uuc2V0UGluKG1QaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9QQVNTS0VZOgorICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5zZXRQYXNza2V5KG1QYXNza2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5QQUlSSU5HX1ZBUklBTlRfUEFTU0tFWV9DT05GSVJNQVRJT046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9DT05TRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5zZXRQYWlyaW5nQ29uZmlybWF0aW9uKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9PT0JfQ09OU0VOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2Uuc2V0UmVtb3RlT3V0T2ZCYW5kRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfQk9ORF9TVEFURSwgLTEpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9OT05FX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9ORElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9CT05ESU5HX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0JPTkRFRF9GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ29ubmVjdFByb2ZpbGVSZWNlaXZlciBleHRlbmRzIEZsYWdSZWNlaXZlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURURfRkxBRyA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HX0ZMQUcgPSAxIDw8IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURURfRkxBRyA9IDEgPDwgMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkdfRkxBRyA9IDEgPDwgMzsKKworICAgICAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtRGV2aWNlOworICAgICAgICBwcml2YXRlIGludCBtUHJvZmlsZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbm5lY3Rpb25BY3Rpb247CisKKyAgICAgICAgcHVibGljIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUsIGludCBleHBlY3RlZEZsYWdzKSB7CisgICAgICAgICAgICBzdXBlcihleHBlY3RlZEZsYWdzKTsKKworICAgICAgICAgICAgbURldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgIG1Qcm9maWxlID0gcHJvZmlsZTsKKworICAgICAgICAgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQOgorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbkFjdGlvbiA9IEJsdWV0b290aEEyZHAuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFOgorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbkFjdGlvbiA9IEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5QQU46CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gQmx1ZXRvb3RoUGFuLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25BY3Rpb24gIT0gbnVsbCAmJiBtQ29ubmVjdGlvbkFjdGlvbi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIGlmICghbURldmljZS5lcXVhbHMoaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1NUQVRFLCAtMSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZSgtMSwgc3RhdGUpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9ESVNDT05ORUNURURfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfQ09OTkVDVElOR19GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0NPTk5FQ1RFRF9GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9ESVNDT05ORUNUSU5HX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb25uZWN0UGFuUmVjZWl2ZXIgZXh0ZW5kcyBDb25uZWN0UHJvZmlsZVJlY2VpdmVyIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVJvbGU7CisKKyAgICAgICAgcHVibGljIENvbm5lY3RQYW5SZWNlaXZlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcm9sZSwgaW50IGV4cGVjdGVkRmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyKGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5QQU4sIGV4cGVjdGVkRmxhZ3MpOworCisgICAgICAgICAgICBtUm9sZSA9IHJvbGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgaWYgKG1Sb2xlICE9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQYW4uRVhUUkFfTE9DQUxfUk9MRSwgLTEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdXBlci5vblJlY2VpdmUoY29udGV4dCwgaW50ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU3RhcnRTdG9wU2NvUmVjZWl2ZXIgZXh0ZW5kcyBGbGFnUmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEX0ZMQUcgPSAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUcgPSAxIDw8IDE7CisKKyAgICAgICAgcHVibGljIFN0YXJ0U3RvcFNjb1JlY2VpdmVyKGludCBleHBlY3RlZEZsYWdzKSB7CisgICAgICAgICAgICBzdXBlcihleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoQXVkaW9NYW5hZ2VyLkFDVElPTl9TQ09fQVVESU9fU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShBdWRpb01hbmFnZXIuRVhUUkFfU0NPX0FVRElPX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLlNDT19BVURJT19TVEFURV9FUlJPUik7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShBdWRpb01hbmFnZXIuU0NPX0FVRElPX1NUQVRFX0VSUk9SLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgc3dpdGNoKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQXVkaW9NYW5hZ2VyLlNDT19BVURJT19TVEFURV9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfQ09OTkVDVEVEX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQXVkaW9NYW5hZ2VyLlNDT19BVURJT19TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciBtU2VydmljZUxpc3RlbmVyID0KKyAgICAgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChpbnQgcHJvZmlsZSwgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQOgorICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHAgPSAoQmx1ZXRvb3RoQTJkcCkgcHJveHk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldCA9IChCbHVldG9vdGhIZWFkc2V0KSBwcm94eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFOgorICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0ID0gKEJsdWV0b290aElucHV0RGV2aWNlKSBwcm94eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuUEFOOgorICAgICAgICAgICAgICAgICAgICAgICAgbVBhbiA9IChCbHVldG9vdGhQYW4pIHByb3h5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQOgorICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHAgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5QQU46CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFuID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIExpc3Q8QnJvYWRjYXN0UmVjZWl2ZXI+IG1SZWNlaXZlcnMgPSBuZXcgQXJyYXlMaXN0PEJyb2FkY2FzdFJlY2VpdmVyPigpOworCisgICAgcHJpdmF0ZSBCdWZmZXJlZFdyaXRlciBtT3V0cHV0V3JpdGVyOworICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU91dHB1dEZpbGU7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1BMmRwID0gbnVsbDsKKyAgICBwcml2YXRlIEJsdWV0b290aEhlYWRzZXQgbUhlYWRzZXQgPSBudWxsOworICAgIHByaXZhdGUgQmx1ZXRvb3RoSW5wdXREZXZpY2UgbUlucHV0ID0gbnVsbDsKKyAgICBwcml2YXRlIEJsdWV0b290aFBhbiBtUGFuID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB1dGlsaXR5IGluc3RhbmNlIGZvciB0ZXN0aW5nIEJsdWV0b290aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBhcHBsaWNhdGlvbiB1c2luZyB0aGUgdXRpbGl0eS4KKyAgICAgKiBAcGFyYW0gdGFnIFRoZSBsb2cgdGFnIG9mIHRoZSBhcHBsaWNhdGlvbiB1c2luZyB0aGUgdXRpbGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmx1ZXRvb3RoVGVzdFV0aWxzKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHRhZykgeworICAgICAgICB0aGlzKGNvbnRleHQsIHRhZywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHV0aWxpdHkgaW5zdGFuY2UgZm9yIHRlc3RpbmcgQmx1ZXRvb3RoLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSB1dGlsaXR5LgorICAgICAqIEBwYXJhbSB0YWcgVGhlIGxvZyB0YWcgb2YgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSB1dGlsaXR5LgorICAgICAqIEBwYXJhbSBvdXRwdXRGaWxlIFRoZSBwYXRoIHRvIGFuIG91dHB1dCBmaWxlIGlmIHRoZSB1dGlsaXR5IGlzIHRvIHdyaXRlIHJlc3VsdHMgdG8gYQorICAgICAqICAgICAgICBzZXBhcmF0ZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhUZXN0VXRpbHMoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdGFnLCBTdHJpbmcgb3V0cHV0RmlsZSkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1UYWcgPSB0YWc7CisgICAgICAgIG1PdXRwdXRGaWxlID0gb3V0cHV0RmlsZTsKKworICAgICAgICBpZiAobU91dHB1dEZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgbU91dHB1dFdyaXRlciA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1PdXRwdXRXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwgbU91dHB1dEZpbGUpLCB0cnVlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncobVRhZywgIlRlc3Qgb3V0cHV0IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCIsIGUpOworICAgICAgICAgICAgICAgIG1PdXRwdXRXcml0ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB1dGlsaXR5IGluc3RhbmNlIGFuZCB1bnJlZ2lzdGVycyBhbnkgQnJvYWRjYXN0UmVjZWl2ZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICB3aGlsZSAoIW1SZWNlaXZlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVycy5yZW1vdmUoMCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdXRwdXRXcml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0V3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncobVRhZywgIlRlc3Qgb3V0cHV0IGZpbGUgY291bGQgbm90IGJlIGNsb3NlZCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlcyBCbHVldG9vdGggYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCBCbHVldG9vdGggd2FzIHR1cm5lZCBvbiBhbmQgdGhhdCB0aGUgY29ycmVjdAorICAgICAqIGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmFibGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGludCBtYXNrID0gKEJsdWV0b290aFJlY2VpdmVyLlNUQVRFX1RVUk5JTkdfT05fRkxBRyB8IEJsdWV0b290aFJlY2VpdmVyLlNUQVRFX09OX0ZMQUcKKyAgICAgICAgICAgICAgICB8IEJsdWV0b290aFJlY2VpdmVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9GTEFHKTsKKyAgICAgICAgbG9uZyBzdGFydCA9IC0xOworICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IGdldEJsdWV0b290aFJlY2VpdmVyKG1hc2spOworCisgICAgICAgIGludCBzdGF0ZSA9IGFkYXB0ZXIuZ2V0U3RhdGUoKTsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OOgorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09OOgorICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOworICAgICAgICAgICAgICAgIG1hc2sgPSAwOyAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRjoKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5lbmFibGUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfVFVSTklOR19PRkY6CisgICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZW5hYmxlKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJlbmFibGUoKSBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIHN0YXRlKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IEVOQUJMRV9ESVNBQkxFX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIHN0YXRlID0gYWRhcHRlci5nZXRTdGF0ZSgpOworICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04KKyAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOworICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZW5hYmxlKCkgY29tcGxldGVkIGluICVkIG1zIiwgKGZpbmlzaCAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KCJlbmFibGUoKSBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKKyAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImVuYWJsZSgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKKyAgICAgICAgICAgICAgICBzdGF0ZSwgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTiwgZmlyZWRGbGFncywgbWFzaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGVzIEJsdWV0b290aCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IEJsdWV0b290aCB3YXMgdHVybmVkIG9mZiBhbmQgdGhhdCB0aGUgY29ycmVjdAorICAgICAqIGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpbnQgbWFzayA9IChCbHVldG9vdGhSZWNlaXZlci5TVEFURV9UVVJOSU5HX09GRl9GTEFHIHwgQmx1ZXRvb3RoUmVjZWl2ZXIuU1RBVEVfT0ZGX0ZMQUcKKyAgICAgICAgICAgICAgICB8IEJsdWV0b290aFJlY2VpdmVyLlNDQU5fTU9ERV9OT05FX0ZMQUcpOworICAgICAgICBsb25nIHN0YXJ0ID0gLTE7CisgICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7CisKKyAgICAgICAgaW50IHN0YXRlID0gYWRhcHRlci5nZXRTdGF0ZSgpOworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT0ZGOgorICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOworICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfVFVSTklOR19PTjoKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OOgorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZGlzYWJsZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09GRjoKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgICAgICBtYXNrID0gMDsgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZGlzYWJsZSgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgc3RhdGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgRU5BQkxFX0RJU0FCTEVfVElNRU9VVCkgeworICAgICAgICAgICAgc3RhdGUgPSBhZGFwdGVyLmdldFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkYKKyAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImRpc2FibGUoKSBjb21wbGV0ZWQgaW4gJWQgbXMiLCAoZmluaXNoIC0gc3RhcnQpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoImRpc2FibGUoKSBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKKyAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImRpc2FibGUoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsCisgICAgICAgICAgICAgICAgc3RhdGUsIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT0ZGLCBmaXJlZEZsYWdzLCBtYXNrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyB0aGUgbG9jYWwgZGV2aWNlIGludG8gZGlzY292ZXJhYmxlIG1vZGUgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9jYWwgZGV2aWNlCisgICAgICogaXMgaW4gZGlzY292ZXJhYmxlIG1vZGUgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2NvdmVyYWJsZShCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaW50IG1hc2sgPSBCbHVldG9vdGhSZWNlaXZlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFX0ZMQUc7CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmYWlsKCJkaXNjb3ZlcmFibGUoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzY2FuTW9kZSA9IGFkYXB0ZXIuZ2V0U2Nhbk1vZGUoKTsKKyAgICAgICAgaWYgKHNjYW5Nb2RlID09IEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRCbHVldG9vdGhSZWNlaXZlcihtYXNrKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEUsIHNjYW5Nb2RlKTsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuc2V0U2Nhbk1vZGUoQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFKSk7CisKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQgPCBESVNDT1ZFUkFCTEVfVU5ESVNDT1ZFUkFCTEVfVElNRU9VVCkgeworICAgICAgICAgICAgc2Nhbk1vZGUgPSBhZGFwdGVyLmdldFNjYW5Nb2RlKCk7CisgICAgICAgICAgICBpZiAoc2Nhbk1vZGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFCisgICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7CisgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzY292ZXJhYmxlKCkgY29tcGxldGVkIGluICVkIG1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCkgLSBzdGFydCkpKTsKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZGlzY292ZXJhYmxlKCkgdGltZW91dDogc2Nhbk1vZGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAiCisgICAgICAgICAgICAgICAgKyAiKGV4cGVjdGVkIDB4JXgpIiwgc2Nhbk1vZGUsIEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRSwKKyAgICAgICAgICAgICAgICBmaXJlZEZsYWdzLCBtYXNrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyB0aGUgbG9jYWwgZGV2aWNlIGludG8gY29ubmVjdGFibGUgb25seSBtb2RlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvY2FsCisgICAgICogZGV2aWNlIGlzIGluIGluIGNvbm5lY3RhYmxlIG1vZGUgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuZGlzY292ZXJhYmxlKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpbnQgbWFzayA9IEJsdWV0b290aFJlY2VpdmVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9GTEFHOworCisgICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZmFpbCgidW5kaXNjb3ZlcmFibGUoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzY2FuTW9kZSA9IGFkYXB0ZXIuZ2V0U2Nhbk1vZGUoKTsKKyAgICAgICAgaWYgKHNjYW5Nb2RlID09IEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IGdldEJsdWV0b290aFJlY2VpdmVyKG1hc2spOworCisgICAgICAgIGFzc2VydEVxdWFscyhCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEUsIHNjYW5Nb2RlKTsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuc2V0U2Nhbk1vZGUoQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEUpKTsKKworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCA8IERJU0NPVkVSQUJMRV9VTkRJU0NPVkVSQUJMRV9USU1FT1VUKSB7CisgICAgICAgICAgICBzY2FuTW9kZSA9IGFkYXB0ZXIuZ2V0U2Nhbk1vZGUoKTsKKyAgICAgICAgICAgIGlmIChzY2FuTW9kZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRQorICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgeworICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoInVuZGlzY292ZXJhYmxlKCkgY29tcGxldGVkIGluICVkIG1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCkgLSBzdGFydCkpKTsKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgidW5kaXNjb3ZlcmFibGUoKSB0aW1lb3V0OiBzY2FuTW9kZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4ICIKKyAgICAgICAgICAgICAgICArICIoZXhwZWN0ZWQgMHgleCkiLCBzY2FuTW9kZSwgQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEUsIGZpcmVkRmxhZ3MsCisgICAgICAgICAgICAgICAgbWFzaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBhIHNjYW4gZm9yIHJlbW90ZSBkZXZpY2VzIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvY2FsIGRldmljZSBpcyBzY2FubmluZworICAgICAqIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFNjYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGludCBtYXNrID0gQmx1ZXRvb3RoUmVjZWl2ZXIuRElTQ09WRVJZX1NUQVJURURfRkxBRzsKKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoInN0YXJ0U2NhbigpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFkYXB0ZXIuaXNEaXNjb3ZlcmluZygpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IGdldEJsdWV0b290aFJlY2VpdmVyKG1hc2spOworCisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLnN0YXJ0RGlzY292ZXJ5KCkpOworCisgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgU1RBUlRfU1RPUF9TQ0FOX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIGlmIChhZGFwdGVyLmlzRGlzY292ZXJpbmcoKSAmJiAoKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spKSB7CisgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgic3RhcnRTY2FuKCkgY29tcGxldGVkIGluICVkIG1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCkgLSBzdGFydCkpKTsKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgic3RhcnRTY2FuKCkgdGltZW91dDogaXNEaXNjb3ZlcmluZz0lYiwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAorICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNEaXNjb3ZlcmluZygpLCBmaXJlZEZsYWdzLCBtYXNrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgYSBzY2FuIGZvciByZW1vdGUgZGV2aWNlcyBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2NhbCBkZXZpY2UgaXMgbm90IHNjYW5uaW5nCisgICAgICogYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BTY2FuKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpbnQgbWFzayA9IEJsdWV0b290aFJlY2VpdmVyLkRJU0NPVkVSWV9GSU5JU0hFRF9GTEFHOworCisgICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZmFpbCgic3RvcFNjYW4oKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7CisKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuY2FuY2VsRGlzY292ZXJ5KCkpOworCisgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgU1RBUlRfU1RPUF9TQ0FOX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIGlmICghYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCkgJiYgKChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSkgeworICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoInN0b3BTY2FuKCkgY29tcGxldGVkIGluICVkIG1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCkgLSBzdGFydCkpKTsKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgic3RvcFNjYW4oKSB0aW1lb3V0OiBpc0Rpc2NvdmVyaW5nPSViLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsCisgICAgICAgICAgICAgICAgYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCksIGZpcmVkRmxhZ3MsIG1hc2spKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgUEFOIHRldGhlcmluZyBvbiB0aGUgbG9jYWwgZGV2aWNlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGV0aGVyaW5nIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVQYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGlmIChtUGFuID09IG51bGwpIG1QYW4gPSAoQmx1ZXRvb3RoUGFuKSBjb25uZWN0UHJveHkoYWRhcHRlciwgQmx1ZXRvb3RoUHJvZmlsZS5QQU4pOworICAgICAgICBhc3NlcnROb3ROdWxsKG1QYW4pOworCisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbVBhbi5zZXRCbHVldG9vdGhUZXRoZXJpbmcodHJ1ZSk7CisgICAgICAgIGxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBhc3NlcnRUcnVlKG1QYW4uaXNUZXRoZXJpbmdPbigpKTsKKworICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJlbmFibGVQYW4oKSBjb21wbGV0ZWQgaW4gJWQgbXMiLCAoc3RvcCAtIHN0YXJ0KSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGVzIFBBTiB0ZXRoZXJpbmcgb24gdGhlIGxvY2FsIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRldGhlcmluZyBpcworICAgICAqIGRpc2FibGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzYWJsZVBhbihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1QYW4gPT0gbnVsbCkgbVBhbiA9IChCbHVldG9vdGhQYW4pIGNvbm5lY3RQcm94eShhZGFwdGVyLCBCbHVldG9vdGhQcm9maWxlLlBBTik7CisgICAgICAgIGFzc2VydE5vdE51bGwobVBhbik7CisKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBtUGFuLnNldEJsdWV0b290aFRldGhlcmluZyhmYWxzZSk7CisgICAgICAgIGxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBhc3NlcnRGYWxzZShtUGFuLmlzVGV0aGVyaW5nT24oKSk7CisKKyAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzYWJsZVBhbigpIGNvbXBsZXRlZCBpbiAlZCBtcyIsIChzdG9wIC0gc3RhcnQpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGVzIGEgcGFpcmluZyB3aXRoIGEgcmVtb3RlIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZXZpY2VzIGFyZSBwYWlyZWQKKyAgICAgKiBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KKyAgICAgKiBAcGFyYW0gcGFzc2tleSBUaGUgcGFpcmluZyBwYXNza2V5IGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwYXNza2V5LiBBbnkgdmFsdWUgaWYgbm90LgorICAgICAqIEBwYXJhbSBwaW4gVGhlIHBhaXJpbmcgcGluIGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwaW4uIEFueSB2YWx1ZSBpZiBub3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFpcihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LCBieXRlW10gcGluKSB7CisgICAgICAgIHBhaXJPckFjY2VwdFBhaXIoYWRhcHRlciwgZGV2aWNlLCBwYXNza2V5LCBwaW4sIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2VwdHMgYSBwYWlyaW5nIHdpdGggYSByZW1vdGUgZGV2aWNlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGRldmljZXMgYXJlIHBhaXJlZAorICAgICAqIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBwYXNza2V5IFRoZSBwYWlyaW5nIHBhc3NrZXkgaWYgcGFpcmluZyByZXF1aXJlcyBhIHBhc3NrZXkuIEFueSB2YWx1ZSBpZiBub3QuCisgICAgICogQHBhcmFtIHBpbiBUaGUgcGFpcmluZyBwaW4gaWYgcGFpcmluZyByZXF1aXJlcyBhIHBpbi4gQW55IHZhbHVlIGlmIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRQYWlyKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHBhc3NrZXksCisgICAgICAgICAgICBieXRlW10gcGluKSB7CisgICAgICAgIHBhaXJPckFjY2VwdFBhaXIoYWRhcHRlciwgZGV2aWNlLCBwYXNza2V5LCBwaW4sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkge0BsaW5rICNwYWlyKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSwgaW50LCBieXRlW10pfSBhbmQKKyAgICAgKiB7QGxpbmsgI2FjY2VwdFBhaXIoQmx1ZXRvb3RoQWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlLCBpbnQsIGJ5dGVbXSl9IHRvIGVpdGhlciBwYWlyIG9yIGFjY2VwdAorICAgICAqIGEgcGFpcmluZyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KKyAgICAgKiBAcGFyYW0gcGFzc2tleSBUaGUgcGFpcmluZyBwYXNza2V5IGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwYXNza2V5LiBBbnkgdmFsdWUgaWYgbm90LgorICAgICAqIEBwYXJhbSBwaW4gVGhlIHBhaXJpbmcgcGluIGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwaW4uIEFueSB2YWx1ZSBpZiBub3QuCisgICAgICogQHBhcmFtIHNob3VsZFBhaXIgV2hldGhlciB0byBwYWlyIG9yIGFjY2VwdCB0aGUgcGFpci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFpck9yQWNjZXB0UGFpcihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LAorICAgICAgICAgICAgYnl0ZVtdIHBpbiwgYm9vbGVhbiBzaG91bGRQYWlyKSB7CisgICAgICAgIGludCBtYXNrID0gUGFpclJlY2VpdmVyLlNUQVRFX0JPTkRJTkdfRkxBRyB8IFBhaXJSZWNlaXZlci5TVEFURV9CT05ERURfRkxBRzsKKyAgICAgICAgbG9uZyBzdGFydCA9IC0xOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKyAgICAgICAgaWYgKHNob3VsZFBhaXIpIHsKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJwYWlyKGRldmljZT0lcykiLCBkZXZpY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoImFjY2VwdFBhaXIoZGV2aWNlPSVzKSIsIGRldmljZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgUGFpclJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0UGFpclJlY2VpdmVyKGRldmljZSwgcGFzc2tleSwgcGluLCBtYXNrKTsKKworICAgICAgICBpbnQgc3RhdGUgPSBkZXZpY2UuZ2V0Qm9uZFN0YXRlKCk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGlmIChzaG91bGRQYWlyKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLmNyZWF0ZUJvbmQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ESU5HOgorICAgICAgICAgICAgICAgIG1hc2sgPSAwOyAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgbWV0aG9kTmFtZSwgc3RhdGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgUEFJUl9VTlBBSVJfVElNRU9VVCkgeworICAgICAgICAgICAgc3RhdGUgPSBkZXZpY2UuZ2V0Qm9uZFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKKyAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKKyAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBzdGF0ZSwgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVELCBmaXJlZEZsYWdzLCBtYXNrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlcyBhIHBhaXJpbmcgd2l0aCBhIHJlbW90ZSBkZXZpY2UgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGV2aWNlcyBhcmUgdW5wYWlyZWQKKyAgICAgKiBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnBhaXIoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGludCBtYXNrID0gUGFpclJlY2VpdmVyLlNUQVRFX05PTkVfRkxBRzsKKyAgICAgICAgbG9uZyBzdGFydCA9IC0xOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoInVucGFpcihkZXZpY2U9JXMpIiwgZGV2aWNlKTsKKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgUGFpclJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0UGFpclJlY2VpdmVyKGRldmljZSwgMCwgbnVsbCwgbWFzayk7CisKKyAgICAgICAgaW50IHN0YXRlID0gZGV2aWNlLmdldEJvbmRTdGF0ZSgpOworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX05PTkU6CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9ORElORzoKKyAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLnJlbW92ZUJvbmQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UucmVtb3ZlQm9uZCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgaW52YWxpZCBzdGF0ZTogc3RhdGU9JWQiLCBtZXRob2ROYW1lLCBzdGF0ZSkpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBQQUlSX1VOUEFJUl9USU1FT1VUKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlLmdldEJvbmRTdGF0ZSgpID09IEJsdWV0b290aERldmljZS5CT05EX05PTkUKKyAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKKyAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyBhIHByb2ZpbGUgZnJvbSB0aGUgbG9jYWwgZGV2aWNlIHRvIGEgcmVtb3RlIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgICAqIHByb2ZpbGUgaXMgY29ubmVjdGVkIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBwcm9maWxlIFRoZSBwcm9maWxlIHRvIGNvbm5lY3QuIE9uZSBvZiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNBMkRQfSwKKyAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNIRUFEU0VUfSwgb3Ige0BsaW5rIEJsdWV0b290aFByb2ZpbGUjSU5QVVRfREVWSUNFfS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gcHJpbnRlZCBpbiB0aGUgbG9ncy4gIElmIG51bGwsIHdpbGwgYmUKKyAgICAgKiAiY29ubmVjdFByb2ZpbGUocHJvZmlsZT0mbHQ7cHJvZmlsZSZndDssIGRldmljZT0mbHQ7ZGV2aWNlJmd0OykiCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdFByb2ZpbGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIGlmIChtZXRob2ROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJjb25uZWN0UHJvZmlsZShwcm9maWxlPSVkLCBkZXZpY2U9JXMpIiwgcHJvZmlsZSwgZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbWFzayA9IChDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0NPTk5FQ1RJTkdfRkxBRworICAgICAgICAgICAgICAgIHwgQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9DT05ORUNURURfRkxBRyk7CisgICAgICAgIGxvbmcgc3RhcnQgPSAtMTsKKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSA9IGNvbm5lY3RQcm94eShhZGFwdGVyLCBwcm9maWxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7CisKKyAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlciByZWNlaXZlciA9IGdldENvbm5lY3RQcm9maWxlUmVjZWl2ZXIoZGV2aWNlLCBwcm9maWxlLCBtYXNrKTsKKworICAgICAgICBpbnQgc3RhdGUgPSBwcm94eS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHByb3h5LmNvbm5lY3QoZGV2aWNlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgbWV0aG9kTmFtZSwgc3RhdGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9ESVNDT05ORUNUX1BST0ZJTEVfVElNRU9VVCkgeworICAgICAgICAgICAgc3RhdGUgPSBwcm94eS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRAorICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgeworICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIGluICVkIG1zIiwgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoIC0gc3RhcnQpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3RzIGEgcHJvZmlsZSBiZXR3ZWVuIHRoZSBsb2NhbCBkZXZpY2UgYW5kIGEgcmVtb3RlIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZQorICAgICAqIHRoYXQgdGhlIHByb2ZpbGUgaXMgZGlzY29ubmVjdGVkIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBwcm9maWxlIFRoZSBwcm9maWxlIHRvIGRpc2Nvbm5lY3QuIE9uZSBvZiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNBMkRQfSwKKyAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNIRUFEU0VUfSwgb3Ige0BsaW5rIEJsdWV0b290aFByb2ZpbGUjSU5QVVRfREVWSUNFfS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gcHJpbnRlZCBpbiB0aGUgbG9ncy4gIElmIG51bGwsIHdpbGwgYmUKKyAgICAgKiAiY29ubmVjdFByb2ZpbGUocHJvZmlsZT0mbHQ7cHJvZmlsZSZndDssIGRldmljZT0mbHQ7ZGV2aWNlJmd0OykiCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdFByb2ZpbGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIGlmIChtZXRob2ROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0UHJvZmlsZShwcm9maWxlPSVkLCBkZXZpY2U9JXMpIiwgcHJvZmlsZSwgZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbWFzayA9IChDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0RJU0NPTk5FQ1RJTkdfRkxBRworICAgICAgICAgICAgICAgIHwgQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9ESVNDT05ORUNURURfRkxBRyk7CisgICAgICAgIGxvbmcgc3RhcnQgPSAtMTsKKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSA9IGNvbm5lY3RQcm94eShhZGFwdGVyLCBwcm9maWxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7CisKKyAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlciByZWNlaXZlciA9IGdldENvbm5lY3RQcm9maWxlUmVjZWl2ZXIoZGV2aWNlLCBwcm9maWxlLCBtYXNrKTsKKworICAgICAgICBpbnQgc3RhdGUgPSBwcm94eS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOgorICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm94eS5kaXNjb25uZWN0KGRldmljZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgbWV0aG9kTmFtZSwgc3RhdGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9ESVNDT05ORUNUX1BST0ZJTEVfVElNRU9VVCkgeworICAgICAgICAgICAgc3RhdGUgPSBwcm94eS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRAorICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgeworICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIGluICVkIG1zIiwgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoIC0gc3RhcnQpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBQQU5VIHRvIGEgcmVtb3RlIE5BUCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBQQU5VIGlzIGNvbm5lY3RlZCBhbmQgdGhhdAorICAgICAqIHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RQYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGNvbm5lY3RQYW5PckluY29taW5nUGFuQ29ubmVjdGlvbihhZGFwdGVyLCBkZXZpY2UsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IGEgcmVtb3RlIFBBTlUgY29ubmVjdHMgdG8gdGhlIGxvY2FsIE5BUCBjb3JyZWN0bHkgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucworICAgICAqIHdlcmUgYnJvYWRjYXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbmNvbWluZ1BhbkNvbm5lY3Rpb24oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGNvbm5lY3RQYW5PckluY29taW5nUGFuQ29ubmVjdGlvbihhZGFwdGVyLCBkZXZpY2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkge0BsaW5rICNjb25uZWN0UGFuKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IGFuZAorICAgICAqIHtAbGluayAjaW5jb21pbmdQYW5Db25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IHRvIGVpdGhlciBjb25uZWN0IHRvIGEKKyAgICAgKiByZW1vdGUgTkFQIG9yIHZlcmlmeSB0aGF0IGEgcmVtb3RlIGRldmljZSBjb25uZWN0ZWQgdG8gdGhlIGxvY2FsIE5BUC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICogQHBhcmFtIGNvbm5lY3QgSWYgdGhlIG1ldGhvZCBzaG91bGQgaW5pdGlhdGUgdGhlIGNvbm5lY3Rpb24gKGlzIFBBTlUpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RQYW5PckluY29taW5nUGFuQ29ubmVjdGlvbihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsCisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3QpIHsKKyAgICAgICAgbG9uZyBzdGFydCA9IC0xOworICAgICAgICBpbnQgbWFzaywgcm9sZTsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWU7CisKKyAgICAgICAgaWYgKGNvbm5lY3QpIHsKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJjb25uZWN0UGFuKGRldmljZT0lcykiLCBkZXZpY2UpOworICAgICAgICAgICAgbWFzayA9IChDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0NPTk5FQ1RFRF9GTEFHIHwKKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9DT05ORUNUSU5HX0ZMQUcpOworICAgICAgICAgICAgcm9sZSA9IEJsdWV0b290aFBhbi5MT0NBTF9QQU5VX1JPTEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgiaW5jb21pbmdQYW5Db25uZWN0aW9uKGRldmljZT0lcykiLCBkZXZpY2UpOworICAgICAgICAgICAgbWFzayA9IENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfQ09OTkVDVEVEX0ZMQUc7CisgICAgICAgICAgICByb2xlID0gQmx1ZXRvb3RoUGFuLkxPQ0FMX05BUF9ST0xFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBkZXZpY2Ugbm90IHBhaXJlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1QYW4gPSAoQmx1ZXRvb3RoUGFuKSBjb25uZWN0UHJveHkoYWRhcHRlciwgQmx1ZXRvb3RoUHJvZmlsZS5QQU4pOworICAgICAgICBhc3NlcnROb3ROdWxsKG1QYW4pOworICAgICAgICBDb25uZWN0UGFuUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRDb25uZWN0UGFuUmVjZWl2ZXIoZGV2aWNlLCByb2xlLCBtYXNrKTsKKworICAgICAgICBpbnQgc3RhdGUgPSBtUGFuLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNUSU5HOgorICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT0gQmx1ZXRvb3RoUGFuLkxPQ0FMX1BBTlVfUk9MRSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaSgiQlQiLCAiY29ubmVjdCB0byBwYW4iKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtUGFuLmNvbm5lY3QoZGV2aWNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIG1ldGhvZE5hbWUsIHN0YXRlKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfRElTQ09OTkVDVF9QUk9GSUxFX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIHN0YXRlID0gbVBhbi5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVECisgICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7CisgICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQgaW4gJWQgbXMiLCBtZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2ggLSBzdGFydCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQiLCBtZXRob2ROYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7CisgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCVzKSIsCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgc3RhdGUsIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0cyB0aGUgUEFOVSBmcm9tIGEgcmVtb3RlIE5BUCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBQQU5VIGlzIGRpc2Nvbm5lY3RlZAorICAgICAqIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RQYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGRpc2Nvbm5lY3RGcm9tUmVtb3RlT3JWZXJpZnlDb25uZWN0TmFwKGFkYXB0ZXIsIGRldmljZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgYSByZW1vdGUgUEFOVSBkaXNjb25uZWN0cyBmcm9tIHRoZSBsb2NhbCBOQVAgY29ycmVjdGx5IGFuZCB0aGF0IHRoZSBjb3JyZWN0CisgICAgICogYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5jb21pbmdQYW5EaXNjb25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBkaXNjb25uZWN0RnJvbVJlbW90ZU9yVmVyaWZ5Q29ubmVjdE5hcChhZGFwdGVyLCBkZXZpY2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkge0BsaW5rICNkaXNjb25uZWN0UGFuKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IGFuZAorICAgICAqIHtAbGluayAjaW5jb21pbmdQYW5EaXNjb25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IHRvIGVpdGhlciBkaXNjb25uZWN0CisgICAgICogZnJvbSBhIHJlbW90ZSBOQVAgb3IgdmVyaWZ5IHRoYXQgYSByZW1vdGUgZGV2aWNlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBsb2NhbCBOQVAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBkaXNjb25uZWN0IFdoZXRoZXIgdGhlIG1ldGhvZCBzaG91bGQgY29ubmVjdCBvciB2ZXJpZnkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3RGcm9tUmVtb3RlT3JWZXJpZnlDb25uZWN0TmFwKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwKKyAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gZGlzY29ubmVjdCkgeworICAgICAgICBsb25nIHN0YXJ0ID0gLTE7CisgICAgICAgIGludCBtYXNrLCByb2xlOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgICAgICBpZiAoZGlzY29ubmVjdCkgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RQYW4oZGV2aWNlPSVzKSIsIGRldmljZSk7CisgICAgICAgICAgICBtYXNrID0gKENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICBDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0RJU0NPTk5FQ1RJTkdfRkxBRyk7CisgICAgICAgICAgICByb2xlID0gQmx1ZXRvb3RoUGFuLkxPQ0FMX1BBTlVfUk9MRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJpbmNvbWluZ1BhbkRpc2Nvbm5lY3Rpb24oZGV2aWNlPSVzKSIsIGRldmljZSk7CisgICAgICAgICAgICBtYXNrID0gQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9ESVNDT05ORUNURURfRkxBRzsKKyAgICAgICAgICAgIHJvbGUgPSBCbHVldG9vdGhQYW4uTE9DQUxfTkFQX1JPTEU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgbVBhbiA9IChCbHVldG9vdGhQYW4pIGNvbm5lY3RQcm94eShhZGFwdGVyLCBCbHVldG9vdGhQcm9maWxlLlBBTik7CisgICAgICAgIGFzc2VydE5vdE51bGwobVBhbik7CisgICAgICAgIENvbm5lY3RQYW5SZWNlaXZlciByZWNlaXZlciA9IGdldENvbm5lY3RQYW5SZWNlaXZlcihkZXZpY2UsIHJvbGUsIG1hc2spOworCisgICAgICAgIGludCBzdGF0ZSA9IG1QYW4uZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpZiAocm9sZSA9PSBCbHVldG9vdGhQYW4uTE9DQUxfUEFOVV9ST0xFKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobVBhbi5kaXNjb25uZWN0KGRldmljZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBtYXNrID0gMDsgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgaW52YWxpZCBzdGF0ZTogc3RhdGU9JWQiLCBtZXRob2ROYW1lLCBzdGF0ZSkpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBDT05ORUNUX0RJU0NPTk5FQ1RfUFJPRklMRV9USU1FT1VUKSB7CisgICAgICAgICAgICBzdGF0ZSA9IG1QYW4uZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVECisgICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7CisgICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQgaW4gJWQgbXMiLCBtZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2ggLSBzdGFydCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQiLCBtZXRob2ROYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7CisgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCVzKSIsCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgc3RhdGUsIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGEgU0NPIGNoYW5uZWwgdXNpbmcge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyI3N0YXJ0Qmx1ZXRvb3RoU2NvKCl9IGFuZCBjaGVja3MKKyAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY2hhbm5lbCBpcyBvcGVuZWQgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRTY28oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIHN0YXJ0U3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyBhIFNDTyBjaGFubmVsIHVzaW5nIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlciNzdG9wQmx1ZXRvb3RoU2NvKCl9IGFuZCBjaGVja3MKKyAgICAgKiAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BTY28oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIHN0YXJ0U3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UsIGZhbHNlKTsKKyAgICB9CisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCBmb3Ige0BsaW5rICNzdGFydFNjbyhCbHVldG9vdGhBZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UpfSBhbmQKKyAgICAgKiB7QGxpbmsgI3N0b3BTY28oQmx1ZXRvb3RoQWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBpc1N0YXJ0IFdoZXRoZXIgdGhlIFNDTyBjaGFubmVsIHNob3VsZCBiZSBvcGVuZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U3RvcFNjbyhCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gaXNTdGFydCkgeworICAgICAgICBsb25nIHN0YXJ0ID0gLTE7CisgICAgICAgIGludCBtYXNrOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgICAgICBpZiAoaXNTdGFydCkgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoInN0YXJ0U2NvKGRldmljZT0lcykiLCBkZXZpY2UpOworICAgICAgICAgICAgbWFzayA9IFN0YXJ0U3RvcFNjb1JlY2VpdmVyLlNUQVRFX0NPTk5FQ1RFRF9GTEFHOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoInN0b3BTY28oZGV2aWNlPSVzKSIsIGRldmljZSk7CisgICAgICAgICAgICBtYXNrID0gU3RhcnRTdG9wU2NvUmVjZWl2ZXIuU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgQXVkaW9NYW5hZ2VyIG1hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWFuYWdlcik7CisKKyAgICAgICAgaWYgKCFtYW5hZ2VyLmlzQmx1ZXRvb3RoU2NvQXZhaWxhYmxlT2ZmQ2FsbCgpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFNDTyIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNTY29PbiA9IG1hbmFnZXIuaXNCbHVldG9vdGhTY29PbigpOworICAgICAgICBpZiAoaXNTdGFydCA9PSBpc1Njb09uKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdGFydFN0b3BTY29SZWNlaXZlciByZWNlaXZlciA9IGdldFN0YXJ0U3RvcFNjb1JlY2VpdmVyKG1hc2spOworICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiAoaXNTdGFydCkgeworICAgICAgICAgICAgbWFuYWdlci5zdGFydEJsdWV0b290aFNjbygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFuYWdlci5zdG9wQmx1ZXRvb3RoU2NvKCk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IFNUQVJUX1NUT1BfU0NPX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIGlzU2NvT24gPSBtYW5hZ2VyLmlzQmx1ZXRvb3RoU2NvT24oKTsKKyAgICAgICAgICAgIGlmIChpc1N0YXJ0ID09IGlzU2NvT24gJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKKyAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKKyAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIHRpbWVvdXQ6IG9uPSViIChleHBlY3RlZCAlYiksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBpc1Njb09uLCBpc1N0YXJ0LCBmaXJlZEZsYWdzLCBtYXNrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc3RyaW5nIHRvIHRoZSBsb2djYXQgYW5kIGEgZmlsZSBpZiBhIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gYmUgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU91dHB1dChTdHJpbmcgcykgeworICAgICAgICBMb2cuaShtVGFnLCBzKTsKKyAgICAgICAgaWYgKG1PdXRwdXRXcml0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtT3V0cHV0V3JpdGVyLndyaXRlKHMgKyAiXG4iKTsKKyAgICAgICAgICAgIG1PdXRwdXRXcml0ZXIuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncobVRhZywgIkNvdWxkIG5vdCB3cml0ZSB0byBvdXRwdXQgZmlsZSIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJlY2VpdmVyKEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyLCBTdHJpbmdbXSBhY3Rpb25zKSB7CisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGFjdGlvbjogYWN0aW9ucykgeworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihhY3Rpb24pOworICAgICAgICB9CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIG1SZWNlaXZlcnMuYWRkKHJlY2VpdmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJsdWV0b290aFJlY2VpdmVyIGdldEJsdWV0b290aFJlY2VpdmVyKGludCBleHBlY3RlZEZsYWdzKSB7CisgICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSB7CisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fRElTQ09WRVJZX0ZJTklTSEVELAorICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX0RJU0NPVkVSWV9TVEFSVEVELAorICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NDQU5fTU9ERV9DSEFOR0VELAorICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUR9OworICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IG5ldyBCbHVldG9vdGhSZWNlaXZlcihleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOworICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyUmVjZWl2ZXIgZ2V0UGFpclJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LCBieXRlW10gcGluLAorICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhZ3MpIHsKKyAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IHsKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1BBSVJJTkdfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRH07CisgICAgICAgIFBhaXJSZWNlaXZlciByZWNlaXZlciA9IG5ldyBQYWlyUmVjZWl2ZXIoZGV2aWNlLCBwYXNza2V5LCBwaW4sIGV4cGVjdGVkRmxhZ3MpOworICAgICAgICBhZGRSZWNlaXZlcihyZWNlaXZlciwgYWN0aW9ucyk7CisgICAgICAgIHJldHVybiByZWNlaXZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIgZ2V0Q29ubmVjdFByb2ZpbGVSZWNlaXZlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwKKyAgICAgICAgICAgIGludCBleHBlY3RlZEZsYWdzKSB7CisgICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSB7CisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VELAorICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEfTsKKyAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb25uZWN0UHJvZmlsZVJlY2VpdmVyKGRldmljZSwgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOworICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb25uZWN0UGFuUmVjZWl2ZXIgZ2V0Q29ubmVjdFBhblJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCByb2xlLAorICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhZ3MpIHsKKyAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IHtCbHVldG9vdGhQYW4uQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRH07CisgICAgICAgIENvbm5lY3RQYW5SZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb25uZWN0UGFuUmVjZWl2ZXIoZGV2aWNlLCByb2xlLCBleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOworICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdGFydFN0b3BTY29SZWNlaXZlciBnZXRTdGFydFN0b3BTY29SZWNlaXZlcihpbnQgZXhwZWN0ZWRGbGFncykgeworICAgICAgICBTdHJpbmdbXSBhY3Rpb25zID0ge0F1ZGlvTWFuYWdlci5BQ1RJT05fU0NPX0FVRElPX1NUQVRFX0NIQU5HRUR9OworICAgICAgICBTdGFydFN0b3BTY29SZWNlaXZlciByZWNlaXZlciA9IG5ldyBTdGFydFN0b3BTY29SZWNlaXZlcihleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOworICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVJlY2VpdmVyKEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIG1SZWNlaXZlcnMucmVtb3ZlKHJlY2VpdmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJsdWV0b290aFByb2ZpbGUgY29ubmVjdFByb3h5KEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgaW50IHByb2ZpbGUpIHsKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuQTJEUDoKKyAgICAgICAgICAgICAgICBpZiAobUEyZHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUEyZHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6CisgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1IZWFkc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6CisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtSW5wdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKKyAgICAgICAgICAgICAgICBpZiAobVBhbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtUGFuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYWRhcHRlci5nZXRQcm9maWxlUHJveHkobUNvbnRleHQsIG1TZXJ2aWNlTGlzdGVuZXIsIHByb2ZpbGUpOworICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuQTJEUDoKKyAgICAgICAgICAgICAgICB3aGlsZSAobUEyZHAgPT0gbnVsbCAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBDT05ORUNUX1BST1hZX1RJTUVPVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1BMmRwOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6CisgICAgICAgICAgICAgICAgd2hpbGUgKG1IZWFkc2V0ID09IG51bGwgJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9QUk9YWV9USU1FT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtSGVhZHNldDsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6CisgICAgICAgICAgICAgICAgd2hpbGUgKG1JbnB1dCA9PSBudWxsICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfUFJPWFlfVElNRU9VVCkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUlucHV0OworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKKyAgICAgICAgICAgICAgICB3aGlsZSAobVBhbiA9PSBudWxsICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfUFJPWFlfVElNRU9VVCkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbVBhbjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2xlZXAobG9uZyB0aW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAodGltZSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGZhZGYxZWMuLjhlMmQ5MjUgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtOTgsNiArOTgsOSBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQVNFQ19SRU5BTUUiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TSFVURE9XTiIgLz4KIAorICAgIDwhLS0gYWNjZXNzaWJpbGl0eSB0ZXN0IHBlcm1pc3Npb25zIC0tPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVUUklFVkVfV0lORE9XX0NPTlRFTlQiIC8+CisKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudmlldy5WaWV3QXR0YWNoVGVzdEFjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJWaWV3IEF0dGFjaCBUZXN0Ij4KQEAgLTEwMzUsMTIgKzEwMzgsNiBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvc2VydmljZT4KLQogICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQud2Via2l0LkFjY2Vzc2liaWxpdHlJbmplY3RvclRlc3QkTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIiAvPgpAQCAtMTIzMSwxNCArMTIyOCwxNiBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuSW50ZXJyb2dhdGlvbkFjdGl2aXR5Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5GUkFNRVdPUktfSU5TVFJVTUVOVEFUSU9OX1RFU1QiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cyIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkZyYW1ld29ya3MgQ29yZSBUZXN0cyIgLz4KLQotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhUZXN0UnVubmVyIgotICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cyIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkJsdWV0b290aCBUZXN0cyIgLz4KLQogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9sYXlvdXQvaW50ZXJyb2dhdGlvbl9hY3Rpdml0eS54bWwgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvbGF5b3V0L2ludGVycm9nYXRpb25fYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZDk2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvbGF5b3V0L2ludGVycm9nYXRpb25fYWN0aXZpdHkueG1sCkBAIC0wLDAgKzEsMTAxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3Jvb3QiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgID4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgICAgICA+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xIgorICAgICAgICAvPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbjIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMiIKKyAgICAgICAgLz4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b24zIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjMiCisgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbjQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uNCIKKyAgICAgICAgLz4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b241IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjUiCisgICAgICAgIC8+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uNiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b242IgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgID4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b243IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjciCisgICAgICAgIC8+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uOCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b244IgorICAgICAgICAvPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbjkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uOSIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA4MDczODZhLi5mNTFiMDhlIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTExNyw0ICsxMTcsMTYgQEAKIAogICAgIDxzdHJpbmcgbmFtZT0ic2VhcmNoYWJsZV9sYWJlbCI+U2VhcmNoTWFuYWdlciBUZXN0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWFyY2hhYmxlX2hpbnQiPkEgc2VhcmNoIGhpbnQ8L3N0cmluZz4KKworICAgIDwhLS0gSW50ZXJyb2dhdGlvbkFjdGl2aXR5IC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uMSI+QnV0dG9uMTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uMiI+QnV0dG9uMjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uMyI+QnV0dG9uMzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uNCI+QnV0dG9uNDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uNSI+QnV0dG9uNTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uNiI+QnV0dG9uNjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uNyI+QnV0dG9uNzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uOCI+QnV0dG9uODwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uOSI+QnV0dG9uOTwvc3RyaW5nPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0ludGVycm9nYXRpb25BY3Rpdml0eS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvSW50ZXJyb2dhdGlvbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhMDU4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0ludGVycm9nYXRpb25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2U7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogQWN0aXZpdHkgZm9yIHRlc3RpbmcgdGhlIGFjY2Vzc2liaWxpdHkgQVBJcyBmb3IgImludGVycm9nYXRpb24iIG9mCisgKiB0aGUgc2NyZWVuIGNvbnRlbnQuIFRoZXNlIEFQSXMgYWxsb3cgZXhwbG9yaW5nIHRoZSBzY3JlZW4gYW5kCisgKiByZXF1ZXN0aW5nIGFuIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gYSBnaXZlbiB2aWV3IGZyb20gYW4KKyAqIEFjY2Vzc2lpYmxpdHlTZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgSW50ZXJyb2dhdGlvbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5pbnRlcnJvZ2F0aW9uX2FjdGl2aXR5KTsKKworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5idXR0b241KS5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5idXR0b241KS5zZXRPbkxvbmdDbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uTG9uZ0NsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkxvbmdDbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvSW50ZXJyb2dhdGlvbkFjdGl2aXR5VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvSW50ZXJyb2dhdGlvbkFjdGl2aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGNjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9JbnRlcnJvZ2F0aW9uQWN0aXZpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw0NjQgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9DTEVBUl9GT0NVUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9DTEVBUl9TRUxFQ1RJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fRk9DVVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fU0VMRUNUOworCitpbXBvcnQgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5jb3JldGVzdHMuUjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworCisvKioKKyAqIEFjdGl2aXR5IGZvciB0ZXN0aW5nIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSXMgZm9yICJpbnRlcnJvZ2F0aW9uIiBvZgorICogdGhlIHNjcmVlbiBjb250ZW50LiBUaGVzZSBBUElzIGFsbG93IGV4cGxvcmluZyB0aGUgc2NyZWVuIGFuZAorICogcmVxdWVzdGluZyBhbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGEgZ2l2ZW4gdmlldyBmcm9tIGFuCisgKiBBY2Nlc3NpaWJsaXR5U2VydmljZS4KKyAqLworcHVibGljIGNsYXNzIEludGVycm9nYXRpb25BY3Rpdml0eVRlc3QKKyAgICAgICAgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxJbnRlcnJvZ2F0aW9uQWN0aXZpdHk+IHsKKworICAgIC8vIFRpbWVvdXQgYmVmb3JlIGdpdmUgdXAgd2FpdCBmb3IgdGhlIHN5c3RlbSB0byBwcm9jZXNzIGFuIGFjY2Vzc2liaWxpdHkgc2V0dGluZyBjaGFuZ2UuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfUFJPUEFHQVRFX0FDQ0VTU0lCTElUWV9TRVRUSU5HID0gMjAwMDsKKworICAgIC8vIEhlbHBlcnMgdG8gZmlndXJlIG91dCB0aGUgZmlyc3QgYW5kIGxhc3QgdGVzdCBtZXRob2RzCisgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBsYWNrIG9mIHN1Y2ggc3VwcG9ydCBpbiBKVW5pdDMKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc1Rlc3RNZXRob2RDb3VudDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc0V4ZWN1dGVkVGVzdE1ldGhvZENvdW50OworCisgICAgLy8gSGFuZGxlIHRvIGEgY29ubmVjdGlvbiB0byB0aGUgQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlCisgICAgcHJpdmF0ZSBzdGF0aWMgSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbiBzQ29ubmVjdGlvbjsKKworICAgIC8vIFRoZSBsYXN0IHJlY2VpdmVkIGFjY2Vzc2liaWxpdHkgZXZlbnQKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBBY2Nlc3NpYmlsaXR5RXZlbnQgc0xhc3RBY2Nlc3NpYmlsaXR5RXZlbnQ7CisKKyAgICBwdWJsaWMgSW50ZXJyb2dhdGlvbkFjdGl2aXR5VGVzdCgpIHsKKyAgICAgICAgc3VwZXIoSW50ZXJyb2dhdGlvbkFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgc1Rlc3RNZXRob2RDb3VudCA9IGdldFRlc3RNZXRob2RDb3VudCgpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9IGdldENvbm5lY3Rpb24oKS5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWQoCisgICAgICAgICAgICAgICAgICAgIFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGJ1dHRvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYnV0dG9uLmdldENoaWxkQ291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIGJvdW5kcworICAgICAgICAgICAgUmVjdCBib3VuZHMgPSBuZXcgUmVjdCgpOworICAgICAgICAgICAgYnV0dG9uLmdldEJvdW5kcyhib3VuZHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJvdW5kcy5sZWZ0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBib3VuZHMudG9wKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg3MywgYm91bmRzLnJpZ2h0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0OCwgYm91bmRzLmJvdHRvbSk7CisKKyAgICAgICAgICAgIC8vIGNoYXIgc2VxdWVuY2UgYXR0cmlidXRlcworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cyIsIGJ1dHRvbi5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYW5kcm9pZC53aWRnZXQuQnV0dG9uIiwgYnV0dG9uLmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQnV0dG9uNSIsIGJ1dHRvbi5nZXRUZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChidXR0b24uZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOworCisgICAgICAgICAgICAvLyBib29sZWFuIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLmlzRm9jdXNhYmxlKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNDbGlja2FibGUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNGb2N1c2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNDbGlja2FibGUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNQYXNzd29yZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc1NlbGVjdGVkKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzQ2hlY2thYmxlKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzQ2hlY2tlZCgpKTsKKworICAgICAgICAgICAgLy8gYWN0aW9ucworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFDVElPTl9GT0NVUyB8IEFDVElPTl9TRUxFQ1QgfCBBQ1RJT05fQ0xFQVJfU0VMRUNUSU9OLAorICAgICAgICAgICAgICAgIGJ1dHRvbi5nZXRBY3Rpb25zKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWZ0ZXJDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgLy8gZmluZCBhIHZpZXcgYnkgdGV4dAorICAgICAgICAgICAgTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IGJ1dHRvbnMgPQorICAgICAgICAgICAgICAgIGdldENvbm5lY3Rpb24oKS5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld1RleHQoImJ1dHRvIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOSwgYnV0dG9ucy5zaXplKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWZ0ZXJDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYXZlcnNlQWxsVmlld3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlQ2xhc3NJZk5lZWRlZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gYnJpbmcgdXAgdGhlIGFjdGl2aXR5CisgICAgICAgICAgICBnZXRBY3Rpdml0eSgpOworCisgICAgICAgICAgICAvLyBtYWtlIGxpc3Qgb2YgZXhwZWN0ZWQgbm9kZXMKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjbGFzc05hbWVBbmRUZXh0TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgY2xhc3NOYW1lQW5kVGV4dExpc3QuYWRkKCJhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQiKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZUFuZFRleHRMaXN0LmFkZCgiYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0Iik7CisgICAgICAgICAgICBjbGFzc05hbWVBbmRUZXh0TGlzdC5hZGQoImFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCIpOworICAgICAgICAgICAgY2xhc3NOYW1lQW5kVGV4dExpc3QuYWRkKCJhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQiKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZUFuZFRleHRMaXN0LmFkZCgiYW5kcm9pZC53aWRnZXQuQnV0dG9uQnV0dG9uMSIpOworICAgICAgICAgICAgY2xhc3NOYW1lQW5kVGV4dExpc3QuYWRkKCJhbmRyb2lkLndpZGdldC5CdXR0b25CdXR0b24yIik7CisgICAgICAgICAgICBjbGFzc05hbWVBbmRUZXh0TGlzdC5hZGQoImFuZHJvaWQud2lkZ2V0LkJ1dHRvbkJ1dHRvbjMiKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZUFuZFRleHRMaXN0LmFkZCgiYW5kcm9pZC53aWRnZXQuQnV0dG9uQnV0dG9uNCIpOworICAgICAgICAgICAgY2xhc3NOYW1lQW5kVGV4dExpc3QuYWRkKCJhbmRyb2lkLndpZGdldC5CdXR0b25CdXR0b241Iik7CisgICAgICAgICAgICBjbGFzc05hbWVBbmRUZXh0TGlzdC5hZGQoImFuZHJvaWQud2lkZ2V0LkJ1dHRvbkJ1dHRvbjYiKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZUFuZFRleHRMaXN0LmFkZCgiYW5kcm9pZC53aWRnZXQuQnV0dG9uQnV0dG9uNyIpOworICAgICAgICAgICAgY2xhc3NOYW1lQW5kVGV4dExpc3QuYWRkKCJhbmRyb2lkLndpZGdldC5CdXR0b25CdXR0b244Iik7CisgICAgICAgICAgICBjbGFzc05hbWVBbmRUZXh0TGlzdC5hZGQoImFuZHJvaWQud2lkZ2V0LkJ1dHRvbkJ1dHRvbjkiKTsKKworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHJvb3QgPSAgZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZCgKKyAgICAgICAgICAgICAgICAgICAgUi5pZC5yb290KTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIldlIG11c3QgZmluZCB0aGUgZXhpc3Rpbmcgcm9vdC4iLCByb290KTsKKworICAgICAgICAgICAgUXVldWU8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBmcmluZ2UgPSBuZXcgTGlua2VkTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+KCk7CisgICAgICAgICAgICBmcmluZ2UuYWRkKHJvb3QpOworCisgICAgICAgICAgICAvLyBkbyBhIEJGUyB0cmF2ZXJzYWwgYW5kIGNoZWNrIG5vZGVzCisgICAgICAgICAgICB3aGlsZSAoIWZyaW5nZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gY3VycmVudCA9IGZyaW5nZS5wb2xsKCk7CisKKyAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgY2xhc3NOYW1lID0gY3VycmVudC5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IGN1cnJlbnQuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlZENsYXNzTmFtZUFuZFRleHQgPSBjbGFzc05hbWUudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICsgKCh0ZXh0ICE9IG51bGwpID8gdGV4dC50b1N0cmluZygpIDogIiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZENsYXNzTmFtZUFuZFRleHQgPSBjbGFzc05hbWVBbmRUZXh0TGlzdC5yZW1vdmUoMCk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkRpZCBub3QgZ2V0IHRoZSBleHBlY3RlZCBub2RlIGluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDbGFzc05hbWVBbmRUZXh0LCByZWNlaXZlZENsYXNzTmFtZUFuZFRleHQpOworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBjdXJyZW50LmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gY2hpbGQgPSBjdXJyZW50LmdldENoaWxkKGkpOworICAgICAgICAgICAgICAgICAgICBmcmluZ2UuYWRkKGNoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhZnRlckNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25Gb2N1cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBiZWZvcmVDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBicmluZyB1cCB0aGUgYWN0aXZpdHkKKyAgICAgICAgICAgIGdldEFjdGl2aXR5KCk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgYSB2aWV3IGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGZvY3VzZWQKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b24gPSBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKAorICAgICAgICAgICAgICAgICAgICBSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzRm9jdXNlZCgpKTsKKworICAgICAgICAgICAgLy8gZm9jdXMgdGhlIHZpZXcKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLnBlcmZvcm1BY3Rpb24oQUNUSU9OX0ZPQ1VTKSk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgdGhlIHZpZXcgYWdhaW4gYW5kIG1ha2Ugc3VyZSBpdCBpcyBmb2N1c2VkCisgICAgICAgICAgICBidXR0b24gPSBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5pc0ZvY3VzZWQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhZnRlckNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25DbGVhckZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgLy8gZmluZCBhIHZpZXcgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgZm9jdXNlZAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9ICBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKAorICAgICAgICAgICAgICAgICAgICBSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzRm9jdXNlZCgpKTsKKworICAgICAgICAgICAgLy8gZm9jdXMgdGhlIHZpZXcKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLnBlcmZvcm1BY3Rpb24oQUNUSU9OX0ZPQ1VTKSk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgdGhlIHZpZXcgYWdhaW4gYW5kIG1ha2Ugc3VyZSBpdCBpcyBmb2N1c2VkCisgICAgICAgICAgICBidXR0b24gPSAgZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZChSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNGb2N1c2VkKCkpOworCisgICAgICAgICAgICAvLyB1bmZvY3VzIHRoZSB2aWV3CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5wZXJmb3JtQWN0aW9uKEFDVElPTl9DTEVBUl9GT0NVUykpOworCisgICAgICAgICAgICAvLyBmaW5kIHRoZSB2aWV3IGFnYWluIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGZvY3VzZWQKKyAgICAgICAgICAgIGJ1dHRvbiA9ICBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNGb2N1c2VkKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWZ0ZXJDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uU2VsZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgLy8gZmluZCBhIHZpZXcgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3Qgc2VsZWN0ZWQKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b24gPSBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKAorICAgICAgICAgICAgICAgICAgICBSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzU2VsZWN0ZWQoKSk7CisKKyAgICAgICAgICAgIC8vIHNlbGVjdCB0aGUgdmlldworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fU0VMRUNUKSk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgdGhlIHZpZXcgYWdhaW4gYW5kIG1ha2Ugc3VyZSBpdCBpcyBzZWxlY3RlZAorICAgICAgICAgICAgYnV0dG9uID0gZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZChSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFmdGVyQ2xhc3NJZk5lZWRlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbkNsZWFyU2VsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgLy8gZmluZCBhIHZpZXcgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3Qgc2VsZWN0ZWQKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b24gPSBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKAorICAgICAgICAgICAgICAgICAgICBSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzU2VsZWN0ZWQoKSk7CisKKyAgICAgICAgICAgIC8vIHNlbGVjdCB0aGUgdmlldworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fU0VMRUNUKSk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgdGhlIHZpZXcgYWdhaW4gYW5kIG1ha2Ugc3VyZSBpdCBpcyBzZWxlY3RlZAorICAgICAgICAgICAgYnV0dG9uID0gZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZChSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNTZWxlY3RlZCgpKTsKKworICAgICAgICAgICAgLy8gdW5zZWxlY3QgdGhlIHZpZXcKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLnBlcmZvcm1BY3Rpb24oQUNUSU9OX0NMRUFSX1NFTEVDVElPTikpOworCisgICAgICAgICAgICAvLyBmaW5kIHRoZSB2aWV3IGFnYWluIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IHNlbGVjdGVkCisgICAgICAgICAgICBidXR0b24gPSBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFmdGVyQ2xhc3NJZk5lZWRlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NpYmlsaXR5RXZlbnRHZXRTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlQ2xhc3NJZk5lZWRlZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gYnJpbmcgdXAgdGhlIGFjdGl2aXR5CisgICAgICAgICAgICBnZXRBY3Rpdml0eSgpOworCisgICAgICAgICAgICAvLyBmaW5kIGEgdmlldyBhbmQgbWFrZSBzdXJlIGl0IGlzIG5vdCBmb2N1c2VkCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gYnV0dG9uID0gZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZCgKKyAgICAgICAgICAgICAgICAgICAgUi5pZC5idXR0b241KTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc1NlbGVjdGVkKCkpOworCisgICAgICAgICAgICAvLyBmb2N1cyB0aGUgdmlldworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fRk9DVVMpKTsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDIwMCk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbGFzdCBldmVudCBzb3VyY2UKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBzb3VyY2UgPSBzTGFzdEFjY2Vzc2liaWxpdHlFdmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc291cmNlKTsKKworICAgICAgICAgICAgLy8gYm91bmRzCisgICAgICAgICAgICBSZWN0IGJ1dHRvbkJvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICBidXR0b24uZ2V0Qm91bmRzKGJ1dHRvbkJvdW5kcyk7CisgICAgICAgICAgICBSZWN0IHNvdXJjZUJvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICBzb3VyY2UuZ2V0Qm91bmRzKHNvdXJjZUJvdW5kcyk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhidXR0b25Cb3VuZHMubGVmdCwgc291cmNlQm91bmRzLmxlZnQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1dHRvbkJvdW5kcy5yaWdodCwgc291cmNlQm91bmRzLnJpZ2h0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhidXR0b25Cb3VuZHMudG9wLCBzb3VyY2VCb3VuZHMudG9wKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhidXR0b25Cb3VuZHMuYm90dG9tLCBzb3VyY2VCb3VuZHMuYm90dG9tKTsKKworICAgICAgICAgICAgLy8gY2hhciBzZXF1ZW5jZSBhdHRyaWJ1dGVzCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnV0dG9uLmdldFBhY2thZ2VOYW1lKCksIHNvdXJjZS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhidXR0b24uZ2V0Q2xhc3NOYW1lKCksIHNvdXJjZS5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnV0dG9uLmdldFRleHQoKSwgc291cmNlLmdldFRleHQoKSk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKGJ1dHRvbi5nZXRDb250ZW50RGVzY3JpcHRpb24oKSwgc291cmNlLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKKworICAgICAgICAgICAgLy8gYm9vbGVhbiBhdHRyaWJ1dGVzCisgICAgICAgICAgICBhc3NlcnRTYW1lKGJ1dHRvbi5pc0ZvY3VzYWJsZSgpLCBzb3VyY2UuaXNGb2N1c2FibGUoKSk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKGJ1dHRvbi5pc0NsaWNrYWJsZSgpLCBzb3VyY2UuaXNDbGlja2FibGUoKSk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKGJ1dHRvbi5pc0VuYWJsZWQoKSwgc291cmNlLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoYnV0dG9uLmlzRm9jdXNlZCgpLCBzb3VyY2UuaXNGb2N1c2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShidXR0b24uaXNMb25nQ2xpY2thYmxlKCksIHNvdXJjZS5pc0xvbmdDbGlja2FibGUoKSk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKGJ1dHRvbi5pc1Bhc3N3b3JkKCksIHNvdXJjZS5pc1Bhc3N3b3JkKCkpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShidXR0b24uaXNTZWxlY3RlZCgpLCBzb3VyY2UuaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoYnV0dG9uLmlzQ2hlY2thYmxlKCksIHNvdXJjZS5pc0NoZWNrYWJsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoYnV0dG9uLmlzQ2hlY2tlZCgpLCBzb3VyY2UuaXNDaGVja2VkKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWZ0ZXJDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzY3J1YkNsYXNzKENsYXNzPD8+IHRlc3RDYXNlQ2xhc3MpIHsKKyAgICAgICAgLyogaW50ZW50aW9uYWxseSBkbyBub3Qgc2NydWIgKi8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFjY2Vzc2liaWxpdHkgaW4gYSBnaXZlbiBzdGF0ZSBieSB3cml0aW5nIHRoZSBzdGF0ZSB0byB0aGUKKyAgICAgKiBzZXR0aW5ncyBhbmQgd2FpdGluZyB1bnRpbCB0aGUgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgcGlja3MKKyAgICAgKiBpdCB1cCBmb3IgbWF4IHtAbGluayAjVElNRU9VVF9QUk9QQUdBVEVfQUNDRVNTSUJMSVRZX1NFVFRJTkd9LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlIFRoZSBhY2Nlc3NpYmlsaXR5IHN0YXRlLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUFjY2Vzc2liaWxpdHlTdGF0ZShib29sZWFuIHN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOworICAgICAgICAvLyBJZiB0aGUgbG9jYWwgbWFuYWdlciByZWFkeSA9PiBub3RoaW5nIHRvIGRvLgorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBhY2Nlc3NpYmlsaXR5TWFuYWdlciA9IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICBpZiAoYWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkgPT0gc3RhdGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzeXN0ZW0gYWxyZWFkeSBrbm93cyBhYm91dCB0aGUgZGVzaXJlZCBzdGF0ZS4gCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGN1cnJlbnRTdGF0ZSA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfRU5BQkxFRCkgPT0gMTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgIT0gc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugd2FrZSBvdXJzZWx2ZXMgYXMgdGhlIGRlc2lyZWQgc3RhdGUgaXMgcHJvcGFnYXRlZC4KKyAgICAgICAgICAgICAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlci5hZGRBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlci5BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELCBzdGF0ZSA/IDEgOiAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vIHdoaWxlIG9uZSBhdHRlbXB0IGFuZCB0aGF0IGlzIGl0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3YWl0KFRJTUVPVVRfUFJPUEFHQVRFX0FDQ0VTU0lCTElUWV9TRVRUSU5HKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpICE9IHN0YXRlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb3VsZCBub3Qgc2V0IGFjY2Vzc2liaWxpdHkgc3RhdGUgdG86ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHNvbWUgc2V0IHVwIGNvZGUgYmVmb3JlIGFueSB0ZXN0IG1ldGhvZC4KKyAgICAgKgorICAgICAqIE5PVEU6IEkgbWlzcyBKdW5pdDQncyBAQmVmb3JlQ2xhc3MKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYmVmb3JlQ2xhc3NJZk5lZWRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzRXhlY3V0ZWRUZXN0TWV0aG9kQ291bnQrKzsKKyAgICAgICAgaWYgKHNFeGVjdXRlZFRlc3RNZXRob2RDb3VudCA9PSAxKSB7CisgICAgICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5U3RhdGUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHNvbWUgY2xlYW4gdXAgY29kZSBhZnRlciBhbGwgdGVzdCBtZXRob2RzLgorICAgICAqCisgICAgICogTk9URTogSSBtaXNzIEp1bml0NCdzIEBBZnRlckNsYXNzCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWZ0ZXJDbGFzc0lmTmVlZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzRXhlY3V0ZWRUZXN0TWV0aG9kQ291bnQgPT0gc1Rlc3RNZXRob2RDb3VudCkgeworICAgICAgICAgICAgc0V4ZWN1dGVkVGVzdE1ldGhvZENvdW50ID0gMDsKKyAgICAgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlTdGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNDb25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIElFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElFdmVudExpc3RlbmVyLlN0dWIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbihJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIGNvbm5lY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgIGluZm8uZXZlbnRUeXBlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFU19BTExfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfU1BPS0VOOworICAgICAgICAgICAgICAgICAgICBpbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSAwOworICAgICAgICAgICAgICAgICAgICBpbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0U2VydmljZUluZm8oaW5mbyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbnRlcnJ1cHQoKSB7fQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHNMYXN0QWNjZXNzaWJpbGl0eUV2ZW50PSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKGV2ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKSk7CisgICAgICAgICAgICBzQ29ubmVjdGlvbiA9IG1hbmFnZXIucmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc0Nvbm5lY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHRlc3QgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRUZXN0TWV0aG9kQ291bnQoKSB7CisgICAgICAgIGludCB0ZXN0TWV0aG9kQ291bnQgPSAwOworICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBnZXRDbGFzcygpLmdldE1ldGhvZHMoKSkgeworICAgICAgICAgICAgZmluYWwgaW50IG1vZGlmaWVycyA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3QiKQorICAgICAgICAgICAgICAgICAgICAmJiAobW9kaWZpZXJzICYgTW9kaWZpZXIuUFVCTElDKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICYmIChtb2RpZmllcnMgJiBNb2RpZmllci5TVEFUSUMpID09IDApIHsKKyAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVzdE1ldGhvZENvdW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9BdFBhcnNlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9BdFBhcnNlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhYTUyYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQXRQYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5BdENvbW1hbmRIYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkF0Q29tbWFuZFJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5BdFBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQXRQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyogQW4gQXRDb21tYW5kSGFuZGxlciBpbnN0cnVtZW50ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEhhbmRsZXJUZXN0IGV4dGVuZHMgQXRDb21tYW5kSGFuZGxlciB7Ci0gICAgICAgIGJvb2xlYW4gbUJhc2ljQ2FsbGVkLCBtQWN0aW9uQ2FsbGVkLCBtUmVhZENhbGxlZCwgbVRlc3RDYWxsZWQsIAotICAgICAgICAgICAgICAgIG1TZXRDYWxsZWQ7Ci0gICAgICAgIGludCBtQmFzaWNSZXR1cm4sIG1BY3Rpb25SZXR1cm4sIG1SZWFkUmV0dXJuLCBtVGVzdFJldHVybiwgbVNldFJldHVybjsKLSAgICAgICAgT2JqZWN0W10gbVNldEFyZ3M7Ci0gICAgICAgIFN0cmluZyBtQmFzaWNBcmdzOwotCi0gICAgICAgIEhhbmRsZXJUZXN0KCkgewotICAgICAgICAgICAgdGhpcyhBdENvbW1hbmRSZXN1bHQuRVJST1IsIEF0Q29tbWFuZFJlc3VsdC5FUlJPUiwKLSAgICAgICAgICAgICAgICAgQXRDb21tYW5kUmVzdWx0LkVSUk9SLCBBdENvbW1hbmRSZXN1bHQuRVJST1IsCi0gICAgICAgICAgICAgICAgIEF0Q29tbWFuZFJlc3VsdC5FUlJPUik7Ci0gICAgICAgIH0KLQotICAgICAgICBIYW5kbGVyVGVzdChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUpIHsKLSAgICAgICAgICAgIG1CYXNpY1JldHVybiA9IGE7Ci0gICAgICAgICAgICBtQWN0aW9uUmV0dXJuID0gYjsKLSAgICAgICAgICAgIG1SZWFkUmV0dXJuID0gYzsKLSAgICAgICAgICAgIG1TZXRSZXR1cm4gPSBkOwotICAgICAgICAgICAgbVRlc3RSZXR1cm4gPSBlOwotICAgICAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIG1CYXNpY0NhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgbUFjdGlvbkNhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVJlYWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1TZXRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1UZXN0Q2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtU2V0QXJncyA9IG51bGw7Ci0gICAgICAgICAgICBtQmFzaWNBcmdzID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YXNDYWxsZWQoKSB7ICAgLy8gaGVscGVyCi0gICAgICAgICAgICByZXR1cm4gbUJhc2ljQ2FsbGVkIHx8IG1BY3Rpb25DYWxsZWQgfHwgbVJlYWRDYWxsZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYWxsZWQgfHwgbVNldENhbGxlZDsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF0Q29tbWFuZFJlc3VsdCBoYW5kbGVCYXNpY0NvbW1hbmQoU3RyaW5nIGFyZ3MpIHsKLSAgICAgICAgICAgIG1CYXNpY0NhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBtQmFzaWNBcmdzID0gYXJnczsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXRDb21tYW5kUmVzdWx0KG1CYXNpY1JldHVybik7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBdENvbW1hbmRSZXN1bHQgaGFuZGxlQWN0aW9uQ29tbWFuZCgpIHsKLSAgICAgICAgICAgIG1BY3Rpb25DYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdENvbW1hbmRSZXN1bHQobUFjdGlvblJldHVybik7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBdENvbW1hbmRSZXN1bHQgaGFuZGxlUmVhZENvbW1hbmQoKSB7Ci0gICAgICAgICAgICBtUmVhZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0Q29tbWFuZFJlc3VsdChtUmVhZFJldHVybik7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBdENvbW1hbmRSZXN1bHQgaGFuZGxlU2V0Q29tbWFuZChPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgICAgICBtU2V0Q2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIG1TZXRBcmdzID0gYXJnczsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXRDb21tYW5kUmVzdWx0KG1TZXRSZXR1cm4pOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXRDb21tYW5kUmVzdWx0IGhhbmRsZVRlc3RDb21tYW5kKCkgewotICAgICAgICAgICAgbVRlc3RDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdENvbW1hbmRSZXN1bHQobVRlc3RSZXR1cm4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBdFBhcnNlciBtUGFyc2VyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVBhcnNlciA9IG5ldyBBdFBhcnNlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0KLSAgICAvKiBUZXN0IHRoYXQgdGhlIHJpZ2h0IG1ldGhvZCBpcyBiZWluZyBjYWxsZWQKLSAgICAgKi8KLS8qICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSGFuZGxlclRlc3QgRCA9IG5ldyBIYW5kbGVyVGVzdCgwLCAxLCAxLCAxLCAxKTsKLSAgICAgICAgSGFuZGxlclRlc3QgQSA9IG5ldyBIYW5kbGVyVGVzdCgwLCAxLCAxLCAxLCAxKTsKLSAgICAgICAgbVBhcnNlci5yZWdpc3RlcignRCcsIEQpOwotICAgICAgICBtUGFyc2VyLnJlZ2lzdGVyKCdBJywgQSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIiAgQSBUIEQgPSA/IFQgMSAyIDMgIDQgICAiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKEQubUJhc2ljQ2FsbGVkKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoRC5tQWN0aW9uQ2FsbGVkKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoRC5tVGVzdENhbGxlZCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEQubVNldENhbGxlZCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEQubVJlYWRDYWxsZWQpOwotICAgICAgICBhc3NlcnRGYWxzZShBLndhc0NhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI9P1QxMjM0IiwgRC5tQmFzaWNBcmdzKTsKLSAgICB9Ci0qLwotICAgIC8qIFRlc3Qgc29tZSBjcmF6eSBzdHJpbmdzCi0gICAgICovLyoKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhbmRsZXJUZXN0IEEgPSBuZXcgSGFuZGxlclRlc3QoMCwgMSwgMSwgMSwgMSk7Ci0gICAgICAgIG1QYXJzZXIucmVnaXN0ZXIoJ0EnLCBBKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde30sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCIgICAgICIpLnRvU3RyaW5ncygpKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIiAgYSBUIGEgdCBcIlwiICAxIDIgMyBhIDQgICAiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVFwiXCIxMjNBNCIsIEEubUJhc2ljQXJncyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIiAgYSBUIGEgdCAgXCJmb28gQmFSMTJaXCIgMSAyIDMgYSA0ICAgIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRcImZvbyBCYVIxMlpcIjEyM0E0IiwgQS5tQmFzaWNBcmdzKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVRBXCIiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiXCIiLCBBLm1CYXNpY0FyZ3MpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVEFcImEiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiYVwiIiwgQS5tQmFzaWNBcmdzKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVRhXCIgIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIiBcIiIsIEEubUJhc2ljQXJncyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUQSAgXCJvbmUgXCIgdHdvIFwidCBociBlZSAiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiXCJvbmUgXCJUV09cInQgaHIgZWUgXCIiLCBBLm1CYXNpY0FyZ3MpOwotICAgIH0qLwotCi0gICAgLyogU2ltcGxlIGV4dGVuZGVkIGNvbW1hbmRzCi0gICAgICovLyoKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0MSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBIYW5kbGVyVGVzdCBBID0gbmV3IEhhbmRsZXJUZXN0KDEsIDAsIDAsIDAsIDApOwotICAgICAgICBtUGFyc2VyLnJlZ2lzdGVyKCIrQSIsIEEpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117IkVSUk9SIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtCIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQS53YXNDYWxsZWQoKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0EiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKEEubUFjdGlvbkNhbGxlZCk7Ci0gICAgICAgIEEubUFjdGlvbkNhbGxlZCA9IGZhbHNlOwotICAgICAgICBhc3NlcnRGYWxzZShBLndhc0NhbGxlZCgpKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtBPSIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQS5tU2V0Q2FsbGVkKTsKLSAgICAgICAgQS5tU2V0Q2FsbGVkID0gZmFsc2U7Ci0gICAgICAgIGFzc2VydEZhbHNlKEEud2FzQ2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQS5tU2V0QXJncy5sZW5ndGgpOwotICAgICAgICBBLnJlc2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0E9PyIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQS5tVGVzdENhbGxlZCk7Ci0gICAgICAgIEEubVRlc3RDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQS53YXNDYWxsZWQoKSk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQT8iKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKEEubVJlYWRDYWxsZWQpOwotICAgICAgICBBLm1SZWFkQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgIGFzc2VydEZhbHNlKEEud2FzQ2FsbGVkKCkpOwotICAgICAgICBBLnJlc2V0KCk7Ci0gICAgfQotKi8KLQotCi0gICAgLyogVGVzdCBjaGFpbmVkIGNvbW1hbmRzCi0gICAgICovLyoKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhaW4xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhbmRsZXJUZXN0IEEgPSBuZXcgSGFuZGxlclRlc3QoMCwgMSwgMSwgMSwgMSk7Ci0gICAgICAgIEhhbmRsZXJUZXN0IEIgPSBuZXcgSGFuZGxlclRlc3QoMSwgMCwgMCwgMCwgMCk7Ci0gICAgICAgIEhhbmRsZXJUZXN0IEMgPSBuZXcgSGFuZGxlclRlc3QoMSwgMSwgMSwgMSwgMSk7Ci0gICAgICAgIG1QYXJzZXIucmVnaXN0ZXIoJ0EnLCBBKTsKLSAgICAgICAgbVBhcnNlci5yZWdpc3RlcigiK0IiLCBCKTsKLSAgICAgICAgbVBhcnNlci5yZWdpc3RlcigiK0MiLCBDKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJFUlJPUiJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQjsrQyIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQi5tQWN0aW9uQ2FsbGVkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShDLm1BY3Rpb25DYWxsZWQpOwotICAgICAgICBCLnJlc2V0KCk7Ci0gICAgICAgIEMucmVzZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJFUlJPUiJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQzsrQiIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEIud2FzQ2FsbGVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKEMubUFjdGlvbkNhbGxlZCk7Ci0gICAgICAgIEIucmVzZXQoKTsKLSAgICAgICAgQy5yZXNldCgpOwotICAgIH0qLwotCi0gICAgLyogVGVzdCBTZXQgY29tbWFuZAotICAgICAqLy8qCi0gICAgcHVibGljIHZvaWQgdGVzdFNldDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSGFuZGxlclRlc3QgQSA9IG5ldyBIYW5kbGVyVGVzdCgxLCAxLCAxLCAwLCAxKTsKLSAgICAgICAgbVBhcnNlci5yZWdpc3RlcigiK0FBQUEiLCBBKTsKLSAgICAgICAgT2JqZWN0W10gZXhwZWN0ZWRSZXN1bHQ7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0FBQUE9MSIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGV4cGVjdGVkUmVzdWx0ID0gbmV3IE9iamVjdFtdeyhJbnRlZ2VyKTF9OwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQsIEEubVNldEFyZ3MpKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtBQUFBPTEsMiwzIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHQgPSBuZXcgT2JqZWN0W117KEludGVnZXIpMSwgKEludGVnZXIpMiwgKEludGVnZXIpM307Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZFJlc3VsdCwgQS5tU2V0QXJncykpOwotICAgICAgICBBLnJlc2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0FBQUE9MywwLDAsMSIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGV4cGVjdGVkUmVzdWx0ID0gbmV3IE9iamVjdFtdeyhJbnRlZ2VyKTMsIChJbnRlZ2VyKTAsIChJbnRlZ2VyKTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyKTF9OwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQsIEEubVNldEFyZ3MpKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtBQUFBPVwiZm9vXCIsMSxcImIsYXIiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBleHBlY3RlZFJlc3VsdCA9IG5ldyBPYmplY3RbXXsiXCJmb29cIiIsIDEsICJcImIsYXJcIiJ9OwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQsIEEubVNldEFyZ3MpKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtBQUFBPSIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGV4cGVjdGVkUmVzdWx0ID0gbmV3IE9iamVjdFtdeyIifTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkUmVzdWx0LCBBLm1TZXRBcmdzKSk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQUFBQT0sIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHQgPSBuZXcgT2JqZWN0W117IiIsICIifTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkUmVzdWx0LCBBLm1TZXRBcmdzKSk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQUFBQT0sLCwiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBleHBlY3RlZFJlc3VsdCA9IG5ldyBPYmplY3RbXXsiIiwgIiIsICIiLCAiIn07Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZFJlc3VsdCwgQS5tU2V0QXJncykpOwotICAgICAgICBBLnJlc2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0FBQUE9LDEsLFwiZm9vXCIsIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHQgPSBuZXcgT2JqZWN0W117IiIsIDEsICIiLCAiXCJmb29cIiIsICIifTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIEEubVNldEFyZ3MubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkUmVzdWx0LCBBLm1TZXRBcmdzKSk7Ci0gICAgICAgIEEucmVzZXQoKTsKLSAgICB9Ki8KLQotICAgIC8qIFRlc3QgcmVwZWF0IGNvbW1hbmQgIkEvIgotICAgICAqLy8qCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcGVhdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBIYW5kbGVyVGVzdCBBID0gbmV3IEhhbmRsZXJUZXN0KDAsIDAsIDAsIDAsIDApOwotICAgICAgICBtUGFyc2VyLnJlZ2lzdGVyKCdBJywgQSk7Ci0KLSAgICAgICAgLy8gVHJ5IHJlcGVhdGVkIGNvbW1hbmQgb24gZnJlc2ggcGFyc2VyCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117fSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkEvIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQS53YXNDYWxsZWQoKSk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVRBIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBLm1CYXNpY0NhbGxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgQS5tQmFzaWNBcmdzKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgICAgIC8vIE5vdyByZXBlYXQgdGhlIGNvbW1hbmQKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkEvIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBLm1CYXNpY0NhbGxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgQS5tQmFzaWNBcmdzKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgICAgIC8vIE11bHRpcGxlIHJlcGVhdHMKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkEvIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBLm1CYXNpY0NhbGxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgQS5tQmFzaWNBcmdzKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgfSovCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxMzc5MS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwotCi0vKioKLSAqIFN0cmVzcyB0ZXN0IHN1aXRlIGZvciBCbHVldG9vdGggcmVsYXRlZCBmdW5jdGlvbnMuCi0gKgotICogSW5jbHVkZXMgdGVzdHMgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyBibHVldG9vdGgsIGVuYWJsaW5nL2Rpc2FibGluZyBkaXNjb3ZlcmFibGUgbW9kZSwKLSAqIHN0YXJ0aW5nL3N0b3BwaW5nIHNjYW5zLCBjb25uZWN0aW5nL2Rpc2Nvbm5lY3RpbmcgdG8gSEZQLCBBMkRQLCBISUQsIFBBTiBwcm9maWxlcywgYW5kIHZlcmlmeWluZwotICogdGhhdCByZW1vdGUgY29ubmVjdGlvbnMvZGlzY29ubmVjdGlvbnMgb2NjdXIgZm9yIHRoZSBQQU4gcHJvZmlsZS4KLSAqIDxwPgotICogVGhpcyB0ZXN0IHN1aXRlIHVzZXMge0BsaW5rIGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFRlc3RSdW5uZXJ9IHRvIGZvciBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlCi0gKiBudW1iZXIgb2YgaXRlcmF0aW9ucyBhbmQgdGhlIGFkZHJlc3NlcyBvZiByZW1vdGUgQmx1ZXRvb3RoIGRldmljZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBCbHVldG9vdGhTdHJlc3NUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoU3RyZXNzVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GSUxFID0gIkJsdWV0b290aFN0cmVzc1Rlc3RPdXRwdXQudHh0IjsKLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoVGVzdFV0aWxzIG1UZXN0VXRpbHM7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKLSAgICAgICAgbVRlc3RVdGlscyA9IG5ldyBCbHVldG9vdGhUZXN0VXRpbHMoY29udGV4dCwgVEFHLCBPVVRQVVRfRklMRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLQotICAgICAgICBtVGVzdFV0aWxzLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgQmx1ZXRvb3RoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGUoKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRW5hYmxlSXRlcmF0aW9uczsKLSAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImVuYWJsZSBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIHB1dHRpbmcgdGhlIGRldmljZSBpbiBhbmQgdGFraW5nIHRoZSBkZXZpY2Ugb3V0IG9mIGRpc2NvdmVyYWJsZSBtb2RlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNjb3ZlcmFibGUoKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGlzY292ZXJhYmxlSXRlcmF0aW9uczsKLSAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnVuZGlzY292ZXJhYmxlKGFkYXB0ZXIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJkaXNjb3ZlcmFibGUgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2NvdmVyYWJsZShhZGFwdGVyKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMudW5kaXNjb3ZlcmFibGUoYWRhcHRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBCbHVldG9vdGggc2NhbnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNjYW4oKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zU2Nhbkl0ZXJhdGlvbnM7Ci0gICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5zdG9wU2NhbihhZGFwdGVyKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgic2NhbiBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuc3RhcnRTY2FuKGFkYXB0ZXIpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5zdG9wU2NhbihhZGFwdGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJlc3MgdGVzdCBmb3IgZW5hYmxpbmcgYW5kIGRpc2FibGluZyB0aGUgUEFOIE5BUCBwcm9maWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVQYW4oKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRW5hYmxlUGFuSXRlcmF0aW9uczsKLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGVQYW4oYWRhcHRlcik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoInRlc3RFbmFibGVQYW4gaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiCi0gICAgICAgICAgICAgICAgICAgICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZVBhbihhZGFwdGVyKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZVBhbihhZGFwdGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJlc3MgdGVzdCBmb3IgcGFpcmluZyBhbmQgdW5wYWlyaW5nIHdpdGggYSByZW1vdGUgZGV2aWNlLgotICAgICAqIDxwPgotICAgICAqIEluIHRoaXMgdGVzdCwgdGhlIGxvY2FsIGRldmljZSBpbml0aWF0ZXMgcGFpcmluZyB3aXRoIGEgcmVtb3RlIGRldmljZSwgYW5kIHRoZW4gdW5wYWlycyB3aXRoCi0gICAgICogdGhlIGRldmljZSBhZnRlciB0aGUgcGFpcmluZyBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFpcigpIHsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNQYWlySXRlcmF0aW9uczsKLSAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoInBhaXIgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJlc3MgdGVzdCBmb3IgYWNjZXB0aW5nIGEgcGFpcmluZyByZXF1ZXN0IGFuZCB1bnBhaXJpbmcgd2l0aCBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHdhaXRzIGZvciBhIHBhaXJpbmcgcmVxdWVzdCBmcm9tIGEgcmVtb3RlIGRldmljZS4gIEl0IGFjY2VwdHMKLSAgICAgKiB0aGUgcmVxdWVzdCBhbmQgdGhlbiB1bnBhaXJzIGFmdGVyIHRoZSBwYXJpbmcgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdFBhaXIoKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zUGFpckl0ZXJhdGlvbnM7Ci0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJhY2NlcHRQYWlyIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5hY2NlcHRQYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOwotICAgICAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIGNvbm5lY3RpbmcgYW5kIGRpc2Nvbm5lY3Rpbmcgd2l0aCBhbiBBMkRQIHNvdXJjZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2UgcGxheXMgdGhlIHJvbGUgb2YgYW4gQTJEUCBzaW5rLCBhbmQgaW5pdGlhdGVzIGNvbm5lY3Rpb25zIGFuZAotICAgICAqIGRpc2Nvbm5lY3Rpb25zIHdpdGggYW4gQTJEUCBzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RBMmRwKCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RBMmRwSXRlcmF0aW9uczsKLSAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAotICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQLCBudWxsKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdEEyZHAgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmNvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJjb25uZWN0QTJkcChkZXZpY2U9JXMpIiwgZGV2aWNlKSk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0QTJkcChkZXZpY2U9JXMpIiwgZGV2aWNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIGNvbm5lY3RpbmcgYW5kIGRpc2Nvbm5lY3RpbmcgdGhlIEhGUCB3aXRoIGEgaGFuZHMgZnJlZSBkZXZpY2UuCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHBsYXlzIHRoZSByb2xlIG9mIGFuIEhGUCBhdWRpbyBnYXRld2F5LCBhbmQgaW5pdGlhdGVzCi0gICAgICogY29ubmVjdGlvbnMgYW5kIGRpc2Nvbm5lY3Rpb25zIHdpdGggYSBoYW5kcyBmcmVlIGRldmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdEhlYWRzZXQoKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zOwotICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsIG51bGwpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJjb25uZWN0SGVhZHNldCBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoImNvbm5lY3RIZWFkc2V0KGRldmljZT0lcykiLCBkZXZpY2UpKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RIZWFkc2V0KGRldmljZT0lcykiLCBkZXZpY2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJlc3MgdGVzdCBmb3IgY29ubmVjdGluZyBhbmQgZGlzY29ubmVjdGluZyB3aXRoIGEgSElEIGRldmljZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2UgcGxheXMgdGhlIHJvbGUgb2YgYSBISUQgaG9zdCwgYW5kIGluaXRpYXRlcyBjb25uZWN0aW9ucyBhbmQKLSAgICAgKiBkaXNjb25uZWN0aW9ucyB3aXRoIGEgSElEIGRldmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdElucHV0KCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RJbnB1dEl0ZXJhdGlvbnM7Ci0gICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFLCBudWxsKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdElucHV0IGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJjb25uZWN0SW5wdXQoZGV2aWNlPSVzKSIsIGRldmljZSkpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0SW5wdXQoZGV2aWNlPSVzKSIsIGRldmljZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmVzcyB0ZXN0IGZvciBjb25uZWN0aW5nIGFuZCBkaXNjb25uZWN0aW5nIHdpdGggYSBQQU4gTkFQLgotICAgICAqIDxwPgotICAgICAqIEluIHRoaXMgdGVzdCwgdGhlIGxvY2FsIGRldmljZSBwbGF5cyB0aGUgcm9sZSBvZiBhIFBBTlUsIGFuZCBpbml0aWF0ZXMgY29ubmVjdGlvbnMgYW5kCi0gICAgICogZGlzY29ubmVjdGlvbnMgd2l0aCBhIE5BUC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdFBhbigpIHsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0UGFuSXRlcmF0aW9uczsKLSAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAotICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJjb25uZWN0UGFuIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0UGFuKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQYW4oYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJlc3MgdGVzdCBmb3IgdmVyaWZ5aW5nIGEgUEFOVSBjb25uZWN0aW5nIGFuZCBkaXNjb25uZWN0aW5nIHdpdGggdGhlIGRldmljZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2UgcGxheXMgdGhlIHJvbGUgb2YgYSBOQVAgd2hpY2ggYSByZW1vdGUgUEFOVSBjb25uZWN0cyBhbmQKLSAgICAgKiBkaXNjb25uZWN0cyBmcm9tLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNvbWluZ1BhbkNvbm5lY3Rpb24oKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQ29ubmVjdFBhbkl0ZXJhdGlvbnM7Ci0gICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGVQYW4oYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlUGFuKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLmFjY2VwdFBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiaW5jb21pbmdQYW5Db25uZWN0aW9uIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIgotICAgICAgICAgICAgICAgICAgICArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5pbmNvbWluZ1BhbkNvbm5lY3Rpb24oYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuaW5jb21pbmdQYW5EaXNjb25uZWN0aW9uKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGVQYW4oYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJlc3MgdGVzdCBmb3IgdmVyaWZ5aW5nIHRoYXQgQXVkaW9NYW5hZ2VyIGNhbiBvcGVuIGFuZCBjbG9zZSBTQ08gY29ubmVjdGlvbnMuCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyB0ZXN0LCBhIEhTUCBjb25uZWN0aW9uIGlzIG9wZW5lZCB3aXRoIGFuIGV4dGVybmFsIGhlYWRzZXQgYW5kIHRoZSBTQ08gY29ubmVjdGlvbiBpcwotICAgICAqIHJlcGVhdGlibHkgb3BlbmVkIGFuZCBjbG9zZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0U3RvcFNjbygpIHsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNTdGFydFN0b3BTY29JdGVyYXRpb25zOwotICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsIG51bGwpOwotICAgICAgICBtVGVzdFV0aWxzLmNvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULCBudWxsKTsKLSAgICAgICAgbVRlc3RVdGlscy5zdG9wU2NvKGFkYXB0ZXIsIGRldmljZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoInN0YXJ0U3RvcFNjbyBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuc3RhcnRTY28oYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuc3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCwgbnVsbCk7Ci0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZGQ4ZmUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFBhbjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCbHVldG9vdGhUZXN0VXRpbHMgZXh0ZW5kcyBBc3NlcnQgewotCi0gICAgLyoqIFRpbWVvdXQgZm9yIGVuYWJsZS9kaXNhYmxlIGluIG1zLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfRElTQUJMRV9USU1FT1VUID0gMjAwMDA7Ci0gICAgLyoqIFRpbWVvdXQgZm9yIGRpc2NvdmVyYWJsZS91bmRpc2NvdmVyYWJsZSBpbiBtcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09WRVJBQkxFX1VORElTQ09WRVJBQkxFX1RJTUVPVVQgPSA1MDAwOwotICAgIC8qKiBUaW1lb3V0IGZvciBzdGFydGluZy9zdG9wcGluZyBhIHNjYW4gaW4gbXMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1NUT1BfU0NBTl9USU1FT1VUID0gNTAwMDsKLSAgICAvKiogVGltZW91dCBmb3IgcGFpci91bnBhaXIgaW4gbXMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfVU5QQUlSX1RJTUVPVVQgPSAyMDAwMDsKLSAgICAvKiogVGltZW91dCBmb3IgY29ubmVjdGluZy9kaXNjb25uZWN0aW5nIGEgcHJvZmlsZSBpbiBtcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9ESVNDT05ORUNUX1BST0ZJTEVfVElNRU9VVCA9IDIwMDAwOwotICAgIC8qKiBUaW1lb3V0IHRvIHN0YXJ0IG9yIHN0b3AgYSBTQ08gY2hhbm5lbCBpbiBtcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfU1RPUF9TQ09fVElNRU9VVCA9IDEwMDAwOwotICAgIC8qKiBUaW1lb3V0IHRvIGNvbm5lY3QgYSBwcm9maWxlIHByb3h5IGluIG1zLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1BST1hZX1RJTUVPVVQgPSA1MDAwOwotICAgIC8qKiBUaW1lIGJldHdlZW4gcG9sbHMgaW4gbXMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPTExfVElNRSA9IDEwMDsKLQotICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgRmxhZ1JlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICBwcml2YXRlIGludCBtRXhwZWN0ZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1GaXJlZEZsYWdzID0gMDsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1Db21wbGV0ZWRUaW1lID0gLTE7Ci0KLSAgICAgICAgcHVibGljIEZsYWdSZWNlaXZlcihpbnQgZXhwZWN0ZWRGbGFncykgewotICAgICAgICAgICAgbUV4cGVjdGVkRmxhZ3MgPSBleHBlY3RlZEZsYWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRGaXJlZEZsYWdzKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1GaXJlZEZsYWdzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0Q29tcGxldGVkVGltZSgpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ29tcGxldGVkVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldEZpcmVkRmxhZyhpbnQgZmxhZykgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gZmxhZzsKLSAgICAgICAgICAgICAgICBpZiAoKG1GaXJlZEZsYWdzICYgbUV4cGVjdGVkRmxhZ3MpID09IG1FeHBlY3RlZEZsYWdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBCbHVldG9vdGhSZWNlaXZlciBleHRlbmRzIEZsYWdSZWNlaXZlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT1ZFUllfU1RBUlRFRF9GTEFHID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPVkVSWV9GSU5JU0hFRF9GTEFHID0gMSA8PCAxOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9NT0RFX05PTkVfRkxBRyA9IDEgPDwgMjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fTU9ERV9DT05ORUNUQUJMRV9GTEFHID0gMSA8PCAzOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRV9GTEFHID0gMSA8PCA0OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfT0ZGX0ZMQUcgPSAxIDw8IDU7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9UVVJOSU5HX09OX0ZMQUcgPSAxIDw8IDY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9PTl9GTEFHID0gMSA8PCA3OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVFVSTklOR19PRkZfRkxBRyA9IDEgPDwgODsKLQotICAgICAgICBwdWJsaWMgQmx1ZXRvb3RoUmVjZWl2ZXIoaW50IGV4cGVjdGVkRmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyKGV4cGVjdGVkRmxhZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9ESVNDT1ZFUllfU1RBUlRFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhESVNDT1ZFUllfU1RBUlRFRF9GTEFHKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fRElTQ09WRVJZX0ZJTklTSEVELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKERJU0NPVkVSWV9GSU5JU0hFRF9GTEFHKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU0NBTl9NT0RFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX1NDQU5fTU9ERSwgLTEpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIG1vZGUpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX05PTkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU0NBTl9NT0RFX05PTkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTQ0FOX01PREVfQ09OTkVDVEFCTEVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRV9GTEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX1NUQVRFLCAtMSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZSgtMSwgc3RhdGUpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9PRkZfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT046Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfVFVSTklOR19PTl9GTEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT046Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfT05fRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT0ZGOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX1RVUk5JTkdfT0ZGX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQYWlyUmVjZWl2ZXIgZXh0ZW5kcyBGbGFnUmVjZWl2ZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQk9OREVEX0ZMQUcgPSAxOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQk9ORElOR19GTEFHID0gMSA8PCAxOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfTk9ORV9GTEFHID0gMSA8PCAyOwotCi0gICAgICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2U7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QYXNza2V5OwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBtUGluOwotCi0gICAgICAgIHB1YmxpYyBQYWlyUmVjZWl2ZXIoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHBhc3NrZXksIGJ5dGVbXSBwaW4sIGludCBleHBlY3RlZEZsYWdzKSB7Ci0gICAgICAgICAgICBzdXBlcihleHBlY3RlZEZsYWdzKTsKLQotICAgICAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIG1QYXNza2V5ID0gcGFzc2tleTsKLSAgICAgICAgICAgIG1QaW4gPSBwaW47Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEJsdWV0b290aERldmljZS5BQ1RJT05fUEFJUklOR19SRVFVRVNULmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZhcmllbnQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX1BBSVJJTkdfVkFSSUFOVCwgLTEpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIHZhcmllbnQpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAodmFyaWVudCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5QQUlSSU5HX1ZBUklBTlRfUElOOgotICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5zZXRQaW4obVBpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX1BBU1NLRVk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLnNldFBhc3NrZXkobVBhc3NrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9QQVNTS0VZX0NPTkZJUk1BVElPTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX0NPTlNFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLnNldFBhaXJpbmdDb25maXJtYXRpb24odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX09PQl9DT05TRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5zZXRSZW1vdGVPdXRPZkJhbmREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aERldmljZS5BQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9CT05EX1NUQVRFLCAtMSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZSgtMSwgc3RhdGUpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX05PTkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ESU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0JPTkRJTkdfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfQk9OREVEX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBDb25uZWN0UHJvZmlsZVJlY2VpdmVyIGV4dGVuZHMgRmxhZ1JlY2VpdmVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRF9GTEFHID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkdfRkxBRyA9IDEgPDwgMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRF9GTEFHID0gMSA8PCAyOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElOR19GTEFHID0gMSA8PCAzOwotCi0gICAgICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2U7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Qcm9maWxlOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29ubmVjdGlvbkFjdGlvbjsKLQotICAgICAgICBwdWJsaWMgQ29ubmVjdFByb2ZpbGVSZWNlaXZlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwgaW50IGV4cGVjdGVkRmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyKGV4cGVjdGVkRmxhZ3MpOwotCi0gICAgICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgbVByb2ZpbGUgPSBwcm9maWxlOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1Qcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkEyRFA6Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVDoKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25BY3Rpb24gPSBCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25BY3Rpb24gPSBCbHVldG9vdGhQYW4uQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25BY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbkFjdGlvbiAhPSBudWxsICYmIG1Db25uZWN0aW9uQWN0aW9uLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIC0xKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKC0xLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0RJU0NPTk5FQ1RFRF9GTEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9DT05ORUNUSU5HX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfQ09OTkVDVEVEX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0RJU0NPTk5FQ1RJTkdfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIENvbm5lY3RQYW5SZWNlaXZlciBleHRlbmRzIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIgewotICAgICAgICBwcml2YXRlIGludCBtUm9sZTsKLQotICAgICAgICBwdWJsaWMgQ29ubmVjdFBhblJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCByb2xlLCBpbnQgZXhwZWN0ZWRGbGFncykgewotICAgICAgICAgICAgc3VwZXIoZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLlBBTiwgZXhwZWN0ZWRGbGFncyk7Ci0KLSAgICAgICAgICAgIG1Sb2xlID0gcm9sZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAobVJvbGUgIT0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFBhbi5FWFRSQV9MT0NBTF9ST0xFLCAtMSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN1cGVyLm9uUmVjZWl2ZShjb250ZXh0LCBpbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTdGFydFN0b3BTY29SZWNlaXZlciBleHRlbmRzIEZsYWdSZWNlaXZlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURURfRkxBRyA9IDE7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURURfRkxBRyA9IDEgPDwgMTsKLQotICAgICAgICBwdWJsaWMgU3RhcnRTdG9wU2NvUmVjZWl2ZXIoaW50IGV4cGVjdGVkRmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyKGV4cGVjdGVkRmxhZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChBdWRpb01hbmFnZXIuQUNUSU9OX1NDT19BVURJT19TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEF1ZGlvTWFuYWdlci5FWFRSQV9TQ09fQVVESU9fU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuU0NPX0FVRElPX1NUQVRFX0VSUk9SKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKEF1ZGlvTWFuYWdlci5TQ09fQVVESU9fU1RBVEVfRVJST1IsIHN0YXRlKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2goc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBdWRpb01hbmFnZXIuU0NPX0FVRElPX1NUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9DT05ORUNURURfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBdWRpb01hbmFnZXIuU0NPX0FVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9ESVNDT05ORUNURURfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyIG1TZXJ2aWNlTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkEyRFA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQTJkcCA9IChCbHVldG9vdGhBMmRwKSBwcm94eTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkc2V0ID0gKEJsdWV0b290aEhlYWRzZXQpIHByb3h5OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQgPSAoQmx1ZXRvb3RoSW5wdXREZXZpY2UpIHByb3h5OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5QQU46Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGFuID0gKEJsdWV0b290aFBhbikgcHJveHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKGludCBwcm9maWxlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkEyRFA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQTJkcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QYW4gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgTGlzdDxCcm9hZGNhc3RSZWNlaXZlcj4gbVJlY2VpdmVycyA9IG5ldyBBcnJheUxpc3Q8QnJvYWRjYXN0UmVjZWl2ZXI+KCk7Ci0KLSAgICBwcml2YXRlIEJ1ZmZlcmVkV3JpdGVyIG1PdXRwdXRXcml0ZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKLSAgICBwcml2YXRlIFN0cmluZyBtT3V0cHV0RmlsZTsKLQotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIEJsdWV0b290aEEyZHAgbUEyZHAgPSBudWxsOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtSGVhZHNldCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhJbnB1dERldmljZSBtSW5wdXQgPSBudWxsOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoUGFuIG1QYW4gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHV0aWxpdHkgaW5zdGFuY2UgZm9yIHRlc3RpbmcgQmx1ZXRvb3RoLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSB1dGlsaXR5LgotICAgICAqIEBwYXJhbSB0YWcgVGhlIGxvZyB0YWcgb2YgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSB1dGlsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyBCbHVldG9vdGhUZXN0VXRpbHMoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdGFnKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgdGFnLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdXRpbGl0eSBpbnN0YW5jZSBmb3IgdGVzdGluZyBCbHVldG9vdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24gdXNpbmcgdGhlIHV0aWxpdHkuCi0gICAgICogQHBhcmFtIHRhZyBUaGUgbG9nIHRhZyBvZiB0aGUgYXBwbGljYXRpb24gdXNpbmcgdGhlIHV0aWxpdHkuCi0gICAgICogQHBhcmFtIG91dHB1dEZpbGUgVGhlIHBhdGggdG8gYW4gb3V0cHV0IGZpbGUgaWYgdGhlIHV0aWxpdHkgaXMgdG8gd3JpdGUgcmVzdWx0cyB0byBhCi0gICAgICogICAgICAgIHNlcGFyYXRlIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIEJsdWV0b290aFRlc3RVdGlscyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyB0YWcsIFN0cmluZyBvdXRwdXRGaWxlKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVRhZyA9IHRhZzsKLSAgICAgICAgbU91dHB1dEZpbGUgPSBvdXRwdXRGaWxlOwotCi0gICAgICAgIGlmIChtT3V0cHV0RmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtT3V0cHV0V3JpdGVyID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbU91dHB1dFdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihuZXcgRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLCBtT3V0cHV0RmlsZSksIHRydWUpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhtVGFnLCAiVGVzdCBvdXRwdXQgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgbU91dHB1dFdyaXRlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIHV0aWxpdHkgaW5zdGFuY2UgYW5kIHVucmVnaXN0ZXJzIGFueSBCcm9hZGNhc3RSZWNlaXZlcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIHdoaWxlICghbVJlY2VpdmVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXJzLnJlbW92ZSgwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU91dHB1dFdyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1PdXRwdXRXcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhtVGFnLCAiVGVzdCBvdXRwdXQgZmlsZSBjb3VsZCBub3QgYmUgY2xvc2VkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIEJsdWV0b290aCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IEJsdWV0b290aCB3YXMgdHVybmVkIG9uIGFuZCB0aGF0IHRoZSBjb3JyZWN0Ci0gICAgICogYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuYWJsZShCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaW50IG1hc2sgPSAoQmx1ZXRvb3RoUmVjZWl2ZXIuU1RBVEVfVFVSTklOR19PTl9GTEFHIHwgQmx1ZXRvb3RoUmVjZWl2ZXIuU1RBVEVfT05fRkxBRwotICAgICAgICAgICAgICAgIHwgQmx1ZXRvb3RoUmVjZWl2ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0ZMQUcpOwotICAgICAgICBsb25nIHN0YXJ0ID0gLTE7Ci0gICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7Ci0KLSAgICAgICAgaW50IHN0YXRlID0gYWRhcHRlci5nZXRTdGF0ZSgpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT046Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT046Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT0ZGOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmVuYWJsZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09GRjoKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5lbmFibGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImVuYWJsZSgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgc3RhdGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgRU5BQkxFX0RJU0FCTEVfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBhZGFwdGVyLmdldFN0YXRlKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTgotICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJlbmFibGUoKSBjb21wbGV0ZWQgaW4gJWQgbXMiLCAoZmluaXNoIC0gc3RhcnQpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoImVuYWJsZSgpIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZW5hYmxlKCkgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAotICAgICAgICAgICAgICAgIHN0YXRlLCBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OLCBmaXJlZEZsYWdzLCBtYXNrKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZXMgQmx1ZXRvb3RoIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgQmx1ZXRvb3RoIHdhcyB0dXJuZWQgb2ZmIGFuZCB0aGF0IHRoZSBjb3JyZWN0Ci0gICAgICogYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGludCBtYXNrID0gKEJsdWV0b290aFJlY2VpdmVyLlNUQVRFX1RVUk5JTkdfT0ZGX0ZMQUcgfCBCbHVldG9vdGhSZWNlaXZlci5TVEFURV9PRkZfRkxBRwotICAgICAgICAgICAgICAgIHwgQmx1ZXRvb3RoUmVjZWl2ZXIuU0NBTl9NT0RFX05PTkVfRkxBRyk7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSAtMTsKLSAgICAgICAgQmx1ZXRvb3RoUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRCbHVldG9vdGhSZWNlaXZlcihtYXNrKTsKLQotICAgICAgICBpbnQgc3RhdGUgPSBhZGFwdGVyLmdldFN0YXRlKCk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkY6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09OOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT046Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5kaXNhYmxlKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT0ZGOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIG1hc2sgPSAwOyAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJkaXNhYmxlKCkgaW52YWxpZCBzdGF0ZTogc3RhdGU9JWQiLCBzdGF0ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBFTkFCTEVfRElTQUJMRV9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IGFkYXB0ZXIuZ2V0U3RhdGUoKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRgotICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzYWJsZSgpIGNvbXBsZXRlZCBpbiAlZCBtcyIsIChmaW5pc2ggLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dCgiZGlzYWJsZSgpIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZGlzYWJsZSgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBzdGF0ZSwgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkYsIGZpcmVkRmxhZ3MsIG1hc2spKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXRzIHRoZSBsb2NhbCBkZXZpY2UgaW50byBkaXNjb3ZlcmFibGUgbW9kZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2NhbCBkZXZpY2UKLSAgICAgKiBpcyBpbiBkaXNjb3ZlcmFibGUgbW9kZSBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzY292ZXJhYmxlKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBpbnQgbWFzayA9IEJsdWV0b290aFJlY2VpdmVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEVfRkxBRzsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoImRpc2NvdmVyYWJsZSgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNjYW5Nb2RlID0gYWRhcHRlci5nZXRTY2FuTW9kZSgpOwotICAgICAgICBpZiAoc2Nhbk1vZGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IGdldEJsdWV0b290aFJlY2VpdmVyKG1hc2spOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRSwgc2Nhbk1vZGUpOwotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5zZXRTY2FuTW9kZShCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEUpKTsKLQotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCA8IERJU0NPVkVSQUJMRV9VTkRJU0NPVkVSQUJMRV9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzY2FuTW9kZSA9IGFkYXB0ZXIuZ2V0U2Nhbk1vZGUoKTsKLSAgICAgICAgICAgIGlmIChzY2FuTW9kZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEUKLSAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJkaXNjb3ZlcmFibGUoKSBjb21wbGV0ZWQgaW4gJWQgbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKSAtIHN0YXJ0KSkpOwotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJkaXNjb3ZlcmFibGUoKSB0aW1lb3V0OiBzY2FuTW9kZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4ICIKLSAgICAgICAgICAgICAgICArICIoZXhwZWN0ZWQgMHgleCkiLCBzY2FuTW9kZSwgQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFLAotICAgICAgICAgICAgICAgIGZpcmVkRmxhZ3MsIG1hc2spKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXRzIHRoZSBsb2NhbCBkZXZpY2UgaW50byBjb25uZWN0YWJsZSBvbmx5IG1vZGUgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9jYWwKLSAgICAgKiBkZXZpY2UgaXMgaW4gaW4gY29ubmVjdGFibGUgbW9kZSBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdW5kaXNjb3ZlcmFibGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGludCBtYXNrID0gQmx1ZXRvb3RoUmVjZWl2ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0ZMQUc7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJ1bmRpc2NvdmVyYWJsZSgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNjYW5Nb2RlID0gYWRhcHRlci5nZXRTY2FuTW9kZSgpOwotICAgICAgICBpZiAoc2Nhbk1vZGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRSwgc2Nhbk1vZGUpOwotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5zZXRTY2FuTW9kZShCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRSkpOwotCi0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgRElTQ09WRVJBQkxFX1VORElTQ09WRVJBQkxFX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHNjYW5Nb2RlID0gYWRhcHRlci5nZXRTY2FuTW9kZSgpOwotICAgICAgICAgICAgaWYgKHNjYW5Nb2RlID09IEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFCi0gICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgidW5kaXNjb3ZlcmFibGUoKSBjb21wbGV0ZWQgaW4gJWQgbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKSAtIHN0YXJ0KSkpOwotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJ1bmRpc2NvdmVyYWJsZSgpIHRpbWVvdXQ6IHNjYW5Nb2RlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggIgotICAgICAgICAgICAgICAgICsgIihleHBlY3RlZCAweCV4KSIsIHNjYW5Nb2RlLCBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRSwgZmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBtYXNrKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIGEgc2NhbiBmb3IgcmVtb3RlIGRldmljZXMgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9jYWwgZGV2aWNlIGlzIHNjYW5uaW5nCi0gICAgICogYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2NhbihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaW50IG1hc2sgPSBCbHVldG9vdGhSZWNlaXZlci5ESVNDT1ZFUllfU1RBUlRFRF9GTEFHOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgic3RhcnRTY2FuKCkgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7Ci0KLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuc3RhcnREaXNjb3ZlcnkoKSk7Ci0KLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQgPCBTVEFSVF9TVE9QX1NDQU5fVElNRU9VVCkgewotICAgICAgICAgICAgaWYgKGFkYXB0ZXIuaXNEaXNjb3ZlcmluZygpICYmICgocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykpIHsKLSAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJzdGFydFNjYW4oKSBjb21wbGV0ZWQgaW4gJWQgbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKSAtIHN0YXJ0KSkpOwotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJzdGFydFNjYW4oKSB0aW1lb3V0OiBpc0Rpc2NvdmVyaW5nPSViLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsCi0gICAgICAgICAgICAgICAgYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCksIGZpcmVkRmxhZ3MsIG1hc2spKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wcyBhIHNjYW4gZm9yIHJlbW90ZSBkZXZpY2VzIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvY2FsIGRldmljZSBpcyBub3Qgc2Nhbm5pbmcKLSAgICAgKiBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcFNjYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGludCBtYXNrID0gQmx1ZXRvb3RoUmVjZWl2ZXIuRElTQ09WRVJZX0ZJTklTSEVEX0ZMQUc7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJzdG9wU2NhbigpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRGlzY292ZXJpbmcoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRCbHVldG9vdGhSZWNlaXZlcihtYXNrKTsKLQotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIC8vIFRPRE86IHB1dCBhc3NlcnRUcnVlKCkgYXJvdW5kIGNhbmNlbERpc2NvdmVyeSgpIG9uY2UgaXQgc3RhcnRzIHJldHVybmluZyB0cnVlLgotICAgICAgICBhZGFwdGVyLmNhbmNlbERpc2NvdmVyeSgpOwotCi0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgU1RBUlRfU1RPUF9TQ0FOX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIGlmICghYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCkgJiYgKChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSkgewotICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoInN0b3BTY2FuKCkgY29tcGxldGVkIGluICVkIG1zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCkgLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgic3RvcFNjYW4oKSB0aW1lb3V0OiBpc0Rpc2NvdmVyaW5nPSViLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsCi0gICAgICAgICAgICAgICAgYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCksIGZpcmVkRmxhZ3MsIG1hc2spKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZXMgUEFOIHRldGhlcmluZyBvbiB0aGUgbG9jYWwgZGV2aWNlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGV0aGVyaW5nIGlzIGVuYWJsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVQYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChtUGFuID09IG51bGwpIG1QYW4gPSAoQmx1ZXRvb3RoUGFuKSBjb25uZWN0UHJveHkoYWRhcHRlciwgQmx1ZXRvb3RoUHJvZmlsZS5QQU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1QYW4pOwotCi0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbVBhbi5zZXRCbHVldG9vdGhUZXRoZXJpbmcodHJ1ZSk7Ci0gICAgICAgIGxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBhc3NlcnRUcnVlKG1QYW4uaXNUZXRoZXJpbmdPbigpKTsKLQotICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJlbmFibGVQYW4oKSBjb21wbGV0ZWQgaW4gJWQgbXMiLCAoc3RvcCAtIHN0YXJ0KSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGVzIFBBTiB0ZXRoZXJpbmcgb24gdGhlIGxvY2FsIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRldGhlcmluZyBpcwotICAgICAqIGRpc2FibGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzYWJsZVBhbihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKG1QYW4gPT0gbnVsbCkgbVBhbiA9IChCbHVldG9vdGhQYW4pIGNvbm5lY3RQcm94eShhZGFwdGVyLCBCbHVldG9vdGhQcm9maWxlLlBBTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobVBhbik7Ci0KLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBtUGFuLnNldEJsdWV0b290aFRldGhlcmluZyhmYWxzZSk7Ci0gICAgICAgIGxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBhc3NlcnRGYWxzZShtUGFuLmlzVGV0aGVyaW5nT24oKSk7Ci0KLSAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzYWJsZVBhbigpIGNvbXBsZXRlZCBpbiAlZCBtcyIsIChzdG9wIC0gc3RhcnQpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGVzIGEgcGFpcmluZyB3aXRoIGEgcmVtb3RlIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZXZpY2VzIGFyZSBwYWlyZWQKLSAgICAgKiBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gcGFzc2tleSBUaGUgcGFpcmluZyBwYXNza2V5IGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwYXNza2V5LiBBbnkgdmFsdWUgaWYgbm90LgotICAgICAqIEBwYXJhbSBwaW4gVGhlIHBhaXJpbmcgcGluIGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwaW4uIEFueSB2YWx1ZSBpZiBub3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFpcihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LCBieXRlW10gcGluKSB7Ci0gICAgICAgIHBhaXJPckFjY2VwdFBhaXIoYWRhcHRlciwgZGV2aWNlLCBwYXNza2V5LCBwaW4sIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjY2VwdHMgYSBwYWlyaW5nIHdpdGggYSByZW1vdGUgZGV2aWNlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGRldmljZXMgYXJlIHBhaXJlZAotICAgICAqIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBwYXNza2V5IFRoZSBwYWlyaW5nIHBhc3NrZXkgaWYgcGFpcmluZyByZXF1aXJlcyBhIHBhc3NrZXkuIEFueSB2YWx1ZSBpZiBub3QuCi0gICAgICogQHBhcmFtIHBpbiBUaGUgcGFpcmluZyBwaW4gaWYgcGFpcmluZyByZXF1aXJlcyBhIHBpbi4gQW55IHZhbHVlIGlmIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHRQYWlyKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHBhc3NrZXksCi0gICAgICAgICAgICBieXRlW10gcGluKSB7Ci0gICAgICAgIHBhaXJPckFjY2VwdFBhaXIoYWRhcHRlciwgZGV2aWNlLCBwYXNza2V5LCBwaW4sIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkge0BsaW5rICNwYWlyKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSwgaW50LCBieXRlW10pfSBhbmQKLSAgICAgKiB7QGxpbmsgI2FjY2VwdFBhaXIoQmx1ZXRvb3RoQWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlLCBpbnQsIGJ5dGVbXSl9IHRvIGVpdGhlciBwYWlyIG9yIGFjY2VwdAotICAgICAqIGEgcGFpcmluZyByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gcGFzc2tleSBUaGUgcGFpcmluZyBwYXNza2V5IGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwYXNza2V5LiBBbnkgdmFsdWUgaWYgbm90LgotICAgICAqIEBwYXJhbSBwaW4gVGhlIHBhaXJpbmcgcGluIGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwaW4uIEFueSB2YWx1ZSBpZiBub3QuCi0gICAgICogQHBhcmFtIHNob3VsZFBhaXIgV2hldGhlciB0byBwYWlyIG9yIGFjY2VwdCB0aGUgcGFpci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFpck9yQWNjZXB0UGFpcihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LAotICAgICAgICAgICAgYnl0ZVtdIHBpbiwgYm9vbGVhbiBzaG91bGRQYWlyKSB7Ci0gICAgICAgIGludCBtYXNrID0gUGFpclJlY2VpdmVyLlNUQVRFX0JPTkRJTkdfRkxBRyB8IFBhaXJSZWNlaXZlci5TVEFURV9CT05ERURfRkxBRzsKLSAgICAgICAgbG9uZyBzdGFydCA9IC0xOwotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKLSAgICAgICAgaWYgKHNob3VsZFBhaXIpIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJwYWlyKGRldmljZT0lcykiLCBkZXZpY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoImFjY2VwdFBhaXIoZGV2aWNlPSVzKSIsIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFpclJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0UGFpclJlY2VpdmVyKGRldmljZSwgcGFzc2tleSwgcGluLCBtYXNrKTsKLQotICAgICAgICBpbnQgc3RhdGUgPSBkZXZpY2UuZ2V0Qm9uZFN0YXRlKCk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRQYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLmNyZWF0ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ESU5HOgotICAgICAgICAgICAgICAgIG1hc2sgPSAwOyAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgbWV0aG9kTmFtZSwgc3RhdGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgUEFJUl9VTlBBSVJfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBkZXZpY2UuZ2V0Qm9uZFN0YXRlKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBzdGF0ZSwgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVELCBmaXJlZEZsYWdzLCBtYXNrKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhIHBhaXJpbmcgd2l0aCBhIHJlbW90ZSBkZXZpY2UgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGV2aWNlcyBhcmUgdW5wYWlyZWQKLSAgICAgKiBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bnBhaXIoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUGFpclJlY2VpdmVyLlNUQVRFX05PTkVfRkxBRzsKLSAgICAgICAgbG9uZyBzdGFydCA9IC0xOwotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoInVucGFpcihkZXZpY2U9JXMpIiwgZGV2aWNlKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFpclJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0UGFpclJlY2VpdmVyKGRldmljZSwgMCwgbnVsbCwgbWFzayk7Ci0KLSAgICAgICAgaW50IHN0YXRlID0gZGV2aWNlLmdldEJvbmRTdGF0ZSgpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX05PTkU6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9ORElORzoKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLnJlbW92ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UucmVtb3ZlQm9uZCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgaW52YWxpZCBzdGF0ZTogc3RhdGU9JWQiLCBtZXRob2ROYW1lLCBzdGF0ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBQQUlSX1VOUEFJUl9USU1FT1VUKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlLmdldEJvbmRTdGF0ZSgpID09IEJsdWV0b290aERldmljZS5CT05EX05PTkUKLSAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25uZWN0cyBhIHByb2ZpbGUgZnJvbSB0aGUgbG9jYWwgZGV2aWNlIHRvIGEgcmVtb3RlIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotICAgICAqIHByb2ZpbGUgaXMgY29ubmVjdGVkIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBwcm9maWxlIFRoZSBwcm9maWxlIHRvIGNvbm5lY3QuIE9uZSBvZiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNBMkRQfSwKLSAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNIRUFEU0VUfSwgb3Ige0BsaW5rIEJsdWV0b290aFByb2ZpbGUjSU5QVVRfREVWSUNFfS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gcHJpbnRlZCBpbiB0aGUgbG9ncy4gIElmIG51bGwsIHdpbGwgYmUKLSAgICAgKiAiY29ubmVjdFByb2ZpbGUocHJvZmlsZT0mbHQ7cHJvZmlsZSZndDssIGRldmljZT0mbHQ7ZGV2aWNlJmd0OykiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29ubmVjdFByb2ZpbGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIGlmIChtZXRob2ROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJjb25uZWN0UHJvZmlsZShwcm9maWxlPSVkLCBkZXZpY2U9JXMpIiwgcHJvZmlsZSwgZGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbWFzayA9IChDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0NPTk5FQ1RJTkdfRkxBRwotICAgICAgICAgICAgICAgIHwgQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9DT05ORUNURURfRkxBRyk7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSAtMTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSA9IGNvbm5lY3RQcm94eShhZGFwdGVyLCBwcm9maWxlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7Ci0KLSAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlciByZWNlaXZlciA9IGdldENvbm5lY3RQcm9maWxlUmVjZWl2ZXIoZGV2aWNlLCBwcm9maWxlLCBtYXNrKTsKLQotICAgICAgICBpbnQgc3RhdGUgPSBwcm94eS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHByb3h5LmNvbm5lY3QoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgbWV0aG9kTmFtZSwgc3RhdGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9ESVNDT05ORUNUX1BST0ZJTEVfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBwcm94eS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIGluICVkIG1zIiwgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoIC0gc3RhcnQpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2Nvbm5lY3RzIGEgcHJvZmlsZSBiZXR3ZWVuIHRoZSBsb2NhbCBkZXZpY2UgYW5kIGEgcmVtb3RlIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZQotICAgICAqIHRoYXQgdGhlIHByb2ZpbGUgaXMgZGlzY29ubmVjdGVkIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBwcm9maWxlIFRoZSBwcm9maWxlIHRvIGRpc2Nvbm5lY3QuIE9uZSBvZiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNBMkRQfSwKLSAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNIRUFEU0VUfSwgb3Ige0BsaW5rIEJsdWV0b290aFByb2ZpbGUjSU5QVVRfREVWSUNFfS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gcHJpbnRlZCBpbiB0aGUgbG9ncy4gIElmIG51bGwsIHdpbGwgYmUKLSAgICAgKiAiY29ubmVjdFByb2ZpbGUocHJvZmlsZT0mbHQ7cHJvZmlsZSZndDssIGRldmljZT0mbHQ7ZGV2aWNlJmd0OykiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzY29ubmVjdFByb2ZpbGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIGlmIChtZXRob2ROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0UHJvZmlsZShwcm9maWxlPSVkLCBkZXZpY2U9JXMpIiwgcHJvZmlsZSwgZGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbWFzayA9IChDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0RJU0NPTk5FQ1RJTkdfRkxBRwotICAgICAgICAgICAgICAgIHwgQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9ESVNDT05ORUNURURfRkxBRyk7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSAtMTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSA9IGNvbm5lY3RQcm94eShhZGFwdGVyLCBwcm9maWxlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7Ci0KLSAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlciByZWNlaXZlciA9IGdldENvbm5lY3RQcm9maWxlUmVjZWl2ZXIoZGV2aWNlLCBwcm9maWxlLCBtYXNrKTsKLQotICAgICAgICBpbnQgc3RhdGUgPSBwcm94eS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm94eS5kaXNjb25uZWN0KGRldmljZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgbWV0aG9kTmFtZSwgc3RhdGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9ESVNDT05ORUNUX1BST0ZJTEVfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBwcm94eS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIGluICVkIG1zIiwgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoIC0gc3RhcnQpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbm5lY3RzIHRoZSBQQU5VIHRvIGEgcmVtb3RlIE5BUCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBQQU5VIGlzIGNvbm5lY3RlZCBhbmQgdGhhdAotICAgICAqIHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RQYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGNvbm5lY3RQYW5PckluY29taW5nUGFuQ29ubmVjdGlvbihhZGFwdGVyLCBkZXZpY2UsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGF0IGEgcmVtb3RlIFBBTlUgY29ubmVjdHMgdG8gdGhlIGxvY2FsIE5BUCBjb3JyZWN0bHkgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucwotICAgICAqIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbmNvbWluZ1BhbkNvbm5lY3Rpb24oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGNvbm5lY3RQYW5PckluY29taW5nUGFuQ29ubmVjdGlvbihhZGFwdGVyLCBkZXZpY2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkge0BsaW5rICNjb25uZWN0UGFuKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IGFuZAotICAgICAqIHtAbGluayAjaW5jb21pbmdQYW5Db25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IHRvIGVpdGhlciBjb25uZWN0IHRvIGEKLSAgICAgKiByZW1vdGUgTkFQIG9yIHZlcmlmeSB0aGF0IGEgcmVtb3RlIGRldmljZSBjb25uZWN0ZWQgdG8gdGhlIGxvY2FsIE5BUC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCi0gICAgICogQHBhcmFtIGNvbm5lY3QgSWYgdGhlIG1ldGhvZCBzaG91bGQgaW5pdGlhdGUgdGhlIGNvbm5lY3Rpb24gKGlzIFBBTlUpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RQYW5PckluY29taW5nUGFuQ29ubmVjdGlvbihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICBib29sZWFuIGNvbm5lY3QpIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IC0xOwotICAgICAgICBpbnQgbWFzaywgcm9sZTsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWU7Ci0KLSAgICAgICAgaWYgKGNvbm5lY3QpIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJjb25uZWN0UGFuKGRldmljZT0lcykiLCBkZXZpY2UpOwotICAgICAgICAgICAgbWFzayA9IChDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0NPTk5FQ1RFRF9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9DT05ORUNUSU5HX0ZMQUcpOwotICAgICAgICAgICAgcm9sZSA9IEJsdWV0b290aFBhbi5MT0NBTF9QQU5VX1JPTEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgiaW5jb21pbmdQYW5Db25uZWN0aW9uKGRldmljZT0lcykiLCBkZXZpY2UpOwotICAgICAgICAgICAgbWFzayA9IENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfQ09OTkVDVEVEX0ZMQUc7Ci0gICAgICAgICAgICByb2xlID0gQmx1ZXRvb3RoUGFuLkxPQ0FMX05BUF9ST0xFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBkZXZpY2Ugbm90IHBhaXJlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QYW4gPSAoQmx1ZXRvb3RoUGFuKSBjb25uZWN0UHJveHkoYWRhcHRlciwgQmx1ZXRvb3RoUHJvZmlsZS5QQU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1QYW4pOwotICAgICAgICBDb25uZWN0UGFuUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRDb25uZWN0UGFuUmVjZWl2ZXIoZGV2aWNlLCByb2xlLCBtYXNrKTsKLQotICAgICAgICBpbnQgc3RhdGUgPSBtUGFuLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvbGUgPT0gQmx1ZXRvb3RoUGFuLkxPQ0FMX1BBTlVfUk9MRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuaSgiQlQiLCAiY29ubmVjdCB0byBwYW4iKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtUGFuLmNvbm5lY3QoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIG1ldGhvZE5hbWUsIHN0YXRlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfRElTQ09OTkVDVF9QUk9GSUxFX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gbVBhbi5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVECi0gICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQgaW4gJWQgbXMiLCBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2ggLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQiLCBtZXRob2ROYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCVzKSIsCi0gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgc3RhdGUsIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNjb25uZWN0cyB0aGUgUEFOVSBmcm9tIGEgcmVtb3RlIE5BUCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBQQU5VIGlzIGRpc2Nvbm5lY3RlZAotICAgICAqIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RQYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGRpc2Nvbm5lY3RGcm9tUmVtb3RlT3JWZXJpZnlDb25uZWN0TmFwKGFkYXB0ZXIsIGRldmljZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYSByZW1vdGUgUEFOVSBkaXNjb25uZWN0cyBmcm9tIHRoZSBsb2NhbCBOQVAgY29ycmVjdGx5IGFuZCB0aGF0IHRoZSBjb3JyZWN0Ci0gICAgICogYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5jb21pbmdQYW5EaXNjb25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBkaXNjb25uZWN0RnJvbVJlbW90ZU9yVmVyaWZ5Q29ubmVjdE5hcChhZGFwdGVyLCBkZXZpY2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkge0BsaW5rICNkaXNjb25uZWN0UGFuKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IGFuZAotICAgICAqIHtAbGluayAjaW5jb21pbmdQYW5EaXNjb25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IHRvIGVpdGhlciBkaXNjb25uZWN0Ci0gICAgICogZnJvbSBhIHJlbW90ZSBOQVAgb3IgdmVyaWZ5IHRoYXQgYSByZW1vdGUgZGV2aWNlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBsb2NhbCBOQVAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBkaXNjb25uZWN0IFdoZXRoZXIgdGhlIG1ldGhvZCBzaG91bGQgY29ubmVjdCBvciB2ZXJpZnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3RGcm9tUmVtb3RlT3JWZXJpZnlDb25uZWN0TmFwKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gZGlzY29ubmVjdCkgewotICAgICAgICBsb25nIHN0YXJ0ID0gLTE7Ci0gICAgICAgIGludCBtYXNrLCByb2xlOwotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKLQotICAgICAgICBpZiAoZGlzY29ubmVjdCkgewotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RQYW4oZGV2aWNlPSVzKSIsIGRldmljZSk7Ci0gICAgICAgICAgICBtYXNrID0gKENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUcgfAotICAgICAgICAgICAgICAgICAgICBDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0RJU0NPTk5FQ1RJTkdfRkxBRyk7Ci0gICAgICAgICAgICByb2xlID0gQmx1ZXRvb3RoUGFuLkxPQ0FMX1BBTlVfUk9MRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJpbmNvbWluZ1BhbkRpc2Nvbm5lY3Rpb24oZGV2aWNlPSVzKSIsIGRldmljZSk7Ci0gICAgICAgICAgICBtYXNrID0gQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9ESVNDT05ORUNURURfRkxBRzsKLSAgICAgICAgICAgIHJvbGUgPSBCbHVldG9vdGhQYW4uTE9DQUxfTkFQX1JPTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVBhbiA9IChCbHVldG9vdGhQYW4pIGNvbm5lY3RQcm94eShhZGFwdGVyLCBCbHVldG9vdGhQcm9maWxlLlBBTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobVBhbik7Ci0gICAgICAgIENvbm5lY3RQYW5SZWNlaXZlciByZWNlaXZlciA9IGdldENvbm5lY3RQYW5SZWNlaXZlcihkZXZpY2UsIHJvbGUsIG1hc2spOwotCi0gICAgICAgIGludCBzdGF0ZSA9IG1QYW4uZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBpZiAocm9sZSA9PSBCbHVldG9vdGhQYW4uTE9DQUxfUEFOVV9ST0xFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobVBhbi5kaXNjb25uZWN0KGRldmljZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBtYXNrID0gMDsgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgaW52YWxpZCBzdGF0ZTogc3RhdGU9JWQiLCBtZXRob2ROYW1lLCBzdGF0ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBDT05ORUNUX0RJU0NPTk5FQ1RfUFJPRklMRV9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1QYW4uZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVECi0gICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQgaW4gJWQgbXMiLCBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2ggLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQiLCBtZXRob2ROYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCVzKSIsCi0gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgc3RhdGUsIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIGEgU0NPIGNoYW5uZWwgdXNpbmcge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyI3N0YXJ0Qmx1ZXRvb3RoU2NvKCl9IGFuZCBjaGVja3MKLSAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY2hhbm5lbCBpcyBvcGVuZWQgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTY28oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN0YXJ0U3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyBhIFNDTyBjaGFubmVsIHVzaW5nIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlciNzdG9wQmx1ZXRvb3RoU2NvKCl9IGFuZCBjaGVja3MKLSAgICAgKiAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3BTY28oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN0YXJ0U3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UsIGZhbHNlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCBmb3Ige0BsaW5rICNzdGFydFNjbyhCbHVldG9vdGhBZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UpfSBhbmQKLSAgICAgKiB7QGxpbmsgI3N0b3BTY28oQmx1ZXRvb3RoQWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlKX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBpc1N0YXJ0IFdoZXRoZXIgdGhlIFNDTyBjaGFubmVsIHNob3VsZCBiZSBvcGVuZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U3RvcFNjbyhCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gaXNTdGFydCkgewotICAgICAgICBsb25nIHN0YXJ0ID0gLTE7Ci0gICAgICAgIGludCBtYXNrOwotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKLQotICAgICAgICBpZiAoaXNTdGFydCkgewotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoInN0YXJ0U2NvKGRldmljZT0lcykiLCBkZXZpY2UpOwotICAgICAgICAgICAgbWFzayA9IFN0YXJ0U3RvcFNjb1JlY2VpdmVyLlNUQVRFX0NPTk5FQ1RFRF9GTEFHOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoInN0b3BTY28oZGV2aWNlPSVzKSIsIGRldmljZSk7Ci0gICAgICAgICAgICBtYXNrID0gU3RhcnRTdG9wU2NvUmVjZWl2ZXIuU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXVkaW9NYW5hZ2VyIG1hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWFuYWdlcik7Ci0KLSAgICAgICAgaWYgKCFtYW5hZ2VyLmlzQmx1ZXRvb3RoU2NvQXZhaWxhYmxlT2ZmQ2FsbCgpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFNDTyIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNTY29PbiA9IG1hbmFnZXIuaXNCbHVldG9vdGhTY29PbigpOwotICAgICAgICBpZiAoaXNTdGFydCA9PSBpc1Njb09uKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdGFydFN0b3BTY29SZWNlaXZlciByZWNlaXZlciA9IGdldFN0YXJ0U3RvcFNjb1JlY2VpdmVyKG1hc2spOwotICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpZiAoaXNTdGFydCkgewotICAgICAgICAgICAgbWFuYWdlci5zdGFydEJsdWV0b290aFNjbygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWFuYWdlci5zdG9wQmx1ZXRvb3RoU2NvKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IFNUQVJUX1NUT1BfU0NPX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIGlzU2NvT24gPSBtYW5hZ2VyLmlzQmx1ZXRvb3RoU2NvT24oKTsKLSAgICAgICAgICAgIGlmIChpc1N0YXJ0ID09IGlzU2NvT24gJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIHRpbWVvdXQ6IG9uPSViIChleHBlY3RlZCAlYiksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBpc1Njb09uLCBpc1N0YXJ0LCBmaXJlZEZsYWdzLCBtYXNrKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgc3RyaW5nIHRvIHRoZSBsb2djYXQgYW5kIGEgZmlsZSBpZiBhIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gYmUgd3JpdHRlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZU91dHB1dChTdHJpbmcgcykgewotICAgICAgICBMb2cuaShtVGFnLCBzKTsKLSAgICAgICAgaWYgKG1PdXRwdXRXcml0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtT3V0cHV0V3JpdGVyLndyaXRlKHMgKyAiXG4iKTsKLSAgICAgICAgICAgIG1PdXRwdXRXcml0ZXIuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncobVRhZywgIkNvdWxkIG5vdCB3cml0ZSB0byBvdXRwdXQgZmlsZSIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFJlY2VpdmVyKEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyLCBTdHJpbmdbXSBhY3Rpb25zKSB7Ci0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFjdGlvbjogYWN0aW9ucykgewotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihhY3Rpb24pOwotICAgICAgICB9Ci0gICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgICAgIG1SZWNlaXZlcnMuYWRkKHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aFJlY2VpdmVyIGdldEJsdWV0b290aFJlY2VpdmVyKGludCBleHBlY3RlZEZsYWdzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fRElTQ09WRVJZX0ZJTklTSEVELAotICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX0RJU0NPVkVSWV9TVEFSVEVELAotICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NDQU5fTU9ERV9DSEFOR0VELAotICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUR9OwotICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IG5ldyBCbHVldG9vdGhSZWNlaXZlcihleHBlY3RlZEZsYWdzKTsKLSAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOwotICAgICAgICByZXR1cm4gcmVjZWl2ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQYWlyUmVjZWl2ZXIgZ2V0UGFpclJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LCBieXRlW10gcGluLAotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IHsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1BBSVJJTkdfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRH07Ci0gICAgICAgIFBhaXJSZWNlaXZlciByZWNlaXZlciA9IG5ldyBQYWlyUmVjZWl2ZXIoZGV2aWNlLCBwYXNza2V5LCBwaW4sIGV4cGVjdGVkRmxhZ3MpOwotICAgICAgICBhZGRSZWNlaXZlcihyZWNlaXZlciwgYWN0aW9ucyk7Ci0gICAgICAgIHJldHVybiByZWNlaXZlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIgZ2V0Q29ubmVjdFByb2ZpbGVSZWNlaXZlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwKLSAgICAgICAgICAgIGludCBleHBlY3RlZEZsYWdzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VELAotICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEfTsKLSAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb25uZWN0UHJvZmlsZVJlY2VpdmVyKGRldmljZSwgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICBleHBlY3RlZEZsYWdzKTsKLSAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOwotICAgICAgICByZXR1cm4gcmVjZWl2ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25uZWN0UGFuUmVjZWl2ZXIgZ2V0Q29ubmVjdFBhblJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCByb2xlLAotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IHtCbHVldG9vdGhQYW4uQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRH07Ci0gICAgICAgIENvbm5lY3RQYW5SZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb25uZWN0UGFuUmVjZWl2ZXIoZGV2aWNlLCByb2xlLCBleHBlY3RlZEZsYWdzKTsKLSAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOwotICAgICAgICByZXR1cm4gcmVjZWl2ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdGFydFN0b3BTY29SZWNlaXZlciBnZXRTdGFydFN0b3BTY29SZWNlaXZlcihpbnQgZXhwZWN0ZWRGbGFncykgewotICAgICAgICBTdHJpbmdbXSBhY3Rpb25zID0ge0F1ZGlvTWFuYWdlci5BQ1RJT05fU0NPX0FVRElPX1NUQVRFX0NIQU5HRUR9OwotICAgICAgICBTdGFydFN0b3BTY29SZWNlaXZlciByZWNlaXZlciA9IG5ldyBTdGFydFN0b3BTY29SZWNlaXZlcihleHBlY3RlZEZsYWdzKTsKLSAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOwotICAgICAgICByZXR1cm4gcmVjZWl2ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVJlY2VpdmVyKEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIG1SZWNlaXZlcnMucmVtb3ZlKHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aFByb2ZpbGUgY29ubmVjdFByb3h5KEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgaW50IHByb2ZpbGUpIHsKLSAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuQTJEUDoKLSAgICAgICAgICAgICAgICBpZiAobUEyZHAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUEyZHA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1IZWFkc2V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtSW5wdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKLSAgICAgICAgICAgICAgICBpZiAobVBhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtUGFuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgYWRhcHRlci5nZXRQcm9maWxlUHJveHkobUNvbnRleHQsIG1TZXJ2aWNlTGlzdGVuZXIsIHByb2ZpbGUpOwotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuQTJEUDoKLSAgICAgICAgICAgICAgICB3aGlsZSAobUEyZHAgPT0gbnVsbCAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBDT05ORUNUX1BST1hZX1RJTUVPVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1BMmRwOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1IZWFkc2V0ID09IG51bGwgJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9QUk9YWV9USU1FT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtSGVhZHNldDsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1JbnB1dCA9PSBudWxsICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfUFJPWFlfVElNRU9VVCkgewotICAgICAgICAgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbUlucHV0OwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKLSAgICAgICAgICAgICAgICB3aGlsZSAobVBhbiA9PSBudWxsICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfUFJPWFlfVElNRU9VVCkgewotICAgICAgICAgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbVBhbjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2xlZXAobG9uZyB0aW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAodGltZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNIaXN0b3J5VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0c0hpc3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2M2MwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNIaXN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdHNIaXN0b3J5LlVJRF9BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzLkRBWV9JTl9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzLkhPVVJfSU5fTUlMTElTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlscy5NSU5VVEVfSU5fTUlMTElTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlscy5TRUNPTkRfSU5fTUlMTElTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlscy5XRUVLX0lOX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHMuWUVBUl9JTl9NSUxMSVM7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TdXBwcmVzczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworQFNtYWxsVGVzdAorcHVibGljIGNsYXNzIE5ldHdvcmtTdGF0c0hpc3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTmV0d29ya1N0YXRzSGlzdG9yeVRlc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVNUX1NUQVJUID0gMTE5NDIyMDgwMDAwMEw7CisKKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0c0hpc3Rvcnkgc3RhdHM7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBpZiAoc3RhdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0Q29uc2lzdGVudChzdGF0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjb3JkU2luZ2xlQnVja2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGxvbmcgQlVDS0VUX1NJWkUgPSBIT1VSX0lOX01JTExJUzsKKyAgICAgICAgc3RhdHMgPSBidWlsZFN0YXRzKEJVQ0tFVF9TSVpFKTsKKworICAgICAgICAvLyByZWNvcmQgZGF0YSBpbnRvIG5hcnJvdyB3aW5kb3cgdG8gZ2V0IHNpbmdsZSBidWNrZXQKKyAgICAgICAgc3RhdHMucmVjb3JkRGF0YShURVNUX1NUQVJULCBURVNUX1NUQVJUICsgU0VDT05EX0lOX01JTExJUywgMTAyNEwsIDIwNDhMKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RhdHMuYnVja2V0Q291bnQpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDAsIDEwMjRMLCAyMDQ4TCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY29yZEVxdWFsQnVja2V0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGJ1Y2tldER1cmF0aW9uID0gSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIHN0YXRzID0gYnVpbGRTdGF0cyhidWNrZXREdXJhdGlvbik7CisKKyAgICAgICAgLy8gc3BsaXQgZXF1YWxseSBhY3Jvc3MgdHdvIGJ1Y2tldHMKKyAgICAgICAgZmluYWwgbG9uZyByZWNvcmRTdGFydCA9IFRFU1RfU1RBUlQgKyAoYnVja2V0RHVyYXRpb24gLyAyKTsKKyAgICAgICAgc3RhdHMucmVjb3JkRGF0YShyZWNvcmRTdGFydCwgcmVjb3JkU3RhcnQgKyBidWNrZXREdXJhdGlvbiwgMTAyNEwsIDEyOEwpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBzdGF0cy5idWNrZXRDb3VudCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMCwgNTEyTCwgNjRMKTsKKyAgICAgICAgYXNzZXJ0QnVja2V0KHN0YXRzLCAxLCA1MTJMLCA2NEwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmRUb3VjaGluZ0J1Y2tldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZyBCVUNLRVRfU0laRSA9IDE1ICogTUlOVVRFX0lOX01JTExJUzsKKyAgICAgICAgc3RhdHMgPSBidWlsZFN0YXRzKEJVQ0tFVF9TSVpFKTsKKworICAgICAgICAvLyBzcGxpdCBhbG1vc3QgY29tcGxldGVseSBpbnRvIG1pZGRsZSBidWNrZXQsIGJ1dCB3aXRoIGEgZmV3IG1pbnV0ZXMKKyAgICAgICAgLy8gb3ZlcmxhcCBpbnRvIG5laWdoYm9yaW5nIGJ1Y2tldHMuIHRvdGFsIHJlY29yZCBpcyAyMCBtaW51dGVzLgorICAgICAgICBmaW5hbCBsb25nIHJlY29yZFN0YXJ0ID0gKFRFU1RfU1RBUlQgKyBCVUNLRVRfU0laRSkgLSBNSU5VVEVfSU5fTUlMTElTOworICAgICAgICBmaW5hbCBsb25nIHJlY29yZEVuZCA9IChURVNUX1NUQVJUICsgKEJVQ0tFVF9TSVpFICogMikpICsgKE1JTlVURV9JTl9NSUxMSVMgKiA0KTsKKyAgICAgICAgc3RhdHMucmVjb3JkRGF0YShyZWNvcmRTdGFydCwgcmVjb3JkRW5kLCAxMDAwTCwgNTAwMEwpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBzdGF0cy5idWNrZXRDb3VudCk7CisgICAgICAgIC8vIGZpcnN0IGJ1Y2tldCBzaG91bGQgaGF2ZSAoMS8yMCBvZiB2YWx1ZSkKKyAgICAgICAgYXNzZXJ0QnVja2V0KHN0YXRzLCAwLCA1MEwsIDI1MEwpOworICAgICAgICAvLyBzZWNvbmQgYnVja2V0IHNob3VsZCBoYXZlICgxNS8yMCBvZiB2YWx1ZSkKKyAgICAgICAgYXNzZXJ0QnVja2V0KHN0YXRzLCAxLCA3NTBMLCAzNzUwTCk7CisgICAgICAgIC8vIGZpbmFsIGJ1Y2tldCBzaG91bGQgaGF2ZSAoNC8yMCBvZiB2YWx1ZSkKKyAgICAgICAgYXNzZXJ0QnVja2V0KHN0YXRzLCAyLCAyMDBMLCAxMDAwTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY29yZEdhcEJ1Y2tldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZyBCVUNLRVRfU0laRSA9IEhPVVJfSU5fTUlMTElTOworICAgICAgICBzdGF0cyA9IGJ1aWxkU3RhdHMoQlVDS0VUX1NJWkUpOworCisgICAgICAgIC8vIHJlY29yZCBzb21lIGRhdGEgdG9kYXkgYW5kIG5leHQgd2VlayB3aXRoIGxhcmdlIGdhcAorICAgICAgICBmaW5hbCBsb25nIGZpcnN0U3RhcnQgPSBURVNUX1NUQVJUOworICAgICAgICBmaW5hbCBsb25nIGxhc3RTdGFydCA9IFRFU1RfU1RBUlQgKyBXRUVLX0lOX01JTExJUzsKKyAgICAgICAgc3RhdHMucmVjb3JkRGF0YShmaXJzdFN0YXJ0LCBmaXJzdFN0YXJ0ICsgU0VDT05EX0lOX01JTExJUywgMTI4TCwgMjU2TCk7CisgICAgICAgIHN0YXRzLnJlY29yZERhdGEobGFzdFN0YXJ0LCBsYXN0U3RhcnQgKyBTRUNPTkRfSU5fTUlMTElTLCA2NEwsIDUxMkwpOworCisgICAgICAgIC8vIHdlIHNob3VsZCBoYXZlIHR3byBidWNrZXRzLCBmYXIgYXBhcnQgZnJvbSBlYWNoIG90aGVyCisgICAgICAgIGFzc2VydEVxdWFscygyLCBzdGF0cy5idWNrZXRDb3VudCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMCwgMTI4TCwgMjU2TCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMSwgNjRMLCA1MTJMKTsKKworICAgICAgICAvLyBub3cgcmVjb3JkIHNvbWV0aGluZyBpbiBtaWRkbGUsIHNwcmVhZCBhY3Jvc3MgdHdvIGJ1Y2tldHMKKyAgICAgICAgZmluYWwgbG9uZyBtaWRkbGVTdGFydCA9IFRFU1RfU1RBUlQgKyBEQVlfSU5fTUlMTElTOworICAgICAgICBmaW5hbCBsb25nIG1pZGRsZUVuZCA9IG1pZGRsZVN0YXJ0ICsgKEhPVVJfSU5fTUlMTElTICogMik7CisgICAgICAgIHN0YXRzLnJlY29yZERhdGEobWlkZGxlU3RhcnQsIG1pZGRsZUVuZCwgMjA0OEwsIDIwNDhMKTsKKworICAgICAgICAvLyBub3cgc2hvdWxkIGhhdmUgZm91ciBidWNrZXRzLCB3aXRoIG5ldyByZWNvcmQgaW4gbWlkZGxlIHR3byBidWNrZXRzCisgICAgICAgIGFzc2VydEVxdWFscyg0LCBzdGF0cy5idWNrZXRDb3VudCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMCwgMTI4TCwgMjU2TCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMSwgMTAyNEwsIDEwMjRMKTsKKyAgICAgICAgYXNzZXJ0QnVja2V0KHN0YXRzLCAyLCAxMDI0TCwgMTAyNEwpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDMsIDY0TCwgNTEyTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY29yZE92ZXJsYXBCdWNrZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGxvbmcgQlVDS0VUX1NJWkUgPSBIT1VSX0lOX01JTExJUzsKKyAgICAgICAgc3RhdHMgPSBidWlsZFN0YXRzKEJVQ0tFVF9TSVpFKTsKKworICAgICAgICAvLyByZWNvcmQgc29tZSBkYXRhIGluIG9uZSBidWNrZXQsIGFuZCBhbm90aGVyIG92ZXJsYXBwaW5nIGJ1Y2tldHMKKyAgICAgICAgc3RhdHMucmVjb3JkRGF0YShURVNUX1NUQVJULCBURVNUX1NUQVJUICsgU0VDT05EX0lOX01JTExJUywgMjU2TCwgMjU2TCk7CisgICAgICAgIGZpbmFsIGxvbmcgbWlkU3RhcnQgPSBURVNUX1NUQVJUICsgKEhPVVJfSU5fTUlMTElTIC8gMik7CisgICAgICAgIHN0YXRzLnJlY29yZERhdGEobWlkU3RhcnQsIG1pZFN0YXJ0ICsgSE9VUl9JTl9NSUxMSVMsIDEwMjRMLCAxMDI0TCk7CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgdHdvIGJ1Y2tldHMsIHdpdGggc29tZSBkYXRhIG1peGVkIHRvZ2V0aGVyCisgICAgICAgIGFzc2VydEVxdWFscygyLCBzdGF0cy5idWNrZXRDb3VudCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMCwgNzY4TCwgNzY4TCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMSwgNTEyTCwgNTEyTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIEJVQ0tFVF9TSVpFID0gSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIHN0YXRzID0gYnVpbGRTdGF0cyhCVUNLRVRfU0laRSk7CisKKyAgICAgICAgLy8gcmVjb3JkIHNvbWUgZGF0YSBhY3Jvc3MgMjQgYnVja2V0cworICAgICAgICBzdGF0cy5yZWNvcmREYXRhKFRFU1RfU1RBUlQsIFRFU1RfU1RBUlQgKyBEQVlfSU5fTUlMTElTLCAyNEwsIDI0TCk7CisgICAgICAgIGFzc2VydEVxdWFscygyNCwgc3RhdHMuYnVja2V0Q291bnQpOworCisgICAgICAgIC8vIHRyeSByZW1vdmluZyBmYXIgYmVmb3JlIGJ1Y2tldHM7IHNob3VsZCBiZSBubyBjaGFuZ2UKKyAgICAgICAgc3RhdHMucmVtb3ZlQnVja2V0c0JlZm9yZShURVNUX1NUQVJUIC0gWUVBUl9JTl9NSUxMSVMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjQsIHN0YXRzLmJ1Y2tldENvdW50KTsKKworICAgICAgICAvLyB0cnkgcmVtb3ZpbmcganVzdCBtb21lbnRzIGludG8gZmlyc3QgYnVja2V0OyBzaG91bGQgYmUgbm8gY2hhbmdlCisgICAgICAgIC8vIHNpbmNlIHRoYXQgYnVja2V0IGNvbnRhaW5zIGRhdGEgYmV5b25kIHRoZSBjdXRvZmYKKyAgICAgICAgc3RhdHMucmVtb3ZlQnVja2V0c0JlZm9yZShURVNUX1NUQVJUICsgU0VDT05EX0lOX01JTExJUyk7CisgICAgICAgIGFzc2VydEVxdWFscygyNCwgc3RhdHMuYnVja2V0Q291bnQpOworCisgICAgICAgIC8vIHRyeSByZW1vdmluZyBzaW5nbGUgYnVja2V0CisgICAgICAgIHN0YXRzLnJlbW92ZUJ1Y2tldHNCZWZvcmUoVEVTVF9TVEFSVCArIEhPVVJfSU5fTUlMTElTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIzLCBzdGF0cy5idWNrZXRDb3VudCk7CisKKyAgICAgICAgLy8gdHJ5IHJlbW92aW5nIG11bHRpcGxlIGJ1Y2tldHMKKyAgICAgICAgc3RhdHMucmVtb3ZlQnVja2V0c0JlZm9yZShURVNUX1NUQVJUICsgKDQgKiBIT1VSX0lOX01JTExJUykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAsIHN0YXRzLmJ1Y2tldENvdW50KTsKKworICAgICAgICAvLyB0cnkgcmVtb3ZpbmcgYWxsIGJ1Y2tldHMKKyAgICAgICAgc3RhdHMucmVtb3ZlQnVja2V0c0JlZm9yZShURVNUX1NUQVJUICsgWUVBUl9JTl9NSUxMSVMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdHMuYnVja2V0Q291bnQpOworICAgIH0KKworICAgIEBTdXBwcmVzcworICAgIHB1YmxpYyB2b2lkIHRlc3RGdXp6aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBmdXp6aW5nIHdpdGggcmFuZG9tIGV2ZW50cywgbG9va2luZyBmb3IgY3Jhc2hlcworICAgICAgICAgICAgZmluYWwgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RhdHMgPSBidWlsZFN0YXRzKHIubmV4dExvbmcoKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDAwMDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyLm5leHRCb29sZWFuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCByYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IHIubmV4dExvbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZW5kID0gc3RhcnQgKyByLm5leHRJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLnJlY29yZERhdGEoc3RhcnQsIGVuZCwgci5uZXh0TG9uZygpLCByLm5leHRMb25nKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpbSBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLnJlbW92ZUJ1Y2tldHNCZWZvcmUoci5uZXh0TG9uZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRDb25zaXN0ZW50KHN0YXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgU3RyaW5nLnZhbHVlT2Yoc3RhdHMpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTmV0d29ya1N0YXRzSGlzdG9yeSBidWlsZFN0YXRzKGxvbmcgYnVja2V0U2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoVFlQRV9NT0JJTEUsIG51bGwsIFVJRF9BTEwsIGJ1Y2tldFNpemUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29uc2lzdGVudChOZXR3b3JrU3RhdHNIaXN0b3J5IHN0YXRzKSB7CisgICAgICAgIC8vIHZlcmlmeSB0aW1lc3RhbXBzIGFyZSBtb25vdG9uaWMKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzdGF0cy5idWNrZXRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN0YXRzLmJ1Y2tldFN0YXJ0W2kgLSAxXSA8IHN0YXRzLmJ1Y2tldFN0YXJ0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0QnVja2V0KE5ldHdvcmtTdGF0c0hpc3Rvcnkgc3RhdHMsIGludCBpbmRleCwgbG9uZyByeCwgbG9uZyB0eCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgcngiLCByeCwgc3RhdHMucnhbaW5kZXhdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIHR4IiwgdHgsIHN0YXRzLnR4W2luZGV4XSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0c1Rlc3QuamF2YQppbmRleCA0NTcxOWMyLi4yM2ViOWNmIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNUZXN0LmphdmEKQEAgLTQ3LDggKzQ3LDkgQEAKICAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAwLCAxMDI0LCAwKQogICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDEsIDAsIDEwMjQpLmJ1aWxkKCk7CiAKLSAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHJlc3VsdCA9IGFmdGVyLnN1YnRyYWN0KGJlZm9yZSk7CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyByZXN1bHQgPSBhZnRlci5zdWJ0cmFjdChiZWZvcmUsIHRydWUpOwogCisgICAgICAgIC8vIGlkZW50aWNhbCBkYXRhIHNob3VsZCByZXN1bHQgaW4gemVybyBkZWx0YQogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LnJ4WzBdKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdC50eFswXSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCByZXN1bHQucnhbMV0pOwpAQCAtNjQsNyArNjUsNyBAQAogICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDAsIDEwMjUsIDIpCiAgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMSwgMywgMTAyOCkuYnVpbGQoKTsKIAotICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgcmVzdWx0ID0gYWZ0ZXIuc3VidHJhY3QoYmVmb3JlKTsKKyAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHJlc3VsdCA9IGFmdGVyLnN1YnRyYWN0KGJlZm9yZSwgdHJ1ZSk7CiAKICAgICAgICAgLy8gZXhwZWN0IGRlbHRhIGJldHdlZW4gbWVhc3VyZW1lbnRzCiAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQucnhbMF0pOwpAQCAtODMsNyArODQsNyBAQAogICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDEsIDAsIDEwMjQpCiAgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMiwgMTAyNCwgMTAyNCkuYnVpbGQoKTsKIAotICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgcmVzdWx0ID0gYWZ0ZXIuc3VidHJhY3QoYmVmb3JlKTsKKyAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHJlc3VsdCA9IGFmdGVyLnN1YnRyYWN0KGJlZm9yZSwgdHJ1ZSk7CiAKICAgICAgICAgLy8gaXRzIG9rYXkgdG8gaGF2ZSBuZXcgcm93cwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LnJ4WzBdKTsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9odHRwL0Fic3RyYWN0UHJveHlUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvaHR0cC9BYnN0cmFjdFByb3h5VGVzdC5qYXZhCmluZGV4IDJmYjgzM2MuLmVlODk0MTQgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9odHRwL0Fic3RyYWN0UHJveHlUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L2h0dHAvQWJzdHJhY3RQcm94eVRlc3QuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IHRlc3RzLmh0dHAuTW9ja1Jlc3BvbnNlOwogaW1wb3J0IHRlc3RzLmh0dHAuTW9ja1dlYlNlcnZlcjsKIGltcG9ydCB0ZXN0cy5odHRwLlJlY29yZGVkUmVxdWVzdDsKK2ltcG9ydCB0ZXN0cy5odHRwLlNvY2tldFBvbGljeTsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJveHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCkBAIC0xNDgsMTAgKzE0OSw5IEBACiAgICAgICAgIFRlc3RTU0xDb250ZXh0IHRlc3RTU0xDb250ZXh0ID0gVGVzdFNTTENvbnRleHQuY3JlYXRlKCk7CiAKICAgICAgICAgc2VydmVyLnVzZUh0dHBzKHRlc3RTU0xDb250ZXh0LnNlcnZlckNvbnRleHQuZ2V0U29ja2V0RmFjdG9yeSgpLCB0cnVlKTsKLSAgICAgICAgTW9ja1Jlc3BvbnNlIGNvbm5lY3RSZXNwb25zZSA9IG5ldyBNb2NrUmVzcG9uc2UoKQotICAgICAgICAgICAgICAgIC5zZXRSZXNwb25zZUNvZGUoMjAwKTsKLSAgICAgICAgY29ubmVjdFJlc3BvbnNlLmdldEhlYWRlcnMoKS5jbGVhcigpOwotICAgICAgICBzZXJ2ZXIuZW5xdWV1ZShjb25uZWN0UmVzcG9uc2UpOworICAgICAgICBzZXJ2ZXIuZW5xdWV1ZShuZXcgTW9ja1Jlc3BvbnNlKCkKKyAgICAgICAgICAgICAgICAuc2V0U29ja2V0UG9saWN5KFNvY2tldFBvbGljeS5VUEdSQURFX1RPX1NTTF9BVF9FTkQpCisgICAgICAgICAgICAgICAgLmNsZWFySGVhZGVycygpKTsKICAgICAgICAgc2VydmVyLmVucXVldWUobmV3IE1vY2tSZXNwb25zZSgpCiAgICAgICAgICAgICAgICAgLnNldFJlc3BvbnNlQ29kZSgyMDApCiAgICAgICAgICAgICAgICAgLnNldEJvZHkoInRoaXMgcmVzcG9uc2UgY29tZXMgdmlhIGEgc2VjdXJlIHByb3h5IikpOwpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L2h0dHAvSHR0cFJlc3BvbnNlQ2FjaGVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvaHR0cC9IdHRwUmVzcG9uc2VDYWNoZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY1NTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L2h0dHAvSHR0cFJlc3BvbnNlQ2FjaGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuQ2FjaGVSZXF1ZXN0OworaW1wb3J0IGphdmEubmV0LkNhY2hlUmVzcG9uc2U7CitpbXBvcnQgamF2YS5uZXQuUmVzcG9uc2VDYWNoZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGZpbmFsIGNsYXNzIEh0dHBSZXNwb25zZUNhY2hlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgRmlsZSBjYWNoZURpcjsKKworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBTdHJpbmcgdG1wID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworICAgICAgICBjYWNoZURpciA9IG5ldyBGaWxlKHRtcCwgIkh0dHBDYWNoZS0iICsgVVVJRC5yYW5kb21VVUlEKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZUNhY2hlLnNldERlZmF1bHQobnVsbCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFJlc3BvbnNlQ2FjaGUgaW5zdGFsbGVkID0gSHR0cFJlc3BvbnNlQ2FjaGUuaW5zdGFsbChjYWNoZURpciwgMTAgKiAxMDI0ICogMTAyNCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaW5zdGFsbGVkKTsKKyAgICAgICAgYXNzZXJ0U2FtZShpbnN0YWxsZWQsIFJlc3BvbnNlQ2FjaGUuZ2V0RGVmYXVsdCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShpbnN0YWxsZWQsIEh0dHBSZXNwb25zZUNhY2hlLmdldERlZmF1bHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNlY29uZEVxdWl2YWxlbnRJbnN0YWxsRG9lc05vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFJlc3BvbnNlQ2FjaGUgZmlyc3QgPSBIdHRwUmVzcG9uc2VDYWNoZS5pbnN0YWxsKGNhY2hlRGlyLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgSHR0cFJlc3BvbnNlQ2FjaGUgYW5vdGhlciA9IEh0dHBSZXNwb25zZUNhY2hlLmluc3RhbGwoY2FjaGVEaXIsIDEwICogMTAyNCAqIDEwMjQpOworICAgICAgICBhc3NlcnRTYW1lKGZpcnN0LCBhbm90aGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbENsb3Nlc1ByZXZpb3VzbHlJbnN0YWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFJlc3BvbnNlQ2FjaGUgZmlyc3QgPSBIdHRwUmVzcG9uc2VDYWNoZS5pbnN0YWxsKGNhY2hlRGlyLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgSHR0cFJlc3BvbnNlQ2FjaGUgYW5vdGhlciA9IEh0dHBSZXNwb25zZUNhY2hlLmluc3RhbGwoY2FjaGVEaXIsIDggKiAxMDI0ICogMTAyNCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoZmlyc3QsIGFub3RoZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlyc3QuZmx1c2goKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFsbGVkV2l0aFdyb25nVHlwZUluc3RhbGxlZCgpIHsKKyAgICAgICAgUmVzcG9uc2VDYWNoZS5zZXREZWZhdWx0KG5ldyBSZXNwb25zZUNhY2hlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBDYWNoZVJlc3BvbnNlIGdldChVUkkgdXJpLCBTdHJpbmcgcmVxdWVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXF1ZXN0SGVhZGVycykgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBDYWNoZVJlcXVlc3QgcHV0KFVSSSB1cmksIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0TnVsbChIdHRwUmVzcG9uc2VDYWNoZS5nZXRJbnN0YWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlQ2xvc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEh0dHBSZXNwb25zZUNhY2hlIGNhY2hlID0gSHR0cFJlc3BvbnNlQ2FjaGUuaW5zdGFsbChjYWNoZURpciwgMTAgKiAxMDI0ICogMTAyNCk7CisgICAgICAgIGNhY2hlLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWNoZS5mbHVzaCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVVuaW5zdGFsbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFJlc3BvbnNlQ2FjaGUgY2FjaGUgPSBIdHRwUmVzcG9uc2VDYWNoZS5pbnN0YWxsKGNhY2hlRGlyLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgY2FjaGUuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChSZXNwb25zZUNhY2hlLmdldERlZmF1bHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVVuaW5zdGFsbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFJlc3BvbnNlQ2FjaGUgY2FjaGUgPSBIdHRwUmVzcG9uc2VDYWNoZS5pbnN0YWxsKGNhY2hlRGlyLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgY2FjaGUuZGVsZXRlKCk7CisgICAgICAgIGFzc2VydE51bGwoUmVzcG9uc2VDYWNoZS5nZXREZWZhdWx0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvR3Jhdml0eVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvR3Jhdml0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTdhNjRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9HcmF2aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworcHVibGljIGNsYXNzIEdyYXZpdHlUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWJzb2x1dGVHcmF2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5MRUZULCBHcmF2aXR5LkxFRlQsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkxFRlQsIEdyYXZpdHkuTEVGVCwgdHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LlJJR0hULCBHcmF2aXR5LlJJR0hULCBmYWxzZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5SSUdIVCwgR3Jhdml0eS5SSUdIVCwgdHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LlRPUCwgR3Jhdml0eS5UT1AsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LlRPUCwgR3Jhdml0eS5UT1AsIHRydWUpOworCisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5CT1RUT00sIEdyYXZpdHkuQk9UVE9NLCBmYWxzZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5CT1RUT00sIEdyYXZpdHkuQk9UVE9NLCB0cnVlKTsKKworICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMLCBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCwgZmFsc2UpOworICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMLCBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCwgdHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMLCBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMLCBmYWxzZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTCwgR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTCwgdHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkNFTlRFUiwgR3Jhdml0eS5DRU5URVIsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkNFTlRFUiwgR3Jhdml0eS5DRU5URVIsIHRydWUpOworCisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5GSUxMX1ZFUlRJQ0FMLCBHcmF2aXR5LkZJTExfVkVSVElDQUwsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkZJTExfVkVSVElDQUwsIEdyYXZpdHkuRklMTF9WRVJUSUNBTCwgdHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkZJTExfSE9SSVpPTlRBTCwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUwsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkZJTExfSE9SSVpPTlRBTCwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUwsIHRydWUpOworCisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5GSUxMLCBHcmF2aXR5LkZJTEwsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkZJTEwsIEdyYXZpdHkuRklMTCwgdHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkNMSVBfSE9SSVpPTlRBTCwgR3Jhdml0eS5DTElQX0hPUklaT05UQUwsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkNMSVBfSE9SSVpPTlRBTCwgR3Jhdml0eS5DTElQX0hPUklaT05UQUwsIHRydWUpOworCisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DTElQX1ZFUlRJQ0FMLCBHcmF2aXR5LkNMSVBfVkVSVElDQUwsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkNMSVBfVkVSVElDQUwsIEdyYXZpdHkuQ0xJUF9WRVJUSUNBTCwgdHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkxFRlQsIEdyYXZpdHkuU1RBUlQsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LlJJR0hULCBHcmF2aXR5LlNUQVJULCB0cnVlKTsKKworICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuUklHSFQsIEdyYXZpdHkuRU5ELCBmYWxzZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5MRUZULCBHcmF2aXR5LkVORCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE9uZUdyYXZpdHkoaW50IGV4cGVjdGVkLCBpbnQgaW5pdGlhbCwgYm9vbGVhbiBpc1J0bCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KGluaXRpYWwsIGlzUnRsKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvcGxhdGZvcm0ueG1sIGIvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCmluZGV4IDVlZDc5NjYuLmI5YzBkODAgMTAwNjQ0Ci0tLSBhL2RhdGEvZXRjL3BsYXRmb3JtLnhtbAorKysgYi9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKQEAgLTEzMiw2ICsxMzIsNyBAQAogICAgIDxhc3NpZ24tcGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkFUVEVSWV9TVEFUUyIgdWlkPSJzaGVsbCIgLz4KICAgICA8YXNzaWduLXBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkFMX1NZU1RFTV9XSU5ET1ciIHVpZD0ic2hlbGwiIC8+CiAgICAgPGFzc2lnbi1wZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTkpFQ1RfRVZFTlRTIiB1aWQ9InNoZWxsIiAvPgorICAgIDxhc3NpZ24tcGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVUUklFVkVfV0lORE9XX0NPTlRFTlQiIHVpZD0ic2hlbGwiIC8+CiAgICAgPGFzc2lnbi1wZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfQUNUSVZJVFlfV0FUQ0hFUiIgdWlkPSJzaGVsbCIgLz4KICAgICA8YXNzaWduLXBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfSU5QVVRfU1RBVEUiIHVpZD0ic2hlbGwiIC8+CiAgICAgPGFzc2lnbi1wZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfT1JJRU5UQVRJT04iIHVpZD0ic2hlbGwiIC8+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy9kZWJ1Z2dpbmcvZGVidWdnaW5nLXVpLmpkIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvZGVidWdnaW5nL2RlYnVnZ2luZy11aS5qZAppbmRleCBkMmM0MmQ1Li4yMjc0OGJlIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy9kZWJ1Z2dpbmcvZGVidWdnaW5nLXVpLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL2RlYnVnZ2luZy9kZWJ1Z2dpbmctdWkuamQKQEAgLTMxLDEwICszMSwyOSBAQAogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+PGEgaHJlZj0iI2xheW91dG9wdCI+T3B0aW1pemluZyBMYXlvdXRzIHdpdGggPGNvZGU+bGF5b3V0b3B0PC9jb2RlPjwvYT48L2xpPgogICAgICAgPC9vbD4KKyAgICAgIDxoMj5SZWxhdGVkIHZpZGVvczwvaDI+CisgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICA8bGk+Cis8aWZyYW1lIHRpdGxlPSJIaWVyYXJjaHl2aWV3ZXIiIAorICAgIHdpZHRoPSIyNzIiIGhlaWdodD0iMjM0IiAKKyAgICBzcmM9Imh0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvUEFnRTdzYVFVVVk/cmVsPTAmYW1wO2hkPTEiIAorICAgIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4+Cis8L2lmcmFtZT4KKyAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpPgorPGlmcmFtZSB0aXRsZT0iUGl4ZWwgUGVyZmVjdCIgCisgICAgd2lkdGg9IjI3MiIgaGVpZ2h0PSIyMzQiIAorICAgIHNyYz0iaHR0cDovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9DNDViTVpHZE43WT9yZWw9MCZhbXA7aGQ9MSIgCisgICAgZnJhbWVib3JkZXI9IjAiIAorICAgIGFsbG93ZnVsbHNjcmVlbj4KKzwvaWZyYW1lPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgIDwvb2w+CiAgICAgPC9kaXY+CiAgIDwvZGl2PgogCi0gIDxwPlNvbWV0aW1lcyB5b3VyIGFwcGxpY2F0aW9uJ3MgbGF5b3V0IGNhbiBzbG93IGRvd24geW91ciBhcHBsaWNhdGlvbi4KKyAgPHA+CitTb21ldGltZXMgeW91ciBhcHBsaWNhdGlvbidzIGxheW91dCBjYW4gc2xvdyBkb3duIHlvdXIgYXBwbGljYXRpb24uCiAgIFRvIGhlbHAgZGVidWcgaXNzdWVzIGluIHlvdXIgbGF5b3V0LCB0aGUgQW5kcm9pZCBTREsgcHJvdmlkZXMgdGhlIEhpZXJhcmNoeSBWaWV3ZXIgYW5kCiAgIDxjb2RlPmxheW91dG9wdDwvY29kZT4gdG9vbHMuCiAgIDwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5qZCBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5qZAppbmRleCBlODkxY2NkLi5hMTA5ZGM4IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmpkCkBAIC0zNSw0NSArMzUsOSBAQAogPC9kaXY+CiA8L2Rpdj4KIAotPCEtLSAKLTxwPkFuZHJvaWQgRGVidWcgQnJpZGdlIChhZGIpIGlzIGEgdmVyc2F0aWxlIHRvb2wgdGhhdCA8L2E+LiA8L3A+Ci0KLTxwPlNvbWUgb2Ygd2F5cyB5b3UgY2FuIHVzZSBhZGIgaW5jbHVkZTo8L3A+Ci0KLTx1bD4KLQotPC91bD4KLTxwPlRoZSBzZWN0aW9ucyBiZWxvdyBpbnRyb2R1Y2UgYWRiIGFuZCBkZXNjcmliZSBtYW55IG9mIGl0cyBjb21tb24gdXNlcy4gPC9wPgotCi08aDI+Q29udGVudHM8L2gyPgotPGRsPgotPGR0PjxhIGhyZWY9IiNvdmVydmlldyI+T3ZlcnZpZXc8L2E+PC9kdD4KLTxkdD48YSBocmVmPSIjaXNzdWluZ2NvbW1hbmRzIj5Jc3N1aW5nIGFkYiBDb21tYW5kczwvYT48L2R0PgotPGR0PjxhIGhyZWY9IiNkZXZpY2VzdGF0dXMiPlF1ZXJ5aW5nIGZvciBFbXVsYXRvci9EZXZpY2UgSW5zdGFuY2VzPC9hPjwvZHQ+Ci08ZHQ+PGEgaHJlZj0iI2RpcmVjdGluZ2NvbW1hbmRzIj5EaXJlY3RpbmcgQ29tbWFuZHMgdG8gYSBTcGVjaWZpYyBFbXVsYXRvci9EZXZpY2UgSW5zdGFuY2U8L2E+PC9kdD4KLTxkdD48YSBocmVmPSIjbW92ZSI+SW5zdGFsbGluZyBhbiBBcHBsaWNhdGlvbjwvYT48L2R0PgotPGR0PjxhIGhyZWY9IiNmb3J3YXJkcG9ydHMiPkZvcndhcmRpbmcgUG9ydHM8L2E+PC9kdD4KLTxkdD48YSBocmVmPSIjY29weWZpbGVzIj5Db3B5aW5nIEZpbGVzIHRvIG9yIGZyb20gYW4gRW11bGF0b3IvRGV2aWNlIEluc3RhbmNlPC9hPjwvZHQ+Ci08ZHQ+PGEgaHJlZj0iI2NvbW1hbmRzdW1tYXJ5Ij5MaXN0aW5nIG9mIGFkYiBDb21tYW5kcyA8L2E+PC9kdD4KLTxkdD48YSBocmVmPSIjc2hlbGxjb21tYW5kcyI+SXNzdWluZyBTaGVsbCBDb21tYW5kczwvYT48L2R0PgotICAgIDxkZD48YSBocmVmPSIjc3FsaXRlIj5FeGFtaW5pbmcgc3FsaXRlMyBEYXRhYmFzZXMgZnJvbSBhIFJlbW90ZSBTaGVsbDwvYT48L2RkPgotICAgIDxkZD48YSBocmVmPSIjbW9ua2V5Ij5VSS9BcHBsaWNhdGlvbiBFeGVyY2lzZXIgTW9ua2V5PC9hPjwvZGQ+Ci0JPGRkPjxhIGhyZWY9IiNvdGhlcnNoZWxsY29tbWFuZHMiPk90aGVyIFNoZWxsIENvbW1hbmRzPC9hPjwvZGQ+Ci08ZHQ+PGEgaHJlZj0iI2xvZ2NhdCI+RW5hYmxpbmcgbG9nY2F0IExvZ2dpbmc8L2E+IDwvZHQ+Ci0JPGRkPjxhIGhyZWY9IiN1c2luZ2xvZ2NhdCI+VXNpbmcgbG9nY2F0IENvbW1hbmRzPC9hPjwvZGQ+Ci0JPGRkPjxhIGhyZWY9IiNmaWx0ZXJpbmdvdXRwdXQiPkZpbHRlcmluZyBMb2cgT3V0cHV0PC9hPjwvZGQ+Ci0JPGRkPjxhIGhyZWY9IiNvdXRwdXRmb3JtYXQiPkNvbnRyb2xsaW5nIExvZyBPdXRwdXQgRm9ybWF0PC9hPjwvZGQ+Ci0JPGRkPjxhIGhyZWY9IiNhbHRlcm5hdGl2ZWJ1ZmZlcnMiPlZpZXdpbmcgQWx0ZXJuYXRpdmUgTG9nIEJ1ZmZlcnM8L2E+PC9kZD4KLQk8ZGQ+PGEgaHJlZj0iI3N0ZG91dCI+Vmlld2luZyBzdGRvdXQgYW5kIHN0ZGVycjwvYT48L2RkPgotCTxkZD48YSBocmVmPSIjbG9nY2F0b3B0aW9ucyI+TGlzdGluZyBvZiBsb2djYXQgQ29tbWFuZCBPcHRpb25zPC9hPjwvZGQ+Ci08ZHQ+PGEgaHJlZj0iI3N0b3BwaW5nIj5TdG9wcGluZyB0aGUgYWRiIFNlcnZlcjwvYT4gPC9kdD4KLTwvZGw+Ci0KLTxhIG5hbWU9Im92ZXJ2aWV3Ij48L2E+Ci0KLTxoMj5PdmVydmlldzwvaDI+Ci0tLT4KLTxwPkFuZHJvaWQgRGVidWcgQnJpZGdlIChhZGIpIGlzIGEgdmVyc2F0aWxlIHRvb2wgbGV0cyB5b3UgbWFuYWdlIHRoZSBzdGF0ZSBvZiBhbiBlbXVsYXRvciBpbnN0YW5jZSBvciBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLiBJdCBpcyBhIGNsaWVudC1zZXJ2ZXIgcHJvZ3JhbSB0aGF0IGluY2x1ZGVzIHRocmVlIGNvbXBvbmVudHM6IDwvcD4KKzxwPkFuZHJvaWQgRGVidWcgQnJpZGdlIChhZGIpIGlzIGEgdmVyc2F0aWxlIGNvbW1hbmQgbGluZSB0b29sIHRoYXQgbGV0cyB5b3UgY29tbXVuaWNhdGUgd2l0aCBhbgorZW11bGF0b3IgaW5zdGFuY2Ugb3IgY29ubmVjdGVkIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UuIEl0IGlzIGEgY2xpZW50LXNlcnZlciBwcm9ncmFtIHRoYXQgaW5jbHVkZXMKK3RocmVlIGNvbXBvbmVudHM6IDwvcD4KIAogPHVsPgogICA8bGk+QSBjbGllbnQsIHdoaWNoIHJ1bnMgb24geW91ciBkZXZlbG9wbWVudCBtYWNoaW5lLiBZb3UgY2FuIGludm9rZSBhIGNsaWVudCBmcm9tIGEgc2hlbGwgYnkgaXNzdWluZyBhbiBhZGIgY29tbWFuZC4gT3RoZXIgQW5kcm9pZCB0b29scyBzdWNoIGFzIHRoZSBBRFQgcGx1Z2luIGFuZCBERE1TIGFsc28gY3JlYXRlIGFkYiBjbGllbnRzLiA8L2xpPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9vcHRpbWl6aW5nLWZvci0zLjAuamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL29wdGltaXppbmctZm9yLTMuMC5qZAppbmRleCA1Y2Q1MTliLi5lOTY4MzcyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL29wdGltaXppbmctZm9yLTMuMC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL29wdGltaXppbmctZm9yLTMuMC5qZApAQCAtMjIsNiArMjIsMTQgQEAKIDwvbGk+CiA8L29sPgogCis8aDI+U2VlIGFsc288L2gyPgorCis8b2w+CisgIDxsaT48YQoraHJlZj0ie0Bkb2NSb290fXNkay9jb21wYXRpYmlsaXR5LWxpYnJhcnkuaHRtbCI+Q29tcGF0aWJpbGl0eSBMaWJyYXJ5PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvaW9zY2hlZC8iPkdvb2dsZSBJL08gQXBwIHNvdXJjZSBjb2RlPC9hPjwvbGk+Cis8L29sPgorCiA8L2Rpdj4KIDwvZGl2PgogCkBAIC0xNzIsNyArMTgwLDggQEAKIGFwcGxpY2F0aW9uIHdpbGwgbG9vayBhbmQgZmVlbCBjb25zaXN0ZW50IHdpdGggdGhlIHN5c3RlbSBhbmQgb3RoZXIgYXBwbGljYXRpb25zIHdoZW4gaXQgaXMKIGVuYWJsZWQuPC9wPgogICAgIDxwPkFkZGl0aW9uYWxseSwgd2hlbiBhbiBhY3Rpdml0eSB1c2VzIHRoZSBob2xvZ3JhcGhpYyB0aGVtZSwgdGhlIHN5c3RlbSBlbmFibGVzIHRoZSA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy91aS9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT4gZm9yIHRoZSBhY3Rpdml0eS4gVGhlIEFjdGlvbiBCYXIKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdWkvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+IGZvciB0aGUgYWN0aXZpdHkgYW5kIHJlbW92ZXMgdGhlCitPcHRpb25zIE1lbnUgYnV0dG9uIGluIHRoZSBzeXN0ZW0gYmFyLiBUaGUgQWN0aW9uIEJhcgogcmVwbGFjZXMgdGhlIHRyYWRpdGlvbmFsIHRpdGxlIGJhciBhdCB0aGUgdG9wIG9mIHRoZSBhY3Rpdml0eSB3aW5kb3cgYW5kIHByb3ZpZGVzIHRoZSB1c2VyIGFjY2VzcyB0bwogdGhlIGFjdGl2aXR5J3MgT3B0aW9ucyBNZW51LjwvcD4KICAgICAgIDwvbGk+CkBAIC0yMzMsMjcgKzI0MiwyNiBAQAogCiAKIAotCi0KIDxoMiBpZD0iVXBncmFkaW5nIj5VcGdyYWRpbmcgb3IgRGV2ZWxvcGluZyBhIE5ldyBBcHAgZm9yIFRhYmxldHM8L2gyPgogCiA8ZGl2IGNsYXNzPSJzaWRlYm94LXdyYXBwZXIiPgogPGRpdiBjbGFzcz0ic2lkZWJveCI+Ci0gIDxoMz5Vc2UgbmV3IEFQSXMgYW5kIHJlbWFpbiBiYWNrd2FyZC1jb21wYXRpYmxlPC9oMz4KKyAgPGgzPlVzZSB0aGUgQ29tcGF0aWJpbGl0eSBMaWJyYXJ5IHRvIHJlbWFpbiBiYWNrd2FyZC1jb21wYXRpYmxlPC9oMz4KIDxwPkl0IGlzIHBvc3NpYmxlIGZvciB5b3UgdG8gdXBncmFkZSB5b3VyIGFwcGxpY2F0aW9uIHdpdGggc29tZSBuZXcKIEFQSXMgPGVtPmFuZDwvZW0+IHJlbWFpbiBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgQW5kcm9pZC4gVXN1YWxseSwgdGhpcyByZXF1aXJlcyB0aGF0IHlvdQogdXNlIHRlY2huaXF1ZXMgc3VjaCBhcyByZWZsZWN0aW9uIHRvIGNoZWNrIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIGNlcnRhaW4gQVBJcyBhdCBydW50aW1lLiBIb3dldmVyLAogdG8gaGVscCB5b3UgYWRkIGZlYXR1cmVzIGZyb20gQW5kcm9pZCAzLjAgd2l0aG91dCByZXF1aXJpbmcgeW91IHRvIGNoYW5nZSB5b3VyIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCNtaW4iPntAY29kZSBhbmRyb2lkOm1pblNka1ZlcnNpb259PC9hPgotb3IgYnVpbGQgdGFyZ2V0LCB3ZSdyZSBwcm92aWRpbmcgYSBzdGF0aWMgbGlicmFyeSBjYWxsZWQgdGhlICJBbmRyb2lkIENvbXBhdGliaWxpdHkgcGFja2FnZSIKK29yIGJ1aWxkIHRhcmdldCwgd2UncmUgcHJvdmlkaW5nIGEgc3RhdGljIGxpYnJhcnkgY2FsbGVkIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fXNkay9jb21wYXRpYmlsaXR5LWxpYnJhcnkuaHRtbCI+Q29tcGF0aWJpbGl0eSBMaWJyYXJ5PC9hPgogKGRvd25sb2FkYWJsZSBmcm9tIHRoZSBBVkQgYW5kIFNESyBNYW5hZ2VyKS48L3A+CiA8cD5UaGlzIGxpYnJhcnkgaW5jbHVkZXMgQVBJcyBmb3IgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL2ZyYWdtZW50cy5odG1sIj5mcmFnbWVudHM8L2E+LCA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvbG9hZGVycy5odG1sIj5sb2FkZXJzPC9hPiwgYW5kIHNvbWUgdXBkYXRlZCBjbGFzc2VzLiBCeQogc2ltcGx5IGFkZGluZyB0aGlzIGxpYnJhcnkgdG8geW91ciBBbmRyb2lkIHByb2plY3QsIHlvdSBjYW4gdXNlIHRoZXNlIEFQSXMgaW4geW91ciBhcHBsaWNhdGlvbiBhbmQKLXJlbWFpbiBjb21wYXRpYmxlIHdpdGggQW5kcm9pZCAxLjYuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGJsb2cgcG9zdCwgPGEKLWhyZWY9Imh0dHA6Ly9hbmRyb2lkLWRldmVsb3BlcnMuYmxvZ3Nwb3QuY29tLzIwMTEvMDMvZnJhZ21lbnRzLWZvci1hbGwuaHRtbCI+RnJhZ21lbnRzIGZvcgotQWxsPC9hPi48L3A+CityZW1haW4gY29tcGF0aWJsZSB3aXRoIEFuZHJvaWQgMS42LiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGdldCB0aGUgbGlicmFyeSBhbmQgc3RhcnQKK3VzaW5nIGl0IGluIHlvdXIgYXBwbGljYXRpb24sIHNlZSB0aGUgPGEKK2hyZWY9IntAZG9jUm9vdH1zZGsvY29tcGF0aWJpbGl0eS1saWJyYXJ5Lmh0bWwiPkNvbXBhdGliaWxpdHkgTGlicmFyeTwvYT4gZG9jdW1lbnQuPC9wPgogPC9kaXY+CiA8L2Rpdj4KIApAQCAtMzgwLDcgKzM4OCw2IEBACiBocmVmPSJ7QGRvY1Jvb3R9c2RrL2FuZHJvaWQtMy4wLmh0bWwiPkFuZHJvaWQgMy4wIFBsYXRmb3JtPC9hPiBkb2N1bWVudC48L3A+CiAKIAotCiA8aDM+TG9vayBhdCBzb21lIHNhbXBsZXM8L2gzPgogCiA8cD5NYW55IG9mIHRoZSBuZXcgZmVhdHVyZXMgYW5kIEFQSXMgdGhhdCBhcmUgZGVzY3JpYmVkIGFib3ZlIGFuZCBpbiB0aGUgPGEKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL3NlcnZpY2VzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvc2VydmljZXMuamQKaW5kZXggYTlkZDMxNS4uNDY4YTQxNyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvc2VydmljZXMuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvc2VydmljZXMuamQKQEAgLTQ5LDYgKzQ5LDEzIEBACiAgICAgICBMb2NhbFNlcnZpY2V9PC9hPjwvbGk+CiA8L29sPgogCis8aDI+QXJ0aWNsZXM8L2gyPgorPG9sPgorICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9hcnRpY2xlcy9tdWx0aXRhc2tpbmctYW5kcm9pZC13YXkuaHRtbCI+TXVsdGl0YXNraW5nIHRoZSBBbmRyb2lkIFdheTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9hcnRpY2xlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGguaHRtbCI+U2VydmljZSBBUEkgY2hhbmdlcyBzdGFydGluZworICAgICAgd2l0aCBBbmRyb2lkIDIuMDwvYT48L2xpPgorPC9vbD4KKwogPGgyPlNlZSBhbHNvPC9oMj4KIDxvbD4KIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9ib3VuZC1zZXJ2aWNlcy5odG1sIj5Cb3VuZCBTZXJ2aWNlczwvYT48L2xpPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvdGFza3MtYW5kLWJhY2stc3RhY2suamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjay5qZAppbmRleCBmMjJlNWIyLi4wNzI0ODhjIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjay5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjay5qZApAQCAtMjcsNiArMjcsMTEgQEAKIDwvbGk+CiA8L29sPgogCis8aDI+QXJ0aWNsZXM8L2gyPgorPG9sPgorICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9hcnRpY2xlcy9tdWx0aXRhc2tpbmctYW5kcm9pZC13YXkuaHRtbCI+TXVsdGl0YXNraW5nIHRoZSBBbmRyb2lkIFdheTwvYT48L2xpPgorPC9vbD4KKwogPGgyPlNlZSBhbHNvPC9oMj4KIDxvbD4KICAgPGxpPjxhPjxhIGhyZWY9IntAZG9jUm9vdH12aWRlb3MvaW5kZXguaHRtbCN2PWZMNmdTZDR1Z1NJIj5BcHBsaWNhdGlvbiBMaWZlY3ljbGUgdmlkZW88L2E+PC9saT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZ3JhcGhpY3MvYW5pbWF0aW9uLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9ncmFwaGljcy9hbmltYXRpb24uamQKaW5kZXggZTEwYWIzZS4uMGIwMmVlNzYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZ3JhcGhpY3MvYW5pbWF0aW9uLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZ3JhcGhpY3MvYW5pbWF0aW9uLmpkCkBAIC04NjgsMTAgKzg2OCwyMiBAQAogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgYW5pbWF0b3JzLCBzZWUgdGhlIHNlY3Rpb25zIG9uIGFuaW1hdGluZyB3aXRoCiA8YSBocmVmPSIjdmFsdWUtYW5pbWF0b3IiPlZhbHVlQW5pbWF0b3I8L2E+IGFuZCA8YSBocmVmPSIjb2JqZWN0LWFuaW1hdG9yIj5PYmplY3RBbmltYXRvcjwvYT4KIAotICA8aDIgaWQ9ImRlY2xhcmluZy14bWwiPkRlY2xhcmluZyBBbmltYXRpb25zIGluIFhNTDwvaDI+CisKKzxoMiBpZD0iZGVjbGFyaW5nLXhtbCI+RGVjbGFyaW5nIEFuaW1hdGlvbnMgaW4gWE1MPC9oMj4KIAogICA8cD5UaGUgcHJvcGVydHkgYW5pbWF0aW9uIHN5c3RlbSBsZXRzIHlvdSBkZWNsYXJlIHByb3BlcnR5IGFuaW1hdGlvbnMgd2l0aCBYTUwgaW5zdGVhZCBvZiBkb2luZwotICBpdCBwcm9ncmFtbWF0aWNhbGx5LiBUaGUgZm9sbG93aW5nIEFuZHJvaWQgY2xhc3NlcyBoYXZlIFhNTCBkZWNsYXJhdGlvbiBzdXBwb3J0IHdpdGggdGhlCisgIGl0IHByb2dyYW1tYXRpY2FsbHkuIEJ5IGRlZmluaW5nIHlvdXIgYW5pbWF0aW9ucyBpbiBYTUwsIHlvdSBjYW4gZWFzaWx5IHJldXNlIHlvdXIgYW5pbWF0aW9ucworaW4gbXVsdGlwbGUgYWN0aXZpdGllcyBhbmQgbW9yZSBlYXNpbHkgZWRpdCB0aGUgYW5pbWF0aW9uIHNlcXVlbmNlLjwvcD4KKyAgCis8cD5UbyBkaXN0aW5ndWlzaCBhbmltYXRpb24gZmlsZXMgdGhhdCB1c2UgdGhlIG5ldyBwcm9wZXJ0eSBhbmltYXRpb24gQVBJcyBmcm9tIHRob3NlIHRoYXQgdXNlIHRoZQorbGVnYWN5IDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZ3JhcGhpY3Mvdmlldy1hbmltYXRpb24uaHRtbCI+dmlldyBhbmltYXRpb248L2E+IGZyYW1ld29yaywKK3N0YXJ0aW5nIHdpdGggQW5kcm9pZCAzLjEsIHlvdSBzaG91bGQgc2F2ZSB0aGUgWE1MIGZpbGVzIGZvciBwcm9wZXJ0eSBhbmltYXRpb25zIGluIHRoZSB7QGNvZGUKK3Jlcy9hbmltYXRvci99IGRpcmVjdG9yeSAoaW5zdGVhZCBvZiB7QGNvZGUgcmVzL2FuaW0vfSkuIFVzaW5nIHRoZSB7QGNvZGUgYW5pbWF0b3J9IGRpcmVjdG9yeSBuYW1lCitpcyBvcHRpb25hbCwgYnV0IG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGxheW91dCBlZGl0b3IgdG9vbHMgaW4gdGhlIEVjbGlwc2UgQURUIHBsdWdpbiAoQURUCisxMS4wLjArKSwgYmVjYXVzZSBBRFQgb25seSBzZWFyY2hlcyB0aGUge0Bjb2RlIHJlcy9hbmltYXRvci99IGRpcmVjdG9yeSBmb3IgcHJvcGVydHkgYW5pbWF0aW9uCityZXNvdXJjZXMuPC9wPgorCis8cD5UaGUgZm9sbG93aW5nIHByb3BlcnR5IGFuaW1hdGlvbiBjbGFzc2VzIGhhdmUgWE1MIGRlY2xhcmF0aW9uIHN1cHBvcnQgd2l0aCB0aGUKICAgZm9sbG93aW5nIFhNTCB0YWdzOjwvcD4KIAogICA8dWw+CkBAIC05MjQsMjIgKzkzNiwyNSBAQAogICAgIGJlZ2lubmluZyBlYWNoIHRpbWUuPC9kZD4KICAgPC9kbD4KIAotICA8cD5UaGUgPGNvZGU+b2JqZWN0QW5pbWF0b3I8L2NvZGU+ICh7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3J9KSBlbGVtZW50IGhhcyB0aGUKLSAgYWRkaXRpb25hbCBhdHRyaWJ1dGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiwgdGhhdCBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICBiZWluZyBhbmltYXRlZC4gVGhlIDxjb2RlPm9iamVjdEFuaW1hdG9yPC9jb2RlPiBlbGVtZW50IGRvZXMgbm90IGV4cG9zZSBhIDxjb2RlPnRhcmdldDwvY29kZT4KKyAgPHA+VGhlIDxjb2RlPiZsdDtvYmplY3RBbmltYXRvciZndDs8L2NvZGU+ICh7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3J9KSBlbGVtZW50IGhhcyB0aGUKKyAgYWRkaXRpb25hbCBhdHRyaWJ1dGUgPGNvZGU+YW5kcm9pZDpwcm9wZXJ0eU5hbWU8L2NvZGU+LCB0aGF0IGxldHMgeW91IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlCitwcm9wZXJ0eQorICBiZWluZyBhbmltYXRlZC4gVGhlIDxjb2RlPiZsdDtvYmplY3RBbmltYXRvciZndDs8L2NvZGU+IGVsZW1lbnQgZG9lcyBub3QgZXhwb3NlIGEgPGNvZGU+dGFyZ2V0PC9jb2RlPgogICBhdHRyaWJ1dGUsIGhvd2V2ZXIsIHNvIHlvdSBjYW5ub3Qgc2V0IHRoZSBvYmplY3QgdG8gYW5pbWF0ZSBpbiB0aGUgWE1MIGRlY2xhcmF0aW9uLiBZb3UgaGF2ZSB0bwogICBpbmZsYXRlIHRoZSBYTUwgcmVzb3VyY2UgYnkgY2FsbGluZyB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JJbmZsYXRlciNsb2FkQW5pbWF0b3IKICAgbG9hZEFuaW1hdG9yKCl9IGFuZCBjYWxsIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciNzZXRUYXJnZXQgc2V0VGFyZ2V0KCl9IHRvIHNldAogICB0aGUgdGFyZ2V0IG9iamVjdCB1bmxpa2UgdGhlIHVuZGVybHlpbmcge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yfSwKICAgYmVmb3JlIGNhbGxpbmcge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yI3N0YXJ0IHN0YXJ0KCl9LjwvcD4KIAotICA8cD5UaGUgPGNvZGU+c2V0PC9jb2RlPiBlbGVtZW50ICh7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JTZXR9KSBleHBvc2VzIGEgc2luZ2xlCi0gIGF0dHJpYnV0ZSwgPGNvZGU+b3JkZXJpbmc8L2NvZGU+LiBTZXQgdGhpcyBhdHRyaWJ1dGUgdG8gPGNvZGU+dG9nZXRoZXI8L2NvZGU+IChkZWZhdWx0KSB0byBwbGF5Ci0gIGFsbCB0aGUgYW5pbWF0aW9ucyBpbiB0aGlzIHNldCBhdCBvbmNlLiBTZXQgdGhpcyBhdHRyaWJ1dGUgdG8gPGNvZGU+c2VxdWVudGlhbGx5PC9jb2RlPiB0byBwbGF5CisgIDxwPlRoZSA8Y29kZT4mbHQ7c2V0Jmd0OzwvY29kZT4gZWxlbWVudCAoe0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0fSkgZXhwb3NlcyBhIHNpbmdsZQorICBhdHRyaWJ1dGUsIDxjb2RlPmFuZHJvaWQ6b3JkZXJpbmc8L2NvZGU+LiBTZXQgdGhpcyBhdHRyaWJ1dGUgdG8gPGNvZGU+InRvZ2V0aGVyIjwvY29kZT4gKGRlZmF1bHQpCit0byBwbGF5CisgIGFsbCB0aGUgYW5pbWF0aW9ucyBpbiB0aGlzIHNldCBhdCBvbmNlLiBTZXQgdGhpcyBhdHRyaWJ1dGUgdG8gPGNvZGU+InNlcXVlbnRpYWxseSI8L2NvZGU+IHRvIHBsYXkKICAgdGhlIGFuaW1hdGlvbnMgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLjwvcD4KIAotICA8cD5Zb3UgY2FuIHNwZWNpZnkgbmVzdGVkIDxjb2RlPnNldDwvY29kZT4gdGFncyB0byBmdXJ0aGVyIGdyb3VwIGFuaW1hdGlvbnMgdG9nZXRoZXIuIFRoZQotICBhbmltYXRpb25zIHRoYXQgeW91IHdhbnQgdG8gZ3JvdXAgdG9nZXRoZXIgc2hvdWxkIGJlIGNoaWxkcmVuIG9mIHRoZSA8Y29kZT5zZXQ8L2NvZGU+IHRhZyBhbmQgY2FuCisgIDxwPllvdSBjYW4gc3BlY2lmeSBuZXN0ZWQgPGNvZGU+Jmx0O3NldCZndDs8L2NvZGU+IGVsZW1lbnRzIHRvIGZ1cnRoZXIgZ3JvdXAgYW5pbWF0aW9ucyB0b2dldGhlci4KK1RoZQorICBhbmltYXRpb25zIHRoYXQgeW91IHdhbnQgdG8gZ3JvdXAgdG9nZXRoZXIgc2hvdWxkIGJlIGNoaWxkcmVuIG9mIHRoZSA8Y29kZT4mbHQ7c2V0Jmd0OzwvY29kZT4gdGFnIGFuZCBjYW4KICAgZGVmaW5lIHRoZWlyIG93biA8Y29kZT5vcmRlcmluZzwvY29kZT4gYXR0cmlidXRlLjwvcD4KIAogICA8cD5BcyBhbiBleGFtcGxlLCB0aGlzIFhNTCBjb2RlIGNyZWF0ZXMgYW4ge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0fSBvYmplY3QgdGhhdApAQCAtOTY5LDQgKzk4NCw5IEBACiAgIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0fSBvYmplY3QsIGFuZCB0aGVuIHNldCB0aGUgdGFyZ2V0IG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgYW5pbWF0aW9ucwogICBiZWZvcmUgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBzZXQuIENhbGxpbmcge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0I3NldFRhcmdldAogICBzZXRUYXJnZXQoKX0gc2V0cyBhIHNpbmdsZSB0YXJnZXQgb2JqZWN0IGZvciBhbGwgY2hpbGRyZW4gb2YgdGhlIHtAbGluawotICBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldH0uPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JTZXR9LjwvcD4KKworPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+VGlwOjwvc3Ryb25nPiBUbyBzZWUgaG93IHRoZSBBRFQgbGF5b3V0IGVkaXRvciBhbGxvd3MgeW91IHRvIGRldmVsb3AgYW5kCitwcmV2aWV3IGFuaW1hdGlvbnMgaW4geW91ciBsYXlvdXQsIHdhdGNoIHRoZSA8YQoraHJlZj0iaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PU9xMDVLcWpYVHZzJmZlYXR1cmU9cGxheWVyX2RldGFpbHBhZ2UjdD0xNzA5cyI+QW5kcm9pZAorRGV2ZWxvcGVyIFRvb2xzIHNlc3Npb248L2E+IGZyb20gR29vZ2xlIEkvTyAnMTE8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9wcm92aWRpbmctcmVzb3VyY2VzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvcHJvdmlkaW5nLXJlc291cmNlcy5qZAppbmRleCAzMjU5NWEwLi41OWYyZTczIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9wcm92aWRpbmctcmVzb3VyY2VzLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuamQKQEAgLTg4LDkgKzg4LDE4IEBACiAgIDwvdHI+CiAKICAgPHRyPgorICAgIDx0ZD48Y29kZT5hbmltYXRvci88L2NvZGU+PC90ZD4KKyAgICA8dGQ+WE1MIGZpbGVzIHRoYXQgZGVmaW5lIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZ3JhcGhpY3MvYW5pbWF0aW9uLmh0bWwiPnByb3BlcnR5CithbmltYXRpb25zPC9hPi48L3RkPgorICA8L3RyPgorCisgIDx0cj4KICAgICA8dGQ+PGNvZGU+YW5pbS88L2NvZGU+PC90ZD4KLSAgICA8dGQ+WE1MIGZpbGVzIHRoYXQgZGVmaW5lIHR3ZWVuIGFuaW1hdGlvbnMuIFNlZSA8YQotaHJlZj0iYW5pbWF0aW9uLXJlc291cmNlLmh0bWwiPkFuaW1hdGlvbiBSZXNvdXJjZXM8L2E+LjwvdGQ+CisgICAgPHRkPlhNTCBmaWxlcyB0aGF0IGRlZmluZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9ncmFwaGljcy92aWV3LWFuaW1hdGlvbi5odG1sI3R3ZWVuLWFuaW1hdGlvbiI+dHdlZW4KK2FuaW1hdGlvbnM8L2E+LiAoUHJvcGVydHkgYW5pbWF0aW9ucyBjYW4gYWxzbyBiZSBzYXZlZCBpbiB0aGlzIGRpcmVjdG9yeSwgYnV0Cit0aGUge0Bjb2RlIGFuaW1hdG9yL30gZGlyZWN0b3J5IGlzIHByZWZlcnJlZCBmb3IgcHJvcGVydHkgYW5pbWF0aW9ucyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28KK3R5cGVzLik8L3RkPgogICA8L3RyPgogCiAgIDx0cj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvYWN0aW9uYmFyLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9hY3Rpb25iYXIuamQKaW5kZXggN2UxMzU2OS4uNmYxMmI5NSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9hY3Rpb25iYXIuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9hY3Rpb25iYXIuamQKQEAgLTE4NCw3ICsxODQsNyBAQAogPHByZT4KICZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8mZ3Q7CiAmbHQ7bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgICZsdDtpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvbWVudV9hZGQiCisgICAgJmx0O2l0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZW51X3NhdmUiCiAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9zYXZlIgogICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVudV9zYXZlIgogICAgICAgICAgIDxiPmFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJpZlJvb218d2l0aFRleHQiPC9iPiAvJmd0OwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91c2IvaW5kZXguamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VzYi9pbmRleC5qZAppbmRleCAxOGFmMDZhLi4zZTJhMThiIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VzYi9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VzYi9pbmRleC5qZApAQCAtNiw5ICs2LDkgQEAKICAgICAgIDxoMj5Ub3BpY3M8L2gyPgogCiAgICAgICA8b2w+Ci0gICAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9L2d1aWRlL3RvcGljcy9VU0IvYWNjZXNzb3J5LmpkIj5VU0IgQWNjZXNzb3J5PC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL1VTQi9hY2Nlc3NvcnkuamQiPlVTQiBBY2Nlc3Nvcnk8L2E+PC9saT4KIAotICAgICAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fS9ndWlkZS90b3BpY3MvVVNCL2hvc3QuamQiPlVTQiBIb3N0PC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL1VTQi9ob3N0LmpkIj5VU0IgSG9zdDwvYT48L2xpPgogICAgICAgPC9vbD4KICAgICA8L2Rpdj4KICAgPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2ltYWdlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGhfcnVubmluZ3NlcnZpY2VzLnBuZyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvaW1hZ2VzL3NlcnZpY2UtYXBpLWNoYW5nZXMtc3RhcnRpbmctd2l0aF9ydW5uaW5nc2VydmljZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNTlmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2ltYWdlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGhfcnVubmluZ3NlcnZpY2VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2ltYWdlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGhfc3RvcHNlcnZpY2UucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9pbWFnZXMvc2VydmljZS1hcGktY2hhbmdlcy1zdGFydGluZy13aXRoX3N0b3BzZXJ2aWNlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzhmMGEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9pbWFnZXMvc2VydmljZS1hcGktY2hhbmdlcy1zdGFydGluZy13aXRoX3N0b3BzZXJ2aWNlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL211bHRpdGFza2luZy1hbmRyb2lkLXdheS5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvbXVsdGl0YXNraW5nLWFuZHJvaWQtd2F5LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzg2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL211bHRpdGFza2luZy1hbmRyb2lkLXdheS5qZApAQCAtMCwwICsxLDEwMyBAQAorcGFnZS50aXRsZT1NdWx0aXRhc2tpbmcgdGhlIEFuZHJvaWQgV2F5CitwYXJlbnQudGl0bGU9QXJ0aWNsZXMKK3BhcmVudC5saW5rPS4uL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZQorQGpkOmJvZHkKKworPGRpdiBpZD0icXYtd3JhcHBlciI+Cis8ZGl2IGlkPSJxdiI+CisKKyAgPGgyPlNlZSBhbHNvPC9oMj4KKyAgPG9sPgorICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjay5odG1sIj5UYXNrcyBhbmQgQmFjayBTdGFjazwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9zZXJ2aWNlcy5odG1sIj5TZXJ2aWNlczwvYT48L2xpPgorICA8L29sPgorCisgIDxoMj5LZXkgY2xhc3NlczwvaDI+CisgIDxvbD4KKyAgICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9PC9saT4KKyAgICA8bGk+e0BsaW5rIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcn08L2xpPgorICA8L29sPgorCis8L2Rpdj4KKzwvZGl2PgorCis8cD5BbmRyb2lkIGlzIGZhaXJseSB1bmlxdWUgaW4gdGhlIHdheXMgaXQgYWxsb3dzIG11bHRpcGxlIGFwcGxpY2F0aW9ucyB0byBydW4gYXQgdGhlIHNhbWUgdGltZS4gIERldmVsb3BlcnMgY29taW5nIGZyb20gYSBkaWZmZXJlbnQgcGxhdGZvcm0gbWF5IGZpbmQgdGhlIHdheSBpdCBvcGVyYXRlcyBzdXJwcmlzaW5nLiAgVW5kZXJzdGFuZGluZyBpdHMgYmVoYXZpb3IgaXMgaW1wb3J0YW50IGZvciBkZXNpZ25pbmcgYXBwbGljYXRpb25zIHRoYXQgd2lsbCB3b3JrIHdlbGwgYW5kIGludGVncmF0ZSBzZWFtbGVzc2x5IHdpdGggdGhlIHJlc3Qgb2YgdGhlIEFuZHJvaWQgcGxhdGZvcm0uICBUaGlzIGFydGljbGUgY292ZXJzIHRoZSByZWFzb25zIGZvciBBbmRyb2lkJ3MgbXVsdGl0YXNraW5nIGRlc2lnbiwgaXRzIGltcGFjdCBvbiBob3cgYXBwbGljYXRpb25zIHdvcmssIGFuZCBob3cgeW91IGNhbiBiZXN0IHRha2UgYWR2YW50YWdlIG9mIEFuZHJvaWQncyB1bmlxdWUgZmVhdHVyZXMuPC9wPgorPGgzPkRlc2lnbiBjb25zaWRlcmF0aW9uczwvaDM+Cis8cD5Nb2JpbGUgZGV2aWNlcyBoYXZlIHRlY2huaWNhbCBsaW1pdGF0aW9ucyBhbmQgdXNlciBleHBlcmllbmNlIHJlcXVpcmVtZW50cyBub3QgcHJlc2VudCBpbiBkZXNrdG9wIG9yIHdlYiBzeXN0ZW1zLiAgSGVyZSBhcmUgdGhlIGZvdXIga2V5IGNvbnN0cmFpbnRzIHdlIHdlcmUgd29ya2luZyB1bmRlciBhcyB3ZSBkZXNpZ25lZCBBbmRyb2lkJ3MgbXVsdGl0YXNraW5nOjwvcD4KKzx1bD4KKyAgPGxpPgorICAgIDxwPldlIGRpZCBub3Qgd2FudCB0byByZXF1aXJlIHRoYXQgdXNlcnMgY2xvc2UgYXBwbGljYXRpb25zIHdoZW4gImRvbmUiIHdpdGggdGhlbS4gIFN1Y2ggYSB1c2FnZSBwYXR0ZXJuIGRvZXMgbm90IHdvcmsgd2VsbCBpbiBhIG1vYmlsZSBlbnZpcm9ubWVudCwgd2hlcmUgdXNhZ2UgdGVuZHMgdG8gaW52b2x2ZSByZXBlYXRlZCBicmllZiBjb250YWN0IHdpdGggYSB3aWRlIHZhcmlldHkgb2YgYXBwbGljYXRpb25zIHRocm91Z2hvdXQgdGhlIGRheS48L3A+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8cD5Nb2JpbGUgZGV2aWNlcyBkb24ndCBoYXZlIHRoZSBsdXh1cnkgb2Ygc3dhcCBzcGFjZSwgc28gaGF2ZSBmYWlybHkgaGFyZCBsaW1pdHMgb24gbWVtb3J5IHVzZS4gIFJvYmVydCBMb3ZlIGhhcyA8YSBocmVmPSJodHRwOi8vYmxvZy5ybG92ZS5vcmcvMjAxMC8wNC93aHktaXBhZC1hbmQtaXBob25lLWRvbnQtc3VwcG9ydC5odG1sIj5hIHZlcnkgZ29vZCBhcnRpY2xlPC9hPiBjb3ZlcmluZyB0aGUgdG9waWMuPC9wPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+QXBwbGljYXRpb24gc3dpdGNoaW5nIG9uIGEgbW9iaWxlIGRldmljZSBpcyBleHRyZW1lbHkgY3JpdGljYWw7IHdlIHRhcmdldCBzaWduaWZpY2FudGx5IGxlc3MgdGhhbiAxIHNlY29uZCB0byBsYXVuY2ggYSBuZXcgYXBwbGljYXRpb24uICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4gdGhlIHVzZXIgaXMgc3dpdGNoaW5nIGJldHdlZW4gYSBmZXcgYXBwbGljYXRpb25zLCBzdWNoIGFzIHN3aXRjaGluZyB0byBsb29rIGF0IGEgbmV3IFNNUyBtZXNzYWdlIHdoaWxlIHdhdGNoaW5nIGEgdmlkZW8sIGFuZCB0aGVuIHJldHVybmluZyB0byB0aGF0IHZpZGVvLiAgQSBub3RpY2VhYmxlIHdhaXQgaW4gc3VjaCBzaXR1YXRpb25zIHdpbGwgcXVpY2tseSBtYWtlIHVzZXJzIGhhdGUgeW91LjwvcD4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPlRoZSBhdmFpbGFibGUgQVBJcyBtdXN0IGJlIHN1ZmZpY2llbnQgZm9yIHdyaXRpbmcgdGhlIGJ1aWx0LWluIEdvb2dsZSBhcHBsaWNhdGlvbnMsIGFzIHBhcnQgb2Ygb3VyICJhbGwgYXBwbGljYXRpb25zIGFyZSBjcmVhdGVkIGVxdWFsIiBwaGlsb3NvcGh5LiAgVGhpcyBtZWFucyBiYWNrZ3JvdW5kIG11c2ljIHBsYXliYWNrLCBkYXRhIHN5bmNpbmcsIEdQUyBuYXZpZ2F0aW9uLCBhbmQgYXBwbGljYXRpb24gZG93bmxvYWRpbmcgbXVzdCBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoZSBzYW1lIEFQSXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoaXJkIHBhcnR5IGRldmVsb3BlcnMuPC9wPgorICA8L2xpPgorPC91bD4KKzxwPlRoZSBmaXJzdCB0d28gcmVxdWlyZW1lbnRzIGhpZ2hsaWdodCBhbiBpbnRlcmVzdGluZyBjb25mbGljdC4gIFdlIGRvbid0IHdhbnQgdXNlcnMgdG8gd29ycnkgYWJvdXQgY2xvc2luZyB0aGVpciBhcHBzLCBidXQgcmF0aGVyIG1ha2UgaXQgYXBwZWFyIHRoYXQgYWxsIG9mIHRoZSBhcHBsaWNhdGlvbnMgYXJlIGFsd2F5cyBydW5uaW5nLiAgQXQgdGhlIHNhbWUgdGltZSwgbW9iaWxlIGRldmljZXMgaGF2ZSBoYXJkIGxpbWl0cyBvbiBtZW1vcnkgdXNlLCBzbyB0aGF0IGEgc3lzdGVtIHdpbGwgZGVncmFkZSBvciBldmVuIHN0YXJ0IGZhaWxpbmcgdmVyeSBxdWlja2x5IGFzIGl0IG5lZWRzIG1vcmUgUkFNIHRoYW4gaXMgYXZhaWxhYmxlOyBhIGRlc2t0b3AgY29tcHV0ZXIsIHdpdGggc3dhcCwgaW4gY29udHJhc3Qgd2lsbCBzaW1wbHkgc3RhcnQgc2xvd2luZyBkb3duIGFzIGl0IG5lZWRzIHRvIHBhZ2UgUkFNIHRvIGl0cyBzd2FwIHNwYWNlLiAgVGhlc2UgY29tcGV0aW5nIGNvbnN0cmFpbnRzIHdlcmUgYSBrZXkgbW90aXZhdGlvbiBmb3IgQW5kcm9pZCdzIGRlc2lnbi48L3A+Cis8aDM+V2hlbiBkb2VzIGFuIGFwcGxpY2F0aW9uICJzdG9wIj88L2gzPgorPHA+QSBjb21tb24gbWlzdW5kZXJzdGFuZGluZyBhYm91dCBBbmRyb2lkIG11bHRpdGFza2luZyBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgcHJvY2VzcyBhbmQgYW4gYXBwbGljYXRpb24uICBJbiBBbmRyb2lkIHRoZXNlIGFyZSBub3QgdGlnaHRseSBjb3VwbGVkIGVudGl0aWVzOiBhcHBsaWNhdGlvbnMgbWF5IHNlZW0gcHJlc2VudCB0byB0aGUgdXNlciB3aXRob3V0IGFuIGFjdHVhbCBwcm9jZXNzIGN1cnJlbnRseSBydW5uaW5nIHRoZSBhcHA7IG11bHRpcGxlIGFwcGxpY2F0aW9ucyBtYXkgc2hhcmUgcHJvY2Vzc2VzLCBvciBvbmUgYXBwbGljYXRpb24gbWF5IG1ha2UgdXNlIG9mIG11bHRpcGxlIHByb2Nlc3NlcyBkZXBlbmRpbmcgb24gaXRzIG5lZWRzOyB0aGUgcHJvY2Vzcyhlcykgb2YgYW4gYXBwbGljYXRpb24gbWF5IGJlIGtlcHQgYXJvdW5kIGJ5IEFuZHJvaWQgZXZlbiB3aGVuIHRoYXQgYXBwbGljYXRpb24gaXMgbm90IGFjdGl2ZWx5IGRvaW5nIHNvbWV0aGluZy48L3A+Cis8cD5UaGUgZmFjdCB0aGF0IHlvdSBjYW4gc2VlIGFuIGFwcGxpY2F0aW9uJ3MgcHJvY2VzcyAicnVubmluZyIgZG9lcyBub3QgbWVhbiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBvciBkb2luZyBhbnl0aGluZy4gIEl0IG1heSBzaW1wbHkgYmUgdGhlcmUgYmVjYXVzZSBBbmRyb2lkIG5lZWRlZCBpdCBhdCBzb21lIHBvaW50LCBhbmQgaGFzIGRlY2lkZWQgdGhhdCBpdCB3b3VsZCBiZSBiZXN0IHRvIGtlZXAgaXQgYXJvdW5kIGluIGNhc2UgaXQgbmVlZHMgaXQgYWdhaW4uICBMaWtld2lzZSwgeW91IG1heSBsZWF2ZSBhbiBhcHBsaWNhdGlvbiBmb3IgYSBsaXR0bGUgYml0IGFuZCByZXR1cm4gdG8gaXQgZnJvbSB3aGVyZSB5b3UgbGVmdCBvZmYsIGFuZCBkdXJpbmcgdGhhdCB0aW1lIEFuZHJvaWQgbWF5IGhhdmUgbmVlZGVkIHRvIGdldCByaWQgb2YgdGhlIHByb2Nlc3MgZm9yIG90aGVyIHRoaW5ncy48L3A+Cis8cD5BIGtleSB0byBob3cgQW5kcm9pZCBoYW5kbGVzIGFwcGxpY2F0aW9ucyBpbiB0aGlzIHdheSBpcyB0aGF0IHByb2Nlc3NlcyBkb24ndCBzaHV0IGRvd24gY2xlYW5seS4gIFdoZW4gdGhlIHVzZXIgbGVhdmVzIGFuIGFwcGxpY2F0aW9uLCBpdHMgcHJvY2VzcyBpcyBrZXB0IGFyb3VuZCBpbiB0aGUgYmFja2dyb3VuZCwgYWxsb3dpbmcgaXQgdG8gY29udGludWUgd29ya2luZyAoZm9yIGV4YW1wbGUgZG93bmxvYWRpbmcgd2ViIHBhZ2VzKSBpZiBuZWVkZWQsIGFuZCBjb21lIGltbWVkaWF0ZWx5IHRvIHRoZSBmb3JlZ3JvdW5kIGlmIHRoZSB1c2VyIHJldHVybnMgdG8gaXQuICBJZiBhIGRldmljZSBuZXZlciBydW5zIG91dCBvZiBtZW1vcnksIHRoZW4gQW5kcm9pZCB3aWxsIGtlZXAgYWxsIG9mIHRoZXNlIHByb2Nlc3NlcyBhcm91bmQsIHRydWx5IGxlYXZpbmcgYWxsIGFwcGxpY2F0aW9ucyAicnVubmluZyIgYWxsIG9mIHRoZSB0aW1lLjwvcD4KKzxwPk9mIGNvdXJzZSwgdGhlcmUgaXMgYSBsaW1pdGVkIGFtb3VudCBvZiBtZW1vcnksIGFuZCB0byBhY2NvbW1vZGF0ZSB0aGlzIEFuZHJvaWQgbXVzdCBkZWNpZGUgd2hlbiB0byBnZXQgcmlkIG9mIHByb2Nlc3NlcyB0aGF0IGFyZSBub3QgbmVlZGVkLiAgVGhpcyBsZWFkcyB0byBBbmRyb2lkJ3MgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuaHRtbCNwcm9jbGlmZSI+cHJvY2VzcyBsaWZlY3ljbGU8L2E+LCB0aGUgcnVsZXMgaXQgdXNlcyB0byBkZWNpZGUgaG93IGltcG9ydGFudCBlYWNoIHByb2Nlc3MgaXMgYW5kIHRodXMgdGhlIG5leHQgb25lIHRoYXQgc2hvdWxkIGJlIGRyb3BwZWQuICBUaGVzZSBydWxlcyBhcmUgYmFzZWQgb24gYm90aCBob3cgaW1wb3J0YW50IGEgcHJvY2VzcyBpcyBmb3IgdGhlIHVzZXIncyBjdXJyZW50IGV4cGVyaWVuY2UsIGFzIHdlbGwgYXMgaG93IGxvbmcgaXQgaGFzIGJlZW4gc2luY2UgdGhlIHByb2Nlc3Mgd2FzIGxhc3QgbmVlZGVkIGJ5IHRoZSB1c2VyLjwvcD4KKzxwPk9uY2UgQW5kcm9pZCBkZXRlcm1pbmVzIHRoYXQgaXQgbmVlZHMgdG8gcmVtb3ZlIGEgcHJvY2VzcywgaXQgZG9lcyB0aGlzIGJydXRhbGx5LCBzaW1wbHkgZm9yY2Uta2lsbGluZyBpdC4gIFRoZSBrZXJuZWwgY2FuIHRoZW4gaW1tZWRpYXRlbHkgcmVjbGFpbSBhbGwgcmVzb3VyY2VzIG5lZWRlZCBieSB0aGUgcHJvY2Vzcywgd2l0aG91dCByZWx5aW5nIG9uIHRoYXQgYXBwbGljYXRpb24gYmVpbmcgd2VsbCB3cml0dGVuIGFuZCByZXNwb25zaXZlIHRvIGEgcG9saXRlIHJlcXVlc3QgdG8gZXhpdC4gIEFsbG93aW5nIHRoZSBrZXJuZWwgdG8gaW1tZWRpYXRlbHkgcmVjbGFpbSBhcHBsaWNhdGlvbiByZXNvdXJjZXMgbWFrZXMgaXQgYSBsb3QgZWFzaWVyIHRvIGF2b2lkIHNlcmlvdXMgb3V0IG9mIG1lbW9yeSBzaXR1YXRpb25zLjwvcD4KKzxwPklmIGEgdXNlciBsYXRlciByZXR1cm5zIHRvIGFuIGFwcGxpY2F0aW9uIHRoYXQncyBiZWVuIGtpbGxlZCwgQW5kcm9pZCBuZWVkcyBhIHdheSB0byByZS1sYXVuY2ggaXQgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaXQgd2FzIGxhc3Qgc2VlbiwgdG8gcHJlc2VydmUgdGhlICJhbGwgYXBwbGljYXRpb25zIGFyZSBydW5uaW5nIGFsbCBvZiB0aGUgdGltZSIgZXhwZXJpZW5jZS4gIFRoaXMgaXMgZG9uZSBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBwYXJ0cyBvZiB0aGUgYXBwbGljYXRpb24gdGhlIHVzZXIgaXMgYXdhcmUgb2YgKHRoZSBBY3Rpdml0aWVzKSwgYW5kIHJlLXN0YXJ0aW5nIHRoZW0gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBzdGF0ZSB0aGV5IHdlcmUgc2VlbiBpbi4gIFRoaXMgbGFzdCBzdGF0ZSBpcyBnZW5lcmF0ZWQgZWFjaCB0aW1lIHRoZSB1c2VyIGxlYXZlcyB0aGF0IHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uLCBub3Qgd2hlbiBpdCBpcyBraWxsZWQsIHNvIHRoYXQgdGhlIGtlcm5lbCBjYW4gbGF0ZXIgZnJlZWx5IGtpbGwgaXQgd2l0aG91dCBkZXBlbmRpbmcgb24gdGhlIGFwcGxpY2F0aW9uIHRvIHJlc3BvbmQgY29ycmVjdGx5IGF0IHRoYXQgcG9pbnQuPC9wPgorPHA+SW4gc29tZSB3YXlzLCBBbmRyb2lkJ3MgcHJvY2VzcyBtYW5hZ2VtZW50IGNhbiBiZSBzZWVuIGFzIGEgZm9ybSBvZiBzd2FwIHNwYWNlOiBhcHBsaWNhdGlvbiBwcm9jZXNzZXMgcmVwcmVzZW50IGEgY2VydGFpbiBhbW91bnQgb2YgaW4tdXNlIG1lbW9yeTsgd2hlbiBtZW1vcnkgaXMgbG93LCBzb21lIHByb2Nlc3NlcyBjYW4gYmUga2lsbGVkIChzd2FwcGVkIG91dCk7IHdoZW4gdGhvc2UgcHJvY2Vzc2VzIGFyZSBuZWVkZWQgYWdhaW4sIHRoZXkgY2FuIGJlIHJlLXN0YXJ0ZWQgZnJvbSB0aGVpciBsYXN0IHNhdmVkIHN0YXRlIChzd2FwcGVkIGluKS48L3A+Cis8aDM+RXhwbGljaXRseSBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kPC9oMz4KKzxwPlNvIGZhciwgd2UgaGF2ZSBhIHdheSBmb3IgYXBwbGljYXRpb25zIHRvIGltcGxpY2l0bHkgZG8gd29yayBpbiB0aGUgYmFja2dyb3VuZCwgYXMgbG9uZyBhcyB0aGUgcHJvY2VzcyBkb2Vzbid0IGdldCBraWxsZWQgYnkgQW5kcm9pZCBhcyBwYXJ0IG9mIGl0cyByZWd1bGFyIG1lbW9yeSBtYW5hZ2VtZW50LiAgVGhpcyBpcyBmaW5lIGZvciB0aGluZ3MgbGlrZSBsb2FkaW5nIHdlYiBwYWdlcyBpbiB0aGUgYmFja2dyb3VuZCwgYnV0IHdoYXQgYWJvdXQgZmVhdHVyZXMgd2l0aCBoYXJkZXIgcmVxdWlyZW1lbnRzPyAgQmFja2dyb3VuZCBtdXNpYyBwbGF5YmFjaywgZGF0YSBzeW5jaHJvbml6YXRpb24sIGxvY2F0aW9uIHRyYWNraW5nLCBhbGFybSBjbG9ja3MsIGV0Yy48L3A+Cis8cC8+Cis8cD5Gb3IgdGhlc2UgdGFza3MsIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyBhIHdheSB0byB0ZWxsIEFuZHJvaWQgIkkgd291bGQgZXhwbGljaXRseSBsaWtlIHRvIHJ1biBhdCB0aGlzIHBvaW50LiIgIFRoZXJlIGFyZSB0d28gbWFpbiBmYWNpbGl0aWVzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgZm9yIHRoaXMsIHJlcHJlc2VudGVkIGJ5IHR3byBraW5kcyBvZiBjb21wb25lbnRzIHRoZXkgY2FuIHB1Ymxpc2ggaW4gdGhlaXIgbWFuaWZlc3Q6IDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOml0YWxpYzsiPmJyb2FkY2FzdCByZWNlaXZlcnM8L3NwYW4+IGFuZCA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTppdGFsaWM7Ij5zZXJ2aWNlczwvc3Bhbj4uPC9wPgorPGg0PkJyb2FkY2FzdCBSZWNlaXZlcnM8L2g0PgorPHA+QSBCcm9hZGNhc3RSZWNlaXZlciBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcnVuLCBmb3IgYSBicmllZiBhbW91bnQgb2YgdGltZSwgaW4gdGhlIGJhY2tncm91bmQgYXMgYSByZXN1bHQgb2Ygc29tZXRoaW5nIGVsc2UgaGFwcGVuaW5nLiAgSXQgY2FuIGJlIHVzZWQgaW4gbWFueSB3YXlzIHRvIGJ1aWxkIGhpZ2hlci1sZXZlbCBmYWNpbGl0aWVzOiBmb3IgZXhhbXBsZSB0aGUgQWxhcm1NYW5hZ2VyIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBoYXZlIGEgYnJvYWRjYXN0IHNlbnQgYXQgYSBjZXJ0YWluIHRpbWUgaW4gdGhlIGZ1dHVyZSwgYW5kIHRoZSBMb2NhdGlvbk1hbmFnZXIgY2FuIHNlbmQgYSBicm9hZGNhc3Qgd2hlbiBpdCBkZXRlY3RzIGludGVyZXN0aW5nIGNoYW5nZXMgaW4gbG9jYXRpb24uICBCZWNhdXNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWNlaXZlciBpcyBwYXJ0IG9mIGFuIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QsIEFuZHJvaWQgY2FuIGZpbmQgYW5kIGxhdW5jaCB0aGUgYXBwbGljYXRpb24gZXZlbiBpZiBpdCBpc24ndCBydW5uaW5nOyBvZiBjb3Vyc2UgaWYgaXQgYWxyZWFkeSBoYXMgaXRzIHByb2Nlc3MgYXZhaWxhYmxlIGluIHRoZSBiYWNrZ3JvdW5kLCB0aGUgYnJvYWRjYXN0IGNhbiB2ZXJ5IGVmZmljaWVudGx5IGJlIGRpcmVjdGx5IGRpc3BhdGNoZWQgdG8gaXQuPC9wPgorPHA+V2hlbiBoYW5kbGluZyBhIGJyb2FkY2FzdCwgdGhlIGFwcGxpY2F0aW9uIGlzIGdpdmVuIGEgZml4ZWQgc2V0IG9mIHRpbWUgKGN1cnJlbnRseSAxMCBzZWNvbmRzKSBpbiB3aGljaCB0byBkbyBpdHMgd29yay4gIElmIGl0IGRvZXNuJ3QgY29tcGxldGUgaW4gdGhhdCB0aW1lLCB0aGUgYXBwbGljYXRpb24gaXMgY29uc2lkZXJlZCB0byBiZSBtaXNiZWhhdmluZywgYW5kIGl0cyBwcm9jZXNzIGltbWVkaWF0ZWx5IHRvc3NlZCBpbnRvIHRoZSBiYWNrZ3JvdW5kIHN0YXRlIHRvIGJlIGtpbGxlZCBmb3IgbWVtb3J5IGlmIG5lZWRlZC48L3A+Cis8cD5Ccm9hZGNhc3QgcmVjZWl2ZXJzIGFyZSBncmVhdCBmb3IgZG9pbmcgc21hbGwgcGllY2VzIG9mIHdvcmsgaW4gcmVzcG9uc2UgdG8gYW4gZXh0ZXJuYWwgc3RpbXVsdXMsIHN1Y2ggYXMgcG9zdGluZyBhIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlciBhZnRlciBiZWluZyBzZW50IGEgbmV3IEdQUyBsb2NhdGlvbiByZXBvcnQuICBUaGV5IGFyZSB2ZXJ5IGxpZ2h0d2VpZ2h0LCBzaW5jZSB0aGUgYXBwbGljYXRpb24ncyBwcm9jZXNzIG9ubHkgbmVlZHMgdG8gYmUgYXJvdW5kIHdoaWxlIGFjdGl2ZWx5IHJlY2VpdmluZyB0aGUgYnJvYWRjYXN0LiAgQmVjYXVzZSB0aGV5IGFyZSBhY3RpdmUgZm9yIGEgZGV0ZXJtaW5pc3RpYyBhbW91bnQgb2YgdGltZSwgZmFpcmx5IHN0cm9uZyBndWFyYW50ZWVzIGNhbiBiZSBtYWRlIGFib3V0IG5vdCBraWxsaW5nIHRoZWlyIHByb2Nlc3Mgd2hpbGUgcnVubmluZy4gIEhvd2V2ZXIgdGhleSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBhbnl0aGluZyBvZiBpbmRldGVybWluYXRlIGxlbmd0aCwgc3VjaCBhcyBuZXR3b3JraW5nLjwvcD4KKzxoND5TZXJ2aWNlczwvaDQ+Cis8cD5BIFNlcnZpY2UgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGltcGxlbWVudCBsb25nZXItcnVubmluZyBiYWNrZ3JvdW5kIG9wZXJhdGlvbnMuICBUaGVyZSBhcmUgYWN0dWFsbHkgYSBsb3Qgb2Ygb3RoZXIgZnVuY3Rpb25zIHRoYXQgc2VydmljZXMgcHJvdmlkZSwgYnV0IGZvciB0aGUgZGlzY3Vzc2lvbiBoZXJlIHRoZWlyIGZ1bmRhbWVudGFsIHB1cnBvc2UgaXMgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIHNheSAiaGV5IEkgd291bGQgbGlrZSB0byBjb250aW51ZSBydW5uaW5nIGV2ZW4gd2hpbGUgaW4gdGhlIGJhY2tncm91bmQsIHVudGlsIEkgc2F5IEkgYW0gZG9uZS4iICBBbiBhcHBsaWNhdGlvbiBjb250cm9scyB3aGVuIGl0cyBzZXJ2aWNlIHJ1bnMgYnkgZXhwbGljaXRseSBzdGFydGluZyBhbmQgc3RvcHBpbmcgdGhlIHNlcnZpY2UuPC9wPgorPHA+V2hpbGUgc2VydmljZXMgZG8gcHJvdmlkZSBhIHJpY2ggY2xpZW50LXNlcnZlciBtb2RlbCwgaXRzIHVzZSBpcyBvcHRpb25hbC4gIFVwb24gc3RhcnRpbmcgYW4gYXBwbGljYXRpb24ncyBzZXJ2aWNlcywgQW5kcm9pZCBzaW1wbHkgaW5zdGFudGlhdGVzIHRoZSBjb21wb25lbnQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgcHJvY2VzcyB0byBwcm92aWRlIGl0cyBjb250ZXh0LiAgSG93IGl0IGlzIHVzZWQgYWZ0ZXIgdGhhdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb246IGl0IGNhbiBwdXQgYWxsIG9mIHRoZSBuZWVkZWQgY29kZSBpbnNpZGUgb2YgdGhlIHNlcnZpY2UgaXRzZWxmIHdpdGhvdXQgaW50ZXJhY3Rpbmcgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUgYXBwbGljYXRpb24sIG1ha2UgY2FsbHMgb24gb3RoZXIgc2luZ2xldG9uIG9iamVjdHMgc2hhcmVkIHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIGFwcCwgZGlyZWN0bHkgcmV0cmlldmUgdGhlIFNlcnZpY2UgaW5zdGFuY2UgZnJvbSBlbHNld2hlcmUgaWYgbmVlZGVkLCBvciBydW4gaXQgaW4gYW5vdGhlciBwcm9jZXNzIGFuZCBkbyBhIGZ1bGwtYmxvd24gUlBDIHByb3RvY29sIGlmIHRoYXQgaXMgZGVzaXJlZC48L3A+Cis8cD5Qcm9jZXNzIG1hbmFnZW1lbnQgZm9yIHNlcnZpY2VzIGlzIGRpZmZlcmVudCB0aGFuIGJyb2FkY2FzdCByZWNlaXZlcnMsIGJlY2F1c2UgYW4gdW5ib3VuZGVkIG51bWJlciBvZiBzZXJ2aWNlcyBjYW4gYXNrIHRvIGJlIHJ1bm5pbmcgZm9yIGFuIHVua25vd24gYW1vdW50IG9mIHRpbWUuICBUaGVyZSBtYXkgbm90IGJlIGVub3VnaCBSQU0gdG8gaGF2ZSBhbGwgb2YgdGhlIHJlcXVlc3Rpbmcgc2VydmljZXMgcnVuLCBzbyBhcyBhIHJlc3VsdCBubyBzdHJvbmcgZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCBiZWluZyBhYmxlIHRvIGtlZXAgdGhlbSBydW5uaW5nLjwvcD4KKzxwPklmIHRoZXJlIGlzIHRvbyBsaXR0bGUgUkFNLCBwcm9jZXNzZXMgaG9zdGluZyBzZXJ2aWNlcyB3aWxsIGJlIGltbWVkaWF0ZWx5IGtpbGxlZCBsaWtlIGJhY2tncm91bmQgcHJvY2Vzc2VzIGFyZS4gIEhvd2V2ZXIsIGlmIGFwcHJvcHJpYXRlLCBBbmRyb2lkIHdpbGwgcmVtZW1iZXIgdGhhdCB0aGVzZSBzZXJ2aWNlcyB3aXNoIHRvIHJlbWFpbiBydW5uaW5nLCBhbmQgcmVzdGFydCB0aGVpciBwcm9jZXNzIGF0IGEgbGF0ZXIgdGltZSB3aGVuIG1vcmUgUkFNIGlzIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgdXNlciBnb2VzIHRvIGEgd2ViIHBhZ2UgdGhhdCByZXF1aXJlcyBsYXJnZSBhbW91bnRzIG9mIFJBTSwgQW5kcm9pZCBtYXkga2lsbCBiYWNrZ3JvdW5kIHNlcnZpY2UgcHJvY2Vzc2VzIGxpa2Ugc3luYyB1bnRpbCB0aGUgYnJvd3NlcidzIG1lbW9yeSBuZWVkcyBnbyBkb3duLjwvcD4KKzxwPlNlcnZpY2VzIGNhbiBmdXJ0aGVyIG5lZ290aWF0ZSB0aGlzIGJlaGF2aW9yIGJ5IHJlcXVlc3RpbmcgdGhleSBiZSBjb25zaWRlcmVkICJmb3JlZ3JvdW5kLiIgIFRoaXMgcGxhY2VzIHRoZSBzZXJ2aWNlIGluIGEgInBsZWFzZSBkb24ndCBraWxsIiBzdGF0ZSwgYnV0IHJlcXVpcmVzIHRoYXQgaXQgaW5jbHVkZSBhIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlciBhYm91dCBpdCBhY3RpdmVseSBydW5uaW5nLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHNlcnZpY2VzIHN1Y2ggYXMgYmFja2dyb3VuZCBtdXNpYyBwbGF5YmFjayBvciBjYXIgbmF2aWdhdGlvbiwgd2hpY2ggdGhlIHVzZXIgaXMgYWN0aXZlbHkgYXdhcmUgb2Y7IHdoZW4geW91J3JlIHBsYXlpbmcgbXVzaWMgYW5kIHVzaW5nIHRoZSBicm93c2VyLCB5b3UgY2FuIGFsd2F5cyBzZWUgdGhlIG11c2ljLXBsYXlpbmcgZ2x5cGggaW4gdGhlIHN0YXR1cyBiYXIuICBBbmRyb2lkIHdvbid0IHRyeSB0byBraWxsIHRoZXNlIHNlcnZpY2VzLCBidXQgYXMgYSB0cmFkZS1vZmYsIGVuc3VyZXMgdGhlIHVzZXIga25vd3MgYWJvdXQgdGhlbSBhbmQgaXMgYWJsZSB0byBleHBsaWNpdGx5IHN0b3AgdGhlbSB3aGVuIGRlc2lyZWQuPC9wPgorPGgzPlRoZSB2YWx1ZSBvZiBnZW5lcmljIGNvbXBvbmVudHM8L2gzPgorPHA+QW5kcm9pZCdzIGdlbmVyaWMgYnJvYWRjYXN0IHJlY2VpdmVyIGFuZCBzZXJ2aWNlIGNvbXBvbmVudHMgYWxsb3cgZGV2ZWxvcGVycyB0byBjcmVhdGUgYSB3aWRlIHZhcmlldHkgb2YgZWZmaWNpZW50IGJhY2tncm91bmQgb3BlcmF0aW9ucywgaW5jbHVkaW5nIHRoaW5ncyB0aGF0IHdlcmUgbmV2ZXIgb3JpZ2luYWxseSBjb25zaWRlcmVkLiAgSW4gQW5kcm9pZCAxLjAgdGhleSB3ZXJlIHVzZWQgdG8gaW1wbGVtZW50IG5lYXJseSBhbGwgb2YgdGhlIGJhY2tncm91bmQgYmVoYXZpb3IgdGhhdCB0aGUgYnVpbHQtaW4gYW5kIHByb3ByaWV0YXJ5IEdvb2dsZSBhcHBzIHByb3ZpZGVkOjwvcD4KKzx1bD4KKyAgPGxpPgorICAgIE11c2ljIHBsYXliYWNrIHJ1bnMgaW4gYSBzZXJ2aWNlIHRvIGFsbG93IGl0IHRvIGNvbnRpbnVlIG9wZXJhdGluZyBhZnRlciB0aGUgdXNlciBsZWF2ZXMgdGhlIG11c2ljIGFwcGxpY2F0aW9uLgorICA8L2xpPgorICA8bGk+CisgICAgVGhlIGFsYXJtIGNsb2NrIHNjaGVkdWxlcyBhIGJyb2FkY2FzdCByZWNlaXZlciB3aXRoIHRoZSBhbGFybSBtYW5hZ2VyLCB0byBnbyBvZmYgYXQgdGhlIG5leHQgc2V0IGFsYXJtIHRpbWUuCisgIDwvbGk+CisgIDxsaT4KKyAgICBUaGUgY2FsZW5kYXIgYXBwbGljYXRpb24gbGlrZXdpc2Ugc2NoZWR1bGVzIGFuIGFsYXJtIHRvIGRpc3BsYXkgb3IgdXBkYXRlIGl0cyBub3RpZmljYXRpb24gYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgZm9yIHRoZSBuZXh0IGNhbGVuZGFyIGV2ZW50LgorICA8L2xpPgorICA8bGk+CisgICAgQmFja2dyb3VuZCBmaWxlIGRvd25sb2FkIGlzIGltcGxlbWVudGVkIGEgc2VydmljZSB0aGF0IHJ1bnMgd2hlbiB0aGVyZSBhcmUgYW55IGRvd25sb2FkcyB0byBwcm9jZXNzLgorICA8L2xpPgorICA8bGk+CisgICAgVGhlIGUtbWFpbCBhcHBsaWNhdGlvbiBzY2hlZHVsZXMgYW4gYWxhcm0gdG8gd2FrZSB1cCBhIHNlcnZpY2UgYXQgcmVndWxhciBpbnRlcnZhbHMgdGhhdCBsb29rcyBmb3IgYW5kIHJldHJpZXZlcyBhbnkgbmV3IG1haWwuCisgIDwvbGk+CisgIDxsaT4KKyAgICBUaGUgR29vZ2xlIGFwcGxpY2F0aW9ucyBtYWludGFpbiBhIHNlcnZpY2UgdG8gcmVjZWl2ZSBwdXNoIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgbmV0d29yazsgaXQgaW4gdHVybiBzZW5kcyBicm9hZGNhc3RzIHRvIGluZGl2aWR1YWwgYXBwcyB3aGVuIGl0IGlzIHRvbGQgdGhhdCB0aGV5IG5lZWQgdG8gZG8gdGhpbmdzIGxpa2Ugc3luY2hyb25pemUgY29udGFjdHMuPC9wPgorICA8L2xpPgorPC91bD4KKzxwPkFzIHRoZSBwbGF0Zm9ybSBoYXMgZXZvbHZlZCwgdGhlc2Ugc2FtZSBiYXNpYyBjb21wb25lbnRzIGhhdmUgYmVlbiB1c2VkIHRvIGltcGxlbWVudCBtYW55IG9mIHRoZSBtYWpvciBuZXcgZGV2ZWxvcGVyIGZlYXR1cmVzOgorPHVsPgorICA8bGk+CisgICAgSW5wdXQgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgYnkgZGV2ZWxvcGVycyBhcyBhIFNlcnZpY2UgY29tcG9uZW50IHRoYXQgQW5kcm9pZCBtYW5hZ2VzIGFuZCB3b3JrcyB3aXRoIHRvIGRpc3BsYXkgYXMgdGhlIGN1cnJlbnQgSU1FLgorICA8L2xpPgorICA8bGk+CisgICAgQXBwbGljYXRpb24gd2lkZ2V0cyBhcmUgYnJvYWRjYXN0IHJlY2VpdmVycyB0aGF0IEFuZHJvaWQgc2VuZHMgYnJvYWRjYXN0cyB0byB3aGVuIGl0IG5lZWRzIHRvIGludGVyYWN0IHdpdGggdGhlbS4gIFRoaXMgYWxsb3dzIGFwcCB3aWRnZXRzIHRvIGJlIHF1aXRlIGxpZ2h0d2VpZ2h0LCBieSBub3QgbmVlZGluZyB0aGVpciBhcHBsaWNhdGlvbidzIHByb2Nlc3MgcmVtYWluIHJ1bm5pbmcuCisgIDwvbGk+CisgIDxsaT4KKyAgICBBY2Nlc3NpYmlsaXR5IGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZCBhcyBzZXJ2aWNlcyB0aGF0IEFuZHJvaWQga2VlcHMgcnVubmluZyB3aGlsZSBpbiB1c2UgYW5kIHNlbmRzIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIHRvIGFib3V0IHVzZXIgaW50ZXJhY3Rpb25zLgorICA8L2xpPgorICA8bGk+CisgICAgU3luYyBhZGFwdGVycyBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMi4wIGFyZSBzZXJ2aWNlcyB0aGF0IGFyZSBydW4gaW4gdGhlIGJhY2tncm91bmQgd2hlbiBhIHBhcnRpY3VsYXIgZGF0YSBzeW5jIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4KKyAgPC9saT4KKyAgPGxpPgorICAgIExpdmUgd2FsbHBhcGVycyBhcmUgYSBzZXJ2aWNlIHN0YXJ0ZWQgYnkgQW5kcm9pZCB3aGVuIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgorICA8L2xpPgorPC91bD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvc2VydmljZS1hcGktY2hhbmdlcy1zdGFydGluZy13aXRoLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGguamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhZmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvc2VydmljZS1hcGktY2hhbmdlcy1zdGFydGluZy13aXRoLmpkCkBAIC0wLDAgKzEsMTc3IEBACitwYWdlLnRpdGxlPVNlcnZpY2UgQVBJIGNoYW5nZXMgc3RhcnRpbmcgd2l0aCBBbmRyb2lkIDIuMAorcGFyZW50LnRpdGxlPUFydGljbGVzCitwYXJlbnQubGluaz0uLi9icm93c2VyLmh0bWw/dGFnPWFydGljbGUKK0BqZDpib2R5CisKKworPGRpdiBpZD0icXYtd3JhcHBlciI+Cis8ZGl2IGlkPSJxdiI+CisKKyAgPGgyPlNlZSBhbHNvPC9oMj4KKyAgPG9sPgorICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9zZXJ2aWNlcy5odG1sIj5TZXJ2aWNlczwvYT48L2xpPgorICA8L29sPgorCisgIDxoMj5LZXkgY2xhc3NlczwvaDI+CisgIDxvbD4KKyAgICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9PC9saT4KKyAgPC9vbD4KKworPC9kaXY+Cis8L2Rpdj4KKworPHA+V2F0Y2hpbmcgZGV2ZWxvcGVycyB1c2UgdGhlIEFuZHJvaWQgcGxhdGZvcm0gdGhlIGxhc3QgeWVhciBoYXMgc2hvd24gYSBudW1iZXIgb2YgdHJvdWJsZSBhcmVhcyBpbiB0aGUgU2VydmljZSBBUEkgYXMgd2VsbCBhcyBncm93aW5nIGlzc3VlcyBpbiB0aGUgd2F5cyBzZXJ2aWNlcyBvcGVyYXRlLiBBcyBhIHJlc3VsdCwgQW5kcm9pZCAyLjAgaW50cm9kdWNlZCBhIG51bWJlciBvZiBjaGFuZ2VzIGFuZCBpbXByb3ZlbWVudHMgaW4gdGhpcyBhcmVhIGZvciBib3RoIGRldmVsb3BlcnMgYW5kIHVzZXJzLjwvcD4KKzxwPlRoZSB0aHJlZSBtYWluIGNoYW5nZXMgdG8gYmUgYXdhcmUgb2YgYXJlOjwvcD4KKzx1bD4KKyAgPGxpPlNlcnZpY2Uuc2V0Rm9yZWdyb3VuZCgpIGlzIG5vdyBkZXByZWNhdGVkIGFuZCBpbiAyLjAgZG9lcyBub3RoaW5nLjwvbGk+CisgIDxsaT5UaGVyZSB3ZXJlIG1hbnkgZWRnZSBjYXNlcyBpbiB0aGUgc2VydmljZSBsaWZlY3ljbGUgdGhhdCBtYWRlIGl0IHZlcnkgZWFzeSB0byBhY2NpZGVudGFsbHkgbGVhdmUgYSBzZXJ2aWNlIHJ1bm5pbmc7IG5ldyBBUElzIGluIDIuMCBtYWtlIHRoaXMgbXVjaCBlYXNpZXIgdG8gZGVhbCB3aXRoLjwvbGk+CisgIDxsaT5BbmRyb2lkIDIuMCBhbHNvIGludHJvZHVjZXMgYSBuZXcgVUkgZm9yIGVuZCB1c2VycyB0byBtb25pdG9yIGFuZCBtYW5hZ2UgdGhlIHJ1bm5pbmcgc2VydmljZXMgb24gdGhlaXIgZGV2aWNlLjwvbGk+Cis8L3VsPgorPGgzPkJhY2tncm91bmQgb24gc2VydmljZXM8L2gzPgorPHA+QmVmb3JlIGdvaW5nIGludG8gdGhlIGRldGFpbHMgb2YgMi4wLCBpdCBtYXkgYmUgdXNlZnVsIHRvIGdvIG92ZXIgYSBxdWljayBzdW1tYXJ5IG9mIHNlcnZpY2VzLiBUaGUgU2VydmljZSBBUEkgaW4gQW5kcm9pZCBpcyBvbmUgb2YgdGhlIGtleSBtZWNoYW5pc21zIGZvciBhcHBsaWNhdGlvbnMgdG8gZG8gd29yayBpbiB0aGUgYmFja2dyb3VuZC4gRHVlIHRvIHRoZSB3YXkgQW5kcm9pZCBpcyBkZXNpZ25lZCwgb25jZSBhbiBhcHBsaWNhdGlvbiBpcyBubyBsb25nZXIgdmlzaWJsZSB0byB0aGUgdXNlciBpdCBpcyBnZW5lcmFsbHkgY29uc2lkZXJlZCBleHBlbmRhYmxlIGFuZCBhIGNhbmRpZGF0ZSB0byBiZSBraWxsZWQgYnkgdGhlIHN5c3RlbSBpZiBpdCBldmVyIG5lZWRzIG1lbW9yeSBlbHNld2hlcmUuIFRoZSBtYWluIHdheSBhcHBsaWNhdGlvbnMgZ2V0IGFyb3VuZCB0aGlzIGlzIGJ5IHN0YXJ0aW5nIGEgU2VydmljZSBjb21wb25lbnQsIHdoaWNoIGV4cGxpY2l0bHkgdGVsbHMgdGhlIHN5c3RlbSB0aGF0IHRoZXkgYXJlIGRvaW5nIHNvbWUgdmFsdWFibGUgd29yayBhbmQgd291bGQgcHJlZmVyIHRoYXQgdGhlIHN5c3RlbSBub3Qga2lsbCB0aGVpciBwcm9jZXNzIGlmIGl0IGRvZXNuJ3QgdHJ1bHkgbmVlZCB0by48L3A+Cis8cD5UaGlzIGlzIGEgdmVyeSBwb3dlcmZ1bCBmYWNpbGl0eSBidXQgYWxvbmcgd2l0aCB0aGF0IHBvd2VyIGNvbWVzIHNvbWUgcmVzcG9uc2liaWxpdHk6IGFuIGFjdGl2ZWx5IHJ1bm5pbmcgc2VydmljZSBpcyB0YWtpbmcgcmVzb3VyY2VzIGF3YXkgZnJvbSBvdGhlciB0aGluZ3MgdGhhdCBjYW4gcnVuIChpbmNsdWRpbmcgaW5hY3RpdmUgcHJvY2Vzc2VzIGluIHRoZSBiYWNrZ3JvdW5kIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBpbml0aWFsaXplZCB0aGUgbmV4dCB0aW1lIHRoZSB1c2VyIHZpc2l0cyB0aGVtKS4gSXQgaXMgdGh1cyBpbXBvcnRhbnQgdGhhdCBkZXZlbG9wZXJzIHRha2UgY2FyZSB3aGVuIGRlc2lnbmluZyB0aGVpciBzZXJ2aWNlcyB0aGF0IHRoZXkgb25seSBydW4gd2hlbiB0cnVseSBuZWVkZWQgYW5kIGF2b2lkIGFueSBidWdzIHdoZXJlIHRoZXkgbWF5IGFjY2lkZW50YWxseSBsZWF2ZSB0aGUgc2VydmljZSBydW5uaW5nIGZvciBsb25nIGR1cmF0aW9ucy48L3A+Cis8aDM+UmVkZXNpZ25pbmcgU2VydmljZS5zZXRGb3JlZ3JvdW5kKCk8L2gzPgorPHA+RHVyaW5nIHRoZSBmaW5hbCBzdGFiaWxpemF0aW9uIHBlcmlvZCBvZiBBbmRyb2lkIDEuNiB3ZSBzdGFydGVkIHRvIHNlZSBtb3JlIGlzc3VlcyBkdWUgdG8gYW4gaW5jcmVhc2luZyBudW1iZXIgb2YgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBTZXJ2aWNlLnNldEZvcmVncm91bmQoKSBBUEkgd2hlbiB0aGV5IHNob3VsZG4ndCBiZS4gVGhpcyBpcyBhbiBBUEkgdGhhdCB3ZSBoYXZlbid0IGFkdmVydGlzZWQgbXVjaCBiZWNhdXNlIGl0IHNob3VsZCBub3QgYmUgdXNlZCBieSBtb3N0IGFwcGxpY2F0aW9ucyBhbmQgY2FuIGJlIHZlcnkgaGFyZCBvbiB0aGUgc3lzdGVtOiBpdCBhc2tzIHRoYXQgdGhlIHNlcnZpY2UncyBwcm9jZXNzIGJlIHRyZWF0ZWQgYXMgaW4gdGhlIGZvcmVncm91bmQsIGVzc2VudGlhbGx5IG1ha2luZyBpdCB1bmtpbGxhYmxlIGFuZCB0aHVzIG1vcmUgZGlmZmljdWx0IGZvciB0aGUgc3lzdGVtIHRvIHJlY292ZXIgZnJvbSBsb3cgbWVtb3J5IHNpdHVhdGlvbnMuPC9wPgorPHA+QXQgdGhhdCBwb2ludCBpbiAxLjYgaXQgd2FzIHRvbyBsYXRlIHRvIG1ha2UgYW55IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIGJlaGF2aW9yIGhlcmUsIGJ1dCBpbiAyLjAgd2UgaGF2ZSBkb25lIHNvOiBTZXJ2aWNlLnNldEZvcmVncm91bmQoKSBub3cgZG9lcyBub3RoaW5nLiBUaGUgQVBJIHdhcyBhbHdheXMgaW50ZW5kZWQgdG8gYmUgc29tZXRoaW5nIGEgc2VydmljZSB3b3VsZCBkbyBpbiBjb25qdW5jdGlvbiB3aXRoIHB1dHRpbmcgdXAgYW4gb25nb2luZyBub3RpZmljYXRpb24gZm9yIHRoZSB1c2VyOyBieSBzYXlpbmcgeW91IGFyZSBpbiB0aGUgZm9yZWdyb3VuZCwgdGhlIHVzZXIgc2hvdWxkIGJlICJhd2FyZSIgdGhhdCB0aGUgc2VydmljZSBpcyBydW5uaW5nIGluIHNvbWUgd2F5IGFuZCBrbm93IGhvdyB0byBzdG9wIGl0LiBUaHVzIGluIHBsYWNlIG9mIHRoZSBvbGQgQVBJIEFuZHJpb2QgMi4wIGludHJvZHVjZXMgdHdvIG5ldyBBUElzIHRoYXQgcmVxdWlyZSBhIG5vdGlmaWNhdGlvbiBnbyBhbG9uZyB3aXRoIGJlaW5nIGluIHRoZSBmb3JlZ3JvdW5kOjwvcD4KKzxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KK3B1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0Rm9yZWdyb3VuZChpbnQgaWQsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pOworcHVibGljIGZpbmFsIHZvaWQgc3RvcEZvcmVncm91bmQoYm9vbGVhbiByZW1vdmVOb3RpZmljYXRpb24pOworPC9wcmU+Cis8cD5UaGlzIGFsc28gbm90IGNvaW5jaWRlbnRhbGx5IG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIG1hbmFnZSB0aGUgbm90aWZpY2F0aW9uIHN0YXRlIGFsb25nIHdpdGggdGhlIHNlcnZpY2UsIHNpbmNlIHRoZSBzeXN0ZW0gY2FuIG5vdyBndWFyYW50ZWUgdGhhdCB0aGVyZSBpcyBhbHdheXMgYSBub3RpZmljYXRpb24gd2hpbGUgdGhlIHNlcnZpY2UgaXMgaW4gdGhlIGZvcmVncm91bmQsIGFuZCB0aGF0IHRoZSBub3RpZmljYXRpb24gZ29lcyBhd2F5IHdoZW5ldmVyIHRoZSBzZXJ2aWNlIGRvZXMuPC9wPgorPHA+TWFueSBkZXZlbG9wZXJzIHdpbGwgd2FudCB0byB3cml0ZSBhIHNlcnZpY2UgdGhhdCB3b3JrcyBvbiBvbGRlciBwbGF0Zm9ybXMgYXMgd2VsbCBhcyAyLjAgYW5kIGxhdGVyOyB0aGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBjb2RlIHRvIHNlbGVjdGl2ZWx5IGNhbGwgdGhlIG5ldyBBUElzIHdoZW4gdGhleSBhcmUgYXZhaWxhYmxlLjwvcD4KKzxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KK3ByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gbVN0YXJ0Rm9yZWdyb3VuZFNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKKyAgICBpbnQuY2xhc3MsIE5vdGlmaWNhdGlvbi5jbGFzc307Citwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIG1TdG9wRm9yZWdyb3VuZFNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKKyAgICBib29sZWFuLmNsYXNzfTsKKworcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIG1OTTsKK3ByaXZhdGUgTWV0aG9kIG1TdGFydEZvcmVncm91bmQ7Citwcml2YXRlIE1ldGhvZCBtU3RvcEZvcmVncm91bmQ7Citwcml2YXRlIE9iamVjdFtdIG1TdGFydEZvcmVncm91bmRBcmdzID0gbmV3IE9iamVjdFsyXTsKK3ByaXZhdGUgT2JqZWN0W10gbVN0b3BGb3JlZ3JvdW5kQXJncyA9IG5ldyBPYmplY3RbMV07CisKKyYjNjQ7T3ZlcnJpZGUKK3B1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgIG1OTSA9IChOb3RpZmljYXRpb25NYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOworICAgIHRyeSB7CisgICAgICAgIG1TdGFydEZvcmVncm91bmQgPSBnZXRDbGFzcygpLmdldE1ldGhvZCgic3RhcnRGb3JlZ3JvdW5kIiwKKyAgICAgICAgICAgICAgICBtU3RhcnRGb3JlZ3JvdW5kU2lnbmF0dXJlKTsKKyAgICAgICAgbVN0b3BGb3JlZ3JvdW5kID0gZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInN0b3BGb3JlZ3JvdW5kIiwKKyAgICAgICAgICAgICAgICBtU3RvcEZvcmVncm91bmRTaWduYXR1cmUpOworICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFJ1bm5pbmcgb24gYW4gb2xkZXIgcGxhdGZvcm0uCisgICAgICAgIG1TdGFydEZvcmVncm91bmQgPSBtU3RvcEZvcmVncm91bmQgPSBudWxsOworICAgIH0KK30KKworLyoqCisgKiBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIG5ldyBzdGFydEZvcmVncm91bmQgbWV0aG9kLCB1c2luZyB0aGUgb2xkZXIKKyAqIEFQSXMgaWYgaXQgaXMgbm90IGF2YWlsYWJsZS4KKyAqLwordm9pZCBzdGFydEZvcmVncm91bmRDb21wYXQoaW50IGlkLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgLy8gSWYgd2UgaGF2ZSB0aGUgbmV3IHN0YXJ0Rm9yZWdyb3VuZCBBUEksIHRoZW4gdXNlIGl0LgorICAgIGlmIChtU3RhcnRGb3JlZ3JvdW5kICE9IG51bGwpIHsKKyAgICAgICAgbVN0YXJ0Rm9yZWdyb3VuZEFyZ3NbMF0gPSBJbnRlZ2VyLnZhbHVlT2YoaWQpOworICAgICAgICBtU3RhcnRGb3JlZ3JvdW5kQXJnc1sxXSA9IG5vdGlmaWNhdGlvbjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TdGFydEZvcmVncm91bmQuaW52b2tlKHRoaXMsIG1TdGFydEZvcmVncm91bmRBcmdzKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgIExvZy53KCJNeUFwcCIsICJVbmFibGUgdG8gaW52b2tlIHN0YXJ0Rm9yZWdyb3VuZCIsIGUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgTG9nLncoIk15QXBwIiwgIlVuYWJsZSB0byBpbnZva2Ugc3RhcnRGb3JlZ3JvdW5kIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBGYWxsIGJhY2sgb24gdGhlIG9sZCBBUEkuCisgICAgc2V0Rm9yZWdyb3VuZCh0cnVlKTsKKyAgICBtTk0ubm90aWZ5KGlkLCBub3RpZmljYXRpb24pOworfQorCisvKioKKyAqIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmV3IHN0b3BGb3JlZ3JvdW5kIG1ldGhvZCwgdXNpbmcgdGhlIG9sZGVyCisgKiBBUElzIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUuCisgKi8KK3ZvaWQgc3RvcEZvcmVncm91bmRDb21wYXQoaW50IGlkKSB7CisgICAgLy8gSWYgd2UgaGF2ZSB0aGUgbmV3IHN0b3BGb3JlZ3JvdW5kIEFQSSwgdGhlbiB1c2UgaXQuCisgICAgaWYgKG1TdG9wRm9yZWdyb3VuZCAhPSBudWxsKSB7CisgICAgICAgIG1TdG9wRm9yZWdyb3VuZEFyZ3NbMF0gPSBCb29sZWFuLlRSVUU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU3RvcEZvcmVncm91bmQuaW52b2tlKHRoaXMsIG1TdG9wRm9yZWdyb3VuZEFyZ3MpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgTG9nLncoIk15QXBwIiwgIlVuYWJsZSB0byBpbnZva2Ugc3RvcEZvcmVncm91bmQiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgIExvZy53KCJNeUFwcCIsICJVbmFibGUgdG8gaW52b2tlIHN0b3BGb3JlZ3JvdW5kIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBGYWxsIGJhY2sgb24gdGhlIG9sZCBBUEkuICBOb3RlIHRvIGNhbmNlbCBCRUZPUkUgY2hhbmdpbmcgdGhlCisgICAgLy8gZm9yZWdyb3VuZCBzdGF0ZSwgc2luY2Ugd2UgY291bGQgYmUga2lsbGVkIGF0IHRoYXQgcG9pbnQuCisgICAgbU5NLmNhbmNlbChpZCk7CisgICAgc2V0Rm9yZWdyb3VuZChmYWxzZSk7Cit9Cis8L3ByZT4KKzxoMz5TZXJ2aWNlIGxpZmVjeWNsZSBjaGFuZ2VzPC9oMz4KKzxwPkFub3RoZXIgc2l0dWF0aW9uIHdlIHdlcmUgaW5jcmVhc2luZ2x5IHNlZWluZyBpbiAxLjYgd2FzIHRoYXQsIGV2ZW4gaWdub3JpbmcgdGhlIHNlcnZpY2VzIHRoYXQgaW5hcHByb3ByaWF0ZWx5IG1ha2UgdGhlbXNlbHZlcyBmb3JlZ3JvdW5kLCB3ZSBoYWQgYSBncm93aW5nIG51bWJlciBvZiBkZXZpY2VzIHdpdGggYSBsYXJnZSBudW1iZXIgb2Ygc2VydmljZXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCBhbGwgZmlnaHRpbmcgZWFjaCBvdGhlciBvdmVyIHRoZSBhdmFpbGFibGUgbWVtb3J5LjwvcD4KKzxwPlBhcnQgb2YgdGhpcyBwcm9ibGVtIGlzIHNlcnZpY2VzIHRoYXQgYXJlIHJ1bm5pbmcgbW9yZSB0aGFuIHRoZXkgc2hvdWxkIG9yIHRoZXJlIHNpbXBseSBiZWluZyB0b28gbXVjaCBzdHVmZiB0cnlpbmcgdG8gYmUgZG9uZSBvbiB0aGUgZGV2aWNlLiBIb3dldmVyLCB3ZSBhbHNvIGZvdW5kIG1hbnkgaXNzdWVzIGluIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHNlcnZpY2VzIGFuZCB0aGUgcGxhdGZvcm0gdGhhdCBtYWRlIGl0IGVhc3kgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIGxlYXZlIGEgc2VydmljZSBydW5uaW5nIGV2ZW4gd2hlbiBpdCBpcyB0cnlpbmcgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLiBDb25zaWRlciB0aGlzIHR5cGljYWwgc2NlbmFyaW86PC9wPgorPG9sPgorICA8bGk+QW4gYXBwbGljYXRpb24gY2FsbHMgc3RhcnRTZXJ2aWNlKCkuPC9saT4KKyAgPGxpPlRoYXQgc2VydmljZSBnZXRzIG9uQ3JlYXRlKCksIG9uU3RhcnQoKSwgYW5kIHRoZW4gc3Bhd25zIGEgYmFja2dyb3VuZCB0aHJlYWQgdG8gZG8gc29tZSB3b3JrLjwvbGk+CisgIDxsaT5UaGUgc3lzdGVtIGlzIHRpZ2h0IG9uIG1lbW9yeSwgc28gaGFzIHRvIGtpbGwgdGhlIGN1cnJlbnRseSBydW5uaW5nIHNlcnZpY2UuPC9saT4KKyAgPGxpPkxhdGVyIHdoZW4gbWVtb3J5IGlzIGZyZWUsIHRoZSBzZXJ2aWNlIGlzIHJlc3RhcnRlZCwgYW5kIGdldHMgb25DcmVhdGUoKSBjYWxsZWQgYnV0IG5vdCBvblN0YXJ0KCkgYmVjYXVzZSB0aGVyZSBoYXMgbm90IGJlZW4gYW5vdGhlciBjYWxsIHRvIHN0YXJ0U2VydmljZSgpIHdpdGggYSBuZXcgSW50ZW50IGNvbW1hbmQgdG8gc2VuZCBpdC48L2xpPgorPC9vbD4KKzxwPk5vdyB0aGUgc2VydmljZSB3aWxsIHNpdCB0aGVyZSBjcmVhdGVkLCBub3QgcmVhbGl6aW5nIGl0IHVzZWQgdG8gYmUgZG9pbmcgc29tZSB3b3JrLCBhbmQgc28gbm90IGtub3dpbmcgaXQgc2hvdWxkIHN0b3AgaXRzZWxmIGF0IHNvbWUgcG9pbnQuPC9wPgorPHA+VG8gYWRkcmVzcyB0aGlzLCBpbiBBbmRyb2lkIDIuMCBTZXJ2aWNlLm9uU3RhcnQoKSBhcyBiZWVuIGRlcHJlY2F0ZWQgKHRob3VnaCBzdGlsbCBleGlzdHMgYW5kIG9wZXJhdGVzIGFzIGl0IHVzZWQgdG8gaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIHBsYXRmb3JtKS4gSXQgaXMgcmVwbGFjZWQgd2l0aCBhIG5ldyB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvblN0YXJ0Q29tbWFuZChhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBpbnQsIGludCl9IGNhbGxiYWNrIHRoYXQgYWxsb3dzIHRoZSBzZXJ2aWNlIHRvIGJldHRlciBjb250cm9sIGhvdyB0aGUgc3lzdGVtIHNob3VsZCBtYW5hZ2UgaXQuIFRoZSBrZXkgcGFydCBoZXJlIGlzIGEgbmV3IHJlc3VsdCBjb2RlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiwgdGVsbGluZyB0aGUgc3lzdGVtIHdoYXQgaXQgc2hvdWxkIGRvIHdpdGggdGhlIHNlcnZpY2UgaWYgaXRzIHByb2Nlc3MgaXMga2lsbGVkIHdoaWxlIGl0IGlzIHJ1bm5pbmc6PC9wPgorPHVsPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2UjU1RBUlRfU1RJQ0tZfSBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGJlaGF2aW9yLCB3aGVyZSB0aGUgc2VydmljZSBpcyBsZWZ0ICJzdGFydGVkIiBhbmQgd2lsbCBsYXRlciBiZSByZXN0YXJ0ZWQgYnkgdGhlIHN5c3RlbS4gVGhlIG9ubHkgZGlmZmVyZW5jZSBmcm9tIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBwbGF0Zm9ybSBpcyB0aGF0IGl0IGlmIGl0IGdldHMgcmVzdGFydGVkIGJlY2F1c2UgaXRzIHByb2Nlc3MgaXMga2lsbGVkLCBvblN0YXJ0Q29tbWFuZCgpIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBuZXh0IGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIHdpdGggYSBudWxsIEludGVudCBpbnN0ZWFkIG9mIG5vdCBiZWluZyBjYWxsZWQgYXQgYWxsLiBTZXJ2aWNlcyB0aGF0IHVzZSB0aGlzIG1vZGUgc2hvdWxkIGFsd2F5cyBjaGVjayBmb3IgdGhpcyBjYXNlIGFuZCBkZWFsIHdpdGggaXQgYXBwcm9wcmlhdGVseS48L2xpPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2UjU1RBUlRfTk9UX1NUSUNLWX0gc2F5cyB0aGF0LCBhZnRlciByZXR1cm5pbmcgZnJvbSBvblN0YXJ0Q3JlYXRlZCgpLCBpZiB0aGUgcHJvY2VzcyBpcyBraWxsZWQgd2l0aCBubyByZW1haW5pbmcgc3RhcnQgY29tbWFuZHMgdG8gZGVsaXZlciwgdGhlbiB0aGUgc2VydmljZSB3aWxsIGJlIHN0b3BwZWQgaW5zdGVhZCBvZiByZXN0YXJ0ZWQuIFRoaXMgbWFrZXMgYSBsb3QgbW9yZSBzZW5zZSBmb3Igc2VydmljZXMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gb25seSBydW4gd2hpbGUgZXhlY3V0aW5nIGNvbW1hbmRzIHNlbnQgdG8gdGhlbS4gRm9yIGV4YW1wbGUsIGEgc2VydmljZSBtYXkgYmUgc3RhcnRlZCBldmVyeSAxNSBtaW51dGVzIGZyb20gYW4gYWxhcm0gdG8gcG9sbCBzb21lIG5ldHdvcmsgc3RhdGUuIElmIGl0IGdldHMga2lsbGVkIHdoaWxlIGRvaW5nIHRoYXQgd29yaywgaXQgd291bGQgYmUgYmVzdCB0byBqdXN0IGxldCBpdCBiZSBzdG9wcGVkIGFuZCBnZXQgc3RhcnRlZCB0aGUgbmV4dCB0aW1lIHRoZSBhbGFybSBmaXJlcy48L2xpPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2UjU1RBUlRfUkVERUxJVkVSX0lOVEVOVH0gaXMgbGlrZSBTVEFSVF9OT1RfU1RJQ0tZLCBleGNlcHQgaWYgdGhlIHNlcnZpY2UncyBwcm9jZXNzIGlzIGtpbGxlZCBiZWZvcmUgaXQgY2FsbHMgc3RvcFNlbGYoKSBmb3IgYSBnaXZlbiBpbnRlbnQsIHRoYXQgaW50ZW50IHdpbGwgYmUgcmUtZGVsaXZlcmVkIHRvIGl0IHVudGlsIGl0IGNvbXBsZXRlcyAodW5sZXNzIGFmdGVyIHNvbWUgbnVtYmVyIG9mIG1vcmUgdHJpZXMgaXQgc3RpbGwgY2FuJ3QgY29tcGxldGUsIGF0IHdoaWNoIHBvaW50IHRoZSBzeXN0ZW0gZ2l2ZXMgdXApLiBUaGlzIGlzIHVzZWZ1bCBmb3Igc2VydmljZXMgdGhhdCBhcmUgcmVjZWl2aW5nIGNvbW1hbmRzIG9mIHdvcmsgdG8gZG8sIGFuZCB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5IGRvIGV2ZW50dWFsbHkgY29tcGxldGUgdGhlIHdvcmsgZm9yIGVhY2ggY29tbWFuZCBzZW50LjwvbGk+Cis8L3VsPgorPHA+Rm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBhcHBsaWNhdGlvbnMsIHRoZSBkZWZhdWx0IHJldHVybiBjb2RlIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgdGFyZ2V0aW5nIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGUgcGxhdGZvcm0gaXMgYSBzcGVjaWFsIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI1NUQVJUX1NUSUNLWV9DT01QQVRJQklMSVRZfSBjb2RlIHRoYXQgcHJvdmlkZXMgdGhlIG9sZCBiZWhhdmlvciBvZiBub3QgY2FsbGluZyBvblN0YXJ0KCkgd2l0aCBhIG51bGwgaW50ZW50LiBPbmNlIHlvdSBzdGFydCB0YXJnZXRpbmcgQVBJIHZlcnNpb24gNSBvciBsYXRlciwgdGhlIGRlZmF1bHQgbW9kZSBpcyBTVEFSVF9TVElDS1kgYW5kIHlvdSBtdXN0IGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCBvblN0YXJ0KCkgb3Igb25TdGFydENvbW1hbmQoKSBiZWluZyBjYWxsZWQgd2l0aCBhIG51bGwgSW50ZW50LjwvcD4KKzxwPllvdSBjYW4gYWxzbyBlYXNpbHkgd3JpdGUgYSBTZXJ2aWNlIHRoYXQgdXNlcyBib3RoIHRoZSBvbGQgYW5kIG5ldyBBUElzLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLiBBbGwgeW91IG5lZWQgdG8gZG8gaXMgY29tcGlsZSBhZ2FpbnN0IHRoZSAyLjAgU0RLIHdpdGggdGhpcyBjb2RlOjwvcD4KKzxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKy8vIFRoaXMgaXMgdGhlIG9sZCBvblN0YXJ0IG1ldGhvZCB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBwcmUtMi4wCisvLyBwbGF0Zm9ybS4gIE9uIDIuMCBvciBsYXRlciB3ZSBvdmVycmlkZSBvblN0YXJ0Q29tbWFuZCgpIHNvIHRoaXMKKy8vIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQuCismIzY0O092ZXJyaWRlCitwdWJsaWMgdm9pZCBvblN0YXJ0KEludGVudCBpbnRlbnQsIGludCBzdGFydElkKSB7CisgICAgaGFuZGxlU3RhcnQoaW50ZW50LCBzdGFydElkKTsKK30KKworJiM2NDtPdmVycmlkZQorcHVibGljIGludCBvblN0YXJ0Q29tbWFuZChJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsIGludCBzdGFydElkKSB7CisgICAgaGFuZGxlU3RhcnQoaW50ZW50LCBzdGFydElkKTsKKyAgICByZXR1cm4gU1RBUlRfTk9UX1NUSUNLWTsKK30KKwordm9pZCBoYW5kbGVTdGFydChJbnRlbnQgaW50ZW50LCBpbnQgc3RhcnRJZCkgeworICAgIC8vIGRvIHdvcmsKK30KKzwvcHJlPgorPGgzPk5ldyAicnVubmluZyBzZXJ2aWNlcyIgdXNlciBpbnRlcmZhY2U8L2gzPgorPHA+T3VyIGZpbmFsIGlzc3VlIHRvIGFkZHJlc3MgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIHNpbXBseSB0b28gbWFueSBzZXJ2aWNlIHJ1bm5pbmcgaW4gdGhlIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlIG9uIGEgZGV2aWNlLiBUaGlzIG1heSBiZSBkdWUgdG8gYnVncyBvciBkZXNpZ24gZmxhd3MgaW4gaW5zdGFsbGVkIGFwcGxpY2F0aW9ucywgb3IgdGhlIHVzZXIgc2ltcGx5IHRyeWluZyB0byBkbyB0b28gbXVjaC4gSGlzdG9yaWNhbGx5IHVzZXJzIGhhdmUgaGFkIG5vIHZpc2liaWxpdHkgaW50byB3aGF0IGlzIGdvaW5nIG9uIGF0IHRoaXMgbGV2ZWwgaW4gdGhlIHN5c3RlbSwgYnV0IGl0IGhhcyBiZWNvbWUgaW1wb3J0YW50IHRvIGV4cG9zZSB0aGlzLCBhdCBsZWFzdCBmb3IgbG93ZXItZW5kIGRldmljZXMsIGFzIHRoZSB1c2Ugb2Ygc2VydmljZXMgaGFzIGhhZCBhbiBpbmNyZWFzaW5nIGltcGFjdCBvbiB0aGUgdXNlciBleHBlcmllbmNlLjwvcD4KKzxwPlRvIGhlbHAgYWRkcmVzcyB0aGlzLCBBbmRyb2lkIDIuMCBpbnRyb2R1Y2VzIGEgbmV3ICJSdW5uaW5nIFNlcnZpY2VzIiBhY3Rpdml0eSBhdmFpbGFibGUgZnJvbSB0aGUgQXBwbGljYXRpb24gc3lzdGVtIHNldHRpbmdzLiBXaGVuIGJyb3VnaHQgdXAsIGl0IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgorPGltZyBzcmM9ImltYWdlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGhfcnVubmluZ3NlcnZpY2VzLnBuZyIgd2lkdGg9IjE5MiIgaGVpZ2h0PSIzMjAiIGFsdD0iUnVubmluZyBTZXJ2aWNlcyIvPgorPHA+VGhlIG1haW4gY29udGVudCBpcyBhIGxpc3Qgb2YgYWxsIHJ1bm5pbmcgc2VydmljZXMgdGhhdCBtYXkgYmUgb2YgaW50ZXJlc3QgdG8gdGhlIHVzZXIsIG9yZ2FuaXplZCBieSB0aGUgcHJvY2Vzc2VzIHRoZXkgcnVuIGluLiBJbiB0aGUgZXhhbXBsZSBoZXJlLCB3ZSBzZWUgdGhyZWUgc2VydmljZXM6PC9wPgorPHVsPgorICA8bGk+PGI+R1RhbGtTZXJ2aWNlPC9iPiBpcyBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBHb29nbGUgYXBwbGljYXRpb24gc3VpdDsgaXQgaXMgcnVubmluZyBpbiBHb29nbGUncyAiZ2FwcHMiIHByb2Nlc3MsIHdoaWNoIGN1cnJlbnRseSBjb25zdW1lcyA2LjhNQi4gSXQgaGFzIGJlZW4gc3RhcnRlZCBmb3IgMyBob3VycyA1NSBtaW51dGVzLCB3aGljaCBvbiB0aGlzIGRldmljZSBpcyB0aGUgdGltZSBmcm9tIHdoZW4gaXQgd2FzIGZpcnN0IGJvb3RlZC48L2xpPgorICA8bGk+PGI+QWN0aXZpdHlTZXJ2aWNlPC9iPiBpcyBwYXJ0IG9mIHRoZSBQaG9uZWJvb2sgYXBwLCBhbmQgaXRzIHByb2Nlc3MgY29uc3VtZXMgNE1CLiBUaGlzIGFsc28gaGFzIGJlZW4gcnVubmluZyBzaW5jZSBib290LjwvbGk+CisgIDxsaT48Yj5Tb2Z0S2V5Ym9hcmQ8L2I+IGlzIGEgdGhpcmQgcGFydHkgaW5wdXQgbWV0aG9kLiBJdCBoYXMgYmVlbiBydW5uaW5nIHNpbmNlIEkgc3dpdGNoZWQgdG8gaXQsIGFib3V0IDQgbWludXRlcyBhZ28uPC9saT4KKzwvdWw+Cis8cD5UaGUgdXNlciBjYW4gdGFwIG9uIGFueSBvZiB0aGVzZSBzZXJ2aWNlcyB0byBjb250cm9sIGl0OyBmb3Igbm9ybWFsIHNlcnZpY2VzIHRoYXQgYXJlIHJ1bm5pbmcgYmVjYXVzZSB0aGV5IHdlcmUgZXhwbGljaXRseSBzdGFydGVkLCB0aGlzIHdpbGwgcHJlc2VudCBhIGRpYWxvZyBhbGxvd2luZyB0aGUgdXNlciB0byBleHBsaWNpdGx5IHN0b3AgaXQ6PC9wPgorPGltZyBzcmM9ImltYWdlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGhfc3RvcHNlcnZpY2UucG5nIiBoZWlnaHQ9IjMyMCIgd2lkdGg9IjE5MiIgYWx0PSJTdG9wIFNlcnZpY2UiLz4KKzxwPlNvbWUgb3RoZXIgc2VydmljZXMsIGxpa2UgdGhlIGlucHV0IG1ldGhvZCwgYXJlIHJ1bm5pbmcgZm9yIG90aGVyIHJlYXNvbnMuIEZvciB0aGVzZSwgdGFwcGluZyBvbiB0aGUgc2VydmljZSB3aWxsIGdvIHRvIHRoZSBjb3JyZXNwb25kaW5nIFVJIHRvIG1hbmFnZSBpdCAoaW4gdGhpcyBjYXNlIHRoZSBzeXN0ZW0ncyBpbnB1dCBzZXR0aW5ncykuPC9wPgorPHA+RmluYWxseSwgYWxvbmcgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIGFyZSBzb21lIG9ic2N1cmUgbnVtYmVycy4gSWYgeW91IGtub3cgaG93IHRvIGludGVycHJldCB0aGVtLCB0aGlzIGdpdmVzIHlvdSBhIGxvdCBvZiBpbmZvcm1hdGlvbiBvbiB0aGUgbWVtb3J5IHN0YXR1cyBvZiB5b3VyIGRldmljZTo8L3A+Cis8dWw+CisgIDxsaT48Yj5BdmFpbDogMzhNQisxMTRNQiBpbiAyNTwvYj4gc2F5cyB0aGF0IHRoZSBkZXZpY2UgaGFzIDM4TUIgb2YgY29tcGxldGVseSBmcmVlIChvciBsaWtlbHkgdXNlZCBmb3IgdW5yZXF1aXJlZCBjYWNoZXMpIG1lbW9yeSwgYW5kIGhhcyBhbm90aGVyIDExNE1CIG9mIGF2YWlsYWJsZSBtZW1vcnkgaW4gMjUgYmFja2dyb3VuZCBwcm9jZXNzZXMgaXQgY2FuIGtpbGwgYXQgYW55IHRpbWUuPC9saT4KKyAgPGxpPjxiPk90aGVyOiAzMk1CIGluIDM8L2I+IHNheXMgdGhhdCB0aGUgZGV2aWNlIGhhcyAzMk1CIG9mIHVuYXZhaWxhYmxlIG1lbW9yeSBpbiAzIHVua2lsbGFibGUgcHJvY2Vzc2VzICh0aGF0IGlzLCBwcm9jZXNzZXMgdGhhdCBhcmUgY3VycmVudGx5IGNvbnNpZGVyZWQgdG8gYmUgZm9yZWdyb3VuZCBhbmQgbXVzdCBiZSBrZXB0IHJ1bm5pbmcpPC9saT4KKzwvdWw+Cis8cD5Gb3IgbW9zdCB1c2VycywgdGhpcyBuZXcgdXNlciBpbnRlcmZhY2Ugc2hvdWxkIGJlIGEgbXVjaCBtb3JlIGVmZmVjdGl2ZSB3YXkgdG8gbWFuYWdlIHRoZSBiYWNrZ3JvdW5kIGFwcGxpY2F0aW9ucyBvbiB0aGVpciBkZXZpY2UgdGhhbiB0aGUgZXhpc3RpbmcgInRhc2sga2lsbGVyIiBhcHBsaWNhdGlvbnMuIEluIHRoZSB2YXN0IG1ham9yaXR5IG9mIGNhc2VzIHRoZSByZWFzb24gZm9yIGEgc2xvdyBydW5uaW5nIGRldmljZSBpcyB0b28gbWFueSBzZXJ2aWNlcyB0cnlpbmcgdG8gcnVuLiBUaGlzIHByZXZlbnRzIHRoZSBzeXN0ZW0gZnJvbSBiZWluZyBhYmxlIHRvIHJ1biBhbnkgYmFja2dyb3VuZCBwcm9jZXNzZXMgKHdoaWNoIHNwZWVkIHVwIGFwcCBzd2l0Y2hpbmcpLCBhbmQgdWx0aW1hdGVseSBjYW4gcmVzdWx0IGluIHRocmFzaGluZyB0aHJvdWdoIHRoZSBzZXJ2aWNlcyB3aGVuIG5vdCBldmVuIHRoZXkgY2FuIGFsbCBiZSBrZXB0IHJ1bm5pbmcuIFRoZSBSdW5uaW5nIFNlcnZpY2VzIFVJIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgdmVyeSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmljZXMgdGhhdCBhcmUgcnVubmluZywgdG8gaGVscCBtYWtlIGEgZ29vZCBkZWNpc2lvbiBhYm91dCB3aGF0IHNob3VsZCBiZSBzdG9wcGVkLiBJdCBhbHNvIGRvZXMgbm90IHVzZSB0aGUgQVBJIHRvIGZvcmNlIHN0b3AgYW4gYXBwbGljYXRpb24sIHdoaWNoIGNhbiB1bmludGVudGlvbmFsbHkgYnJlYWsgYXBwbGljYXRpb25zIGluIG51bWVyb3VzIHdheXMuPC9wPgorPHA+Rm9yIGRldmVsb3BlcnMsIHRoaXMgaXMgYW4gaW1wb3J0YW50IHRvb2wgdG8gZW5zdXJlIHlvdXIgc2VydmljZXMgYXJlIHdlbGwgYmVoYXZlZC4gQXMgeW91IGRldmVsb3AgeW91ciBhcHAsIGJlIHN1cmUgdG8ga2VlcCBhbiBleWUgb24gUnVubmluZyBTZXJ2aWNlcyB0byBlbnN1cmUgdGhhdCB5b3UgYXJlIG5vdCBhY2NpZGVudGFsbHkgbGVhdmluZyB5b3VyIHNlcnZpY2VzIHJ1bm5pbmcgd2hlbiB0aGV5IHNob3VsZG4ndCBiZS4gWW91IHNob3VsZCBhbHNvIG5vdyBrZWVwIGluIG1pbmQgdGhhdCB1c2VycyBtYXkgZnJlZWx5IHN0b3AgYW55IG9mIHlvdXIgc2VydmljZXMgYXMgdGhleSB3aXNoLCB3aXRob3V0IHlvdXIgY29udHJvbCwgYW5kIGFjY291bnQgZm9yIHRoYXQuPC9wPgorPHA+QW5kcm9pZCdzIFNlcnZpY2VzIGFyZSBhIHZlcnkgcG93ZXJmdWwgdG9vbCwgYnV0IG9uZSBvZiB0aGUgbWFpbiBhbmQgc3VidGxlIHdheXMgdGhhdCBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzIGNhbiBoYXJtIHRoZSBvdmVyYWxsIGV4cGVyaWVuY2UgYSB1c2VyIGhhcyB3aXRoIHRoZWlyIHBob25lLjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzLWRhdGEuanMgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCmluZGV4IDhkOWI3YjEuLjc3YWVlNDYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzLWRhdGEuanMKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcwpAQCAtMjAsNiArMjAsNyBAQAogICAgICdpbnRlbnQnOiAnSW50ZW50cycsCiAgICAgJ2xheW91dCc6ICdMYXlvdXRzL1ZpZXdzJywKICAgICAnbWVkaWEnOiAnTXVsdGltZWRpYScsCisgICAgJ211bHRpdGFza2luZyc6ICdNdWx0aS10YXNraW5nJywKICAgICAnbmV3ZmVhdHVyZSc6ICdOZXcgRmVhdHVyZXMnLAogICAgICdwZXJmb3JtYW5jZSc6ICdQZXJmb3JtYW5jZScsCiAgICAgJ3NlYXJjaCc6ICdTZWFyY2gnLApAQCAtMjAxLDYgKzIwMiwxNiBAQAogICAgIH0KICAgfSwKICAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdiZXN0cHJhY3RpY2UnLCAnbXVsdGl0YXNraW5nJ10sCisgICAgcGF0aDogJ2FydGljbGVzL211bHRpdGFza2luZy1hbmRyb2lkLXdheS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdNdWx0aXRhc2tpbmcgdGhlIEFuZHJvaWQgV2F5JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBiZXN0IHByYWN0aWNlcyBhbmQgdXNlciBleHBlcmllbmNlIGd1aWRlbGluZXMgZm9yIG11bHRpLXRhc2tpbmcgb24gQW5kcm9pZC4nCisgICAgfQorICB9LAorICB7CiAgICAgdGFnczogWydhcnRpY2xlJywgJ2lucHV0J10sCiAgICAgcGF0aDogJ2FydGljbGVzL29uLXNjcmVlbi1pbnB1dHMuaHRtbCcsCiAgICAgdGl0bGU6IHsKQEAgLTI0MSw2ICsyNTIsMTYgQEAKICAgICB9CiAgIH0sCiAgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnY29tcGF0aWJpbGl0eScsICdtdWx0aXRhc2tpbmcnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvc2VydmljZS1hcGktY2hhbmdlcy1zdGFydGluZy13aXRoLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NlcnZpY2UgQVBJIGNoYW5nZXMgc3RhcnRpbmcgd2l0aCBBbmRyb2lkIDIuMCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBkZXNjcmliZXMgdGhlIGNoYW5nZXMgYW5kIGltcHJvdmVtZW50cyB0byBzZXJ2aWNlcyBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMi4wLCBhcyB3ZWxsIGFzIHN0cmF0ZWdpZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uJworICAgIH0KKyAgfSwKKyAgewogICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aSddLAogICAgIHBhdGg6ICdhcnRpY2xlcy90b3VjaC1tb2RlLmh0bWwnLAogICAgIHRpdGxlOiB7CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjMuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjMuamQKaW5kZXggNmQ2MGZjYy4uMTBmYzA0OSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy4zLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuMy5qZApAQCAtMTQxLDggKzE0MSw4IEBACiA8bGk+TkZDLUYgKEpJUyA2MzE5LTQpPC9saT4KIDxsaT5ORkMtViAoSVNPIDE1NjkzKTwvbGk+CiA8bGk+SVNPLURFUCAoSVNPIDE0NDQzLTQpPC9saT4KLTxsaT5NaWZhcmUgQ2xhc3NpYzwvbGk+Ci08bGk+TWlmYXJlIFVsdHJhbGlnaHQ8L2xpPgorPGxpPk1JRkFSRSBDbGFzc2ljPC9saT4KKzxsaT5NSUZBUkUgVWx0cmFsaWdodDwvbGk+CiA8bGk+TkZDIEZvcnVtIE5ERUYgdGFnczwvbGk+CiA8L3VsPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjQuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjQuamQKaW5kZXggZTU3NjVkMy4uNGNiNDRiOSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy40LmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuNC5qZApAQCAtMTI4LDcgKzEyOCw3IEBACiA8YSBocmVmPSJ7QGRvY1Jvb3R9c2RrL2FuZHJvaWQtMi4zLjMuaHRtbCI+QW5kcm9pZCAyLjMuMyB2ZXJzaW9uIG5vdGVzPC9hPi48L3A+CiAKIAotPGgyIGlkPSJvcGVuYWNjZXNzb3J5Ij5PcGVuIEFjY2Vzc29yeSBMaWJyYXJ5PC9oMz4KKzxoMiBpZD0ib3BlbmFjY2Vzc29yeSI+T3BlbiBBY2Nlc3NvcnkgTGlicmFyeTwvaDI+CiAKIDxwPjxlbT5PcGVuIEFjY2Vzc29yeTwvZW0+IGlzIGEgbmV3IGNhcGFiaWxpdHkgZm9yIGludGVncmF0aW5nCiBjb25uZWN0ZWQgcGVyaXBoZXJhbHMgd2l0aCBhcHBsaWNhdGlvbnMgcnVubmluZyBvbiB0aGUgcGxhdGZvcm0uIFRoZSBjYXBhYmlsaXR5CkBAIC0yNDEsNyArMjQxLDcgQEAKIDxsaT5DYW1lcmE8L2xpPgogPGxpPkNsb2NrPC9saT4KIDxsaT5Db250YWN0czwvbGk+Ci08bGk+Q3Vzb20gTG9jYWxlPC9saT4KKzxsaT5DdXN0b20gTG9jYWxlPC9saT4KIDxsaT5EZXYgVG9vbHM8L2xpPgogPGxpPkRvd25sb2FkczwvbGk+CiA8bGk+RW1haWw8L2xpPgpAQCAtMzA5LDYgKzMwOSw3IEBACiA8L3VsPgogPC90ZD4KIDx0ZCBzdHlsZT0iYm9yZGVyOjA7cGFkZGluZy1ib3R0b206MDttYXJnaW4tYm90dG9tOjA7cGFkZGluZy1sZWZ0OjVlbTsiPgorPHVsPgogPGxpPkNyb2F0aWFuLCBDcm9hdGlhIChocl9IUik8L2xpPgogPGxpPkh1bmdhcmlhbiwgSHVuZ2FyeSAoaHVfSFUpPC9saT4KIDxsaT5JbmRvbmVzaWFuLCBJbmRvbmVzaWEgKGlkX0lEKTwvbGk+CkBAIC0zMzcsNiArMzM4LDcgQEAKIDxsaT5WaWV0bmFtZXNlLCBWaWV0bmFtICh2aV9WTik8L2xpPgogPGxpPkNoaW5lc2UsIFBSQyAoemhfQ04pPC9saT4KIDxsaT5DaGluZXNlLCBUYWl3YW4gKHpoX1RXKTwvbGk+Cis8L3VsPgogPC90ZD4KIDwvdHI+CiA8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9jb21wYXRpYmlsaXR5LWxpYnJhcnkuamQgYi9kb2NzL2h0bWwvc2RrL2NvbXBhdGliaWxpdHktbGlicmFyeS5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY2OWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Nkay9jb21wYXRpYmlsaXR5LWxpYnJhcnkuamQKQEAgLTAsMCArMSwyMjQgQEAKK3BhZ2UudGl0bGU9Q29tcGF0aWJpbGl0eSBMaWJyYXJ5CisKK0BqZDpib2R5CisKKzxkaXYgaWQ9InF2LXdyYXBwZXIiPgorPGRpdiBpZD0icXYiPgorICAKKzxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKzxvbD4KKyAgPGxpPjxhIGhyZWY9IiNOb3RlcyI+UmV2aXNpb25zPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjSW5zdGFsbGluZyI+SW5zdGFsbGluZyB0aGUgQ29tcGF0aWJpbGl0eSBMaWJyYXJ5PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjU2V0dGluZ1VwIj5TZXR0aW5nIFVwIGEgUHJvamVjdCB0byBVc2UgdGhlIExpYnJhcnk8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNVc2luZyI+VXNpbmcgU29tZSBvZiB0aGUgTGlicmFyeSBBUElzPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjU2FtcGxlcyI+U2FtcGxlczwvYT48L2xpPgorPC9vbD4KKworPGgyPlNlZSBhbHNvPC9oMj4KKzxvbD4KKyAgPGxpPjxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHJhY3RpY2VzL29wdGltaXppbmctZm9yLTMuMC5odG1sIj5PcHRpbWl6aW5nIEFwcHMgZm9yIEFuZHJvaWQgMy4wPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvaW9zY2hlZC8iPkdvb2dsZSBJL08gQXBwIHNvdXJjZSBjb2RlPC9hPjwvbGk+Cis8L29sPgorCis8L2Rpdj4KKzwvZGl2PgorCis8cD48ZW0+TWluaW11bSBBUEkgbGV2ZWwgc3VwcG9ydGVkOjwvZW0+IDxiPjQ8L2I+PC9wPgorCis8cD5UaGUgQ29tcGF0aWJpbGl0eSBMaWJyYXJ5IGlzIGEgc3RhdGljIGxpYnJhcnkgeW91IGNhbiBhZGQgdG8geW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uIGluIG9yZGVyIHRvCit1c2UgQVBJcyBub3QgYXZhaWxhYmxlIGluIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtLiBUaGUgcHJpbWFyeSBnb2FsIG9mIHRoZSBsaWJyYXJ5IGlzCit0byBwcm92aWRlIEFQSXMgaW50cm9kdWNlZCBpbiBBbmRyaW9kIDMuMCBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBzbyB0aGF0IGFsbCBhcHBsaWNhdGlvbnMgY2FuCit1c2UgdGhlbS48L3A+CisKKzxwPklmIHlvdSdyZSBub3QgYWJsZSB0byB1c2UgQVBJcyBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMy4wIGRpcmVjdGx5LCBiZWNhdXNlIHlvdSB3YW50IHRvIHJlbWFpbgorYmFja3dhcmQtY29tcGF0aWJsZSwgdGhlIENvbXBhdGliaWxpdHkgTGlicmFyeSBwcm92aWRlcyB5b3VyIGFwcGxpY2F0aW9uIGFjY2VzcyB0byBzZWxmLWNvbnRhaW5lZAordmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgbGF0ZXN0IEFQSXMgdGhhdCB5b3UgY2FuIHVzZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIEFuZHJvaWQuIE1vc3QKK2ltcG9ydGFudGx5LCB0aGUgbGlicmFyeSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHtAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudH0gYW5kIHtAbGluaworYW5kcm9pZC5jb250ZW50LkxvYWRlcn0gQVBJcywgc28geW91IGNhbiB1c2UgdGhlbSBpbiBhIHdheSB0aGF0J3MgY29tcGF0aWJsZSB3aXRoIGRldmljZXMgcnVubmluZworQW5kcm9pZCAxLjYgKEFQSSBsZXZlbCA0KSBhbmQgaGlnaGVyLiBUaHVzLCB5b3UgY2FuIG1vcmUgZWFzaWx5IGNyZWF0ZSBhIHNpbmdsZSBBUEsgdGhhdCBzdXBwb3J0cyBhCittYWpvcml0eSBvZiBkZXZpY2VzIGFuZCBwcm92aWRlIGxhcmdlciBkZXZpY2VzIChzdWNoIGFzIHRhYmxldHMpIGEgZnVsbHkgb3B0aW1pemVkIGV4cGVyaWVuY2UgYnkKK3VzaW5nIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL2ZyYWdtZW50cy5odG1sIj5GcmFnbWVudHM8L2E+IGluIHlvdXIgYWN0aXZpdHkKK2Rlc2lnbi48L3A+CisKKworPGgyIGlkPSJOb3RlcyI+UmV2aXNpb25zPC9oMj4KKworPHA+VGhlIHNlY3Rpb25zIGJlbG93IHByb3ZpZGUgbm90ZXMgYWJvdXQgc3VjY2Vzc2l2ZSByZWxlYXNlcyBvZgordGhlIENvbXBhdGliaWxpdHkgTGlicmFyeSwgYXMgZGVub3RlZCBieSByZXZpc2lvbiBudW1iZXIuPC9wPgorCisKKzxkaXYgY2xhc3M9InRvZ2dsZS1jb250ZW50IG9wZW4iPgorCisgIDxwPjxhIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiB0b2dnbGVDb250ZW50KHRoaXMpIj4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvdHJpYW5nbGUtb3BlbmVkLnBuZyIgY2xhc3M9InRvZ2dsZS1jb250ZW50LWltZyIgLz4KKyAgICBDb21wYXRpYmlsaXR5IExpYnJhcnksIHJldmlzaW9uIDIgKE1heSAyMDExKQorICA8L2E+PC9wPgorCisgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250ZW50LXRvZ2dsZW1lIiBzdHlsZT0icGFkZGluZy1sZWZ0OjJlbSI+IAorICAgIDxkbD4KKyAgICA8ZHQ+Q2hhbmdlczo8L2R0PgorICAgIDxkZD4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPlN1cHBvcnQgZm9yIGZyYWdtZW50IGFuaW1hdGlvbnMuPC9saT4KKyAgICAgICAgPGxpPkZpeCB7QGNvZGUgRnJhZ21lbnQub25BY3Rpdml0eVJlc3VsdCgpfSBidWcuPC9saT4KKyAgICAgIDwvdWw+CisgICAgPC9kZD4KKyAgICA8L2RsPgorICA8L2Rpdj4KKworPC9kaXY+CisKKworPGRpdiBjbGFzcz0idG9nZ2xlLWNvbnRlbnQgY2xvc2VkIj4KKworICA8cD48YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlQ29udGVudCh0aGlzKSI+CisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmciIGNsYXNzPSJ0b2dnbGUtY29udGVudC1pbWciIC8+CisgICAgQ29tcGF0aWJpbGl0eSBMaWJyYXJ5LCByZXZpc2lvbiAxIChNYXJjaCAyMDExKQorICA8L2E+PC9wPgorCisgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250ZW50LXRvZ2dsZW1lIiBzdHlsZT0icGFkZGluZy1sZWZ0OjJlbSI+IAorICAgICAgPHA+SW5pdGlhbCByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5LjwvcD4KKyAgPC9kaXY+CisKKzwvZGl2PgorCisKKworPGgyIGlkPSJJbnN0YWxsaW5nIj5JbnN0YWxsaW5nIHRoZSBDb21wYXRpYmlsaXR5IExpYnJhcnk8L2gyPgorCis8cD5UaGUgQ29tcGF0aWJpbGl0eSBMaWJyYXJ5IGlzIHByb3ZpZGVkIGFzIGEgZG93bmxvYWRhYmxlIHBhY2thZ2UgZnJvbSB0aGUgQW5kcm9pZCBTREsgYW5kIEFWRAorTWFuYWdlci4gVG8gaW5zdGFsbCB0aGUgbGlicmFyeTo8L3A+CisKKzxvbD4KKyAgPGxpPkxhdW5jaCB0aGUgU0RLIGFuZCBBVkQgTWFuYWdlci4gCisgICAgPHA+RnJvbSBFY2xpcHNlLCB5b3UgY2FuIHNlbGVjdCA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPgorJmd0OyA8c3Ryb25nPkFuZHJvaWQgU0RLIGFuZCBBVkQgTWFuYWdlcjwvc3Ryb25nPi4gT3IsIGxhdW5jaCB7QGNvZGUgU0RLIE1hbmFnZXIuZXhlfSBmcm9tCit0aGUge0Bjb2RlICZsdDtzZGsmZ3Q7L30gZGlyZWN0b3J5IChvbiBXaW5kb3dzIG9ubHkpIG9yIHtAY29kZSBhbmRyb2lkfSBmcm9tIHRoZSB7QGNvZGUKKyZsdDtzZGsmZ3Q7L3Rvb2xzL30gZGlyZWN0b3J5LjwvcD48L2xpPgorICA8bGk+RXhwYW5kIHRoZSBBbmRyb2lkIFJlcG9zaXRvcnksIGNoZWNrIDxzdHJvbmc+QW5kcm9pZCBDb21wYXRpYmlsaXR5IHBhY2thZ2U8L3N0cm9uZz4KK2FuZCBjbGljayA8c3Ryb25nPkluc3RhbGwgc2VsZWN0ZWQ8L3N0cm9uZz4uPC9saT4KKyAgPGxpPlByb2NlZWQgdG8gaW5zdGFsbCB0aGUgcGFja2FnZS48L2xpPgorPC9vbD4KKworPHA+V2hlbiBkb25lLCBhbGwgZmlsZXMgKGluY2x1ZGluZyBzb3VyY2UgY29kZSwgc2FtcGxlcywgYW5kIHRoZSB7QGNvZGUgLmphcn0gZmlsZSkgYXJlIHNhdmVkCitpbnRvIHRoZSA8Y29kZT4mbHQ7c2RrJmd0Oy9leHRyYXMvYW5kcm9pZC9jb21wYXRpYmlsaXR5LzwvY29kZT4gZGlyZWN0b3J5LiBUaGUgbmV4dCBkaXJlY3RvcnkKK25hbWUgaXMge0Bjb2RlIHY0fSwgd2hpY2ggaW5kaWNhdGVzIHRoZSBsb3dlc3QgY29tcGF0aWJsZSB2ZXJzaW9uIGZvciB0aGUgbGlicmFyeSB3aXRoaW4uIFRoYXQKK2lzLCB0aGUgY29kZSBpbiB7QGNvZGUgdjQvfSBzdXBwb3J0cyBBUEkgbGV2ZWwgNCBhbmQgYWJvdmUuIChUaGVyZSBtYXkgYmUgZnV0dXJlIGxpYnJhcmllcyB0aGF0CitoYXZlIGEgZGlmZmVyZW50IG1pbmltdW0gdmVyc2lvbiwgc28gdGhleSB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSB0aGlzIG9uZS4pPC9wPgorCisKKzxoMiBpZD0iU2V0dGluZ1VwIj5TZXR0aW5nIFVwIGEgUHJvamVjdCB0byBVc2UgdGhlIExpYnJhcnk8L2gyPgorCis8cD5UbyBhZGQgdGhlIENvbXBhdGliaWxpdHkgTGlicmFyeSB0byB5b3VyIEFuZHJvaWQgcHJvamVjdDo8L3A+Cis8b2w+CisgIDxsaT5JbiB5b3VyIEFuZHJvaWQgcHJvamVjdCwgY3JlYXRlIGEgZGlyZWN0b3J5IG5hbWVkIHtAY29kZSBsaWJzfSBhdCB0aGUgcm9vdCBvZiB5b3VyCitwcm9qZWN0IChuZXh0IHRvIHtAY29kZSBzcmMvfSwge0Bjb2RlIHJlcy99LCBldGMuKTwvbGk+CisgIDxsaT5OYXZpZ2F0ZSB0byB7QGNvZGUgJmx0O3NkayZndDsvZXh0cmFzL2FuZHJvaWQvY29tcGF0aWJpbGl0eS92NC99LjwvbGk+CisgIDxsaT5Db3B5IHRoZSB7QGNvZGUgYW5kcm9pZC1zdXBwb3J0LXY0Lmphcn0gZmlsZSBpbnRvIHlvdXIgcHJvamVjdCB7QGNvZGUgbGlicy99IGRpcmVjdG9yeS48L2xpPgorICA8bGk+QWRkIHRoZSBKQVIgdG8geW91ciBwcm9qZWN0IGJ1aWxkIHBhdGguIEluIEVjbGlwc2UsIHJpZ2h0LWNsaWNrIHRoZSBKQVIgZmlsZSBpbiB0aGUKK1BhY2thZ2UgRXhwbG9yZXIsIHNlbGVjdCA8c3Ryb25nPkJ1aWxkIFBhdGg8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPkFkZCB0byBCdWlsZCBQYXRoPC9zdHJvbmc+LgorWW91IHNob3VsZCB0aGVuIHNlZSB0aGUgSkFSIGZpbGUgYXBwZWFyIGluIGEgbmV3IGRpcmVjdG9yeSBjYWxsZWQgUmVmZXJlbmNlZCBMaWJyYXJpZXMuPC9saT4KKzwvb2w+CisKKzxwPllvdXIgYXBwbGljYXRpb24gaXMgbm93IHJlYWR5IHRvIHVzZSBmcmFnbWVudHMsIGxvYWRlcnMgYW5kIG90aGVyIEFQSXMgZnJvbSB0aGUgbGlicmFyeS4gQWxsIHRoZQorcHJvdmlkZWQgQVBJcyBhcmUgaW4gdGhlIHtAY29kZSBhbmRyb2lkLnN1cHBvcnQudjR9IHBhY2thZ2UuPC9wPgorCis8cCBjbGFzcz0id2FybmluZyI+PHN0cm9uZz5XYXJuaW5nOjwvc3Ryb25nPiBCZSBjZXJ0YWluIHRoYXQgeW91IG5vdCBjb25mdXNlIHRoZSBzdGFuZGFyZAore0Bjb2RlIGFuZHJvaWR9IHBhY2thZ2VzIHdpdGggdGhvc2UgaW4ge0Bjb2RlIGFuZHJvaWQuc3VwcG9ydC52NH0uIFNvbWUgY29kZSBjb21wbGV0aW9uIHRvb2xzIG1pZ2h0CitnZXQgdGhpcyB3cm9uZywgZXNwZWNpYWxseSBpZiB5b3UncmUgYnVpbGRpbmcgYWdhaW5zdCByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIHBsYXRmb3JtLiBUbyBiZSBzYWZlLAora2VlcCB5b3VyIGJ1aWxkIHRhcmdldCBzZXQgdG8gdGhlIHNhbWUgdmVyc2lvbiBhcyB5b3UgaGF2ZSBkZWZpbmVkIGZvciB5b3VyIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCNtaW4iPntAY29kZSBhbmRyb2lkOm1pblNka1ZlcnNpb259PC9hPgorYW5kIGRvdWJsZSBjaGVjayB0aGUgaW1wb3J0IHN0YXRlbWVudHMgZm9yIGNsYXNzZXMgdGhhdCBhcmUgZHVwbGljYXRlZCBpbiB0aGUgQ29tcGF0aWJpbGl0eQorTGlicmFyeSwgc3VjaCBhcyB7QGNvZGUgU2ltcGxlQ3Vyc29yQWRhcHRlcn0uPC9wPgorCisKKzxoMiBpZD0iVXNpbmciPlVzaW5nIFNvbWUgb2YgdGhlIExpYnJhcnkgQVBJczwvaDI+CisKKzxwPlRoZSBDb21wYXRpYmlsaXR5IExpYnJhcnkgcHJvdmlkZXMgYWNjZXNzIHRvIHNldmVyYWwgY2xhc3NlcyBpbnRyb2R1Y2VkIHdpdGggQW5kcm9pZCAzLjAsIHBsdXMKK3NvbWUgdXBkYXRlZCB2ZXJzaW9uIG9mIGV4aXN0aW5nIGNsYXNzZXMuIFNvbWUgb2YgdGhlIG1vc3QgdXNlZnVsIGFuZCBub3RhYmxlIGNsYXNzZXMgaW4gdGhlCitsaWJyYXJ5IGFyZTo8L3A+CisKKzx1bD4KKyAgPGxpPntAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudH08L2xpPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcn08L2xpPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb259PC9saT4KKyAgPGxpPntAbGluayBhbmRyb2lkLmFwcC5MaXN0RnJhZ21lbnR9PC9saT4KKyAgPGxpPntAbGluayBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudH08L2xpPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXJ9PC9saT4KKyAgPGxpPntAbGluayBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyfTwvbGk+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkFzeW5jVGFza0xvYWRlcn08L2xpPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuY29udGVudC5DdXJzb3JMb2FkZXJ9PC9saT4KKzwvdWw+CisKKzxwPkZvciBlYWNoIG9mIHRoZSBjbGFzc2VzIGFib3ZlIChhbmQgb3RoZXJzIG5vdCBsaXN0ZWQpLCB0aGUgQVBJcyB3b3JrIGFsbW9zdCBleGFjdGx5IHRoZSBzYW1lCithcyB0aGUgY291bnRlcnBhcnRzIGluIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4gVGh1cywgeW91IGNhbiB1c3VhbGx5IHJlZmVyIHRvCit0aGUgbGF0ZXN0IHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwcG9ydGVkIEFQSXMuIFRoZXJlIGFyZSBzb21lCitkaWZmZXJlbmNlcywgaG93ZXZlci4gTW9zdCBub3RhYmx5OjwvcD4KKworPHVsPgorICA8bGk+V2hlbiBjcmVhdGluZyBhbiBhY3Rpdml0eSB0byB1c2UgZnJhZ21lbnRzLCB5b3UgbXVzdCBkZWNsYXJlIHlvdXIgYWN0aXZpdHkgdG8gZXh0ZW5kIHRoZQore0Bjb2RlIEZyYWdtZW50QWN0aXZpdHl9IGNsYXNzIChpbnN0ZWFkIG9mIHRoZSB0cmFkaXRpb25hbCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9CitjbGFzcykuPC9saT4KKyAgPGxpPlRvIG1hbmFnZSB5b3VyIGZyYWdtZW50cyBhbmQgbG9hZGVycywgeW91IG11c3QgdXNlIHRoZSBtZXRob2RzIHtAY29kZQorRnJhZ21lbnRBY3Rpdml0eS5nZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCl9IGFuZCB7QGNvZGUKK0ZyYWdtZW50QWN0aXZpdHkuZ2V0U3VwcG9ydExvYWRlck1hbmFnZXIoKX0gKGluc3RlYWQgb2YgdGhlIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjZ2V0RnJhZ21lbnRNYW5hZ2VyKCl9IGFuZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZ2V0TG9hZGVyTWFuYWdlcigpfQorbWV0aG9kcykuPC9saT4KKyAgPGxpPlRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aW9uQmFyfSBpcyA8c3Ryb25nPm5vdCBzdXBwb3J0ZWQ8L3N0cm9uZz4gYnkgdGhlIGxpYnJhcnkuCitIb3dldmVyLCB3aGVuIGNyZWF0aW5nIHlvdXIgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy91aS9tZW51cy5odG1sI29wdGlvbnMtbWVudSI+T3B0aW9ucworTWVudTwvYT4sIHlvdSBjYW4gZGVjbGFyZSB3aGljaCBpdGVtcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIEFjdGlvbiBCYXIgd2hlbiBpdCdzIGF2YWlsYWJsZSAob24KK0FuZHJvaWQgMy4wIG9yIGxhdGVyKS4gWW91IGNhbiBkbyBzbyB3aXRoIHRoZSB7QGNvZGUgTWVudUNvbXBhdC5zZXRTaG93QXNBY3Rpb24oKX0gbWV0aG9kLiBGb3IKK2V4YW1wbGU6Cis8cHJlPgorcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIgPSBnZXRNZW51SW5mbGF0ZXIoKTsKKyAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5vcHRpb25zLCBtZW51KTsKKyAgICBNZW51Q29tcGF0LnNldFNob3dBc0FjdGlvbihtZW51LmZpbmRJdGVtKFIuaWQuYWN0aW9uX3NlYXJjaCksIDEpOworICAgIHJldHVybiB0cnVlOworfQorPC9wcmU+Cis8L2xpPgorPC91bD4KKworPHA+VGhlIENvbXBhdGliaWxpdHkgTGlicmFyeSBjdXJyZW50bHkgZG9lcyBub3QgcHJvdmlkZSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGluY2x1ZGVkCitBUElzLiBUbyBnZW5lcmF0ZSB5b3VyIG93biBzZXQsIHVzaW5nIHRoZSB7QGNvZGUgamF2YWRvY30gdG9vbCwgcGVyZm9ybSB0aGUKK2ZvbGxvd2luZyBmcm9tIGEgY29tbWFuZCBsaW5lOjwvcD4KKworPHByZSBjbGFzcz0ibm8tcHJldHR5LXByaW50Ij4KK2NkICZsdDtzZGsmZ3Q7L2V4dHJhcy9hbmRyb2lkL2NvbXBhdGliaWxpdHkvdjQvCitta2RpciBkb2NzCitqYXZhZG9jIC1zb3VyY2VwYXRoIHNyYy9qYXZhLyAtc3VicGFja2FnZXMgYW5kcm9pZC5zdXBwb3J0LnY0IC1kIGRvY3MKKzwvcHJlPgorPHA+T3BlbiB0aGUge0Bjb2RlIGRvY3MvaW5kZXguaHRtbH0gZmlsZSB0byBiZWdpbiBicm93c2luZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uPC9wPgorCisKKzxkaXYgY2xhc3M9Im5vdGUiPjxwPjxzdHJvbmc+VGlwOjwvc3Ryb25nPiBUbyBlbmFibGUgdGhlIEhvbG9ncmFwaGljIHRoZW1lIG9uIGRldmljZXMKK3J1bm5pbmcgQW5kcm9pZCAzLjAgb3IgaGlnaGVyLCBkZWNsYXJlIGluIHlvdXIgbWFuaWZlc3QgZmlsZSB0aGF0IHlvdXIgYXBwbGljYXRpb24gdGFyZ2V0cworQVBJIGxldmVsIDExLiBGb3IgZXhhbXBsZTo8L3A+Cis8cHJlPgorJmx0O3VzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNCIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIxMSIgLyZndDsKKzwvcHJlPgorPHA+VGhpcyB3YXksIHlvdXIgYXBwbGljYXRpb24gYXV0b21hdGljYWxseSByZWNlaXZlcyB0aGUgSG9sb2dyYXBoaWMgdGhlbWUgYW5kIHRoZSBBY3Rpb24gQmFyIGZvciAKK2VhY2ggYWN0aXZpdHkgd2hlbiBydW5uaW5nIG9uIEFuZHJvaWQgMy4wIGFuZCBoaWdoZXIuPC9wPgorPC9kaXY+CisKKzxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB5b3UgY2FuIG9wdGltaXplIHlvdXIgYXBwbGljYXRpb24gZm9yIHRoZSBsYXRlc3QKK0FuZHJvaWQtcG93ZXJlZCBkZXZpY2VzLCByZWFkIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvb3B0aW1pemluZy1mb3ItMy4wLmh0bWwiPk9wdGltaXppbmcKK0FwcHMgZm9yIEFuZHJvaWQgMy4wPC9hPi48L3A+CisKKworPGgyIGlkPSJTYW1wbGVzIj5TYW1wbGVzPC9oMj4KKworPHA+SWYgeW91IHdhbnQgdG8gc2VlIHNvbWUgc2FtcGxlIGNvZGUgdGhhdCB1c2VzIHRoZSBDb21wYXRpYmlsaXR5IExpYnJhcnksIHRha2UgYSBsb29rIGF0IHRoZQorPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9pbmRleC5odG1sIj5BUEkKK0RlbW9zPC9hPiBzYW1wbGUgY29kZSB0aGF0J3MgaW5jbHVkZWQgd2l0aCB0aGUgU2FtcGxlcyBwYWNrYWdlIHlvdSBjYW4gZG93bmxvYWQgZnJvbSB0aGUgQVZEIGFuZCBTREsKK01hbmFnZXIuPC9wPgorCis8cD5BZGRpdGlvbmFsbHksIHRoZSA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvaW9zY2hlZC8iPkdvb2dsZSBJL08gQXBwPC9hPiBpcyBhIGNvbXBsZXRlCithcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIGxpYnJhcnkgdG8gcHJvdmlkZSBhIHNpbmdsZSBBUEsgZm9yIGJvdGggaGFuZHNldHMgYW5kIHRhYmxldHMgYW5kIGFsc28KK2RlbW9uc3RyYXRlcyBzb21lIG9mIEFuZHJvaWQncyBiZXN0IHByYWN0aWNlcyBpbiBBbmRyb2lkIFVJIGRlc2lnbi48L3A+CisKKworCisKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvZWNsaXBzZS1hZHQuamQgYi9kb2NzL2h0bWwvc2RrL2VjbGlwc2UtYWR0LmpkCmluZGV4IGZlYjg0YjEuLjkzNWJmNjMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvZWNsaXBzZS1hZHQuamQKKysrIGIvZG9jcy9odG1sL3Nkay9lY2xpcHNlLWFkdC5qZApAQCAtMSw4ICsxLDggQEAKIHBhZ2UudGl0bGU9QURUIFBsdWdpbiBmb3IgRWNsaXBzZQotYWR0LnppcC52ZXJzaW9uPTEwLjAuMQotYWR0LnppcC5kb3dubG9hZD1BRFQtMTAuMC4xLnppcAotYWR0LnppcC5ieXRlcz01MDk2MTgyCi1hZHQuemlwLmNoZWNrc3VtPWUyNmE3N2RiMDgzNzdiZGQyZTYyZWRlYjlhM2UzNzAxCithZHQuemlwLnZlcnNpb249MTEuMC4wCithZHQuemlwLmRvd25sb2FkPUFEVC0xMS4wLjAuemlwCithZHQuemlwLmJ5dGVzPVRPRE8KK2FkdC56aXAuY2hlY2tzdW09VE9ETwogCiBAamQ6Ym9keQogCkBAIC0xMDAsNiArMTAwLDEzOSBAQAogICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KICAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIKIHdpZHRoPSI5cHgiIC8+CitBRFQgMTEuMC4wPC9hPiA8ZW0+KEp1bmUgMjAxMSk8L2VtPgorICA8ZGQgY2xhc3M9InRvZ2dsZW1lIj4KKworPGRsPgorCis8ZHQ+RGVwZW5kZW5jaWVzOjwvZHQ+CisKKzxkZD5BRFQgMTEuMC4wIGlzIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCBTREsgVG9vbHMgcjExLiBJZiB5b3UgaGF2ZW4ndAorYWxyZWFkeSBpbnN0YWxsZWQgU0RLIFRvb2xzIHIxMSBpbnRvIHlvdXIgU0RLLCB1c2UgdGhlIEFuZHJvaWQgU0RLIGFuZCBBVkQgTWFuYWdlciB0byBkbworc28uPC9kZD4KKworPGR0PlZpc3VhbCBSZWZhY3RvcmluZzo8L2R0PgorPGRkPgorICA8dWw+CisgICAgPGxpPiJFeHRyYWN0IFN0eWxlIiBmZWF0dXJlIHB1bGxzIG91dCBzdHlsZS1yZWxhdGVkIGF0dHJpYnV0ZXMgZnJvbSB5b3VyIGxheW91dCBhbmQgZXh0cmFjdHMKK3RoZW0gYXMgYSBuZXcgc3R5bGUgZGVmaW5lZCBpbiB7QGNvZGUgc3R5bGVzLnhtbH0gKDxhCitocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L2V4dHJhY3RzdHlsZXJlZmFjdG9yaW5nIj5tb3JlIGluZm88L2E+KS48L2xpPgorICAgIDxsaT4iV3JhcCBpbiBDb250YWluZXIiIGZlYXR1cmUgbGV0cyB5b3Ugc2VsZWN0IGEgZ3JvdXAgb2Ygdmlld3MgdGhlbiBzdXJyb3VuZCB0aGVtCisgICAgaW4gYSBuZXcgbGF5b3V0IChhIG5ldyB2aWV3IGdyb3VwLCBzdWNoIGFzIGEgTGluZWFyTGF5b3V0KSwgYW5kIHRyYW5zZmVycyBuYW1lc3BhY2UgYW5kIGxheW91dAorICAgIHBhcmFtZXRlcnMgdG8gdGhlIG5ldyBwYXJlbnQgKDxhCitocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L25ld3JlZmFjdG9yaW5nc3dyYXBpbmNoYW5nZWxheW91dGNoYW5nZXdpZGdldCI+bW9yZQoraW5mbzwvYT4pLjwvbGk+CisgICAgPGxpPiJDaGFuZ2UgTGF5b3V0IiBmZWF0dXJlIGNoYW5nZXMgbGF5b3V0cyBmcm9tIG9uZSB0eXBlCisgICAgdG8gYW5vdGhlciwgYW5kIGNhbiBhbHNvIGZsYXR0ZW4gYSBsYXlvdXQgaGllcmFyY2h5ICg8YQoraHJlZj0iaHR0cDovL3Rvb2xzLmFuZHJvaWQuY29tL3JlY2VudC9uZXdyZWZhY3RvcmluZ3N3cmFwaW5jaGFuZ2VsYXlvdXRjaGFuZ2V3aWRnZXQiPm1vcmUKK2luZm88L2E+KS48L2xpPgorICAgIDxsaT4iQ2hhbmdlIFdpZGdldCBUeXBlIiBmZWF0dXJlIGNoYW5nZXMgdGhlIHR5cGUgb2YgdGhlCisgICAgc2VsZWN0ZWQgdmlld3MgdG8gYSBuZXcgdHlwZS4gQWxzbywgYSBuZXcgc2VsZWN0aW9uIGNvbnRleHQgbWVudQorICAgIGluIHRoZSB2aXN1YWwgbGF5b3V0IGVkaXRvciBtYWtlcyBpdCBlYXN5IHRvIHNlbGVjdCBzaWJsaW5ncyBhcworICAgIHdlbGwgYXMgdmlld3MgYW55d2hlcmUgaW4gdGhlIGxheW91dCB0aGF0IGhhdmUgdGhlIHNhbWUgdHlwZSAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvbmV3cmVmYWN0b3Jpbmdzd3JhcGluY2hhbmdlbGF5b3V0Y2hhbmdld2lkZ2V0Ij5tb3JlCitpbmZvPC9hPikuPC9saT4KKyAgICA8bGk+IkV4dHJhY3QgYXMgSW5jbHVkZSIgZmVhdHVyZSBmaW5kcyBpZGVudGljYWwgY29sbGVjdGlvbnMgb2Ygdmlld3MKKyAgICBpbiBvdGhlciBsYXlvdXRzIGFuZCBvZmZlcnMgdG8gY29tYmluZSB0aGVtIGludG8gYSBzaW5nbGUgbGF5b3V0IHRoYXQgeW91IGNhbiB0aGVuIGluY2x1ZGUgaW4KKyBlYWNoIGxheW91dCAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvZXh0cmFjdGFzaW5jbHVkZWltcHJvdmVtZW50cyI+bW9yZSBpbmZvPC9hPikuPC9saT4KKyAgICA8bGk+UXVpY2sgQXNzaXN0YW50IGluIEVjbGlwc2UgY2FuIGJlIGludm9rZWQKKyAgICBmcm9tIHRoZSBYTUwgZWRpdG9yICh3aXRoIEN0cmwtMSkgdG8gYXBwbHkgYW55IG9mIHRoZSBhYm92ZQorICAgIHJlZmFjdG9yaW5ncyAoYW5kIEV4dHJhY3QgU3RyaW5nKSB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gKDxhCitocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L3JlZmFjdG9yaW5ncXVpY2thc3Npc3RhbnQiPm1vcmUgaW5mbzwvYT4pLjwvbGk+CisgIDwvdWw+Cis8L2RkPgorCis8ZHQ+VmlzdWFsIExheW91dCBFZGl0b3I6PC9kdD4KKzxkZD4KKyAgPHVsPgorICAgIDxsaT5UaGlzIGlzIHRoZSB1cGRhdGUgdG8gdGhlIGxheW91dCBlZGl0b3IgeW91J3ZlIGJlZW4gd2FpdGluZyBmb3IhIEl0IGluY2x1ZGVzIChhbG1vc3QpIGFsbAordGhlIGdvb2RpZXMgZGVtb25zdHJhdGVkIGF0IEdvb2dsZSBJL08uIDxhIGhyZWY9Imh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1PcTA1S3FqWFR2cyI+V2F0Y2gKK3RoZSB2aWRlbzwvYT4gb24gWW91VHViZS48L2xpPgorICAgIDxsaT5UaGUgcGFsZXR0ZSBub3cgc3VwcG9ydHMgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIGZvciBzdXBwb3J0ZWQgd2lkZ2V0cy4gVGhhdCBpcywgYSBzaW5nbGUKK3ZpZXcgaXMgcHJlc2VudGVkIGluIHZhcmlvdXMgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIHRoYXQgeW91IGNhbiBkcmFnIGludG8geW91ciBsYXlvdXQuIEZvcgorZXhhbXBsZSwgdGhlcmUgaXMgYSA8ZW0+VGV4dCBGaWVsZHM8L2VtPiBwYWxldHRlIGNhdGVnb3J5IHdoZXJlIHlvdSBjYW4gZHJhZyBhbiB7QGxpbmsKK2FuZHJvaWQud2lkZ2V0LkVkaXRUZXh0fSB3aWRnZXQgaW4gYXMgYSBwYXNzd29yZCBmaWVsZCwgYW4gZS1tYWlsIGZpZWxkLCBhIHBob25lIGZpZWxkLCBvciBvdGhlcgordHlwZXMgb2YgdGV4dCBib3hlcy4gU2ltaWxhcmx5LCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXd9IHdpZGdldHMgYXJlIHByZWNvbmZpZ3VyZWQKK3dpdGggbGFyZ2UsIG5vcm1hbCBhbmQgc21hbGwgdGhlbWUgc2l6ZXMsIGFuZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0fSBlbGVtZW50cyBhcmUKK3ByZWNvbmZpZ3VyZWQgaW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgY29uZmlndXJhdGlvbnMgKDxhCitocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L211bHRpcGxldGV4dGZpZWxkYW5kbGF5b3V0dHlwZXMiPm1vcmUgaW5mbzwvYT4pLjwvbGk+CisgICAgPGxpPlRoZSBwYWxldHRlIHN1cHBvcnRzIGN1c3RvbSB2aWV3cy4gWW91IGNhbiBwaWNrIHVwIGFueSBjdXN0b20KKyAgICBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFZpZXcgY2xhc3MgeW91J3ZlIGNyZWF0ZWQgaW4geW91ciBwcm9qZWN0IG9yIGZyb20gaW5jbHVkZWQgbGlicmFyaWVzIGFuZAorZHJhZyB0aGVtIGludG8geW91ciBsYXlvdXQgKDxhCitocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L2N1c3RvbXZpZXdzaW50aGVwYWxldHRlIj5tb3JlIGluZm88L2E+KS48L2xpPgorICAgIDxsaT5GcmFnbWVudHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgcGFsZXR0ZSBmb3IgcGxhY2VtZW50IGluIHlvdXIgbGF5b3V0LiBJbiB0aGUgdG9vbCwgeW91IGNhbgorY2hvb3NlIHdoaWNoIGxheW91dCB0byBzaG93IHJlbmRlcmVkIGZvciBhIGdpdmVuIGZyYWdtZW50IHRhZy4gR28gdG8gZGVjbGFyYXRpb24gd29ya3MgZm9yIGZyYWdtZW50CitjbGFzc2VzICg8YSBocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L2ZyYWdtZW50c3VwcG9ydCI+bW9yZSBpbmZvPC9hPikuPC9saT4gCisgICAgPGxpPlRoZSBsYXlvdXQgZWRpdG9yIGF1dG9tYXRpY2FsbHkgYXBwbGllcyBhICJ6b29tIHRvIGZpdCIgZm9yIG5ld2x5CisgICAgb3BlbmVkIGZpbGVzIGFzIHdlbGwgYXMgb24gZGV2aWNlIHNpemUgYW5kIG9yaWVudGF0aW9uIGNoYW5nZXMgdG8KKyAgICBlbnN1cmUgdGhhdCBsYXJnZSBsYXlvdXRzIGFyZSBhbHdheXMgZnVsbHkgdmlzaWJsZSB1bmxlc3MgeW91CisgICAgbWFudWFsbHkgem9vbSBpbi48L2xpPgorICAgIDxsaT5Zb3UgY2FuIGRyb3AgaW4gYW4ge0Bjb2RlICZsdDtpbmNsdWRlJmd0O30gZWxlbWVudCBmcm9tIHRoZSBwYWxldHRlLCB3aGljaCB3aWxsIHBvcCB1cAorICAgIGEgbGF5b3V0IGNob29zZXIuIFdoZW4geW91IHNlbGVjdCB0aGUgbGF5b3V0IHRvIGluY2x1ZGUsIGl0IGlzIGFkZGVkIHdpdGggYW4ge0Bjb2RlCismbHQ7aW5jbHVkZSZndDt9LiBTaW1pbGFybHksIGRyb3BwaW5nIGltYWdlcyBvciBpbWFnZSBidXR0b25zIHdpbGwgcG9wIHVwIGltYWdlCisgICAgcmVzb3VyY2UgY2hvb3NlcnMgKDxhCitocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L2luY2x1ZGV0YWdkcm9wc3VwcG9ydCI+bW9yZSBpbmZvPC9hPikuPC9saT4KKyAgICA8bGk+VGhlIGNvbmZpZ3VyYXRpb24gY2hvb3NlciBub3cgYXBwbGllcyB0aGUgIlJlbmRlciBUYXJnZXQiIGFuZAorICAgICJMb2NhbGUiIHNldHRpbmdzIHByb2plY3Qgd2lkZSwgbWFraW5nIGl0IHRyaXZpYWwgdG8gY2hlY2sgdGhlCisgICAgbGF5b3V0cyBmb3IgZGlmZmVyZW50IGxhbmd1YWdlcyBvciByZW5kZXIgdGFyZ2V0cyB3aXRob3V0IGhhdmluZworICAgIHRvIGNvbmZpZ3VyZSB0aGVzZSBpbmRpdmlkdWFsbHkgZm9yIGVhY2ggbGF5b3V0LjwvbGk+CisgICAgPGxpPlRoZSBsYXlvdXQgZWRpdG9yIGlzIHNtYXJ0ZXIgYWJvdXQgcGlja2luZyBhIGRlZmF1bHQgdGhlbWUgdG8KKyAgICByZW5kZXIgYSBsYXlvdXQgd2l0aCwgY29uc3VsdGluZyBmYWN0b3JzIGxpa2UgdGhlbWUgcmVnaXN0cmF0aW9ucworICAgIGluIHRoZSBtYW5pZmVzdCwgdGhlIFNESyB2ZXJzaW9uLCBhbmQgb3RoZXIgZmFjdG9ycy48L2xpPgorICAgIDxsaT5UaGUgbGF5b3V0IGVkaXRvciBpcyBzbWFydGVyIGFib3V0IHBpY2tpbmcgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gcmVuZGVyIGEgbGF5b3V0Cit3aXRoLCBkZWZhdWx0aW5nIHRvIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBjb25maWd1cmF0aW9uIGluIHRoZSBwcmV2aW91cyBmaWxlLiBJdCBhbHNvIGNvbnNpZGVycyB0aGUKK1NESyB0YXJnZXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZGVmYXVsdCB0byBhIHRhYmxldCBvciBwaG9uZSBzY3JlZW4gc2l6ZS48L2xpPgorICAgIDxsaT5CYXNpYyBmb2N1cyBzdXBwb3J0LiBUaGUgZmlyc3QgdGV4dCBmaWVsZCBkcm9wcGVkIGluIGEgbGF5b3V0IGlzIGFzc2lnbmVkIGZvY3VzLCBhbmQgdGhlcmUKK2FyZSA8c3Ryb25nPlJlcXVlc3QgRm9jdXM8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Q2xlYXIgRm9jdXM8L3N0cm9uZz4gY29udGV4dCBtZW51IGl0ZW1zIG9uIHRleHQKK2ZpZWxkcyB0byBjaGFuZ2UgdGhlIGZvY3VzLjwvbGk+CisgIDwvdWw+Cis8L2RkPgorCis8ZHQ+WE1MIGVkaXRvcnM6PC9kdD4KKzxkZD4KKzx1bD4gIAorICA8bGk+Q29kZSBjb21wbGV0aW9uIGhhcyBiZWVuIHNpZ25pZmljYW50bHkgaW1wcm92ZWQuIEl0IG5vdyB3b3JrcworICB3aXRoIHtAY29kZSAmbHQ7c3R5bGUmZ3Q7fSBlbGVtZW50cywgY29tcGxldGVzIGRpbWVuc2lvbmFsIHVuaXRzLAorICBzb3J0cyByZXNvdXJjZSBwYXRocyBpbiB2YWx1ZXMgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZSBuYW1lLCBhbmQgbW9yZS4gVGhlcmUgYXJlIGFsc28gbWFueSBmaXhlcyB0bworaGFuZGxlIHRleHQgcmVwbGFjZW1lbnQgKDxhCitocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L3htbGNvZGVjb21wbGV0aW9uaW1wcm92ZW1lbnRzIj5tb3JlIGluZm88L2E+KS48L2xpPgorICA8bGk+QUFQVCBlcnJvcnMgYXJlIGhhbmRsZWQgYmV0dGVyLiBUaGV5IGFyZSBub3cgdW5kZXJsaW5lZCBmb3IgdGhlCisgIHJlbGV2YW50IHJhbmdlIGluIHRoZSBlZGl0b3IsIGFuZCBhIG5ldyBxdWlja2ZpeCBtYWtlcyBpdCB0cml2aWFsCisgIHRvIGNyZWF0ZSBtaXNzaW5nIHJlc291cmNlcy48L2xpPgorICA8bGk+Q29kZSBjb21wbGV0aW9uIGZvciBkcmF3YWJsZSwgYW5pbWF0aW9uIGFuZCBjb2xvciBYTUwgZmlsZXMgKDxhCitocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L2NvZGVjb21wbGV0aW9uZm9yZHJhd2FibGVzY29sb3JzYW5kYW5pbWF0aW9uZmlsZXMiPm1vcmUKK2luZm88L2E+KS48L2xpPgorPC91bD4KKzwvZGQ+CisKKzxkdD5ERE1TOjwvZHQ+Cis8ZGQ+Cis8dWw+ICAKKyAgPGxpPiJOZXcgRm9sZGVyIiBhY3Rpb24gaW4gdGhlIEZpbGUgRXhwbG9yZXIuPC9saT4KKyAgPGxpPlRoZSBzY3JlZW5zaG90IGRpYWxvZyB3aWxsIGFkZCB0aW1lc3RhbXBzIHRvIHRoZSBmaWxlbmFtZXMgYW5kIHByZXNlcnZlIHRoZSBvcmllbnRhdGlvbiBvbgorc25hcHNob3QgcmVmcmVzaC48L2xpPgorPC91bD4KKzwvZGQ+CisKKzxkdD5HZW5lcmFsIG5vdGVzOjwvZHQ+Cis8ZGQ+CisgIDx1bD4KKyAgICA8bGk+VHJhY2VWaWV3IHN1cHBvcnRzIHpvb21pbmcgd2l0aCB0aGUgbW91c2Utd2hlZWwgaW4gdGhlIHRpbWVsaW5lLjwvbGk+CisgICAgPGxpPlRoZSBOZXcgQW5kcm9pZCBQcm9qZWN0IHdpemFyZCBub3cgc3VwcG9ydHMgRWNsaXBzZSB3b3JraW5nIHNldHMuPC9saT4KKyAgPC91bD4KKzwvZGQ+Cis8L2RsPgorPHA+TW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0b29sIGNoYW5nZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQiPkFuZHJvaWQgVG9vbHMgUHJvamVjdCBTaXRlPC9hPi48L3A+Cis8L2Rpdj4KKzwvZGl2PgorCisKKzxkaXYgY2xhc3M9InRvZ2dsZWFibGUgY2xvc2VkIj4KKyAgPGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIHRvZ2dsZURpdih0aGlzKSI+CisgICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIiBjbGFzcz0idG9nZ2xlLWltZyIgaGVpZ2h0PSI5cHgiCit3aWR0aD0iOXB4IiAvPgogQURUIDEwLjAuMTwvYT4gPGVtPihNYXJjaCAyMDExKTwvZW0+CiAgIDxkaXYgY2xhc3M9InRvZ2dsZW1lIj4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9pbmRleC5qZCBiL2RvY3MvaHRtbC9zZGsvaW5kZXguamQKaW5kZXggN2MxYzg2ZC4uZTdiOGZiYiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2luZGV4LmpkCkBAIC0zMSw2ICszMSwxNiBAQAogICA8bGk+RXhwbG9yZSB0aGUgY29udGVudHMgb2YgdGhlIEFuZHJvaWQgU0RLIChvcHRpb25hbCkuPC9saT4KIDwvb2w+CiAKLTxwPlRvIGdldCBzdGFydGVkLCBkb3dubG9hZCB0aGUgYXBwcm9wcmlhdGUgcGFja2FnZSBmcm9tIHRoZSB0YWJsZSBhYm92ZSwgdGhlbiByZWFkIHRoZSBndWlkZSB0byA8YQotaHJlZj0iaW5zdGFsbGluZy5odG1sIj5JbnN0YWxsaW5nIHRoZSBTREs8L2E+LjwvcD4KKzxwIGNsYXNzPSJvbmxpbmUtbWVzc2FnZSI+VG8gZ2V0IHN0YXJ0ZWQsIGRvd25sb2FkIHRoZSBhcHByb3ByaWF0ZSBwYWNrYWdlIGZyb20gdGhlIHRhYmxlIGFib3ZlLAordGhlbiByZWFkIHRoZSBndWlkZSB0byA8YSBocmVmPSJpbnN0YWxsaW5nLmh0bWwiPkluc3RhbGxpbmcgdGhlIFNESzwvYT4uPC9wPgorCis8IS0tIG5vbi1pbmxpbmUgc3R5bGUgYW5kIGJhc2VkIG9uIG9ubHkgb25lIHNlbGVjdG9yIHNvIHRoYXQKKyAgICAgaXQgY2FuIGJlIG92ZXJyaWRlbiBieSB0aGUgc2RrcGFnZS5jcyB0ZW1wbGF0ZSAtLT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIC5vZmZsaW5lLW1lc3NhZ2UgeyBkaXNwbGF5Om5vbmU7IH0KKzwvc3R5bGU+CisgICAgICAKKzxwIGNsYXNzPSJvZmZsaW5lLW1lc3NhZ2UiPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBzZXQgdXAgeW91cgorZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHJlYWQgdGhlIGd1aWRlIHRvIDxhIGhyZWY9Imluc3RhbGxpbmcuaHRtbCI+SW5zdGFsbGluZyB0aGUgU0RLPC9hPi48L3A+CisKIDwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9zZGtfdG9jLmNzIGIvZG9jcy9odG1sL3Nkay9zZGtfdG9jLmNzCmluZGV4IDExZjI5YjEuLjViOTA1NTEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvc2RrX3RvYy5jcworKysgYi9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MKQEAgLTEsNiArMSw1IEBACiA8P2NzIGlmOiFzZGsucmVkaXJlY3QgPz4KLTx1bD48P2NzCi0gIGlmOmFuZHJvaWQud2hpY2hkb2MgPT0gIm9ubGluZSIgPz4KKzx1bD4KICAgPGxpPgogICAgIDxoMj4KICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QW5kcm9pZCBTREsgU3RhcnRlciBQYWNrYWdlPC9zcGFuPgpAQCAtMTIsNyArMTEsOCBAQAogICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9InpoLUNOIj7lvZPliY3nmoQgU0RLIOeJiOacrDwvc3Bhbj4KICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJ6aC1UVyI+55uu5YmNIFNESyDnmbzooYzniYjmnKw8L3NwYW4+CiAgICAgPC9oMj4KLSAgICA8dWw+CisgICAgPHVsPjw/Y3MKKyAgaWY6YW5kcm9pZC53aGljaGRvYyA9PSAib25saW5lIiA/PgogICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnNkay9pbmRleC5odG1sIj4KICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkRvd25sb2FkPC9zcGFuPgogICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJkZSI+SGVydW50ZXJsYWRlbjwvc3Bhbj4KQEAgLTIyLDcgKzIyLDggQEAKICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iamEiPuODgOOCpuODs+ODreODvOODiTwvc3Bhbj4KICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iemgtQ04iPuS4i+i9vTwvc3Bhbj4KICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iemgtVFciPuS4i+i8iTwvc3Bhbj4KLSAgICAgICAgPC9hPjwvbGk+CisgICAgICAgIDwvYT48L2xpPjw/Y3MgCisgIC9pZiA/PgogICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnNkay9pbnN0YWxsaW5nLmh0bWwiPgogICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SW5zdGFsbGluZyB0aGUgU0RLPC9zcGFuPgogICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJkZSI+SW5zdGFsbGllcmVuPC9zcGFuPgpAQCAtMzMsMTAgKzM0LDggQEAKICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iemgtQ04iPuWuieijhTwvc3Bhbj4KICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iemgtVFciPuWuieijnTwvc3Bhbj4KICAgICAgICAgPC9hPjwvbGk+Ci0KICAgICA8L3VsPgotICA8L2xpPgotICA8P2NzIC9pZiA/Pjw/Y3MKKyAgPC9saT48P2NzCiAgIGlmOnNkay5wcmV2aWV3ID8+CiAgIDxsaT48aDI+QW5kcm9pZCAzLjAgUHJldmlldyBTREs8L2gyPgogICAgIDx1bD4KQEAgLTEzOCw2ICsxMzcsOCBAQAogICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnNkay90b29scy1ub3Rlcy5odG1sIj5TREsgVG9vbHMsIHIxMTwvYT4gPHNwYW4KIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zZGsvd2luLXVzYi5odG1sIj5Hb29nbGUgVVNCIERyaXZlciwgcjQ8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zZGsvY29tcGF0aWJpbGl0eS1saWJyYXJ5Lmh0bWwiPkNvbXBhdGliaWxpdHkgTGlicmFyeSwgcjI8L2E+IDxzcGFuCitjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KICAgPGxpPgpAQCAtMTUyLDcgKzE1Myw3IEBACiAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iemgtVFciPjwvc3Bhbj4KICAgICAgIDwvaDI+CiAgICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnNkay9lY2xpcHNlLWFkdC5odG1sIj5BRFQgMTAuMC4xCisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL2VjbGlwc2UtYWR0Lmh0bWwiPkFEVCAxMS4wLjAKICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJkZSI+PC9zcGFuPgogICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImVzIj48L3NwYW4+CiAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iZnIiPjwvc3Bhbj4KQEAgLTE2MCw3ICsxNjEsNyBAQAogICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImphIj48L3NwYW4+CiAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iemgtQ04iPjwvc3Bhbj4KICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJ6aC1UVyI+PC9zcGFuPjwvYT4KLSAgICAgPCEtLSA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPiAtLT48L2xpPgorICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgogICAgIDwvdWw+CiAgIDwvbGk+CiAgIDxsaT4KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9BbmltYXRpb25EcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0FuaW1hdGlvbkRyYXdhYmxlLmphdmEKaW5kZXggZTI3NWJhOC4uMjIyMGY5NiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0FuaW1hdGlvbkRyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0FuaW1hdGlvbkRyYXdhYmxlLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKICAqIEFuaW1hdGlvbkRyYXdhYmxlIGZyYW1lQW5pbWF0aW9uID0gKEFuaW1hdGlvbkRyYXdhYmxlKSBpbWcuZ2V0QmFja2dyb3VuZCgpOwogICoKICAqIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24gKGxvb3BlZCBwbGF5YmFjayBieSBkZWZhdWx0KS4KLSAqIGZyYW1lQW5pbWF0aW9uLnN0YXJ0KCkKKyAqIGZyYW1lQW5pbWF0aW9uLnN0YXJ0KCk7CiAgKiA8L3ByZT4KICAqIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGd1aWRlIHRvIDxhCiAgKiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9hbmltYXRpb24tcmVzb3VyY2UuaHRtbCI+QW5pbWF0aW9uIFJlc291cmNlczwvYT4uPC9wPgpAQCAtMTkyLDYgKzE5Miw5IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRnJhbWUoRHJhd2FibGUgZnJhbWUsIGludCBkdXJhdGlvbikgewogICAgICAgICBtQW5pbWF0aW9uU3RhdGUuYWRkRnJhbWUoZnJhbWUsIGR1cmF0aW9uKTsKKyAgICAgICAgaWYgKG1DdXJGcmFtZSA8IDApIHsKKyAgICAgICAgICAgIHNldEZyYW1lKDAsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICBwcml2YXRlIHZvaWQgbmV4dEZyYW1lKGJvb2xlYW4gdW5zY2hlZHVsZSkgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0JpdG1hcERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQml0bWFwRHJhd2FibGUuamF2YQppbmRleCBjOWM5ZmQ3Li4zMTFmMDI0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQml0bWFwRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQml0bWFwRHJhd2FibGUuamF2YQpAQCAtMzg3LDcgKzM4Nyw3IEBACiAgICAgICAgICAgICBpZiAoc2hhZGVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAobUFwcGx5R3Jhdml0eSkgewogICAgICAgICAgICAgICAgICAgICBHcmF2aXR5LmFwcGx5KHN0YXRlLm1HcmF2aXR5LCBtQml0bWFwV2lkdGgsIG1CaXRtYXBIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qm91bmRzKCksIG1Ec3RSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCb3VuZHMoKSwgbURzdFJlY3QsIGlzTGF5b3V0UnRsU2VsZigpKTsKICAgICAgICAgICAgICAgICAgICAgbUFwcGx5R3Jhdml0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChiaXRtYXAsIG51bGwsIG1Ec3RSZWN0LCBzdGF0ZS5tUGFpbnQpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NsaXBEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NsaXBEcmF3YWJsZS5qYXZhCmluZGV4IGIzMzNlMDEuLjgzMDIwYWEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9DbGlwRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ2xpcERyYXdhYmxlLmphdmEKQEAgLTIwOSw3ICsyMDksNyBAQAogICAgICAgICBpZiAoKG1DbGlwU3RhdGUubU9yaWVudGF0aW9uICYgVkVSVElDQUwpICE9IDApIHsKICAgICAgICAgICAgIGggLT0gKGggLSBpaCkgKiAoMTAwMDAgLSBsZXZlbCkgLyAxMDAwMDsKICAgICAgICAgfQotICAgICAgICBHcmF2aXR5LmFwcGx5KG1DbGlwU3RhdGUubUdyYXZpdHksIHcsIGgsIGJvdW5kcywgcik7CisgICAgICAgIEdyYXZpdHkuYXBwbHkobUNsaXBTdGF0ZS5tR3Jhdml0eSwgdywgaCwgYm91bmRzLCByLCBpc0xheW91dFJ0bFNlbGYoKSk7CiAKICAgICAgICAgaWYgKHcgPiAwICYmIGggPiAwKSB7CiAgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGUuamF2YQppbmRleCAxNTlmMzcxZS4uODk5NGVmYyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKQEAgLTI4OCw2ICsyODgsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaWYgeW91IHdhbnQgdG8gY3JlYXRlIGFuIGRyYXdhYmxlIHRoYXQgaXMgUlRMIGF3YXJlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2syIGV4dGVuZHMgQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQSBEcmF3YWJsZSBjYW4gY2FsbCB0aGlzIHRvIGtub3cgd2hldGhlciB0aGUgPHZhcj53aG88L3Zhcj4gaXMgaW4gUlRMIGxheW91dCBkaXJlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB3aG8gVGhlIGRyYXdhYmxlIGJlaW5nIHVuc2NoZWR1bGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMYXlvdXRSdGwoRHJhd2FibGUgd2hvKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBCaW5kIGEge0BsaW5rIENhbGxiYWNrfSBvYmplY3QgdG8gdGhpcyBEcmF3YWJsZS4gIFJlcXVpcmVkIGZvciBjbGllbnRzCiAgICAgICogdGhhdCB3YW50IHRvIHN1cHBvcnQgYW5pbWF0ZWQgZHJhd2FibGVzLgogICAgICAqCkBAIC0zNjQsNiArMzc2LDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVXNlIHRoZSBjdXJyZW50IHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNhbGxiYWNrMn0gaW1wbGVtZW50YXRpb24gdG8ga25vdworICAgICAqIGlmIHRoaXMgRHJhd2FibGUgaXMgaGF2aW5nIGEgbGF5b3V0IGluIFJUTCBkaXJlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMYXlvdXRSdGxTZWxmKCkgeworICAgICAgICBmaW5hbCBDYWxsYmFjayBjYWxsYmFjayA9IGdldENhbGxiYWNrKCk7CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsIHx8ICEoY2FsbGJhY2sgaW5zdGFuY2VvZiBDYWxsYmFjazIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoQ2FsbGJhY2syKSBjYWxsYmFjaykuaXNMYXlvdXRSdGwodGhpcyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU3BlY2lmeSBhbiBhbHBoYSB2YWx1ZSBmb3IgdGhlIGRyYXdhYmxlLiAwIG1lYW5zIGZ1bGx5IHRyYW5zcGFyZW50LCBhbmQKICAgICAgKiAyNTUgbWVhbnMgZnVsbHkgb3BhcXVlLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NjYWxlRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TY2FsZURyYXdhYmxlLmphdmEKaW5kZXggYTdlZDBkMC4uY2JlMWYyZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NjYWxlRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU2NhbGVEcmF3YWJsZS5qYXZhCkBAIC0yMjEsNyArMjIxLDcgQEAKICAgICAgICAgICAgIGZpbmFsIGludCBpaCA9IG1pbiA/IG1TY2FsZVN0YXRlLm1EcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKSA6IDA7CiAgICAgICAgICAgICBoIC09IChpbnQpICgoaCAtIGloKSAqICgxMDAwMCAtIGxldmVsKSAqIG1TY2FsZVN0YXRlLm1TY2FsZUhlaWdodCAvIDEwMDAwKTsKICAgICAgICAgfQotICAgICAgICBHcmF2aXR5LmFwcGx5KG1TY2FsZVN0YXRlLm1HcmF2aXR5LCB3LCBoLCBib3VuZHMsIHIpOworICAgICAgICBHcmF2aXR5LmFwcGx5KG1TY2FsZVN0YXRlLm1HcmF2aXR5LCB3LCBoLCBib3VuZHMsIHIsIGlzTGF5b3V0UnRsU2VsZigpKTsKIAogICAgICAgICBpZiAodyA+IDAgJiYgaCA+IDApIHsKICAgICAgICAgICAgIG1TY2FsZVN0YXRlLm1EcmF3YWJsZS5zZXRCb3VuZHMoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQppbmRleCA5YWMxYTAwLi4zYzhhYmEzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQpAQCAtMTAwLDcgKzEwMCw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNBR0VfR1JBUEhJQ1NfQ09OU1RBTlRTID0gMHgwMDA4OwogCiAgICAgLyoqCi0gICAgICogQGhpZGUKICAgICAgKiBVU0FHRV9HUkFQSElDU19SRU5ERVJfVEFSR0VUIFRoZSBhbGxjYXRpb24gd2lsbCBiZSB1c2VkIGFzIGEKICAgICAgKiB0YXJnZXQgZm9yIG9mZnNjcmVlbiByZW5kZXJpbmcKICAgICAgKgpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCmluZGV4IGJkZGE4MzAuLmZhYzcxNDQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKQEAgLTI1LDEwICsyNSwxNSBAQAogcHVibGljIGNsYXNzIEZpZWxkUGFja2VyIHsKICAgICBwdWJsaWMgRmllbGRQYWNrZXIoaW50IGxlbikgewogICAgICAgICBtUG9zID0gMDsKKyAgICAgICAgbUxlbiA9IGxlbjsKICAgICAgICAgbURhdGEgPSBuZXcgYnl0ZVtsZW5dOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFsaWduKGludCB2KSB7CisgICAgICAgIGlmICgodiA8PSAwKSB8fCAoKHYgJiAodiAtIDEpKSAhPSAwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJTSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhcmd1bWVudCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG5vbi16ZXJvIHBvd2VyIG9mIDI6ICIgKyB2KTsKKyAgICAgICAgfQorCiAgICAgICAgIHdoaWxlICgobVBvcyAmICh2IC0gMSkpICE9IDApIHsKICAgICAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAwOwogICAgICAgICB9CkBAIC0zOCwxMSArNDMsMTggQEAKICAgICAgICAgbVBvcyA9IDA7CiAgICAgfQogICAgIHB1YmxpYyB2b2lkIHJlc2V0KGludCBpKSB7CisgICAgICAgIGlmICgoaSA8IDApIHx8IChpID49IG1MZW4pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUlNJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm91dCBvZiByYW5nZSBhcmd1bWVudDogIiArIGkpOworICAgICAgICB9CiAgICAgICAgIG1Qb3MgPSBpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNraXAoaW50IGkpIHsKLSAgICAgICAgbVBvcyArPSBpOworICAgICAgICBpbnQgcmVzID0gbVBvcyArIGk7CisgICAgICAgIGlmICgocmVzIDwgMCkgfHwgKHJlcyA+IG1MZW4pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUlNJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm91dCBvZiByYW5nZSBhcmd1bWVudDogIiArIGkpOworICAgICAgICB9CisgICAgICAgIG1Qb3MgPSByZXM7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CkBAIC0yNzcsNiArMjg5LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtRGF0YVtdOwogICAgIHByaXZhdGUgaW50IG1Qb3M7CisgICAgcHJpdmF0ZSBpbnQgbUxlbjsKIAogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQppbmRleCBkNTFjMjAyLi4xN2YwZmE2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiAKQEAgLTY4Myw5ICs2ODQsOCBAQAogICAgICAqIHByb2Nlc3Nlcy4KICAgICAgKi8KICAgICBwdWJsaWMgZW51bSBQcmlvcml0eSB7Ci0gICAgICAgIC8vIFJlbWFwIHRoZXNlIG51bWJlcnMgdG8gb3BhcXVlLi4uCi0gICAgICAgIExPVyAoNSksICAgICAvL0FORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCArIDUKLSAgICAgICAgTk9STUFMICgtNCk7ICAvL0FORFJPSURfUFJJT1JJVFlfRElTUExBWQorICAgICAgICBMT1cgKFByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0JBQ0tHUk9VTkQgKyAoNSAqIFByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0xFU1NfRkFWT1JBQkxFKSksCisgICAgICAgIE5PUk1BTCAoUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfRElTUExBWSk7CiAKICAgICAgICAgaW50IG1JRDsKICAgICAgICAgUHJpb3JpdHkoaW50IGlkKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKaW5kZXggZGM1ZmM4NC4uNzk5Mjg2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaApAQCAtNTUwLDYgKzU1MCw3IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lVVjQyMklbXTsgLy8gWVVZMgogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9ZVVY0MjBQW107IC8vIFlWMTIKICAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfUkdCNTY1W107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1JHQkE4ODg4W107CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX0pQRUdbXTsKIAogICAgIC8vIFZhbHVlcyBmb3IgZm9jdXMgbW9kZSBzZXR0aW5ncy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL1NlbnNvci5oIGIvaW5jbHVkZS9ndWkvU2Vuc29yLmgKaW5kZXggMmRlMDdiMS4uZTU5NzU3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvU2Vuc29yLmgKKysrIGIvaW5jbHVkZS9ndWkvU2Vuc29yLmgKQEAgLTIxLDggKzIxLDkgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9GbGF0dGVuYWJsZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KIApAQCAtNjQsNiArNjUsOCBAQAogICAgIGZsb2F0IGdldFJlc29sdXRpb24oKSBjb25zdDsKICAgICBmbG9hdCBnZXRQb3dlclVzYWdlKCkgY29uc3Q7CiAgICAgaW50MzJfdCBnZXRNaW5EZWxheSgpIGNvbnN0OworICAgIG5zZWNzX3QgZ2V0TWluRGVsYXlOcygpIGNvbnN0OworICAgIGludDMyX3QgZ2V0VmVyc2lvbigpIGNvbnN0OwogCiAgICAgLy8gRmxhdHRlbmFibGUgaW50ZXJmYWNlCiAgICAgdmlydHVhbCBzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgpIGNvbnN0OwpAQCAtODMsNiArODYsNyBAQAogICAgIGZsb2F0ICAgbVJlc29sdXRpb247CiAgICAgZmxvYXQgICBtUG93ZXI7CiAgICAgaW50MzJfdCBtTWluRGVsYXk7CisgICAgaW50MzJfdCBtVmVyc2lvbjsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAppbmRleCBjZGEyYmUwLi5kZDkzZmQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Q2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTQ0LDUwICs0NCw2IEBACiBwdWJsaWM6CiAKICAgICAvKgotICAgICAqICBTdGF0aWMgbWV0aG9kcyBmb3IgZWZmZWN0IGxpYnJhcmllcyBtYW5hZ2VtZW50LgotICAgICAqLwotCi0gICAgLyoKLSAgICAgKiAgIExvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBwYXRoIGlzIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgotICAgICAqICAgVGhpcyBtdXN0IGJlIHRoZSBmdWxsIHBhdGggb2YgYSBkeW5hbWljIGxpYnJhcnkgKC5zbykgaW1wbGVtZW50aW5nIG9uZSBvcgotICAgICAqICAgbW9yZSBlZmZlY3QgZW5naW5lcyBhbmQgZXhwb3NpbmcgdGhlIGVmZmVjdCBsaWJyYXJ5IGludGVyZmFjZSBkZXNjcmliZWQgaW4KLSAgICAgKiAgIEVmZmVjdEFwaS5oLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhbmRsZSBvbiB0aGUgbGlicmFyeSBmb3IgdXNlIGJ5Ci0gICAgICogICBmdXJ0aGVyIGNhbGwgdG8gdW5sb2FkRWZmZWN0TGlicmFyeSgpIHRvIHVubG9hZCB0aGUgbGlicmFyeS4KLSAgICAgKgotICAgICAqICAgUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBsaWJQYXRoOiAgICBmdWxsIHBhdGggb2YgdGhlIGR5bmFtaWMgbGlicmFyeSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAgICAgKiAgICAgICAgICBoYW5kbGU6ICAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgbGlicmFyeSBoYW5kbGUKLSAgICAgKgotICAgICAqICAgUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6Ci0gICAgICogICAgICAgICAgTk9fRVJST1IgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNvbmZpZ3VyZSBhdWRpbwotICAgICAqICAgICAgICAgIE5PX0lOSVQgICAgIGVmZmVjdCBmYWN0b3J5IG5vdCBpbml0aWFsaXplZCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3QgaW1wbGVtZW50IHJlcXVpcmVkIGZ1bmN0aW9ucwotICAgICAqICAgICAgICAgIEJBRF9WQUxVRSAgIGludmFsaWQgbGliUGF0aCBzdHJpbmcgb3IgaGFuZGxlCi0gICAgICoKLSAgICAgKiAgIFJldHVybmVkIHZhbHVlOgotICAgICAqICAgICAgICAgICpoYW5kbGUgdXBkYXRlZCB3aXRoIGxpYnJhcnkgaGFuZGxlCi0gICAgICovCi0gICAgc3RhdGljIHN0YXR1c190IGxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKTsKLQotICAgIC8qCi0gICAgICogICBVbmxvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBoYW5kbGUgaXMgZ2l2ZW4gYXMgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiAgIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgaGFuZGxlOiBsaWJyYXJ5IGhhbmRsZQotICAgICAqCi0gICAgICogICBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKLSAgICAgKiAgICAgICAgICBOT19FUlJPUiAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KLSAgICAgKiAgICAgICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2Ugb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY29uZmlndXJlIGF1ZGlvCi0gICAgICogICAgICAgICAgTk9fSU5JVCAgICAgZWZmZWN0IGZhY3Rvcnkgbm90IGluaXRpYWxpemVkCi0gICAgICogICAgICAgICAgQkFEX1ZBTFVFICAgaW52YWxpZCBoYW5kbGUKLSAgICAgKi8KLSAgICBzdGF0aWMgc3RhdHVzX3QgdW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKTsKLQotICAgIC8qCiAgICAgICogIFN0YXRpYyBtZXRob2RzIGZvciBlZmZlY3RzIGVudW1lcmF0aW9uLgogICAgICAqLwogCkBAIC0yOTgsNyArMjU0LDcgQEAKICAgICAgKi8KICAgICAgICAgICAgIGludDMyX3QgICAgIGlkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CiAKLSAgICAvKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdGhlIGVmZmVjdCAoc2VlIGVmZmVjdF9kZXNjcmlwdG9yX3QgaW4gRWZmZWN0QXBpLmgpLgorICAgIC8qIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUgZWZmZWN0IChzZWUgZWZmZWN0X2Rlc2NyaXB0b3JfdCBpbiBhdWRpb19lZmZlY3QuaCkuCiAgICAgICovCiAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IoKSBjb25zdDsKIApAQCAtMzI0LDcgKzI4MCw3IEBACiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqICAgICAgcGFyYW06ICBwb2ludGVyIHRvIGVmZmVjdF9wYXJhbV90IHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgICBhbmQgaXRzIHZhbHVlIChTZWUgRWZmZWN0QXBpLmgpLgorICAgICAqICAgICAgICAgIGFuZCBpdHMgdmFsdWUgKFNlZSBhdWRpb19lZmZlY3QuaCkuCiAgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgogICAgICAqICAtIElOVkFMSURfT1BFUkFUSU9OOiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSBjb250cm9sIG9mIHRoZSBlZmZlY3QgZW5naW5lLgpAQCAtMzQwLDcgKzI5Niw3IEBACiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqICAgICAgcGFyYW06ICBwb2ludGVyIHRvIGVmZmVjdF9wYXJhbV90IHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgICBhbmQgaXRzIHZhbHVlIChTZWUgRWZmZWN0QXBpLmgpLgorICAgICAqICAgICAgICAgIGFuZCBpdHMgdmFsdWUgKFNlZSBhdWRpb19lZmZlY3QuaCkuCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCkBAIC0zNjgsNyArMzI0LDcgQEAKICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICogICAgICBwYXJhbTogIHBvaW50ZXIgdG8gZWZmZWN0X3BhcmFtX3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcgotICAgICAqICAgICAgICAgIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgKFNlZSBFZmZlY3RBcGkuaCkuCisgICAgICogICAgICAgICAgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSAoU2VlIGF1ZGlvX2VmZmVjdC5oKS4KICAgICAgKgogICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KQEAgLTM3OSw3ICszMzUsNyBAQAogICAgICB2aXJ0dWFsIHN0YXR1c190ICAgZ2V0UGFyYW1ldGVyKGVmZmVjdF9wYXJhbV90ICpwYXJhbSk7CiAKICAgICAgLyogU2VuZHMgYSBjb21tYW5kIGFuZCByZWNlaXZlcyBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KLSAgICAgICogICAgIFNlZSBFZmZlY3RBcGkuaCBmb3IgZGV0YWlscyBvbiBlZmZlY3QgY29tbWFuZCgpIGZ1bmN0aW9uLCB2YWxpZCBjb21tYW5kIGNvZGVzCisgICAgICAqICAgICBTZWUgYXVkaW9fZWZmZWN0LmggZm9yIGRldGFpbHMgb24gZWZmZWN0IGNvbW1hbmQoKSBmdW5jdGlvbiwgdmFsaWQgY29tbWFuZCBjb2RlcwogICAgICAgKiAgICAgYW5kIGZvcm1hdHMuCiAgICAgICAqLwogICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAppbmRleCBiYWFiMmU4Li42MDU2ODBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCkBAIC0xMzAsNyArMTMwLDcgQEAKICAgICAgKiBzYW1wbGVSYXRlOiAgICAgICAgIFRyYWNrIHNhbXBsaW5nIHJhdGUgaW4gSHouCiAgICAgICogZm9ybWF0OiAgICAgICAgICAgICBBdWRpbyBmb3JtYXQgKGUuZyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBmb3Igc2lnbmVkCiAgICAgICogICAgICAgICAgICAgICAgICAgICAxNiBiaXRzIHBlciBzYW1wbGUpLgotICAgICAqIGNoYW5uZWxzOiAgICAgICAgICAgQ2hhbm5lbCBtYXNrOiBzZWUgYXVkaW9fY2hhbm5lbHNfdC4KKyAgICAgKiBjaGFubmVsTWFzazogICAgICAgIENoYW5uZWwgbWFzazogc2VlIGF1ZGlvX2NoYW5uZWxzX3QuCiAgICAgICogZnJhbWVDb3VudDogICAgICAgICBUb3RhbCBzaXplIG9mIHRyYWNrIFBDTSBidWZmZXIgaW4gZnJhbWVzLiBUaGlzIGRlZmluZXMgdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5IG9mIHRoZSB0cmFjay4KICAgICAgKiBmbGFnczogICAgICAgICAgICAgIEEgYml0bWFzayBvZiBhY291c3RpYyB2YWx1ZXMgZnJvbSBlbnVtIHJlY29yZF9mbGFncy4gIEl0IGVuYWJsZXMKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmQoaW50IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ICAgICAgICAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9JTl9NT05PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSAwLApAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoaW50IGlucHV0U291cmNlICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX0lOX01PTk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSAwLApAQCAtMzQ4LDggKzM0OCw4IEBACiAKICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPENsaWVudFJlY29yZFRocmVhZD4mIHRocmVhZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBvcGVuUmVjb3JkX2wodWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CkBAIC0zNjQsMTAgKzM2NCwxMCBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogCiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgbUZvcm1hdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtRm9ybWF0OwogICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbUlucHV0U291cmNlOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1SZXNlcnZlZDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtUmVzZXJ2ZWRbMl07CiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1czsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTGF0ZW5jeTsKIApAQCAtMzgyLDcgKzM4Miw3IEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5ld1Bvc2l0aW9uOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1VcGRhdGVQZXJpb2Q7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZsYWdzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2s7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlucHV0OwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCBkZTkyOGRhLi5kZjMwZThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtNjksOCArNjksOCBAQAogICAgICAgICAgICAgTVVURSAgICA9IDB4MDAwMDAwMDEKICAgICAgICAgfTsKICAgICAgICAgdWludDMyX3QgICAgZmxhZ3M7Ci0gICAgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudDsKICAgICAgICAgaW50ICAgICAgICAgZm9ybWF0OworICAgICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQ7IC8vIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBkbyBub3QgdXNlCiAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQ7CiAgICAgICAgIHNpemVfdCAgICAgIHNpemU7CiAgICAgICAgIHVuaW9uIHsKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAqIHNhbXBsZVJhdGU6ICAgICAgICAgVHJhY2sgc2FtcGxpbmcgcmF0ZSBpbiBIei4KICAgICAgKiBmb3JtYXQ6ICAgICAgICAgICAgIEF1ZGlvIGZvcm1hdCAoZS5nIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIGZvciBzaWduZWQKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIDE2IGJpdHMgcGVyIHNhbXBsZSkuCi0gICAgICogY2hhbm5lbHM6ICAgICAgICAgICBDaGFubmVsIG1hc2s6IHNlZSBhdWRpb19jaGFubmVsc190LgorICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrOiBzZWUgYXVkaW9fY2hhbm5lbHNfdC4KICAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIFRvdGFsIHNpemUgb2YgdHJhY2sgUENNIGJ1ZmZlciBpbiBmcmFtZXMuIFRoaXMgZGVmaW5lcyB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3kgb2YgdGhlIHRyYWNrLgogICAgICAqIGZsYWdzOiAgICAgICAgICAgICAgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzICAgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICAgPSAwLApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKCBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsTWFzayAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSAwLApAQCAtMTg3LDcgKzE4Nyw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoaW50IHN0cmVhbVR5cGUgICAgICA9LTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IDAsCkBAIC00MzgsOCArNDM4LDggQEAKICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+JiB0aHJlYWQpOwogICAgICAgICAgICAgc3RhdHVzX3QgY3JlYXRlVHJhY2tfbChpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC00NTksMTEgKzQ1OSwxMiBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogCiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZTsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtRm9ybWF0OwogICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbU11dGVkOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsczsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtUmVzZXJ2ZWQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrOwogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxhdGVuY3k7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmggYi9pbmNsdWRlL21lZGlhL0VmZmVjdEFwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFkODQ2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RBUElfSF8KLSNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RBUElfSF8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICBFZmZlY3QgY29udHJvbCBpbnRlcmZhY2UKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gVGhlIGVmZmVjdCBjb250cm9sIGludGVyZmFjZSBpcyBleHBvc2VkIGJ5IGVhY2ggZWZmZWN0IGVuZ2luZSBpbXBsZW1lbnRhdGlvbi4gSXQgY29uc2lzdHMgb2YKLS8vIGEgc2V0IG9mIGZ1bmN0aW9ucyBjb250cm9sbGluZyB0aGUgY29uZmlndXJhdGlvbiwgYWN0aXZhdGlvbiBhbmQgcHJvY2VzcyBvZiB0aGUgZW5naW5lLgotLy8gVGhlIGZ1bmN0aW9ucyBhcmUgZ3JvdXBlZCBpbiBhIHN0cnVjdHVyZSBvZiB0eXBlIGVmZmVjdF9pbnRlcmZhY2VfczoKLS8vICAgIHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgewotLy8gICAgICAgIGVmZmVjdF9wcm9jZXNzX3QgcHJvY2VzczsKLS8vICAgICAgICBlZmZlY3RfY29tbWFuZF90IGNvbW1hbmQ7Ci0vLyAgICB9OwotCi0KLS8vIGVmZmVjdF9pbnRlcmZhY2VfdDogRWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlIGhhbmRsZS4KLS8vIFRoZSBlZmZlY3RfaW50ZXJmYWNlX3Qgc2VydmVzIHR3byBwdXJwb3NlcyByZWdhcmRpbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBlZmZlY3QgZW5naW5lOgotLy8gLSAxIGl0IGlzIHRoZSBhZGRyZXNzIG9mIGEgcG9pbnRlciB0byBhbiBlZmZlY3RfaW50ZXJmYWNlX3Mgc3RydWN0dXJlIHdoZXJlIHRoZSBmdW5jdGlvbnMKLS8vIG9mIHRoZSBlZmZlY3QgY29udHJvbCBBUEkgZm9yIGEgcGFydGljdWxhciBlZmZlY3QgYXJlIGxvY2F0ZWQuCi0vLyAtIDIgaXQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbnRleHQgb2YgYSBwYXJ0aWN1bGFyIGVmZmVjdCBpbnN0YW5jZS4KLS8vIEEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgZWZmZWN0IGxpYnJhcnkgd291bGQgZGVmaW5lIGEgc3RydWN0dXJlIGFzIGZvbGxvd3M6Ci0vLyBzdHJ1Y3QgZWZmZWN0X21vZHVsZV9zIHsKLS8vICAgICAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOwotLy8gICAgICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7Ci0vLyAgICAgICAgZWZmZWN0X2NvbnRleHRfdCBjb250ZXh0OwotLy8gfQotLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIEVmZmVjdENyZWF0ZSgpIGZ1bmN0aW9uIHdvdWxkIHRoZW4gYWxsb2NhdGUgYSBzdHJ1Y3R1cmUgb2YgdGhpcwotLy8gdHlwZSBhbmQgcmV0dXJuIGl0cyBhZGRyZXNzIGFzIGVmZmVjdF9pbnRlcmZhY2VfdAotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICoqZWZmZWN0X2ludGVyZmFjZV90OwotCi0KLS8vIEVmZmVjdCBBUEkgdmVyc2lvbiAxLjAKLSNkZWZpbmUgRUZGRUNUX0FQSV9WRVJTSU9OIDB4MDEwMCAvLyBGb3JtYXQgMHhNTW1tIE1NOiBNYWpvciB2ZXJzaW9uLCBtbTogbWlub3IgdmVyc2lvbgotCi0vLyBNYXhpbXVtIGxlbmd0aCBvZiBjaGFyYWN0ZXIgc3RyaW5ncyBpbiBzdHJ1Y3R1cmVzIGRlZmluZXMgYnkgdGhpcyBBUEkuCi0jZGVmaW5lIEVGRkVDVF9TVFJJTkdfTEVOX01BWCA2NAotCi0vLwotLy8tLS0gRWZmZWN0IGRlc2NyaXB0b3Igc3RydWN0dXJlIGVmZmVjdF9kZXNjcmlwdG9yX3QKLS8vCi0KLS8vIFVuaXF1ZSBlZmZlY3QgSUQgKGNhbiBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNpdGU6Ci0vLyAgaHR0cDovL3d3dy5pdHUuaW50L0lUVS1UL2FzbjEvdXVpZC5odG1sKQotLy8gVGhpcyBmb3JtYXQgaXMgdXNlZCBmb3IgYm90aCAidHlwZSIgYW5kICJ1dWlkIiBmaWVsZHMgb2YgdGhlIGVmZmVjdCBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KLS8vIC0gV2hlbiB1c2VkIGZvciBlZmZlY3QgdHlwZSBhbmQgdGhlIGVuZ2luZSBpcyBpbXBsZW1lbnRpbmcgYW5kIGVmZmVjdCBjb3JyZXNwb25kaW5nIHRvIGEgc3RhbmRhcmQKLS8vIE9wZW5TTCBFUyBpbnRlcmZhY2UsIHRoaXMgSUQgbXVzdCBiZSB0aGUgb25lIGRlZmluZWQgaW4gT3BlblNMRVNfSUlELmggZm9yIHRoYXQgaW50ZXJmYWNlLgotLy8gLSBXaGVuIHVzZWQgYXMgdXVpZCwgaXQgc2hvdWxkIGJlIGEgdW5pcXVlIFVVSUQgZm9yIHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi4KLXR5cGVkZWYgc3RydWN0IGVmZmVjdF91dWlkX3MgewotICAgIHVpbnQzMl90IHRpbWVMb3c7Ci0gICAgdWludDE2X3QgdGltZU1pZDsKLSAgICB1aW50MTZfdCB0aW1lSGlBbmRWZXJzaW9uOwotICAgIHVpbnQxNl90IGNsb2NrU2VxOwotICAgIHVpbnQ4X3Qgbm9kZVs2XTsKLX0gZWZmZWN0X3V1aWRfdDsKLQotLy8gTlVMTCBVVUlEIGRlZmluaXRpb24gKG1hdGNoZXMgU0xfSUlEX05VTExfKQotI2RlZmluZSBFRkZFQ1RfVVVJRF9JTklUSUFMSVpFUiB7IDB4ZWM3MTc4ZWMsIDB4ZTVlMSwgMHg0NDMyLCAweGEzZjQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4NDYsIDB4NTcsIDB4ZTYsIDB4NzksIDB4NTIsIDB4MTAgfSB9Ci1zdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBFRkZFQ1RfVVVJRF9OVUxMXyA9IEVGRkVDVF9VVUlEX0lOSVRJQUxJWkVSOwotY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IEVGRkVDVF9VVUlEX05VTEwgPSAmRUZGRUNUX1VVSURfTlVMTF87Ci1jb25zdCBjaGFyICogY29uc3QgRUZGRUNUX1VVSURfTlVMTF9TVFIgPSAiZWM3MTc4ZWMtZTVlMS00NDMyLWEzZjQtNDY1N2U2Nzk1MjEwIjsKLQotLy8gVGhlIGVmZmVjdCBkZXNjcmlwdG9yIGNvbnRhaW5zIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBmYWNpbGl0YXRlIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgZWZmZWN0Ci0vLyBlbmdpbmVzIHByZXNlbnQgaW4gYSBsaWJyYXJ5LgotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2Rlc2NyaXB0b3JfcyB7Ci0gICAgZWZmZWN0X3V1aWRfdCB0eXBlOyAgICAgLy8gVVVJRCBvZiB0byB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdAotICAgIGVmZmVjdF91dWlkX3QgdXVpZDsgICAgIC8vIFVVSUQgZm9yIHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbgotICAgIHVpbnQxNl90IGFwaVZlcnNpb247ICAgIC8vIFZlcnNpb24gb2YgdGhlIGVmZmVjdCBBUEkgaW1wbGVtZW50ZWQ6IG1hdGNoZXMgRUZGRUNUX0FQSV9WRVJTSU9OCi0gICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgLy8gZWZmZWN0IGVuZ2luZSBjYXBhYmlsaXRpZXMvcmVxdWlyZW1lbnRzIGZsYWdzIChzZWUgYmVsb3cpCi0gICAgdWludDE2X3QgY3B1TG9hZDsgICAgICAgLy8gQ1BVIGxvYWQgaW5kaWNhdGlvbiAoc2VlIGJlbG93KQotICAgIHVpbnQxNl90IG1lbW9yeVVzYWdlOyAgIC8vIERhdGEgTWVtb3J5IHVzYWdlIChzZWUgYmVsb3cpCi0gICAgY2hhciAgICBuYW1lW0VGRkVDVF9TVFJJTkdfTEVOX01BWF07ICAgLy8gaHVtYW4gcmVhZGFibGUgZWZmZWN0IG5hbWUKLSAgICBjaGFyICAgIGltcGxlbWVudG9yW0VGRkVDVF9TVFJJTkdfTEVOX01BWF07ICAgIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBpbXBsZW1lbnRvciBuYW1lCi19IGVmZmVjdF9kZXNjcmlwdG9yX3Q7Ci0KLS8vIENQVSBsb2FkIGFuZCBtZW1vcnkgdXNhZ2UgaW5kaWNhdGlvbjogZWFjaCBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGFuIGluZGljYXRpb24gb2YKLS8vIGl0cyBDUFUgYW5kIG1lbW9yeSB1c2FnZSBmb3IgdGhlIGF1ZGlvIGVmZmVjdCBmcmFtZXdvcmsgdG8gbGltaXQgdGhlIG51bWJlciBvZiBlZmZlY3RzCi0vLyBpbnN0YW50aWF0ZWQgYXQgYSBnaXZlbiB0aW1lIG9uIGEgZ2l2ZW4gcGxhdGZvcm0uCi0vLyBUaGUgQ1BVIGxvYWQgaXMgZXhwcmVzc2VkIGluIDAuMSBNSVBTIHVuaXRzIGFzIGVzdGltYXRlZCBvbiBhbiBBUk05RSBjb3JlIChBUk12NVRFKSB3aXRoIDAgV1MuCi0vLyBUaGUgbWVtb3J5IHVzYWdlIGlzIGV4cHJlc3NlZCBpbiBLQiBhbmQgaW5jbHVkZXMgb25seSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5Ci0KLS8vIERlZmluaXRpb25zIGZvciBmbGFncyBmaWVsZCBvZiBlZmZlY3QgZGVzY3JpcHRvci4KLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgIHwgYml0cyAgICAgIHwgdmFsdWVzCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgY29ubmVjdGlvbiBtb2RlICAgICAgICAgICB8IDAuLjEgICAgICB8IDAgaW5zZXJ0OiBhZnRlciB0cmFjayBwcm9jZXNzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBhdXhpbGlhcnk6IGNvbm5lY3QgdG8gdHJhY2sgYXV4aWxpYXJ5Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgIG91dHB1dCBhbmQgdXNlIHNlbmQgbGV2ZWwKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHJlcGxhY2U6IHJlcGxhY2VzIHRyYWNrIHByb2Nlc3MgZnVuY3Rpb247Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBtdXN0IGltcGxlbWVudCBTUkMsIHZvbHVtZSBhbmQgbW9ubyB0byBzdGVyZW8uCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IGluc2VydGlvbiBwcmVmZXJlbmNlICAgICAgfCAyLi40ICAgICAgfCAwIG5vbmUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIGZpcnN0IG9mIHRoZSBjaGFpbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgbGFzdCBvZiB0aGUgY2hhaW4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAzIGV4Y2x1c2l2ZSAob25seSBlZmZlY3QgaW4gdGhlIGluc2VydCBjaGFpbikKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCA0Li43IHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgVm9sdW1lIG1hbmFnZW1lbnQgICAgICAgICB8IDUuLjYgICAgICB8IDAgbm9uZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgaW1wbGVtZW50cyB2b2x1bWUgY29udHJvbAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgcmVxdWlyZXMgdm9sdW1lIGluZGljYXRpb24KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAzIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgRGV2aWNlIGluZGljYXRpb24gICAgICAgICB8IDcuLjggICAgICB8IDAgbm9uZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgcmVxdWlyZXMgZGV2aWNlIHVwZGF0ZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyLi4zIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgU2FtcGxlIGlucHV0IG1vZGUgICAgICAgICB8IDkuLjEwICAgICB8IDAgZGlyZWN0OiBwcm9jZXNzKCkgZnVuY3Rpb24gb3IgRUZGRUNUX0NNRF9DT05GSUdVUkUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbW1hbmQgbXVzdCBzcGVjaWZ5IGEgYnVmZmVyIGRlc2NyaXB0b3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHByb3ZpZGVyOiBwcm9jZXNzKCkgZnVuY3Rpb24gdXNlcyB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlclByb3ZpZGVyIGluZGljYXRlZCBieSB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQgdG8gcmVxdWVzdCBpbnB1dC4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlcnMuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiBib3RoOiBib3RoIGlucHV0IG1vZGVzIGFyZSBzdXBwb3J0ZWQKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAzIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgU2FtcGxlIG91dHB1dCBtb2RlICAgICAgICB8IDExLi4xMiAgICB8IDAgZGlyZWN0OiBwcm9jZXNzKCkgZnVuY3Rpb24gb3IgRUZGRUNUX0NNRF9DT05GSUdVUkUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbW1hbmQgbXVzdCBzcGVjaWZ5IGEgYnVmZmVyIGRlc2NyaXB0b3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHByb3ZpZGVyOiBwcm9jZXNzKCkgZnVuY3Rpb24gdXNlcyB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlclByb3ZpZGVyIGluZGljYXRlZCBieSB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQgdG8gcmVxdWVzdCBvdXRwdXQKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlcnMuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiBib3RoOiBib3RoIG91dHB1dCBtb2RlcyBhcmUgc3VwcG9ydGVkCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IEhhcmR3YXJlIGFjY2VsZXJhdGlvbiAgICAgfCAxMy4uMTUgICAgfCAwIE5vIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgbm9uIHR1bm5lbGVkIGh3IGFjY2VsZXJhdGlvbjogdGhlIHByb2Nlc3MoKSBmdW5jdGlvbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgcmVhZHMgdGhlIHNhbXBsZXMsIHNlbmQgdGhlbSB0byBIVyBhY2NlbGVyYXRlZAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgZWZmZWN0IHByb2Nlc3NvciwgcmVhZHMgYmFjayB0aGUgcHJvY2Vzc2VkIHNhbXBsZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGFuZCByZXR1cm5zIHRoZW0gdG8gdGhlIG91dHB1dCBidWZmZXIuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiB0dW5uZWxlZCBodyBhY2NlbGVyYXRpb246IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gaXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIHRyYW5zcGFyZW50LiBUaGUgZWZmZWN0IGludGVyZmFjZSBpcyBvbmx5IHVzZWQgdG8KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbnRyb2wgdGhlIGVmZmVjdCBlbmdpbmUuIFRoaXMgbW9kZSBpcyByZWxldmFudCBmb3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGdsb2JhbCBlZmZlY3RzIGFjdHVhbGx5IGFwcGxpZWQgYnkgdGhlIGF1ZGlvCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBoYXJkd2FyZSBvbiB0aGUgb3V0cHV0IHN0cmVhbS4KLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBBdWRpbyBNb2RlIGluZGljYXRpb24gICAgIHwgMTYuLjE3ICAgIHwgMCBub25lCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSByZXF1aXJlcyBhdWRpbyBtb2RlIHVwZGF0ZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyLi4zIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBJbnNlcnQgbW9kZQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX1JFUExBQ0UgICAgICAgIDB4MDAwMDAwMDIKLQotLy8gSW5zZXJ0IHByZWZlcmVuY2UKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX01BU0sgICAgICAgICAweDAwMDAwMDFDCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9BTlkgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUgICAgMHgwMDAwMDAwQwotCi0KLS8vIFZvbHVtZSBjb250cm9sCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLICAgICAgICAgMHgwMDAwMDA2MAotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9OT05FICAgICAgICAgMHgwMDAwMDAwMAotCi0vLyBEZXZpY2UgaW5kaWNhdGlvbgotI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfTUFTSyAgICAgICAgIDB4MDAwMDAxODAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0RFVklDRV9OT05FICAgICAgICAgMHgwMDAwMDAwMAotCi0vLyBTYW1wbGUgaW5wdXQgbW9kZXMKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfTUFTSyAgICAgICAgICAweDAwMDAwNjAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX0RJUkVDVCAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlBVVF9QUk9WSURFUiAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfQk9USCAgICAgICAgICAweDAwMDAwNDAwCi0KLS8vIFNhbXBsZSBvdXRwdXQgbW9kZXMKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX01BU0sgICAgICAgICAgMHgwMDAwMTgwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfRElSRUNUICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9QUk9WSURFUiAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX0JPVEggICAgICAgICAgMHgwMDAwMTAwMAotCi0vLyBIYXJkd2FyZSBhY2NlbGVyYXRpb24gbW9kZQotI2RlZmluZSBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSyAgICAgICAgICAweDAwMDA2MDAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19TSU1QTEUgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTCAgICAgICAgMHgwMDAwNDAwMAotCi0vLyBBdWRpbyBtb2RlIGluZGljYXRpb24KLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9NQVNLICAgICAgMHgwMDAxODAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTk9ORSAgICAgIDB4MDAwMDAwMDAKLQotLy8gRm9yd2FyZCBkZWZpbml0aW9uIG9mIHR5cGUgYXVkaW9fYnVmZmVyX3QKLXR5cGVkZWYgc3RydWN0IGF1ZGlvX2J1ZmZlcl9zIGF1ZGlvX2J1ZmZlcl90OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEZ1bmN0aW9uOiAgICAgICBwcm9jZXNzCi0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLiBUYWtlcyBpbnB1dCBzYW1wbGVzIGFzIHNwZWNpZmllZAotLy8gICAgICAgICAgKGNvdW50IGFuZCBsb2NhdGlvbikgaW4gaW5wdXQgYnVmZmVyIGRlc2NyaXB0b3IgYW5kIG91dHB1dCBwcm9jZXNzZWQKLS8vICAgICAgICAgIHNhbXBsZXMgYXMgc3BlY2lmaWVkIGluIG91dHB1dCBidWZmZXIgZGVzY3JpcHRvci4gSWYgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yCi0vLyAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkIHRoZSBmdW5jdGlvbiBtdXN0IHVzZSBlaXRoZXIgdGhlIGJ1ZmZlciBvciB0aGUKLS8vICAgICAgICAgIGJ1ZmZlciBwcm92aWRlciBmdW5jdGlvbiBpbnN0YWxsZWQgYnkgdGhlIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQuCi0vLyAgICAgICAgICBUaGUgZWZmZWN0IGZyYW1ld29yayB3aWxsIGNhbGwgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBhZnRlciB0aGUgRUZGRUNUX0NNRF9FTkFCTEUKLS8vICAgICAgICAgIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIHVudGlsIHRoZSBFRkZFQ1RfQ01EX0RJU0FCTEUgaXMgcmVjZWl2ZWQuIFdoZW4gdGhlIGVuZ2luZQotLy8gICAgICAgICAgcmVjZWl2ZXMgdGhlIEVGRkVDVF9DTURfRElTQUJMRSBjb21tYW5kIGl0IHNob3VsZCB0dXJuIG9mZiB0aGUgZWZmZWN0IGdyYWNlZnVsbHkKLS8vICAgICAgICAgIGFuZCB3aGVuIGRvbmUgaW5kaWNhdGUgdGhhdCBpdCBpcyBPSyB0byBzdG9wIGNhbGxpbmcgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBieQotLy8gICAgICAgICAgcmV0dXJuaW5nIHRoZSAtRU5PREFUQSBzdGF0dXMuCi0vLwotLy8gICAgTk9URTogdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgInJlYWwtdGltZSBzYWZlIiB0aGF0IGlzCi0vLyAgICAgIGl0IHNob3VsZCBub3QgcGVyZm9ybSBibG9ja2luZyBjYWxsczogbWFsbG9jL2ZyZWUsIHNsZWVwLCByZWFkL3dyaXRlL29wZW4vY2xvc2UsCi0vLyAgICAgIHB0aHJlYWRfY29uZF93YWl0L3B0aHJlYWRfbXV0ZXhfbG9jay4uLgotLy8KLS8vICAgIElucHV0OgotLy8gICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90OiBoYW5kbGUgdG8gdGhlIGVmZmVjdCBpbnRlcmZhY2UgdGhpcyBmdW5jdGlvbgotLy8gICAgICAgICAgICAgIGlzIGNhbGxlZCBvbi4KLS8vICAgICAgICAgIGluQnVmZmVyOiAgIGJ1ZmZlciBkZXNjcmlwdG9yIGluZGljYXRpbmcgd2hlcmUgdG8gcmVhZCBzYW1wbGVzIHRvIHByb2Nlc3MuCi0vLyAgICAgICAgICAgICAgSWYgTlVMTCwgdXNlIHRoZSBjb25maWd1cmF0aW9uIHBhc3NlZCBieSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgotLy8KLS8vICAgICAgICAgIGluQnVmZmVyOiAgIGJ1ZmZlciBkZXNjcmlwdG9yIGluZGljYXRpbmcgd2hlcmUgdG8gd3JpdGUgcHJvY2Vzc2VkIHNhbXBsZXMuCi0vLyAgICAgICAgICAgICAgSWYgTlVMTCwgdXNlIHRoZSBjb25maWd1cmF0aW9uIHBhc3NlZCBieSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgotLy8KLS8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCBzdWNjZXNzZnVsIG9wZXJhdGlvbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9EQVRBIHRoZSBlbmdpbmUgaGFzIGZpbmlzaGVkIHRoZSBkaXNhYmxlIHBoYXNlIGFuZCB0aGUgZnJhbWV3b3JrCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gc3RvcCBjYWxsaW5nIHByb2Nlc3MoKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlIG9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGlucHV0L291dHB1dCBidWZmZXIgZGVzY3JpcHRpb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi10eXBlZGVmIGludDMyX3QgKCplZmZlY3RfcHJvY2Vzc190KShlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEZ1bmN0aW9uOiAgICAgICBjb21tYW5kCi0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotLy8KLS8vICAgIElucHV0OgotLy8gICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90OiBoYW5kbGUgdG8gdGhlIGVmZmVjdCBpbnRlcmZhY2UgdGhpcyBmdW5jdGlvbgotLy8gICAgICAgICAgICAgIGlzIGNhbGxlZCBvbi4KLS8vICAgICAgICAgIGNtZENvZGU6ICAgIGNvbW1hbmQgY29kZTogdGhlIGNvbW1hbmQgY2FuIGJlIGEgc3RhbmRhcmRpemVkIGNvbW1hbmQgZGVmaW5lZCBpbgotLy8gICAgICAgICAgICAgIGVmZmVjdF9jb21tYW5kX2UgKHNlZSBiZWxvdykgb3IgYSBwcm9wcmlldGFyeSBjb21tYW5kLgotLy8gICAgICAgICAgY21kU2l6ZTogICAgc2l6ZSBvZiBjb21tYW5kIGluIGJ5dGVzCi0vLyAgICAgICAgICBwQ21kRGF0YTogICBwb2ludGVyIHRvIGNvbW1hbmQgZGF0YQotLy8gICAgICAgICAgcFJlcGx5RGF0YTogcG9pbnRlciB0byByZXBseSBkYXRhCi0vLwotLy8gICAgSW5wdXQvT3V0cHV0OgotLy8gICAgICAgICAgcmVwbHlTaXplOiBtYXhpbXVtIHNpemUgb2YgcmVwbHkgZGF0YSBhcyBpbnB1dAotLy8gICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIHNpemUgb2YgcmVwbHkgZGF0YSBhcyBvdXRwdXQKLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgICByZXR1cm5lZCB2YWx1ZTogMCAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlIG9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGNvbW1hbmQvcmVwbHkgc2l6ZSBvciBmb3JtYXQgYWNjb3JkaW5nIHRvIGNvbW1hbmQgY29kZQotLy8gICAgICAgICAgICAgIFRoZSByZXR1cm4gY29kZSBzaG91bGQgYmUgcmVzdHJpY3RlZCB0byBpbmRpY2F0ZSBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZSB0aGlzCi0vLyAgICAgICAgICAgICAgQVBJIHNwZWNpZmljYXRpb24uIFN0YXR1cyByZWxhdGVkIHRvIHRoZSBleGVjdXRpb24gb2YgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgc2hvdWxkIGJlCi0vLyAgICAgICAgICAgICAgaW5kaWNhdGVkIGFzIHBhcnQgb2YgdGhlIHJlcGx5IGZpZWxkLgotLy8KLS8vICAgICAgICAgICpwUmVwbHlEYXRhIHVwZGF0ZWQgd2l0aCBjb21tYW5kIHJlc3BvbnNlCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXR5cGVkZWYgaW50MzJfdCAoKmVmZmVjdF9jb21tYW5kX3QpKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKTsKLQotCi0vLyBFZmZlY3QgY29udHJvbCBpbnRlcmZhY2UgZGVmaW5pdGlvbgotc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyB7Ci0gICAgZWZmZWN0X3Byb2Nlc3NfdCBwcm9jZXNzOwotICAgIGVmZmVjdF9jb21tYW5kX3QgY29tbWFuZDsKLX07Ci0KLQotLy8KLS8vLS0tIFN0YW5kYXJkaXplZCBjb21tYW5kIGNvZGVzIGZvciBjb21tYW5kKCkgZnVuY3Rpb24KLS8vCi1lbnVtIGVmZmVjdF9jb21tYW5kX2UgewotICAgRUZGRUNUX0NNRF9JTklULCAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBlZmZlY3QgZW5naW5lCi0gICBFRkZFQ1RfQ01EX0NPTkZJR1VSRSwgICAgICAgICAgICAvLyBjb25maWd1cmUgZWZmZWN0IGVuZ2luZSAoc2VlIGVmZmVjdF9jb25maWdfdCkKLSAgIEVGRkVDVF9DTURfUkVTRVQsICAgICAgICAgICAgICAgIC8vIHJlc2V0IGVmZmVjdCBlbmdpbmUKLSAgIEVGRkVDVF9DTURfRU5BQkxFLCAgICAgICAgICAgICAgIC8vIGVuYWJsZSBlZmZlY3QgcHJvY2VzcwotICAgRUZGRUNUX0NNRF9ESVNBQkxFLCAgICAgICAgICAgICAgLy8gZGlzYWJsZSBlZmZlY3QgcHJvY2VzcwotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0sICAgICAgICAgICAgLy8gc2V0IHBhcmFtZXRlciBpbW1lZGlhdGVseSAoc2VlIGVmZmVjdF9wYXJhbV90KQotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQsICAgLy8gc2V0IHBhcmFtZXRlciBkZWZlcnJlZAotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlULCAgICAgLy8gY29tbWl0IHByZXZpb3VzIHNldCBwYXJhbWV0ZXIgZGVmZXJyZWQKLSAgIEVGRkVDVF9DTURfR0VUX1BBUkFNLCAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXIKLSAgIEVGRkVDVF9DTURfU0VUX0RFVklDRSwgICAgICAgICAgIC8vIHNldCBhdWRpbyBkZXZpY2UgKHNlZSBhdWRpb19kZXZpY2VfZSkKLSAgIEVGRkVDVF9DTURfU0VUX1ZPTFVNRSwgICAgICAgICAgIC8vIHNldCB2b2x1bWUKLSAgIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREUsICAgICAgIC8vIHNldCB0aGUgYXVkaW8gbW9kZSAobm9ybWFsLCByaW5nLCAuLi4pCi0gICBFRkZFQ1RfQ01EX0ZJUlNUX1BST1BSSUVUQVJZID0gMHgxMDAwMCAvLyBmaXJzdCBwcm9wcmlldGFyeSBjb21tYW5kIGNvZGUKLX07Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfSU5JVAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgSW5pdGlhbGl6ZSBlZmZlY3QgZW5naW5lOiBBbGwgY29uZmlndXJhdGlvbnMgcmV0dXJuIHRvIGRlZmF1bHQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9DT05GSUdVUkUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEFwcGx5IG5ldyBhdWRpbyBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb25zIGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCi0vLyAgZGF0YTogZWZmZWN0X2NvbmZpZ190Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfUkVTRVQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFJlc2V0IHRoZSBlZmZlY3QgZW5naW5lLiBLZWVwIGNvbmZpZ3VyYXRpb24gYnV0IHJlc2V0cyBzdGF0ZSBhbmQgYnVmZmVyIGNvbnRlbnQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0VOQUJMRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgRW5hYmxlIHRoZSBwcm9jZXNzLiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gcHJvY2VzcygpCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfRElTQUJMRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgRGlzYWJsZSB0aGUgcHJvY2Vzcy4gQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgYWZ0ZXIgdGhlIGxhc3QgY2FsbCB0byBwcm9jZXNzKCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfUEFSQU0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFNldCBhIHBhcmFtZXRlciBhbmQgYXBwbHkgaXQgaW1tZWRpYXRlbHkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtIGFuZCB2YWx1ZQotLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0gKyB2YWx1ZS4gU2VlIGVmZmVjdF9wYXJhbV90IGRlZmluaXRpb24gYmVsb3cgZm9yIHZhbHVlIG9mZnNldAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihpbnQpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9ERUZFUlJFRAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IGEgcGFyYW1ldGVyIGJ1dCBhcHBseSBpdCBvbmx5IHdoZW4gcmVjZWl2aW5nIEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCBjb21tYW5kCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbSBhbmQgdmFsdWUKLS8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtICsgdmFsdWUuIFNlZSBlZmZlY3RfcGFyYW1fdCBkZWZpbml0aW9uIGJlbG93IGZvciB2YWx1ZSBvZmZzZXQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9DT01NSVQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEFwcGx5IGFsbCBwcmV2aW91c2x5IHJlY2VpdmVkIEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVEIGNvbW1hbmRzCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX1BBUkFNCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBHZXQgYSBwYXJhbWV0ZXIgdmFsdWUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtCi0vLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtIGFuZCB2YWx1ZQotLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0gKyB2YWx1ZS4gU2VlIGVmZmVjdF9wYXJhbV90IGRlZmluaXRpb24gYmVsb3cgZm9yIHZhbHVlIG9mZnNldAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfREVWSUNFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIHJlbmRlcmluZyBkZXZpY2UgdGhlIGF1ZGlvIG91dHB1dCBwYXRoIGlzIGNvbm5lY3RlZCB0by4gU2VlIGF1ZGlvX2RldmljZV9lIGZvciBkZXZpY2UKLS8vICB2YWx1ZXMuCi0vLyAgVGhlIGVmZmVjdCBpbXBsZW1lbnRhdGlvbiBtdXN0IHNldCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EIGZsYWcgaW4gaXRzIGRlc2NyaXB0b3IgdG8gcmVjZWl2ZSB0aGlzCi0vLyAgY29tbWFuZCB3aGVuIHRoZSBkZXZpY2UgY2hhbmdlcwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IGF1ZGlvX2RldmljZV9lCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfVk9MVU1FCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgYW5kIGdldCB2b2x1bWUuIFVzZWQgYnkgYXVkaW8gZnJhbWV3b3JrIHRvIGRlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBlbmdpbmUuCi0vLyAgVGhlIGVmZmVjdCBpbXBsZW1lbnRhdGlvbiBtdXN0IHNldCBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EIG9yIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIGZsYWcgaW4KLS8vICBpdHMgZGVzY3JpcHRvciB0byByZWNlaXZlIHRoaXMgY29tbWFuZCBiZWZvcmUgZXZlcnkgY2FsbCB0byBwcm9jZXNzKCkgZnVuY3Rpb24KLS8vICBJZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBmbGFnIGlzIHNldCBpbiB0aGUgZWZmZWN0IGRlc2NyaXB0b3IsIHRoZSBlZmZlY3QgZW5naW5lIG11c3QgcmV0dXJuCi0vLyAgdGhlIHZvbHVtZSB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSB0aGUgZWZmZWN0IGlzIHByb2Nlc3NlZC4gVGhlIG92ZXJhbGwgdm9sdW1lICh0aGUgdm9sdW1lCi0vLyAgYWN0dWFsbHkgYXBwbGllZCBieSB0aGUgZWZmZWN0IGVuZ2luZSBtdWx0aXBsaWVkIGJ5IHRoZSByZXR1cm5lZCB2YWx1ZSkgc2hvdWxkIG1hdGNoIHRoZSB2YWx1ZQotLy8gIGluZGljYXRlZCBpbiB0aGUgY29tbWFuZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IG4gKiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogdm9sdW1lIGZvciBlYWNoIGNoYW5uZWwgZGVmaW5lZCBpbiBlZmZlY3RfY29uZmlnX3QgZm9yIG91dHB1dCBidWZmZXIgZXhwcmVzc2VkIGluCi0vLyAgICAgIDguMjQgZml4ZWQgcG9pbnQgZm9ybWF0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogbiAqIHNpemVvZih1aW50MzJfdCkgLyAwCi0vLyAgZGF0YTogLSBpZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBpcyBzZXQgaW4gZWZmZWN0IGRlc2NyaXB0b3I6Ci0vLyAgICAgICAgICAgICAgdm9sdW1lIGZvciBlYWNoIGNoYW5uZWwgZGVmaW5lZCBpbiBlZmZlY3RfY29uZmlnX3QgZm9yIG91dHB1dCBidWZmZXIgZXhwcmVzc2VkIGluCi0vLyAgICAgICAgICAgICAgOC4yNCBmaXhlZCBwb2ludCBmb3JtYXQKLS8vICAgICAgICAtIGlmIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIGlzIG5vdCBzZXQgaW4gZWZmZWN0IGRlc2NyaXB0b3I6Ci0vLyAgICAgICAgICAgICAgTi9BCi0vLyAgSXQgaXMgbGVnYWwgdG8gcmVjZWl2ZSBhIG51bGwgcG9pbnRlciBhcyBwUmVwbHlEYXRhIGluIHdoaWNoIGNhc2UgdGhlIGVmZmVjdCBmcmFtZXdvcmsgaGFzCi0vLyAgZGVsZWdhdGVkIHZvbHVtZSBjb250cm9sIHRvIGFub3RoZXIgZWZmZWN0Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIGF1ZGlvIG1vZGUuIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQgZmxhZyBpbiBpdHMKLS8vICBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcyBjb21tYW5kIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKLS8vICBkYXRhOiBhdWRpb19tb2RlX2UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0ZJUlNUX1BST1BSSUVUQVJZCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBBbGwgcHJvcHJpZXRhcnkgZWZmZWN0IGNvbW1hbmRzIG11c3QgdXNlIGNvbW1hbmQgY29kZXMgYWJvdmUgdGhpcyB2YWx1ZS4gVGhlIHNpemUgYW5kIGZvcm1hdCBvZgotLy8gIGNvbW1hbmQgYW5kIHJlc3BvbnNlIGZpZWxkcyBpcyBmcmVlIGluIHRoaXMgY2FzZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLS8vIEF1ZGlvIGJ1ZmZlciBkZXNjcmlwdG9yIHVzZWQgYnkgcHJvY2VzcygpLCBidWZmZXJQcm92aWRlcigpIGZ1bmN0aW9ucyBhbmQgYnVmZmVyX2NvbmZpZ190Ci0vLyBzdHJ1Y3R1cmUuIE11bHRpLWNoYW5uZWwgYXVkaW8gaXMgYWx3YXlzIGludGVybGVhdmVkLiBUaGUgY2hhbm5lbCBvcmRlciBpcyBmcm9tIExTQiB0byBNU0Igd2l0aAotLy8gcmVnYXJkIHRvIHRoZSBjaGFubmVsIG1hc2sgZGVmaW5pdGlvbiBpbiBhdWRpb19jaGFubmVsc19lIGUuZyA6Ci0vLyBTdGVyZW86IGxlZnQsIHJpZ2h0Ci0vLyA1IHBvaW50IDE6IGZyb250IGxlZnQsIGZyb250IHJpZ2h0LCBmcm9udCBjZW50ZXIsIGxvdyBmcmVxdWVuY3ksIGJhY2sgbGVmdCwgYmFjayByaWdodAotLy8gVGhlIGJ1ZmZlciBzaXplIGlzIGV4cHJlc3NlZCBpbiBmcmFtZSBjb3VudCwgYSBmcmFtZSBiZWluZyBjb21wb3NlZCBvZiBzYW1wbGVzIGZvciBhbGwKLS8vIGNoYW5uZWxzIGF0IGEgZ2l2ZW4gdGltZS4gRnJhbWUgc2l6ZSBmb3IgdW5zcGVjaWZpZWQgZm9ybWF0IChBVURJT19GT1JNQVRfT1RIRVIpIGlzIDggYml0IGJ5Ci0vLyBkZWZpbml0aW9uCi1zdHJ1Y3QgYXVkaW9fYnVmZmVyX3MgewotICAgIHNpemVfdCAgIGZyYW1lQ291bnQ7ICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIGluIGJ1ZmZlcgotICAgIHVuaW9uIHsKLSAgICAgICAgdm9pZCogICAgICAgcmF3OyAgICAgICAgLy8gcmF3IHBvaW50ZXIgdG8gc3RhcnQgb2YgYnVmZmVyCi0gICAgICAgIGludDMyX3QqICAgIHMzMjsgICAgICAgIC8vIHBvaW50ZXIgdG8gc2lnbmVkIDMyIGJpdCBkYXRhIGF0IHN0YXJ0IG9mIGJ1ZmZlcgotICAgICAgICBpbnQxNl90KiAgICBzMTY7ICAgICAgICAvLyBwb2ludGVyIHRvIHNpZ25lZCAxNiBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKLSAgICAgICAgdWludDhfdCogICAgdTg7ICAgICAgICAgLy8gcG9pbnRlciB0byB1bnNpZ25lZCA4IGJpdCBkYXRhIGF0IHN0YXJ0IG9mIGJ1ZmZlcgotICAgIH07Ci19OwotCi0vLyBUaGUgYnVmZmVyX3Byb3ZpZGVyX3Mgc3RydWN0dXJlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkCi0vLyBieSB0aGUgZWZmZWN0IGVuZ2luZSBwcm9jZXNzKCkgZnVuY3Rpb24gdG8gcXVlcnkgYW5kIHJlbGVhc2UgaW5wdXQKLS8vIG9yIG91dHB1dCBhdWRpbyBidWZmZXIuCi0vLyBUaGUgZ2V0QnVmZmVyKCkgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJldHJpZXZlIGEgYnVmZmVyIHdoZXJlIGRhdGEKLS8vIHNob3VsZCByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBieSBwcm9jZXNzKCkgZnVuY3Rpb24uCi0vLyBUaGUgcmVsZWFzZUJ1ZmZlcigpIGZ1bmN0aW9uIE1VU1QgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciByZXRyaWV2ZWQKLS8vIHdpdGggZ2V0QnVmZmVyKCkgaXMgbm90IG5lZWRlZCBhbnltb3JlLgotLy8gVGhlIHByb2Nlc3MgZnVuY3Rpb24gc2hvdWxkIHVzZSB0aGUgYnVmZmVyIHByb3ZpZGVyIG1lY2hhbmlzbSB0byByZXRyaWV2ZQotLy8gaW5wdXQgb3Igb3V0cHV0IGJ1ZmZlciBpZiB0aGUgaW5CdWZmZXIgb3Igb3V0QnVmZmVyIHBhc3NlZCBhcyBhcmd1bWVudCBpcyBOVUxMCi0vLyBhbmQgdGhlIGJ1ZmZlciBjb25maWd1cmF0aW9uIChidWZmZXJfY29uZmlnX3QpIGdpdmVuIGJ5IHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRQotLy8gY29tbWFuZCBkaWQgbm90IHNwZWNpZnkgYW4gYXVkaW8gYnVmZmVyLgotCi10eXBlZGVmIGludDMyX3QgKCogYnVmZmVyX2Z1bmN0aW9uX3QpKHZvaWQgKmNvb2tpZSwgYXVkaW9fYnVmZmVyX3QgKmJ1ZmZlcik7Ci0KLXR5cGVkZWYgc3RydWN0IGJ1ZmZlcl9wcm92aWRlcl9zIHsKLSAgICBidWZmZXJfZnVuY3Rpb25fdCBnZXRCdWZmZXI7ICAgICAgIC8vIHJldHJpZXZlIG5leHQgYnVmZmVyCi0gICAgYnVmZmVyX2Z1bmN0aW9uX3QgcmVsZWFzZUJ1ZmZlcjsgICAvLyByZWxlYXNlIHVzZWQgYnVmZmVyCi0gICAgdm9pZCAgICAgICAqY29va2llOyAgICAgICAgICAgICAgICAvLyBmb3IgdXNlIGJ5IGNsaWVudCBvZiBidWZmZXIgcHJvdmlkZXIgZnVuY3Rpb25zCi19IGJ1ZmZlcl9wcm92aWRlcl90OwotCi0KLS8vIFRoZSBidWZmZXJfY29uZmlnX3Mgc3RydWN0dXJlIHNwZWNpZmllcyB0aGUgaW5wdXQgb3Igb3V0cHV0IGF1ZGlvIGZvcm1hdAotLy8gdG8gYmUgdXNlZCBieSB0aGUgZWZmZWN0IGVuZ2luZS4gSXQgaXMgcGFydCBvZiB0aGUgZWZmZWN0X2NvbmZpZ190Ci0vLyBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIGJvdGggaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgY29uZmlndXJhdGlvbnMgYW5kIGlzCi0vLyBwYXNzZWQgYnkgdGhlIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQuCi10eXBlZGVmIHN0cnVjdCBidWZmZXJfY29uZmlnX3MgewotICAgIGF1ZGlvX2J1ZmZlcl90ICBidWZmZXI7ICAgICAvLyBidWZmZXIgZm9yIHVzZSBieSBwcm9jZXNzKCkgZnVuY3Rpb24gaWYgbm90IHBhc3NlZCBleHBsaWNpdGx5Ci0gICAgdWludDMyX3QgICBzYW1wbGluZ1JhdGU7ICAgIC8vIHNhbXBsaW5nIHJhdGUKLSAgICB1aW50MzJfdCAgIGNoYW5uZWxzOyAgICAgICAgLy8gY2hhbm5lbCBtYXNrIChzZWUgYXVkaW9fY2hhbm5lbHNfZSkKLSAgICBidWZmZXJfcHJvdmlkZXJfdCBidWZmZXJQcm92aWRlcjsgICAvLyBidWZmZXIgcHJvdmlkZXIKLSAgICB1aW50OF90ICAgIGZvcm1hdDsgICAgICAgICAgLy8gQXVkaW8gZm9ybWF0ICAoc2VlIGF1ZGlvX2Zvcm1hdF9lKQotICAgIHVpbnQ4X3QgICAgYWNjZXNzTW9kZTsgICAgICAvLyByZWFkL3dyaXRlIG9yIGFjY3VtdWxhdGUgaW4gYnVmZmVyIChlZmZlY3RfYnVmZmVyX2FjY2Vzc19lKQotICAgIHVpbnQxNl90ICAgbWFzazsgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIGFib3ZlIGZpZWxkcyBpcyB2YWxpZAotfSBidWZmZXJfY29uZmlnX3Q7Ci0KLS8vIFNhbXBsZSBmb3JtYXQKLWVudW0gYXVkaW9fZm9ybWF0X2UgewotICAgIFNBTVBMRV9GT1JNQVRfUENNX1MxNSwgICAvLyBQQ00gc2lnbmVkIDE2IGJpdHMKLSAgICBTQU1QTEVfRk9STUFUX1BDTV9VOCwgICAgLy8gUENNIHVuc2lnbmVkIDggYml0cwotICAgIFNBTVBMRV9GT1JNQVRfUENNX1M3XzI0LCAvLyBQQ00gc2lnbmVkIDcuMjQgZml4ZWQgcG9pbnQgcmVwcmVzZW50YXRpb24KLSAgICBTQU1QTEVfRk9STUFUX09USEVSICAgICAgLy8gb3RoZXIgZm9ybWF0IChlLmcuIGNvbXByZXNzZWQpCi19OwotCi0vLyBDaGFubmVsIG1hc2sKLWVudW0gYXVkaW9fY2hhbm5lbHNfZSB7Ci0gICAgQ0hBTk5FTF9GUk9OVF9MRUZUID0gMHgxLCAgICAgICAgICAgICAgICAgICAvLyBmcm9udCBsZWZ0IGNoYW5uZWwKLSAgICBDSEFOTkVMX0ZST05UX1JJR0hUID0gMHgyLCAgICAgICAgICAgICAgICAgIC8vIGZyb250IHJpZ2h0IGNoYW5uZWwKLSAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiA9IDB4NCwgICAgICAgICAgICAgICAgLy8gZnJvbnQgY2VudGVyIGNoYW5uZWwKLSAgICBDSEFOTkVMX0xPV19GUkVRVUVOQ1kgPSAweDgsICAgICAgICAgICAgICAgLy8gbG93IGZyZXF1ZW5jeSBjaGFubmVsCi0gICAgQ0hBTk5FTF9CQUNLX0xFRlQgPSAweDEwLCAgICAgICAgICAgICAgICAgICAvLyBiYWNrIGxlZnQgY2hhbm5lbAotICAgIENIQU5ORUxfQkFDS19SSUdIVCA9IDB4MjAsICAgICAgICAgICAgICAgICAgLy8gYmFjayByaWdodCBjaGFubmVsCi0gICAgQ0hBTk5FTF9GUk9OVF9MRUZUX09GX0NFTlRFUiA9IDB4NDAsICAgICAgIC8vIGZyb250IGxlZnQgb2YgY2VudGVyIGNoYW5uZWwKLSAgICBDSEFOTkVMX0ZST05UX1JJR0hUX09GX0NFTlRFUiA9IDB4ODAsICAgICAgLy8gZnJvbnQgcmlnaHQgb2YgY2VudGVyIGNoYW5uZWwKLSAgICBDSEFOTkVMX0JBQ0tfQ0VOVEVSID0gMHgxMDAsICAgICAgICAgICAgICAgIC8vIGJhY2sgY2VudGVyIGNoYW5uZWwKLSAgICBDSEFOTkVMX01PTk8gPSBDSEFOTkVMX0ZST05UX0xFRlQsCi0gICAgQ0hBTk5FTF9TVEVSRU8gPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCksCi0gICAgQ0hBTk5FTF9RVUFEID0gKENIQU5ORUxfRlJPTlRfTEVGVCB8IENIQU5ORUxfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgQ0hBTk5FTF9CQUNLX0xFRlQgfCBDSEFOTkVMX0JBQ0tfUklHSFQpLAotICAgIENIQU5ORUxfU1VSUk9VTkQgPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCB8Ci0gICAgICAgICAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfQkFDS19DRU5URVIpLAotICAgIENIQU5ORUxfNVBPSU5UMSA9IChDSEFOTkVMX0ZST05UX0xFRlQgfCBDSEFOTkVMX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgIENIQU5ORUxfRlJPTlRfQ0VOVEVSIHwgQ0hBTk5FTF9MT1dfRlJFUVVFTkNZIHwgQ0hBTk5FTF9CQUNLX0xFRlQgfCBDSEFOTkVMX0JBQ0tfUklHSFQpLAotICAgIENIQU5ORUxfN1BPSU5UMSA9IChDSEFOTkVMX0ZST05UX0xFRlQgfCBDSEFOTkVMX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgIENIQU5ORUxfRlJPTlRfQ0VOVEVSIHwgQ0hBTk5FTF9MT1dfRlJFUVVFTkNZIHwgQ0hBTk5FTF9CQUNLX0xFRlQgfCBDSEFOTkVMX0JBQ0tfUklHSFQgfAotICAgICAgICAgICAgQ0hBTk5FTF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IENIQU5ORUxfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKSwKLX07Ci0KLS8vIFJlbmRlciBkZXZpY2UKLWVudW0gYXVkaW9fZGV2aWNlX2UgewotICAgIERFVklDRV9FQVJQSUVDRSA9IDB4MSwgICAgICAgICAgICAgICAgICAgICAgLy8gZWFycGllY2UKLSAgICBERVZJQ0VfU1BFQUtFUiA9IDB4MiwgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWFrZXIKLSAgICBERVZJQ0VfV0lSRURfSEVBRFNFVCA9IDB4NCwgICAgICAgICAgICAgICAgIC8vIHdpcmVkIGhlYWRzZXQsIHdpdGggbWljcm9waG9uZQotICAgIERFVklDRV9XSVJFRF9IRUFEUEhPTkUgPSAweDgsICAgICAgICAgICAgICAgLy8gd2lyZWQgaGVhZHBob25lLCB3aXRob3V0IG1pY3JvcGhvbmUKLSAgICBERVZJQ0VfQkxVRVRPT1RIX1NDTyA9IDB4MTAsICAgICAgICAgICAgICAgIC8vIGdlbmVyaWMgYmx1ZXRvb3RoIFNDTwotICAgIERFVklDRV9CTFVFVE9PVEhfU0NPX0hFQURTRVQgPSAweDIwLCAgICAgICAgLy8gYmx1ZXRvb3RoIFNDTyBoZWFkc2V0Ci0gICAgREVWSUNFX0JMVUVUT09USF9TQ09fQ0FSS0lUID0gMHg0MCwgICAgICAgICAvLyBibHVldG9vdGggU0NPIGNhciBraXQKLSAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFAgPSAweDgwLCAgICAgICAgICAgICAgIC8vIGdlbmVyaWMgYmx1ZXRvb3RoIEEyRFAKLSAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyA9IDB4MTAwLCAgIC8vIGJsdWV0b290aCBBMkRQIGhlYWRwaG9uZXMKLSAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiA9IDB4MjAwLCAgICAgIC8vIGJsdWV0b290aCBBMkRQIHNwZWFrZXJzCi0gICAgREVWSUNFX0FVWF9ESUdJVEFMID0gMHg0MDAsICAgICAgICAgICAgICAgICAvLyBkaWdpdGFsIG91dHB1dAotICAgIERFVklDRV9FWFRFUk5BTF9TUEVBS0VSID0gMHg4MDAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgc3BlYWtlciAoc3RlcmVvIGFuZCBIaWdoIHF1YWxpdHkpCi19OwotCi0vLyBBdWRpbyBtb2RlCi1lbnVtIGF1ZGlvX21vZGVfZSB7Ci0gICAgQVVESU9fRUZGRUNUX01PREVfTk9STUFMLCAgIC8vIGRldmljZSBpZGxlCi0gICAgQVVESU9fRUZGRUNUX01PREVfUklOR1RPTkUsIC8vIGRldmljZSByaW5naW5nCi0gICAgQVVESU9fRUZGRUNUX01PREVfSU5fQ0FMTCwgIC8vIGF1ZGlvIGNhbGwgY29ubmVjdGVkIChWb0lQIG9yIHRlbGVwaG9ueSkKLX07Ci0KLS8vIFZhbHVlcyBmb3IgImFjY2Vzc01vZGUiIGZpZWxkIG9mIGJ1ZmZlcl9jb25maWdfdDoKLS8vICAgb3ZlcndyaXRlLCByZWFkIG9ubHksIGFjY3VtdWxhdGUgKHJlYWQvbW9kaWZ5L3dyaXRlKQotZW51bSBlZmZlY3RfYnVmZmVyX2FjY2Vzc19lIHsKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSwKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFELAotICAgIEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUKLQotfTsKLQotLy8gVmFsdWVzIGZvciBiaXQgZmllbGQgIm1hc2siIGluIGJ1ZmZlcl9jb25maWdfdC4gSWYgYSBiaXQgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZAotLy8gaW4gYnVmZmVyX2NvbmZpZ190IG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gZXhlY3V0aW5nIHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kCi0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQlVGRkVSICAgIDB4MDAwMSAgLy8gYnVmZmVyIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfU01QX1JBVEUgIDB4MDAwMiAgLy8gc2FtcGxpbmdSYXRlIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgIDB4MDAwNCAgLy8gY2hhbm5lbHMgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19GT1JNQVQgICAgMHgwMDA4ICAvLyBmb3JtYXQgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERSAgMHgwMDEwICAvLyBhY2Nlc3NNb2RlIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfUFJPVklERVIgIDB4MDAyMCAgLy8gYnVmZmVyUHJvdmlkZXIgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19BTEwgKEVGRkVDVF9DT05GSUdfQlVGRkVSIHwgRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfCBFRkZFQ1RfQ09ORklHX0ZPUk1BVCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfQUNDX01PREUgfCBFRkZFQ1RfQ09ORklHX1BST1ZJREVSKQotCi0KLS8vIGVmZmVjdF9jb25maWdfcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIHBDbWREYXRhIGFyZ3VtZW50IG9mIEVGRkVDVF9DTURfQ09ORklHVVJFCi0vLyBjb21tYW5kIHRvIGNvbmZpZ3VyZSBhdWRpbyBwYXJhbWV0ZXJzIGFuZCBidWZmZXJzIGZvciBlZmZlY3QgZW5naW5lIGlucHV0IGFuZCBvdXRwdXQuCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfY29uZmlnX3MgewotICAgIGJ1ZmZlcl9jb25maWdfdCAgIGlucHV0Q2ZnOwotICAgIGJ1ZmZlcl9jb25maWdfdCAgIG91dHB1dENmZzs7Ci19IGVmZmVjdF9jb25maWdfdDsKLQotCi0vLyBlZmZlY3RfcGFyYW1fcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIHBDbWREYXRhIGFyZ3VtZW50IG9mIEVGRkVDVF9DTURfU0VUX1BBUkFNCi0vLyBjb21tYW5kIGFuZCBwQ21kRGF0YSBhbmQgcFJlcGx5RGF0YSBvZiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBjb21tYW5kLgotLy8gcHNpemUgYW5kIHZzaXplIHJlcHJlc2VudCB0aGUgYWN0dWFsIHNpemUgb2YgcGFyYW1ldGVyIGFuZCB2YWx1ZS4KLS8vCi0vLyBOT1RFOiB0aGUgc3RhcnQgb2YgdmFsdWUgZmllbGQgaW5zaWRlIHRoZSBkYXRhIGZpZWxkIGlzIGFsd2F5cyBvbiBhIDMyIGJpdCBib3VuZGFyeToKLS8vCi0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgc3RhdHVzICAgIHwgc2l6ZW9mKGludCkKLS8vICArLS0tLS0tLS0tLS0rCi0vLyAgfCBwc2l6ZSAgICAgfCBzaXplb2YoaW50KQotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8IHZzaXplICAgICB8IHNpemVvZihpbnQpCi0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8Ci0vLyAgfiBwYXJhbWV0ZXIgfiAgID4gcHNpemUgICAgIHwKLS8vICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgPiAgKChwc2l6ZSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KQotLy8gICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICB8Ci0vLyAgfCBwYWRkaW5nICAgfCAgICAgICAgICAgICAgIHwKLS8vICArLS0tLS0tLS0tLS0rCi0vLyAgfCAgICAgICAgICAgfCAgIHwKLS8vICB+IHZhbHVlICAgICB+ICAgPiB2c2l6ZQotLy8gIHwgICAgICAgICAgIHwgICB8Ci0vLyAgKy0tLS0tLS0tLS0tKwotCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfcGFyYW1fcyB7Ci0gICAgaW50MzJfdCAgICAgc3RhdHVzOyAgICAgLy8gVHJhbnNhY3Rpb24gc3RhdHVzICh1bnVzZWQgZm9yIGNvbW1hbmQsIHVzZWQgZm9yIHJlcGx5KQotICAgIHVpbnQzMl90ICAgIHBzaXplOyAgICAgIC8vIFBhcmFtZXRlciBzaXplCi0gICAgdWludDMyX3QgICAgdnNpemU7ICAgICAgLy8gVmFsdWUgc2l6ZQotICAgIGNoYXIgICAgICAgIGRhdGFbXTsgICAgIC8vIFN0YXJ0IG9mIFBhcmFtZXRlciArIFZhbHVlIGRhdGEKLX0gZWZmZWN0X3BhcmFtX3Q7Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICBFZmZlY3QgbGlicmFyeSBpbnRlcmZhY2UKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gQW4gZWZmZWN0IGxpYnJhcnkgaXMgcmVxdWlyZWQgdG8gaW1wbGVtZW50IGFuZCBleHBvc2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKLS8vIHRvIGVuYWJsZSBlZmZlY3QgZW51bWVyYXRpb24gYW5kIGluc3RhbnRpYXRpb24uIFRoZSBuYW1lIG9mIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFzCi0vLyBzcGVjaWZpZWQgaGVyZSBhcyB0aGUgZWZmZWN0IGZyYW1ld29yayB3aWxsIGdldCB0aGUgZnVuY3Rpb24gYWRkcmVzcyB3aXRoIGRsc3ltKCk6Ci0vLwotLy8gLSBlZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzOwotLy8gLSBlZmZlY3RfUXVlcnlFZmZlY3RfdCBFZmZlY3RRdWVyeUVmZmVjdDsKLS8vIC0gZWZmZWN0X0NyZWF0ZUVmZmVjdF90IEVmZmVjdENyZWF0ZTsKLS8vIC0gZWZmZWN0X1JlbGVhc2VFZmZlY3RfdCBFZmZlY3RSZWxlYXNlOwotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cwotLy8KLS8vICAgIERlc2NyaXB0aW9uOiAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgZXhwb3NlZCBieSB0aGUKLS8vICAgICAgICAgIGxpYnJhcnkuIEVhY2ggZWZmZWN0IG11c3QgaGF2ZSBhIHVuaXF1ZSBlZmZlY3QgdXVpZCAoc2VlCi0vLyAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90KS4gVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5RWZmZWN0KCkKLS8vICAgICAgICAgIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbCBlZmZlY3RzIHByZXNlbnQgaW4gdGhlIGxpYnJhcnkuCi0vLwotLy8gICAgSW5wdXQvT3V0cHV0OgotLy8gICAgICAgICAgcE51bUVmZmVjdHM6ICAgIGFkZHJlc3Mgd2hlcmUgdGhlIG51bWJlciBvZiBlZmZlY3RzIHNob3VsZCBiZSByZXR1cm5lZC4KLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcE51bUVmZmVjdHMKLS8vICAgICAgICAqcE51bUVmZmVjdHM6ICAgICB1cGRhdGVkIHdpdGggbnVtYmVyIG9mIGVmZmVjdHMgaW4gbGlicmFyeQotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi10eXBlZGVmIGludDMyX3QgKCplZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QpKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFF1ZXJ5RWZmZWN0Ci0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIFJldHVybnMgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGVmZmVjdCBlbmdpbmUgd2hpY2ggaW5kZXggaXMKLS8vICAgICAgICAgIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgotLy8gICAgICAgICAgU2VlIGVmZmVjdF9kZXNjcmlwdG9yX3QgZm9yIGRldGFpbHMgb24gZWZmZWN0IGRlc2NyaXB0b3JzLgotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbAotLy8gICAgICAgICAgZWZmZWN0cyBwcmVzZW50IGluIHRoZSBsaWJyYXJ5LiBUaGUgZW51bWVyYXRpb24gc2VxdWVuY2UgaXM6Ci0vLyAgICAgICAgICAgICAgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1fZWZmZWN0cyk7Ci0vLyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lZmZlY3RzOyBpKyspCi0vLyAgICAgICAgICAgICAgICAgIEVmZmVjdFF1ZXJ5RWZmZWN0KGksLi4uKTsKLS8vCi0vLyAgICBJbnB1dC9PdXRwdXQ6Ci0vLyAgICAgICAgICBpbmRleDogICAgICAgICAgaW5kZXggb2YgdGhlIGVmZmVjdAotLy8gICAgICAgICAgcERlc2NyaXB0b3I6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcERlc2NyaXB0b3Igb3IgaW5kZXgKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PU1lTICAgICBlZmZlY3QgbGlzdCBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IGV4ZWN1dGlvbiBvZgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0VOVCAgICAgbm8gbW9yZSBlZmZlY3QgYXZhaWxhYmxlCi0vLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdHlwZWRlZiBpbnQzMl90ICgqZWZmZWN0X1F1ZXJ5RWZmZWN0X3QpKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0Q3JlYXRlCi0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIHJldHVybnMgYW4KLS8vICAgICAgICAgIGVmZmVjdCBjb250cm9sIGludGVyZmFjZSBvbiB0aGlzIGVuZ2luZS4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlCi0vLyAgICAgICAgICByZXNvdXJjZXMgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZWZmZWN0IGVuZ2luZSBhbmQgcmV0dXJuCi0vLyAgICAgICAgICBhIGhhbmRsZSBvbiB0aGUgZWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlLgotLy8KLS8vICAgIElucHV0OgotLy8gICAgICAgICAgdXVpZDogICAgcG9pbnRlciB0byB0aGUgZWZmZWN0IHV1aWQuCi0vLyAgICAgICAgICBzZXNzaW9uSWQ6ICBhdWRpbyBzZXNzaW9uIHRvIHdoaWNoIHRoaXMgZWZmZWN0IGluc3RhbmNlIHdpbGwgYmUgYXR0YWNoZWQuIEFsbCBlZmZlY3RzCi0vLyAgICAgICAgICAgICAgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgYXJlIGNvbm5lY3RlZCBpbiBzZXJpZXMgYW5kIHByb2Nlc3MgdGhlIHNhbWUgc2lnbmFsCi0vLyAgICAgICAgICAgICAgc3RyZWFtLiBLbm93aW5nIHRoYXQgdHdvIGVmZmVjdHMgYXJlIHBhcnQgb2YgdGhlIHNhbWUgZWZmZWN0IGNoYWluIGNhbiBoZWxwIHRoZQotLy8gICAgICAgICAgICAgIGxpYnJhcnkgaW1wbGVtZW50IHNvbWUga2luZCBvZiBvcHRpbWl6YXRpb25zLgotLy8gICAgICAgICAgaW9JZDogICBpZGVudGlmaWVzIHRoZSBvdXRwdXQgb3IgaW5wdXQgc3RyZWFtIHRoaXMgZWZmZWN0IGlzIGRpcmVjdGVkIHRvIGF0IGF1ZGlvIEhBTC4KLS8vICAgICAgICAgICAgICBGb3IgZnV0dXJlIHVzZSBlc3BlY2lhbGx5IHdpdGggdHVubmVsZWQgSFcgYWNjZWxlcmF0ZWQgZWZmZWN0cwotLy8KLS8vICAgIElucHV0L091dHB1dDoKLS8vICAgICAgICAgIHBJbnRlcmZhY2U6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgaW50ZXJmYWNlLgotLy8KLS8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBwRWZmZWN0VXVpZCBvciBwSW50ZXJmYWNlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0VOVCAgICAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIGZvdW5kCi0vLyAgICAgICAgKnBJbnRlcmZhY2U6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBpbnRlcmZhY2UgaGFuZGxlLgotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi10eXBlZGVmIGludDMyX3QgKCplZmZlY3RfQ3JlYXRlRWZmZWN0X3QpKGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFJlbGVhc2UKLS8vCi0vLyAgICBEZXNjcmlwdGlvbjogICAgUmVsZWFzZXMgdGhlIGVmZmVjdCBlbmdpbmUgd2hvc2UgaGFuZGxlIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgotLy8gICAgICAgICAgQWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSBlZmZlY3QgYXJlCi0vLyAgICAgICAgICByZWxlYXNlZC4KLS8vCi0vLyAgICBJbnB1dDoKLS8vICAgICAgICAgIGludGVyZmFjZTogICAgaGFuZGxlIG9uIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRvIGJlIHJlbGVhc2VkLgotLy8KLS8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXR5cGVkZWYgaW50MzJfdCAoKmVmZmVjdF9SZWxlYXNlRWZmZWN0X3QpKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpOwotCi0KLSNpZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLQotI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RCYXNzQm9vc3RBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKaW5kZXggNzVmOGQ3OC4uNTYxMTllYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RCYXNzQm9vc3RBcGkuaAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdEJhc3NCb29zdEFwaS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfRUZGRUNUQkFTU0JPT1NUQVBJX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNUQkFTU0JPT1NUQVBJX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KIAogI2lmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0RW52aXJvbm1lbnRhbFJldmVyYkFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKaW5kZXggMzZhY2NkOC4uZjExYzVlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RFTlZJUk9OTUVOVEFMUkVWRVJCQVBJX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNURU5WSVJPTk1FTlRBTFJFVkVSQkFQSV9IXwogCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaAppbmRleCAwNDkyZWEwLi45NTBkMTM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0RXF1YWxpemVyQXBpLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RFUVVBTElaRVJBUElfSF8KICNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RFUVVBTElaRVJBUElfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogCiAjaWZuZGVmIE9QRU5TTF9FU19IXwogc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX0VRVUFMSVpFUl8gPSB7IDB4MGJlZDQzMDAsIDB4ZGRkNiwgMHgxMWRiLCAweDhmMzQsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFByZXNldFJldmVyYkFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaAppbmRleCBhM2YwOTRjLi5lNWIxNjhhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdFByZXNldFJldmVyYkFwaS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfRUZGRUNUUFJFU0VUUkVWRVJCQVBJX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNUUFJFU0VUUkVWRVJCQVBJX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KIAogI2lmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlydHVhbGl6ZXJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlydHVhbGl6ZXJBcGkuaAppbmRleCBjM2Q1MTMxLi4yZTIxNmUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0VmZmVjdFZpcnR1YWxpemVyQXBpLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfRUZGRUNUVklSVFVBTElaRVJBUElfSF8KICNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXwogCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oCmluZGV4IGJlZjFhNGYuLmUwZmEzMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfRUZGRUNUVklTVUFMSVpFUkFQSV9IXwogI2RlZmluZSBBTkRST0lEX0VGRkVDVFZJU1VBTElaRVJBUElfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogCiAjaWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCmluZGV4IDBlZDFhMTQuLjhhZTEzY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogCiAjaWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewpAQCAtOTksMTcgKzk5LDE3IEBACiAvLyAgICAgICAgICAgICAgdXNlIGVzcGVjaWFsbHkgd2l0aCB0dW5uZWxlZCBIVyBhY2NlbGVyYXRlZCBlZmZlY3RzCiAvLwogLy8gICAgSW5wdXQvT3V0cHV0OgotLy8gICAgICAgICAgcEludGVyZmFjZTogICAgYWRkcmVzcyB3aGVyZSB0byByZXR1cm4gdGhlIGVmZmVjdCBpbnRlcmZhY2UuCisvLyAgICAgICAgICBwSGFuZGxlOiAgICAgICAgYWRkcmVzcyB3aGVyZSB0byByZXR1cm4gdGhlIGVmZmVjdCBoYW5kbGUuCiAvLwogLy8gICAgT3V0cHV0OgogLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGZhY3RvcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIHBFZmZlY3RVdWlkIG9yIHBJbnRlcmZhY2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIHBFZmZlY3RVdWlkIG9yIHBIYW5kbGUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PRU5UICAgICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKLS8vICAgICAgICAqcEludGVyZmFjZTogICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGludGVyZmFjZS4KKy8vICAgICAgICAqcEhhbmRsZTogICAgICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBoYW5kbGUuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLWludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSk7CitpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLCBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KQEAgLTEyMCw3ICsxMjAsNyBAQAogLy8gICAgICAgICAgcmVsZWFzZWQuCiAvLwogLy8gICAgSW5wdXQ6Ci0vLyAgICAgICAgICBpbnRlcmZhY2U6ICAgIGhhbmRsZXIgb24gdGhlIGVmZmVjdCBpbnRlcmZhY2UgdG8gYmUgcmVsZWFzZWQuCisvLyAgICAgICAgICBoYW5kbGU6ICAgIGhhbmRsZXIgb24gdGhlIGVmZmVjdCBpbnRlcmZhY2UgdG8gYmUgcmVsZWFzZWQuCiAvLwogLy8gICAgT3V0cHV0OgogLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgpAQCAtMTI4LDUxICsxMjgsNyBAQAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZXIKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdExvYWRMaWJyYXJ5Ci0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIExvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBwYXRoIGlzIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgotLy8gICAgICAgICAgVGhpcyBtdXN0IGJlIHRoZSBmdWxsIHBhdGggb2YgYSBkeW5hbWljIGxpYnJhcnkgKC5zbykgaW1wbGVtZW50aW5nIG9uZSBvcgotLy8gICAgICAgICAgbW9yZSBlZmZlY3QgZW5naW5lcyBhbmQgZXhwb3NpbmcgdGhlIGVmZmVjdCBsaWJyYXJ5IGludGVyZmFjZSBkZXNjcmliZWQgaW4KLS8vICAgICAgICAgIEVmZmVjdEFwaS5oLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhbmRsZSBvbiB0aGUgbGlicmFyeSBmb3IgdXNlZCBieQotLy8gICAgICAgICAgZnVydGhlciBjYWxsIHRvIEVmZmVjdFVubG9hZExpYnJhcnkoKSB0byB1bmxvYWQgdGhlIGxpYnJhcnkuCi0vLwotLy8gICAgSW5wdXQ6Ci0vLyAgICAgICAgICBsaWJQYXRoOiAgICBmdWxsIHBhdGggb2YgdGhlIGR5bmFtaWMgbGlicmFyeSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbS4KLS8vCi0vLyAgICAgICAgICBoYW5kbGU6ICAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgbGlicmFyeSBoYW5kbGUKLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgZWZmZWN0IGZhY3Rvcnkgbm90IGluaXRpYWxpemVkIG9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkIG9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCBpbXBsZW1lbnQgcmVxdWlyZWQgZnVuY3Rpb25zCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBsaWJQYXRoIHN0cmluZyBvciBoYW5kbGUKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotaW50IEVmZmVjdExvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0VW5sb2FkTGlicmFyeQotLy8KLS8vICAgIERlc2NyaXB0aW9uOiAgVW5sb2FkcyB0aGUgZWZmZWN0IGxpYnJhcnkgd2hpY2ggaGFuZGxlIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgotLy8KLS8vICAgIElucHV0OgotLy8gICAgICAgICAgaGFuZGxlOiBsaWJyYXJ5IGhhbmRsZQotLy8KLS8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBlZmZlY3QgZmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PRU5UICAgICBpbnZhbGlkIGhhbmRsZQotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1pbnQgRWZmZWN0VW5sb2FkTGlicmFyeShpbnQgaGFuZGxlKTsKLQotCitpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCmluZGV4IDU4OWY3Y2QuLjQwMzdjNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3RDbGllbnQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC00OCw4ICs0OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTYxLDggKzYxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCkBAIC03Myw3ICs3Myw3IEBACiAgICAgICovCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZShpbnQgb3V0cHV0KSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBmb3JtYXQoaW50IG91dHB1dCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGZvcm1hdChpbnQgb3V0cHV0KSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudChpbnQgb3V0cHV0KSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgbGF0ZW5jeShpbnQgb3V0cHV0KSBjb25zdCA9IDA7CiAKQEAgLTEzOSwxMCArMTM5LDYgQEAKIAogICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1bmxvYWRFZmZlY3RMaWJyYXJ5KGludCBoYW5kbGUpID0gMDsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDUwYTM3OGYuLmVhNWE5ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTEwMCw2ICsxMDAsOSBAQAogICAgIE1FRElBX0lORk9fQlVGRkVSSU5HX1NUQVJUID0gNzAxLAogICAgIC8vIE1lZGlhUGxheWVyIGlzIHJlc3VtaW5nIHBsYXliYWNrIGFmdGVyIGZpbGxpbmcgYnVmZmVycy4KICAgICBNRURJQV9JTkZPX0JVRkZFUklOR19FTkQgPSA3MDIsCisgICAgLy8gQmFuZHdpZHRoIGluIHJlY2VudCBwYXN0CisgICAgTUVESUFfSU5GT19ORVRXT1JLX0JBTkRXSURUSCA9IDcwMywKKwogICAgIC8vIDh4eAogICAgIC8vIEJhZCBpbnRlcmxlYXZpbmcgbWVhbnMgdGhhdCBhIG1lZGlhIGhhcyBiZWVuIGltcHJvcGVybHkgaW50ZXJsZWF2ZWQgb3Igbm90CiAgICAgLy8gaW50ZXJsZWF2ZWQgYXQgYWxsLCBlLmcgaGFzIGFsbCB0aGUgdmlkZW8gc2FtcGxlcyBmaXJzdCB0aGVuIGFsbCB0aGUgYXVkaW8KQEAgLTEyOCw2ICsxMzEsOSBAQAogZW51bSBtZWRpYV9zZXRfcGFyYW1ldGVyX2tleXMgewogICAgIEtFWV9QQVJBTUVURVJfVElNRURfVEVYVF9UUkFDS19JTkRFWCA9IDEwMDAsCiAgICAgS0VZX1BBUkFNRVRFUl9USU1FRF9URVhUX0FERF9PVVRfT0ZfQkFORF9TT1VSQ0UgPSAxMDAxLAorCisgICAgLy8gU3RyZWFtaW5nL2J1ZmZlcmluZyBwYXJhbWV0ZXJzCisgICAgS0VZX1BBUkFNRVRFUl9DQUNIRV9TVEFUX0NPTExFQ1RfRlJFUV9NUyA9IDExMDAsCiB9OwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gcmVmLWNvdW50ZWQgb2JqZWN0IGZvciBjYWxsYmFja3MKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggNmI2ZmNkZi4uNDhkMTQ2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCiAgICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAogICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKKyAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCiAgICAgfTsKIAogICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oCmluZGV4IDRhOGJlN2IuLjEyYjRmOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0lWQ29tbW9uLmgKQEAgLTE0OSw2ICsxNDksNyBAQAogICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFCR1I2NjY2LAogICAgIE9NWF9DT0xPUl9Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCiAgICAgT01YX0NPTE9SX0Zvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDAsCiAgICAgT01YX0NPTE9SX0Zvcm1hdE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0NPTE9SX0ZPUk1BVFRZUEU7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IDE4MjdjM2UuLjIwYWJkNTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtMjYsNyArMjYsNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSNkZWZpbmUgVEhSRUFEX1BSSU9SSVRZX0FVRElPX0NMSUVOVCAoQU5EUk9JRF9QUklPUklUWV9BVURJTykKIC8vIE1heGltdW0gY3VtdWxhdGVkIHRpbWVvdXQgbWlsbGlzZWNvbmRzIGJlZm9yZSByZXN0YXJ0aW5nIGF1ZGlvZmxpbmdlciB0aHJlYWQKICNkZWZpbmUgTUFYX1NUQVJUVVBfVElNRU9VVF9NUyAgMzAwMCAgICAvLyBMb25nZXIgdGltZW91dCBwZXJpb2QgYXQgc3RhcnR1cCB0byBjb3BlIHdpdGggQTJEUCBpbml0IHRpbWUKICNkZWZpbmUgTUFYX1JVTl9USU1FT1VUX01TICAgICAgMTAwMApAQCAtODIsNyArODEsNyBAQAogICAgICAgICAgICAgICAgIC8vIDE2IGJpdCBiZWNhdXNlIGRhdGEgaXMgY29udmVydGVkIHRvIDE2IGJpdCBiZWZvcmUgYmVpbmcgc3RvcmVkIGluIGJ1ZmZlcgogCiAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgZnJhbWVTaXplOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90ICAgICBwYWQxOwogICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIGJ1ZmZlclRpbWVvdXRNczsgLy8gTWF4aW11bSBjdW11bGF0ZWQgdGltZW91dCBiZWZvcmUgcmVzdGFydGluZyBhdWRpb2ZsaW5nZXIKIAogICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIHdhaXRUaW1lTXM7ICAgICAgLy8gQ3VtdWxhdGVkIHdhaXQgdGltZQpAQCAtOTAsNiArODksNyBAQAogICAgIHZvbGF0aWxlICAgIGludDMyX3QgICAgIGZsYWdzOwogCiAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbGluZSBib3VuZGFyeSAoMzIgYnl0ZXMpCisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QoKTsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBzdGVwVXNlcih1aW50MzJfdCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICBzdGVwU2VydmVyKHVpbnQzMl90IGZyYW1lQ291bnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9JbnB1dC5oIGIvaW5jbHVkZS91aS9JbnB1dC5oCmluZGV4IGJhMWM2YjQuLjNiNWFiYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvSW5wdXQuaAorKysgYi9pbmNsdWRlL3VpL0lucHV0LmgKQEAgLTY3NCw2ICs2NzQsODcgQEAKICAgICBpbnQzMl90IG1BY3RpdmVQb2ludGVySWQ7CiB9OwogCisKKy8qCisgKiBTcGVjaWZpZXMgcGFyYW1ldGVycyB0aGF0IGdvdmVybiBwb2ludGVyIG9yIHdoZWVsIGFjY2VsZXJhdGlvbi4KKyAqLworc3RydWN0IFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMgeworICAgIC8vIEEgc2NhbGUgZmFjdG9yIHRoYXQgaXMgbXVsdGlwbGllZCB3aXRoIHRoZSByYXcgdmVsb2NpdHkgZGVsdGFzCisgICAgLy8gcHJpb3IgdG8gYXBwbHlpbmcgYW55IG90aGVyIHZlbG9jaXR5IGNvbnRyb2wgZmFjdG9ycy4gIFRoZSBzY2FsZQorICAgIC8vIGZhY3RvciBzaG91bGQgYmUgdXNlZCB0byBhZGFwdCB0aGUgaW5wdXQgZGV2aWNlIHJlc29sdXRpb24KKyAgICAvLyAoZWcuIGNvdW50cyBwZXIgaW5jaCkgdG8gdGhlIG91dHB1dCBkZXZpY2UgcmVzb2x1dGlvbiAoZWcuIHBpeGVscyBwZXIgaW5jaCkuCisgICAgLy8KKyAgICAvLyBNdXN0IGJlIGEgcG9zaXRpdmUgdmFsdWUuCisgICAgLy8gRGVmYXVsdCBpcyAxLjAgKG5vIHNjYWxpbmcpLgorICAgIGZsb2F0IHNjYWxlOworCisgICAgLy8gVGhlIHNjYWxlZCBzcGVlZCBhdCB3aGljaCBhY2NlbGVyYXRpb24gYmVnaW5zIHRvIGJlIGFwcGxpZWQuCisgICAgLy8gVGhpcyB2YWx1ZSBlc3RhYmxpc2hlcyB0aGUgdXBwZXIgYm91bmQgb2YgYSBsb3cgc3BlZWQgcmVnaW1lIGZvcgorICAgIC8vIHNtYWxsIHByZWNpc2UgbW90aW9ucyB0aGF0IGFyZSBwZXJmb3JtZWQgd2l0aG91dCBhbnkgYWNjZWxlcmF0aW9uLgorICAgIC8vCisgICAgLy8gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSB2YWx1ZS4KKyAgICAvLyBEZWZhdWx0IGlzIDAuMCAobm8gbG93IHRocmVzaG9sZCkuCisgICAgZmxvYXQgbG93VGhyZXNob2xkOworCisgICAgLy8gVGhlIHNjYWxlZCBzcGVlZCBhdCB3aGljaCBtYXhpbXVtIGFjY2VsZXJhdGlvbiBpcyBhcHBsaWVkLgorICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaGlnaFRocmVzaG9sZCBhbmQgbG93VGhyZXNob2xkIGNvbnRyb2xzCisgICAgLy8gdGhlIHJhbmdlIG9mIHNwZWVkcyBvdmVyIHdoaWNoIHRoZSBhY2NlbGVyYXRpb24gZmFjdG9yIGlzIGludGVycG9sYXRlZC4KKyAgICAvLyBUaGUgd2lkZXIgdGhlIHJhbmdlLCB0aGUgc21vb3RoZXIgdGhlIGFjY2VsZXJhdGlvbi4KKyAgICAvLworICAgIC8vIE11c3QgYmUgYSBub24tbmVnYXRpdmUgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGxvd1RocmVzaG9sZC4KKyAgICAvLyBEZWZhdWx0IGlzIDAuMCAobm8gaGlnaCB0aHJlc2hvbGQpLgorICAgIGZsb2F0IGhpZ2hUaHJlc2hvbGQ7CisKKyAgICAvLyBUaGUgYWNjZWxlcmF0aW9uIGZhY3Rvci4KKyAgICAvLyBXaGVuIHRoZSBzcGVlZCBpcyBhYm92ZSB0aGUgbG93IHNwZWVkIHRocmVzaG9sZCwgdGhlIHZlbG9jaXR5IHdpbGwgc2NhbGVkCisgICAgLy8gYnkgYW4gaW50ZXJwb2xhdGVkIHZhbHVlIGJldHdlZW4gMS4wIGFuZCB0aGlzIGFtb3VudC4KKyAgICAvLworICAgIC8vIE11c3QgYmUgYSBwb3NpdGl2ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4wLgorICAgIC8vIERlZmF1bHQgaXMgMS4wIChubyBhY2NlbGVyYXRpb24pLgorICAgIGZsb2F0IGFjY2VsZXJhdGlvbjsKKworICAgIFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMoKSA6CisgICAgICAgICAgICBzY2FsZSgxLjBmKSwgbG93VGhyZXNob2xkKDAuMGYpLCBoaWdoVGhyZXNob2xkKDAuMGYpLCBhY2NlbGVyYXRpb24oMS4wZikgeworICAgIH0KKworICAgIFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMoZmxvYXQgc2NhbGUsIGZsb2F0IGxvd1RocmVzaG9sZCwKKyAgICAgICAgICAgIGZsb2F0IGhpZ2hUaHJlc2hvbGQsIGZsb2F0IGFjY2VsZXJhdGlvbikgOgorICAgICAgICAgICAgc2NhbGUoc2NhbGUpLCBsb3dUaHJlc2hvbGQobG93VGhyZXNob2xkKSwKKyAgICAgICAgICAgIGhpZ2hUaHJlc2hvbGQoaGlnaFRocmVzaG9sZCksIGFjY2VsZXJhdGlvbihhY2NlbGVyYXRpb24pIHsKKyAgICB9Cit9OworCisvKgorICogSW1wbGVtZW50cyBtb3VzZSBwb2ludGVyIGFuZCB3aGVlbCBzcGVlZCBjb250cm9sIGFuZCBhY2NlbGVyYXRpb24uCisgKi8KK2NsYXNzIFZlbG9jaXR5Q29udHJvbCB7CitwdWJsaWM6CisgICAgVmVsb2NpdHlDb250cm9sKCk7CisKKyAgICAvKiBTZXRzIHRoZSB2YXJpb3VzIHBhcmFtZXRlcnMuICovCisgICAgdm9pZCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpOworCisgICAgLyogUmVzZXRzIHRoZSBjdXJyZW50IG1vdmVtZW50IGNvdW50ZXJzIHRvIHplcm8uCisgICAgICogVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBudWxsaWZ5aW5nIGFueSBhY2NlbGVyYXRpb24uICovCisgICAgdm9pZCByZXNldCgpOworCisgICAgLyogVHJhbnNsYXRlcyBhIHJhdyBtb3ZlbWVudCBkZWx0YSBpbnRvIGFuIGFwcHJvcHJpYXRlbHkKKyAgICAgKiBzY2FsZWQgLyBhY2NlbGVyYXRlZCBkZWx0YSBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZWxvY2l0eS4gKi8KKyAgICB2b2lkIG1vdmUobnNlY3NfdCBldmVudFRpbWUsIGZsb2F0KiBkZWx0YVgsIGZsb2F0KiBkZWx0YVkpOworCitwcml2YXRlOgorICAgIC8vIElmIG5vIG1vdmVtZW50cyBhcmUgcmVjZWl2ZWQgd2l0aGluIHRoaXMgYW1vdW50IG9mIHRpbWUsCisgICAgLy8gd2UgYXNzdW1lIHRoZSBtb3ZlbWVudCBoYXMgc3RvcHBlZCBhbmQgcmVzZXQgdGhlIG1vdmVtZW50IGNvdW50ZXJzLgorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IFNUT1BfVElNRSA9IDUwMCAqIDEwMDAwMDA7IC8vIDUwMCBtcworCisgICAgVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycyBtUGFyYW1ldGVyczsKKworICAgIG5zZWNzX3QgbUxhc3RNb3ZlbWVudFRpbWU7CisgICAgVmVsb2NpdHlUcmFja2VyOjpQb3NpdGlvbiBtUmF3UG9zaXRpb247CisgICAgVmVsb2NpdHlUcmFja2VyIG1WZWxvY2l0eVRyYWNrZXI7Cit9OworCisKIC8qCiAgKiBEZXNjcmliZXMgdGhlIGNoYXJhY3RlcmlzdGljcyBhbmQgY2FwYWJpbGl0aWVzIG9mIGFuIGlucHV0IGRldmljZS4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmggYi9pbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaAppbmRleCAyYzdjZjc1Li44YTkyY2Q2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaAorKysgYi9pbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaApAQCAtODQxLDYgKzg0MSw3IEBACiAgICAgICAgIERFTlNJVFlfREVGQVVMVCA9IEFDT05GSUdVUkFUSU9OX0RFTlNJVFlfREVGQVVMVCwKICAgICAgICAgREVOU0lUWV9MT1cgPSBBQ09ORklHVVJBVElPTl9ERU5TSVRZX0xPVywKICAgICAgICAgREVOU0lUWV9NRURJVU0gPSBBQ09ORklHVVJBVElPTl9ERU5TSVRZX01FRElVTSwKKyAgICAgICAgREVOU0lUWV9UViA9IEFDT05GSUdVUkFUSU9OX0RFTlNJVFlfVFYsCiAgICAgICAgIERFTlNJVFlfSElHSCA9IEFDT05GSUdVUkFUSU9OX0RFTlNJVFlfSElHSCwKICAgICAgICAgREVOU0lUWV9OT05FID0gQUNPTkZJR1VSQVRJT05fREVOU0lUWV9OT05FCiAgICAgfTsKQEAgLTE0NTIsMjQgKzE0NTMsMjAgQEAKICAgICAvLyBzZXR0aW5ncyBpcyB0aGUgcmVxdWVzdGVkIHNldHRpbmdzCiAgICAgaW5saW5lIGJvb2wgbWF0Y2goY29uc3QgUmVzVGFibGVfY29uZmlnJiBzZXR0aW5ncykgY29uc3QgewogICAgICAgICBpZiAoaW1zaSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKHNldHRpbmdzLm1jYyAhPSAwICYmIG1jYyAhPSAwCi0gICAgICAgICAgICAgICAgICYmIG1jYyAhPSBzZXR0aW5ncy5tY2MpIHx8IAotICAgICAgICAgICAgICAgIChzZXR0aW5ncy5tY2MgPT0gMCAmJiBtY2MgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChtY2MgIT0gMCAmJiBtY2MgIT0gc2V0dGluZ3MubWNjKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzZXR0aW5ncy5tbmMgIT0gMCAmJiBtbmMgIT0gMAotICAgICAgICAgICAgICAgICAmJiBtbmMgIT0gc2V0dGluZ3MubW5jKSB8fAotICAgICAgICAgICAgICAgIChzZXR0aW5ncy5tbmMgPT0gMCAmJiBtbmMgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChtbmMgIT0gMCAmJiBtbmMgIT0gc2V0dGluZ3MubW5jKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChsb2NhbGUgIT0gMCkgewotICAgICAgICAgICAgaWYgKHNldHRpbmdzLmxhbmd1YWdlWzBdICE9IDAgJiYgbGFuZ3VhZ2VbMF0gIT0gMAorICAgICAgICAgICAgaWYgKGxhbmd1YWdlWzBdICE9IDAKICAgICAgICAgICAgICAgICAmJiAobGFuZ3VhZ2VbMF0gIT0gc2V0dGluZ3MubGFuZ3VhZ2VbMF0KICAgICAgICAgICAgICAgICAgICAgfHwgbGFuZ3VhZ2VbMV0gIT0gc2V0dGluZ3MubGFuZ3VhZ2VbMV0pKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNldHRpbmdzLmNvdW50cnlbMF0gIT0gMCAmJiBjb3VudHJ5WzBdICE9IDAKKyAgICAgICAgICAgIGlmIChjb3VudHJ5WzBdICE9IDAKICAgICAgICAgICAgICAgICAmJiAoY291bnRyeVswXSAhPSBzZXR0aW5ncy5jb3VudHJ5WzBdCiAgICAgICAgICAgICAgICAgICAgIHx8IGNvdW50cnlbMV0gIT0gc2V0dGluZ3MuY291bnRyeVsxXSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNDgwLDY2ICsxNDc3LDU2IEBACiAgICAgICAgICAgICBjb25zdCBpbnQgc2V0U2NyZWVuU2l6ZSA9IHNldHRpbmdzLnNjcmVlbkxheW91dCZNQVNLX1NDUkVFTlNJWkU7CiAgICAgICAgICAgICAvLyBBbnkgc2NyZWVuIHNpemVzIGZvciBsYXJnZXIgc2NyZWVucyB0aGFuIHRoZSBzZXR0aW5nIGRvIG5vdAogICAgICAgICAgICAgLy8gbWF0Y2guCi0gICAgICAgICAgICBpZiAoKHNldFNjcmVlblNpemUgIT0gMCAmJiBzY3JlZW5TaXplICE9IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgc2NyZWVuU2l6ZSA+IHNldFNjcmVlblNpemUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChzZXRTY3JlZW5TaXplID09IDAgJiYgc2NyZWVuU2l6ZSAhPSAwKSkgeworICAgICAgICAgICAgaWYgKHNjcmVlblNpemUgIT0gMCAmJiBzY3JlZW5TaXplID4gc2V0U2NyZWVuU2l6ZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgY29uc3QgaW50IHNjcmVlbkxvbmcgPSBzY3JlZW5MYXlvdXQmTUFTS19TQ1JFRU5MT05HOwogICAgICAgICAgICAgY29uc3QgaW50IHNldFNjcmVlbkxvbmcgPSBzZXR0aW5ncy5zY3JlZW5MYXlvdXQmTUFTS19TQ1JFRU5MT05HOwotICAgICAgICAgICAgaWYgKHNldFNjcmVlbkxvbmcgIT0gMCAmJiBzY3JlZW5Mb25nICE9IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgc2NyZWVuTG9uZyAhPSBzZXRTY3JlZW5Mb25nKSB7CisgICAgICAgICAgICBpZiAoc2NyZWVuTG9uZyAhPSAwICYmIHNjcmVlbkxvbmcgIT0gc2V0U2NyZWVuTG9uZykgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY29uc3QgaW50IHVpTW9kZVR5cGUgPSB1aU1vZGUmTUFTS19VSV9NT0RFX1RZUEU7CiAgICAgICAgICAgICBjb25zdCBpbnQgc2V0VWlNb2RlVHlwZSA9IHNldHRpbmdzLnVpTW9kZSZNQVNLX1VJX01PREVfVFlQRTsKLSAgICAgICAgICAgIGlmIChzZXRVaU1vZGVUeXBlICE9IDAgJiYgdWlNb2RlVHlwZSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHVpTW9kZVR5cGUgIT0gc2V0VWlNb2RlVHlwZSkgeworICAgICAgICAgICAgaWYgKHVpTW9kZVR5cGUgIT0gMCAmJiB1aU1vZGVUeXBlICE9IHNldFVpTW9kZVR5cGUpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNvbnN0IGludCB1aU1vZGVOaWdodCA9IHVpTW9kZSZNQVNLX1VJX01PREVfTklHSFQ7CiAgICAgICAgICAgICBjb25zdCBpbnQgc2V0VWlNb2RlTmlnaHQgPSBzZXR0aW5ncy51aU1vZGUmTUFTS19VSV9NT0RFX05JR0hUOwotICAgICAgICAgICAgaWYgKHNldFVpTW9kZU5pZ2h0ICE9IDAgJiYgdWlNb2RlTmlnaHQgIT0gMAotICAgICAgICAgICAgICAgICAgICAmJiB1aU1vZGVOaWdodCAhPSBzZXRVaU1vZGVOaWdodCkgeworICAgICAgICAgICAgaWYgKHVpTW9kZU5pZ2h0ICE9IDAgJiYgdWlNb2RlTmlnaHQgIT0gc2V0VWlNb2RlTmlnaHQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zbWFsbGVzdFNjcmVlbldpZHRoRHAgIT0gMCAmJiBzbWFsbGVzdFNjcmVlbldpZHRoRHAgIT0gMAorICAgICAgICAgICAgaWYgKHNtYWxsZXN0U2NyZWVuV2lkdGhEcCAhPSAwCiAgICAgICAgICAgICAgICAgICAgICYmIHNtYWxsZXN0U2NyZWVuV2lkdGhEcCA+IHNldHRpbmdzLnNtYWxsZXN0U2NyZWVuV2lkdGhEcCkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoc2NyZWVuU2l6ZURwICE9IDApIHsKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zY3JlZW5XaWR0aERwICE9IDAgJiYgc2NyZWVuV2lkdGhEcCAhPSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHNjcmVlbldpZHRoRHAgPiBzZXR0aW5ncy5zY3JlZW5XaWR0aERwKSB7CisgICAgICAgICAgICBpZiAoc2NyZWVuV2lkdGhEcCAhPSAwICYmIHNjcmVlbldpZHRoRHAgPiBzZXR0aW5ncy5zY3JlZW5XaWR0aERwKSB7CiAgICAgICAgICAgICAgICAgLy9MT0dJKCJGaWx0ZXJpbmcgb3V0IHdpZHRoICVkIGluIHJlcXVlc3RlZCAlZCIsIHNjcmVlbldpZHRoRHAsIHNldHRpbmdzLnNjcmVlbldpZHRoRHApOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zY3JlZW5IZWlnaHREcCAhPSAwICYmIHNjcmVlbkhlaWdodERwICE9IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgc2NyZWVuSGVpZ2h0RHAgPiBzZXR0aW5ncy5zY3JlZW5IZWlnaHREcCkgeworICAgICAgICAgICAgaWYgKHNjcmVlbkhlaWdodERwICE9IDAgJiYgc2NyZWVuSGVpZ2h0RHAgPiBzZXR0aW5ncy5zY3JlZW5IZWlnaHREcCkgewogICAgICAgICAgICAgICAgIC8vTE9HSSgiRmlsdGVyaW5nIG91dCBoZWlnaHQgJWQgaW4gcmVxdWVzdGVkICVkIiwgc2NyZWVuSGVpZ2h0RHAsIHNldHRpbmdzLnNjcmVlbkhlaWdodERwKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNjcmVlblR5cGUgIT0gMCkgewotICAgICAgICAgICAgaWYgKHNldHRpbmdzLm9yaWVudGF0aW9uICE9IDAgJiYgb3JpZW50YXRpb24gIT0gMAotICAgICAgICAgICAgICAgICYmIG9yaWVudGF0aW9uICE9IHNldHRpbmdzLm9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gIT0gMCAmJiBvcmllbnRhdGlvbiAhPSBzZXR0aW5ncy5vcmllbnRhdGlvbikgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGRlbnNpdHkgYWx3YXlzIG1hdGNoZXMgLSB3ZSBjYW4gc2NhbGUgaXQuICBTZWUgaXNCZXR0ZXJUaGFuCi0gICAgICAgICAgICBpZiAoc2V0dGluZ3MudG91Y2hzY3JlZW4gIT0gMCAmJiB0b3VjaHNjcmVlbiAhPSAwCi0gICAgICAgICAgICAgICAgJiYgdG91Y2hzY3JlZW4gIT0gc2V0dGluZ3MudG91Y2hzY3JlZW4pIHsKKyAgICAgICAgICAgIGlmICh0b3VjaHNjcmVlbiAhPSAwICYmIHRvdWNoc2NyZWVuICE9IHNldHRpbmdzLnRvdWNoc2NyZWVuKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dCAhPSAwKSB7CiAgICAgICAgICAgICBjb25zdCBpbnQga2V5c0hpZGRlbiA9IGlucHV0RmxhZ3MmTUFTS19LRVlTSElEREVOOwogICAgICAgICAgICAgY29uc3QgaW50IHNldEtleXNIaWRkZW4gPSBzZXR0aW5ncy5pbnB1dEZsYWdzJk1BU0tfS0VZU0hJRERFTjsKLSAgICAgICAgICAgIGlmIChzZXRLZXlzSGlkZGVuICE9IDAgJiYga2V5c0hpZGRlbiAhPSAwCi0gICAgICAgICAgICAgICAgJiYga2V5c0hpZGRlbiAhPSBzZXRLZXlzSGlkZGVuKSB7CisgICAgICAgICAgICBpZiAoa2V5c0hpZGRlbiAhPSAwICYmIGtleXNIaWRkZW4gIT0gc2V0S2V5c0hpZGRlbikgewogICAgICAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5LCB3ZSBjb3VudCBhIHJlcXVlc3QgZm9yIEtFWVNISURERU5fTk8gYXMgYWxzbwogICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHRoZSBtb3JlIHJlY2VudCBLRVlTSElEREVOX1NPRlQuICBCYXNpY2FsbHkKICAgICAgICAgICAgICAgICAvLyBLRVlTSElEREVOX05PIG1lYW5zIHRoZXJlIGlzIHNvbWUga2luZCBvZiBrZXlib2FyZCBhdmFpbGFibGUuCkBAIC0xNTUxLDM2ICsxNTM4LDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb25zdCBpbnQgbmF2SGlkZGVuID0gaW5wdXRGbGFncyZNQVNLX05BVkhJRERFTjsKICAgICAgICAgICAgIGNvbnN0IGludCBzZXROYXZIaWRkZW4gPSBzZXR0aW5ncy5pbnB1dEZsYWdzJk1BU0tfTkFWSElEREVOOwotICAgICAgICAgICAgaWYgKHNldE5hdkhpZGRlbiAhPSAwICYmIG5hdkhpZGRlbiAhPSAwCi0gICAgICAgICAgICAgICAgJiYgbmF2SGlkZGVuICE9IHNldE5hdkhpZGRlbikgeworICAgICAgICAgICAgaWYgKG5hdkhpZGRlbiAhPSAwICYmIG5hdkhpZGRlbiAhPSBzZXROYXZIaWRkZW4pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3Mua2V5Ym9hcmQgIT0gMCAmJiBrZXlib2FyZCAhPSAwCi0gICAgICAgICAgICAgICAgJiYga2V5Ym9hcmQgIT0gc2V0dGluZ3Mua2V5Ym9hcmQpIHsKKyAgICAgICAgICAgIGlmIChrZXlib2FyZCAhPSAwICYmIGtleWJvYXJkICE9IHNldHRpbmdzLmtleWJvYXJkKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNldHRpbmdzLm5hdmlnYXRpb24gIT0gMCAmJiBuYXZpZ2F0aW9uICE9IDAKLSAgICAgICAgICAgICAgICAmJiBuYXZpZ2F0aW9uICE9IHNldHRpbmdzLm5hdmlnYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChuYXZpZ2F0aW9uICE9IDAgJiYgbmF2aWdhdGlvbiAhPSBzZXR0aW5ncy5uYXZpZ2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzY3JlZW5TaXplICE9IDApIHsKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zY3JlZW5XaWR0aCAhPSAwICYmIHNjcmVlbldpZHRoICE9IDAKLSAgICAgICAgICAgICAgICAmJiBzY3JlZW5XaWR0aCA+IHNldHRpbmdzLnNjcmVlbldpZHRoKSB7CisgICAgICAgICAgICBpZiAoc2NyZWVuV2lkdGggIT0gMCAmJiBzY3JlZW5XaWR0aCA+IHNldHRpbmdzLnNjcmVlbldpZHRoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNldHRpbmdzLnNjcmVlbkhlaWdodCAhPSAwICYmIHNjcmVlbkhlaWdodCAhPSAwCi0gICAgICAgICAgICAgICAgJiYgc2NyZWVuSGVpZ2h0ID4gc2V0dGluZ3Muc2NyZWVuSGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoc2NyZWVuSGVpZ2h0ICE9IDAgJiYgc2NyZWVuSGVpZ2h0ID4gc2V0dGluZ3Muc2NyZWVuSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICh2ZXJzaW9uICE9IDApIHsKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zZGtWZXJzaW9uICE9IDAgJiYgc2RrVmVyc2lvbiAhPSAwCi0gICAgICAgICAgICAgICAgJiYgc2RrVmVyc2lvbiA+IHNldHRpbmdzLnNka1ZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChzZGtWZXJzaW9uICE9IDAgJiYgc2RrVmVyc2lvbiA+IHNldHRpbmdzLnNka1ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3MubWlub3JWZXJzaW9uICE9IDAgJiYgbWlub3JWZXJzaW9uICE9IDAKLSAgICAgICAgICAgICAgICAmJiBtaW5vclZlcnNpb24gIT0gc2V0dGluZ3MubWlub3JWZXJzaW9uKSB7CisgICAgICAgICAgICBpZiAobWlub3JWZXJzaW9uICE9IDAgJiYgbWlub3JWZXJzaW9uICE9IHNldHRpbmdzLm1pbm9yVmVyc2lvbikgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0tleVN0b3JlLmphdmEgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5U3RvcmUuamF2YQppbmRleCA3MTgzNjg4Li45MDU4Y2FlIDEwMDY0NAotLS0gYS9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5U3RvcmUuamF2YQorKysgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5U3RvcmUuamF2YQpAQCAtMzIsNiArMzIsOCBAQAogICogcHJlY2x1ZGUgdGhlIHVzZSBvZiBoYXJkd2FyZSBjcnlwdG8uCiAgKi8KIHB1YmxpYyBjbGFzcyBLZXlTdG9yZSB7CisKKyAgICAvLyBSZXNwb25zZUNvZGVzCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fRVJST1IgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0tFRCA9IDI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5JTklUSUFMSVpFRCA9IDM7CkBAIC00Myw2ICs0NSw5IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEX0FDVElPTiA9IDk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JPTkdfUEFTU1dPUkQgPSAxMDsKIAorICAgIC8vIFN0YXRlcworICAgIHB1YmxpYyBlbnVtIFN0YXRlIHsgVU5MT0NLRUQsIExPQ0tFRCwgVU5JTklUSUFMSVpFRCB9OworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxTb2NrZXRBZGRyZXNzIHNBZGRyZXNzID0gbmV3IExvY2FsU29ja2V0QWRkcmVzcygKICAgICAgICAgICAgICJrZXlzdG9yZSIsIExvY2FsU29ja2V0QWRkcmVzcy5OYW1lc3BhY2UuUkVTRVJWRUQpOwogCkBAIC01NCwzMSArNTksMzUgQEAKICAgICAgICAgcmV0dXJuIG5ldyBLZXlTdG9yZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgdGVzdCgpIHsKKyAgICBwdWJsaWMgU3RhdGUgc3RhdGUoKSB7CiAgICAgICAgIGV4ZWN1dGUoJ3QnKTsKLSAgICAgICAgcmV0dXJuIG1FcnJvcjsKKyAgICAgICAgc3dpdGNoIChtRXJyb3IpIHsKKyAgICAgICAgICAgIGNhc2UgTk9fRVJST1I6IHJldHVybiBTdGF0ZS5VTkxPQ0tFRDsKKyAgICAgICAgICAgIGNhc2UgTE9DS0VEOiByZXR1cm4gU3RhdGUuTE9DS0VEOworICAgICAgICAgICAgY2FzZSBVTklOSVRJQUxJWkVEOiByZXR1cm4gU3RhdGUuVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtRXJyb3IpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIGJ5dGVbXSBnZXQoYnl0ZVtdIGtleSkgeworICAgIHByaXZhdGUgYnl0ZVtdIGdldChieXRlW10ga2V5KSB7CiAgICAgICAgIEFycmF5TGlzdDxieXRlW10+IHZhbHVlcyA9IGV4ZWN1dGUoJ2cnLCBrZXkpOwogICAgICAgICByZXR1cm4gKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5pc0VtcHR5KCkpID8gbnVsbCA6IHZhbHVlcy5nZXQoMCk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXQoU3RyaW5nIGtleSkgewotICAgICAgICBieXRlW10gdmFsdWUgPSBnZXQoZ2V0Qnl0ZXMoa2V5KSk7Ci0gICAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogdG9TdHJpbmcodmFsdWUpOworICAgIHB1YmxpYyBieXRlW10gZ2V0KFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldChnZXRCeXRlcyhrZXkpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBwdXQoYnl0ZVtdIGtleSwgYnl0ZVtdIHZhbHVlKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIHB1dChieXRlW10ga2V5LCBieXRlW10gdmFsdWUpIHsKICAgICAgICAgZXhlY3V0ZSgnaScsIGtleSwgdmFsdWUpOwogICAgICAgICByZXR1cm4gbUVycm9yID09IE5PX0VSUk9SOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHB1dChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHB1dChnZXRCeXRlcyhrZXkpLCBnZXRCeXRlcyh2YWx1ZSkpOworICAgIHB1YmxpYyBib29sZWFuIHB1dChTdHJpbmcga2V5LCBieXRlW10gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHB1dChnZXRCeXRlcyhrZXkpLCB2YWx1ZSk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlKGJ5dGVbXSBrZXkpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsZXRlKGJ5dGVbXSBrZXkpIHsKICAgICAgICAgZXhlY3V0ZSgnZCcsIGtleSk7CiAgICAgICAgIHJldHVybiBtRXJyb3IgPT0gTk9fRVJST1I7CiAgICAgfQpAQCAtODcsNyArOTYsNyBAQAogICAgICAgICByZXR1cm4gZGVsZXRlKGdldEJ5dGVzKGtleSkpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGJ5dGVbXSBrZXkpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoYnl0ZVtdIGtleSkgewogICAgICAgICBleGVjdXRlKCdlJywga2V5KTsKICAgICAgICAgcmV0dXJuIG1FcnJvciA9PSBOT19FUlJPUjsKICAgICB9CkBAIC0xMTgsMTkgKzEyNywxMSBAQAogICAgICAgICByZXR1cm4gbUVycm9yID09IE5PX0VSUk9SOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHBhc3N3b3JkKGJ5dGVbXSBvbGRQYXNzd29yZCwgYnl0ZVtdIG5ld1Bhc3N3b3JkKSB7Ci0gICAgICAgIGV4ZWN1dGUoJ3AnLCBvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQpOworICAgIHByaXZhdGUgYm9vbGVhbiBwYXNzd29yZChieXRlW10gcGFzc3dvcmQpIHsKKyAgICAgICAgZXhlY3V0ZSgncCcsIHBhc3N3b3JkKTsKICAgICAgICAgcmV0dXJuIG1FcnJvciA9PSBOT19FUlJPUjsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBwYXNzd29yZChTdHJpbmcgb2xkUGFzc3dvcmQsIFN0cmluZyBuZXdQYXNzd29yZCkgewotICAgICAgICByZXR1cm4gcGFzc3dvcmQoZ2V0Qnl0ZXMob2xkUGFzc3dvcmQpLCBnZXRCeXRlcyhuZXdQYXNzd29yZCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBhc3N3b3JkKGJ5dGVbXSBwYXNzd29yZCkgewotICAgICAgICByZXR1cm4gcGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBwYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKICAgICAgICAgcmV0dXJuIHBhc3N3b3JkKGdldEJ5dGVzKHBhc3N3b3JkKSk7CiAgICAgfQpAQCAtMTQwLDcgKzE0MSw3IEBACiAgICAgICAgIHJldHVybiBtRXJyb3IgPT0gTk9fRVJST1I7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gdW5sb2NrKGJ5dGVbXSBwYXNzd29yZCkgeworICAgIHByaXZhdGUgYm9vbGVhbiB1bmxvY2soYnl0ZVtdIHBhc3N3b3JkKSB7CiAgICAgICAgIGV4ZWN1dGUoJ3UnLCBwYXNzd29yZCk7CiAgICAgICAgIHJldHVybiBtRXJyb3IgPT0gTk9fRVJST1I7CiAgICAgfQpAQCAtMTQ5LDYgKzE1MCwxMSBAQAogICAgICAgICByZXR1cm4gdW5sb2NrKGdldEJ5dGVzKHBhc3N3b3JkKSk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgZXhlY3V0ZSgneicpOworICAgICAgICByZXR1cm4gbUVycm9yID09IEtFWV9OT1RfRk9VTkQ7CisgICAgfQorCiAgICAgcHVibGljIGludCBnZXRMYXN0RXJyb3IoKSB7CiAgICAgICAgIHJldHVybiBtRXJyb3I7CiAgICAgfQpkaWZmIC0tZ2l0IGEva2V5c3RvcmUvdGVzdHMvc3JjL2FuZHJvaWQvc2VjdXJpdHkvS2V5U3RvcmVUZXN0LmphdmEgYi9rZXlzdG9yZS90ZXN0cy9zcmMvYW5kcm9pZC9zZWN1cml0eS9LZXlTdG9yZVRlc3QuamF2YQppbmRleCA2NjMwYTRmLi40NTgyYWEwIDEwMDc1NQotLS0gYS9rZXlzdG9yZS90ZXN0cy9zcmMvYW5kcm9pZC9zZWN1cml0eS9LZXlTdG9yZVRlc3QuamF2YQorKysgYi9rZXlzdG9yZS90ZXN0cy9zcmMvYW5kcm9pZC9zZWN1cml0eS9LZXlTdG9yZVRlc3QuamF2YQpAQCAtMjAsNiArMjAsOSBAQAogaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VW5pdFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIAogLyoqCiAgKiBKdW5pdCAvIEluc3RydW1lbnRhdGlvbiB0ZXN0IGNhc2UgZm9yIEtleVN0b3JlIGNsYXNzCkBAIC0zMSwxNiArMzQsMTUgQEAKIEBNZWRpdW1UZXN0CiBwdWJsaWMgY2xhc3MgS2V5U3RvcmVUZXN0IGV4dGVuZHMgQWN0aXZpdHlVbml0VGVzdENhc2U8QWN0aXZpdHk+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQVNTV0QgPSAiMTIzNDU2NzgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VNUFRZX1BBU1NXRCA9ICIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NIT1JUX1BBU1NXRCA9ICJzaG9ydCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFTU1dEMiA9ICI4NzY1NDMyMSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfS0VZTkFNRSA9ICJ0ZXN0a2V5IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9LRVlOQU1FMSA9ICJ0ZXN0a2V5MSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfS0VZTkFNRTIgPSAidGVzdGtleTIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0tFWVZBTFVFID0gInRlc3QgdmFsdWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBURVNUX0tFWVZBTFVFID0gInRlc3QgdmFsdWUiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKIAogICAgIC8vICJIZWxsbywgV29ybGQiIGluIENoaW5lc2UKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JMThOID0gIlx1NEY2MFx1NTk3RCwgXHU0RTE2XHU3NTRDIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JMThOX0tFWSA9ICJcdTRGNjBcdTU5N0QsIFx1NEUxNlx1NzU0QyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFRFU1RfSTE4Tl9WQUxVRSA9IFRFU1RfSTE4Tl9LRVkuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOwogCiAgICAgcHJpdmF0ZSBLZXlTdG9yZSBtS2V5U3RvcmUgPSBudWxsOwogCkBAIC01MSw4ICs1MywxMCBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1LZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChtS2V5U3RvcmUudGVzdCgpICE9IEtleVN0b3JlLlVOSU5JVElBTElaRUQpIG1LZXlTdG9yZS5yZXNldCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoS2V5U3RvcmUuVU5JTklUSUFMSVpFRCwgbUtleVN0b3JlLnRlc3QoKSk7CisgICAgICAgIGlmIChtS2V5U3RvcmUuc3RhdGUoKSAhPSBLZXlTdG9yZS5TdGF0ZS5VTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICBtS2V5U3RvcmUucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoS2V5U3RvcmUuU3RhdGUuVU5JTklUSUFMSVpFRCwgbUtleVN0b3JlLnN0YXRlKCkpOwogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgIH0KIApAQCAtNjIsMjEgKzY2LDEzIEBACiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEtleVN0b3JlLlVOSU5JVElBTElaRUQsIG1LZXlTdG9yZS50ZXN0KCkpOworICAgIHB1YmxpYyB2b2lkIHRlc3RzdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoS2V5U3RvcmUuU3RhdGUuVU5JTklUSUFMSVpFRCwgbUtleVN0b3JlLnN0YXRlKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXNzd29yZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2Fzc2VydEZhbHNlKG1LZXlTdG9yZS5wYXNzd29yZChURVNUX0VNUFRZX1BBU1NXRCkpOwotICAgICAgICAvL2Fzc2VydEZhbHNlKG1LZXlTdG9yZS5wYXNzd29yZChURVNUX1NIT1JUX1BBU1NXRCkpOwotCiAgICAgICAgIGFzc2VydFRydWUobUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfUEFTU1dEKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhLZXlTdG9yZS5OT19FUlJPUiwgbUtleVN0b3JlLnRlc3QoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UobUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfUEFTU1dEMiwgVEVTVF9QQVNTV0QyKSk7Ci0gICAgICAgIC8vYXNzZXJ0RmFsc2UobUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfUEFTU1dELCBURVNUX1NIT1JUX1BBU1NXRCkpOwotCi0gICAgICAgIGFzc2VydFRydWUobUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfUEFTU1dELCBURVNUX1BBU1NXRDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEtleVN0b3JlLlN0YXRlLlVOTE9DS0VELCBtS2V5U3RvcmUuc3RhdGUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtODcsMTEgKzgzLDExIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEkxOG4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UobUtleVN0b3JlLnB1dChURVNUX0kxOE4sIFRFU1RfSTE4TikpOwotICAgICAgICBhc3NlcnRGYWxzZShtS2V5U3RvcmUuY29udGFpbnMoVEVTVF9JMThOKSk7Ci0gICAgICAgIG1LZXlTdG9yZS5wYXNzd29yZChURVNUX0kxOE4pOwotICAgICAgICBhc3NlcnRUcnVlKG1LZXlTdG9yZS5wdXQoVEVTVF9JMThOLCBURVNUX0kxOE4pKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5U3RvcmUuY29udGFpbnMoVEVTVF9JMThOKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1LZXlTdG9yZS5wdXQoVEVTVF9JMThOX0tFWSwgVEVTVF9JMThOX1ZBTFVFKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1LZXlTdG9yZS5jb250YWlucyhURVNUX0kxOE5fS0VZKSk7CisgICAgICAgIG1LZXlTdG9yZS5wYXNzd29yZChURVNUX0kxOE5fS0VZKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5U3RvcmUucHV0KFRFU1RfSTE4Tl9LRVksIFRFU1RfSTE4Tl9WQUxVRSkpOworICAgICAgICBhc3NlcnRUcnVlKG1LZXlTdG9yZS5jb250YWlucyhURVNUX0kxOE5fS0VZKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTE0LDMzICsxMTAsNDYgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2F3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBtS2V5U3RvcmUuc2F3KFRFU1RfS0VZTkFNRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCByZXN1bHRzLmxlbmd0aCk7CisgICAgICAgIFN0cmluZ1tdIGVtcHR5UmVzdWx0ID0gbUtleVN0b3JlLnNhdyhURVNUX0tFWU5BTUUpOworICAgICAgICBhc3NlcnROb3ROdWxsKGVtcHR5UmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVtcHR5UmVzdWx0Lmxlbmd0aCk7CiAKICAgICAgICAgbUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfUEFTU1dEKTsKICAgICAgICAgbUtleVN0b3JlLnB1dChURVNUX0tFWU5BTUUxLCBURVNUX0tFWVZBTFVFKTsKICAgICAgICAgbUtleVN0b3JlLnB1dChURVNUX0tFWU5BTUUyLCBURVNUX0tFWVZBTFVFKTsKIAotICAgICAgICByZXN1bHRzID0gbUtleVN0b3JlLnNhdyhURVNUX0tFWU5BTUUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0cy5sZW5ndGgpOworICAgICAgICBTdHJpbmdbXSByZXN1bHRzID0gbUtleVN0b3JlLnNhdyhURVNUX0tFWU5BTUUpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChURVNUX0tFWU5BTUUxLnN1YnN0cmluZyhURVNUX0tFWU5BTUUubGVuZ3RoKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0tFWU5BTUUyLnN1YnN0cmluZyhURVNUX0tFWU5BTUUubGVuZ3RoKCkpKSksCisgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KHJlc3VsdHMpKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdExvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UobUtleVN0b3JlLmxvY2soKSk7CiAKICAgICAgICAgbUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfUEFTU1dEKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEtleVN0b3JlLk5PX0VSUk9SLCBtS2V5U3RvcmUudGVzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEtleVN0b3JlLlN0YXRlLlVOTE9DS0VELCBtS2V5U3RvcmUuc3RhdGUoKSk7CiAKICAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5U3RvcmUubG9jaygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEtleVN0b3JlLkxPQ0tFRCwgbUtleVN0b3JlLnRlc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhLZXlTdG9yZS5TdGF0ZS5MT0NLRUQsIG1LZXlTdG9yZS5zdGF0ZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5sb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1LZXlTdG9yZS5wYXNzd29yZChURVNUX1BBU1NXRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhLZXlTdG9yZS5OT19FUlJPUiwgbUtleVN0b3JlLnRlc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhLZXlTdG9yZS5TdGF0ZS5VTkxPQ0tFRCwgbUtleVN0b3JlLnN0YXRlKCkpOwogICAgICAgICBtS2V5U3RvcmUubG9jaygpOwogCiAgICAgICAgIGFzc2VydEZhbHNlKG1LZXlTdG9yZS51bmxvY2soVEVTVF9QQVNTV0QyKSk7CiAgICAgICAgIGFzc2VydFRydWUobUtleVN0b3JlLnVubG9jayhURVNUX1BBU1NXRCkpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUobUtleVN0b3JlLmlzRW1wdHkoKSk7CisgICAgICAgIG1LZXlTdG9yZS5wYXNzd29yZChURVNUX1BBU1NXRCk7CisgICAgICAgIGFzc2VydFRydWUobUtleVN0b3JlLmlzRW1wdHkoKSk7CisgICAgICAgIG1LZXlTdG9yZS5wdXQoVEVTVF9LRVlOQU1FLCBURVNUX0tFWVZBTFVFKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobUtleVN0b3JlLmlzRW1wdHkoKSk7CisgICAgICAgIG1LZXlTdG9yZS5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKG1LZXlTdG9yZS5pc0VtcHR5KCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwIGIvbGlicy9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKaW5kZXggYzI5NTMxNS4uOTM5MmNmMiAxMDA2NDQKLS0tIGEvbGlicy9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvbGlicy9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKQEAgLTE0Niw2ICsxNDYsNyBAQAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIySVtdID0gInl1djQyMmkteXV5diI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBQW10gID0gInl1djQyMHAiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfUkdCNTY1W10gPSAicmdiNTY1IjsKK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1JHQkE4ODg4W10gPSAicmdiYTg4ODgiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfSlBFR1tdID0gImpwZWciOwogCiAvLyBWYWx1ZXMgZm9yIGZvY3VzIG1vZGUgc2V0dGluZ3MuCmRpZmYgLS1naXQgYS9saWJzL2d1aS9TZW5zb3IuY3BwIGIvbGlicy9ndWkvU2Vuc29yLmNwcAppbmRleCBiMWYzN2ZmLi5mOWEyYzA0NiAxMDA2NDQKLS0tIGEvbGlicy9ndWkvU2Vuc29yLmNwcAorKysgYi9saWJzL2d1aS9TZW5zb3IuY3BwCkBAIC04OSw2ICs4OSwxNCBAQAogICAgIHJldHVybiBtTWluRGVsYXk7CiB9CiAKK25zZWNzX3QgU2Vuc29yOjpnZXRNaW5EZWxheU5zKCkgY29uc3QgeworICAgIHJldHVybiBnZXRNaW5EZWxheSgpICogMTAwMDsKK30KKworaW50MzJfdCBTZW5zb3I6OmdldFZlcnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIG1WZXJzaW9uOworfQorCiBzaXplX3QgU2Vuc29yOjpnZXRGbGF0dGVuZWRTaXplKCkgY29uc3QKIHsKICAgICByZXR1cm4gIHNpemVvZihpbnQzMl90KSArICgobU5hbWUubGVuZ3RoKCkgKyAzKSAmIH4zKSArCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvQ2FjaGVzLmNwcCBiL2xpYnMvaHd1aS9DYWNoZXMuY3BwCmluZGV4IGNkNDg0MjkuLmIwZDhjZjkgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9DYWNoZXMuY3BwCisrKyBiL2xpYnMvaHd1aS9DYWNoZXMuY3BwCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGZvbnRSZW5kZXJlci5nZXRGb250UmVuZGVyZXJTaXplKGkpOwogICAgICAgICBsb2cuYXBwZW5kRm9ybWF0KCIgIEZvbnRSZW5kZXJlciAlZCAgICAgICAlOGQgLyAlOGRcbiIsIGksIHNpemUsIHNpemUpOwogICAgIH0KLSAgICBsb2cuYXBwZW5kRm9ybWF0KCJPdGhlcjoiKTsKKyAgICBsb2cuYXBwZW5kRm9ybWF0KCJPdGhlcjpcbiIpOwogICAgIGxvZy5hcHBlbmRGb3JtYXQoIiAgRmJvQ2FjaGUgICAgICAgICAgICAgJThkIC8gJThkXG4iLAogICAgICAgICAgICAgZmJvQ2FjaGUuZ2V0U2l6ZSgpLCBmYm9DYWNoZS5nZXRNYXhTaXplKCkpOwogICAgIGxvZy5hcHBlbmRGb3JtYXQoIiAgUGF0Y2hDYWNoZSAgICAgICAgICAgJThkIC8gJThkXG4iLApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwCmluZGV4IGY4NTgyZDguLmFmYWIyNmEgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9EaXNwbGF5TGlzdFJlbmRlcmVyLmNwcAorKysgYi9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5jcHAKQEAgLTExNTEsNiArMTE1MSw3IEBACiAKIHZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGludCBjb3VudCwKICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAoY291bnQgPD0gMCkgcmV0dXJuOwogICAgIGFkZE9wKERpc3BsYXlMaXN0OjpEcmF3VGV4dCk7CiAgICAgYWRkVGV4dCh0ZXh0LCBieXRlc0NvdW50KTsKICAgICBhZGRJbnQoY291bnQpOwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcAppbmRleCAxY2EwYTE5Li45YmYzZGU4IDEwMDY0NAotLS0gYS9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcAorKysgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfV0lEVEggMTAyNAogI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfSEVJR0hUIDI1NgogCisvLyBXZSBzaG91bGQgcXVlcnkgdGhlc2UgdmFsdWVzIGZyb20gdGhlIEdMIGNvbnRleHQKICNkZWZpbmUgTUFYX1RFWFRfQ0FDSEVfV0lEVEggMjA0OAogI2RlZmluZSBNQVhfVEVYVF9DQUNIRV9IRUlHSFQgMjA0OAogCkBAIC01OCw4ICs1OSw3IEBACiAgICAgfQogCiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQ2FjaGVkR2x5cGhJbmZvKiBnbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKTsKLSAgICAgICAgZGVsZXRlIGdseXBoOworICAgICAgICBkZWxldGUgbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpOwogICAgIH0KIH0KIApAQCAtMTM0LDQ4ICsxMzQsNDkgQEAKIAogfQogCi1Gb250OjpDYWNoZWRHbHlwaEluZm8qIEZvbnQ6OmdldENhY2hlZFVURkNoYXIoU2tQYWludCogcGFpbnQsIGludDMyX3QgdXRmQ2hhcikgeworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpnZXRDYWNoZWRHbHlwaChTa1BhaW50KiBwYWludCwgZ2x5cGhfdCB0ZXh0VW5pdCkgewogICAgIENhY2hlZEdseXBoSW5mbyogY2FjaGVkR2x5cGggPSBOVUxMOwotICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGVkR2x5cGhzLmluZGV4T2ZLZXkodXRmQ2hhcik7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZWRHbHlwaHMuaW5kZXhPZktleSh0ZXh0VW5pdCk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgY2FjaGVkR2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaW5kZXgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNhY2hlZEdseXBoID0gY2FjaGVHbHlwaChwYWludCwgdXRmQ2hhcik7CisgICAgICAgIGNhY2hlZEdseXBoID0gY2FjaGVHbHlwaChwYWludCwgdGV4dFVuaXQpOwogICAgIH0KIAogICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPwogICAgIGlmICghY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7Ci0gICAgICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyh1dGZDaGFyKTsKKyAgICAgICAgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoID0gR0VUX01FVFJJQ1MocGFpbnQsIHRleHRVbml0KTsKICAgICAgICAgdXBkYXRlR2x5cGhDYWNoZShwYWludCwgc2tpYUdseXBoLCBjYWNoZWRHbHlwaCk7CiAgICAgfQogCiAgICAgcmV0dXJuIGNhY2hlZEdseXBoOwogfQogCi12b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKK3ZvaWQgRm9udDo6cmVuZGVyKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAogICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCkgewogICAgIGlmIChiaXRtYXAgIT0gTlVMTCAmJiBiaXRtYXBXID4gMCAmJiBiaXRtYXBIID4gMCkgewotICAgICAgICByZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgeCwgeSwgQklUTUFQLCBiaXRtYXAsCisgICAgICAgIHJlbmRlcihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCB4LCB5LCBCSVRNQVAsIGJpdG1hcCwKICAgICAgICAgICAgICAgICBiaXRtYXBXLCBiaXRtYXBILCBOVUxMKTsKICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgeCwgeSwgRlJBTUVCVUZGRVIsIE5VTEwsIDAsIDAsIE5VTEwpOworICAgICAgICByZW5kZXIocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgeCwgeSwgRlJBTUVCVUZGRVIsIE5VTEwsCisgICAgICAgICAgICAgICAgMCwgMCwgTlVMTCk7CiAgICAgfQogCiB9CiAKLXZvaWQgRm9udDo6bWVhc3VyZVVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKK3ZvaWQgRm9udDo6bWVhc3VyZShTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKICAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKSB7CiAgICAgaWYgKGJvdW5kcyA9PSBOVUxMKSB7CiAgICAgICAgIExPR0UoIk5vIHJldHVybiByZWN0YW5nbGUgcHJvdmlkZWQgdG8gbWVhc3VyZSB0ZXh0Iik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgYm91bmRzLT5zZXQoMWU2LCAtMWU2LCAtMWU2LCAxZTYpOwotICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCAwLCAwLCBNRUFTVVJFLCBOVUxMLCAwLCAwLCBib3VuZHMpOworICAgIHJlbmRlcihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCAwLCAwLCBNRUFTVVJFLCBOVUxMLCAwLCAwLCBib3VuZHMpOwogfQogCiAjZGVmaW5lIFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2LCBuZXh0KSAoKChuZXh0KSAtIChwcmV2KSArIDMyKSA+PiA2IDw8IDE2KQogCi12b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKK3ZvaWQgRm9udDo6cmVuZGVyKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAogICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwgdWludDhfdCAqYml0bWFwLAogICAgICAgICB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBILFJlY3QgKmJvdW5kcykgewogICAgIGlmIChudW1HbHlwaHMgPT0gMCB8fCB0ZXh0ID09IE5VTEwgfHwgbGVuID09IDApIHsKQEAgLTE5NSwxNCArMTk2LDE0IEBACiAgICAgdGV4dCArPSBzdGFydDsKIAogICAgIHdoaWxlIChnbHlwaHNMZWZ0ID4gMCkgewotICAgICAgICBpbnQzMl90IHV0ZkNoYXIgPSBTa1VURjE2X05leHRVbmljaGFyKChjb25zdCB1aW50MTZfdCoqKSAmdGV4dCk7CisgICAgICAgIGdseXBoX3QgZ2x5cGggPSBHRVRfR0xZUEgodGV4dCk7CiAKICAgICAgICAgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKLSAgICAgICAgaWYgKHV0ZkNoYXIgPCAwKSB7CisgICAgICAgIGlmIChJU19FTkRfT0ZfU1RSSU5HKGdseXBoKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBDYWNoZWRHbHlwaEluZm8qIGNhY2hlZEdseXBoID0gZ2V0Q2FjaGVkVVRGQ2hhcihwYWludCwgdXRmQ2hhcik7CisgICAgICAgIENhY2hlZEdseXBoSW5mbyogY2FjaGVkR2x5cGggPSBnZXRDYWNoZWRHbHlwaChwYWludCwgZ2x5cGgpOwogICAgICAgICBwZW5YICs9IFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2UnNiRGVsdGEsIGNhY2hlZEdseXBoLT5tTHNiRGVsdGEpOwogICAgICAgICBwcmV2UnNiRGVsdGEgPSBjYWNoZWRHbHlwaC0+bVJzYkRlbHRhOwogCkBAIC0yNjgsMTEgKzI2OSwxMSBAQAogICAgIG1TdGF0ZS0+bVVwbG9hZFRleHR1cmUgPSB0cnVlOwogfQogCi1Gb250OjpDYWNoZWRHbHlwaEluZm8qIEZvbnQ6OmNhY2hlR2x5cGgoU2tQYWludCogcGFpbnQsIGludDMyX3QgZ2x5cGgpIHsKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyogRm9udDo6Y2FjaGVHbHlwaChTa1BhaW50KiBwYWludCwgZ2x5cGhfdCBnbHlwaCkgewogICAgIENhY2hlZEdseXBoSW5mbyogbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CiAgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKIAotICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyhnbHlwaCk7CisgICAgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoID0gR0VUX01FVFJJQ1MocGFpbnQsIGdseXBoKTsKICAgICBuZXdHbHlwaC0+bUdseXBoSW5kZXggPSBza2lhR2x5cGguZklEOwogICAgIG5ld0dseXBoLT5tSXNWYWxpZCA9IGZhbHNlOwogCkBAIC02NzIsNyArNjczLDcgQEAKICAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKICAgICB1aW50MzJfdCBwcmVjYWNoZUlkeCA9IDA7CiAgICAgd2hpbGUgKHJlbWFpbmluZ0NhcGFjaXR5ID4gMjUgJiYgcHJlY2FjaGVJZHggPCBtTGF0aW5QcmVjYWNoZS5zaXplKCkpIHsKLSAgICAgICAgbUN1cnJlbnRGb250LT5nZXRDYWNoZWRVVEZDaGFyKHBhaW50LCAoaW50MzJfdCkgbUxhdGluUHJlY2FjaGVbcHJlY2FjaGVJZHhdKTsKKyAgICAgICAgbUN1cnJlbnRGb250LT5nZXRDYWNoZWRHbHlwaChwYWludCwgKGludDMyX3QpIG1MYXRpblByZWNhY2hlW3ByZWNhY2hlSWR4XSk7CiAgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOwogICAgICAgICBwcmVjYWNoZUlkeCArKzsKICAgICB9CkBAIC03MTQsNyArNzE1LDcgQEAKICAgICB9CiAKICAgICBSZWN0IGJvdW5kczsKLSAgICBtQ3VycmVudEZvbnQtPm1lYXN1cmVVVEYocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCAmYm91bmRzKTsKKyAgICBtQ3VycmVudEZvbnQtPm1lYXN1cmUocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCAmYm91bmRzKTsKICAgICB1aW50MzJfdCBwYWRkZWRXaWR0aCA9ICh1aW50MzJfdCkgKGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0KSArIDIgKiByYWRpdXM7CiAgICAgdWludDMyX3QgcGFkZGVkSGVpZ2h0ID0gKHVpbnQzMl90KSAoYm91bmRzLnRvcCAtIGJvdW5kcy5ib3R0b20pICsgMiAqIHJhZGl1czsKICAgICB1aW50OF90KiBkYXRhQnVmZmVyID0gbmV3IHVpbnQ4X3RbcGFkZGVkV2lkdGggKiBwYWRkZWRIZWlnaHRdOwpAQCAtNzI1LDcgKzcyNiw3IEBACiAgICAgaW50IHBlblggPSByYWRpdXMgLSBib3VuZHMubGVmdDsKICAgICBpbnQgcGVuWSA9IHJhZGl1cyAtIGJvdW5kcy5ib3R0b207CiAKLSAgICBtQ3VycmVudEZvbnQtPnJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsIHBlblgsIHBlblksCisgICAgbUN1cnJlbnRGb250LT5yZW5kZXIocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCBwZW5YLCBwZW5ZLAogICAgICAgICAgICAgZGF0YUJ1ZmZlciwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCk7CiAgICAgYmx1ckltYWdlKGRhdGFCdWZmZXIsIHBhZGRlZFdpZHRoLCBwYWRkZWRIZWlnaHQsIHJhZGl1cyk7CiAKQEAgLTc1NSw3ICs3NTYsNyBAQAogICAgIG1EcmF3biA9IGZhbHNlOwogICAgIG1Cb3VuZHMgPSBib3VuZHM7CiAgICAgbUNsaXAgPSBjbGlwOwotICAgIG1DdXJyZW50Rm9udC0+cmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydEluZGV4LCBsZW4sIG51bUdseXBocywgeCwgeSk7CisgICAgbUN1cnJlbnRGb250LT5yZW5kZXIocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCB4LCB5KTsKICAgICBtQm91bmRzID0gTlVMTDsKIAogICAgIGlmIChtQ3VycmVudFF1YWRJbmRleCAhPSAwKSB7CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmggYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmgKaW5kZXggOTVmNzE0Zi4uMjRlZDZmYSAxMDA2NDQKLS0tIGEvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5oCisrKyBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaApAQCAtMzMsOCArMzMsMzIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB1aXJlbmRlcmVyIHsKIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaWYgUkVOREVSX1RFWFRfQVNfR0xZUEhTCisgICAgdHlwZWRlZiB1aW50MTZfdCBnbHlwaF90OworICAgICNkZWZpbmUgR0VUX01FVFJJQ1MocGFpbnQsIGdseXBoKSBwYWludC0+Z2V0R2x5cGhNZXRyaWNzKGdseXBoKQorICAgICNkZWZpbmUgR0VUX0dMWVBIKHRleHQpIG5leHRHbHlwaCgoY29uc3QgdWludDE2X3QqKikgJnRleHQpCisgICAgI2RlZmluZSBJU19FTkRfT0ZfU1RSSU5HKGdseXBoKSBmYWxzZQorI2Vsc2UKKyAgICB0eXBlZGVmIFNrVW5pY2hhciBnbHlwaF90OworICAgICNkZWZpbmUgR0VUX01FVFJJQ1MocGFpbnQsIGdseXBoKSBwYWludC0+Z2V0VW5pY2hhck1ldHJpY3MoZ2x5cGgpCisgICAgI2RlZmluZSBHRVRfR0xZUEgodGV4dCkgU2tVVEYxNl9OZXh0VW5pY2hhcigoY29uc3QgdWludDE2X3QqKikgJnRleHQpCisgICAgI2RlZmluZSBJU19FTkRfT0ZfU1RSSU5HKGdseXBoKSBnbHlwaCA8IDAKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWNsYXJhdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwogY2xhc3MgRm9udFJlbmRlcmVyOwogCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGb250CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKIC8qKgogICogUmVwcmVzZW50cyBhIGZvbnQsIGRlZmluZWQgYnkgYSBTa2lhIGZvbnQgaWQgYW5kIGEgZm9udCBzaXplLiBBIGZvbnQgaXMgdXNlZAogICogdG8gZ2VuZXJhdGUgZ2x5cGhzIGFuZCBjYWNoZSB0aGVtIGluIHRoZSBGb250U3RhdGUuCkBAIC01MSw5ICs3NSw5IEBACiAgICAgICogUmVuZGVycyB0aGUgc3BlY2lmaWVkIHN0cmluZyBvZiB0ZXh0LgogICAgICAqIElmIGJpdG1hcCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcmVuZGVyIHRhcmdldAogICAgICAqLwotICAgIHZvaWQgcmVuZGVyVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwID0gTlVMTCwgdWludDMyX3QgYml0bWFwVyA9IDAsIHVpbnQzMl90IGJpdG1hcEggPSAwKTsKKyAgICB2b2lkIHJlbmRlcihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSwgdWludDhfdCAqYml0bWFwID0gTlVMTCwKKyAgICAgICAgICAgIHVpbnQzMl90IGJpdG1hcFcgPSAwLCB1aW50MzJfdCBiaXRtYXBIID0gMCk7CiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBmb250IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGZvbnQgc3RhdGUuCiAgICAgICovCkBAIC02OSwxMyArOTMsMTIgQEAKICAgICAgICAgTUVBU1VSRSwKICAgICB9OwogCi0gICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCwKLSAgICAgICAgICAgICAgICAgICAgIFJlY3QgKmJvdW5kcyk7CisgICAgdm9pZCByZW5kZXIoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwgdWludDhfdCAqYml0bWFwLAorICAgICAgICAgICAgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCwgUmVjdCAqYm91bmRzKTsKIAotICAgIHZvaWQgbWVhc3VyZVVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBSZWN0ICpib3VuZHMpOworICAgIHZvaWQgbWVhc3VyZShTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgIGludCBudW1HbHlwaHMsIFJlY3QgKmJvdW5kcyk7CiAKICAgICBzdHJ1Y3QgQ2FjaGVkR2x5cGhJbmZvIHsKICAgICAgICAgLy8gSGFzIHRoZSBjYWNoZSBiZWVuIGludmFsaWRhdGVkPwpAQCAtMTA3LDE4ICsxMzAsMjYgQEAKICAgICBGb250KEZvbnRSZW5kZXJlciogc3RhdGUsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUsIGludCBmbGFncywgdWludDMyX3QgaXRhbGljU3R5bGUsCiAgICAgICAgICAgICB1aW50MzJfdCBzY2FsZVgpOwogCi0gICAgRGVmYXVsdEtleWVkVmVjdG9yPGludDMyX3QsIENhY2hlZEdseXBoSW5mbyo+IG1DYWNoZWRHbHlwaHM7CisgICAgLy8gQ2FjaGUgb2YgZ2x5cGhzCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPGdseXBoX3QsIENhY2hlZEdseXBoSW5mbyo+IG1DYWNoZWRHbHlwaHM7CiAKICAgICB2b2lkIGludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKIAotICAgIENhY2hlZEdseXBoSW5mbyogY2FjaGVHbHlwaChTa1BhaW50KiBwYWludCwgaW50MzJfdCBnbHlwaCk7CisgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZUdseXBoKFNrUGFpbnQqIHBhaW50LCBnbHlwaF90IGdseXBoKTsKICAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoU2tQYWludCogcGFpbnQsIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCwgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CiAgICAgdm9pZCBtZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpOwogICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSk7CiAgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpOworICAgICAgICAgICAgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKTsKIAotICAgIENhY2hlZEdseXBoSW5mbyogZ2V0Q2FjaGVkVVRGQ2hhcihTa1BhaW50KiBwYWludCwgaW50MzJfdCB1dGZDaGFyKTsKKyAgICBDYWNoZWRHbHlwaEluZm8qIGdldENhY2hlZEdseXBoKFNrUGFpbnQqIHBhaW50LCBnbHlwaF90IHRleHRVbml0KTsKKworICAgIHN0YXRpYyBnbHlwaF90IG5leHRHbHlwaChjb25zdCB1aW50MTZfdCoqIHNyY1B0cikgeworICAgICAgICBjb25zdCB1aW50MTZfdCogc3JjID0gKnNyY1B0cjsKKyAgICAgICAgZ2x5cGhfdCBnID0gKnNyYysrOworICAgICAgICAqc3JjUHRyID0gc3JjOworICAgICAgICByZXR1cm4gZzsKKyAgICB9CiAKICAgICBGb250UmVuZGVyZXIqIG1TdGF0ZTsKICAgICB1aW50MzJfdCBtRm9udElkOwpAQCAtMTI4LDYgKzE1OSwxMCBAQAogICAgIHVpbnQzMl90IG1TY2FsZVg7CiB9OwogCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCiBjbGFzcyBGb250UmVuZGVyZXIgewogcHVibGljOgogICAgIEZvbnRSZW5kZXJlcigpOwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKaW5kZXggOGU5ZThiZS4uODU1ODA1NCAxMDA2NDQKLS0tIGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcAorKysgYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwCkBAIC05OTAsMTIgKzk5MCwyNiBAQAogICAgIH0KIH0KIAordm9pZCBPcGVuR0xSZW5kZXJlcjo6YWNjb3VudEZvckNsZWFyKFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSkgeworICAgIGlmIChtQ29sb3JTZXQgJiYgbW9kZSA9PSBTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSkgeworICAgICAgICBtQ29sb3JBID0gMS4wZjsKKyAgICAgICAgbUNvbG9yUiA9IG1Db2xvckcgPSBtQ29sb3JCID0gMC4wZjsKKyAgICAgICAgbVNldFNoYWRlckNvbG9yID0gbURlc2NyaXB0aW9uLnNldEFscGhhOENvbG9yKG1Db2xvclIsIG1Db2xvckcsIG1Db2xvckIsIG1Db2xvckEpOworICAgIH0KK30KKwogdm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBEcmF3QmxlbmRpbmcoU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHN3YXBTcmNEc3QpIHsKKyAgICAvLyBXaGVuIHRoZSBibGVuZGluZyBtb2RlIGlzIGtDbGVhcl9Nb2RlLCB3ZSBuZWVkIHRvIHVzZSBhIG1vZHVsYXRlIGNvbG9yCisgICAgLy8gYXJnYj0xLDAsMCwwCisgICAgYWNjb3VudEZvckNsZWFyKG1vZGUpOwogICAgIGNob29zZUJsZW5kaW5nKChtQ29sb3JTZXQgJiYgbUNvbG9yQSA8IDEuMGYpIHx8IChtU2hhZGVyICYmIG1TaGFkZXItPmJsZW5kKCkpLCBtb2RlLAogICAgICAgICAgICAgbURlc2NyaXB0aW9uLCBzd2FwU3JjRHN0KTsKIH0KIAogdm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBEcmF3QmxlbmRpbmcoYm9vbCBibGVuZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHN3YXBTcmNEc3QpIHsKKyAgICAvLyBXaGVuIHRoZSBibGVuZGluZyBtb2RlIGlzIGtDbGVhcl9Nb2RlLCB3ZSBuZWVkIHRvIHVzZSBhIG1vZHVsYXRlIGNvbG9yCisgICAgLy8gYXJnYj0xLDAsMCwwCisgICAgYWNjb3VudEZvckNsZWFyKG1vZGUpOwogICAgIGNob29zZUJsZW5kaW5nKGJsZW5kIHx8IChtQ29sb3JTZXQgJiYgbUNvbG9yQSA8IDEuMGYpIHx8IChtU2hhZGVyICYmIG1TaGFkZXItPmJsZW5kKCkpLCBtb2RlLAogICAgICAgICAgICAgbURlc2NyaXB0aW9uLCBzd2FwU3JjRHN0KTsKIH0KQEAgLTE5MzUsNyArMTk0OSwxNiBAQAogICAgIH0KICAgICBpZiAobVNuYXBzaG90LT5pc0lnbm9yZWQoKSkgcmV0dXJuOwogCisgICAgLy8gVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IG1ha2UgYSBjb3B5IG9mIHRoZSBwYWludCBpbnN0ZWFkIG9mIG1vZGlmeWluZworICAgIC8vICAgICAgIGl0OyBtb2RpZnlpbmcgdGhlIHBhaW50IHdpbGwgY2hhbmdlIGl0cyBnZW5lcmF0aW9uSUQgdGhlIGZpcnN0CisgICAgLy8gICAgICAgdGltZSwgd2hpY2ggbWlnaHQgaW1wYWN0IGNhY2hlcy4gTW9yZSBpbnZlc3RpZ2F0aW9uIG5lZWRlZCB0bworICAgIC8vICAgICAgIHNlZSBpZiBpdCBtYXR0ZXJzLgorICAgIC8vICAgICAgIElmIHdlIG1ha2UgYSBjb3B5LCB0aGVuIGRyYXdUZXh0RGVjb3JhdGlvbnMoKSBzaG91bGQgKm5vdCogbWFrZQorICAgIC8vICAgICAgIGl0cyBvd24gY29weSBhcyBpdCBkb2VzIHJpZ2h0IG5vdy4KICAgICBwYWludC0+c2V0QW50aUFsaWFzKHRydWUpOworI2lmIFJFTkRFUl9URVhUX0FTX0dMWVBIUworICAgIHBhaW50LT5zZXRUZXh0RW5jb2RpbmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKKyNlbmRpZgogCiAgICAgZmxvYXQgbGVuZ3RoID0gLTEuMGY7CiAgICAgc3dpdGNoIChwYWludC0+Z2V0VGV4dEFsaWduKCkpIHsKQEAgLTE5NjksOCArMTk5Miw4IEBACiAKICAgICBpZiAobUhhc1NoYWRvdykgewogICAgICAgICBtQ2FjaGVzLmRyb3BTaGFkb3dDYWNoZS5zZXRGb250UmVuZGVyZXIoZm9udFJlbmRlcmVyKTsKLSAgICAgICAgY29uc3QgU2hhZG93VGV4dHVyZSogc2hhZG93ID0gbUNhY2hlcy5kcm9wU2hhZG93Q2FjaGUuZ2V0KHBhaW50LCB0ZXh0LCBieXRlc0NvdW50LAotICAgICAgICAgICAgICAgIGNvdW50LCBtU2hhZG93UmFkaXVzKTsKKyAgICAgICAgY29uc3QgU2hhZG93VGV4dHVyZSogc2hhZG93ID0gbUNhY2hlcy5kcm9wU2hhZG93Q2FjaGUuZ2V0KAorICAgICAgICAgICAgICAgIHBhaW50LCB0ZXh0LCBieXRlc0NvdW50LCBjb3VudCwgbVNoYWRvd1JhZGl1cyk7CiAgICAgICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHNoYWRvdyk7CiAKICAgICAgICAgY29uc3QgZmxvYXQgc3ggPSBvbGRYIC0gc2hhZG93LT5sZWZ0ICsgbVNoYWRvd0R4OwpAQCAtMjA1OSwxMSArMjA4Miw2IEBACiAgICAgZHJhd1RleHREZWNvcmF0aW9ucyh0ZXh0LCBieXRlc0NvdW50LCBsZW5ndGgsIG9sZFgsIG9sZFksIHBhaW50KTsKIH0KIAotdm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0dseXBocyhjb25zdCBjaGFyKiBnbHlwaHMsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LAotICAgICAgICBTa1BhaW50KiBwYWludCkgewotICAgIC8vIFRPRE8KLX0KLQogdm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGgoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgewogICAgIGlmIChtU25hcHNob3QtPmlzSWdub3JlZCgpKSByZXR1cm47CiAKQEAgLTIyMTYsMTQgKzIyMzQsMTUgQEAKICAgICAvLyBIYW5kbGUgdW5kZXJsaW5lIGFuZCBzdHJpa2UtdGhyb3VnaAogICAgIHVpbnQzMl90IGZsYWdzID0gcGFpbnQtPmdldEZsYWdzKCk7CiAgICAgaWYgKGZsYWdzICYgKFNrUGFpbnQ6OmtVbmRlcmxpbmVUZXh0X0ZsYWcgfCBTa1BhaW50OjprU3RyaWtlVGhydVRleHRfRmxhZykpIHsKKyAgICAgICAgU2tQYWludCBwYWludENvcHkoKnBhaW50KTsKICAgICAgICAgZmxvYXQgdW5kZXJsaW5lV2lkdGggPSBsZW5ndGg7CiAgICAgICAgIC8vIElmIGxlbmd0aCBpcyA+IDAuMGYsIHdlIGFscmVhZHkgbWVhc3VyZWQgdGhlIHRleHQgZm9yIHRoZSB0ZXh0IGFsaWdubWVudAogICAgICAgICBpZiAobGVuZ3RoIDw9IDAuMGYpIHsKLSAgICAgICAgICAgIHVuZGVybGluZVdpZHRoID0gcGFpbnQtPm1lYXN1cmVUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgICAgICAgICAgdW5kZXJsaW5lV2lkdGggPSBwYWludENvcHkubWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CiAgICAgICAgIH0KIAogICAgICAgICBmbG9hdCBvZmZzZXRYID0gMDsKLSAgICAgICAgc3dpdGNoIChwYWludC0+Z2V0VGV4dEFsaWduKCkpIHsKKyAgICAgICAgc3dpdGNoIChwYWludENvcHkuZ2V0VGV4dEFsaWduKCkpIHsKICAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a0NlbnRlcl9BbGlnbjoKICAgICAgICAgICAgICAgICBvZmZzZXRYID0gdW5kZXJsaW5lV2lkdGggKiAwLjVmOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjIzNSw4ICsyMjU0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICh1bmRlcmxpbmVXaWR0aCA+IDAuMGYpIHsKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IHRleHRTaXplID0gcGFpbnQtPmdldFRleHRTaXplKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IHN0cm9rZSB3aWR0aCA8IDEuMGYgd2hlbiB3ZSBoYXZlIEFBIGxpbmVzCisgICAgICAgICAgICBjb25zdCBmbG9hdCB0ZXh0U2l6ZSA9IHBhaW50Q29weS5nZXRUZXh0U2l6ZSgpOwogICAgICAgICAgICAgY29uc3QgZmxvYXQgc3Ryb2tlV2lkdGggPSBmbWF4KHRleHRTaXplICoga1N0ZFVuZGVybGluZV9UaGlja25lc3MsIDEuMGYpOwogCiAgICAgICAgICAgICBjb25zdCBmbG9hdCBsZWZ0ID0geCAtIG9mZnNldFg7CkBAIC0yMjY2LDEwICsyMjg0LDkgQEAKICAgICAgICAgICAgICAgICBwb2ludHNbY3VycmVudFBvaW50KytdID0gdG9wOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTa1BhaW50IGxpbmVzUGFpbnQoKnBhaW50KTsKLSAgICAgICAgICAgIGxpbmVzUGFpbnQuc2V0U3Ryb2tlV2lkdGgoc3Ryb2tlV2lkdGgpOworICAgICAgICAgICAgcGFpbnRDb3B5LnNldFN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoKTsKIAotICAgICAgICAgICAgZHJhd0xpbmVzKCZwb2ludHNbMF0sIHBvaW50c0NvdW50LCAmbGluZXNQYWludCk7CisgICAgICAgICAgICBkcmF3TGluZXMoJnBvaW50c1swXSwgcG9pbnRzQ291bnQsICZwYWludENvcHkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmggYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaAppbmRleCA3MGFiZTg4Li41NDlkNmU5IDEwMDY0NAotLS0gYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaAorKysgYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaApAQCAtMTIzLDggKzEyMyw2IEBACiAgICAgdmlydHVhbCB2b2lkIGRyYXdQb2ludHMoZmxvYXQqIHBvaW50cywgaW50IGNvdW50LCBTa1BhaW50KiBwYWludCk7CiAgICAgdmlydHVhbCB2b2lkIGRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksCiAgICAgICAgICAgICBTa1BhaW50KiBwYWludCk7Ci0gICAgdmlydHVhbCB2b2lkIGRyYXdHbHlwaHMoY29uc3QgY2hhciogZ2x5cGhzLCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwKLSAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50KTsKIAogICAgIHZpcnR1YWwgdm9pZCByZXNldFNoYWRlcigpOwogICAgIHZpcnR1YWwgdm9pZCBzZXR1cFNoYWRlcihTa2lhU2hhZGVyKiBzaGFkZXIpOwpAQCAtNDc4LDYgKzQ3Niw3IEBACiAgICAgdm9pZCBzZXR1cERyYXdBQUxpbmUoR0x2b2lkKiB2ZXJ0aWNlcywgR0x2b2lkKiBkaXN0YW5jZUNvb3JkcywgR0x2b2lkKiBsZW5ndGhDb29yZHMsCiAgICAgICAgICAgICBmbG9hdCBzdHJva2VXaWR0aCk7CiAgICAgdm9pZCBmaW5pc2hEcmF3VGV4dHVyZSgpOworICAgIHZvaWQgYWNjb3VudEZvckNsZWFyKFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CiAKICAgICB2b2lkIGRyYXdSZWdpb25SZWN0cyhjb25zdCBSZWdpb24mIHJlZ2lvbik7CiAKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmggYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCmluZGV4IDJkOGI2ZjMuLjdjMTA1MTggMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmgKKysrIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuaApAQCAtMjgsNiArMjgsOSBAQAogLy8gSWYgdHVybmVkIG9uLCBsYXllcnMgZHJhd24gaW5zaWRlIEZCT3MgYXJlIG9wdGltaXplZCB3aXRoIHJlZ2lvbnMKICNkZWZpbmUgUkVOREVSX0xBWUVSU19BU19SRUdJT05TIDEKIAorLy8gSWYgdHVybmVkIG9uLCB0ZXh0IGlzIGludGVycHJldGVkIGFzIGdseXBocyBpbnN0ZWFkIG9mIFVURi0xNgorI2RlZmluZSBSRU5ERVJfVEVYVF9BU19HTFlQSFMgMQorCiAvKioKICAqIERlYnVnIGxldmVsIGZvciBhcHAgZGV2ZWxvcGVycy4KICAqLwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaCBiL2xpYnMvaHd1aS9UZXh0RHJvcFNoYWRvd0NhY2hlLmgKaW5kZXggZDQ2Njg2ZC4uMjhkYmExMyAxMDA2NDQKLS0tIGEvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaAorKysgYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oCkBAIC03Myw3ICs3Myw2IEBACiAgICAgICAgIHRleHQgPSBzdHIuc3RyaW5nKCk7CiAgICAgfQogCi0gICAgLy8gVE9ETzogU2hvdWxkIHRha2UgaW50byBhY2NvdW50IGZha2UgYm9sZCBhbmQgdGV4dCBza2V3CiAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2hhZG93VGV4dCYgcmhzKSBjb25zdCB7CiAgICAgICAgIExURV9JTlQobGVuKSB7CiAgICAgICAgICAgICBMVEVfSU5UKHJhZGl1cykgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9kcml2ZXIvcnNkQWxsb2NhdGlvbi5jcHAgYi9saWJzL3JzL2RyaXZlci9yc2RBbGxvY2F0aW9uLmNwcAppbmRleCBmNThmZTFhLi4yZTEzZTlkIDEwMDY0NAotLS0gYS9saWJzL3JzL2RyaXZlci9yc2RBbGxvY2F0aW9uLmNwcAorKysgYi9saWJzL3JzL2RyaXZlci9yc2RBbGxvY2F0aW9uLmNwcApAQCAtNDEsMTMgKzQxLDQyIEBACiB9OwogCiAKK0dMZW51bSByc2RUeXBlVG9HTFR5cGUoUnNEYXRhVHlwZSB0KSB7CisgICAgc3dpdGNoICh0KSB7CisgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzVfNl81OiAgICByZXR1cm4gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CisgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzVfNV81XzE6ICByZXR1cm4gR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMTsKKyAgICBjYXNlIFJTX1RZUEVfVU5TSUdORURfNF80XzRfNDogIHJldHVybiBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OworCisgICAgLy9jYXNlIFJTX1RZUEVfRkxPQVRfMTY6ICAgICAgcmV0dXJuIEdMX0hBTEZfRkxPQVQ7CisgICAgY2FzZSBSU19UWVBFX0ZMT0FUXzMyOiAgICAgIHJldHVybiBHTF9GTE9BVDsKKyAgICBjYXNlIFJTX1RZUEVfVU5TSUdORURfODogICAgcmV0dXJuIEdMX1VOU0lHTkVEX0JZVEU7CisgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzE2OiAgIHJldHVybiBHTF9VTlNJR05FRF9TSE9SVDsKKyAgICBjYXNlIFJTX1RZUEVfU0lHTkVEXzg6ICAgICAgcmV0dXJuIEdMX0JZVEU7CisgICAgY2FzZSBSU19UWVBFX1NJR05FRF8xNjogICAgIHJldHVybiBHTF9TSE9SVDsKKyAgICBkZWZhdWx0OiAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0dMZW51bSByc2RLaW5kVG9HTEZvcm1hdChSc0RhdGFLaW5kIGspIHsKKyAgICBzd2l0Y2ggKGspIHsKKyAgICBjYXNlIFJTX0tJTkRfUElYRUxfTDogcmV0dXJuIEdMX0xVTUlOQU5DRTsKKyAgICBjYXNlIFJTX0tJTkRfUElYRUxfQTogcmV0dXJuIEdMX0FMUEhBOworICAgIGNhc2UgUlNfS0lORF9QSVhFTF9MQTogcmV0dXJuIEdMX0xVTUlOQU5DRV9BTFBIQTsKKyAgICBjYXNlIFJTX0tJTkRfUElYRUxfUkdCOiByZXR1cm4gR0xfUkdCOworICAgIGNhc2UgUlNfS0lORF9QSVhFTF9SR0JBOiByZXR1cm4gR0xfUkdCQTsKKyAgICBjYXNlIFJTX0tJTkRfUElYRUxfREVQVEg6IHJldHVybiBHTF9ERVBUSF9DT01QT05FTlQxNjsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIHZvaWQgVXBkYXRlMkRUZXh0dXJlKGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jLCBjb25zdCB2b2lkICpwdHIsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsb2QsIFJzQWxsb2NhdGlvbkN1YmVtYXBGYWNlIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7CiAgICAgRHJ2QWxsb2NhdGlvbiAqZHJ2ID0gKERydkFsbG9jYXRpb24gKilhbGxvYy0+bUhhbC5kcnY7CiAKLSAgICBjb25zdCBHTGVudW0gdHlwZSA9IGFsbG9jLT5tSGFsLnN0YXRlLnR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0Q29tcG9uZW50KCkuZ2V0R0xUeXBlKCk7Ci0gICAgY29uc3QgR0xlbnVtIGZvcm1hdCA9IGFsbG9jLT5tSGFsLnN0YXRlLnR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0Q29tcG9uZW50KCkuZ2V0R0xGb3JtYXQoKTsKICAgICByc0Fzc2VydChkcnYtPnRleHR1cmVJRCk7CiAgICAgZ2xCaW5kVGV4dHVyZShkcnYtPmdsVGFyZ2V0LCBkcnYtPnRleHR1cmVJRCk7CiAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKQEAgLTU1LDE2ICs4NCwxMyBAQAogICAgIGlmIChhbGxvYy0+bUhhbC5zdGF0ZS5oYXNGYWNlcykgewogICAgICAgICB0ID0gZ0ZhY2VPcmRlcltmYWNlXTsKICAgICB9Ci0gICAgZ2xUZXhTdWJJbWFnZTJEKHQsIGxvZCwgeG9mZiwgeW9mZiwgdywgaCwgZm9ybWF0LCB0eXBlLCBwdHIpOworICAgIGdsVGV4U3ViSW1hZ2UyRCh0LCBsb2QsIHhvZmYsIHlvZmYsIHcsIGgsIGRydi0+Z2xGb3JtYXQsIGRydi0+Z2xUeXBlLCBwdHIpOwogfQogCiAKIHN0YXRpYyB2b2lkIFVwbG9hZDJEVGV4dHVyZShjb25zdCBDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jLCBib29sIGlzRmlyc3RVcGxvYWQpIHsKICAgICBEcnZBbGxvY2F0aW9uICpkcnYgPSAoRHJ2QWxsb2NhdGlvbiAqKWFsbG9jLT5tSGFsLmRydjsKIAotICAgIEdMZW51bSB0eXBlID0gYWxsb2MtPm1IYWwuc3RhdGUudHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRDb21wb25lbnQoKS5nZXRHTFR5cGUoKTsKLSAgICBHTGVudW0gZm9ybWF0ID0gYWxsb2MtPm1IYWwuc3RhdGUudHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRDb21wb25lbnQoKS5nZXRHTEZvcm1hdCgpOwotCiAgICAgZ2xCaW5kVGV4dHVyZShkcnYtPmdsVGFyZ2V0LCBkcnYtPnRleHR1cmVJRCk7CiAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKIApAQCAtODUsMTUgKzExMSwxNSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNGaXJzdFVwbG9hZCkgewotICAgICAgICAgICAgICAgIGdsVGV4SW1hZ2UyRCh0LCBsb2QsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICBnbFRleEltYWdlMkQodCwgbG9kLCBkcnYtPmdsRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvYy0+bUhhbC5zdGF0ZS50eXBlLT5nZXRMT0REaW1YKGxvZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jLT5tSGFsLnN0YXRlLnR5cGUtPmdldExPRERpbVkobG9kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZm9ybWF0LCB0eXBlLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZHJ2LT5nbEZvcm1hdCwgZHJ2LT5nbFR5cGUsIHApOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBnbFRleFN1YkltYWdlMkQodCwgbG9kLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvYy0+bUhhbC5zdGF0ZS50eXBlLT5nZXRMT0REaW1YKGxvZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jLT5tSGFsLnN0YXRlLnR5cGUtPmdldExPRERpbVkobG9kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2LT5nbEZvcm1hdCwgZHJ2LT5nbFR5cGUsIHApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTA3LDEwICsxMzMsNyBAQAogc3RhdGljIHZvaWQgVXBsb2FkVG9UZXh0dXJlKGNvbnN0IENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWxsb2MpIHsKICAgICBEcnZBbGxvY2F0aW9uICpkcnYgPSAoRHJ2QWxsb2NhdGlvbiAqKWFsbG9jLT5tSGFsLmRydjsKIAotICAgIEdMZW51bSB0eXBlID0gYWxsb2MtPm1IYWwuc3RhdGUudHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRDb21wb25lbnQoKS5nZXRHTFR5cGUoKTsKLSAgICBHTGVudW0gZm9ybWF0ID0gYWxsb2MtPm1IYWwuc3RhdGUudHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRDb21wb25lbnQoKS5nZXRHTEZvcm1hdCgpOwotCi0gICAgaWYgKCF0eXBlIHx8ICFmb3JtYXQpIHsKKyAgICBpZiAoIWRydi0+Z2xUeXBlIHx8ICFkcnYtPmdsRm9ybWF0KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEzOSw4ICsxNjIsNyBAQAogc3RhdGljIHZvaWQgQWxsb2NhdGVSZW5kZXJUYXJnZXQoY29uc3QgQ29udGV4dCAqcnNjLCBjb25zdCBBbGxvY2F0aW9uICphbGxvYykgewogICAgIERydkFsbG9jYXRpb24gKmRydiA9IChEcnZBbGxvY2F0aW9uICopYWxsb2MtPm1IYWwuZHJ2OwogCi0gICAgR0xlbnVtIGZvcm1hdCA9IGFsbG9jLT5tSGFsLnN0YXRlLnR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0Q29tcG9uZW50KCkuZ2V0R0xGb3JtYXQoKTsKLSAgICBpZiAoIWZvcm1hdCkgeworICAgIGlmICghZHJ2LT5nbEZvcm1hdCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xNTQsNyArMTc2LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBnbEJpbmRSZW5kZXJidWZmZXIoR0xfUkVOREVSQlVGRkVSLCBkcnYtPnJlbmRlclRhcmdldElEKTsKLSAgICAgICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlKEdMX1JFTkRFUkJVRkZFUiwgZm9ybWF0LAorICAgICAgICBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xfUkVOREVSQlVGRkVSLCBkcnYtPmdsRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2MtPm1IYWwuc3RhdGUuZGltZW5zaW9uWCwgYWxsb2MtPm1IYWwuc3RhdGUuZGltZW5zaW9uWSk7CiAgICAgfQogICAgIHJzZEdMQ2hlY2tFcnJvcihyc2MsICJBbGxvY2F0ZVJlbmRlclRhcmdldCIpOwpAQCAtMjA4LDYgKzIzMCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZHJ2LT5nbFR5cGUgPSByc2RUeXBlVG9HTFR5cGUoYWxsb2MtPm1IYWwuc3RhdGUudHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRDb21wb25lbnQoKS5nZXRUeXBlKCkpOworICAgIGRydi0+Z2xGb3JtYXQgPSByc2RLaW5kVG9HTEZvcm1hdChhbGxvYy0+bUhhbC5zdGF0ZS50eXBlLT5nZXRFbGVtZW50KCktPmdldENvbXBvbmVudCgpLmdldEtpbmQoKSk7CisKKwogICAgIGFsbG9jLT5tSGFsLmRydlN0YXRlLm1hbGxvY1B0ciA9IHB0cjsKICAgICBkcnYtPm1hbGxvY1B0ciA9ICh1aW50OF90ICopcHRyOwogICAgIGFsbG9jLT5tSGFsLmRydiA9IGRydjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvZHJpdmVyL3JzZEFsbG9jYXRpb24uaCBiL2xpYnMvcnMvZHJpdmVyL3JzZEFsbG9jYXRpb24uaAppbmRleCA0NWE1MzhiLi5kNzM4NWNlIDEwMDY0NAotLS0gYS9saWJzL3JzL2RyaXZlci9yc2RBbGxvY2F0aW9uLmgKKysrIGIvbGlicy9ycy9kcml2ZXIvcnNkQWxsb2NhdGlvbi5oCkBAIC0zOSwxMCArMzksMTcgQEAKICAgICB1aW50OF90ICogbWFsbG9jUHRyOwogCiAgICAgR0xlbnVtIGdsVGFyZ2V0OworICAgIEdMZW51bSBnbFR5cGU7CisgICAgR0xlbnVtIGdsRm9ybWF0OworCiAKICAgICBib29sIHVwbG9hZERlZmVycmVkOwogfTsKIAorR0xlbnVtIHJzZFR5cGVUb0dMVHlwZShSc0RhdGFUeXBlIHQpOworR0xlbnVtIHJzZEtpbmRUb0dMRm9ybWF0KFJzRGF0YUtpbmQgayk7CisKKwogYm9vbCByc2RBbGxvY2F0aW9uSW5pdChjb25zdCBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ6OkNvbnRleHQgKnJzYywKICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpBbGxvY2F0aW9uICphbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZVplcm8pOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9kcml2ZXIvcnNkTWVzaE9iai5jcHAgYi9saWJzL3JzL2RyaXZlci9yc2RNZXNoT2JqLmNwcAppbmRleCAyNjA1OTVjLi5jMjIwYWMxIDEwMDY0NAotLS0gYS9saWJzL3JzL2RyaXZlci9yc2RNZXNoT2JqLmNwcAorKysgYi9saWJzL3JzL2RyaXZlci9yc2RNZXNoT2JqLmNwcApAQCAtMTE0LDcgKzExNCw3IEBACiAKICAgICAgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKICAgICAgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLm9mZnNldCA9IGVsZW0tPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoZmllbGRJKTsKLSAgICAgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLnR5cGUgPSBjLmdldEdMVHlwZSgpOworICAgICAgICAgICAgbUF0dHJpYnNbdXNlck51bV0udHlwZSA9IHJzZFR5cGVUb0dMVHlwZShjLmdldFR5cGUoKSk7CiAgICAgICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsvL2MuZ2V0SXNOb3JtYWxpemVkKCk7CiAgICAgICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5zdHJpZGUgPSBzdHJpZGU7CiAgICAgICAgICAgICBTdHJpbmc4IHRtcChSU19TSEFERVJfQVRUUik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29tcG9uZW50LmNwcCBiL2xpYnMvcnMvcnNDb21wb25lbnQuY3BwCmluZGV4IGUyYWUwNDMuLmU2NWZlYmIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb21wb25lbnQuY3BwCisrKyBiL2xpYnMvcnMvcnNDb21wb25lbnQuY3BwCkBAIC0xNiwxMSArMTYsNiBAQAogCiAjaW5jbHVkZSAicnNDb21wb25lbnQuaCIKIAotI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNlbmRpZgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKQEAgLTE4MSw0MCArMTc2LDYgQEAKICAgICByZXR1cm4gKG1UeXBlID49IFJTX1RZUEVfRUxFTUVOVCk7CiB9CiAKLXVpbnQzMl90IENvbXBvbmVudDo6Z2V0R0xUeXBlKCkgY29uc3QgewotI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQotICAgIHN3aXRjaCAobVR5cGUpIHsKLSAgICBjYXNlIFJTX1RZUEVfVU5TSUdORURfNV82XzU6ICAgIHJldHVybiBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKLSAgICBjYXNlIFJTX1RZUEVfVU5TSUdORURfNV81XzVfMTogIHJldHVybiBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOwotICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF80XzRfNF80OiAgcmV0dXJuIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ7Ci0KLSAgICAvL2Nhc2UgUlNfVFlQRV9GTE9BVF8xNjogICAgICByZXR1cm4gR0xfSEFMRl9GTE9BVDsKLSAgICBjYXNlIFJTX1RZUEVfRkxPQVRfMzI6ICAgICAgcmV0dXJuIEdMX0ZMT0FUOwotICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF84OiAgICByZXR1cm4gR0xfVU5TSUdORURfQllURTsKLSAgICBjYXNlIFJTX1RZUEVfVU5TSUdORURfMTY6ICAgcmV0dXJuIEdMX1VOU0lHTkVEX1NIT1JUOwotICAgIGNhc2UgUlNfVFlQRV9TSUdORURfODogICAgICByZXR1cm4gR0xfQllURTsKLSAgICBjYXNlIFJTX1RZUEVfU0lHTkVEXzE2OiAgICAgcmV0dXJuIEdMX1NIT1JUOwotICAgIGRlZmF1bHQ6ICAgIGJyZWFrOwotICAgIH0KLSNlbmRpZiAvL0FORFJPSURfUlNfU0VSSUFMSVpFCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IENvbXBvbmVudDo6Z2V0R0xGb3JtYXQoKSBjb25zdCB7Ci0jaWZuZGVmIEFORFJPSURfUlNfU0VSSUFMSVpFCi0gICAgc3dpdGNoIChtS2luZCkgewotICAgIGNhc2UgUlNfS0lORF9QSVhFTF9MOiByZXR1cm4gR0xfTFVNSU5BTkNFOwotICAgIGNhc2UgUlNfS0lORF9QSVhFTF9BOiByZXR1cm4gR0xfQUxQSEE7Ci0gICAgY2FzZSBSU19LSU5EX1BJWEVMX0xBOiByZXR1cm4gR0xfTFVNSU5BTkNFX0FMUEhBOwotICAgIGNhc2UgUlNfS0lORF9QSVhFTF9SR0I6IHJldHVybiBHTF9SR0I7Ci0gICAgY2FzZSBSU19LSU5EX1BJWEVMX1JHQkE6IHJldHVybiBHTF9SR0JBOwotICAgIGNhc2UgUlNfS0lORF9QSVhFTF9ERVBUSDogcmV0dXJuIEdMX0RFUFRIX0NPTVBPTkVOVDE2OwotICAgIGRlZmF1bHQ6IGJyZWFrOwotICAgIH0KLSNlbmRpZiAvL0FORFJPSURfUlNfU0VSSUFMSVpFCi0gICAgcmV0dXJuIDA7Ci19Ci0KIFN0cmluZzggQ29tcG9uZW50OjpnZXRHTFNMVHlwZSgpIGNvbnN0IHsKICAgICBpZiAobVR5cGUgPT0gUlNfVFlQRV9TSUdORURfMzIpIHsKICAgICAgICAgc3dpdGNoIChtVmVjdG9yU2l6ZSkgewpAQCAtMjQ0LDYgKzIwNSw3IEBACiAgICAgcmV0dXJuIFN0cmluZzgoKTsKIH0KIAorCiBzdGF0aWMgY29uc3QgY2hhciAqIGdUeXBlQmFzaWNTdHJpbmdzW10gPSB7CiAgICAgIk5PTkUiLAogICAgICJGMTYiLApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbXBvbmVudC5oIGIvbGlicy9ycy9yc0NvbXBvbmVudC5oCmluZGV4IDFiYjRmZjQuLmE0NDhmMGUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb21wb25lbnQuaAorKysgYi9saWJzL3JzL3JzQ29tcG9uZW50LmgKQEAgLTMyLDggKzMyLDYgQEAKIAogICAgIHZvaWQgc2V0KFJzRGF0YVR5cGUgZHQsIFJzRGF0YUtpbmQgZGssIGJvb2wgbm9ybSwgdWludDMyX3QgdmVjU2l6ZT0xKTsKIAotICAgIHVpbnQzMl90IGdldEdMVHlwZSgpIGNvbnN0OwotICAgIHVpbnQzMl90IGdldEdMRm9ybWF0KCkgY29uc3Q7CiAgICAgU3RyaW5nOCBnZXRHTFNMVHlwZSgpIGNvbnN0OwogICAgIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvbGlicy91aS9JbnB1dC5jcHAgYi9saWJzL3VpL0lucHV0LmNwcAppbmRleCAxYmEzOGE3Li5lOTVkYmU0IDEwMDY0NAotLS0gYS9saWJzL3VpL0lucHV0LmNwcAorKysgYi9saWJzL3VpL0lucHV0LmNwcApAQCAtMTMsNiArMTMsMTAgQEAKIC8vIExvZyBkZWJ1ZyBtZXNzYWdlcyBhYm91dCB2ZWxvY2l0eSB0cmFja2luZy4KICNkZWZpbmUgREVCVUdfVkVMT0NJVFkgMAogCisvLyBMb2cgZGVidWcgbWVzc2FnZXMgYWJvdXQgYWNjZWxlcmF0aW9uLgorI2RlZmluZSBERUJVR19BQ0NFTEVSQVRJT04gMAorCisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgpAQCAtMjAsNiArMjQsNyBAQAogI2luY2x1ZGUgPHVpL0lucHV0Lmg+CiAKICNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CiAKICNpZmRlZiBIQVZFX0FORFJPSURfT1MKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC02OTMsNiArNjk4LDExIEBACiAKIC8vIC0tLSBWZWxvY2l0eVRyYWNrZXIgLS0tCiAKK2NvbnN0IHVpbnQzMl90IFZlbG9jaXR5VHJhY2tlcjo6SElTVE9SWV9TSVpFOworY29uc3QgbnNlY3NfdCBWZWxvY2l0eVRyYWNrZXI6Ok1BWF9BR0U7Citjb25zdCBuc2Vjc190IFZlbG9jaXR5VHJhY2tlcjo6TUlOX1dJTkRPVzsKK2NvbnN0IG5zZWNzX3QgVmVsb2NpdHlUcmFja2VyOjpNSU5fRFVSQVRJT047CisKIFZlbG9jaXR5VHJhY2tlcjo6VmVsb2NpdHlUcmFja2VyKCkgewogICAgIGNsZWFyKCk7CiB9CkBAIC05MDIsNiArOTEyLDg1IEBACiB9CiAKIAorLy8gLS0tIFZlbG9jaXR5Q29udHJvbCAtLS0KKworY29uc3QgbnNlY3NfdCBWZWxvY2l0eUNvbnRyb2w6OlNUT1BfVElNRTsKKworVmVsb2NpdHlDb250cm9sOjpWZWxvY2l0eUNvbnRyb2woKSB7CisgICAgcmVzZXQoKTsKK30KKwordm9pZCBWZWxvY2l0eUNvbnRyb2w6OnNldFBhcmFtZXRlcnMoY29uc3QgVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycykgeworICAgIG1QYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICByZXNldCgpOworfQorCit2b2lkIFZlbG9jaXR5Q29udHJvbDo6cmVzZXQoKSB7CisgICAgbUxhc3RNb3ZlbWVudFRpbWUgPSBMTE9OR19NSU47CisgICAgbVJhd1Bvc2l0aW9uLnggPSAwOworICAgIG1SYXdQb3NpdGlvbi55ID0gMDsKKyAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Cit9CisKK3ZvaWQgVmVsb2NpdHlDb250cm9sOjptb3ZlKG5zZWNzX3QgZXZlbnRUaW1lLCBmbG9hdCogZGVsdGFYLCBmbG9hdCogZGVsdGFZKSB7CisgICAgaWYgKChkZWx0YVggJiYgKmRlbHRhWCkgfHwgKGRlbHRhWSAmJiAqZGVsdGFZKSkgeworICAgICAgICBpZiAoZXZlbnRUaW1lID49IG1MYXN0TW92ZW1lbnRUaW1lICsgU1RPUF9USU1FKSB7CisjaWYgREVCVUdfQUNDRUxFUkFUSU9OCisgICAgICAgICAgICBMT0dEKCJWZWxvY2l0eUNvbnRyb2w6IHN0b3BwZWQsIGxhc3QgbW92ZW1lbnQgd2FzICUwLjNmbXMgYWdvIiwKKyAgICAgICAgICAgICAgICAgICAgKGV2ZW50VGltZSAtIG1MYXN0TW92ZW1lbnRUaW1lKSAqIDAuMDAwMDAxZik7CisjZW5kaWYKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBtTGFzdE1vdmVtZW50VGltZSA9IGV2ZW50VGltZTsKKyAgICAgICAgaWYgKGRlbHRhWCkgeworICAgICAgICAgICAgbVJhd1Bvc2l0aW9uLnggKz0gKmRlbHRhWDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVsdGFZKSB7CisgICAgICAgICAgICBtUmF3UG9zaXRpb24ueSArPSAqZGVsdGFZOworICAgICAgICB9CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnRUaW1lLCBCaXRTZXQzMihCaXRTZXQzMjo6dmFsdWVGb3JCaXQoMCkpLCAmbVJhd1Bvc2l0aW9uKTsKKworICAgICAgICBmbG9hdCB2eCwgdnk7CisgICAgICAgIGZsb2F0IHNjYWxlID0gbVBhcmFtZXRlcnMuc2NhbGU7CisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyLmdldFZlbG9jaXR5KDAsICZ2eCwgJnZ5KSkgeworICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSBoeXBvdGYodngsIHZ5KSAqIHNjYWxlOworICAgICAgICAgICAgaWYgKHNwZWVkID49IG1QYXJhbWV0ZXJzLmhpZ2hUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAvLyBBcHBseSBmdWxsIGFjY2VsZXJhdGlvbiBhYm92ZSB0aGUgaGlnaCBzcGVlZCB0aHJlc2hvbGQuCisgICAgICAgICAgICAgICAgc2NhbGUgKj0gbVBhcmFtZXRlcnMuYWNjZWxlcmF0aW9uOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcGVlZCA+IG1QYXJhbWV0ZXJzLmxvd1RocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIC8vIExpbmVhcmx5IGludGVycG9sYXRlIHRoZSBhY2NlbGVyYXRpb24gdG8gYXBwbHkgYmV0d2VlbiB0aGUgbG93IGFuZCBoaWdoCisgICAgICAgICAgICAgICAgLy8gc3BlZWQgdGhyZXNob2xkcy4KKyAgICAgICAgICAgICAgICBzY2FsZSAqPSAxICsgKHNwZWVkIC0gbVBhcmFtZXRlcnMubG93VGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICAgICAgLyAobVBhcmFtZXRlcnMuaGlnaFRocmVzaG9sZCAtIG1QYXJhbWV0ZXJzLmxvd1RocmVzaG9sZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICogKG1QYXJhbWV0ZXJzLmFjY2VsZXJhdGlvbiAtIDEpOworICAgICAgICAgICAgfQorCisjaWYgREVCVUdfQUNDRUxFUkFUSU9OCisgICAgICAgICAgICBMT0dEKCJWZWxvY2l0eUNvbnRyb2woJTAuM2YsICUwLjNmLCAlMC4zZiwgJTAuM2YpOiAiCisgICAgICAgICAgICAgICAgICAgICJ2eD0lMC4zZiwgdnk9JTAuM2YsIHNwZWVkPSUwLjNmLCBhY2NlbD0lMC4zZiIsCisgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLnNjYWxlLCBtUGFyYW1ldGVycy5sb3dUaHJlc2hvbGQsIG1QYXJhbWV0ZXJzLmhpZ2hUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmFjY2VsZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgdngsIHZ5LCBzcGVlZCwgc2NhbGUgLyBtUGFyYW1ldGVycy5zY2FsZSk7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyNpZiBERUJVR19BQ0NFTEVSQVRJT04KKyAgICAgICAgICAgIExPR0QoIlZlbG9jaXR5Q29udHJvbCglMC4zZiwgJTAuM2YsICUwLjNmLCAlMC4zZik6IHVua25vd24gdmVsb2NpdHkiLAorICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5zY2FsZSwgbVBhcmFtZXRlcnMubG93VGhyZXNob2xkLCBtUGFyYW1ldGVycy5oaWdoVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5hY2NlbGVyYXRpb24pOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVsdGFYKSB7CisgICAgICAgICAgICAqZGVsdGFYICo9IHNjYWxlOworICAgICAgICB9CisgICAgICAgIGlmIChkZWx0YVkpIHsKKyAgICAgICAgICAgICpkZWx0YVkgKj0gc2NhbGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwogLy8gLS0tIElucHV0RGV2aWNlSW5mbyAtLS0KIAogSW5wdXREZXZpY2VJbmZvOjpJbnB1dERldmljZUluZm8oKSB7CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0JhY2t1cEhlbHBlcnMuY3BwIGIvbGlicy91dGlscy9CYWNrdXBIZWxwZXJzLmNwcAppbmRleCBlMTU4NzVmLi5mOTMzMTk5ZiAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9CYWNrdXBIZWxwZXJzLmNwcAorKysgYi9saWJzL3V0aWxzL0JhY2t1cEhlbHBlcnMuY3BwCkBAIC01MDMsNiArNTAzLDE2IEBACiAgICAgICAgIG5lZWRFeHRlbmRlZCA9IHRydWU7CiAgICAgfQogCisgICAgLy8gTm9uLTdiaXQtY2xlYW4gcGF0aCBhbHNvIG1lYW5zIG5lZWRpbmcgcGF4IGV4dGVuZGVkIGZvcm1hdAorICAgIGlmICghbmVlZEV4dGVuZGVkKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmlsZXBhdGgubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKChmaWxlcGF0aFtpXSAmIDB4ODApICE9IDApIHsKKyAgICAgICAgICAgICAgICBuZWVkRXh0ZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgaW50IGVyciA9IDA7CiAgICAgc3RydWN0IHN0YXQ2NCBzOwogICAgIGlmIChsc3RhdDY0KGZpbGVwYXRoLnN0cmluZygpLCAmcykgIT0gMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCmluZGV4IGE1NGNmMjguLjc2MzRjNmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKQEAgLTc2LDggKzc2LDkgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfUE5HICAgICA9IDMzOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9CTVAgICAgID0gMzQ7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1dCTVAgICAgPSAzNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfV0VCUCAgICA9IDM2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9JTUFHRV9GSUxFX1RZUEUgPSBGSUxFX1RZUEVfSlBFRzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9JTUFHRV9GSUxFX1RZUEUgPSBGSUxFX1RZUEVfV0JNUDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9JTUFHRV9GSUxFX1RZUEUgPSBGSUxFX1RZUEVfV0VCUDsKICAgIAogICAgIC8vIFBsYXlsaXN0IGZpbGUgdHlwZXMKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfTTNVICAgICAgPSA0MTsKQEAgLTIxMyw2ICsyMTQsNyBAQAogICAgICAgICBhZGRGaWxlVHlwZSgiUE5HIiwgRklMRV9UWVBFX1BORywgImltYWdlL3BuZyIsIE10cENvbnN0YW50cy5GT1JNQVRfUE5HKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIkJNUCIsIEZJTEVfVFlQRV9CTVAsICJpbWFnZS94LW1zLWJtcCIsIE10cENvbnN0YW50cy5GT1JNQVRfQk1QKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIldCTVAiLCBGSUxFX1RZUEVfV0JNUCwgImltYWdlL3ZuZC53YXAud2JtcCIpOworICAgICAgICBhZGRGaWxlVHlwZSgiV0VCUCIsIEZJTEVfVFlQRV9XQk1QLCAiaW1hZ2Uvd2VicCIpOwogIAogICAgICAgICBhZGRGaWxlVHlwZSgiTTNVIiwgRklMRV9UWVBFX00zVSwgImF1ZGlvL3gtbXBlZ3VybCIsIE10cENvbnN0YW50cy5GT1JNQVRfTTNVX1BMQVlMSVNUKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIk0zVSIsIEZJTEVfVFlQRV9NM1UsICJhcHBsaWNhdGlvbi94LW1wZWd1cmwiLCBNdHBDb25zdGFudHMuRk9STUFUX00zVV9QTEFZTElTVCk7CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQppbmRleCAzODIwMmYyLi4xNDc4YTZkIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKQEAgLTcxNiw2ICs3MTYsMTIgQEAKICAgICAvKioKICAgICAgKiBTdG9wcyByZWNvcmRpbmcuIENhbGwgdGhpcyBhZnRlciBzdGFydCgpLiBPbmNlIHJlY29yZGluZyBpcyBzdG9wcGVkLAogICAgICAqIHlvdSB3aWxsIGhhdmUgdG8gY29uZmlndXJlIGl0IGFnYWluIGFzIGlmIGl0IGhhcyBqdXN0IGJlZW4gY29uc3RydWN0ZWQuCisgICAgICogTm90ZSB0aGF0IGEgUnVudGltZUV4Y2VwdGlvbiBpcyBpbnRlbnRpb25hbGx5IHRocm93biB0byB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiwgaWYgbm8gdmFsaWQgYXVkaW8vdmlkZW8gZGF0YSBoYXMgYmVlbiByZWNlaXZlZCB3aGVuIHN0b3AoKQorICAgICAqIGlzIGNhbGxlZC4gVGhpcyBoYXBwZW5zIGlmIHN0b3AoKSBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgICAgKiBzdGFydCgpLiBUaGUgZmFpbHVyZSBsZXRzIHRoZSBhcHBsaWNhdGlvbiB0YWtlIGFjdGlvbiBhY2NvcmRpbmdseSB0bworICAgICAqIGNsZWFuIHVwIHRoZSBvdXRwdXQgZmlsZSAoZGVsZXRlIHRoZSBvdXRwdXQgZmlsZSwgZm9yIGluc3RhbmNlKSwgc2luY2UKKyAgICAgKiB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IHByb3Blcmx5IGNvbnN0cnVjdGVkIHdoZW4gdGhpcyBoYXBwZW5zLgogICAgICAqCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXQgaXMgY2FsbGVkIGJlZm9yZSBzdGFydCgpCiAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy5jb25mIGIvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE3YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMuY29uZgpAQCAtMCwwICsxLDU3IEBACisjIExpc3Qgb2YgZWZmZWN0IGxpYnJhcmllcyB0byBsb2FkLiBFYWNoIGxpYnJhcnkgZWxlbWVudCBtdXN0IGNvbnRhaW4gYSAicGF0aCIgZWxlbWVudAorIyBnaXZpbmcgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgbGlicmFyeSAuc28gZmlsZS4KK2xpYnJhcmllcyB7CisgIGJ1bmRsZSB7CisgICAgcGF0aCAvc3lzdGVtL2xpYi9zb3VuZGZ4L2xpYmJ1bmRsZXdyYXBwZXIuc28KKyAgfQorICByZXZlcmIgeworICAgIHBhdGggL3N5c3RlbS9saWIvc291bmRmeC9saWJyZXZlcmJ3cmFwcGVyLnNvCisgIH0KKyAgdmlzdWFsaXplciB7CisgICAgcGF0aCAvc3lzdGVtL2xpYi9zb3VuZGZ4L2xpYnZpc3VhbGl6ZXIuc28KKyAgfQorfQorCisjIGxpc3Qgb2YgZWZmZWN0cyB0byBsb2FkLiBFYWNoIGVmZmVjdCBlbGVtZW50IG11c3QgY29udGFpbiBhICJsaWJyYXJ5IiBhbmQgYSAidXVpZCIgZWxlbWVudC4KKyMgVGhlIHZhbHVlIG9mIHRoZSAibGlicmFyeSIgZWxlbWVudCBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIG5hbWUgb2Ygb25lIGxpYnJhcnkgZWxlbWVudCBpbiB0aGUKKyMgImxpYnJhcmllcyIgZWxlbWVudC4KKyMgVGhlIG5hbWUgb2YgdGhlIGVmZmVjdCBlbGVtZW50IGlzIGluZGljYXRpdmUsIG9ubHkgdGhlIHZhbHVlIG9mIHRoZSAidXVpZCIgZWxlbWVudAorIyBkZXNpZ25hdGVzIHRoZSBlZmZlY3QuCitlZmZlY3RzIHsKKyAgYmFzc2Jvb3N0IHsKKyAgICBsaWJyYXJ5IGJ1bmRsZQorICAgIHV1aWQgODYzMWYzMDAtNzJlMi0xMWRmLWI1N2UtMDAwMmE1ZDVjNTFiCisgIH0KKyAgdmlydHVhbGl6ZXIgeworICAgIGxpYnJhcnkgYnVuZGxlCisgICAgdXVpZCAxZDQwMzNjMC04NTU3LTExZGYtOWYyZC0wMDAyYTVkNWM1MWIKKyAgfQorICBlcXVhbGl6ZXIgeworICAgIGxpYnJhcnkgYnVuZGxlCisgICAgdXVpZCBjZTc3MmYyMC04NDdkLTExZGYtYmIxNy0wMDAyYTVkNWM1MWIKKyAgfQorICB2b2x1bWUgeworICAgIGxpYnJhcnkgYnVuZGxlCisgICAgdXVpZCAxMTkzNDFhMC04NDY5LTExZGYtODFmOS0gMDAwMmE1ZDVjNTFiCisgIH0KKyAgcmV2ZXJiX2Vudl9hdXggeworICAgIGxpYnJhcnkgcmV2ZXJiCisgICAgdXVpZCA0YTM4N2ZjMC04YWIzLTExZGYtOGJhZC0gMDAwMmE1ZDVjNTFiCisgIH0KKyAgcmV2ZXJiX2Vudl9pbnMgeworICAgIGxpYnJhcnkgcmV2ZXJiCisgICAgdXVpZCBjN2E1MTFhMC1hM2JiLTExZGYtODYwZS0wMDAyYTVkNWM1MWIKKyAgfQorICByZXZlcmJfcHJlX2F1eCB7CisgICAgbGlicmFyeSByZXZlcmIKKyAgICB1dWlkIGYyOWExNDAwLWEzYmItMTFkZi04ZGRjLTAwMDJhNWQ1YzUxYgorICB9CisgIHJldmVyYl9wcmVfaW5zIHsKKyAgICBsaWJyYXJ5IHJldmVyYgorICAgIHV1aWQgMTcyY2RmMDAtYTNiYy0xMWRmLWE3MmYtMDAwMmE1ZDVjNTFiCisgIH0KKyAgdmlzdWFsaXplciB7CisgICAgbGlicmFyeSB2aXN1YWxpemVyCisgICAgdXVpZCBkMDY5ZDllMC04MzI5LTExZGYtOTE2OC0wMDAyYTVkNWM1MWIKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwppbmRleCBjMTlhNTA1Li5iMGU4NTg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwpAQCAtMjIsNiArMjIsOCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KIAogc3RhdGljIGxpc3RfZWxlbV90ICpnRWZmZWN0TGlzdDsgLy8gbGlzdCBvZiBlZmZlY3RfZW50cnlfdDogYWxsIGN1cnJlbnRseSBjcmVhdGVkIGVmZmVjdHMKIHN0YXRpYyBsaXN0X2VsZW1fdCAqZ0xpYnJhcnlMaXN0OyAvLyBsaXN0IG9mIGxpYl9lbnRyeV90OiBhbGwgY3VycmVudGx5IGxvYWRlZCBsaWJyYXJpZXMKQEAgLTMwLDMwICszMiwzOSBAQAogc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyTGliOyAgICAvLyBjdXJyZW50IGxpYnJhcnkgaW4gZW51bWVyYXRpb24gcHJvY2Vzcwogc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyRWZmZWN0OyAvLyBjdXJyZW50IGVmZmVjdCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCiBzdGF0aWMgdWludDMyX3QgZ0N1ckVmZmVjdElkeDsgICAgICAgLy8gY3VycmVudCBlZmZlY3QgaW5kZXggaW4gZW51bWVyYXRpb24gcHJvY2Vzcworc3RhdGljIGxpYl9lbnRyeV90ICpnQ2FjaGVkTGlicmFyeTsgIC8vIGxhc3QgbGlicmFyeSBhY2Nlc3NlZCBieSBnZXRMaWJyYXJ5KCkKIAotY29uc3QgY2hhciAqIGNvbnN0IGdFZmZlY3RMaWJQYXRoID0gIi9zeXN0ZW0vbGliL3NvdW5kZngiOyAvLyBwYXRoIHRvIGJ1aWx0LWluIGVmZmVjdCBsaWJyYXJpZXMKIHN0YXRpYyBpbnQgZ0luaXREb25lOyAvLyB0cnVlIGlzIGdsb2JhbCBpbml0aWFsaXphdGlvbiBoYXMgYmVlbiBwcmVmb3JtZWQKLXN0YXRpYyBpbnQgZ05leHRMaWJJZDsgLy8gdXNlZCBieSBsb2FkTGlicmFyeSgpIHRvIGFsbG9jYXRlIHVuaXF1ZSBsaWJyYXJ5IGhhbmRsZXMKIHN0YXRpYyBpbnQgZ0NhblF1ZXJ5RWZmZWN0OyAvLyBpbmRpY2F0ZXMgdGhhdCBjYWxsIHRvIEVmZmVjdFF1ZXJ5RWZmZWN0KCkgaXMgdmFsaWQsIGkuZS4gdGhhdCB0aGUgbGlzdCBvZiBlZmZlY3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBub3QgbW9kaWZpZWQgc2luY2UgbGFzdCBjYWxsIHRvIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpCiAKKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBMb2NhbCBmdW5jdGlvbnMgcHJvdG90eXBlcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdGF0aWMgaW50IGluaXQoKTsKLXN0YXRpYyBpbnQgbG9hZExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpOwotc3RhdGljIGludCB1bmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpOworc3RhdGljIGludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyBpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCk7CitzdGF0aWMgaW50IGxvYWRMaWJyYXJ5KGNub2RlICpyb290LCBjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpOworc3RhdGljIGludCBsb2FkRWZmZWN0KGNub2RlICpub2RlKTsKK3N0YXRpYyBsaWJfZW50cnlfdCAqZ2V0TGlicmFyeShjb25zdCBjaGFyICpwYXRoKTsKIHN0YXRpYyB2b2lkIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKTsKIHN0YXRpYyB1aW50MzJfdCB1cGRhdGVOdW1FZmZlY3RzKCk7Ci1zdGF0aWMgaW50IGZpbmRFZmZlY3QoZWZmZWN0X3V1aWRfdCAqdXVpZCwgbGliX2VudHJ5X3QgKipsaWIsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKK3N0YXRpYyBpbnQgZmluZEVmZmVjdChlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAorICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOwogc3RhdGljIHZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKK3N0YXRpYyBpbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCk7CitzdGF0aWMgaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyAgICAgIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBmdW5jdGlvbnMKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotaW50IEVmZmVjdF9Qcm9jZXNzKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCitpbnQgRWZmZWN0X1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKIHsKICAgICBpbnQgcmV0ID0gaW5pdCgpOwogICAgIGlmIChyZXQgPCAwKSB7CkBAIC03Myw3ICs4NCw3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotaW50IEVmZmVjdF9Db21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLAoraW50IEVmZmVjdF9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKQEAgLTk4LDkgKzEwOSwzMSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK2ludCBFZmZlY3RfR2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoreworICAgIGludCByZXQgPSBpbml0KCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZWZmZWN0X2VudHJ5X3QgKmZ4ID0gKGVmZmVjdF9lbnRyeV90ICopc2VsZjsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKKyAgICBpZiAoZngtPmxpYiA9PSBOVUxMKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgICAgIHJldHVybiAtRVBJUEU7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZngtPmxpYi0+bG9jayk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKworICAgIHJldCA9ICgqZngtPnN1Ykl0ZmUpLT5nZXRfZGVzY3JpcHRvcihmeC0+c3ViSXRmZSwgZGVzYyk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZ4LT5saWItPmxvY2spOworICAgIHJldHVybiByZXQ7Cit9CisKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0ludGVyZmFjZSA9IHsKICAgICAgICAgRWZmZWN0X1Byb2Nlc3MsCi0gICAgICAgIEVmZmVjdF9Db21tYW5kCisgICAgICAgIEVmZmVjdF9Db21tYW5kLAorICAgICAgICBFZmZlY3RfR2V0RGVzY3JpcHRvcgogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTgyLDcgKzIxNSw3IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKLSAgICByZXQgPSBmaW5kRWZmZWN0KHV1aWQsICZsLCAmZCk7CisgICAgcmV0ID0gZmluZEVmZmVjdChOVUxMLCB1dWlkLCAmbCwgJmQpOwogICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsIGQsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CiAgICAgfQpAQCAtMTkwLDE3ICsyMjMsMTcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSkKK2ludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAqdXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKQogewogICAgIGxpc3RfZWxlbV90ICplID0gZ0xpYnJhcnlMaXN0OwogICAgIGxpYl9lbnRyeV90ICpsID0gTlVMTDsKICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkID0gTlVMTDsKLSAgICBlZmZlY3RfaW50ZXJmYWNlX3QgaXRmZTsKKyAgICBlZmZlY3RfaGFuZGxlX3QgaXRmZTsKICAgICBlZmZlY3RfZW50cnlfdCAqZng7CiAgICAgaW50IGZvdW5kID0gMDsKICAgICBpbnQgcmV0OwogCi0gICAgaWYgKHV1aWQgPT0gTlVMTCB8fCBwSW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICBpZiAodXVpZCA9PSBOVUxMIHx8IHBIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTIxOCwxNSArMjUxLDE1IEBACiAKICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKIAotICAgIHJldCA9IGZpbmRFZmZlY3QodXVpZCwgJmwsICZkKTsKKyAgICByZXQgPSBmaW5kRWZmZWN0KE5VTEwsIHV1aWQsICZsLCAmZCk7CiAgICAgaWYgKHJldCA8IDApewogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCiAgICAgLy8gY3JlYXRlIGVmZmVjdCBpbiBsaWJyYXJ5Ci0gICAgcmV0ID0gbC0+Y3JlYXRlRngodXVpZCwgc2Vzc2lvbklkLCBpb0lkLCAmaXRmZSk7CisgICAgbC0+ZGVzYy0+Y3JlYXRlX2VmZmVjdCh1dWlkLCBzZXNzaW9uSWQsIGlvSWQsICZpdGZlKTsKICAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgTE9HVygiRWZmZWN0Q3JlYXRlKCkgbGlicmFyeSAlczogY291bGQgbm90IGNyZWF0ZSBmeCAlcywgZXJyb3IgJWQiLCBsLT5wYXRoLCBkLT5uYW1lLCByZXQpOworICAgICAgICBMT0dXKCJFZmZlY3RDcmVhdGUoKSBsaWJyYXJ5ICVzOiBjb3VsZCBub3QgY3JlYXRlIGZ4ICVzLCBlcnJvciAlZCIsIGwtPm5hbWUsIGQtPm5hbWUsIHJldCk7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKQEAgLTI0MSwxNiArMjc0LDE2IEBACiAgICAgZS0+bmV4dCA9IGdFZmZlY3RMaXN0OwogICAgIGdFZmZlY3RMaXN0ID0gZTsKIAotICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClmeDsKKyAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpZng7CiAKLSAgICBMT0dWKCJFZmZlY3RDcmVhdGUoKSBjcmVhdGVkIGVudHJ5ICVwIHdpdGggc3ViIGl0ZmUgJXAgaW4gbGlicmFyeSAlcyIsICpwSW50ZXJmYWNlLCBpdGZlLCBsLT5wYXRoKTsKKyAgICBMT0dWKCJFZmZlY3RDcmVhdGUoKSBjcmVhdGVkIGVudHJ5ICVwIHdpdGggc3ViIGl0ZmUgJXAgaW4gbGlicmFyeSAlcyIsICpwSGFuZGxlLCBpdGZlLCBsLT5uYW1lKTsKIAogZXhpdDoKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOwogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpCitpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIGVmZmVjdF9lbnRyeV90ICpmeDsKICAgICBsaXN0X2VsZW1fdCAqZTE7CkBAIC0yNjYsNyArMjk5LDcgQEAKICAgICBlMSA9IGdFZmZlY3RMaXN0OwogICAgIGUyID0gTlVMTDsKICAgICB3aGlsZSAoZTEpIHsKLSAgICAgICAgaWYgKGUxLT5vYmplY3QgPT0gaW50ZXJmYWNlKSB7CisgICAgICAgIGlmIChlMS0+b2JqZWN0ID09IGhhbmRsZSkgewogICAgICAgICAgICAgaWYgKGUyKSB7CiAgICAgICAgICAgICAgICAgZTItPm5leHQgPSBlMS0+bmV4dDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yODYsMTAgKzMxOSwxMCBAQAogCiAgICAgLy8gcmVsZWFzZSBlZmZlY3QgaW4gbGlicmFyeQogICAgIGlmIChmeC0+bGliID09IE5VTEwpIHsKLSAgICAgICAgTE9HVygiRWZmZWN0UmVsZWFzZSgpIGZ4ICVwIGxpYnJhcnkgYWxyZWFkeSB1bmxvYWRlZCIsIGludGVyZmFjZSk7CisgICAgICAgIExPR1coIkVmZmVjdFJlbGVhc2UoKSBmeCAlcCBsaWJyYXJ5IGFscmVhZHkgdW5sb2FkZWQiLCBoYW5kbGUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZngtPmxpYi0+bG9jayk7Ci0gICAgICAgIGZ4LT5saWItPnJlbGVhc2VGeChmeC0+c3ViSXRmZSk7CisgICAgICAgIGZ4LT5saWItPmRlc2MtPnJlbGVhc2VfZWZmZWN0KGZ4LT5zdWJJdGZlKTsKICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZ4LT5saWItPmxvY2spOwogICAgIH0KICAgICBmcmVlKGZ4KTsKQEAgLTI5OSwzMyArMzMyLDYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgRWZmZWN0TG9hZExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpCi17Ci0gICAgaW50IHJldCA9IGluaXQoKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAobGliUGF0aCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHJldCA9IGxvYWRMaWJyYXJ5KGxpYlBhdGgsIGhhbmRsZSk7Ci0gICAgdXBkYXRlTnVtRWZmZWN0cygpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBFZmZlY3RVbmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpCi17Ci0gICAgaW50IHJldCA9IGluaXQoKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHJldCA9IHVubG9hZExpYnJhcnkoaGFuZGxlKTsKLSAgICB1cGRhdGVOdW1FZmZlY3RzKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQogaW50IEVmZmVjdElzTnVsbFV1aWQoZWZmZWN0X3V1aWRfdCAqdXVpZCkKIHsKICAgICBpZiAobWVtY21wKHV1aWQsIEVGRkVDVF9VVUlEX05VTEwsIHNpemVvZihlZmZlY3RfdXVpZF90KSkpIHsKQEAgLTMzOSw5ICszNDUsNiBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBpbnQgaW5pdCgpIHsKLSAgICBzdHJ1Y3QgZGlyZW50ICplbnQ7Ci0gICAgRElSICpkaXIgPSBOVUxMOwotICAgIGNoYXIgbGlicGF0aFtQQVRIX01BWF07CiAgICAgaW50IGhkbDsKIAogICAgIGlmIChnSW5pdERvbmUpIHsKQEAgLTM1MCwyMTQgKzM1MywyMTAgQEAKIAogICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZ0xpYkxvY2ssIE5VTEwpOwogCi0gICAgLy8gbG9hZCBidWlsdC1pbiBsaWJyYXJpZXMKLSAgICBkaXIgPSBvcGVuZGlyKGdFZmZlY3RMaWJQYXRoKTsKLSAgICBpZiAoZGlyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKICAgICB9Ci0gICAgd2hpbGUgKChlbnQgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKLSAgICAgICAgTE9HVigiaW5pdCgpIHJlYWRpbmcgZmlsZSAlcyIsIGVudC0+ZF9uYW1lKTsKLSAgICAgICAgaWYgKChzdHJsZW4oZW50LT5kX25hbWUpIDwgMykgfHwKLSAgICAgICAgICAgIHN0cm5jbXAoZW50LT5kX25hbWUsICJsaWIiLCAzKSAhPSAwIHx8Ci0gICAgICAgICAgICBzdHJuY21wKGVudC0+ZF9uYW1lICsgc3RybGVuKGVudC0+ZF9uYW1lKSAtIDMsICIuc28iLCAzKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzdHJjcHkobGlicGF0aCwgZ0VmZmVjdExpYlBhdGgpOwotICAgICAgICBzdHJjYXQobGlicGF0aCwgIi8iKTsKLSAgICAgICAgc3RyY2F0KGxpYnBhdGgsIGVudC0+ZF9uYW1lKTsKLSAgICAgICAgaWYgKGxvYWRMaWJyYXJ5KGxpYnBhdGgsICZoZGwpIDwgMCkgewotICAgICAgICAgICAgTE9HVygiaW5pdCgpIGZhaWxlZCB0byBsb2FkIGxpYnJhcnkgJXMiLGxpYnBhdGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGNsb3NlZGlyKGRpcik7CisKICAgICB1cGRhdGVOdW1FZmZlY3RzKCk7CiAgICAgZ0luaXREb25lID0gMTsKICAgICBMT0dWKCJpbml0KCkgZG9uZSIpOwogICAgIHJldHVybiAwOwogfQogCi0KLWludCBsb2FkTGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkKK2ludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKQogeworICAgIGNub2RlICpyb290OworICAgIGNoYXIgKmRhdGE7CisKKyAgICBkYXRhID0gbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworICAgIGxvYWRMaWJyYXJpZXMocm9vdCk7CisgICAgbG9hZEVmZmVjdHMocm9vdCk7CisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsb2FkTGlicmFyaWVzKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUklFU19UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBsb2FkTGlicmFyeShub2RlLCBub2RlLT5uYW1lKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgY25vZGUgKm5vZGU7CiAgICAgdm9pZCAqaGRsOwotICAgIGVmZmVjdF9RdWVyeU51bWJlckVmZmVjdHNfdCBxdWVyeU51bUZ4OwotICAgIGVmZmVjdF9RdWVyeUVmZmVjdF90IHF1ZXJ5Rng7Ci0gICAgZWZmZWN0X0NyZWF0ZUVmZmVjdF90IGNyZWF0ZUZ4OwotICAgIGVmZmVjdF9SZWxlYXNlRWZmZWN0X3QgcmVsZWFzZUZ4OwotICAgIHVpbnQzMl90IG51bUZ4OwotICAgIHVpbnQzMl90IGZ4OwotICAgIGludCByZXQ7Ci0gICAgbGlzdF9lbGVtX3QgKmUsICpkZXNjSGVhZCA9IE5VTEw7CisgICAgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqZGVzYzsKKyAgICBsaXN0X2VsZW1fdCAqZTsKICAgICBsaWJfZW50cnlfdCAqbDsKIAotICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgeworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBQQVRIX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAqaGFuZGxlID0gMDsKLQotICAgIGhkbCA9IGRsb3BlbihsaWJQYXRoLCBSVExEX05PVyk7Ci0gICAgaWYgKGhkbCA9PSAwKSB7Ci0gICAgICAgIExPR1coImNvdWxkIG9wZW4gbGliICVzIiwgbGliUGF0aCk7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLQotICAgIC8vIENoZWNrIGZ1bmN0aW9ucyBhdmFpbGFiaWxpdHkKLSAgICBxdWVyeU51bUZ4ID0gKGVmZmVjdF9RdWVyeU51bWJlckVmZmVjdHNfdClkbHN5bShoZGwsICJFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMiKTsKLSAgICBpZiAocXVlcnlOdW1GeCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1coImNvdWxkIG5vdCBnZXQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIGZyb20gbGliICVzIiwgbGliUGF0aCk7Ci0gICAgICAgIHJldCA9IC1FTk9ERVY7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHF1ZXJ5RnggPSAoZWZmZWN0X1F1ZXJ5RWZmZWN0X3QpZGxzeW0oaGRsLCAiRWZmZWN0UXVlcnlFZmZlY3QiKTsKLSAgICBpZiAocXVlcnlGeCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1coImNvdWxkIG5vdCBnZXQgRWZmZWN0UXVlcnlFZmZlY3QgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKLSAgICAgICAgcmV0ID0gLUVOT0RFVjsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgY3JlYXRlRnggPSAoZWZmZWN0X0NyZWF0ZUVmZmVjdF90KWRsc3ltKGhkbCwgIkVmZmVjdENyZWF0ZSIpOwotICAgIGlmIChjcmVhdGVGeCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1coImNvdWxkIG5vdCBnZXQgRWZmZWN0Q3JlYXRlIGZyb20gbGliICVzIiwgbGliUGF0aCk7Ci0gICAgICAgIHJldCA9IC1FTk9ERVY7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHJlbGVhc2VGeCA9IChlZmZlY3RfUmVsZWFzZUVmZmVjdF90KWRsc3ltKGhkbCwgIkVmZmVjdFJlbGVhc2UiKTsKLSAgICBpZiAocmVsZWFzZUZ4ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RSZWxlYXNlIGZyb20gbGliICVzIiwgbGliUGF0aCk7Ci0gICAgICAgIHJldCA9IC1FTk9ERVY7CisgICAgaGRsID0gZGxvcGVuKG5vZGUtPnZhbHVlLCBSVExEX05PVyk7CisgICAgaWYgKGhkbCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImxvYWRMaWJyYXJ5KCkgZmFpbGVkIHRvIG9wZW4gJXMiLCBub2RlLT52YWx1ZSk7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgLy8gbG9hZCBlZmZlY3QgZGVzY3JpcHRvcnMKLSAgICByZXQgPSBxdWVyeU51bUZ4KCZudW1GeCk7Ci0gICAgaWYgKHJldCkgeworICAgIGRlc2MgPSAoYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqKWRsc3ltKGhkbCwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImxvYWRMaWJyYXJ5KCkgY291bGQgbm90IGZpbmQgc3ltYm9sICVzIiwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBmb3IgKGZ4ID0gMDsgZnggPCBudW1GeDsgZngrKykgewotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgIGlmIChkID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldCA9IC1FTk9NRU07Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IHF1ZXJ5RngoZngsIGQpOwotICAgICAgICBpZiAocmV0ID09IDApIHsKLSNpZiAoTE9HX05ERUJVRz09MCkKLSAgICAgICAgICAgIGNoYXIgc1syNTZdOwotICAgICAgICAgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgMjU2KTsKLSAgICAgICAgICAgIExPR1YoImxvYWRMaWJyYXJ5KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGQtPmFwaVZlcnNpb24gIT0gRUZGRUNUX0FQSV9WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgTE9HVygiQmFkIEFQSSB2ZXJzaW9uICUwNHggb24gbGliICVzIiwgZC0+YXBpVmVyc2lvbiwgbGliUGF0aCk7Ci0gICAgICAgICAgICAgICAgZnJlZShkKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShkKTsKLSAgICAgICAgICAgICAgICByZXQgPSAtRU5PTUVNOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlLT5vYmplY3QgPSBkOwotICAgICAgICAgICAgZS0+bmV4dCA9IGRlc2NIZWFkOwotICAgICAgICAgICAgZGVzY0hlYWQgPSBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICMgJWQgb24gbGliICVzIiwgZngsIGxpYlBhdGgpOwotICAgICAgICB9CisgICAgaWYgKEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRyAhPSBkZXNjLT50YWcpIHsKKyAgICAgICAgTE9HVygiZ2V0TGlicmFyeSgpIGJhZCB0YWcgJTA4eCBpbiBsaWIgaW5mbyBzdHJ1Y3QiLCBkZXNjLT50YWcpOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZGVzYy0+dmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgTE9HVygibG9hZExpYnJhcnkoKSBiYWQgbGliIHZlcnNpb24gJTA4eCIsIGRlc2MtPnZlcnNpb24pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAogICAgIC8vIGFkZCBlbnRyeSBmb3IgbGlicmFyeSBpbiBnTGlicmFyeUxpc3QKICAgICBsID0gbWFsbG9jKHNpemVvZihsaWJfZW50cnlfdCkpOwotICAgIGwtPmlkID0gKytnTmV4dExpYklkOworICAgIGwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKKyAgICBsLT5wYXRoID0gc3RybmR1cChub2RlLT52YWx1ZSwgUEFUSF9NQVgpOwogICAgIGwtPmhhbmRsZSA9IGhkbDsKLSAgICBzdHJuY3B5KGwtPnBhdGgsIGxpYlBhdGgsIFBBVEhfTUFYKTsKLSAgICBsLT5jcmVhdGVGeCA9IGNyZWF0ZUZ4OwotICAgIGwtPnJlbGVhc2VGeCA9IHJlbGVhc2VGeDsKLSAgICBsLT5lZmZlY3RzID0gZGVzY0hlYWQ7CisgICAgbC0+ZGVzYyA9IGRlc2M7CisgICAgbC0+ZWZmZWN0cyA9IE5VTEw7CiAgICAgcHRocmVhZF9tdXRleF9pbml0KCZsLT5sb2NrLCBOVUxMKTsKIAogICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZS0+bmV4dCA9IGdMaWJyYXJ5TGlzdDsKICAgICBlLT5vYmplY3QgPSBsOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGUtPm5leHQgPSBnTGlicmFyeUxpc3Q7CiAgICAgZ0xpYnJhcnlMaXN0ID0gZTsKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOwotICAgIExPR1YoImxvYWRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAiLCBsKTsKLQotICAgICpoYW5kbGUgPSBsLT5pZDsKKyAgICBMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBsLCBub2RlLT52YWx1ZSk7CiAKICAgICByZXR1cm4gMDsKIAogZXJyb3I6Ci0gICAgTE9HVygibG9hZExpYnJhcnkoKSBlcnJvcjogJWQgb24gbGliOiAlcyIsIHJldCwgbGliUGF0aCk7Ci0gICAgd2hpbGUgKGRlc2NIZWFkKSB7Ci0gICAgICAgIGZyZWUoZGVzY0hlYWQtPm9iamVjdCk7Ci0gICAgICAgIGUgPSBkZXNjSGVhZC0+bmV4dDsKLSAgICAgICAgZnJlZShkZXNjSGVhZCk7Ci0gICAgICAgIGRlc2NIZWFkID0gZTs7CisgICAgaWYgKGhkbCAhPSBOVUxMKSB7CisgICAgICAgIGRsY2xvc2UoaGRsKTsKICAgICB9Ci0gICAgZGxjbG9zZShoZGwpOwotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIC1FSU5WQUw7CiB9CiAKLWludCB1bmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpCitpbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpCiB7Ci0gICAgdm9pZCAqaGRsOwotICAgIGludCByZXQ7Ci0gICAgbGlzdF9lbGVtX3QgKmVsMSwgKmVsMjsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBlZmZlY3RfZW50cnlfdCAqZng7CisgICAgY25vZGUgKm5vZGU7CiAKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKLSAgICBlbDEgPSBnTGlicmFyeUxpc3Q7Ci0gICAgZWwyID0gTlVMTDsKLSAgICB3aGlsZSAoZWwxKSB7Ci0gICAgICAgIGwgPSAobGliX2VudHJ5X3QgKillbDEtPm9iamVjdDsKLSAgICAgICAgaWYgKGhhbmRsZSA9PSBsLT5pZCkgewotICAgICAgICAgICAgaWYgKGVsMikgewotICAgICAgICAgICAgICAgIGVsMi0+bmV4dCA9IGVsMS0+bmV4dDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ0xpYnJhcnlMaXN0ID0gZWwxLT5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShlbDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWwyID0gZWwxOwotICAgICAgICBlbDEgPSBlbDEtPm5leHQ7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7Ci0gICAgaWYgKGVsMSA9PSBOVUxMKSB7CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRU5PRU5UOwogICAgIH0KLQotICAgIC8vIGNsZWFyIGVmZmVjdCBkZXNjcmlwdG9yIGxpc3QKLSAgICBlbDEgPSBsLT5lZmZlY3RzOwotICAgIHdoaWxlIChlbDEpIHsKLSAgICAgICAgZnJlZShlbDEtPm9iamVjdCk7Ci0gICAgICAgIGVsMiA9IGVsMS0+bmV4dDsKLSAgICAgICAgZnJlZShlbDEpOwotICAgICAgICBlbDEgPSBlbDI7CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGxvYWRFZmZlY3Qobm9kZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwogICAgIH0KLQotICAgIC8vIGRpc2FibGUgYWxsIGVmZmVjdHMgZnJvbSB0aGlzIGxpYnJhcnkKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmwtPmxvY2spOwotCi0gICAgZWwxID0gZ0VmZmVjdExpc3Q7Ci0gICAgd2hpbGUgKGVsMSkgewotICAgICAgICBmeCA9IChlZmZlY3RfZW50cnlfdCAqKWVsMS0+b2JqZWN0OwotICAgICAgICBpZiAoZngtPmxpYiA9PSBsKSB7Ci0gICAgICAgICAgICBmeC0+bGliID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbDEgPSBlbDEtPm5leHQ7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsLT5sb2NrKTsKLQotICAgIGRsY2xvc2UobC0+aGFuZGxlKTsKLSAgICBmcmVlKGwpOwogICAgIHJldHVybiAwOwogfQogCitpbnQgbG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7CisgICAgaWYgKGwgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGdldCBsaWJyYXJ5ICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7CisgICAgICAgIExPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKKyAgICAgICAgY2hhciBzWzQwXTsKKyAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7CisgICAgICAgIExPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1syNTZdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIDI1Nik7CisgICAgTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CisjZW5kaWYKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIExPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBkOworICAgIGUtPm5leHQgPSBsLT5lZmZlY3RzOworICAgIGwtPmVmZmVjdHMgPSBlOworCisgICAgcmV0dXJuIDA7Cit9CisKK2xpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgbGlzdF9lbGVtX3QgKmU7CisKKyAgICBpZiAoZ0NhY2hlZExpYnJhcnkgJiYKKyAgICAgICAgICAgICFzdHJuY21wKGdDYWNoZWRMaWJyYXJ5LT5uYW1lLCBuYW1lLCBQQVRIX01BWCkpIHsKKyAgICAgICAgcmV0dXJuIGdDYWNoZWRMaWJyYXJ5OworICAgIH0KKworICAgIGUgPSBnTGlicmFyeUxpc3Q7CisgICAgd2hpbGUgKGUpIHsKKyAgICAgICAgbGliX2VudHJ5X3QgKmwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7CisgICAgICAgIGlmICghc3RyY21wKGwtPm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICBnQ2FjaGVkTGlicmFyeSA9IGw7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCiB2b2lkIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKQogewogICAgIGdDdXJMaWIgPSBnTGlicmFyeUxpc3Q7CkBAIC01ODksNyArNTg4LDEwIEBACiAgICAgcmV0dXJuIGNudDsKIH0KIAotaW50IGZpbmRFZmZlY3QoZWZmZWN0X3V1aWRfdCAqdXVpZCwgbGliX2VudHJ5X3QgKipsaWIsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKQoraW50IGZpbmRFZmZlY3QoZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKKyAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKQogewogICAgIGxpc3RfZWxlbV90ICplID0gZ0xpYnJhcnlMaXN0OwogICAgIGxpYl9lbnRyeV90ICpsID0gTlVMTDsKQEAgLTYwMiw3ICs2MDQsMTEgQEAKICAgICAgICAgbGlzdF9lbGVtX3QgKmVmeCA9IGwtPmVmZmVjdHM7CiAgICAgICAgIHdoaWxlIChlZngpIHsKICAgICAgICAgICAgIGQgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKWVmeC0+b2JqZWN0OwotICAgICAgICAgICAgaWYgKG1lbWNtcCgmZC0+dXVpZCwgdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTYxNCw5ICs2MjAsMTEgQEAKICAgICAgICAgTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKICAgICAgICAgcmV0ID0gLUVOT0VOVDsKICAgICB9IGVsc2UgewotICAgICAgICBMT0dWKCJmaW5kRWZmZWN0KCkgZm91bmQgZWZmZWN0OiAlcyBpbiBsaWIgJXMiLCBkLT5uYW1lLCBsLT5wYXRoKTsKKyAgICAgICAgTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7CiAgICAgICAgICpsaWIgPSBsOwotICAgICAgICAqZGVzYyA9IGQ7CisgICAgICAgIGlmIChkZXNjKSB7CisgICAgICAgICAgICAqZGVzYyA9IGQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmV0OwpAQCAtNjI2LDE3ICs2MzQsMTIgQEAKICAgICBjaGFyIHNbMjU2XTsKIAogICAgIHNucHJpbnRmKHN0ciwgbGVuLCAiXG5FZmZlY3QgRGVzY3JpcHRvciAlcDpcbiIsIGRlc2MpOwotICAgIHNwcmludGYocywgIi0gVVVJRDogJTA4WC0lMDRYLSUwNFgtJTA0WC0lMDJYJTAyWCUwMlglMDJYJTAyWCUwMlhcbiIsCi0gICAgICAgICAgICBkZXNjLT51dWlkLnRpbWVMb3csIGRlc2MtPnV1aWQudGltZU1pZCwgZGVzYy0+dXVpZC50aW1lSGlBbmRWZXJzaW9uLAotICAgICAgICAgICAgZGVzYy0+dXVpZC5jbG9ja1NlcSwgZGVzYy0+dXVpZC5ub2RlWzBdLCBkZXNjLT51dWlkLm5vZGVbMV0sZGVzYy0+dXVpZC5ub2RlWzJdLAotICAgICAgICAgICAgZGVzYy0+dXVpZC5ub2RlWzNdLGRlc2MtPnV1aWQubm9kZVs0XSxkZXNjLT51dWlkLm5vZGVbNV0pOwotICAgIHN0cm5jYXQoc3RyLCBzLCBsZW4pOwotICAgIHNwcmludGYocywgIi0gVFlQRTogJTA4WC0lMDRYLSUwNFgtJTA0WC0lMDJYJTAyWCUwMlglMDJYJTAyWCUwMlhcbiIsCi0gICAgICAgICAgICAgICAgZGVzYy0+dHlwZS50aW1lTG93LCBkZXNjLT50eXBlLnRpbWVNaWQsIGRlc2MtPnR5cGUudGltZUhpQW5kVmVyc2lvbiwKLSAgICAgICAgICAgICAgICBkZXNjLT50eXBlLmNsb2NrU2VxLCBkZXNjLT50eXBlLm5vZGVbMF0sIGRlc2MtPnR5cGUubm9kZVsxXSxkZXNjLT50eXBlLm5vZGVbMl0sCi0gICAgICAgICAgICAgICAgZGVzYy0+dHlwZS5ub2RlWzNdLGRlc2MtPnR5cGUubm9kZVs0XSxkZXNjLT50eXBlLm5vZGVbNV0pOwotICAgIHN0cm5jYXQoc3RyLCBzLCBsZW4pOwotICAgIHNwcmludGYocywgIi0gYXBpVmVyc2lvbjogJTA0WFxuLSBmbGFnczogJTA4WFxuIiwKKyAgICBzdHJuY2F0KHN0ciwgIi0gVFlQRTogIiwgbGVuKTsKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIDI1Nik7CisgICAgc25wcmludGYoc3RyLCBsZW4sICItIFVVSUQ6ICVzXG4iLCBzKTsKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnR5cGUsIHMsIDI1Nik7CisgICAgc25wcmludGYoc3RyLCBsZW4sICItIFRZUEU6ICVzXG4iLCBzKTsKKyAgICBzcHJpbnRmKHMsICItIGFwaVZlcnNpb246ICUwOFhcbi0gZmxhZ3M6ICUwOFhcbiIsCiAgICAgICAgICAgICBkZXNjLT5hcGlWZXJzaW9uLCBkZXNjLT5mbGFncyk7CiAgICAgc3RybmNhdChzdHIsIHMsIGxlbik7CiAgICAgc3ByaW50ZihzLCAiLSBuYW1lOiAlc1xuIiwgZGVzYy0+bmFtZSk7CkBAIC02NDUsMyArNjQ4LDQzIEBACiAgICAgc3RybmNhdChzdHIsIHMsIGxlbik7CiB9CiAKK2ludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKQoreworICAgIGludCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHV1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIHV1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIHV1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICB1dWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIHV1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgdXVpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICB1dWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIHV1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgdXVpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbikKK3sKKworICAgIHNucHJpbnRmKHN0ciwgbWF4TGVuLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgdXVpZC0+dGltZUxvdywKKyAgICAgICAgICAgIHV1aWQtPnRpbWVNaWQsCisgICAgICAgICAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uLAorICAgICAgICAgICAgdXVpZC0+Y2xvY2tTZXEsCisgICAgICAgICAgICB1dWlkLT5ub2RlWzBdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVsxXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMl0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzNdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVs0XSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbNV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKaW5kZXggOGY1NDNjYS4uZmNjMGRiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKQEAgLTIyLDI5ICsyMiwzNSBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CiAKLQogI2lmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCisjZGVmaW5lIEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFICIvc3lzdGVtL2V0Yy9hdWRpb19lZmZlY3RzLmNvbmYiCisjZGVmaW5lIEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUgIi92ZW5kb3IvZXRjL2F1ZGlvX2VmZmVjdHMuY29uZiIKKyNkZWZpbmUgRUZGRUNUU19UQUcgImVmZmVjdHMiCisjZGVmaW5lIExJQlJBUklFU19UQUcgImxpYnJhcmllcyIKKyNkZWZpbmUgUEFUSF9UQUcgInBhdGgiCisjZGVmaW5lIExJQlJBUllfVEFHICJsaWJyYXJ5IgorI2RlZmluZSBVVUlEX1RBRyAidXVpZCIKKwogdHlwZWRlZiBzdHJ1Y3QgbGlzdF9lbGVtX3MgewogICAgIHZvaWQgKm9iamVjdDsKICAgICBzdHJ1Y3QgbGlzdF9lbGVtX3MgKm5leHQ7CiB9IGxpc3RfZWxlbV90OwogCiB0eXBlZGVmIHN0cnVjdCBsaWJfZW50cnlfcyB7Ci0gICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKKyAgICBhdWRpb19lZmZlY3RfbGlicmFyeV90ICpkZXNjOworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciAqcGF0aDsKICAgICB2b2lkICpoYW5kbGU7Ci0gICAgaW50IGlkOwotICAgIGVmZmVjdF9DcmVhdGVFZmZlY3RfdCBjcmVhdGVGeDsKLSAgICBlZmZlY3RfUmVsZWFzZUVmZmVjdF90IHJlbGVhc2VGeDsKICAgICBsaXN0X2VsZW1fdCAqZWZmZWN0czsgLy9saXN0IG9mIGVmZmVjdF9kZXNjcmlwdG9yX3QKICAgICBwdGhyZWFkX211dGV4X3QgbG9jazsKIH0gbGliX2VudHJ5X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGVmZmVjdF9lbnRyeV9zIHsKICAgICBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOwotICAgIGVmZmVjdF9pbnRlcmZhY2VfdCBzdWJJdGZlOworICAgIGVmZmVjdF9oYW5kbGVfdCBzdWJJdGZlOwogICAgIGxpYl9lbnRyeV90ICpsaWI7CiB9IGVmZmVjdF9lbnRyeV90OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCAwYjA2MWRiLi4yMWM0NTFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxFZmZlY3RCdW5kbGUuaD4KIAogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBiYXNzIGJvb3N0CisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBiYXNzIGJvb3N0CiBleHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0x2bUVmZmVjdEludGVyZmFjZTsKIAogI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyl7XApAQCAtNzEsNyArNzEsNyBAQAogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQmFzc0Jvb3N0RGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4MDYzNGYyMjAsIDB4ZGRkNCwgMHgxMWRiLCAweGEwZmMsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwKICAgICAgICAgezB4ODYzMWYzMDAsIDB4NzJlMiwgMHgxMWRmLCAweGI1N2UsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHV1aWQKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5ECiAgICAgICAgIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBCQVNTX0JPT1NUX0NVUF9MT0FEX0FSTTlFLApAQCAtODQsNyArODQsNyBAQAogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnVmlydHVhbGl6ZXJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHgzN2NjMmMwMCwgMHhkZGRkLCAweDExZGIsIDB4ODU3NywgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKICAgICAgICAgezB4MWQ0MDMzYzAsIDB4ODU1NywgMHgxMWRmLCAweDlmMmQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCi0gICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORAogICAgICAgICB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKICAgICAgICAgVklSVFVBTElaRVJfQ1VQX0xPQURfQVJNOUUsCkBAIC05Nyw3ICs5Nyw3IEBACiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdFcXVhbGl6ZXJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdHlwZQogICAgICAgICB7MHhjZTc3MmYyMCwgMHg4NDdkLCAweDExZGYsIDB4YmIxNywgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZCBFcSBOWFAKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCiAgICAgICAgIEVRVUFMSVpFUl9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgQlVORExFX01FTV9VU0FHRSwKQEAgLTEwOSw3ICsxMDksNyBAQAogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnVm9sdW1lRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4MDllOGVkZTAsIDB4ZGRkZSwgMHgxMWRiLCAweGI0ZjYsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwKICAgICAgICAgezB4MTE5MzQxYTAsIDB4ODQ2OSwgMHgxMWRmLCAweDgxZjksIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwgLy91dWlkIFZPTCBOWFAKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCiAgICAgICAgIFZPTFVNRV9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgQlVORExFX01FTV9VU0FHRSwKQEAgLTE4Nyw3ICsxODcsNyBAQAogZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgICAgICAgKnV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpb0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAgKnBJbnRlcmZhY2UpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKnBIYW5kbGUpewogICAgIGludCByZXQgPSAwOwogICAgIGludCBzZXNzaW9uTm87CiAgICAgaW50IGk7CkBAIC0xOTcsNyArMTk3LDcgQEAKIAogICAgIExPR1YoIlxuXHRFZmZlY3RDcmVhdGUgc3RhcnQgc2Vzc2lvbiAlZCIsIHNlc3Npb25JZCk7CiAKLSAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgaWYgKHBIYW5kbGUgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpewogICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICBnb3RvIGV4aXQ7CkBAIC0zNTUsMTkgKzM1NSwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVsZXRlIHBDb250ZXh0OwogICAgICAgICB9Ci0gICAgICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClOVUxMOworICAgICAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICAqcEludGVyZmFjZSA9IChlZmZlY3RfaW50ZXJmYWNlX3QpcENvbnRleHQ7CisgICAgICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKICAgICB9CiAgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgZW5kLi5cblxuIik7CiAgICAgcmV0dXJuIHJldDsKIH0gLyogZW5kIEVmZmVjdENyZWF0ZSAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpewotICAgIExPR1YoIlxuXHRFZmZlY3RSZWxlYXNlIHN0YXJ0ICVwIiwgaW50ZXJmYWNlKTsKLSAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKWludGVyZmFjZTsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSl7CisgICAgTE9HVigiXG5cdEVmZmVjdFJlbGVhc2Ugc3RhcnQgJXAiLCBoYW5kbGUpOworICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopaGFuZGxlOwogCi0gICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlIHN0YXJ0IGludGVyZmFjZTogJXAsIGNvbnRleHQgJXAiLCBpbnRlcmZhY2UsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOworICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBzdGFydCBoYW5kbGU6ICVwLCBjb250ZXh0ICVwIiwgaGFuZGxlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CiAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC00NjAsNiArNDYwLDM0IEBACiAKIH0gLyogZW5kIEVmZmVjdFJlbGVhc2UgKi8KIAorZXh0ZXJuICJDIiBpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MgPSBOVUxMOworCisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvcigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKHV1aWQsICZnQmFzc0Jvb3N0RGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgZGVzYyA9ICZnQmFzc0Jvb3N0RGVzY3JpcHRvcjsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcCh1dWlkLCAmZ1ZpcnR1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgZGVzYyA9ICZnVmlydHVhbGl6ZXJEZXNjcmlwdG9yOworICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnRXF1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgZGVzYyA9ICZnRXF1YWxpemVyRGVzY3JpcHRvcjsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcCh1dWlkLCAmZ1ZvbHVtZURlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgIGRlc2MgPSAmZ1ZvbHVtZURlc2NyaXB0b3I7CisgICAgfQorCisgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gIC1FSU5WQUw7CisgICAgfQorCisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBFZmZlY3RHZXREZXNjcmlwdG9yICovCisKIHZvaWQgTHZtR2xvYmFsQnVuZGxlX2luaXQoKXsKICAgICBMT0dWKCJcdEx2bUdsb2JhbEJ1bmRsZV9pbml0IHN0YXJ0Iik7CiAgICAgZm9yKGludCBpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKQEAgLTQ5MywxNiArNTIxLDE2IEBACiAgICAgTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOwogCiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgICA9IENIQU5ORUxfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgICA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC05MjgsMTAgKzk1NiwxMCBAQAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKLSAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQogICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKLSAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1MxNSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CiAKICAgICBtZW1jcHkoJnBDb250ZXh0LT5jb25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKIApAQCAtMjU0NSw4ICsyNTczLDkgQEAKIH0gLy8gbmFtZXNwYWNlCiB9IC8vIG5hbWVzcGFjZQogCitleHRlcm4gIkMiIHsKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogUHJvY2VzcyAqLwotZXh0ZXJuICJDIiBpbnQgRWZmZWN0X3Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90ICAgICBzZWxmLAoraW50IEVmZmVjdF9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCAgICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKICAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOwpAQCAtMjY2Niw3ICsyNjk1LDcgQEAKIH0gICAvKiBlbmQgRWZmZWN0X3Byb2Nlc3MgKi8KIAogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBDb21tYW5kICovCi1leHRlcm4gIkMiIGludCBFZmZlY3RfY29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3QgIHNlbGYsCitpbnQgRWZmZWN0X2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90ICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCkBAIC0zMDE2LDExICszMDQ1LDExIEBACiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgogICAgICAgICB7CiAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFIHN0YXJ0Iik7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VfZSBkZXZpY2UgPSAqKGF1ZGlvX2RldmljZV9lICopcENtZERhdGE7CisgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2UgPSAqKHVpbnQzMl90ICopcENtZERhdGE7CiAKICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKLSAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IERFVklDRV9TUEVBS0VSKXx8KGRldmljZSA9PSBERVZJQ0VfQkxVRVRPT1RIX1NDT19DQVJLSVQpfHwKLSAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IERFVklDRV9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSl7CisgICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpfHwoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpfHwKKyAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikpewogICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgaW52YWxpZCBmb3IgTFZNX0JBU1NfQk9PU1QgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHRlbXBvcmFyeSBkaXNhYmxlIExWTV9CQVNfQk9PU1QiKTsKQEAgLTMwNTEsOCArMzA4MCw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKLSAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IERFVklDRV9TUEVBS0VSKXx8KGRldmljZSA9PSBERVZJQ0VfQkxVRVRPT1RIX1NDT19DQVJLSVQpfHwKLSAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IERFVklDRV9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSl7CisgICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpfHwoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpfHwKKyAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikpewogICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgaW52YWxpZCBmb3IgTFZNX1ZJUlRVQUxJWkVSICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOwogICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKQEAgLTMxNjQsOSArMzE5Myw1NyBAQAogICAgIHJldHVybiAwOwogfSAgICAvKiBlbmQgRWZmZWN0X2NvbW1hbmQgKi8KIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZWZmZWN0CisvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IGdldF9kZXNjcmlwdG9yICovCitpbnQgRWZmZWN0X2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKKworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgTE9HVigiRWZmZWN0X2dldERlc2NyaXB0b3IoKSBpbnZhbGlkIHBhcmFtIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN3aXRjaChwQ29udGV4dC0+RWZmZWN0VHlwZSkgeworICAgICAgICBjYXNlIExWTV9CQVNTX0JPT1NUOgorICAgICAgICAgICAgZGVzYyA9ICZhbmRyb2lkOjpnQmFzc0Jvb3N0RGVzY3JpcHRvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWTV9WSVJUVUFMSVpFUjoKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z1ZpcnR1YWxpemVyRGVzY3JpcHRvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWTV9FUVVBTElaRVI6CisgICAgICAgICAgICBkZXNjID0gJmFuZHJvaWQ6OmdFcXVhbGl6ZXJEZXNjcmlwdG9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFZNX1ZPTFVNRToKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z1ZvbHVtZURlc2NyaXB0b3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG1lbWNweShwRGVzY3JpcHRvciwgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKworICAgIHJldHVybiAwOworfSAgIC8qIGVuZCBFZmZlY3RfZ2V0RGVzY3JpcHRvciAqLworCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlZmZlY3QKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0x2bUVmZmVjdEludGVyZmFjZSA9IHsKICAgICBFZmZlY3RfcHJvY2VzcywKLSAgICBFZmZlY3RfY29tbWFuZAorICAgIEVmZmVjdF9jb21tYW5kLAorICAgIEVmZmVjdF9nZXREZXNjcmlwdG9yCiB9OyAgICAvKiBlbmQgZ0x2bUVmZmVjdEludGVyZmFjZSAqLwogCithdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgIHRhZyA6IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICB2ZXJzaW9uIDogRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgbmFtZSA6ICJFZmZlY3QgQnVuZGxlIExpYnJhcnkiLAorICAgIGltcGxlbWVudG9yIDogIk5YUCBTb2Z0d2FyZSBMdGQuIiwKKyAgICBxdWVyeV9udW1fZWZmZWN0cyA6IGFuZHJvaWQ6OkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cywKKyAgICBxdWVyeV9lZmZlY3QgOiBhbmRyb2lkOjpFZmZlY3RRdWVyeUVmZmVjdCwKKyAgICBjcmVhdGVfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0Q3JlYXRlLAorICAgIHJlbGVhc2VfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKKyAgICBnZXRfZGVzY3JpcHRvciA6IGFuZHJvaWQ6OkVmZmVjdEdldERlc2NyaXB0b3IsCit9OworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCA5MDk3ZTIwLi4yNzI3Mzc1IDEwMDc1NQotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxFZmZlY3RSZXZlcmIuaD4KICNpbmNsdWRlIDxMVlJFVi5oPgogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciByZXZlcmIKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHJldmVyYgogZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdSZXZlcmJJbnRlcmZhY2U7CiAKICNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpe1wKQEAgLTc3LDcgKzc3LDcgQEAKIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsgMHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgeyAweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllIH0gfSwKICAgICAgICAgeyAweDRhMzg3ZmMwLCAweDhhYjMsIDB4MTFkZiwgMHg4YmFkLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSwKICAgICAgICAgTFZSRVZfQ1VQX0xPQURfQVJNOUUsCiAgICAgICAgIExWUkVWX01FTV9VU0FHRSwKQEAgLTg5LDcgKzg5LDcgQEAKIHN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdJbnNlcnRFbnZSZXZlcmJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgezB4NGUsIDB4MjMsIDB4NGQsIDB4MDYsIDB4ODMsIDB4OWV9fSwKICAgICAgICAgezB4YzdhNTExYTAsIDB4YTNiYiwgMHgxMWRmLCAweDg2MGUsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCi0gICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwsCiAgICAgICAgIExWUkVWX0NVUF9MT0FEX0FSTTlFLAogICAgICAgICBMVlJFVl9NRU1fVVNBR0UsCkBAIC0xMDEsNyArMTAxLDcgQEAKIHN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdBdXhQcmVzZXRSZXZlcmJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHg0NzM4MmQ2MCwgMHhkZGQ4LCAweDExZGIsIDB4YmYzYSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKICAgICAgICAgezB4ZjI5YTE0MDAsIDB4YTNiYiwgMHgxMWRmLCAweDhkZGMsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCi0gICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZLAogICAgICAgICBMVlJFVl9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgTFZSRVZfTUVNX1VTQUdFLApAQCAtMTEzLDcgKzExMyw3IEBACiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIHsweDE3MmNkZjAwLCAweGEzYmMsIDB4MTFkZiwgMHhhNzJmLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMLAogICAgICAgICBMVlJFVl9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgTFZSRVZfTUVNX1VTQUdFLApAQCAtMTkyLDcgKzE5Miw4IEBACiAgICAgcmV0dXJuIDA7CiB9ICAgICAvKiBlbmQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcil7CitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKXsKICAgICBMT0dWKCJcblx0RWZmZWN0UXVlcnlFZmZlY3Qgc3RhcnQiKTsKICAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5RWZmZWN0IHByb2Nlc3NpbmcgaW5kZXggJWQiLCBpbmRleCk7CiAgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwpewpAQCAtMjExLDcgKzIxMiw3IEBACiBleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICAqcEludGVyZmFjZSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CiAgICAgaW50IHJldDsKICAgICBpbnQgaTsKICAgICBpbnQgbGVuZ3RoID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKQEAgLTIxOSw3ICsyMjAsNyBAQAogCiAgICAgTE9HVigiXHRcbkVmZmVjdENyZWF0ZSBzdGFydCIpOwogCi0gICAgaWYgKHBJbnRlcmZhY2UgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMjcwLDcgKzI3MSw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KXBDb250ZXh0OworICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKIAogICAgICNpZmRlZiBMVk1fUENNCiAgICAgcENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKQEAgLTI5NSwxMCArMjk2LDEwIEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKXsKLSAgICBSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoUmV2ZXJiQ29udGV4dCAqKWludGVyZmFjZTsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSl7CisgICAgUmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKFJldmVyYkNvbnRleHQgKiloYW5kbGU7CiAKLSAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2UgJXAiLCBpbnRlcmZhY2UpOworICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSAlcCIsIGhhbmRsZSk7CiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpewogICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMzE1LDYgKzMxNiwyOCBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLwogCitleHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaW50IGk7CisgICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7CisKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBpZiAobWVtY21wKHV1aWQsICZnRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnRGVzY3JpcHRvcnNbaV0sIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLAorICAgICAgICAgICAgICAgICBpLCBnRGVzY3JpcHRvcnNbaV0tPnV1aWQudGltZUxvdyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtRUlOVkFMOworfSAvKiBlbmQgRWZmZWN0R2V0RGVzY3JpcHRvciAqLworCiAvKiBsb2NhbCBmdW5jdGlvbnMgKi8KICNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpIHsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNDE4LDkgKzQ0MSw5IEBACiAKIAogICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGlzIGVpdGhlciBtb25vIG9yIHN0ZXJlbwotICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfU1RFUkVPKSB7CisgICAgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7CiAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDI7Ci0gICAgfSBlbHNlIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfTU9OTykgeworICAgIH0gZWxzZSBpZiAocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB7CiAgICAgICAgIExPR1YoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGludmFsaWQgUENNIGZvcm1hdCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC02MDgsMTIgKzYzMSwxMiBAQAogCiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOwotICAgIENIRUNLX0FSRygocENvbnRleHQtPmF1eGlsaWFyeSAmJiBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX01PTk8pIHx8Ci0gICAgICAgICAgICAgICgoIXBDb250ZXh0LT5hdXhpbGlhcnkpICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfU1RFUkVPKSk7Ci0gICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX1NURVJFTyk7CisgICAgQ0hFQ0tfQVJHKChwQ29udGV4dC0+YXV4aWxpYXJ5ICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHx8CisgICAgICAgICAgICAgICgoIXBDb250ZXh0LT5hdXhpbGlhcnkpICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKICAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7Ci0gICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwogCiAgICAgaWYocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IDQ0MTAwKXsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC03MDAsMjAgKzcyMywyMCBAQAogCiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKLSAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9NT05POworICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICA9IENIQU5ORUxfU1RFUkVPOworICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQogCi0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgICA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC04MDAsNyArODIzLDcgQEAKICAgICBwYXJhbXMuT3BlcmF0aW5nTW9kZSAgPSBMVk1fTU9ERV9PTjsKICAgICBwYXJhbXMuU2FtcGxlUmF0ZSAgICAgPSBMVk1fRlNfNDQxMDA7CiAKLSAgICBpZihwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfTU9OTyl7CisgICAgaWYocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKXsKICAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZNX01PTk87CiAgICAgfSBlbHNlIHsKICAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZNX1NURVJFTzsKQEAgLTE4MzIsOCArMTg1NSw5IEBACiB9IC8vIG5hbWVzcGFjZQogfSAvLyBuYW1lc3BhY2UKIAorZXh0ZXJuICJDIiB7CiAvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IFByb2Nlc3MgKi8KLWV4dGVybiAiQyIgaW50IFJldmVyYl9wcm9jZXNzKGVmZmVjdF9pbnRlcmZhY2VfdCAgIHNlbGYsCitpbnQgUmV2ZXJiX3Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKICAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqKSBzZWxmOwpAQCAtMTg2OCw3ICsxODkyLDcgQEAKIH0gICAvKiBlbmQgUmV2ZXJiX3Byb2Nlc3MgKi8KIAogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBDb21tYW5kICovCi1leHRlcm4gIkMiIGludCBSZXZlcmJfY29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3QgIHNlbGYsCitpbnQgUmV2ZXJiX2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90ICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCkBAIC0yMDc1LDkgKzIwOTksNTQgQEAKICAgICByZXR1cm4gMDsKIH0gICAgLyogZW5kIFJldmVyYl9jb21tYW5kICovCiAKLS8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFJldmVyYiBlZmZlY3QKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogZ2V0X2Rlc2NyaXB0b3IgKi8KK2ludCBSZXZlcmJfZ2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3QgICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCit7CisgICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKilzZWxmOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIExPR1YoIlJldmVyYl9nZXREZXNjcmlwdG9yKCkgaW52YWxpZCBwYXJhbSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgeworICAgICAgICBpZiAocENvbnRleHQtPnByZXNldCkgeworICAgICAgICAgICAgZGVzYyA9ICZhbmRyb2lkOjpnQXV4UHJlc2V0UmV2ZXJiRGVzY3JpcHRvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z0F1eEVudlJldmVyYkRlc2NyaXB0b3I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocENvbnRleHQtPnByZXNldCkgeworICAgICAgICAgICAgZGVzYyA9ICZhbmRyb2lkOjpnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z0luc2VydEVudlJldmVyYkRlc2NyaXB0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1jcHkocERlc2NyaXB0b3IsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisKKyAgICByZXR1cm4gMDsKK30gICAvKiBlbmQgUmV2ZXJiX2dldERlc2NyaXB0b3IgKi8KKworLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgUmV2ZXJiIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlID0gewogICAgIFJldmVyYl9wcm9jZXNzLAotICAgIFJldmVyYl9jb21tYW5kCisgICAgUmV2ZXJiX2NvbW1hbmQsCisgICAgUmV2ZXJiX2dldERlc2NyaXB0b3IKIH07ICAgIC8qIGVuZCBnUmV2ZXJiSW50ZXJmYWNlICovCiAKK2F1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CisgICAgdGFnIDogQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgIHZlcnNpb24gOiBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICBuYW1lIDogIlJldmVyYiBMaWJyYXJ5IiwKKyAgICBpbXBsZW1lbnRvciA6ICJOWFAgU29mdHdhcmUgTHRkLiIsCisgICAgcXVlcnlfbnVtX2VmZmVjdHMgOiBhbmRyb2lkOjpFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMsCisgICAgcXVlcnlfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0UXVlcnlFZmZlY3QsCisgICAgY3JlYXRlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKKyAgICByZWxlYXNlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCisgICAgZ2V0X2Rlc2NyaXB0b3IgOiBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAorfTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18KaW5kZXggOWJhNzFlZC4uOThkNDc3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCkBAIC0yNSw3ICsyNSw3IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCkBAIC02MCw3ICs2MCw3IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRm9ybWF0QWRhcHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0Zvcm1hdEFkYXB0ZXIuaAppbmRleCBkOTNlYmU5Li40MWYxODEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRm9ybWF0QWRhcHRlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Gb3JtYXRBZGFwdGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpZm5kZWYgQVVESU9GT1JNQVRBREFQVEVSX0hfCiAjZGVmaW5lIEFVRElPRk9STUFUQURBUFRFUl9IXwogCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKIAogI2RlZmluZSBtaW4oeCx5KSAoKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkpCkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgIHdoaWxlIChudW1TYW1wbGVzID4gMCkgewogICAgICAgICAgICAgdWludDMyX3QgbnVtU2FtcGxlc0l0ZXIgPSBtaW4obnVtU2FtcGxlcywgbU1heFNhbXBsZXNQZXJDYWxsKTsKICAgICAgICAgICAgIHVpbnQzMl90IG5TYW1wbGVzQ2hhbm5lbHMgPSBudW1TYW1wbGVzSXRlciAqIG1OdW1DaGFubmVsczsKLSAgICAgICAgICAgIGlmIChtUGNtRm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1M3XzI0KSB7CisgICAgICAgICAgICBpZiAobVBjbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1CZWhhdmlvciA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSkgewogICAgICAgICAgICAgICAgICAgICBtcFByb2Nlc3Nvci0+cHJvY2VzcygKICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYXVkaW9fc2FtcGxlX3QgKj4gKHBJbiksCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAvLyAgICAgICAgICAgICAgc2FtcGxlLgogICAgIC8vIG51bVNhbXBsZXMgICBUaGUgbnVtYmVyIG9mIHNpbmdsZS1jaGFubmVsIHNhbXBsZXMgdG8gcHJvY2Vzcy4KICAgICB2b2lkIENvbnZlcnRJbnB1dChjb25zdCB2b2lkIComIHBJbiwgdWludDMyX3QgbnVtU2FtcGxlcykgewotICAgICAgICBpZiAobVBjbUZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpIHsKKyAgICAgICAgaWYgKG1QY21Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiBwSW4xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihwSW4pOwogICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBwT3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgICAgIHdoaWxlIChudW1TYW1wbGVzLS0gPiAwKSB7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAvLyAgICAgICAgICAgICAgV2hlbiBmdW5jdGlvbiBleGlzdCB3aWxsIHBvaW50IHRvIHRoZSBuZXh0IG91dHB1dCBzYW1wbGUuCiAgICAgLy8gbnVtU2FtcGxlcyAgIFRoZSBudW1iZXIgb2Ygc2luZ2xlLWNoYW5uZWwgc2FtcGxlcyB0byBwcm9jZXNzLgogICAgIHZvaWQgQ29udmVydE91dHB1dCh2b2lkIComIHBPdXQsIHVpbnQzMl90IG51bVNhbXBsZXMpIHsKLSAgICAgICAgaWYgKG1QY21Gb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSB7CisgICAgICAgIGlmIChtUGNtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19zYW1wbGVfdCAqIHBJbiA9IG1CdWZmZXI7CiAgICAgICAgICAgICBpbnQxNl90ICogcE91dDE2ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHBPdXQpOwogICAgICAgICAgICAgaWYgKG1CZWhhdmlvciA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCmluZGV4IGY4ZTQzNTcuLjQzZGZhODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlICJBdWRpb0Zvcm1hdEFkYXB0ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaD4KIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZXF1YWxpemVyIGVmZmVjdAorLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZXF1YWxpemVyIGVmZmVjdAogZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdFcXVhbGl6ZXJJbnRlcmZhY2U7CiAKIGVudW0gZXF1YWxpemVyX3N0YXRlX2UgewpAQCAtNDQsMTIgKzQ0LDEyIEBACiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdFcXVhbGl6ZXJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdHlwZQogICAgICAgICB7MHhlMjVhYTg0MCwgMHg1NDNiLCAweDExZGYsIDB4OThhNSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCksCiAgICAgICAgIDAsIC8vIFRPRE8KICAgICAgICAgMSwKICAgICAgICAgIkdyYXBoaWMgRXF1YWxpemVyIiwKLSAgICAgICAgIkdvb2dsZSBJbmMuIiwKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLyBCRUdJTiBFUSBQUkVTRVRTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTEyNyw3ICsxMjcsOCBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewogICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTEzOSwxNSArMTQwLDE1IEBACiB9IC8qIGVuZCBFZmZlY3RRdWVyeU5leHQgKi8KIAogZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAotICAgICAgICBpbnQzMl90IGlvSWQsCi0gICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpIHsKICAgICBpbnQgcmV0OwogICAgIGludCBpOwogCiAgICAgTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0IHN0YXJ0Iik7CiAKLSAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMTY4LDE5ICsxNjksMjAgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICAqcEludGVyZmFjZSA9IChlZmZlY3RfaW50ZXJmYWNlX3QpcENvbnRleHQ7CisgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KXBDb250ZXh0OwogICAgIHBDb250ZXh0LT5zdGF0ZSA9IEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRDsKIAotICAgIExPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCAlcCwgc2l6ZSAlZCIsIHBDb250ZXh0LCBBdWRpb0VxdWFsaXplcjo6R2V0SW5zdGFuY2VTaXplKGtOdW1CYW5kcykrc2l6ZW9mKEVxdWFsaXplckNvbnRleHQpKTsKKyAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAsIHNpemUgJWQiLAorICAgICAgICAgcENvbnRleHQsIEF1ZGlvRXF1YWxpemVyOjpHZXRJbnN0YW5jZVNpemUoa051bUJhbmRzKStzaXplb2YoRXF1YWxpemVyQ29udGV4dCkpOwogCiAgICAgcmV0dXJuIDA7CiAKIH0gLyogZW5kIEVmZmVjdENyZWF0ZSAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpIHsKLSAgICBFcXVhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoRXF1YWxpemVyQ29udGV4dCAqKWludGVyZmFjZTsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgeworICAgIEVxdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChFcXVhbGl6ZXJDb250ZXh0ICopaGFuZGxlOwogCi0gICAgTE9HVigiRWZmZWN0TGliUmVsZWFzZUVmZmVjdCAlcCIsIGludGVyZmFjZSk7CisgICAgTE9HVigiRWZmZWN0TGliUmVsZWFzZUVmZmVjdCAlcCIsIGhhbmRsZSk7CiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTkyLDYgKzE5NCwyMiBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLwogCitleHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsICZnRXF1YWxpemVyRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuICAtRUlOVkFMOworfSAvKiBlbmQgRWZmZWN0R2V0RGVzY3JpcHRvciAqLworCiAKIC8vCiAvLy0tLSBsb2NhbCBmdW5jdGlvbnMKQEAgLTIyOCwxNCArMjQ2LDE1IEBACiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOwotICAgIENIRUNLX0FSRygocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9NT05PKSB8fCAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pKTsKKyAgICBDSEVDS19BUkcoKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHx8CisgICAgICAgICAgICAgIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKICAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7Ci0gICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TN18yNAotICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQKKyAgICAgICAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKIAogICAgIGludCBjaGFubmVsQ291bnQ7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfTU9OTykgeworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB7CiAgICAgICAgIGNoYW5uZWxDb3VudCA9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgY2hhbm5lbENvdW50ID0gMjsKQEAgLTI4MSwxNiArMzAwLDE2IEBACiAgICAgfQogCiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC00MDIsNyArNDIxLDggQEAKICAgICBjYXNlIEVRX1BBUkFNX0xFVkVMX1JBTkdFOgogICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAtOTYwMDsKICAgICAgICAgKigoaW50MTZfdCAqKXBWYWx1ZSArIDEpID0gNDgwMDsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0xFVkVMX1JBTkdFIG1pbiAlZCwgbWF4ICVkIiwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fTEVWRUxfUkFOR0UgbWluICVkLCBtYXggJWQiLAorICAgICAgICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSwgKigoaW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6CkBAIC00MTIsNyArNDMyLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IChpbnQxNl90KXBFcXVhbGl6ZXItPmdldEdhaW4ocGFyYW0yKTsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLCBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwKKyAgICAgICAgICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUToKQEAgLTQyMiw3ICs0NDMsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgKihpbnQzMl90ICopcFZhbHVlID0gcEVxdWFsaXplci0+Z2V0RnJlcXVlbmN5KHBhcmFtMik7Ci0gICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DRU5URVJfRlJFUSBiYW5kICVkLCBmcmVxdWVuY3kgJWQiLCBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DRU5URVJfRlJFUSBiYW5kICVkLCBmcmVxdWVuY3kgJWQiLAorICAgICAgICAgICAgIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRToKQEAgLTQzMiwxMyArNDU0LDE1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBwRXF1YWxpemVyLT5nZXRCYW5kUmFuZ2UocGFyYW0yLCAqKHVpbnQzMl90ICopcFZhbHVlLCAqKCh1aW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBiYW5kICVkLCBtaW4gJWQsIG1heCAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGJhbmQgJWQsIG1pbiAlZCwgbWF4ICVkIiwKKyAgICAgICAgICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSwgKigoaW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX0dFVF9CQU5EOgogICAgICAgICBwYXJhbTIgPSAqcFBhcmFtOwogICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KXBFcXVhbGl6ZXItPmdldE1vc3RSZWxldmFudEJhbmQocGFyYW0yKTsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAlZCIsCisgICAgICAgICAgICAgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKQEAgLTQ2MSw3ICs0ODUsOCBAQAogICAgICAgICBzdHJuY3B5KG5hbWUsIHBFcXVhbGl6ZXItPmdldFByZXNldE5hbWUocGFyYW0yKSwgKnBWYWx1ZVNpemUgLSAxKTsKICAgICAgICAgbmFtZVsqcFZhbHVlU2l6ZSAtIDFdID0gMDsKICAgICAgICAgKnBWYWx1ZVNpemUgPSBzdHJsZW4obmFtZSkgKyAxOwotICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLCBwYXJhbTIsIGdFcXVhbGl6ZXJQcmVzZXRzW3BhcmFtMl0ubmFtZSwgKnBWYWx1ZVNpemUpOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLAorICAgICAgICAgICAgIHBhcmFtMiwgZ0VxdWFsaXplclByZXNldHNbcGFyYW0yXS5uYW1lLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7CkBAIC01NzEsNyArNTk2LDcgQEAKIC8vLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8KIAotZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX3Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKK2V4dGVybiAiQyIgaW50IEVxdWFsaXplcl9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCiB7CiAgICAgYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKikgc2VsZjsKIApAQCAtNTk2LDcgKzYyMSw3IEBACiAgICAgcmV0dXJuIDA7CiB9ICAgLy8gZW5kIEVxdWFsaXplcl9wcm9jZXNzCiAKLWV4dGVybiAiQyIgaW50IEVxdWFsaXplcl9jb21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAorZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCiAgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CiAKICAgICBhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqKSBzZWxmOwpAQCAtNjQ3LDcgKzY3Miw4IEBACiAKICAgICAgICAgfSBicmVhazsKICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7Ci0gICAgICAgIExPR1YoIkVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGEgJXAiLCBjbWRTaXplLCBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGEgJXAiLAorICAgICAgICAgICAgIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CiAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNjkwLDEwICs3MTYsMzcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZXF1YWxpemVyIGVmZmVjdAorZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICopIHNlbGY7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXREZXNjcmlwdG9yKCkgaW52YWxpZCBwYXJhbSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtZW1jcHkocERlc2NyaXB0b3IsICZhbmRyb2lkOjpnRXF1YWxpemVyRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKworICAgIHJldHVybiAwOworfQorCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlcXVhbGl6ZXIgZWZmZWN0CiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdFcXVhbGl6ZXJJbnRlcmZhY2UgPSB7CiAgICAgICAgIEVxdWFsaXplcl9wcm9jZXNzLAotICAgICAgICBFcXVhbGl6ZXJfY29tbWFuZAorICAgICAgICBFcXVhbGl6ZXJfY29tbWFuZCwKKyAgICAgICAgRXF1YWxpemVyX2dldERlc2NyaXB0b3IKIH07CiAKIAorYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICB0YWcgOiBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgdmVyc2lvbiA6IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAorICAgIG5hbWUgOiAiVGVzdCBFcXVhbGl6ZXIgTGlicmFyeSIsCisgICAgaW1wbGVtZW50b3IgOiAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgcXVlcnlfbnVtX2VmZmVjdHMgOiBhbmRyb2lkOjpFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMsCisgICAgcXVlcnlfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0UXVlcnlFZmZlY3QsCisgICAgY3JlYXRlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKKyAgICByZWxlYXNlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCisgICAgZ2V0X2Rlc2NyaXB0b3IgOiBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAorfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCmluZGV4IDNlYjhiMmMuLjAyNzYyYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYwpAQCAtMjMsNTkgKzIzLDYwIEBACiAjaW5jbHVkZSAiRWZmZWN0UmV2ZXJiLmgiCiAjaW5jbHVkZSAiRWZmZWN0c01hdGguaCIKIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgcmV2ZXJiIGVmZmVjdAorLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgcmV2ZXJiIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlID0gewogICAgICAgICBSZXZlcmJfUHJvY2VzcywKLSAgICAgICAgUmV2ZXJiX0NvbW1hbmQKKyAgICAgICAgUmV2ZXJiX0NvbW1hbmQsCisgICAgICAgIFJldmVyYl9HZXREZXNjcmlwdG9yCiB9OwogCiAvLyBHb29nbGUgYXV4aWxpYXJ5IGVudmlyb25tZW50YWwgcmV2ZXJiIFVVSUQ6IDFmMGFlMmUwLTRlZjctMTFkZi1iYzA5LTAwMDJhNWQ1YzUxYgogc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweGMyZTVkNWYwLCAweDk0YmQsIDB4NDc2MywgMHg5Y2FjLCB7MHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZX19LAogICAgICAgICB7MHgxZjBhZTJlMCwgMHg0ZWY3LCAweDExZGYsIDB4YmMwOSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgLy8gZmxhZ3Mgb3RoZXIgdGhhbiBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSBzZXQgZm9yIHRlc3QgcHVycG9zZQogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgfCBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCwKICAgICAgICAgMCwgLy8gVE9ETwogICAgICAgICAzMywKICAgICAgICAgIkF1eCBFbnZpcm9ubWVudGFsIFJldmVyYiIsCi0gICAgICAgICJHb29nbGUgSW5jLiIKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiCiB9OwogCiAvLyBHb29nbGUgaW5zZXJ0IGVudmlyb25tZW50YWwgcmV2ZXJiIFVVSUQ6IGFhNDc2MDQwLTYzNDItMTFkZi05MWE0LTAwMDJhNWQ1YzUxYgogc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweGMyZTVkNWYwLCAweDk0YmQsIDB4NDc2MywgMHg5Y2FjLCB7MHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZX19LAogICAgICAgICB7MHhhYTQ3NjA0MCwgMHg2MzQyLCAweDExZGYsIDB4OTFhNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QsCiAgICAgICAgIDAsIC8vIFRPRE8KICAgICAgICAgMzMsCiAgICAgICAgICJJbnNlcnQgRW52aXJvbm1lbnRhbCByZXZlcmIiLAotICAgICAgICAiR29vZ2xlIEluYy4iCisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IgogfTsKIAogLy8gR29vZ2xlIGF1eGlsaWFyeSBwcmVzZXQgcmV2ZXJiIFVVSUQ6IDYzOTA5MzIwLTUzYTYtMTFkZi1iZGJkLTAwMDJhNWQ1YzUxYgogc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eFByZXNldFJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICB7MHg2MzkwOTMyMCwgMHg1M2E2LCAweDExZGYsIDB4YmRiZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlksCiAgICAgICAgIDAsIC8vIFRPRE8KICAgICAgICAgMzMsCiAgICAgICAgICJBdXggUHJlc2V0IFJldmVyYiIsCi0gICAgICAgICJHb29nbGUgSW5jLiIKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiCiB9OwogCiAvLyBHb29nbGUgaW5zZXJ0IHByZXNldCByZXZlcmIgVVVJRDogZDkzZGM2YTAtNjM0Mi0xMWRmLWIxMjgtMDAwMmE1ZDVjNTFiCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIHsweGQ5M2RjNmEwLCAweDYzNDIsIDB4MTFkZiwgMHhiMTI4LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwKICAgICAgICAgMCwgLy8gVE9ETwogICAgICAgICAzMywKICAgICAgICAgIkluc2VydCBQcmVzZXQgUmV2ZXJiIiwKLSAgICAgICAgIkdvb2dsZSBJbmMuIgorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKIH07CiAKIC8vIGdEZXNjcmlwdG9ycyBjb250YWlucyBwb2ludGVycyB0byBhbGwgZGVmaW5lZCBlZmZlY3QgZGVzY3JpcHRvciBpbiB0aGlzIGxpYnJhcnkKQEAgLTExMiw3ICsxMTMsNyBAQAogaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwKICAgICAgICAgaW50MzJfdCBpb0lkLAotICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpIHsKKyAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKSB7CiAgICAgaW50IHJldDsKICAgICBpbnQgaTsKICAgICByZXZlcmJfbW9kdWxlX3QgKm1vZHVsZTsKQEAgLTEyMiw3ICsxMjMsNyBAQAogCiAgICAgTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0IHN0YXJ0Iik7CiAKLSAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMTU3LDcgKzE1OCw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KSBtb2R1bGU7CisgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KSBtb2R1bGU7CiAKICAgICBtb2R1bGUtPmNvbnRleHQubVN0YXRlID0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEOwogCkBAIC0xNjYsMTEgKzE2NywxMSBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKSB7Ci0gICAgcmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlID0gKHJldmVyYl9tb2R1bGVfdCAqKWludGVyZmFjZTsKK2ludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICByZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUgPSAocmV2ZXJiX21vZHVsZV90ICopaGFuZGxlOwogCi0gICAgTE9HVigiRWZmZWN0TGliUmVsZWFzZUVmZmVjdCAlcCIsIGludGVyZmFjZSk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBOVUxMKSB7CisgICAgTE9HVigiRWZmZWN0TGliUmVsZWFzZUVmZmVjdCAlcCIsIGhhbmRsZSk7CisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMTgwLDEwICsxODEsMzEgQEAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IEVmZmVjdEdldERlc2NyaXB0b3IoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaW50IGk7CisgICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7CisKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBpZiAobWVtY21wKHV1aWQsICZnRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnRGVzY3JpcHRvcnNbaV0sIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLAorICAgICAgICAgICAgICAgICBpLCBnRGVzY3JpcHRvcnNbaV0tPnV1aWQudGltZUxvdyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtRUlOVkFMOworfSAvKiBlbmQgRWZmZWN0R2V0RGVzY3JpcHRvciAqLwogCiAvKi0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KIAotc3RhdGljIGludCBSZXZlcmJfUHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKSB7CitzdGF0aWMgaW50IFJldmVyYl9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpIHsKICAgICByZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmI7CiAgICAgaW50MTZfdCAqcFNyYywgKnBEc3Q7CiAgICAgcmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlID0gKHJldmVyYl9tb2R1bGVfdCAqKXNlbGY7CkBAIC0yNzAsNyArMjkyLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IFJldmVyYl9Db21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAorc3RhdGljIGludCBSZXZlcmJfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKICAgICByZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUgPSAocmV2ZXJiX21vZHVsZV90ICopIHNlbGY7CiAgICAgcmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiOwpAQCAtMzgzLDYgKzQwNSwzOCBAQAogICAgIHJldHVybiAwOwogfQogCitpbnQgUmV2ZXJiX0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSA9IChyZXZlcmJfbW9kdWxlX3QgKikgc2VsZjsKKyAgICByZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmI7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKKworICAgIGlmIChwUnZiTW9kdWxlID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBSdmJNb2R1bGUtPmNvbnRleHQubVN0YXRlID09IFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBSZXZlcmIgPSAocmV2ZXJiX29iamVjdF90KikgJnBSdmJNb2R1bGUtPmNvbnRleHQ7CisKKyAgICBpZiAocFJldmVyYi0+bV9BdXgpIHsKKyAgICAgICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0KSB7CisgICAgICAgICAgICBkZXNjID0gJmdBdXhQcmVzZXRSZXZlcmJEZXNjcmlwdG9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzYyA9ICZnQXV4RW52UmV2ZXJiRGVzY3JpcHRvcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwUmV2ZXJiLT5tX1ByZXNldCkgeworICAgICAgICAgICAgZGVzYyA9ICZnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc2MgPSAmZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1jcHkocERlc2NyaXB0b3IsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisKKyAgICByZXR1cm4gMDsKK30gICAvKiBlbmQgUmV2ZXJiX2dldERlc2NyaXB0b3IgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBSZXZlcmIgaW50ZXJuYWwgZnVuY3Rpb25zCkBAIC00MTgsMTkgKzQ3MiwxOSBAQAogCiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIGlmIChhdXgpIHsKLSAgICAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9NT05POworICAgICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfU1RFUkVPOworICAgICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQotICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwotICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKLSAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwpAQCAtNDc0LDEzICs1MjgsMTMgQEAKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlCiAgICAgICAgICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUKICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzICE9IE9VVFBVVF9DSEFOTkVMUwotICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1Ci0gICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSB7CisgICAgICAgIHx8IHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgIExPR1YoIlJldmVyYl9Db25maWd1cmUgaW52YWxpZCBjb25maWciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotICAgIGlmICgocFJldmVyYi0+bV9BdXggJiYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfTU9OTykpIHx8Ci0gICAgICAgICghcFJldmVyYi0+bV9BdXggJiYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfU1RFUkVPKSkpIHsKKyAgICBpZiAoKHBSZXZlcmItPm1fQXV4ICYmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9NT05PKSkgfHwKKyAgICAgICAgKCFwUmV2ZXJiLT5tX0F1eCAmJiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkpIHsKICAgICAgICAgTE9HVigiUmV2ZXJiX0NvbmZpZ3VyZSBpbnZhbGlkIGNvbmZpZyIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0yMTMzLDMgKzIxODcsMTUgQEAKIAogICAgIHJldHVybiAwOwogfQorCithdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICAubmFtZSA9ICJUZXN0IEVxdWFsaXplciBMaWJyYXJ5IiwKKyAgICAuaW1wbGVtZW50b3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgLnF1ZXJ5X251bV9lZmZlY3RzID0gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzLAorICAgIC5xdWVyeV9lZmZlY3QgPSBFZmZlY3RRdWVyeUVmZmVjdCwKKyAgICAuY3JlYXRlX2VmZmVjdCA9IEVmZmVjdENyZWF0ZSwKKyAgICAucmVsZWFzZV9lZmZlY3QgPSBFZmZlY3RSZWxlYXNlLAorICAgIC5nZXRfZGVzY3JpcHRvciA9IEVmZmVjdEdldERlc2NyaXB0b3IsCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKaW5kZXggZGJjZDE5Mi4uYTIzOTgxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCkBAIC00MCw3ICs0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIAogI2RlZmluZSBOVU1fT1VUUFVUX0NIQU5ORUxTIDIKLSNkZWZpbmUgT1VUUFVUX0NIQU5ORUxTIENIQU5ORUxfU1RFUkVPCisjZGVmaW5lIE9VVFBVVF9DSEFOTkVMUyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KIAogI2RlZmluZSBSRVZFUkJfQlVGRkVSX1NJWkVfSU5fU0FNUExFU19NQVggICAxNjM4NAogCkBAIC0zMDYsMTkgKzMwNiwyMiBAQAogaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICplZmZlY3RVSUQsCiAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSk7Ci1pbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKTsKK2ludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpOworaW50IEVmZmVjdEdldERlc2NyaXB0b3IoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKIAotc3RhdGljIGludCBSZXZlcmJfUHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwKK3N0YXRpYyBpbnQgUmV2ZXJiX1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcik7Ci1zdGF0aWMgaW50IFJldmVyYl9Db21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLAorc3RhdGljIGludCBSZXZlcmJfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpOwotCitzdGF0aWMgaW50IFJldmVyYl9HZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIGludGVybmFsIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IGM5NTdkYmEuLjgwZDFmNjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTIzLDIxICsyMywyMiBAQAogI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmg+CiAKLW5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmlzdWFsaXplciBlZmZlY3QKLWV4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnVmlzdWFsaXplckludGVyZmFjZTsKK2V4dGVybiAiQyIgeworCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciB2aXN1YWxpemVyIGVmZmVjdAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ1Zpc3VhbGl6ZXJJbnRlcmZhY2U7CiAKIC8vIEdvb2dsZSBWaXN1YWxpemVyIFVVSUQ6IGQwNjlkOWUwLTgzMjktMTFkZi05MTY4LTAwMDJhNWQ1YzUxYgogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnVmlzdWFsaXplckRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweGU0NmIyNmEwLCAweGRkZGQsIDB4MTFkYiwgMHg4YWZkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB0eXBlCiAgICAgICAgIHsweGQwNjlkOWUwLCAweDgzMjksIDB4MTFkZiwgMHg5MTY4LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkCi0gICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCksCiAgICAgICAgIDAsIC8vIFRPRE8KICAgICAgICAgMSwKICAgICAgICAgIlZpc3VhbGl6ZXIiLAotICAgICAgICAiR29vZ2xlIEluYy4iLAorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCiB9OwogCiBlbnVtIHZpc3VhbGl6ZXJfc3RhdGVfZSB7CkBAIC05MCwxMCArOTEsMTAgQEAKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKICAgICBpZiAocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgJiYKICAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKIAogICAgIG1lbWNweSgmcENvbnRleHQtPm1Db25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKIApAQCAtMTE4LDE2ICsxMTksMTYgQEAKIGludCBWaXN1YWxpemVyX2luaXQoVmlzdWFsaXplckNvbnRleHQgKnBDb250ZXh0KQogewogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMTQ1LDEyICsxNDYsMTMgQEAKIC8vLS0tIEVmZmVjdCBMaWJyYXJ5IEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgeworaW50IFZpc3VhbGl6ZXJMaWJfUXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgewogICAgICpwTnVtRWZmZWN0cyA9IDE7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworaW50IFZpc3VhbGl6ZXJMaWJfUXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewogICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTE2MSwxNCArMTYzLDE0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwKLSAgICAgICAgaW50MzJfdCBpb0lkLAotICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpIHsKK2ludCBWaXN1YWxpemVyTGliX0NyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpIHsKICAgICBpbnQgcmV0OwogICAgIGludCBpOwogCi0gICAgaWYgKHBJbnRlcmZhY2UgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKKyAgICBpZiAocEhhbmRsZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTE4MywyNSArMTg1LDI1IEBACiAKICAgICByZXQgPSBWaXN1YWxpemVyX2luaXQocENvbnRleHQpOwogICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIExPR1coIkVmZmVjdENyZWF0ZSgpIGluaXQgZmFpbGVkIik7CisgICAgICAgIExPR1coIlZpc3VhbGl6ZXJMaWJfQ3JlYXRlKCkgaW5pdCBmYWlsZWQiKTsKICAgICAgICAgZGVsZXRlIHBDb250ZXh0OwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKyAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CiAKICAgICBwQ29udGV4dC0+bVN0YXRlID0gVklTVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRDsKIAotICAgIExPR1YoIkVmZmVjdENyZWF0ZSAlcCIsIHBDb250ZXh0KTsKKyAgICBMT0dWKCJWaXN1YWxpemVyTGliX0NyZWF0ZSAlcCIsIHBDb250ZXh0KTsKIAogICAgIHJldHVybiAwOwogCiB9CiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSkgewotICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKilpbnRlcmZhY2U7CitpbnQgVmlzdWFsaXplckxpYl9SZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBWaXN1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKFZpc3VhbGl6ZXJDb250ZXh0ICopaGFuZGxlOwogCi0gICAgTE9HVigiRWZmZWN0UmVsZWFzZSAlcCIsIGludGVyZmFjZSk7CisgICAgTE9HVigiVmlzdWFsaXplckxpYl9SZWxlYXNlICVwIiwgaGFuZGxlKTsKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0yMTEsNiArMjEzLDIyIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK2ludCBWaXN1YWxpemVyTGliX0dldERlc2NyaXB0b3IoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlZpc3VhbGl6ZXJMaWJfR2V0RGVzY3JpcHRvcigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKHV1aWQsICZnVmlzdWFsaXplckRlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgIG1lbWNweShwRGVzY3JpcHRvciwgJmdWaXN1YWxpemVyRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuICAtRUlOVkFMOworfSAvKiBlbmQgVmlzdWFsaXplckxpYl9HZXREZXNjcmlwdG9yICovCisKIC8vCiAvLy0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KIC8vCkBAIC0yMjIsMTAgKzI0MCwxMCBAQAogICAgIHJldHVybiBzYW1wbGU7CiB9CiAKLWV4dGVybiAiQyIgaW50IFZpc3VhbGl6ZXJfcHJvY2VzcygKLSAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQoraW50IFZpc3VhbGl6ZXJfcHJvY2VzcygKKyAgICAgICAgZWZmZWN0X2hhbmRsZV90IHNlbGYsYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQogewotICAgIGFuZHJvaWQ6OlZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKilzZWxmOworICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKilzZWxmOwogCiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0yNDQsNyArMjYyLDcgQEAKICAgICAvLyB0aGlzIGdpdmVzIG1vcmUgaW50ZXJlc3RpbmcgY2FwdHVyZXMgZm9yIGRpc3BsYXkuCiAgICAgaW50MzJfdCBzaGlmdCA9IDMyOwogICAgIGludCBsZW4gPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgaW50MzJfdCBzbXAgPSBpbkJ1ZmZlci0+czE2W2ldOwogICAgICAgICBpZiAoc21wIDwgMCkgc21wID0gLXNtcCAtIDE7IC8vIHRha2UgY2FyZSB0byBrZWVwIHRoZSBtYXggbmVnYXRpdmUgaW4gcmFuZ2UKICAgICAgICAgaW50MzJfdCBjbHogPSBfX2J1aWx0aW5fY2x6KHNtcCk7CkBAIC0yOTMsMTAgKzMxMSwxMCBAQAogICAgIHJldHVybiAwOwogfSAgIC8vIGVuZCBWaXN1YWxpemVyX3Byb2Nlc3MKIAotZXh0ZXJuICJDIiBpbnQgVmlzdWFsaXplcl9jb21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAoraW50IFZpc3VhbGl6ZXJfY29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKIAotICAgIGFuZHJvaWQ6OlZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKilzZWxmOworICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKilzZWxmOwogICAgIGludCByZXRzaXplOwogCiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcENvbnRleHQtPm1TdGF0ZSA9PSBWSVNVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKQEAgLTQxMiwxMSArNDMwLDQwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHZpc3VhbGl6ZXIgZWZmZWN0CisvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IGdldF9kZXNjcmlwdG9yICovCitpbnQgVmlzdWFsaXplcl9nZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKK3sKKyAgICBWaXN1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKFZpc3VhbGl6ZXJDb250ZXh0ICopIHNlbGY7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIExPR1YoIlZpc3VhbGl6ZXJfZ2V0RGVzY3JpcHRvcigpIGludmFsaWQgcGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ1Zpc3VhbGl6ZXJEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworCisgICAgcmV0dXJuIDA7Cit9ICAgLyogZW5kIFZpc3VhbGl6ZXJfZ2V0RGVzY3JpcHRvciAqLworCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciB2aXN1YWxpemVyIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnVmlzdWFsaXplckludGVyZmFjZSA9IHsKICAgICAgICAgVmlzdWFsaXplcl9wcm9jZXNzLAotICAgICAgICBWaXN1YWxpemVyX2NvbW1hbmQKKyAgICAgICAgVmlzdWFsaXplcl9jb21tYW5kLAorICAgICAgICBWaXN1YWxpemVyX2dldERlc2NyaXB0b3IKIH07CiAKLX0gLy8gbmFtZXNwYWNlCiAKK2F1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CisgICAgdGFnIDogQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgIHZlcnNpb24gOiBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICBuYW1lIDogIlZpc3VhbGl6ZXIgTGlicmFyeSIsCisgICAgaW1wbGVtZW50b3IgOiAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgcXVlcnlfbnVtX2VmZmVjdHMgOiBWaXN1YWxpemVyTGliX1F1ZXJ5TnVtYmVyRWZmZWN0cywKKyAgICBxdWVyeV9lZmZlY3QgOiBWaXN1YWxpemVyTGliX1F1ZXJ5RWZmZWN0LAorICAgIGNyZWF0ZV9lZmZlY3QgOiBWaXN1YWxpemVyTGliX0NyZWF0ZSwKKyAgICByZWxlYXNlX2VmZmVjdCA6IFZpc3VhbGl6ZXJMaWJfUmVsZWFzZSwKKyAgICBnZXRfZGVzY3JpcHRvciA6IFZpc3VhbGl6ZXJMaWJfR2V0RGVzY3JpcHRvciwKK307CisKK307IC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAppbmRleCBhMDQzMzI5Li44ZDk4OTAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCkBAIC0zOTgsMjAgKzM5OCw2IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQotewotICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFmLT5sb2FkRWZmZWN0TGlicmFyeShsaWJQYXRoLCBoYW5kbGUpOwotfQotCi1zdGF0dXNfdCBBdWRpb0VmZmVjdDo6dW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKQotewotICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFmLT51bmxvYWRFZmZlY3RMaWJyYXJ5KGhhbmRsZSk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKaW5kZXggNDQ2ZTNkZi4uYTQxZDdhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcApAQCAtODgsNyArODgsNyBAQAogICAgICAgICBpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBjYWxsYmFja190IGNiZiwKQEAgLTk3LDcgKzk3LDcgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoMCkKIHsKLSAgICBtU3RhdHVzID0gc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLAorICAgIG1TdGF0dXMgPSBzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsIHNlc3Npb25JZCk7CiB9CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgICAgICBpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBjYWxsYmFja190IGNiZiwKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAgICBpbnQgc2Vzc2lvbklkKQogewogCi0gICAgTE9HVigic2V0KCk6IHNhbXBsZVJhdGUgJWQsIGNoYW5uZWxzICVkLCBmcmFtZUNvdW50ICVkIixzYW1wbGVSYXRlLCBjaGFubmVscywgZnJhbWVDb3VudCk7CisgICAgTE9HVigic2V0KCk6IHNhbXBsZVJhdGUgJWQsIGNoYW5uZWxNYXNrICVkLCBmcmFtZUNvdW50ICVkIixzYW1wbGVSYXRlLCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCk7CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAKQEAgLTE1NiwxNCArMTU2LDE0IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxzKSkgeworICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpbnQgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbHMpOworICAgIGludCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChjaGFubmVsTWFzayk7CiAKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dChpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbHMsIChhdWRpb19pbl9hY291c3RpY3NfdClmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCAoYXVkaW9faW5fYWNvdXN0aWNzX3QpZmxhZ3MpOwogICAgIGlmIChpbnB1dCA9PSAwKSB7CiAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gaW5wdXQgZm9yIHJlY29yZCBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0xOTAsNyArMTkwLDcgQEAKICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKLSAgICBzdGF0dXMgPSBvcGVuUmVjb3JkX2woc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQsCisgICAgc3RhdHVzID0gb3BlblJlY29yZF9sKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgaW5wdXQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTIwOSw3ICsyMDksNyBAQAogICAgIC8vIFVwZGF0ZSBidWZmZXIgc2l6ZSBpbiBjYXNlIGl0IGhhcyBiZWVuIGxpbWl0ZWQgYnkgQXVkaW9GbGluZ2VyIGR1cmluZyB0cmFjayBjcmVhdGlvbgogICAgIG1GcmFtZUNvdW50ID0gbUNibGstPmZyYW1lQ291bnQ7CiAgICAgbUNoYW5uZWxDb3VudCA9ICh1aW50OF90KWNoYW5uZWxDb3VudDsKLSAgICBtQ2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKICAgICBtQWN0aXZlID0gMDsKICAgICBtQ2JmID0gY2JmOwogICAgIG1Ob3RpZmljYXRpb25GcmFtZXMgPSBub3RpZmljYXRpb25GcmFtZXM7CkBAIC0zMTUsOSArMzE1LDkgQEAKICAgICAgICAgICAgIGNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9SVU5fVElNRU9VVF9NUzsKICAgICAgICAgICAgIGNibGstPndhaXRUaW1lTXMgPSAwOwogICAgICAgICAgICAgaWYgKHQgIT0gMCkgewotICAgICAgICAgICAgICAgdC0+cnVuKCJDbGllbnRSZWNvcmRUaHJlYWQiLCBUSFJFQURfUFJJT1JJVFlfQVVESU9fQ0xJRU5UKTsKKyAgICAgICAgICAgICAgIHQtPnJ1bigiQ2xpZW50UmVjb3JkVGhyZWFkIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgVEhSRUFEX1BSSU9SSVRZX0FVRElPX0NMSUVOVCk7CisgICAgICAgICAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1BY3RpdmUgPSAwOwpAQCAtNDM3LDggKzQzNyw4IEBACiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpvcGVuUmVjb3JkX2woCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCkBAIC00NTEsNyArNDUxLDcgQEAKIAogICAgIHNwPElBdWRpb1JlY29yZD4gcmVjb3JkID0gYXVkaW9GbGluZ2VyLT5vcGVuUmVjb3JkKGdldHBpZCgpLCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdClmbGFncykgPDwgMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCkBAIC01ODksNyArNTg5LDcgQEAKIHsKICAgICBtSW5wdXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQobUlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19pbl9hY291c3RpY3NfdCltRmxhZ3MpOwogICAgIHJldHVybiBtSW5wdXQ7CiB9CkBAIC03NTYsNyArNzU2LDcgQEAKICAgICAgICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9SZWNvcmQgaXMgY3JlYXRlZCwgb3BlblJlY29yZF9sKCkgd2lsbCBtb2RpZnkgdGhlCiAgICAgICAgIC8vIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOiBtQXVkaW9SZWNvcmQsIG1DYmxrTWVtb3J5IGFuZCBtQ2Jsay4KICAgICAgICAgLy8gSXQgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgc3Ryb25nIHJlZmVyZW5jZXMgb24gcHJldmlvdXMgSUF1ZGlvUmVjb3JkIGFuZCBJTWVtb3J5Ci0gICAgICAgIHJlc3VsdCA9IG9wZW5SZWNvcmRfbChjYmxrLT5zYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbENvdW50LAorICAgICAgICByZXN1bHQgPSBvcGVuUmVjb3JkX2woY2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtRmxhZ3MsIGdldElucHV0X2woKSk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCA4YTE4MGQ4Li42Y2IzODQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC0yNiwxMyArMjYsNiBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB0aGUgc2ltIGJ1aWxkIGRvZXNuJ3QgaGF2ZSBnZXR0aWQKLQotI2lmbmRlZiBIQVZFX0dFVFRJRAotIyBkZWZpbmUgZ2V0dGlkIGdldHBpZAotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCmluZGV4IDc1MjBlZDkuLjZiNDM5MWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbHMsCisgICAgICAgIGludCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBjYWxsYmFja190IGNiZiwKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCkKIHsKLSAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbHMsCisgICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgMCwgZmFsc2UsIHNlc3Npb25JZCk7CiB9CkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVscywKKyAgICAgICAgaW50IGNoYW5uZWxNYXNrLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCkKIHsKLSAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbHMsCisgICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgMCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgc2hhcmVkQnVmZmVyLCBmYWxzZSwgc2Vzc2lvbklkKTsKIH0KQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxzLAorICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC0xODAsOCArMTgwLDggQEAKICAgICBpZiAoZm9ybWF0ID09IDApIHsKICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfQotICAgIGlmIChjaGFubmVscyA9PSAwKSB7Ci0gICAgICAgIGNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIGlmIChjaGFubmVsTWFzayA9PSAwKSB7CisgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgIH0KIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKQEAgLTE5NSwxNSArMTk1LDE1IEBACiAgICAgICAgIGZsYWdzIHw9IEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19ESVJFQ1Q7CiAgICAgfQogCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVscykpIHsKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewogICAgICAgICBMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChjaGFubmVscyk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwogCiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLGZvcm1hdCwgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fcG9saWN5X291dHB1dF9mbGFnc190KWZsYWdzKTsKIAogICAgIGlmIChvdXRwdXQgPT0gMCkgewpAQCAtMjIyLDggKzIyMiw4IEBACiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9UcmFjawogICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCkBAIC0yNDUsOCArMjQ1LDggQEAKICAgICBtU3RhdHVzID0gTk9fRVJST1I7CiAKICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICBtQ2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBtRm9ybWF0ID0gKHVpbnQzMl90KWZvcm1hdDsKKyAgICBtQ2hhbm5lbE1hc2sgPSAodWludDMyX3QpY2hhbm5lbE1hc2s7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKICAgICBtU2hhcmVkQnVmZmVyID0gc2hhcmVkQnVmZmVyOwogICAgIG1NdXRlZCA9IGZhbHNlOwpAQCAtMzQyLDkgKzM0Miw5IEBACiAgICAgICAgIGNibGstPndhaXRUaW1lTXMgPSAwOwogICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRURfT04sICZjYmxrLT5mbGFncyk7CiAgICAgICAgIGlmICh0ICE9IDApIHsKLSAgICAgICAgICAgdC0+cnVuKCJBdWRpb1RyYWNrVGhyZWFkIiwgVEhSRUFEX1BSSU9SSVRZX0FVRElPX0NMSUVOVCk7CisgICAgICAgICAgIHQtPnJ1bigiQXVkaW9UcmFja1RocmVhZCIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBUSFJFQURfUFJJT1JJVFlfQVVESU9fQ0xJRU5UKTsKKyAgICAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgICAgIH0KIAogICAgICAgICBMT0dWKCJzdGFydCAlcCBiZWZvcmUgbG9jayBjYmxrICVwIiwgdGhpcywgbUNibGspOwpAQCAtNjgxLDcgKzY4MSw3IEBACiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXRfbCgpCiB7CiAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxzLCAoYXVkaW9fcG9saWN5X291dHB1dF9mbGFnc190KW1GbGFncyk7CisgICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCAoYXVkaW9fcG9saWN5X291dHB1dF9mbGFnc190KW1GbGFncyk7CiB9CiAKIGludCBBdWRpb1RyYWNrOjpnZXRTZXNzaW9uSWQoKQpAQCAtNzA1LDggKzcwNSw4IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpjcmVhdGVUcmFja19sKAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtNzY3LDYgKzc2Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgYWxpZ25tZW50IG1hdGNoZXMgY2hhbm5lbGNvdW50CisgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgaWYgKCgodWludDMyX3Qpc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgJiAoY2hhbm5lbENvdW50IHwgMSkpICE9IDApIHsKICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGJ1ZmZlciBhbGlnbmVtZW50OiBhZGRyZXNzICVwLCBjaGFubmVsQ291bnQgJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgY2hhbm5lbENvdW50KTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNzc5LDcgKzc4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpZmxhZ3MpIDw8IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyLApAQCAtMTE2NCw3ICsxMTY1LDcgQEAKICAgICAgICAgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbChtU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5zYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGVlYzQ3YzAuLjRhMTI5NjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC02Myw4ICs2Myw2IEBACiAgICAgR0VUX1JFTkRFUl9QT1NJVElPTiwKICAgICBHRVRfSU5QVVRfRlJBTUVTX0xPU1QsCiAgICAgTkVXX0FVRElPX1NFU1NJT05fSUQsCi0gICAgTE9BRF9FRkZFQ1RfTElCUkFSWSwKLSAgICBVTkxPQURfRUZGRUNUX0xJQlJBUlksCiAgICAgUVVFUllfTlVNX0VGRkVDVFMsCiAgICAgUVVFUllfRUZGRUNULAogICAgIEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiwKQEAgLTg0LDggKzgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtMTAwLDcgKzk4LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbVR5cGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbENvdW50KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZyYW1lQ291bnQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNoYXJlZEJ1ZmZlci0+YXNCaW5kZXIoKSk7CkBAIC0xMzEsOCArMTI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCkBAIC0xNDUsNyArMTQzLDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKGlucHV0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxDb3VudCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUNvdW50KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgaW50IGxTZXNzaW9uSWQgPSAwOwpAQCAtMTg4LDcgKzE4Niw3IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGludCBmb3JtYXQoaW50IG91dHB1dCkgY29uc3QKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZvcm1hdChpbnQgb3V0cHV0KSBjb25zdAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTUyOCwzNyArNTI2LDYgQEAKICAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9hZEVmZmVjdExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpCi0gICAgewotICAgICAgICBpZiAobGliUGF0aCA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgICpoYW5kbGUgPSAwOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhsaWJQYXRoKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExPQURfRUZGRUNUX0xJQlJBUlksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICpoYW5kbGUgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChVTkxPQURfRUZGRUNUX0xJQlJBUlksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC05NTIsMjEgKzkxOSw2IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihuZXdBdWRpb1Nlc3Npb25JZCgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBMT0FEX0VGRkVDVF9MSUJSQVJZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGhhbmRsZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxvYWRFZmZlY3RMaWJyYXJ5KGRhdGEucmVhZENTdHJpbmcoKSwgJmhhbmRsZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBVTkxPQURfRUZGRUNUX0xJQlJBUlk6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih1bmxvYWRFZmZlY3RMaWJyYXJ5KGRhdGEucmVhZEludDMyKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQogICAgICAgICBjYXNlIFFVRVJZX05VTV9FRkZFQ1RTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgdWludDMyX3QgbnVtRWZmZWN0czsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCBlYmU4MjFmLi4wNzE1MmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0zMCwyNiArMzAsNiBAQAogLy8gZm9yZWdyb3VuZCB0aHJlYWQuCiAjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSwogCi0vKiBkZXNrdG9wIExpbnV4IG5lZWRzIGEgbGl0dGxlIGhlbHAgd2l0aCBnZXR0aWQoKSAqLwotI2lmIGRlZmluZWQoSEFWRV9HRVRUSUQpICYmICFkZWZpbmVkKEhBVkVfQU5EUk9JRF9PUykKLSNkZWZpbmUgX19LRVJORUxfXwotIyBpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpZmRlZiBfc3lzY2FsbDAKLV9zeXNjYWxsMChwaWRfdCxnZXR0aWQpCi0jZWxzZQotcGlkX3QgZ2V0dGlkKCkgeyByZXR1cm4gc3lzY2FsbChfX05SX2dldHRpZCk7fQotI2VuZGlmCi0jdW5kZWYgX19LRVJORUxfXwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbXlUaWQoKSB7Ci0jaWZkZWYgSEFWRV9HRVRUSUQKLSAgICByZXR1cm4gZ2V0dGlkKCk7Ci0jZWxzZQotICAgIHJldHVybiBnZXRwaWQoKTsKLSNlbmRpZgotfQotCiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJJTWVkaWFNZXRhZGF0YVJldHJpZXZlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTYwLDE4ICs0MCwxOCBAQAogc3RhdGljIHZvaWQgc2VuZFNjaGVkUG9saWN5KFBhcmNlbCYgZGF0YSkKIHsKICAgICBTY2hlZFBvbGljeSBwb2xpY3k7Ci0gICAgZ2V0X3NjaGVkX3BvbGljeShteVRpZCgpLCAmcG9saWN5KTsKKyAgICBnZXRfc2NoZWRfcG9saWN5KGdldHRpZCgpLCAmcG9saWN5KTsKICAgICBkYXRhLndyaXRlSW50MzIocG9saWN5KTsKIH0KIAogc3RhdGljIHZvaWQgc2V0U2NoZWRQb2xpY3koY29uc3QgUGFyY2VsJiBkYXRhKQogewogICAgIFNjaGVkUG9saWN5IHBvbGljeSA9IChTY2hlZFBvbGljeSkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICBzZXRfc2NoZWRfcG9saWN5KG15VGlkKCksIHBvbGljeSk7CisgICAgc2V0X3NjaGVkX3BvbGljeShnZXR0aWQoKSwgcG9saWN5KTsKIH0KIHN0YXRpYyB2b2lkIHJlc3RvcmVTY2hlZFBvbGljeSgpCiB7Ci0gICAgc2V0X3NjaGVkX3BvbGljeShteVRpZCgpLCBTUF9GT1JFR1JPVU5EKTsKKyAgICBzZXRfc2NoZWRfcG9saWN5KGdldHRpZCgpLCBTUF9GT1JFR1JPVU5EKTsKIH0KIH07IC8vIGVuZCBuYW1lc3BhY2UgYW5kcm9pZAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAppbmRleCA4ODE1N2QyLi44Yjk1M2UwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKQEAgLTIzLDEzICsyMyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvSmV0UGxheWVyLmg+CiAKIAotI2lmZGVmIEhBVkVfR0VUVElECi1zdGF0aWMgcGlkX3QgbXlUaWQoKSB7IHJldHVybiBnZXR0aWQoKTsgfQotI2Vsc2UKLXN0YXRpYyBwaWRfdCBteVRpZCgpIHsgcmV0dXJuIGdldHBpZCgpOyB9Ci0jZW5kaWYKLQotCiBuYW1lc3BhY2UgYW5kcm9pZAogewogCkBAIC0xODgsNyArMTgxLDcgQEAKICAgICAvLyBzaWduYWwgbWFpbiB0aHJlYWQgdGhhdCB3ZSBzdGFydGVkCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgICAgICBtVGlkID0gbXlUaWQoKTsKKyAgICAgICAgbVRpZCA9IGdldHRpZCgpOwogICAgICAgICBMT0dWKCJKZXRQbGF5ZXI6OnJlbmRlcigpOiByZW5kZXIgdGhyZWFkKCVkKSBzaWduYWwiLCBtVGlkKTsKICAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGQ1MWM5NDYuLjU0YTY1NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC02OCwxOCArNjgsNiBAQAogCiAjaW5jbHVkZSA8T01YLmg+CiAKLS8qIGRlc2t0b3AgTGludXggbmVlZHMgYSBsaXR0bGUgaGVscCB3aXRoIGdldHRpZCgpICovCi0jaWYgZGVmaW5lZChIQVZFX0dFVFRJRCkgJiYgIWRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotI2RlZmluZSBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2lmZGVmIF9zeXNjYWxsMAotX3N5c2NhbGwwKHBpZF90LGdldHRpZCkKLSNlbHNlCi1waWRfdCBnZXR0aWQoKSB7IHJldHVybiBzeXNjYWxsKF9fTlJfZ2V0dGlkKTt9Ci0jZW5kaWYKLSN1bmRlZiBfX0tFUk5FTF9fCi0jZW5kaWYKLQogbmFtZXNwYWNlIHsKIHVzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZXRhZGF0YTsKIHVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwpAQCAtMzg3LDE0ICszNzUsNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdGljIGludCBteVRpZCgpIHsKLSNpZmRlZiBIQVZFX0dFVFRJRAotICAgIHJldHVybiBnZXR0aWQoKTsKLSNlbHNlCi0gICAgcmV0dXJuIGdldHBpZCgpOwotI2VuZGlmCi19Ci0KIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC00MjYsNyArNDA2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgbXlUaWQoKSk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBnZXR0aWQoKSk7CiAgICAgICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7CiAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKQEAgLTQ0NiwxMyArNDI2LDEzIEBACiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgICAgICB9CiAKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBteVRpZCgpKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXR0aWQoKSk7CiAgICAgICAgIERJUiAqZCA9IG9wZW5kaXIoYnVmZmVyKTsKICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKICAgICAgICAgICAgIHdoaWxlKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgewotICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIG15VGlkKCksIGVudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXR0aWQoKSwgZW50LT5kX25hbWUpOwogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOwogICAgICAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKQEAgLTExNjQsNyArMTE0NCw3IEBACiAgICAgbWVtID0gbmV3IE1lbW9yeUJhc2UoY2FjaGUtPmdldEhlYXAoKSwgMCwgY2FjaGUtPnNpemUoKSk7CiAgICAgKnBTYW1wbGVSYXRlID0gY2FjaGUtPnNhbXBsZVJhdGUoKTsKICAgICAqcE51bUNoYW5uZWxzID0gY2FjaGUtPmNoYW5uZWxDb3VudCgpOwotICAgICpwRm9ybWF0ID0gY2FjaGUtPmZvcm1hdCgpOworICAgICpwRm9ybWF0ID0gKGludCljYWNoZS0+Zm9ybWF0KCk7CiAgICAgTE9HVigicmV0dXJuIG1lbW9yeSBAICVwLCBzYW1wbGVSYXRlPSV1LCBjaGFubmVsQ291bnQgPSAlZCwgZm9ybWF0ID0gJWQiLCBtZW0tPnBvaW50ZXIoKSwgKnBTYW1wbGVSYXRlLCAqcE51bUNoYW5uZWxzLCAqcEZvcm1hdCk7CiAKIEV4aXQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAppbmRleCA4Zjc3NmI0Li4wNmZiMTAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKQEAgLTQwLDE4ICs0MCw2IEBACiAjaW5jbHVkZSAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgiCiAKLS8qIGRlc2t0b3AgTGludXggbmVlZHMgYSBsaXR0bGUgaGVscCB3aXRoIGdldHRpZCgpICovCi0jaWYgZGVmaW5lZChIQVZFX0dFVFRJRCkgJiYgIWRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotI2RlZmluZSBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2lmZGVmIF9zeXNjYWxsMAotX3N5c2NhbGwwKHBpZF90LGdldHRpZCkKLSNlbHNlCi1waWRfdCBnZXR0aWQoKSB7IHJldHVybiBzeXNjYWxsKF9fTlJfZ2V0dGlkKTt9Ci0jZW5kaWYKLSN1bmRlZiBfX0tFUk5FTF9fCi0jZW5kaWYKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBleHRlcm4gcGxheWVyX3R5cGUgZ2V0UGxheWVyVHlwZShjb25zdCBjaGFyKiB1cmwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKaW5kZXggNTg5YzYyNS4uN2UwNDUyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCkBAIC0yOSwxNyArMjksMTIgQEAKICNpbmNsdWRlIDxsaWJzb25pdm94L2Vhc19yZXZlcmIuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJNaWRpRmlsZS5oIgogCi0jaWZkZWYgSEFWRV9HRVRUSUQKLXN0YXRpYyBwaWRfdCBteVRpZCgpIHsgcmV0dXJuIGdldHRpZCgpOyB9Ci0jZWxzZQotc3RhdGljIHBpZF90IG15VGlkKCkgeyByZXR1cm4gZ2V0cGlkKCk7IH0KLSNlbmRpZgotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQ1NSw3ICs0NTAsNyBAQAogICAgIC8vIHNpZ25hbCBtYWluIHRocmVhZCB0aGF0IHdlIHN0YXJ0ZWQKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgICAgIG1UaWQgPSBteVRpZCgpOworICAgICAgICBtVGlkID0gZ2V0dGlkKCk7CiAgICAgICAgIExPR1YoInJlbmRlciB0aHJlYWQoJWQpIHNpZ25hbCIsIG1UaWQpOwogICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IDY0MmIzYTMuLmQ2MjgzMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtODg4LDggKzg4OCw2IEBACiAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogICAgIENIRUNLX0VRKChpbnQpZm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCwgKGludClPTVhfVklERU9fQ29kaW5nVW51c2VkKTsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDA7Ci0KICAgICBDSEVDSyhmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIKICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcgogICAgICAgICAgICB8fCBmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRDYllDclkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggM2QyNzBmODkuLjNhNThkM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC02MzQsNiArNjM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IENBQ0hFX1VOREVSUlVOOwogICAgICAgICAgICAgICAgICAgICBwYXVzZV9sKCk7CiAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNhY2hlSXNGZXRjaGluZ19sKCk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZERhdGFSZW1haW5pbmcgPiBrSGlnaFdhdGVyTWFya0J5dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewpAQCAtNjkyLDYgKzY5Myw3IEBACiAgICAgICAgICAgICBtRmxhZ3MgfD0gQ0FDSEVfVU5ERVJSVU47CiAgICAgICAgICAgICBwYXVzZV9sKCk7CiAgICAgICAgICAgICBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOworICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQpOwogICAgICAgICB9IGVsc2UgaWYgKGVvcyB8fCBjYWNoZWREdXJhdGlvblVzID4gaGlnaFdhdGVyTWFya1VzKSB7CiAgICAgICAgICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKQEAgLTcxMSw2ICs3MTMsMTggQEAKICAgICBwb3N0QnVmZmVyaW5nRXZlbnRfbCgpOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNlbmRDYWNoZVN0YXRzKCkgeworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMICYmIG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IGticHMgPSAwOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ2FjaGVkU291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKCZrYnBzKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudCgKKyAgICAgICAgICAgICAgICBNRURJQV9JTkZPLCBNRURJQV9JTkZPX05FVFdPUktfQkFORFdJRFRILCBrYnBzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBBd2Vzb21lUGxheWVyOjpvblN0cmVhbURvbmUoKSB7CiAgICAgLy8gUG9zdGVkIHdoZW5ldmVyIGFueSBzdHJlYW0gZmluaXNoZXMgcGxheWluZy4KIApAQCAtMjA4Myw2ICsyMDk3LDEwIEBACiAKICAgICAgICAgICAgIHJldHVybiBtVGV4dFBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBLRVlfUEFSQU1FVEVSX0NBQ0hFX1NUQVRfQ09MTEVDVF9GUkVRX01TOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEocmVxdWVzdCk7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMjA5MCw2ICsyMTA4LDE2IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgZnJlcU1zID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgTE9HRCgiUmVxdWVzdCB0byBrZWVwIGNhY2hlIHN0YXRzIGluIHRoZSBwYXN0ICVkIG1zIiwKKyAgICAgICAgICAgIGZyZXFNcyk7CisgICAgICAgIHJldHVybiBtQ2FjaGVkU291cmNlLT5zZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShmcmVxTXMpOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmluZGV4IDU4YjE3YTcuLmMwYWUyOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhUVFBCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCiAjaWYgQ0hST01JVU1fQVZBSUxBQkxFCkBAIC0yMiwxMSArMjYsMTkgQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1IVFRQQmFzZTo6SFRUUEJhc2UoKSB7fQorSFRUUEJhc2U6OkhUVFBCYXNlKCkKKyAgICA6IG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMoMCksCisgICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcygwKSwKKyAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCksCisgICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMoMCksCisgICAgICBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHMoMCksCisgICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSB7Cit9CiAKIC8vIHN0YXRpYwogc3A8SFRUUEJhc2U+IEhUVFBCYXNlOjpDcmVhdGUodWludDMyX3QgZmxhZ3MpIHsKQEAgLTQyLDQgKzU0LDY5IEBACiAgICAgfQogfQogCit2b2lkIEhUVFBCYXNlOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKKyAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQmFuZHdpZHRoRW50cnkgZW50cnk7CisgICAgZW50cnkubURlbGF5VXMgPSBkZWxheVVzOworICAgIGVudHJ5Lm1OdW1CeXRlcyA9IG51bUJ5dGVzOworICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzICs9IGRlbGF5VXM7CisgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyArPSBudW1CeXRlczsKKworICAgIG1CYW5kd2lkdGhIaXN0b3J5LnB1c2hfYmFjayhlbnRyeSk7CisgICAgaWYgKCsrbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA+IDEwMCkgeworICAgICAgICBCYW5kd2lkdGhFbnRyeSAqZW50cnkgPSAmKm1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCk7CisgICAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzIC09IGVudHJ5LT5tRGVsYXlVczsKKyAgICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyAtPSBlbnRyeS0+bU51bUJ5dGVzOworICAgICAgICBtQmFuZHdpZHRoSGlzdG9yeS5lcmFzZShtQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpKTsKKyAgICAgICAgLS1tTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOworCisgICAgICAgIGludDY0X3QgdGltZU5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgaWYgKHRpbWVOb3dVcyAtIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcyA+PQorICAgICAgICAgICAgICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zICogMTAwMExMKSB7CisKKyAgICAgICAgICAgIGlmIChtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwcyA9CisgICAgICAgICAgICAgICAgICAgIChtVG90YWxUcmFuc2ZlckJ5dGVzICogOEUzIC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzID0gdGltZU5vd1VzOworICAgICAgICB9CisgICAgfQorCit9CisKK2Jvb2wgSFRUUEJhc2U6OmVzdGltYXRlQmFuZHdpZHRoKGludDMyX3QgKmJhbmR3aWR0aF9icHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPCAyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqYmFuZHdpZHRoX2JwcyA9ICgoZG91YmxlKW1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTYgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgSFRUUEJhc2U6OmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2JwcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgKmticHMgPSBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIVFRQQmFzZTo6c2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChmcmVxTXMgPCBrTWluQmFuZHdpZHRoQ29sbGVjdEZyZXFNcworICAgICAgICAgICAgfHwgZnJlcU1zID4ga01heEJhbmR3aWR0aENvbGxlY3RGcmVxTXMpIHsKKworICAgICAgICBMT0dFKCJmcmVxdWVuY3kgKCVkIG1zKSBpcyBvdXQgb2YgcmFuZ2UgWzEwMDAsIDYwMDAwXSIsIGZyZXFNcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTE9HSSgiZnJlcXVlbmN5IHNldCB0byAlZCBtcyIsIGZyZXFNcyk7CisgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMgPSBmcmVxTXM7CisgICAgcmV0dXJuIE9LOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IGY2YThiMTcuLmQwZjY3MzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTI4NjIsOCArMjg2Miw4IEBACiAgICAgICogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgYW55IHVzZXIgZGF0YSBzdGFydAogICAgICAqIHdpdGggIlwweEE5IiwgbXVzdCBiZSBmb2xsb3dlZCBieSBpdHMgYXNzb2ljYXRlZAogICAgICAqIGxhbmd1YWdlIGNvZGUuCi0gICAgICogMHgwMDEyOiBsb2NhbGUgZW4KLSAgICAgKiAweDE1Yzc6IGxhbmd1YWdlIDU1NzUKKyAgICAgKiAweDAwMTI6IHRleHQgc3RyaW5nIGxlbmd0aAorICAgICAqIDB4MTVjNzogbGFuZyAobG9jYWxlKSBjb2RlOiBlbgogICAgICAqLwogICAgIHdyaXRlSW50MzIoMHgwMDEyMTVjNyk7CiAgICAgd3JpdGVMYXRpdHVkZShtTGF0aXR1ZGV4MTAwMDApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggODFmMmU0Ny4uNzdhNjYwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjAxLDYgKzIwMiwyMiBAQAogICAgIG1DYWNoZSA9IE5VTEw7CiB9CiAKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKSB7CisgICAgaWYgKG1Tb3VyY2UtPmZsYWdzKCkgJiBrSXNIVFRQQmFzZWRTb3VyY2UpIHsKKyAgICAgICAgSFRUUEJhc2UqIHNvdXJjZSA9IHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1Tb3VyY2UuZ2V0KCkpOworICAgICAgICByZXR1cm4gc291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKGticHMpOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpIHsKKyAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgeworICAgICAgICBIVFRQQmFzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSk7CisgICAgICAgIHJldHVybiBzb3VyY2UtPnNldEJhbmR3aWR0aFN0YXRDb2xsZWN0RnJlcShmcmVxTXMpOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKIHN0YXR1c190IE51Q2FjaGVkU291cmNlMjo6aW5pdENoZWNrKCkgY29uc3QgewogICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKIH0KQEAgLTIxMCw3ICsyMjcsOSBAQAogfQogCiB1aW50MzJfdCBOdUNhY2hlZFNvdXJjZTI6OmZsYWdzKCkgewotICAgIHJldHVybiAobVNvdXJjZS0+ZmxhZ3MoKSAmIH5rV2FudHNQcmVmZXRjaGluZykgfCBrSXNDYWNoaW5nRGF0YVNvdXJjZTsKKyAgICAvLyBSZW1vdmUgSFRUUCByZWxhdGVkIGZsYWdzIHNpbmNlIE51Q2FjaGVkU291cmNlMiBpcyBub3QgSFRUUC1iYXNlZC4KKyAgICB1aW50MzJfdCBmbGFncyA9IG1Tb3VyY2UtPmZsYWdzKCkgJiB+KGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlKTsKKyAgICByZXR1cm4gKGZsYWdzIHwga0lzQ2FjaGluZ0RhdGFTb3VyY2UpOwogfQogCiB2b2lkIE51Q2FjaGVkU291cmNlMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKaW5kZXggODIxYmE5Yi4uZGFjMmVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTk3LDkgKzk3LDYgQEAKICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQoZmFsc2UpLAogICAgICAgbUhhc0NodW5rZWRUcmFuc2ZlckVuY29kaW5nKGZhbHNlKSwKICAgICAgIG1DaHVua0RhdGFCeXRlc0xlZnQoMCksCi0gICAgICBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDApLAotICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMoMCksCi0gICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzKDApLAogICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7CiB9CkBAIC00MzEsNyArNDI4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLSAgICAgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbChuLCBkZWxheVVzKTsKKyAgICAgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobiwgZGVsYXlVcyk7CiAKICAgICAgICAgbnVtQnl0ZXNSZWFkICs9IChzaXplX3QpbjsKIApAQCAtNDY3LDcgKzQ2NCw3IEBACiB9CiAKIHVpbnQzMl90IE51SFRUUERhdGFTb3VyY2U6OmZsYWdzKCkgewotICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZzsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7CiB9CiAKIC8vIHN0YXRpYwpAQCAtNTE3LDM2ICs1MTQsNiBAQAogICAgIH0KIH0KIAotYm9vbCBOdUhUVFBEYXRhU291cmNlOjplc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmJhbmR3aWR0aF9icHMgPSAoKGRvdWJsZSltVG90YWxUcmFuc2ZlckJ5dGVzICogOEU2IC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbCgKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBCYW5kd2lkdGhFbnRyeSBlbnRyeTsKLSAgICBlbnRyeS5tRGVsYXlVcyA9IGRlbGF5VXM7Ci0gICAgZW50cnkubU51bUJ5dGVzID0gbnVtQnl0ZXM7Ci0gICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgKz0gZGVsYXlVczsKLSAgICBtVG90YWxUcmFuc2ZlckJ5dGVzICs9IG51bUJ5dGVzOwotCi0gICAgbUJhbmR3aWR0aEhpc3RvcnkucHVzaF9iYWNrKGVudHJ5KTsKLSAgICBpZiAoKyttTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zID4gMTAwKSB7Ci0gICAgICAgIEJhbmR3aWR0aEVudHJ5ICplbnRyeSA9ICYqbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKLSAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gZW50cnktPm1EZWxheVVzOwotICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGVudHJ5LT5tTnVtQnl0ZXM7Ci0gICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOwotICAgICAgICAtLW1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7Ci0gICAgfQotfQotCiBzcDxEZWNyeXB0SGFuZGxlPiBOdUhUVFBEYXRhU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKICAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewogICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggNjMzOTcxMC4uOWM2OWE2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtNjEsOCArNjEsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBpbnQgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDA7Ci0KIHN0cnVjdCBDb2RlY0luZm8gewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgY29uc3QgY2hhciAqY29kZWM7CkBAIC0yMDAsNiArMTk4LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguU0VDLkFWQy5EZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguZ29vZ2xlLmF2Yy5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiQVZDRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgIk9NWC5nb29nbGUudm9yYmlzLmRlY29kZXIiIH0sCkBAIC0xMzg4LDggKzEzODcsNiBAQAogICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAgICAgICAgIENIRUNLX0VRKChpbnQpZm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCwgKGludClPTVhfVklERU9fQ29kaW5nVW51c2VkKTsKIAotICAgICAgICBzdGF0aWMgY29uc3QgaW50IE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwOwotCiAgICAgICAgIENIRUNLKGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgogICAgICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcgogICAgICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZCkBAIC00MjU2LDkgKzQyNTMsMTEgQEAKICAgICAgICAgaWYgKHN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC4iLCA0KSkgewogICAgICAgICAgICAgLy8gTm90IGFuIE9wZW5NYXggY29tcG9uZW50IGJ1dCBhIHNvZnR3YXJlIGNvZGVjLgogCisjaWYgSEFWRV9TT0ZUV0FSRV9ERUNPREVSUwogICAgICAgICAgICAgcmVzdWx0cy0+cHVzaCgpOwogICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgKmNhcHMgPSAmcmVzdWx0cy0+ZWRpdEl0ZW1BdChyZXN1bHRzLT5zaXplKCkgLSAxKTsKICAgICAgICAgICAgIGNhcHMtPm1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKKyNlbmRpZgogCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAKaW5kZXggMTA5NjcxNy4uNTg4YTc0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwCkBAIC0zNCw5ICszNCw2IEBACiAgICAgICBtQ3VycmVudE9mZnNldCgwKSwKICAgICAgIG1JT1Jlc3VsdChPSyksCiAgICAgICBtQ29udGVudFNpemUoLTEpLAotICAgICAgbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcygwKSwKLSAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzKDApLAotICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcygwKSwKICAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgewogICAgIG1EZWxlZ2F0ZS0+c2V0T3duZXIodGhpcyk7CkBAIC0xODgsNyArMTg1LDcgQEAKIAogICAgICAgICAvLyBUaGUgcmVhZCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG1JT1Jlc3VsdCBjb250YWlucwogICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50X2wobUlPUmVzdWx0LCBkZWxheVVzKTsKKyAgICAgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobUlPUmVzdWx0LCBkZWxheVVzKTsKIAogICAgICAgICBtQ3VycmVudE9mZnNldCArPSBtSU9SZXN1bHQ7CiAgICAgICAgIHJldHVybiBtSU9SZXN1bHQ7CkBAIC0yMjEsNyArMjE4LDcgQEAKIH0KIAogdWludDMyX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nOworICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKIH0KIAogLy8gc3RhdGljCkBAIC0yNDYsMzYgKzI0Myw2IEBACiAgICAgY2xlYXJEUk1TdGF0ZV9sKCk7CiB9CiAKLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbCgKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBCYW5kd2lkdGhFbnRyeSBlbnRyeTsKLSAgICBlbnRyeS5tRGVsYXlVcyA9IGRlbGF5VXM7Ci0gICAgZW50cnkubU51bUJ5dGVzID0gbnVtQnl0ZXM7Ci0gICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgKz0gZGVsYXlVczsKLSAgICBtVG90YWxUcmFuc2ZlckJ5dGVzICs9IG51bUJ5dGVzOwotCi0gICAgbUJhbmR3aWR0aEhpc3RvcnkucHVzaF9iYWNrKGVudHJ5KTsKLSAgICBpZiAoKyttTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zID4gMTAwKSB7Ci0gICAgICAgIEJhbmR3aWR0aEVudHJ5ICplbnRyeSA9ICYqbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKLSAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gZW50cnktPm1EZWxheVVzOwotICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGVudHJ5LT5tTnVtQnl0ZXM7Ci0gICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOwotICAgICAgICAtLW1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7Ci0gICAgfQotfQotCi1ib29sIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmVzdGltYXRlQmFuZHdpZHRoKGludDMyX3QgKmJhbmR3aWR0aF9icHMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPCAyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqYmFuZHdpZHRoX2JwcyA9ICgoZG91YmxlKW1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTYgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQogc3A8RGVjcnlwdEhhbmRsZT4gQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNjODc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMjcgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCS4vc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMgXAorCS4vc291cmNlL2gyNjRic2RfdXRpbC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMgXAorCS4vc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3ZsYy5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMgXAorCS4vc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMgXAorCS4vc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2RwYi5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMgXAorCS4vc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF92dWkuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMgXAorCS4vc291cmNlL2gyNjRic2RfZGVjb2Rlci5jIFwKKwkuL3NvdXJjZS9IMjY0U3dEZWNBcGkuYyBcCisJU29mdEFWQy5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi9pbmMgXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKworTVlfQVNNIDo9IFwKKwkuL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyBcCisJLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TCisKKworTVlfT01YRExfQ19TUkMgOj0gXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBcCisJLi9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBcCisJLi9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCisKK01ZX09NWERMX0FTTV9TUkMgOj0gXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TIFwKKworCitpZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKKyAgICBMT0NBTF9BUk1fTkVPTiAgIDo9IHRydWUKKyMgICAgTE9DQUxfQ0ZMQUdTICAgICA6PSAtc3RkPWM5OSAtRC5fTkVPTiAtRC5fT01YREwKKyAgICBMT0NBTF9DRkxBR1MgICAgIDo9IC1ESDI2NERFQ19ORU9OIC1ESDI2NERFQ19PTVhETAorICAgIExPQ0FMX1NSQ19GSUxFUyAgKz0gJChNWV9BU00pICQoTVlfT01YRExfQ19TUkMpICQoTVlfT01YRExfQVNNX1NSQykKKyAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYworICAgIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL2FwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vdmMvYXBpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkKK2VuZGlmCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIFwKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGRlYworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0ZXN0IHV0aWxpdHk6IGRlY29kZXIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIFRlc3QgYXBwbGljYXRpb24KKyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IC4vc291cmNlL0RlY1Rlc3RCZW5jaC5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2gyNjRkZWMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gZGVidWcKKworTE9DQUxfTU9EVUxFIDo9IGRlY29kZXIKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTlmYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0QVZDIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU29mdEFWQy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7Cit9CisKK1NvZnRBVkM6OlNvZnRBVkMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUhhbmRsZShOVUxMKSwKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbVdpZHRoKDMyMCksCisgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICBtUGljdHVyZVNpemUobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKSwKKyAgICAgIG1Dcm9wTGVmdCgwKSwKKyAgICAgIG1Dcm9wVG9wKDApLAorICAgICAgbUZpcnN0UGljdHVyZShOVUxMKSwKKyAgICAgIG1GaXJzdFBpY3R1cmVJZCgtMSksCisgICAgICBtUGljSWQoMCksCisgICAgICBtSGVhZGVyc0RlY29kZWQoZmFsc2UpLAorICAgICAgbUVPU1N0YXR1cyhJTlBVVF9EQVRBX0FWQUlMQUJMRSksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpbml0UG9ydHMoKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0QVZDOjp+U29mdEFWQygpIHsKKyAgICBIMjY0U3dEZWNSZWxlYXNlKG1IYW5kbGUpOworICAgIG1IYW5kbGUgPSBOVUxMOworCisgICAgd2hpbGUgKG1QaWNUb0hlYWRlck1hcC5zaXplKCkgIT0gMCkgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLmVkaXRWYWx1ZUF0KDApOworICAgICAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbXNBdCgwKTsKKyAgICAgICAgZGVsZXRlIGhlYWRlcjsKKyAgICAgICAgaGVhZGVyID0gTlVMTDsKKyAgICB9CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKKyAgICBDSEVDSyhvdXRRdWV1ZS5lbXB0eSgpKTsKKyAgICBDSEVDSyhpblF1ZXVlLmVtcHR5KCkpOworCisgICAgZGVsZXRlW10gbUZpcnN0UGljdHVyZTsKK30KKwordm9pZCBTb2Z0QVZDOjppbml0UG9ydHMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0ga0lucHV0UG9ydEluZGV4OworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtSW5wdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0ga091dHB1dFBvcnRJbmRleDsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1PdXRwdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQudmlkZW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisKKyAgICBkZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAoZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMykgLyAyOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoSDI2NFN3RGVjSW5pdCgmbUhhbmRsZSwgMSkgPT0gSDI2NFNXREVDX09LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga0lucHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga091dHB1dFBvcnRJbmRleCk7CisKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmdldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSAqcmVjdFBhcmFtcyA9IChPTVhfQ09ORklHX1JFQ1RUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocmVjdFBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bkxlZnQgPSBtQ3JvcExlZnQ7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uVG9wID0gbUNyb3BUb3A7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uV2lkdGggPSBtV2lkdGg7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uSGVpZ2h0ID0gbUhlaWdodDsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgfQorfQorCit2b2lkIFNvZnRBVkM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUVPU1N0YXR1cyA9PSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZShrSW5wdXRQb3J0SW5kZXgpOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7CisgICAgSDI2NFN3RGVjUmV0IHJldCA9IEgyNjRTV0RFQ19QSUNfUkRZOworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGJvb2wgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IGZhbHNlOworICAgIHdoaWxlICgobUVPU1N0YXR1cyAhPSBJTlBVVF9EQVRBX0FWQUlMQUJMRSB8fCAhaW5RdWV1ZS5lbXB0eSgpKQorICAgICAgICAgICAgJiYgb3V0UXVldWUuc2l6ZSgpID09IGtOdW1PdXRwdXRCdWZmZXJzKSB7CisKKyAgICAgICAgaWYgKG1FT1NTdGF0dXMgPT0gSU5QVVRfRU9TX1NFRU4pIHsKKyAgICAgICAgICAgIGRyYWluQWxsT3V0cHV0QnVmZmVycygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICArK21QaWNJZDsKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9FT1NfU0VFTjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG5ldyBPTVhfQlVGRkVSSEVBREVSVFlQRTsKKyAgICAgICAgbWVtc2V0KGhlYWRlciwgMCwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisgICAgICAgIGhlYWRlci0+blRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICBoZWFkZXItPm5GbGFncyA9IGluSGVhZGVyLT5uRmxhZ3M7CisgICAgICAgIG1QaWNUb0hlYWRlck1hcC5hZGQobVBpY0lkLCBoZWFkZXIpOworICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisKKyAgICAgICAgSDI2NFN3RGVjSW5wdXQgaW5QaWN0dXJlOworICAgICAgICBIMjY0U3dEZWNPdXRwdXQgb3V0UGljdHVyZTsKKyAgICAgICAgbWVtc2V0KCZpblBpY3R1cmUsIDAsIHNpemVvZihpblBpY3R1cmUpKTsKKyAgICAgICAgaW5QaWN0dXJlLmRhdGFMZW4gPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgaW5QaWN0dXJlLnBTdHJlYW0gPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBpblBpY3R1cmUucGljSWQgPSBtUGljSWQ7CisgICAgICAgIGluUGljdHVyZS5pbnRyYUNvbmNlYWxtZW50TWV0aG9kID0gMTsKKyAgICAgICAgSDI2NFN3RGVjUGljdHVyZSBkZWNvZGVkUGljdHVyZTsKKworICAgICAgICB3aGlsZSAoaW5QaWN0dXJlLmRhdGFMZW4gPiAwKSB7CisgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNEZWNvZGUobUhhbmRsZSwgJmluUGljdHVyZSwgJm91dFBpY3R1cmUpOworICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkgfHwKKyAgICAgICAgICAgICAgICByZXQgPT0gSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFkpIHsKKyAgICAgICAgICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiAtPSAodTMyKShvdXRQaWN0dXJlLnBTdHJtQ3VyclBvcyAtIGluUGljdHVyZS5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpblBpY3R1cmUucFN0cmVhbSA9IG91dFBpY3R1cmUucFN0cm1DdXJyUG9zOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZKSB7CisgICAgICAgICAgICAgICAgICAgIG1IZWFkZXJzRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY0luZm8gZGVjb2RlckluZm87CisgICAgICAgICAgICAgICAgICAgIENIRUNLKEgyNjRTd0RlY0dldEluZm8obUhhbmRsZSwgJmRlY29kZXJJbmZvKSA9PSBIMjY0U1dERUNfT0spOworCisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVQb3J0U2V0dGluZ0NoYW5nZUV2ZW50KCZkZWNvZGVySW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRTZXR0aW5nc0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJJbmZvLmNyb3BwaW5nRmxhZyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ3JvcFJlY3RFdmVudCgmZGVjb2RlckluZm8uY3JvcFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRTZXR0aW5nc0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoSDI2NFN3RGVjTmV4dFBpY3R1cmUobUhhbmRsZSwgJmRlY29kZWRQaWN0dXJlLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gSDI2NFNXREVDX1BJQ19SRFkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGlzIG91dHB1dCBidWZmZXI7IG90aGVyd2lzZSwgaXQgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zdCBkdXJpbmcgZHluYW1pYyBwb3J0IHJlY29uZmlndXJhdGlvbiBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuTUFYIGNsaWVudCB3aWxsIGRlbGV0ZSBfYWxsXyBvdXRwdXQgYnVmZmVycworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIHByb2Nlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlRmlyc3RPdXRwdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFBpY3R1cmUucGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilkZWNvZGVkUGljdHVyZS5wT3V0cHV0UGljdHVyZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5QaWN0dXJlLmRhdGFMZW4gPSAwOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkRlY29kZXIgZmFpbGVkOiAlZCIsIHJldCk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICAgICAgaWYgKHBvcnRTZXR0aW5nc0NoYW5nZWQpIHsKKyAgICAgICAgICAgIHBvcnRTZXR0aW5nc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRmlyc3RQaWN0dXJlICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBkcmFpbk9uZU91dHB1dEJ1ZmZlcihtRmlyc3RQaWN0dXJlSWQsIG1GaXJzdFBpY3R1cmUpOworICAgICAgICAgICAgZGVsZXRlW10gbUZpcnN0UGljdHVyZTsKKyAgICAgICAgICAgIG1GaXJzdFBpY3R1cmUgPSBOVUxMOworICAgICAgICAgICAgbUZpcnN0UGljdHVyZUlkID0gLTE7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICBtSGVhZGVyc0RlY29kZWQgJiYKKyAgICAgICAgICAgICAgICBIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDApCisgICAgICAgICAgICAgICAgICAgID09IEgyNjRTV0RFQ19QSUNfUkRZKSB7CisKKyAgICAgICAgICAgIGludDMyX3QgcGljSWQgPSBkZWNvZGVkUGljdHVyZS5waWNJZDsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKSBkZWNvZGVkUGljdHVyZS5wT3V0cHV0UGljdHVyZTsKKyAgICAgICAgICAgIGRyYWluT25lT3V0cHV0QnVmZmVyKHBpY0lkLCBkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIsIE5VTEwpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIFNvZnRBVkM6OmhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoY29uc3QgSDI2NFN3RGVjSW5mbyAqaW5mbykgeworICAgIGlmIChtV2lkdGggIT0gaW5mby0+cGljV2lkdGggfHwgbUhlaWdodCAhPSBpbmZvLT5waWNIZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoICA9IGluZm8tPnBpY1dpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaW5mby0+cGljSGVpZ2h0OworICAgICAgICBtUGljdHVyZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNvZnRBVkM6OmhhbmRsZUNyb3BSZWN0RXZlbnQoY29uc3QgQ3JvcFBhcmFtcyAqY3JvcCkgeworICAgIGlmIChtQ3JvcExlZnQgIT0gY3JvcC0+Y3JvcExlZnRPZmZzZXQgfHwKKyAgICAgICAgbUNyb3BUb3AgIT0gY3JvcC0+Y3JvcFRvcE9mZnNldCB8fAorICAgICAgICBtV2lkdGggIT0gY3JvcC0+Y3JvcE91dFdpZHRoIHx8CisgICAgICAgIG1IZWlnaHQgIT0gY3JvcC0+Y3JvcE91dEhlaWdodCkgeworCisgICAgICAgIG1Dcm9wTGVmdCA9IGNyb3AtPmNyb3BMZWZ0T2Zmc2V0OworICAgICAgICBtQ3JvcFRvcCA9IGNyb3AtPmNyb3BUb3BPZmZzZXQ7CisgICAgICAgIG1XaWR0aCA9IGNyb3AtPmNyb3BPdXRXaWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGNyb3AtPmNyb3BPdXRIZWlnaHQ7CisgICAgICAgIG1QaWN0dXJlU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKKworICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwKKyAgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLCBOVUxMKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFNvZnRBVkM6OnNhdmVGaXJzdE91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90ICpkYXRhKSB7CisgICAgQ0hFQ0sobUZpcnN0UGljdHVyZSA9PSBOVUxMKTsKKyAgICBtRmlyc3RQaWN0dXJlSWQgPSBwaWNJZDsKKworICAgIG1GaXJzdFBpY3R1cmUgPSBuZXcgdWludDhfdFttUGljdHVyZVNpemVdOworICAgIG1lbWNweShtRmlyc3RQaWN0dXJlLCBkYXRhLCBtUGljdHVyZVNpemUpOworfQorCit2b2lkIFNvZnRBVkM6OmRyYWluT25lT3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QqIGRhdGEpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLnZhbHVlRm9yKHBpY0lkKTsKKyAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBoZWFkZXItPm5UaW1lU3RhbXA7CisgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBoZWFkZXItPm5GbGFnczsKKyAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBtUGljdHVyZVNpemU7CisgICAgbWVtY3B5KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwKKyAgICAgICAgICAgIGRhdGEsIG1QaWN0dXJlU2l6ZSk7CisgICAgbVBpY1RvSGVhZGVyTWFwLnJlbW92ZUl0ZW0ocGljSWQpOworICAgIGRlbGV0ZSBoZWFkZXI7CisgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Cit9CisKK2Jvb2wgU29mdEFWQzo6ZHJhaW5BbGxPdXRwdXRCdWZmZXJzKCkgeworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7CisgICAgSDI2NFN3RGVjUGljdHVyZSBkZWNvZGVkUGljdHVyZTsKKworICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICAgICAgaWYgKG1IZWFkZXJzRGVjb2RlZCAmJgorICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgPT0KKyAgICAgICAgICAgICAgICBIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDEgLyogZmx1c2ggKi8pKSB7CisKKyAgICAgICAgICAgIGludDMyX3QgcGljSWQgPSBkZWNvZGVkUGljdHVyZS5waWNJZDsKKyAgICAgICAgICAgIENIRUNLKG1QaWNUb0hlYWRlck1hcC5pbmRleE9mS2V5KHBpY0lkKSA+PSAwKTsKKworICAgICAgICAgICAgbWVtY3B5KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwKKyAgICAgICAgICAgICAgICBkZWNvZGVkUGljdHVyZS5wT3V0cHV0UGljdHVyZSwKKyAgICAgICAgICAgICAgICBtUGljdHVyZVNpemUpOworCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLnZhbHVlRm9yKHBpY0lkKTsKKyAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gaGVhZGVyLT5uRmxhZ3M7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBtUGljdHVyZVNpemU7CisgICAgICAgICAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbShwaWNJZCk7CisgICAgICAgICAgICBkZWxldGUgaGVhZGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQ7CisgICAgICAgIH0KKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU29mdEFWQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IGtJbnB1dFBvcnRJbmRleCkgeworICAgICAgICBtRU9TU3RhdHVzID0gSU5QVVRfREFUQV9BVkFJTEFCTEU7CisgICAgfQorfQorCit2b2lkIFNvZnRBVkM6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgc3dpdGNoIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVdBSVRJTkdfRElTQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKCFlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UsIChpbnQpQVdBSVRJTkdfRU5BQkxFRCk7CisgICAgICAgICAgICBDSEVDSyhlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU29mdEFWQzo6dXBkYXRlUG9ydERlZmluaXRpb25zKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oMCktPm1EZWY7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworCisgICAgZGVmID0gJmVkaXRQb3J0SW5mbygxKS0+bURlZjsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisKKyAgICBkZWYtPm5CdWZmZXJTaXplID0KKyAgICAgICAgKGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoCisgICAgICAgICAgICAqIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAqIDMpIC8gMjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0QVZDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzQwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX0FWQ19IXworCisjZGVmaW5lIFNPRlRfQVZDX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgImJhc2V0eXBlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNvZnRBVkMgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdEFWQyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdEFWQygpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrSW5wdXRQb3J0SW5kZXggICA9IDAsCisgICAgICAgIGtPdXRwdXRQb3J0SW5kZXggID0gMSwKKyAgICAgICAga051bUlucHV0QnVmZmVycyAgPSA4LAorICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyA9IDE2LAorICAgIH07CisKKyAgICBlbnVtIEVPU1N0YXR1cyB7CisgICAgICAgIElOUFVUX0RBVEFfQVZBSUxBQkxFLAorICAgICAgICBJTlBVVF9FT1NfU0VFTiwKKyAgICAgICAgT1VUUFVUX0ZSQU1FU19GTFVTSEVELAorICAgIH07CisKKyAgICB2b2lkICptSGFuZGxlOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgdWludDMyX3QgbVdpZHRoLCBtSGVpZ2h0LCBtUGljdHVyZVNpemU7CisgICAgdWludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcDsKKworICAgIHVpbnQ4X3QgKm1GaXJzdFBpY3R1cmU7CisgICAgaW50MzJfdCBtRmlyc3RQaWN0dXJlSWQ7CisKKyAgICBpbnQzMl90IG1QaWNJZDsgIC8vIFdoaWNoIG91dHB1dCBwaWN0dXJlIGlzIGZvciB3aGljaCBpbnB1dCBidWZmZXI/CisKKyAgICAvLyBPTVhfQlVGRkVSSEVBREVSVFlQRSBtYXkgYmUgb3ZlcmtpbGwsIGJ1dCBpdCBpcyBjb252ZW5pZW50CisgICAgLy8gZm9yIHRyYWNraW5nIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBuRmxhZ3MsIG5UaW1lU3RhbXAsIGV0Yy4KKyAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqPiBtUGljVG9IZWFkZXJNYXA7CisgICAgYm9vbCBtSGVhZGVyc0RlY29kZWQ7CisKKyAgICBFT1NTdGF0dXMgbUVPU1N0YXR1czsKKworICAgIGVudW0gT3V0cHV0UG9ydFNldHRpbmdDaGFuZ2UgeworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH07CisgICAgT3V0cHV0UG9ydFNldHRpbmdDaGFuZ2UgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworICAgIGJvb2wgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKCk7CisgICAgdm9pZCBkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90ICpkYXRhKTsKKyAgICB2b2lkIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcihpbnQzMl90IHBpZElkLCB1aW50OF90ICpkYXRhKTsKKyAgICBib29sIGhhbmRsZUNyb3BSZWN0RXZlbnQoY29uc3QgQ3JvcFBhcmFtcyogY3JvcCk7CisgICAgYm9vbCBoYW5kbGVQb3J0U2V0dGluZ0NoYW5nZUV2ZW50KGNvbnN0IEgyNjRTd0RlY0luZm8gKmluZm8pOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFWQyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfQVZDX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvSDI2NFN3RGVjQXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlMTEyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIEhlYWRlcnMKKworICAgIDIuIEVudW1lcmF0aW9ucyB1c2VkIGFzIGEgcmV0dXJuIHZhbHVlIG9yIGEgcGFyYW1ldGVyLgorICAgICAgICAyLjEuIEFQSSdzIHJldHVybiB2YWx1ZSBlbnVtZXJhdGlvbnMuCisKKyAgICAzLiBVc2VyIFN0cnVjdHVyZXMKKyAgICAgICAgMy4xLiBTdHJ1Y3R1cmVzIGZvciBIMjY0U3dEZWNEZWNvZGUoKSBwYXJhbWV0ZXJzLgorICAgICAgICAzLjIuIFN0cnVjdHVyZXMgZm9yIGluZm9ybWF0aW9uIGludGVyY2hhbmdlIHdpdGgKKyAgICAgICAgICAgICBERUMgQVBJIGFuZCB1c2VyIGFwcGxpY2F0aW9uLgorCisgICAgNC4gUHJvdG90eXBlcyBvZiBEZWNvZGVyIEFQSSBmdW5jdGlvbnMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNBUElfSAorI2RlZmluZSBIMjY0U1dERUNBUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgSGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuMS4gQVBJJ3MgcmV0dXJuIHZhbHVlIGVudW1lcmF0aW9ucy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICB0eXBlZGVmIGVudW0KKyAgICB7CisgICAgICAgIEgyNjRTV0RFQ19PSyA9IDAsCisgICAgICAgIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRCA9IDEsCisgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZLAorICAgICAgICBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWSwKKyAgICAgICAgSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZLAorICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSID0gLTEsCisgICAgICAgIEgyNjRTV0RFQ19TVFJNX0VSUiA9IC0yLAorICAgICAgICBIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEID0gLTMsCisgICAgICAgIEgyNjRTV0RFQ19NRU1GQUlMID0gLTQsCisgICAgICAgIEgyNjRTV0RFQ19JTklURkFJTCA9IC01LAorICAgICAgICBIMjY0U1dERUNfSERSU19OT1RfUkRZID0gLTYsCisgICAgICAgIEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEID0gLTcKKyAgICB9IEgyNjRTd0RlY1JldDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLjEuIFN0cnVjdHVyZXMgZm9yIEgyNjRTd0RlY0RlY29kZSgpIHBhcmFtZXRlcnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyogdHlwZWRlZiBvZiB0aGUgRGVjb2RlciBpbnN0YW5jZSAqLworICAgIHR5cGVkZWYgdm9pZCAqSDI2NFN3RGVjSW5zdDsKKworICAgIC8qIElucHV0IHN0cnVjdHVyZSAqLworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1OCAgKnBTdHJlYW07ICAgICAgICAgICAgLyogUG9pbnRlciB0byBzdHJlYW0gdG8gYmUgZGVjb2RlZCAgICAgICAgICAqLworICAgICAgICB1MzIgIGRhdGFMZW47ICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGRlY29kZWQgICAgICAgICAgICAqLworICAgICAgICB1MzIgIHBpY0lkOyAgICAgICAgICAgICAgLyogSWRlbnRpZmllciBmb3IgdGhlIHBpY3R1cmUgdG8gYmUgZGVjb2RlZCAqLworICAgICAgICB1MzIgaW50cmFDb25jZWFsbWVudE1ldGhvZDsgLyogMCA9IEdyYXkgY29uY2VhbG1lbnQgZm9yIGludHJhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gUmVmZXJlbmNlIGNvbmNlYWxtZW50IGZvciBpbnRyYSAqLworCisgICAgfSBIMjY0U3dEZWNJbnB1dDsKKworCisgICAgLyogT3V0cHV0IHN0cnVjdHVyZSAqLworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1OCAgKnBTdHJtQ3VyclBvczsgICAgICAvKiBQb2ludGVyIHRvIHN0cmVhbSBwb3NpdGlvbiB3aGVyZSBkZWNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGVkIHVwICovCisgICAgfSBIMjY0U3dEZWNPdXRwdXQ7CisKKyAgICAvKiBPdXRwdXQgc3RydWN0dXJlIGZvciBIMjY0U3dEZWNOZXh0UGljdHVyZSAqLworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1MzIgKnBPdXRwdXRQaWN0dXJlOyAgICAvKiBQb2ludGVyIHRvIHRoZSBwaWN0dXJlLCBZVVYgZm9ybWF0ICAgICAgICovCisgICAgICAgIHUzMiBwaWNJZDsgICAgICAgICAgICAgIC8qIElkZW50aWZpZXIgb2YgdGhlIHBpY3R1cmUgdG8gYmUgZGlzcGxheWVkKi8KKyAgICAgICAgdTMyIGlzSWRyUGljdHVyZTsgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgcGljdHVyZSBpcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFIgcGljdHVyZSAqLworICAgICAgICB1MzIgbmJyT2ZFcnJNQnM7ICAgICAgICAvKiBOdW1iZXIgb2YgY29uY2VhbGVkIE1CJ3MgaW4gdGhlIHBpY3R1cmUgICovCisgICAgfSBIMjY0U3dEZWNQaWN0dXJlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuMi4gU3RydWN0dXJlcyBmb3IgaW5mb3JtYXRpb24gaW50ZXJjaGFuZ2Ugd2l0aCBERUMgQVBJCisgICAgICAgICBhbmQgdXNlciBhcHBsaWNhdGlvbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgdTMyIGNyb3BMZWZ0T2Zmc2V0OworICAgICAgICB1MzIgY3JvcE91dFdpZHRoOworICAgICAgICB1MzIgY3JvcFRvcE9mZnNldDsKKyAgICAgICAgdTMyIGNyb3BPdXRIZWlnaHQ7CisgICAgfSBDcm9wUGFyYW1zOworCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHUzMiBwcm9maWxlOworICAgICAgICB1MzIgcGljV2lkdGg7CisgICAgICAgIHUzMiBwaWNIZWlnaHQ7CisgICAgICAgIHUzMiB2aWRlb1JhbmdlOworICAgICAgICB1MzIgbWF0cml4Q29lZmZpY2llbnRzOworICAgICAgICB1MzIgcGFyV2lkdGg7CisgICAgICAgIHUzMiBwYXJIZWlnaHQ7CisgICAgICAgIHUzMiBjcm9wcGluZ0ZsYWc7CisgICAgICAgIENyb3BQYXJhbXMgY3JvcFBhcmFtczsKKyAgICB9IEgyNjRTd0RlY0luZm87CisKKyAgICAvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHUzMiBtYWpvcjsgICAgLyogRGVjb2RlciBBUEkgbWFqb3IgdmVyc2lvbiAqLworICAgICAgICB1MzIgbWlub3I7ICAgIC8qIERuY29kZXIgQVBJIG1pbm9yIHZlcnNpb24gKi8KKyAgICB9IEgyNjRTd0RlY0FwaVZlcnNpb247CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gUHJvdG90eXBlcyBvZiBEZWNvZGVyIEFQSSBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBIMjY0U3dEZWNSZXQgSDI2NFN3RGVjRGVjb2RlKEgyNjRTd0RlY0luc3QgICAgICBkZWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5wdXQgICAgICpwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNPdXRwdXQgICAgKnBPdXRwdXQpOworCisgICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0luaXQoSDI2NFN3RGVjSW5zdCAqZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgICAgICAgICAgICBub091dHB1dFJlb3JkZXJpbmcpOworCisgICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY05leHRQaWN0dXJlKEgyNjRTd0RlY0luc3QgICAgIGRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY1BpY3R1cmUgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAgICAgICAgICAgICAgIGVuZE9mU3RyZWFtKTsKKworICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNHZXRJbmZvKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNJbmZvICpwRGVjSW5mbyk7CisKKyAgICB2b2lkICBIMjY0U3dEZWNSZWxlYXNlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCk7CisKKyAgICBIMjY0U3dEZWNBcGlWZXJzaW9uIEgyNjRTd0RlY0dldEFQSVZlcnNpb24odm9pZCk7CisKKyAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIEFQSSB0cmFjZSAqLworICAgIHZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqKTsKKworICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKi8KKyAgICB2b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUpOworCisgICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBtZW1vcnkgZnJlZSAqLworICAgIHZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpOworCisgICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBtZW1vcnkgY29weSAqLworICAgIHZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KTsKKworICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtc2V0ICovCisgICAgdm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEgyNjRTV0RFQ0FQSV9IICovCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjNkNTY1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvYmFzZXR5cGUuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEJBU0VUWVBFX0hfSU5DTFVERUQKKyNkZWZpbmUgQkFTRVRZUEVfSF9JTkNMVURFRAorCisKKyNpZmRlZiBfX2FybQorI2RlZmluZSBWT0xBVElMRSB2b2xhdGlsZQorI2Vsc2UKKyNkZWZpbmUgVk9MQVRJTEUKKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgICAgIGk4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdTE2OwordHlwZWRlZiBzaWduZWQgc2hvcnQgICAgaTE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdTMyOwordHlwZWRlZiBzaWduZWQgaW50ICAgICAgaTMyOworCisjaWYgZGVmaW5lZChWQzFTV0RFQ18xNkJJVCkgfHwgZGVmaW5lZChNUDRFTkNfQVJNMTEpCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1MTZ4OwordHlwZWRlZiBzaWduZWQgc2hvcnQgICAgaTE2eDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1MTZ4OwordHlwZWRlZiBzaWduZWQgaW50ICAgICAgaTE2eDsKKyNlbmRpZgorCisKKyNpZm5kZWYgTlVMTAorI2lmZGVmICBfX2NwbHVzcGx1cworI2RlZmluZSBOVUxMIDAKKyNlbHNlCisjZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAgLyogQkFTRVRZUEVfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX0RFTElWRVJZLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U3MGNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9ERUxJVkVSWS5UWFQKQEAgLTAsMCArMSw2MyBAQAorVGhlIGNvbnRlbnRzIG9mIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQgYnkgSGVkbGV5IEZyYW5jaXMKK29mIEFSTSBvbiAxOS1GZWItMjAwOC4KKworSXQgY29udGFpbnMgdGhlIEFSTSBkYXRhIHZlcnNpb25zIGxpc3RlZCBiZWxvdy4KKworVGhpcyBkYXRhLCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgaXMgQVJNIFByb3ByaWV0YXJ5IGFuZCBhY2Nlc3MgdG8gaXQKK2lzIHN1YmplY3QgdG8gdGhlIGFncmVlbWVudHMgaW5kaWNhdGVkIGJlbG93LgorCitJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoaXMgZGF0YSwgcGxlYXNlIGNvbnRhY3QgQVJNIHN1cHBvcnQKK3F1b3RpbmcgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIDw5NzQxMz4uCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworLSBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MQorICBWaWRlbyBjb2RlY3MgLSBvcHRpbWlzZWQgY29kZQorICBWNiBvcHRpbWl6ZWQgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKKyAgaW50ZXJuYWwgYWNjZXNzCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKK2JldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCisKK0JldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50CittdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKK3NvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQorY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCitCdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKK3RoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQorYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgordGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKK2F0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCityZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQorZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKK2RhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCitCeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAordG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCitkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAord2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQord2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAorbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KKworCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK0luIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwordHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KKworVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDEzLlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Citub3RlLgorCitUaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxMy5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCitmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KKworVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KK01ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCisKK1RoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQorIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6CisKKyAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTMuVFhUCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9NQU5JRkVTVC5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyMjM4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUCkBAIC0wLDAgKzEsOTEgQEAKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxLworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLworZTA0OTc5MWNmYWI2MDYwYTA4Y2JhYzdiM2FkNzY3ZDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX3MuaAorZWQ3OThmYWNlMjU0OTdiMjcwM2VkZTczNmQ2ZDUyYjYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlc19zLmgKKzRlZWJkNjNhZjA4NzM3NjgxMWQ2NzQ5ZjA2NDZiODY0ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCis0M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAorOGYyNDhjZWFhYzhmNjAyZTI3N2E1MjFiNjc5ZGNiYmUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCis1M2YyYWU4YTk4NDk1ZjA1ZTI2YTRjZjg2MmE3Zjc1MCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCiszYTJmNDIwZGRmNmExYjk1MDQ3MGJkMGY1ZWJkNWM2MiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVF9zLmgKKzUxMWMwYmI1MzRmZTIyMzU5OWUyYzg0ZWZmMjRjOWVkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAorODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCitmODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCis4ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKKzY5NDI4MWQxMWFmNTJmODhlNmY5ZDRjYjIyNmFjOGE3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAorZTcyZDk2YzBhNDE1NDU5NzQ4ZGY5ODA3ZjNkYWU3MmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAorCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLworNWVlYWU2NTlhMjk0NzdmNWM1MjI5NmQyNGFmZmZkM2MgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCitkNjRjZGNmMzhmNzc0OWRjN2Y3NzQ2NWU1YjdkMzU2ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCitlN2UwYzMyMDk3ODU2NGE3YzliMmM3MjM3NDlhOThkNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworNGFkY2QwZGYwODE5OTBiZGZjNDcyOTA0MWEyYTkxNTIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKzg1MmUwNDA0MTQyOTY1ZGMxZjNhYTdmMDBlZTUxMjdiICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKzcwNTQxNTFjNWJmZWE2YjVlNzRmZWVlODZiMmQ3YjAxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCiszODk0NGM1ZTBiYmEwMWUzMmZmMzQ5YzJjODdjNzFiMiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKzMyZmY0YjhiZTYyZTJmMGYzZTc2NGI4M2MxZTVlMmZkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworOTBiMGU2YTA0ZTc2NDkwMmMwYTA5MDM2NDBjMTBiMzIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKzI4YTE5YWU0ZmUyMjU4NjI4MDgwZDZhODliYjU0YjkxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKzk4ZTE5NmI5ZTFmZmViYWY5MWY2MmVhOWQxN2ZiOTdkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCiswMWJhNjBlZmY2NmVhNDlhNGY4MzNjZTYyNzlmOGUyZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCitmMzAxZDVhOTVlMDczNTRmNTkzZWE1NzQ3YzAxY2IwYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworNDRjOWVmMjFlODQwYTEwMDMwMWY3ZDdhNDE4OTk1N2MgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCithMzNiMDNiYmQzMzUyZDI0ZWQ3NDQ3NjllMTJiYjg3ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworMDBjMjBiZmRhNjdiYjg2MDk2YjYxNWZjMTdjOTRiMzUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworMmRkY2FmNjBhOGVhMWU2ZTZiNzc3MzdmNzY4YmZiOWQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworYzMwMDJhYWQ1NjAwZjg3MmI3MGE1ZDdmZTM5MTU4NDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCithMjkwMGYyYzQ3ZjFjNjFkMjBiZDZjMWVkYTMzZDZkNCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworZTRmZWNkNjZiYzQ3ZjA3NTM5YmMzMDg5MzVlODRhMWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCis3ODgxNWM5ZGY1MGJhNTMxMzFiYjIyZDJiODI5ZTNjMyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworMTkwOWFlMzEyYWM3OWEwM2E1ZmFjMWQxZThiYzAyOTEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworM2QyYzQ4NTgwNjU1OTI4MDY1ZGU3ODM5ODY2ZDliYzQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCisyM2FhMmZkZjE1NWQ0ZmE2ZmY3NDVlYWI2ZTAxZjMyYiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworOTdmMjBhOTNjNDgxZDdmNjE3M2Q5MTlmNDFlNDE1YmQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworYmVjZDUxMmRhMjAyNDM2Mjg2ODExYjZhZWMwNjFmNDcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKK2RkMjRhOTlhZTNjZDg0MmRjYWNhZjMxZDQ3ZGU4OGIzICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCitjMmQ5OTVmNzg3YjZmNDRlZjEwYzc1MWMxMmQxOTM1ZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKzM2MjhmYmRmMGNkMjE3YzI4N2I2Y2NjOTQxMzVkMDZlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworNGE1MmIzZTllMjY4YjhhOGYwNzgyOWJmNTAwZDAzYWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKzExMjQ5ZjhhOThjNWQ0Yjg0Y2I1NTc1YjBlMzdjYTljICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKzM1OTliMTA3NDMzMDk2NWM4Y2EyODVkMTY0ZWZjY2ZmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCiszMzM5ZTAyNmM3ZGU2NTVkOTQwMDk0OWViNWU1MTQ1MSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCitjYzRhNmYzMmRiMGI3MmE5MWQzZjI3OGY2ODU1ZGY2OSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCis2ZTUzMGRkYWE3YzJiNTdmZmU4ODE2MmMwMjBjYjY2MiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLworY2RmNDEyOTIwYzIwMzdhNzI1ZDA0MjAwMDJiNjc1MmUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKK2RiYTk4MjRlOTU5YjIxZDQwMWNhYzkyNWU2OGExMWE2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworYjU1OWI3MWQ1Yzk0NjI3ZjEwZTYxNmZiNzJjMGNlZmMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCis0ZmJhNGM0MzFhNzgzYTc4YTJlYjY0OTdhOTRhYzk2NyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworMWU0YzNiZThjNWVkZGMwMGM5ZjA1ZTgzYmNmMzE1ZWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCisxYjBiMjk5MGMyNjY5ZGZiODdjZjZiODEwNjExYzAxYiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisxYzliODdhYmYzMjgzZTk1NzgxNmIzOTM3YzY4MDcwMSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCis0ZmUxYWZjYTY1OWE5MDU1ZmMxMTcyZTU4Zjc4YTUwNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisyZWEwNjdmMDQzNmY5MWJhMTM1MWVkYWY0MTFjYjRlYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworYWNiOTJiZTFkYmNkYjNlYmU4MjRjYmU5ZTI4ZDAzYmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworYTZiNDFmMDFiMWRmN2RkNjU2ZWJkYmEzMDg0YmZhMmEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworMjkzYTQ4YTY0OGEzMDg1NDU2ZTY2NjViYjczNjZmYWQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucworZmZlNmI5NmM3NGQ0ODgxZjRkM2M4ZGU4Y2M3Mzc3OTcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCis0MzdkZmEyMDQ1MDg4NTBkNjFkNGI4NzA5MTQ0NmU5ZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworZmY1OTE1ZDE4MWJmZDJjZDJmMGJkNTg4YmQyMzAwZGMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKzY3NzVlYjBjNTYxZGJhYjk2NWM2MGY4NWIwOGM5NmZkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworYTBkODVmNGY1MTdjOTQ1YTRjOTMxN2FjMDIxZjJkMDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworMzg2MDIwZGVlOGI3MjVjN2ZlMjUyNmYxZmMyMTFkN2QgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCis0NjI0ZTdjODM4ZTEwYTI0OWFiY2MzZDNmNGY0MDc0OCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCis2NWUxMDU3ZDA0ZTJjYjg0NDU1OWRjOWY2ZTA5Nzk1YSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLworZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KKzdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAorMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCisxMTcyNmUyODZhODEyNTdjYjQ1ZjU1NDdmYjRkMzc0YyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDX3MuaAorYTViMmFmNjA1YzMxOWNkMjQ5MTMxOWU0MzA3NDEzNzcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCis1MGNjYTY5NTRjNDQ3YjAxMmFiMzljYTc4NzJlNWU4ZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKK2QxYzNiY2U3N2ZjNTc3NGM4OTliNDQ3ZDEzZjAyY2QwICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKK2ZkYWMxZDFiYWQzZmQyM2M4ODBiZWIzOWJjMmU4OWFhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKzZkOWFkYzJiZTViZDAzMTE1OTEwMzBkMGM2ZGY3NzFjICBBUk1fREVMSVZFUllfOTc0MTMuVFhUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDg2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaApAQCAtMCwwICsxLDc4NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAgIAorICogRmlsZTogYXJtQ09NTS5oCisgKiBCcmllZjogRGVjbGFyZXMgQ29tbW9uIEFQSXMvRGF0YSBUeXBlcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCisgKgorICovCisgCisgIAorI2lmbmRlZiBfYXJtQ29tbW9uX0hfCisjZGVmaW5lIF9hcm1Db21tb25fSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9GMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX0YzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorICAgICAgICAKK30gT01YX0ZDMzI7IC8qKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9GNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX0Y2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorICAgICAgICAKK30gT01YX0ZDNjQ7IC8qKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCisKKworLyogVXNlZCBieSBib3RoIElQIGFuZCBJQyBkb21haW5zIGZvciA4eDggSlBFRyBibG9ja3MuICovCit0eXBlZGVmIE9NWF9TMTYgQVJNX0JMT0NLOHg4WzY0XTsKKworCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNkZWZpbmUgIGFybVBJIChPTVhfRjY0KSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29tcGlsZXIgZXh0ZW5zaW9ucyAqLworI2lmZGVmIEFSTV9ERUJVRworLyogZGVidWcgdmVyc2lvbiAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIGFybUVycm9yKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTsgZXhpdCgtMSk7fQorI2RlZmluZSBhcm1XYXJuKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTt9CisjZGVmaW5lIGFybUlnbm9yZShhKSAoKHZvaWQpYSkKKyNkZWZpbmUgYXJtQXNzZXJ0KGEpIGFzc2VydChhKQorI2Vsc2UgCisvKiByZWxlYXNlIHZlcnNpb24gKi8KKyNkZWZpbmUgYXJtRXJyb3Ioc3RyKSAoKHZvaWQpIChzdHIpKQorI2RlZmluZSBhcm1XYXJuKHN0cikgICgodm9pZCkgKHN0cikpCisjZGVmaW5lIGFybUlnbm9yZShhKSAgKCh2b2lkKSAoYSkpCisjZGVmaW5lIGFybUFzc2VydChhKSAgKCh2b2lkKSAoYSkpCisjZW5kaWYgLyogQVJNX0RFQlVHICovCisKKy8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisjZGVmaW5lIGFybU1pbihhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChiKTooYSkgKQorI2RlZmluZSBhcm1NYXgoYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYSk6KGIpICkKKyNkZWZpbmUgYXJtQWJzKGEpICAgICAgICAgICAgICAgKCAoYSkgPCAgMCAgPyAtKGEpOihhKSApCisKKy8qIEFsaWdubWVudCBvcGVyYXRpb24gKi8KKworI2RlZmluZSBhcm1BbGlnblRvQnl0ZXMoUHRyLE4pICAgICAgKFB0ciArICggKChOLShpbnQpUHRyKSYoTi0xKSkgLyBzaXplb2YoKlB0cikgKSkKKyNkZWZpbmUgYXJtQWxpZ25UbzJCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMikKKyNkZWZpbmUgYXJtQWxpZ25UbzRCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsNCkKKyNkZWZpbmUgYXJtQWxpZ25UbzhCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsOCkKKyNkZWZpbmUgYXJtQWxpZ25UbzE2Qnl0ZXMoUHRyKSAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMTYpCisKKy8qIEVycm9yIGFuZCBBbGlnbm1lbnQgY2hlY2sgKi8KKworI2RlZmluZSBhcm1SZXRBcmdFcnJJZihjb25kaXRpb24sIGNvZGUpICBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQorI2RlZmluZSBhcm1SZXREYXRhRXJySWYoY29uZGl0aW9uLCBjb2RlKSBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQorCisjaWZuZGVmIEFMSUdOTUVOVF9ET0VTTlRfTUFUVEVSCisjZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoKCgoaW50KShQdHIpKSAlIE4pPT0wKQorI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKCgoKGludCkoUHRyKSkgJSBOKSE9MCkKKyNlbHNlCisjZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoMSkKKyNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgwKQorI2VuZGlmCisKKyNkZWZpbmUgYXJtSXMyQnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDIpCisjZGVmaW5lIGFybUlzNEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw0KQorI2RlZmluZSBhcm1JczhCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsOCkKKyNkZWZpbmUgYXJtSXMxNkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDE2KQorCisjZGVmaW5lIGFybU5vdDJCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMikKKyNkZWZpbmUgYXJtTm90NEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw0KQorI2RlZmluZSBhcm1Ob3Q4Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDgpCisjZGVmaW5lIGFybU5vdDE2Qnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMTYpCisjZGVmaW5lIGFybU5vdDMyQnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMzIpCisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtUm91bmRGbG9hdFRvUzMyX3JlZi9hcm1Sb3VuZEZsb2F0VG9TNjQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOworT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvVTMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2L09NWF9VMzIgZm9ybWF0CisgKgorICovCisKK09NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKKyAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqLyAKKyAKK09NWF9JTlQgYXJtU2lnbkNoZWNrIChPTVhfUzE2IHZhcik7CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXAKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybUNsaXAgKAorICAgICAgICBPTVhfSU5UIG1pbiwKKyAgICAgICAgT01YX0lOVCBtYXgsIAorICAgICAgICBPTVhfUzMyIHNyYworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9GMzIgYXJtQ2xpcF9GMzIgKAorICAgICAgICBPTVhfRjMyIG1pbiwKKyAgICAgICAgT01YX0YzMiBtYXgsIAorICAgICAgICBPTVhfRjMyIHNyYworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAorICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KKyAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAorICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCisgKiB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCisgKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgorICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQorICovIAorIAorT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoCisgICAgICAgIE9NWF9GMzIgdiwgCisgICAgICAgIE9NWF9JTlQgc2hpZnQsIAorICAgICAgICBPTVhfSU5UIHNhdEJpdHMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgorICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgorICovCitPTVhSZXN1bHQgYXJtU3dhcEVsZW0oT01YX1U4ICpwQnVmMSwgT01YX1U4ICpwQnVmMiwgT01YX0lOVCBlbGVtU2l6ZSk7CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycworICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKKyAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKKyAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtTWVkaWFuT2YzICgKKyAgICBPTVhfUzMyIGZFbnRyeSwKKyAgICBPTVhfUzMyIHNFbnRyeSwgCisgICAgT01YX1MzMiB0RW50cnkgCisgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQorICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfVTggLS0gICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwb3NpdGl2ZSB2YWx1ZQorICovIAorIAorT01YX1U4IGFybUxvZ1NpemUgKAorICAgIE9NWF9VMTYgdmFsdWUgCisgICAgKTsgICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0QWRkX1MzMigKKyAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKKyAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgorICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKworT01YX1M2NCBhcm1TYXRBZGRfUzY0KAorICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUxLAorICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUyCisgICAgICAgICAgICAgICAgKTsKKworLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKKyAqIAorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRTdWJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKKyAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKKyAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiovCisKK09NWF9TMzIgYXJtU2F0TWFjX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBNYWMsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMgorICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKKyAqCisgKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKKyAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAorICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIG1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGRlbGF5RWxlbSwgCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGZpbFRhcCApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgorICoKKyAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzY2FsZUZhY3RvciApICkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgorICogW2luXSBzY2FsZUZhY3RvciBUaGUgc2hpZnQgbnVtYmVyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dCwgCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNjYWxlRmFjdG9yKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGlucHV0MSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKKworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQorICoKKyAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAorICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCisgKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCisgKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEZWJ1Z2dpbmcgbWFjcm9zCisgKgorICovCisKKworLyoKKyAqIERlZmluaXRpb24gb2Ygb3V0cHV0IHN0cmVhbSAtIGNoYW5nZSB0byBzdGRlcnIgaWYgbmVjZXNzYXJ5CisgKi8KKyNkZWZpbmUgREVCVUdfU1RSRUFNIHN0ZG91dAorCisvKgorICogRGVidWcgcHJpbnRmIG1hY3Jvcywgb25lIGZvciBlYWNoIGFyZ3VtZW50IGNvdW50LgorICogQWRkIG1vcmUgaWYgbmVlZGVkLgorICovCisjaWZkZWYgREVCVUdfT04KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiKQorI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMpCisjZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlKQorI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYpCisjZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKQorI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpCisjZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKQorI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKQorI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pCisjZWxzZSAvKiBERUJVR19PTiAqLworI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgIAorI2VuZGlmIC8qIERFQlVHX09OICovCisKKworLyoKKyAqIERvbWFpbiBhbmQgc3ViIGRvbWFpbiBkZWZpbml0aW9ucworICoKKyAqIEluIG9yZGVyIHRvIHR1cm4gb24gZGVidWcgZm9yIGFuIGVudGlyZSBkb21haW4gb3Igc3ViLWRvbWFpbgorICogYXQgY29tcGlsZSB0aW1lLCBvbmUgb2YgdGhlIERFQlVHX0RPTUFJTl8qIGJlbG93IG1heSBiZSBkZWZpbmVkLAorICogd2hpY2ggd2lsbCBhY3RpdmF0ZSBkZWJ1ZyBpbiBhbGwgb2YgdGhlIGRlZmluZXMgaXQgY29udGFpbnMuCisgKi8KKworI2lmZGVmIERFQlVHX0RPTUFJTl9BQworI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVF9NUEVHNAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVEQVRTVFJFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFRklMTEVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVJU1NURVJFT19TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNQTlNfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TU1RFUkVPX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVBSR0NGR0VMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVUTlNfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVJTlRFUkxFQVZFU1BFQ1RSVU1fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0VOQ09ERVROU19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVBSRURJQ1RfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUkVDT05TVFJVQ1RfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RGV0RfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RJTlZfUzMyX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19OT0lTRUxFU1NERUNPREUKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfUVVBTlRJTlZfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURJRkhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRFRTRlJBTUVIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQk1CUF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERV9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfTURDVElOVl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRVNGQl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1NZTlRIUFFNRl9TMzJfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS0ZSQU1FSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NDQUxFRkFDVE9SU19TOAorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTSURFSU5GTworI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9BQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fVkMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0NIUk9NQV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0xVTUFfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNIUk9NQURDQ09FRkZTVE9QQUlSQ0FWTENfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVJDQVZMQ19VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFUVVBTlRUUkFOU0ZPUk1BQ0ZST01QQUlSX1U4X1MxNl9DMV9ETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9FWFBBTkRGUkFNRQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfSE9SRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9WRVJFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9IT1JFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9WRVJFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFDSFJPTUE4WDhfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzE2WDE2X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV80WDRfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQVREXzRYNAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRDSFJPTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRMVU1BRENGUk9NUEFJUl9VOF9TMTZfQzEKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9DSFJPTUFEQworI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0xVTUFEQworI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzE2WDE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfOFg4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfMTZYMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl84WDgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19TQURfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9EQ1Q4WDhCTEtETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERUJMT0NLQ09FRl9JTlRFUl9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVBBRE1WX1BWT1AKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVNVl9VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9GSU5ETVZQUkVECisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9JRENUOFg4QkxLRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9MSU1JVE1WVE9SRUNUCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9NT1RJT05FU1RJTUFUSU9OTUIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CR1JBWV9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJIT1JJWk9OVEFMX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQlZFUlRJQ0FMX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNVgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRFUl9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRSQV9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRFUl9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRSQV9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5URVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVFJBCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX1ZDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9JQworLyogVG8gYmUgZmlsbGVkIGluICovCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0lDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9TUAorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfQ09QWV9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MxNlMzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MxNl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMTZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSVNGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0lTRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTYKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fU1AgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX0lQCisjZGVmaW5lIERFQlVHX09NWElQQk1fQUREQ19VOF9DMVJfU0ZTCisjZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUEJNX01JUlJPUl9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9NVUxDX1U4X0MxUl9TRlMKKyNkZWZpbmUgREVCVUdfT01YSVBDU19DT0xPUlRXSVNUUTE0X1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjBMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMkxTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwUlNaUk9UX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVfVThfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWkNTQ1JPVFJHQl9VOF9DMlIKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWlJPVF9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1X1U4X1UxNl9DMkMzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQl9VOF9DMkMzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9DMlAzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQl9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRDRU5UUkFMTU9NRU5UX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVFNQQVRJQUxNT01FTlRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UR0VUU1RBVEVTSVpFX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVElOSVRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MzUgorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JUCAqLworCisKKyNlbmRpZiAvKiBfYXJtQ29tbW9uX0hfICovCisKKy8qRW5kIG9mIEZpbGUqLworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjk4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaApAQCAtMCwwICsxLDY3MCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXREZWNfcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8gCis7Ly8gT3Blbk1BWCBvcHRpbWl6ZWQgYml0c3RyZWFtIGRlY29kZSBtb2R1bGUKKzsvLworOy8vIFlvdSBtdXN0IGluY2x1ZGUgYXJtQ09NTV9zLmggYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUKKzsvLworOy8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hY3JvcyB0byBwZXJmb3JtIGFzc2VtYmx5IG9wdGltaXplZCBmaXhlZCBhbmQKKzsvLyB2YXJpYWJsZSBsZW5ndGggZGVjb2RpbmcgZnJvbSBhIHJlYWQtb25seSBiaXRzdHJlYW0uIFRoZSB2YXJpYWJsZQorOy8vIGxlbmd0aCBkZWNvZGUgbW9kdWxlcyB0YWtlIGFzIGlucHV0IGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIDE2LWJpdAorOy8vIGVudHJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQuCis7Ly8KKzsvLyBWTEQgVGFibGUgRW50cnkgZm9ybWF0Cis7Ly8KKzsvLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKzsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworOy8vICAgICAgIHwgIExlbiAgIHwgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgIHwgMSB8Cis7Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzsvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAorOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCis7Ly8KKzsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYSBsZWFmIGVudHJ5IHRoZW4gYml0IDAgc2V0OgorOy8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICgwIHRvIDcpCis7Ly8gICAgU3ltYm9sID0gU3ltYm9sIHBheWxvYWQgKHVuc2lnbmVkIDEyIGJpdHMpCis7Ly8KKzsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgorOy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCis7Ly8gICAgICAgICAgICAgc3RhcnQgdG8gdGhlIG5leHQgdGFibGUgbm9kZQorOy8vCis7Ly8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQorOy8vIG5leHQgU3RlcCBiaXRzIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gdW50aWwgYSBsZWFmIG5vZGUKKzsvLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCis7Ly8KKzsvLyBVU0FHRToKKzsvLworOy8vIFRvIHVzZSBhbnkgb2YgdGhlIG1hY3JvcyBpbiB0aGlzIHBhY2thZ2UsIGZpcnN0IGNhbGw6Cis7Ly8KKzsvLyAgICBNX0JEX0lOSVQgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCwgVG1wCis7Ly8KKzsvLyBUaGlzIGNhY2hlcyB0aGUgY3VycmVudCBiaXRzdHJlYW0gcG9zaXRpb24gYW5kIG5leHQgYXZhaWxhYmxlCis7Ly8gYml0cyBpbiByZWdpc3RlcnMgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LiBUaGVzZSByZWdpc3RlcnMKKzsvLyBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgYml0c3RyZWFtIGRlY29kZSBwYWNrYWdlIHVudGlsIHlvdQorOy8vIGNhbGwgTV9CRF9GSU5JLgorOy8vCis7Ly8gTmV4dCBjYWxsIHRoZSBmb2xsb3dpbmcgbWFjcm8ocykgYXMgbWFueSB0aW1lcyBhcyB5b3UgbmVlZDoKKzsvLworOy8vICAgIE1fQkRfTE9PSzggICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgaW50byB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9MT09LMTYgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1JFQUQ4ICAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfUkVBRDE2ICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9WUkVBRDggICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1ZSRUFEMTYgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfVkxEICAgICAgICAgLSBQZXJmb3JtIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgdXNpbmcgbG9va3VwIHRhYmxlCis7Ly8KKzsvLyBGaW5hbGx5IGNhbGwgdGhlIG1hY3JvOgorOy8vCis7Ly8gICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0Cis7Ly8KKzsvLyBUaGlzIHdyaXRlcyB0aGUgYml0c3RyZWFtIHN0YXRlIGJhY2sgdG8gbWVtb3J5LgorOy8vCis7Ly8gVGhlIHRocmVlIGJpdHN0cmVhbSBjYWNoZSByZWdpc3RlciBuYW1lcyBhcmUgYXNzaWduZWQgdG8gdGhlIGZvbGxvd2luZyBnbG9iYWwKKzsvLyB2YXJpYWJsZXM6Cis7Ly8KKworICAgICAgICBHQkxTICAgIHBCaXRTdHJlYW0gIDsvLyBSZWdpc3RlciBuYW1lIGZvciBwQml0U3RyZWFtCisgICAgICAgIEdCTFMgICAgQml0QnVmZmVyICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdEJ1ZmZlcgorICAgICAgICBHQkxTICAgIEJpdENvdW50ICAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRDb3VudAorICAgCis7Ly8gICAgICAgIAorOy8vIFRoZXNlIHJlZ2lzdGVyIHZhcmlhYmxlcyBtdXN0IGhhdmUgYSBjZXJ0YWluIGRlZmluZWQgc3RhdGUgb24gZW50cnkgdG8gZXZlcnkgYml0c3RyZWFtCis7Ly8gbWFjcm8gKGV4Y2VwdCBNX0JEX0lOSVQpIGFuZCBvbiBleGl0IGZyb20gZXZlcnkgYml0c3RyZWFtIG1hY3JvIChleGNlcHQgTV9CRF9GSU5JKS4KKzsvLyBUaGUgc3RhdGUgbWF5IGRlcGVuZCBvbiBpbXBsZW1lbnRhdGlvbi4KKzsvLworOy8vIEZvciB0aGUgZGVmYXVsdCAoQVJNMTEpIGltcGxlbWVudGF0aW9uIHRoZSBmb2xsb3dpbmcgaG9sZDoKKzsvLyAgICBwQml0U3RyZWFtIC0gcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG5vdCBoZWxkIGluIHRoZSBCaXRCdWZmZXIKKzsvLyAgICBCaXRCdWZmZXIgIC0gaXMgYSBjYWNoZSBvZiAoNCBieXRlcykgMzIgYml0cywgYml0IDMxIHRoZSBmaXJzdCBiaXQKKzsvLyAgICBCaXRDb3VudCAgIC0gaXMgb2Zmc2V0IChmcm9tIHRoZSB0b3AgYml0KSB0byB0aGUgbmV4dCB1bnVzZWQgYml0c3RyZWFtIGJpdAorOy8vICAgIDA8PUJpdENvdW50PD0xNSAoc28gQml0QnVmZmVyIGhvbGRzIGF0IGxlYXN0IDE3IHVudXNlZCBiaXRzKQorOy8vCis7Ly8KKworICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBpbml0aWFsaXNlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5pdGlhbGlzZXMgdGhlIGJpdHN0cmVhbSBkZWNvZGUgZ2xvYmFsIHJlZ2lzdGVycyBmcm9tCisgICAgICAgIDsvLyBiaXRzdHJlYW0gcG9pbnRlcnMuIFRoaXMgbWFjcm8gaXMgc3BsaXQgaW50byAzIHBhcnRzIHRvIGVuYWJsZQorICAgICAgICA7Ly8gc2NoZWR1bGluZy4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCisgICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCisgICAgICAgIDsvLyAkUkJpdFN0cmVhbSAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIHBCaXRTdHJlYW0gKGNhbiBiZSAkcHBCaXRTdHJlYW0pCisgICAgICAgIDsvLyAkUkJpdEJ1ZmZlciAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdEJ1ZmZlcgorICAgICAgICA7Ly8gJFJCaXRDb3VudCAgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRDb3VudCAgIChjYW4gYmUgJHBCaXRPZmZzZXQpCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEsJFQyLCRUMyAgICAgLSByZWdpc3RlcnMgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBNX0JEX0lOSVQxIGFuZCBNX0JEX0lOSVQyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfSU5JVDAgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQsICRSQml0U3RyZWFtLCAkUkJpdEJ1ZmZlciwgJFJCaXRDb3VudAorCitwQml0U3RyZWFtICBTRVRTICIkUkJpdFN0cmVhbSIKK0JpdEJ1ZmZlciAgIFNFVFMgIiRSQml0QnVmZmVyIgorQml0Q291bnQgICAgU0VUUyAiJFJCaXRDb3VudCIgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIGxvYWQgaW5wdXRzCisgICAgICAgIExEUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCisgICAgICAgIExEUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfSU5JVDEgICRUMSwgJFQyLCAkVDMKKyAgICAgICAgTERSQiAgICAkVDIsIFskcEJpdFN0cmVhbSwgIzJdCisgICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW0sICMxXQorICAgICAgICBMRFJCICAgICRCaXRCdWZmZXIsICBbJHBCaXRTdHJlYW1dLCAjMworICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQyICAkVDEsICRUMiwgJFQzCisgICAgICAgIE9SUiAgICAgJFQyLCAkVDIsICRUMSwgTFNMICM4CisgICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQyLCAkQml0QnVmZmVyLCBMU0wgIzE2CisgICAgICAgIE1FTkQgICAgCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCisgICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMjQgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vaworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9MT09LOCAgJFN5bWJvbCwgJE4KKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KQorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKKyAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4xNiBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0xPT0sxNiAgJFN5bWJvbCwgJE4sICRUMQorICAgICAgICBBU1NFUlQgICgkTiA+PSAxKTpMQU5EOigkTiA8PSAxNikKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gU2tpcHMgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1NLSVA4ICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfUkVBRDggJFN5bWJvbCwgJE4sICRUMQorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAgICAgICAgIAorICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9SRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9MTYpCisgICAgICAgIEFTU0VSVCAgJFN5bWJvbDw+JFQxCisgICAgICAgIElGICgkTjw9OCkKKyAgICAgICAgICAgIE1fQkRfUkVBRDggICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgRUxTRSAgICAgICAgCisgICAgICAgICAgICA7Ly8gTj44IHNvIHdlIHdpbGwgYmUgYWJsZSB0byByZWZpbGwgYXQgbGVhc3Qgb25lIGJ5dGUgICAgICAgICAgICAKKyAgICAgICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoMTYtJE4pCisgICAgICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCisgICAgICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTgKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9WU0tJUDggJE4sICRUMQorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9MTYKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9WU0tJUDE2ICROLCAkVDEsICRUMgorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTgKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlJFQUQ4ICRTeW1ib2wsICROLCAkVDEsICRUMgorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9MTYKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlJFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAwMDAwLi4uMDAxIHdoZXJlIHRoZXJlCisgICAgICAgIDsvLyBhcmUgTiB6ZXJvcyBiZWZvcmUgdGhlIDEgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9DTFoxNiAkU3ltYm9sLCAkVDEsICRUMgorICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKKyAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDExMTEuLi4xMTAgd2hlcmUgdGhlcmUKKyAgICAgICAgOy8vIGFyZSBOIG9uZXMgYmVmb3JlIHRoZSAwIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQ0xPMTYgJFN5bWJvbCwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1WTiAgICAgJFN5bWJvbCwgJFN5bWJvbAorICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAKKworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVmFyaWFibGUgTGVuZ3RoIERlY29kZSBtb2R1bGUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWNvZGVzIG9uZSBWTEQgU3ltYm9sIGZyb20gYSBiaXRzdHJlYW0gYW5kIHJlZmlsbCB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyBidWZmZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwVkxEVGFibGUgICAgICAtIHBvaW50ZXIgdG8gVkxEIGRlY29kZSB0YWJsZSBvZiAxNi1iaXQgZW50cmllcy4KKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGFib3ZlIGF0IHRoZSBzdGFydCBvZgorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlLgorICAgICAgICA7Ly8gJFMwICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIHRoZSBmaXJzdCBzdGVwCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAxPD0kUzA8PTgKKyAgICAgICAgOy8vICRTMSAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciBlYWNoIHN1YnNlcXVlbnQKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHN0ZXAgMTw9JFMxPD0kUzAuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gZGVjb2RlZCBWTEQgc3ltYm9sIHZhbHVlCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVkxEICRTeW1ib2wsICRUMSwgJFQyLCAkcFZMRFRhYmxlLCAkUzAsICRTMQorICAgICAgICBBU1NFUlQgKDE8PSRTMCk6TEFORDooJFMwPD04KQorICAgICAgICBBU1NFUlQgKDE8PSRTMSk6TEFORDooJFMxPD0kUzApCisgICAgICAgIAorICAgICAgICA7Ly8gTm90ZSAwPD1CaXRDb3VudDw9MTUgb24gZW50cnkgYW5kIGV4aXQKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0cworICAgICAgICBNT1ZTICAgICRTeW1ib2wsICMoMjw8JFMwKS0yICAgICAgICAgICAgICAgICA7Ly8gY3JlYXRlIG1hc2sKKyAgICAgICAgQU5EICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMCkgOy8vIDIqKG5leHQgJFMwIGJpdHMpCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyBDUyBpZiBidWZmZXIgY2FuIGJlIGZpbGxlZAorMDEKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgICAgOy8vIGxvYWQgcmVmaWxsIGJ5dGUKKyAgICAgICAgTERSSCAgICAkU3ltYm9sLCBbJHBWTERUYWJsZSwgJFN5bWJvbF0gICAgICAgOy8vIGxvYWQgdGFibGUgZW50cnkKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIHJlZmlsbCBub3QgcG9zc2libGUKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyRTMCAgICAgICAgICAgOy8vIGFzc3VtZSAkUzAgYml0cyB1c2VkCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggIDsvLyBtZXJnZSBpbiByZWZpbGwgYnl0ZQorICAgICAgICBNT1ZTICAgICRUMSwgJFN5bWJvbCwgTFNSICMxICAgICAgICAgICAgICAgICA7Ly8gQ1M9bGVhZiBlbnRyeQorICAgICAgICBCQ1MgICAgICVGVDAyCisgICAgICAgIAorICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdAorICAgICAgICBJRiAoMiokUzAtJFMxPD04KQorICAgICAgICAgICAgOy8vIENhbiBjb21iaW5lIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIGFuZCBrZWVwICRCaXRDb3VudDw9MTUKKyAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4KygkUzAtJFMxKQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gU2VwYXJhdGUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgb2Zmc2V0CisgICAgICAgICAgICBTVUJTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgICAgIFNVQiAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKCRTMC0kUzEpCisgICAgICAgIEVORElGCisgICAgICAgIEFERCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzEpIDsvLyBhZGQgMioobmV4dCAkUzEgYml0cykgdG8KKyAgICAgICAgQklDICAgICAkU3ltYm9sLCAkU3ltYm9sLCAjMSAgICAgICAgICAgICAgICAgOy8vICAgdGFibGUgb2Zmc2V0CisgICAgICAgIEIgICAgICAgJUJUMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgdGFibGUgZW50cnkKKzAyCisgICAgICAgIDsvLyBCaXRDb3VudCByYW5nZSBub3cgZGVwZW5kIG9uIHRoZSByb3V0ZSBoZXJlCisgICAgICAgIDsvLyBpZiAoZmlyc3Qgc3RlcCkgICAgICAgUzAgPD0gQml0Q291bnQgPD0gNytTMCAgICAgICAgPD0xNQorICAgICAgICA7Ly8gZWxzZSBpZiAoMipTMC1TMTw9OCkgIFMwIDw9IEJpdENvdW50IDw9IDcrKDIqUzAtUzEpIDw9MTUKKyAgICAgICAgOy8vIGVsc2UgICAgICAgICAgICAgICAgICBTMSA8PSBCaXRDb3VudCA8PSA3K1MxICAgICAgICA8PTE1CisgICAgICAgIAorICAgICAgICBTVUIgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sLCBMU1IjMTMKKyAgICAgICAgQklDICAgICAkU3ltYm9sLCAkVDEsICMweEYwMDAKKyAgICAgICAgTUVORAorICAgICAgICAKKworICAgICAgICA7Ly8gQWRkIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMgCisgICAgICAgIDsvLyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIGlzIHVzZWQgdG8gY29tcGFyZSBiaXRzdHJlYW0gcG9zaXRpb25zIHVzaW5nLiBNX0JEX0NNUC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE9mZnNldCAgICAgICAgIC0gT2Zmc2V0IHRvIGJlIGFkZGVkIGluIGJpdHMuCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBhZGRpbmcgdGhlIE9mZnNldC4gCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuIEJ1dCBmb3IgdXNpbmcgd2l0aCBNX0JEX0NNUCBzdWJ0cmFjdCBpcyBub3QgbmVlZGVkLgorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIGFkZGl0aW9uIG9mIE9mZnNldCBudW1iZXIgb2YgYml0cworICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9BREQgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJE9mZnNldAorCisgICAgICAgIDsvLyAoJEJ5dGVJbmRleCwkQml0SW5kZXgpID0gQ3VycmVudCBwb3NpdGlvbiArICRPZmZzZXQgYml0cworICAgICAgICBBREQgICAgICRPZmZzZXQsICRPZmZzZXQsICRCaXRDb3VudAorICAgICAgICBBTkQgICAgICRCaXRJbmRleCwgJE9mZnNldCwgIzcKKyAgICAgICAgQUREICAgICAkQnl0ZUluZGV4LCAkcEJpdFN0cmVhbSwgJE9mZnNldCwgQVNSICMzICAgICAgICAKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBNb3ZlIGJpdHN0cmVhbSBwb2ludGVycyB0byB0aGUgbG9jYXRpb24gZ2l2ZW4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gIAorICAgICAgICA7Ly8gdGhlIGN1cnJlbnQgbG9jYXRpb24gZ2l2ZW4gKGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQpLiAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgbW92ZS4gCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuCisgICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgbW92ZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLiAgCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfTU9WICAkQnl0ZUluZGV4LCAkQml0SW5kZXgKKworICAgICAgICA7Ly8gKCRwQml0U3RyZWFtLCAkT2Zmc2V0KSA9ICgkQnl0ZUluZGV4LCRCaXRJbmRleCkKKyAgICAgICAgTU9WICAgICAkQml0Q291bnQsICRCaXRJbmRleAorICAgICAgICBNT1YgICAgICRwQml0U3RyZWFtLCAkQnl0ZUluZGV4CisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gQml0c3RyZWFtIENvbXBhcmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDb21wYXJlcyBiaXRzdHJlYW0gcG9zaXRpb24gd2l0aCB0aGF0IG9mIGEgZGVzdGluYXRpb24gcG9zaXRpb24uIERlc3RpbmF0aW9uIHBvc2l0aW9uIAorICAgICAgICA7Ly8gaXMgaGVsZCBpbiB0d28gaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREIG1hY3JvCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciwgKDQgYnl0ZSBhaGVhZCBhcyBkZXNjcmliZWQgaW4gTV9CRF9BREQpCisgICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudAorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBGTEFHUyAgICAgICAgICAgLSBHRSBpZiBkZXN0aW5hdGlvbiBpcyByZWFjaGVkLCBMVCA9IGlzIGRlc3RpbmF0aW9uIGlzIGFoZWFkCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0NNUCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkVDEKKyAgICAgICAgCisgICAgICAgIDsvLyBSZXR1cm4gZmxhZ3Mgc2V0IGJ5IChjdXJyZW50IHBvc2l0b24pLSgkQnl0ZUluZGV4LCRCaXRJbmRleCkKKyAgICAgICAgOy8vIHNvIEdFIG1lYW5zIHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24KKworICAgICAgICBBREQgICAgICAgICAkVDEsICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiAjMworICAgICAgICBDTVAgICAgICAgICAkVDEsICRCeXRlSW5kZXgKKyAgICAgICAgQU5EICAgICAgICAgJFQxLCAkQml0Q291bnQsICM3CisgICAgICAgIENNUEVRICAgICAgICRUMSwgJEJpdEluZGV4ICAgICAgICAKKyAgICAgICAgTUVORAorCisgICAgICAgIAorICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBmaW5hbGlzZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFdyaXRlcyBiYWNrIHRoZSBiaXRzdHJlYW0gc3RhdGUgdG8gdGhlIGJpdHN0cmVhbSBwb2ludGVycworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQorICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gdGhlc2UgcmVnaXN0ZXIgYXJlIGNvcnJ1cHRlZAorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0ZJTkkgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLyBBZHZhbmNlIHBvaW50ZXIgYnkgdGhlIG51bWJlciBvZiBmcmVlIGJpdHMgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBBREQgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IjMworICAgICAgICBBTkQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNworICAgICAgICAKKyAgICAgICAgOy8vIE5vdyBtb3ZlIGJhY2sgMzIgYml0cyB0byByZWFjaCB0aGUgZmlyc3QgdXN1ZWQgYml0CisgICAgICAgIFNVQiAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAjNAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIG91dCBiaXRzdHJlYW0gc3RhdGUKKyAgICAgICAgU1RSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KKyAgICAgICAgU1RSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjliYzNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAorICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgorICoKKyAqLworCisjaWZuZGVmIF9hcm1Db2RlY19IXworI2RlZmluZSBfYXJtQ29kZWNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggICBjb2RlTGVuOworICAgIE9NWF9VMzIJIGNvZGVXb3JkOworfSBBUk1fVkxDMzI7CisKKy8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKipwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisKKyNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispOworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKyk7CisKKyNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkYjMyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGUgICAgICAgICA6IGFybUNPTU1fSURDVFRhYmxlLmgKKyAqIERlc2NyaXB0aW9uICA6IENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0YWJsZXMgZm9yIElEQ1QgY2FsY3VsYXRpb24uCisgKgorICovCisgIAorI2lmbmRlZiBfYXJtQ09NTV9JRENUVGFibGVfSF8KKyNkZWZpbmUgX2FybUNPTU1fSURDVFRhYmxlX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisgICAgIC8qICBUYWJsZSBvZiBzKHUpKkEodSkqQSh2KS8xNiBhdCBRMTUKKyAgICAgICogIHModSk9MS4wIDAgPD0gdSA8PSA1CisgICAgICAqICBzKDYpPTIuMAorICAgICAgKiAgcyg3KT00LjAKKyAgICAgICogIEEoMCkgPSAyKnNxcnQoMikKKyAgICAgICogIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKQorCSAgKi8KK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVFByZVNjYWxlIFs2NF07CitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RDb2VmIFs0XTsKKworI2VuZGlmIC8qIF9hcm1DT01NX0lEQ1RUYWJsZV9IXyAqLworCisKKy8qIEVuZCBvZiBGaWxlICovCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Y3MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCkBAIC0wLDAgKzEsMTQ0NSBAQAorOy8vCis7Ly8gVGhpcyBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG1heSBiZSB1c2VkIG9ubHkgYXMKKzsvLyBhdXRob3Jpc2VkIGJ5IGEgbGljZW5zaW5nIGFncmVlbWVudCBmcm9tIEFSTSBMaW1pdGVkCis7Ly8gICAoQykgQ09QWVJJR0hUIDIwMDQgQVJNIExpbWl0ZWQKKzsvLyAgICAgICBBTEwgUklHSFRTIFJFU0VSVkVECis7Ly8gVGhlIGVudGlyZSBub3RpY2UgYWJvdmUgbXVzdCBiZSByZXByb2R1Y2VkIG9uIGFsbCBhdXRob3Jpc2VkCis7Ly8gY29waWVzIGFuZCBjb3BpZXMgbWF5IG9ubHkgYmUgbWFkZSB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZAorOy8vIGJ5IGEgbGljZW5zaW5nIGFncmVlbWVudCBmcm9tIEFSTSBMaW1pdGVkLgorOy8vCis7Ly8gSURDVF9zLnMKKzsvLworOy8vIEludmVyc2UgRENUIG1vZHVsZQorOy8vCis7Ly8gCis7Ly8gQUxHT1JJVEhNIERFU0NSSVBUSU9OCis7Ly8KKzsvLyBUaGUgOHg4IDJEIElEQ1QgaXMgcGVyZm9ybWVkIGJ5IGNhbGN1bGF0aW5nIGEgMUQgSURDVCBmb3IgZWFjaAorOy8vIGNvbHVtbiBhbmQgdGhlbiBhIDFEIElEQ1QgZm9yIGVhY2ggcm93LgorOy8vCis7Ly8gVGhlIDgtcG9pbnQgMUQgSURDVCBpcyBkZWZpbmVkIGJ5Cis7Ly8gICBmKHgpID0gKEMoMCkqVCgwKSpjKDAseCkgKyAuLi4gKyBDKDcpKlQoNykqYyg3LHgpKS8yCis7Ly8KKzsvLyAgIEModSkgPSAxL3NxcnQoMikgaWYgdT0wIG9yIDEgaWYgdSE9MAorOy8vICAgYyh1LHgpID0gY29zKCAoMngrMSkqdSpwaS8xNiApCis7Ly8KKzsvLyBXZSBjb21wdXRlIHRoZSA4LXBvaW50IDFEIElEQ1QgdXNpbmcgdGhlIHJldmVyc2Ugb2YKKzsvLyB0aGUgQXJhaS1BZ3VpLU5ha2FqaW1hIGZsb3cgZ3JhcGggd2hpY2ggd2Ugc3BsaXQgaW50bworOy8vIDUgc3RhZ2VzIG5hbWVkIGluIHJldmVyc2Ugb3JkZXIgdG8gaWRlbnRpZnkgd2l0aCB0aGUKKzsvLyBmb3J3YXJkIERDVC4gRGlyZWN0IGludmVyc2lvbiBvZiB0aGUgZm9yd2FyZCBmb3JtdWxhZQorOy8vIGluIGZpbGUgRkRDVF9zLnMgZ2l2ZXM6Cis7Ly8KKzsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpICBbIEEodSk9NCpDKHUpKmModSwwKSBdCis7Ly8gICAgICAgICAgICAgWyBBKDApID0gMipzcXJ0KDIpCis7Ly8gICAgICAgICAgICAgICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkgXQorOy8vCis7Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Cis7Ly8gICAgICAgICAgICAgaTMgPSAoajIrajYpLzIgICAgICBpMiA9IChqMi1qNikvMgorOy8vICAgICAgICAgICAgIGk3ID0gKGo1K2ozKS8yICAgICAgaTQgPSAoajUtajMpLzIKKzsvLyAgICAgICAgICAgICBpNSA9IChqMStqNykvMiAgICAgIGk2ID0gKGoxLWo3KS8yCis7Ly8KKzsvLyBJU3RhZ2UgMzogICBoMCA9IChpMCtpMSkvMiAgICAgIGgxID0gKGkwLWkxKS8yCis7Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCis7Ly8gICAgICAgICAgICAgaDQgPSAgY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2Cis7Ly8gICAgICAgICAgICAgaDYgPSAtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2Cis7Ly8gICAgICAgICAgICAgWyBUaGUgYWJvdmUgdHdvIGxpbmVzIHJvdGF0ZSBieSAtKHBpLzgpIF0KKzsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykvc3FydDIgIGg3ID0gKGk1K2k3KS8yIAorOy8vICAgICAgICAgICAgIAorOy8vIElTdGFnZSAyOiAgIGcwID0gKGgwK2gzKS8yICAgICAgZzMgPSAoaDAtaDMpLzIKKzsvLyAgICAgICAgICAgICBnMSA9IChoMStoMikvMiAgICAgIGcyID0gKGgxLWgyKS8yCis7Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKKzsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQorOy8vCis7Ly8gSVN0YWdlIDE6ICAgZjAgPSAoZzArZzcpLzIgICAgICBmNyA9IChnMC1nNykvMgorOy8vICAgICAgICAgICAgIGYxID0gKGcxK2c2KS8yICAgICAgZjYgPSAoZzEtZzYpLzIKKzsvLyAgICAgICAgICAgICBmMiA9IChnMitnNSkvMiAgICAgIGY1ID0gKGcyLWc1KS8yCis7Ly8gICAgICAgICAgICAgZjMgPSAoZzMrZzQpLzIgICAgICBmNCA9IChnMy1nNCkvMgorOy8vCis7Ly8gTm90ZSB0aGF0IG1vc3QgY29lZmZpY2llbnRzIGFyZSBoYWx2ZWQgMyB0aW1lcyBkdXJpbmcgdGhlCis7Ly8gYWJvdmUgY2FsY3VsYXRpb24uIFdlIGNhbiByZXNjYWxlIHRoZSBhbGdvcml0aG0gZGl2aWRpbmcKKzsvLyB0aGUgaW5wdXQgYnkgOCB0byByZW1vdmUgdGhlIGhhbHZpbmdzLgorOy8vCis7Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KS84Cis7Ly8KKzsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKKzsvLyAgICAgICAgICAgICBpMyA9IGoyICsgajYgICAgICAgIGkyID0gajIgLSBqNgorOy8vICAgICAgICAgICAgIGk3ID0gajUgKyBqMyAgICAgICAgaTQgPSBqNSAtIGozCis7Ly8gICAgICAgICAgICAgaTUgPSBqMSArIGo3ICAgICAgICBpNiA9IGoxIC0gajcKKzsvLworOy8vIElTdGFnZSAzOiAgIGgwID0gaTAgKyBpMSAgICAgICAgaDEgPSBpMCAtIGkxCis7Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCis7Ly8gICAgICAgICAgICAgaDQgPSAyKiggY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2KQorOy8vICAgICAgICAgICAgIGg2ID0gMiooLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNikKKzsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykqc3FydDIgIGg3ID0gaTUgKyBpNyAKKzsvLyAgICAgICAgICAgICAKKzsvLyBJU3RhZ2UgMjogICBnMCA9IGgwICsgaDMgICAgICAgIGczID0gaDAgLSBoMworOy8vICAgICAgICAgICAgIGcxID0gaDEgKyBoMiAgICAgICAgZzIgPSBoMSAtIGgyCis7Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKKzsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQorOy8vCis7Ly8gSVN0YWdlIDE6ICAgZjAgPSBnMCArIGc3ICAgICAgICBmNyA9IGcwIC0gZzcKKzsvLyAgICAgICAgICAgICBmMSA9IGcxICsgZzYgICAgICAgIGY2ID0gZzEgLSBnNgorOy8vICAgICAgICAgICAgIGYyID0gZzIgKyBnNSAgICAgICAgZjUgPSBnMiAtIGc1Cis7Ly8gICAgICAgICAgICAgZjMgPSBnMyArIGc0ICAgICAgICBmNCA9IGczIC0gZzQKKzsvLworOy8vIE5vdGU6Cis7Ly8gMS4gVGhlIHNjYWxpbmcgYnkgQSh1KS84IGNhbiBvZnRlbiBiZSBjb21iaW5lZCB3aXRoIGludmVyc2UKKzsvLyAgICBxdWFudGl6YXRpb24uIFRoZSBjb2x1bW4gYW5kIHJvdyBzY2FsaW5ncyBjYW4gYmUgY29tYmluZWQuCis7Ly8gMi4gVGhlIGZsb3dncmFwaCBpbiB0aGUgQUFOIHBhcGVyIGhhcyBoNCxnNiBuZWdhdGVkIGNvbXBhcmVkCis7Ly8gICAgdG8gdGhlIGFib3ZlIGNvZGUgYnV0IGlzIG90aGVyd2lzZSBpZGVudGljYWwuCis7Ly8gMy4gVGhlIHJvdGF0aW9uIGJ5IC1waS84IGNhbiBiZSBwZWZvcm1lZCB1c2luZyB0aHJlZSBtdWx0aXBsaWVzCis7Ly8gICAgRWcgIGMqaTQrcyppNiA9IChpNi1pNCkqcyArIChjK3MpKmk0Cis7Ly8gICAgICAgLXMqaTQrYyppNiA9IChpNi1pNCkqcyArIChjLXMpKmk2Cis7Ly8gNC4gSWYgfFQodSl8PD0xIHRoZW4gZnJvbSB0aGUgSURDVCBkZWZpbml0aW9uLAorOy8vICAgIHxmKHgpfCA8PSAoKDEvc3FydDIpICsgfGMoMSx4KXwgKyAuLiArIHxjKDcseCl8KS8yCis7Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyBjb3MocGkvMTYpICsgLi4uICsgY29zKDcqcGkvMTYpKS8yCis7Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyAoY290KHBpLzMyKS0xKS8yKS8yCis7Ly8gICAgICAgICAgICA9ICgxICsgY29zKHBpLzE2KSArIGNvcygycGkvMTYpICsgY29zKDNwaS8xNikpL3NxcnQoMikKKzsvLyAgICAgICAgICAgID0gKGFwcHJveCkyLjY0Cis7Ly8gICAgU28gdGhlIG1heCBnYWluIG9mIHRoZSAyRCBJRENUIGlzIH54Ny4wID0gMyBiaXRzLgorOy8vICAgIFRoZSB0YWJsZSBiZWxvdyBzaG93cyBpbnB1dCBwYXR0ZXJucyBnZW5lcmF0aW5nIHRoZSBtYXhpbXVtCis7Ly8gICAgdmFsdWUgb2YgfGYodSl8IGZvciBpbnB1dCBpbiB0aGUgcmFuZ2UgfFQoeCl8PD0xLiBNPS0xLCBQPSsxCis7Ly8gICAgSW5wdXRQYXR0ZXJuICAgICAgTWF4IHxmKHgpfAorOy8vICAgICAgUFBQUFBQUFAgICAgICAgIHxmMHwgPSAgMi42NAorOy8vICAgICAgUFBQTU1NTU0gICAgICAgIHxmMXwgPSAgMi42NAorOy8vICAgICAgUFBNTU1QUFAgICAgICAgIHxmMnwgPSAgMi42NAorOy8vICAgICAgUFBNTVBQTU0gICAgICAgIHxmM3wgPSAgMi42NAorOy8vICAgICAgUE1NUFBNTVAgICAgICAgIHxmNHwgPSAgMi42NAorOy8vICAgICAgUE1NUE1NUE0gICAgICAgIHxmNXwgPSAgMi42NAorOy8vICAgICAgUE1QUE1QTVAgICAgICAgIHxmNnwgPSAgMi42NAorOy8vICAgICAgUE1QTVBNUE0gICAgICAgIHxmN3wgPSAgMi42NAorOy8vICAgTm90ZSB0aGF0IHRoaXMgaW5wdXQgcGF0dGVybiBpcyB0aGUgdHJhbnNwb3NlIG9mIHRoZQorOy8vICAgY29ycmVzcG9uZGluZyBtYXggaW5wdXQgcGF0dGVyIGZvciB0aGUgRkRDVC4KKworOy8vIEFyZ3VtZW50cworCitwU3JjICAgIFJOIDAgICAgOy8vIHNvdXJjZSBkYXRhIGJ1ZmZlcgorU3RyaWRlICBSTiAxICAgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKK3BEZXN0ICAgUk4gMiAgICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKK3BTY2FsZSAgUk4gMyAgICA7Ly8gcG9pbnRlciB0byBzY2FsaW5nIHRhYmxlCisKKworICAgICAgICA7Ly8gRENUIEludmVyc2UgTWFjcm8KKyAgICAgICAgOy8vIFRoZSBEQ1QgY29kZSBzaG91bGQgYmUgcGFyYW1ldHJpemVkIGFjY29yZGluZworICAgICAgICA7Ly8gdG8gdGhlIGZvbGxvd2luZyBpbnB1dHM6CisgICAgICAgIDsvLyAkb3V0c2l6ZSA9ICJ1OCIgIDogIDgtYml0IHVuc2lnbmVkIGRhdGEgc2F0dXJhdGVkICgwIHRvICsyNTUpCisgICAgICAgIDsvLyAgICAgICAgICAgICJzOSIgIDogMTYtYml0IHNpZ25lZCBkYXRhIHNhdHVyYXRlZCB0byA5LWJpdCAoLTI1NiB0byArMjU1KQorICAgICAgICA7Ly8gICAgICAgICAgICAiczE2IiA6IDE2LWJpdCBzaWduZWQgZGF0YSBub3Qgc2F0dXJhdGVkIChtYXggc2l6ZSB+Ky8tMTQyNzMpCisgICAgICAgIDsvLyAkaW5zY2FsZSA9ICJzMTYiIDogc2lnbmVkIDE2LWJpdCBhYW4tc2NhbGUgdGFibGUsIFExNSBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8gICAgICAgICAgICAiczMyIiA6IHNpZ25lZCAzMi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMjMgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dHM6CisgICAgICAgIDsvLyBwU3JjICAgPSByMCA9IFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICAgICAgICA7Ly8gICAgICAgICAgICAgICBSYW5nZSBpcyAtMjU2IHRvICsyNTUgKDktYml0KQorICAgICAgICA7Ly8gU3RyaWRlID0gcjEgPSBTdHJpZGUgYmV0d2VlbiBpbnB1dCBsaW5lcworICAgICAgICA7Ly8gcERlc3QgID0gcjIgPSBQb2ludGVyIHRvIG91dHB1dCBkYXRhCisgICAgICAgIDsvLyBwU2NhbGUgPSByMyA9IFBvaW50ZXIgdG8gYWFuLXNjYWxlIHRhYmxlIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBieSAkaW5zY2FsZQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1QgICRvdXRzaXplLCAkaW5zY2FsZSwgJHN0cmlkZQorICAgICAgICBMQ0xBICAgIFNISUZUCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorOy8vIFJFR0lTVEVSIEFMTE9DQVRJT04KKzsvLyBUaGlzIGlzIGhhcmQgc2luY2Ugd2UgaGF2ZSA4IHZhbHVlcywgOSBmcmVlIHJlZ2lzdGVycyBhbmQgZWFjaAorOy8vIGJ1dHRlcmZseSByZXF1aXJlcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gV2UgYWxzbyB3YW50IHRvIAorOy8vIG1haW50YWluIHJlZ2lzdGVyIG9yZGVyIHNvIHdlIGNhbiB1c2UgTERNL1NUTS4gVGhlIHRhYmxlIGJlbG93Cis7Ly8gc3VtbWFyaXNlcyB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiB0aGF0IG1lZXRzIGFsbCB0aGVzZSBjcml0ZXJpYS4KKzsvLyBhPTFzdGNvbCwgYj0ybmRjb2wsIGYsZyxoLGkgYXJlIGRhdGFmbG93IHBvaW50cyBkZXNjcmliZWQgYWJvdmUuCis7Ly8KKzsvLyByMSAgYTAxICAgICBnMCAgaDAKKzsvLyByNCAgYjAxIGYwICBnMSAgaDEgIGkwCis7Ly8gcjUgIGEyMyBmMSAgZzIgICAgICBpMQorOy8vIHI2ICBiMjMgZjIgIGczICBoMiAgaTIKKzsvLyByNyAgYTQ1IGYzICAgICAgaDMgIGkzCis7Ly8gcjggIGI0NSBmNCAgZzQgIGg0ICBpNAorOy8vIHI5ICBhNjcgZjUgIGc1ICBoNSAgaTUKKzsvLyByMTAgYjY3IGY2ICBnNiAgaDYgIGk2Cis7Ly8gcjExICAgICBmNyAgZzcgIGg3ICBpNworOy8vCityYTAxICAgIFJOIDEKK3JiMDEgICAgUk4gNAorcmEyMyAgICBSTiA1CityYjIzICAgIFJOIDYKK3JhNDUgICAgUk4gNworcmI0NSAgICBSTiA4CityYTY3ICAgIFJOIDkKK3JiNjcgICAgUk4gMTAKK3J0bXAgICAgUk4gMTEKK2NzUGlCeTggUk4gMTIgICA7Ly8gWyAoU2luKHBpLzgpQFExNSksIChDb3MocGkvOClAUTE1KSBdCitMb29wUlIyIFJOIDE0ICAgOy8vIFsgTG9vcE51bWJlcjw8MTMgLCAoMS9TcXJ0KDIpKUBRMTUgXQorOy8vIFRyYW5zcG9zZSBhbGxvY2F0aW9uCit4ZnQgICAgIFJOIHJhMDEKK3hmMCAgICAgUk4gcmIwMQoreGYxICAgICBSTiByYTIzCit4ZjIgICAgIFJOIHJiMjMKK3hmMyAgICAgUk4gcmE0NQoreGY0ICAgICBSTiByYjQ1Cit4ZjUgICAgIFJOIHJhNjcKK3hmNiAgICAgUk4gcmI2NworeGY3ICAgICBSTiBydG1wCis7Ly8gSVN0YWdlIDEgYWxsb2NhdGlvbgoreGcwICAgICBSTiB4ZnQKK3hnMSAgICAgUk4geGYwCit4ZzIgICAgIFJOIHhmMQoreGczICAgICBSTiB4ZjIKK3hndCAgICAgUk4geGYzCit4ZzQgICAgIFJOIHhmNAoreGc1ICAgICBSTiB4ZjUKK3hnNiAgICAgUk4geGY2Cit4ZzcgICAgIFJOIHhmNworOy8vIElTdGFnZSAyIGFsbG9jYXRpb24KK3hoMCAgICAgUk4geGcwCit4aDEgICAgIFJOIHhnMQoreGh0ICAgICBSTiB4ZzIKK3hoMiAgICAgUk4geGczCit4aDMgICAgIFJOIHhndAoreGg0ICAgICBSTiB4ZzQKK3hoNSAgICAgUk4geGc1Cit4aDYgICAgIFJOIHhnNgoreGg3ICAgICBSTiB4ZzcKKzsvLyBJU3RhZ2UgMyw0IGFsbG9jYXRpb24KK3hpdCAgICAgUk4geGgwCit4aTAgICAgIFJOIHhoMQoreGkxICAgICBSTiB4aHQKK3hpMiAgICAgUk4geGgyCit4aTMgICAgIFJOIHhoMworeGk0ICAgICBSTiB4aDQKK3hpNSAgICAgUk4geGg1Cit4aTYgICAgIFJOIHhoNgoreGk3ICAgICBSTiB4aDcKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgcERlc3QsICBwcERlc3QKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgTV9TVFIgICBTdHJpZGUsIHBTdHJpZGUKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTV9BRFIgICBwRGVzdCwgIHBCbGsKKyAgICAgICAgTERSICAgICBjc1BpQnk4LCA9MHgzMGZjNzY0MgorICAgICAgICBMRFIgICAgIExvb3BSUjIsID0weDAwMDA1YTgyCisgIAordjZfaWRjdF9jb2wkX0YKKyAgICAgICAgOy8vIExvYWQgZXZlbiB2YWx1ZXMKKyAgICAgICAgTERSICAgICB4aTQsIFtwU3JjXSwgIzQgIDsvLyBqMAorICAgICAgICBMRFIgICAgIHhpNSwgW3BTcmMsICM0KjE2LTRdICA7Ly8gajQKKyAgICAgICAgTERSICAgICB4aTYsIFtwU3JjLCAjMioxNi00XSAgOy8vIGoyCisgICAgICAgIExEUiAgICAgeGk3LCBbcFNyYywgIzYqMTYtNF0gIDsvLyBqNgorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIEV2ZW4gVmFsdWVzCisgICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgOy8vIDE2eDE2IG11bAorU0hJRlQgICAgICAgU0VUQSAgICAxMgorICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjNAorICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICM0KjE2LTRdICAgICAgICAKKyAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjMioxNi00XQorICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKKyAgICAgICAgICAgIFNNTEFCQiAgeGkzLCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNCwgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQUJCICB4aTAsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk1LCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkzLCB4aTQsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjE2LTRdCisgICAgICAgICAgICBTTUxBQkIgIHhpMSwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTYsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTAsIHhpNSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBTTUxBQkIgIHhpMiwgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTcsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGkxLCB4aTEsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTEsIHhpNiwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTcsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKK1NISUZUICAgICAgIFNFVEEgICAgKDEyKzgtMTYpCisgICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQorICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjOAorICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMwKjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNCozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM0KjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk1LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNSwgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlLCAjMiozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMyKjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNiozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk3LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNywgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgb2RkIHZhbHVlcworICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2LTRdICAgICAgOy8vIGoxCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTYtNF0gICAgICA7Ly8gajcKKyAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNi00XSAgICAgIDsvLyBqNQorICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2LTRdICAgICAgOy8vIGozCisgICAgICAgIAorICAgICAgICBJRiAge1RSVUV9CisgICAgICAgICAgICA7Ly8gc2hvcnRjdXQgaWYgb2RkIHZhbHVlcyAwCisgICAgICAgICAgICBURVEgICAgIHhpMCwgIzAKKyAgICAgICAgICAgIFRFUUVRICAgeGkxLCAjMAorICAgICAgICAgICAgVEVRRVEgICB4aTIsICMwCisgICAgICAgICAgICBURVFFUSAgIHhpMywgIzAKKyAgICAgICAgICAgIEJFUSAgICAgdjZPZGRaZXJvJF9GCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgc2NhbGVkIGV2ZW4gdmFsdWVzCisgICAgICAgIFNUTUlBICAgcERlc3QsIHt4aTQsIHhpNSwgeGk2LCB4aTd9CisgICAgICAgIAorICAgICAgICA7Ly8gU2NhbGUgb2RkIHZhbHVlcworICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiCisgICAgICAgICAgICA7Ly8gUGVyZm9ybSBBQU4gU2NhbGUKKyAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSoxNi00XQorICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM3KjE2LTRdICAgICAgICAKKyAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNSoxNi00XQorICAgICAgICAgICAgU01MQUJCICB4aTcsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkwLCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBQkIgIHhpNCwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTEsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGk3LCB4aTcsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTcsIHhpMCwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMTYtNF0KKyAgICAgICAgICAgIFNNTEFCQiAgeGk1LCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMiwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNCwgeGkxLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIFNNTEFCQiAgeGk2LCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMywgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTUsIHhpNSwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNSwgeGkyLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpMywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAorICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzEqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM3KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzcqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkwLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMCwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTEsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkxLCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICM1KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzUqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICMzKjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkyLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMiwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTMsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkzLCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIFNIQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMworICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCisgICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKKyAgICAgICAgCisgICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KKyAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQorICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAorICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQorICAgICAgICAgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAorICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80CisgICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKKyAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdCwgIzhdICAgICAgICA7Ly8gajIsajYgc2NhbGVkCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKKyAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3CisgICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNiAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQorICAgICAgICAgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpCisgICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80CisgICAgICAgIAorICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIExEUkQgICAgeGkwLCBbcERlc3RdICAgICAgICAgICAgOy8vIGowLCBqNCBzY2FsZWQKKyAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCisgICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEKKyAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKKyAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCisgICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMworICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBTQUREMTYgIHhmMywgeGczLCB4ZzQKKyAgICAgICAgU1NVQjE2ICB4ZjQsIHhnMywgeGc0CisgICAgICAgIFNBREQxNiAgeGYyLCB4ZzIsIHhnNQorICAgICAgICBTU1VCMTYgIHhmNSwgeGcyLCB4ZzUKKyAgICAgICAgU0FERDE2ICB4ZjEsIHhnMSwgeGc2CisgICAgICAgIFNTVUIxNiAgeGY2LCB4ZzEsIHhnNgorICAgICAgICBTQUREMTYgIHhmMCwgeGcwLCB4ZzcKKyAgICAgICAgU1NVQjE2ICB4ZjcsIHhnMCwgeGc3CisgICAgICAgIAorICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAorICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2CisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKKyAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgorICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKKyAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0CisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAorICAgICAgICBFTkRJRgorICAgICAgICBCICAgICAgIHY2X2lkY3Rfcm93JF9GCisgICAgICAgIAordjZPZGRaZXJvJF9GCisgICAgICAgIFNTVUIxNiAgeGkyLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMi1qNikKKyAgICAgICAgU0hBREQxNiB4aTMsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKKyAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCisgICAgICAgIAorICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhoMCwgeGk0LCB4aTUKKyAgICAgICAgU0hTVUIxNiB4aDEsIHhpNCwgeGk1ICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKKyAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCisgICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMworICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgTU9WICB4ZjMsIHhnMworICAgICAgICBNT1YgIHhmNCwgeGczCisgICAgICAgIE1PViAgeGYyLCB4ZzIKKyAgICAgICAgTU9WICB4ZjUsIHhnMgorICAgICAgICBNT1YgIHhmMSwgeGcxCisgICAgICAgIE1PViAgeGY2LCB4ZzEKKyAgICAgICAgTU9WICB4ZjAsIHhnMAorICAgICAgICBNT1YgIHhmNywgeGcwCisgICAgICAgIAorICAgICAgICA7Ly8gVHJhbnNwb3NlCisgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgorICAgICAgICAgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCisgICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKKyAgICAgICAgCisgICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKKyAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQorICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCisgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAKKyAgICAgICAgCit2Nl9pZGN0X3JvdyRfRgorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93czR0bzcgeDEvNAorICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAorICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2XSAgICAgIDsvLyBqMQorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2XSAgICAgIDsvLyA0Kmo3CisgICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTZdICAgICAgOy8vIGo1CisgICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTZdICAgICAgOy8vIGozCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyAyKmo3CisgICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo3ICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIFNIQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMworICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCisgICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKKyAgICAgICAgCisgICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KKyAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQorICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAorICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQorICAgICAgICAgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAorICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80CisgICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgorICAgICAgICAKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMioxNl0gICAgICA7Ly8gajIKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNioxNl0gICAgICA7Ly8gMipqNgorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNworICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKKyAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2CisgICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajYKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KSAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAorICAgICAgICAKKyAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM0KjE2XSAgICAgIDsvLyBqNAorICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmNdLCAjNCAgICAgICAgIDsvLyBqMAorCisgICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMworICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cworICAgICAgICAKKyAgICAgICAgQUREICAgICB4aTAsIHhpMCwgeGl0LCBMU0wgIzIgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKKyAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0CisgICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMQorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgorICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKKyAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCisgICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMworICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFNIQUREMTYgeGYzLCB4ZzMsIHhnNAorICAgICAgICBTSFNVQjE2IHhmNCwgeGczLCB4ZzQKKyAgICAgICAgU0hBREQxNiB4ZjIsIHhnMiwgeGc1CisgICAgICAgIFNIU1VCMTYgeGY1LCB4ZzIsIHhnNQorICAgICAgICBTSEFERDE2IHhmMSwgeGcxLCB4ZzYKKyAgICAgICAgU0hTVUIxNiB4ZjYsIHhnMSwgeGc2CisgICAgICAgIFNIQUREMTYgeGYwLCB4ZzAsIHhnNworICAgICAgICBTSFNVQjE2IHhmNywgeGcwLCB4ZzcKKyAgICAgICAgCisgICAgICAgIDsvLyBTYXR1cmF0ZQorICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQorICAgICAgICAgICAgVVNBVDE2ICB4ZjAsICM4LCB4ZjAKKyAgICAgICAgICAgIFVTQVQxNiAgeGYxLCAjOCwgeGYxCisgICAgICAgICAgICBVU0FUMTYgIHhmMiwgIzgsIHhmMgorICAgICAgICAgICAgVVNBVDE2ICB4ZjMsICM4LCB4ZjMKKyAgICAgICAgICAgIFVTQVQxNiAgeGY0LCAjOCwgeGY0CisgICAgICAgICAgICBVU0FUMTYgIHhmNSwgIzgsIHhmNQorICAgICAgICAgICAgVVNBVDE2ICB4ZjYsICM4LCB4ZjYKKyAgICAgICAgICAgIFVTQVQxNiAgeGY3LCAjOCwgeGY3ICAgICAgICAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKKyAgICAgICAgICAgIFNTQVQxNiAgeGYwLCAjOSwgeGYwCisgICAgICAgICAgICBTU0FUMTYgIHhmMSwgIzksIHhmMQorICAgICAgICAgICAgU1NBVDE2ICB4ZjIsICM5LCB4ZjIKKyAgICAgICAgICAgIFNTQVQxNiAgeGYzLCAjOSwgeGYzCisgICAgICAgICAgICBTU0FUMTYgIHhmNCwgIzksIHhmNAorICAgICAgICAgICAgU1NBVDE2ICB4ZjUsICM5LCB4ZjUKKyAgICAgICAgICAgIFNTQVQxNiAgeGY2LCAjOSwgeGY2CisgICAgICAgICAgICBTU0FUMTYgIHhmNywgIzksIHhmNyAgICAgICAgCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRvIFJvdywgUGFjayBhbmQgc3RvcmUKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgIE9SUiAgICAgeGYwLCB4ZjAsIHhmMSwgTFNMICM4IDsvLyBbIGIxIGIwIGExIGEwIF0KKyAgICAgICAgICAgIE9SUiAgICAgeGYyLCB4ZjIsIHhmMywgTFNMICM4IDsvLyBbIGIzIGIyIGEzIGEyIF0KKyAgICAgICAgICAgIE9SUiAgICAgeGY0LCB4ZjQsIHhmNSwgTFNMICM4IDsvLyBbIGI1IGI0IGE1IGE0IF0KKyAgICAgICAgICAgIE9SUiAgICAgeGY2LCB4ZjYsIHhmNywgTFNMICM4IDsvLyBbIGI3IGI2IGE3IGE2IF0KKyAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjIsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYyLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGY0LCB4ZjYsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGY2LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzfQorICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9CisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVORElGCisgICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpOkxPUjooIiRvdXRzaXplIj0iczE2IikgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgorICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAorICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBCQ0MgICAgIHY2X2lkY3Rfcm93JF9GCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKworCisgICAgICAgIElGIENvcnRleEE4CisgICAgICAgIAorU3JjMCAgICAgICAgICAgIEVRVSAgNyAgICAgICAgICAgICAgCitTcmMxICAgICAgICAgICAgRVFVICA4ICAgICAgICAgICAgICAKK1NyYzIgICAgICAgICAgICBFUVUgIDkgICAgICAgICAgICAgIAorU3JjMyAgICAgICAgICAgIEVRVSAgMTAgICAgICAgICAgICAgIAorU3JjNCAgICAgICAgICAgIEVRVSAgMTEgICAgICAgICAgICAgIAorU3JjNSAgICAgICAgICAgIEVRVSAgMTIgICAgICAgICAgICAgIAorU3JjNiAgICAgICAgICAgIEVRVSAgMTMKK1NyYzcgICAgICAgICAgICBFUVUgIDE0CitUbXAgICAgICAgICAgICAgRVFVICAxNQorCitxWGowICAgICAgICAgICAgUU4gU3JjMC5TMTYgCitxWGoxICAgICAgICAgICAgUU4gU3JjMS5TMTYKK3FYajIgICAgICAgICAgICBRTiBTcmMyLlMxNgorcVhqMyAgICAgICAgICAgIFFOIFNyYzMuUzE2CitxWGo0ICAgICAgICAgICAgUU4gU3JjNC5TMTYKK3FYajUgICAgICAgICAgICBRTiBTcmM1LlMxNgorcVhqNiAgICAgICAgICAgIFFOIFNyYzYuUzE2CitxWGo3ICAgICAgICAgICAgUU4gU3JjNy5TMTYKK3FYanQgICAgICAgICAgICBRTiBUbXAuUzE2CisKK2RYajBsbyAgICAgICAgICBETiAoU3JjMCoyKS5TMTYKK2RYajBoaSAgICAgICAgICBETiAoU3JjMCoyKzEpLlMxNgorZFhqMWxvICAgICAgICAgIEROIChTcmMxKjIpLlMxNgorZFhqMWhpICAgICAgICAgIEROIChTcmMxKjIrMSkuUzE2CitkWGoybG8gICAgICAgICAgRE4gKFNyYzIqMikuUzE2CitkWGoyaGkgICAgICAgICAgRE4gKFNyYzIqMisxKS5TMTYKK2RYajNsbyAgICAgICAgICBETiAoU3JjMyoyKS5TMTYKK2RYajNoaSAgICAgICAgICBETiAoU3JjMyoyKzEpLlMxNgorZFhqNGxvICAgICAgICAgIEROIChTcmM0KjIpLlMxNgorZFhqNGhpICAgICAgICAgIEROIChTcmM0KjIrMSkuUzE2CitkWGo1bG8gICAgICAgICAgRE4gKFNyYzUqMikuUzE2CitkWGo1aGkgICAgICAgICAgRE4gKFNyYzUqMisxKS5TMTYKK2RYajZsbyAgICAgICAgICBETiAoU3JjNioyKS5TMTYKK2RYajZoaSAgICAgICAgICBETiAoU3JjNioyKzEpLlMxNgorZFhqN2xvICAgICAgICAgIEROIChTcmM3KjIpLlMxNgorZFhqN2hpICAgICAgICAgIEROIChTcmM3KjIrMSkuUzE2CitkWGp0bG8gICAgICAgICAgRE4gKFRtcCoyKS5TMTYKK2RYanRoaSAgICAgICAgICBETiAoVG1wKjIrMSkuUzE2CisKK3FYaTAgICAgICAgICAgICBRTiBxWGowCitxWGkxICAgICAgICAgICAgUU4gcVhqNAorcVhpMiAgICAgICAgICAgIFFOIHFYajIKK3FYaTMgICAgICAgICAgICBRTiBxWGo3CitxWGk0ICAgICAgICAgICAgUU4gcVhqNQorcVhpNSAgICAgICAgICAgIFFOIHFYanQKK3FYaTYgICAgICAgICAgICBRTiBxWGoxCitxWGk3ICAgICAgICAgICAgUU4gcVhqNgorcVhpdCAgICAgICAgICAgIFFOIHFYajMKKworZFhpMGxvICAgICAgICAgIEROIGRYajBsbworZFhpMGhpICAgICAgICAgIEROIGRYajBoaQorZFhpMWxvICAgICAgICAgIEROIGRYajRsbworZFhpMWhpICAgICAgICAgIEROIGRYajRoaQorZFhpMmxvICAgICAgICAgIEROIGRYajJsbworZFhpMmhpICAgICAgICAgIEROIGRYajJoaQorZFhpM2xvICAgICAgICAgIEROIGRYajdsbworZFhpM2hpICAgICAgICAgIEROIGRYajdoaQorZFhpNGxvICAgICAgICAgIEROIGRYajVsbworZFhpNGhpICAgICAgICAgIEROIGRYajVoaQorZFhpNWxvICAgICAgICAgIEROIGRYanRsbworZFhpNWhpICAgICAgICAgIEROIGRYanRoaQorZFhpNmxvICAgICAgICAgIEROIGRYajFsbworZFhpNmhpICAgICAgICAgIEROIGRYajFoaQorZFhpN2xvICAgICAgICAgIEROIGRYajZsbworZFhpN2hpICAgICAgICAgIEROIGRYajZoaQorZFhpdGxvICAgICAgICAgIEROIGRYajNsbworZFhpdGhpICAgICAgICAgIEROIGRYajNoaQorCitxWGgwICAgICAgICAgICAgUU4gcVhpdAorcVhoMSAgICAgICAgICAgIFFOIHFYaTAKK3FYaDIgICAgICAgICAgICBRTiBxWGkyCitxWGgzICAgICAgICAgICAgUU4gcVhpMworcVhoNCAgICAgICAgICAgIFFOIHFYaTcKK3FYaDUgICAgICAgICAgICBRTiBxWGk1CitxWGg2ICAgICAgICAgICAgUU4gcVhpNAorcVhoNyAgICAgICAgICAgIFFOIHFYaTEKK3FYaHQgICAgICAgICAgICBRTiBxWGk2CisKK2RYaDBsbyAgICAgICAgICBETiBkWGl0bG8KK2RYaDBoaSAgICAgICAgICBETiBkWGl0aGkKK2RYaDFsbyAgICAgICAgICBETiBkWGkwbG8KK2RYaDFoaSAgICAgICAgICBETiBkWGkwaGkKK2RYaDJsbyAgICAgICAgICBETiBkWGkybG8KK2RYaDJoaSAgICAgICAgICBETiBkWGkyaGkKK2RYaDNsbyAgICAgICAgICBETiBkWGkzbG8KK2RYaDNoaSAgICAgICAgICBETiBkWGkzaGkKK2RYaDRsbyAgICAgICAgICBETiBkWGk3bG8KK2RYaDRoaSAgICAgICAgICBETiBkWGk3aGkKK2RYaDVsbyAgICAgICAgICBETiBkWGk1bG8KK2RYaDVoaSAgICAgICAgICBETiBkWGk1aGkKK2RYaDZsbyAgICAgICAgICBETiBkWGk0bG8KK2RYaDZoaSAgICAgICAgICBETiBkWGk0aGkKK2RYaDdsbyAgICAgICAgICBETiBkWGkxbG8KK2RYaDdoaSAgICAgICAgICBETiBkWGkxaGkKK2RYaHRsbyAgICAgICAgICBETiBkWGk2bG8KK2RYaHRoaSAgICAgICAgICBETiBkWGk2aGkKKworcVhnMCAgICAgICAgICAgIFFOIHFYaDIKK3FYZzEgICAgICAgICAgICBRTiBxWGh0CitxWGcyICAgICAgICAgICAgUU4gcVhoMQorcVhnMyAgICAgICAgICAgIFFOIHFYaDAKK3FYZzQgICAgICAgICAgICBRTiBxWGg0CitxWGc1ICAgICAgICAgICAgUU4gcVhoNQorcVhnNiAgICAgICAgICAgIFFOIHFYaDYKK3FYZzcgICAgICAgICAgICBRTiBxWGg3CitxWGd0ICAgICAgICAgICAgUU4gcVhoMworCitxWGYwICAgICAgICAgICAgUU4gcVhnNgorcVhmMSAgICAgICAgICAgIFFOIHFYZzUKK3FYZjIgICAgICAgICAgICBRTiBxWGc0CitxWGYzICAgICAgICAgICAgUU4gcVhndAorcVhmNCAgICAgICAgICAgIFFOIHFYZzMKK3FYZjUgICAgICAgICAgICBRTiBxWGcyCitxWGY2ICAgICAgICAgICAgUU4gcVhnMQorcVhmNyAgICAgICAgICAgIFFOIHFYZzAKK3FYZnQgICAgICAgICAgICBRTiBxWGc3CisKKworcVh0MCAgICAgICAgICAgIFFOIDEuUzMyCitxWHQxICAgICAgICAgICAgUU4gMi5TMzIKK3FUMGxvICAgICAgICAgICBRTiAxLlMzMiAgICAgICAgIAorcVQwaGkgICAgICAgICAgIFFOIDIuUzMyICAgICAgICAgCitxVDFsbyAgICAgICAgICAgUU4gMy5TMzIgICAgICAgICAKK3FUMWhpICAgICAgICAgICBRTiA0LlMzMiAgICAgICAgIAorcVNjYWxlbG8gICAgICAgIFFOIDUuUzMyICAgICAgICA7Ly8gdXNlZCB0byByZWFkIHBvc3Qgc2NhbGUgdmFsdWVzCitxU2NhbGVoaSAgICAgICAgUU4gNi5TMzIKK3FUZW1wMCAgICAgICAgICBRTiA1LlMzMiAgICAgICAgIAorcVRlbXAxICAgICAgICAgIFFOIDYuUzMyICAgIAorCisKK1NjYWxlMSAgICAgICAgICBFUVUgNgorU2NhbGUyICAgICAgICAgIEVRVSAxNQorcVNjYWxlMSAgICAgICAgIFFOIFNjYWxlMS5TMTYgICAgIAorcVNjYWxlMiAgICAgICAgIFFOIFNjYWxlMi5TMTYgICAgIAorZFNjYWxlMWxvICAgICAgIEROIChTY2FsZTEqMikuUzE2ICAgICAKK2RTY2FsZTFoaSAgICAgICBETiAoU2NhbGUxKjIrMSkuUzE2CitkU2NhbGUybG8gICAgICAgRE4gKFNjYWxlMioyKS5TMTYgICAgIAorZFNjYWxlMmhpICAgICAgIEROIChTY2FsZTIqMisxKS5TMTYKKworZENvZWZzICAgICAgICAgIEROIDAuUzE2ICAgICAgICA7Ly8gU2NhbGUgY29lZmZpY2llbnRzIGluIGZvcm1hdCB7WzBdIFtDXSBbU10gW0ludlNxcnQyXX0KK0ludlNxcnQyICAgICAgICBETiBkQ29lZnNbMF0gICAgOy8vIDEvc3FydCgyKSBpbiBRMTUKK1MgICAgICAgICAgICAgICBETiBkQ29lZnNbMV0gICAgOy8vIFNpbihQSS84KSBpbiBRMTUKK0MgICAgICAgICAgICAgICBETiBkQ29lZnNbMl0gICAgOy8vIENvcyhQSS84KSBpbiBRMTUKKworcFRlbXAgICAgICAgICAgIFJOIDEyCisKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgSU1QT1JUICBhcm1DT01NX0lEQ1RDb2VmCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7cVhqMCxxWGoxfSwgW3BTcmMgQDY0XSEKKyAgICAgICAgVkxEMSAgICAgICAge3FYajIscVhqM30sIFtwU3JjIEA2NF0hCisgICAgICAgIFZMRDEgICAgICAgIHtxWGo0LHFYajV9LCBbcFNyYyBANjRdIQorICAgICAgICBWTEQxICAgICAgICB7cVhqNixxWGo3fSwgW3BTcmMgQDY0XSEKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFByZVNjYWxlIGFuZCBtdWx0aXBseSB3aXRoIFNyYworICAgICAgICA7Ly8gSVN0YWdlIDQKKyAgICAgICAgCisgICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDE2WDE2IE11bAorICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDMyWDMyICx1bAorICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gSVN0YWdlIDMKKyAgICAgICAgVlFSRE1VTEggICAgIHFYaTIsIHFYaTIsIEludlNxcnQyICAgICAgICAgICAgOy8vIGkyL3NxcnQoMikKKyAgICAgICAgVkhBREQgICAgICAgcVhoMCwgcVhpMCwgcVhpMSAgICAgICAgICAgICAgICA7Ly8gKGkwK2kxKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFYaDEsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMC1pMSkvMgorICAgICAgICBWSEFERCAgICAgICBxWGg3LCBxWGk1LCBxWGk3ICAgICAgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgVlNVQiAgICAgICAgcVhoNSwgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIFZRUkRNVUxIICAgICBxWGg1LCBxWGg1LCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBoNS9zcXJ0KDIpCisgICAgICAgIFZTVUIgICAgICAgIHFYaDIsIHFYaTIsIHFYaTMgICAgICAgICAgICAgICAgOy8vIGgyLCBoMworCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTRsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFhpNmxvLCBTICAgICAgICAgICAgICAgICA7Ly8gYyppNCtzKmk2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTRoaSwgQworICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWGk2aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDQKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTZsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFhpNGxvLCBTICAgICAgICAgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTZoaSwgQworICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWGk0aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDYKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMgorICAgICAgICBWU1VCICAgICAgICBxWGc2LCBxWGg2LCBxWGg3CisgICAgICAgIFZTVUIgICAgICAgIHFYZzUsIHFYaDUsIHFYZzYKKyAgICAgICAgVlNVQiAgICAgICAgcVhnNCwgcVhoNCwgcVhnNQorICAgICAgICBWSEFERCAgICAgICBxWGcxLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxK2gyKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFYZzIsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhnMCwgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMCtoMykvMgorICAgICAgICBWSFNVQiAgICAgICBxWGczLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwLWgzKS8yCisKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFZBREQgICAgICAgIHFYZjMsIHFYZzMsIHFYZzQgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWGY0LCBxWGczLCBxWGc0ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMiwgcVhnMiwgcVhnNSAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIHFYZjUsIHFYZzIsIHFYZzUgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYxLCBxWGcxLCBxWGc2CisgICAgICAgIFZTVUIgICAgICAgIHFYZjYsIHFYZzEsIHFYZzYgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYwLCBxWGcwLCBxWGc3CisgICAgICAgIFZTVUIgICAgICAgIHFYZjcsIHFYZzAsIHFYZzcgICAgICAKKworICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAorWFRSMCAgICAgICAgICAgIEVRVSBTcmM1CitYVFIxICAgICAgICAgICAgRVFVIFRtcAorWFRSMiAgICAgICAgICAgIEVRVSBTcmM2CitYVFIzICAgICAgICAgICAgRVFVIFNyYzcKK1hUUjQgICAgICAgICAgICBFUVUgU3JjMworWFRSNSAgICAgICAgICAgIEVRVSBTcmMwCitYVFI2ICAgICAgICAgICAgRVFVIFNyYzEKK1hUUjcgICAgICAgICAgICBFUVUgU3JjMgorWFRSdCAgICAgICAgICAgIEVRVSBTcmM0CisgICAgICAgICAgICAgICAgCitxQTAgICAgICAgICAgICAgUU4gIFhUUjAuUzMyICA7Ly8gZm9yIFhUUnBvc2UKK3FBMSAgICAgICAgICAgICBRTiAgWFRSMS5TMzIKK3FBMiAgICAgICAgICAgICBRTiAgWFRSMi5TMzIKK3FBMyAgICAgICAgICAgICBRTiAgWFRSMy5TMzIKK3FBNCAgICAgICAgICAgICBRTiAgWFRSNC5TMzIKK3FBNSAgICAgICAgICAgICBRTiAgWFRSNS5TMzIKK3FBNiAgICAgICAgICAgICBRTiAgWFRSNi5TMzIKK3FBNyAgICAgICAgICAgICBRTiAgWFRSNy5TMzIKKworZEIwICAgICAgICAgICAgIEROICBYVFIwKjIrMSAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEIxICAgICAgICAgICAgIEROICBYVFIxKjIrMQorZEIyICAgICAgICAgICAgIEROICBYVFIyKjIrMQorZEIzICAgICAgICAgICAgIEROICBYVFIzKjIrMQorZEI0ICAgICAgICAgICAgIEROICBYVFI0KjIKK2RCNSAgICAgICAgICAgICBETiAgWFRSNSoyCitkQjYgICAgICAgICAgICAgRE4gIFhUUjYqMgorZEI3ICAgICAgICAgICAgIEROICBYVFI3KjIKKworICAgICAgICAgIAorICAgICAgICBWVFJOICAgICAgICBxWGYwLCBxWGYxCisgICAgICAgIFZUUk4gICAgICAgIHFYZjIsIHFYZjMKKyAgICAgICAgVlRSTiAgICAgICAgcVhmNCwgcVhmNQorICAgICAgICBWVFJOICAgICAgICBxWGY2LCBxWGY3CisgICAgICAgIFZUUk4gICAgICAgIHFBMCwgcUEyCisgICAgICAgIFZUUk4gICAgICAgIHFBMSwgcUEzCisgICAgICAgIFZUUk4gICAgICAgIHFBNCwgcUE2CisgICAgICAgIFZUUk4gICAgICAgIHFBNSwgcUE3ICAgICAgICAKKyAgICAgICAgVlNXUCAgICAgICAgZEIwLCBkQjQKKyAgICAgICAgVlNXUCAgICAgICAgZEIxLCBkQjUKKyAgICAgICAgVlNXUCAgICAgICAgZEIyLCBkQjYKKyAgICAgICAgVlNXUCAgICAgICAgZEIzLCBkQjcKKyAgICAgICAgCisKK3FZajAgICAgICAgICAgICBRTiBxWGYwCitxWWoxICAgICAgICAgICAgUU4gcVhmMQorcVlqMiAgICAgICAgICAgIFFOIHFYZjIKK3FZajMgICAgICAgICAgICBRTiBxWGYzCitxWWo0ICAgICAgICAgICAgUU4gcVhmNAorcVlqNSAgICAgICAgICAgIFFOIHFYZjUKK3FZajYgICAgICAgICAgICBRTiBxWGY2CitxWWo3ICAgICAgICAgICAgUU4gcVhmNworcVlqdCAgICAgICAgICAgIFFOIHFYZnQKKworZFlqMGxvICAgICAgICAgIEROIChYVFIwKjIpLlMxNgorZFlqMGhpICAgICAgICAgIEROIChYVFIwKjIrMSkuUzE2CitkWWoxbG8gICAgICAgICAgRE4gKFhUUjEqMikuUzE2CitkWWoxaGkgICAgICAgICAgRE4gKFhUUjEqMisxKS5TMTYKK2RZajJsbyAgICAgICAgICBETiAoWFRSMioyKS5TMTYKK2RZajJoaSAgICAgICAgICBETiAoWFRSMioyKzEpLlMxNgorZFlqM2xvICAgICAgICAgIEROIChYVFIzKjIpLlMxNgorZFlqM2hpICAgICAgICAgIEROIChYVFIzKjIrMSkuUzE2CitkWWo0bG8gICAgICAgICAgRE4gKFhUUjQqMikuUzE2CitkWWo0aGkgICAgICAgICAgRE4gKFhUUjQqMisxKS5TMTYKK2RZajVsbyAgICAgICAgICBETiAoWFRSNSoyKS5TMTYKK2RZajVoaSAgICAgICAgICBETiAoWFRSNSoyKzEpLlMxNgorZFlqNmxvICAgICAgICAgIEROIChYVFI2KjIpLlMxNgorZFlqNmhpICAgICAgICAgIEROIChYVFI2KjIrMSkuUzE2CitkWWo3bG8gICAgICAgICAgRE4gKFhUUjcqMikuUzE2CitkWWo3aGkgICAgICAgICAgRE4gKFhUUjcqMisxKS5TMTYKK2RZanRsbyAgICAgICAgICBETiAoWFRSdCoyKS5TMTYKK2RZanRoaSAgICAgICAgICBETiAoWFRSdCoyKzEpLlMxNgorCitxWWkwICAgICAgICAgICAgUU4gcVlqMAorcVlpMSAgICAgICAgICAgIFFOIHFZajQKK3FZaTIgICAgICAgICAgICBRTiBxWWoyCitxWWkzICAgICAgICAgICAgUU4gcVlqNworcVlpNCAgICAgICAgICAgIFFOIHFZajUKK3FZaTUgICAgICAgICAgICBRTiBxWWp0CitxWWk2ICAgICAgICAgICAgUU4gcVlqMQorcVlpNyAgICAgICAgICAgIFFOIHFZajYKK3FZaXQgICAgICAgICAgICBRTiBxWWozCisKK2RZaTBsbyAgICAgICAgICBETiBkWWowbG8KK2RZaTBoaSAgICAgICAgICBETiBkWWowaGkKK2RZaTFsbyAgICAgICAgICBETiBkWWo0bG8KK2RZaTFoaSAgICAgICAgICBETiBkWWo0aGkKK2RZaTJsbyAgICAgICAgICBETiBkWWoybG8KK2RZaTJoaSAgICAgICAgICBETiBkWWoyaGkKK2RZaTNsbyAgICAgICAgICBETiBkWWo3bG8KK2RZaTNoaSAgICAgICAgICBETiBkWWo3aGkKK2RZaTRsbyAgICAgICAgICBETiBkWWo1bG8KK2RZaTRoaSAgICAgICAgICBETiBkWWo1aGkKK2RZaTVsbyAgICAgICAgICBETiBkWWp0bG8KK2RZaTVoaSAgICAgICAgICBETiBkWWp0aGkKK2RZaTZsbyAgICAgICAgICBETiBkWWoxbG8KK2RZaTZoaSAgICAgICAgICBETiBkWWoxaGkKK2RZaTdsbyAgICAgICAgICBETiBkWWo2bG8KK2RZaTdoaSAgICAgICAgICBETiBkWWo2aGkKK2RZaXRsbyAgICAgICAgICBETiBkWWozbG8KK2RZaXRoaSAgICAgICAgICBETiBkWWozaGkKKworcVloMCAgICAgICAgICAgIFFOIHFZaXQKK3FZaDEgICAgICAgICAgICBRTiBxWWkwCitxWWgyICAgICAgICAgICAgUU4gcVlpMgorcVloMyAgICAgICAgICAgIFFOIHFZaTMKK3FZaDQgICAgICAgICAgICBRTiBxWWk3CitxWWg1ICAgICAgICAgICAgUU4gcVlpNQorcVloNiAgICAgICAgICAgIFFOIHFZaTQKK3FZaDcgICAgICAgICAgICBRTiBxWWkxCitxWWh0ICAgICAgICAgICAgUU4gcVlpNgorCitkWWgwbG8gICAgICAgICAgRE4gZFlpdGxvCitkWWgwaGkgICAgICAgICAgRE4gZFlpdGhpCitkWWgxbG8gICAgICAgICAgRE4gZFlpMGxvCitkWWgxaGkgICAgICAgICAgRE4gZFlpMGhpCitkWWgybG8gICAgICAgICAgRE4gZFlpMmxvCitkWWgyaGkgICAgICAgICAgRE4gZFlpMmhpCitkWWgzbG8gICAgICAgICAgRE4gZFlpM2xvCitkWWgzaGkgICAgICAgICAgRE4gZFlpM2hpCitkWWg0bG8gICAgICAgICAgRE4gZFlpN2xvCitkWWg0aGkgICAgICAgICAgRE4gZFlpN2hpCitkWWg1bG8gICAgICAgICAgRE4gZFlpNWxvCitkWWg1aGkgICAgICAgICAgRE4gZFlpNWhpCitkWWg2bG8gICAgICAgICAgRE4gZFlpNGxvCitkWWg2aGkgICAgICAgICAgRE4gZFlpNGhpCitkWWg3bG8gICAgICAgICAgRE4gZFlpMWxvCitkWWg3aGkgICAgICAgICAgRE4gZFlpMWhpCitkWWh0bG8gICAgICAgICAgRE4gZFlpNmxvCitkWWh0aGkgICAgICAgICAgRE4gZFlpNmhpCisKK3FZZzAgICAgICAgICAgICBRTiBxWWgyCitxWWcxICAgICAgICAgICAgUU4gcVlodAorcVlnMiAgICAgICAgICAgIFFOIHFZaDEKK3FZZzMgICAgICAgICAgICBRTiBxWWgwCitxWWc0ICAgICAgICAgICAgUU4gcVloNAorcVlnNSAgICAgICAgICAgIFFOIHFZaDUKK3FZZzYgICAgICAgICAgICBRTiBxWWg2CitxWWc3ICAgICAgICAgICAgUU4gcVloNworcVlndCAgICAgICAgICAgIFFOIHFZaDMKKworcVlmMCAgICAgICAgICAgIFFOIHFZZzYKK3FZZjEgICAgICAgICAgICBRTiBxWWc1CitxWWYyICAgICAgICAgICAgUU4gcVlnNAorcVlmMyAgICAgICAgICAgIFFOIHFZZ3QKK3FZZjQgICAgICAgICAgICBRTiBxWWczCitxWWY1ICAgICAgICAgICAgUU4gcVlnMgorcVlmNiAgICAgICAgICAgIFFOIHFZZzEKK3FZZjcgICAgICAgICAgICBRTiBxWWcwCitxWWZ0ICAgICAgICAgICAgUU4gcVlnNworCisgICAgICAgIFZSU0hSICAgICAgIHFZajcsIHFZajcsICMyCisgICAgICAgIFZSU0hSICAgICAgIHFZajYsIHFZajYsICMxCisgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWWk1LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTUgPSAoajErajcpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVlpNiwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk2ID0gajEtajcKKyAgICAgICAgVkhBREQgICAgICAgcVlpMywgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkzID0gKGoyK2o2KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaTIsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMiA9IGoyLWo2CisgICAgICAgIFZIQUREICAgICAgIHFZaTcsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNyA9IChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWWk0LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTQgPSBqNS1qMworCisgICAgICAgIFZRUkRNVUxIICAgICBxWWkyLCBxWWkyLCBJbnZTcXJ0MiAgICA7Ly8gaTIvc3FydCgyKQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBUZW1wLCAjMHg0ICAgICAgICAgICAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAorICAgICAgICBWRFVQICAgICAgICBxU2NhbGUxLCBwVGVtcCAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAorICAgICAgICBWQUREICAgICAgICBxWWkwLCBxWWkwLCBxU2NhbGUxCisgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWWgwLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwK2kxKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFZaDEsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAtaTEpLzIKKworICAgICAgICBWSEFERCAgICAgICBxWWg3LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIFZTVUIgICAgICAgIHFZaDUsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUtaTcpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVloMiwgcVlpMiwgcVlpMyAgICAgICAgOy8vIGgyLCBoMworICAgICAgICBWUVJETVVMSCAgICAgcVloNSwgcVloNSwgSW52U3FydDIgICAgOy8vIGg1L3NxcnQoMikKKworICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk0bG8sIEMgICAgICAgICA7Ly8gYyppNAorICAgICAgICBWTUxBTCAgICAgICBxWHQwLCBkWWk2bG8sIFMgICAgICAgICA7Ly8gYyppNCtzKmk2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTRoaSwgQworICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWWk2aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFloNGxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg0CisgICAgICAgIFZTSFJOICAgICAgIGRZaDRoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk2bG8sIEMgICAgICAgICA7Ly8gYyppNgorICAgICAgICBWTUxTTCAgICAgICBxWHQwLCBkWWk0bG8sIFMgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTZoaSwgQworICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWWk0aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFloNmxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg2CisgICAgICAgIFZTSFJOICAgICAgIGRZaDZoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWWc2LCBxWWg2LCBxWWg3CisgICAgICAgIFZTVUIgICAgICAgIHFZZzUsIHFZaDUsIHFZZzYKKyAgICAgICAgVlNVQiAgICAgICAgcVlnNCwgcVloNCwgcVlnNQorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBWSEFERCAgICAgICBxWWcxLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxK2gyKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFZZzIsIHFZaDEsIHFZaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVlnMCwgcVloMCwgcVloMyAgICAgICAgOy8vIChoMCtoMykvMgorICAgICAgICBWSFNVQiAgICAgICBxWWczLCBxWWgwLCBxWWgzICAgICAgICA7Ly8gKGgwLWgzKS8yCisgICAgICAgIAorCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBWSEFERCAgICAgICAgcVlmMywgcVlnMywgcVlnNCAgICAgICAgCisgICAgICAgIFZIU1VCICAgICAgICBxWWY0LCBxWWczLCBxWWc0ICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjIsIHFZZzIsIHFZZzUgICAgICAgIAorICAgICAgICBWSFNVQiAgICAgICAgcVlmNSwgcVlnMiwgcVlnNSAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYxLCBxWWcxLCBxWWc2CisgICAgICAgIFZIU1VCICAgICAgICBxWWY2LCBxWWcxLCBxWWc2ICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjAsIHFZZzAsIHFZZzcKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjcsIHFZZzAsIHFZZzcgICAgICAKKworWVRSMCAgICAgICAgICAgIEVRVSBTcmMwCitZVFIxICAgICAgICAgICAgRVFVIFNyYzQKK1lUUjIgICAgICAgICAgICBFUVUgU3JjMQorWVRSMyAgICAgICAgICAgIEVRVSBTcmMyCitZVFI0ICAgICAgICAgICAgRVFVIFNyYzcKK1lUUjUgICAgICAgICAgICBFUVUgU3JjNQorWVRSNiAgICAgICAgICAgIEVRVSBUbXAKK1lUUjcgICAgICAgICAgICBFUVUgU3JjNgorWVRSdCAgICAgICAgICAgIEVRVSBTcmMzCisKK3FDMCAgICAgICAgICAgICBRTiAgWVRSMC5TMzIgICAgICAgICAgICAgICAgOy8vIGZvciBZVFJwb3NlCitxQzEgICAgICAgICAgICAgUU4gIFlUUjEuUzMyCitxQzIgICAgICAgICAgICAgUU4gIFlUUjIuUzMyCitxQzMgICAgICAgICAgICAgUU4gIFlUUjMuUzMyCitxQzQgICAgICAgICAgICAgUU4gIFlUUjQuUzMyCitxQzUgICAgICAgICAgICAgUU4gIFlUUjUuUzMyCitxQzYgICAgICAgICAgICAgUU4gIFlUUjYuUzMyCitxQzcgICAgICAgICAgICAgUU4gIFlUUjcuUzMyCisKK2REMCAgICAgICAgICAgICBETiAgWVRSMCoyKzEgICAgICAgICAgICAgICAgOy8vIGZvciB1c2luZyBWU1dQCitkRDEgICAgICAgICAgICAgRE4gIFlUUjEqMisxCitkRDIgICAgICAgICAgICAgRE4gIFlUUjIqMisxCitkRDMgICAgICAgICAgICAgRE4gIFlUUjMqMisxCitkRDQgICAgICAgICAgICAgRE4gIFlUUjQqMgorZEQ1ICAgICAgICAgICAgIEROICBZVFI1KjIKK2RENiAgICAgICAgICAgICBETiAgWVRSNioyCitkRDcgICAgICAgICAgICAgRE4gIFlUUjcqMgorICAgICAgICAgIAorICAgICAgICBWVFJOICAgICAgICBxWWYwLCBxWWYxCisgICAgICAgIFZUUk4gICAgICAgIHFZZjIsIHFZZjMKKyAgICAgICAgVlRSTiAgICAgICAgcVlmNCwgcVlmNQorICAgICAgICBWVFJOICAgICAgICBxWWY2LCBxWWY3CisgICAgICAgIFZUUk4gICAgICAgIHFDMCwgcUMyCisgICAgICAgIFZUUk4gICAgICAgIHFDMSwgcUMzCisgICAgICAgIFZUUk4gICAgICAgIHFDNCwgcUM2CisgICAgICAgIFZUUk4gICAgICAgIHFDNSwgcUM3ICAgICAgICAKKyAgICAgICAgVlNXUCAgICAgICAgZEQwLCBkRDQKKyAgICAgICAgVlNXUCAgICAgICAgZEQxLCBkRDUKKyAgICAgICAgVlNXUCAgICAgICAgZEQyLCBkRDYKKyAgICAgICAgVlNXUCAgICAgICAgZEQzLCBkRDcKKworICAgICAgICAKK2RZZjBVOCAgICAgICAgICBETiBZVFIwKjIuVTgKK2RZZjFVOCAgICAgICAgICBETiBZVFIxKjIuVTgKK2RZZjJVOCAgICAgICAgICBETiBZVFIyKjIuVTgKK2RZZjNVOCAgICAgICAgICBETiBZVFIzKjIuVTgKK2RZZjRVOCAgICAgICAgICBETiBZVFI0KjIuVTgKK2RZZjVVOCAgICAgICAgICBETiBZVFI1KjIuVTgKK2RZZjZVOCAgICAgICAgICBETiBZVFI2KjIuVTgKK2RZZjdVOCAgICAgICAgICBETiBZVFI3KjIuVTgKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRG8gc2F0dXJhdGlvbiBpZiBvdXRzaXplIGlzIG90aGVyIHRoYW4gUzE2CisgICAgICAgIDsvLworICAgICAgICAKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgIDsvLyBPdXRwdXQgcmFuZ2UgWzAtMjU1XQorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMFU4LCBxWWYwCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYxVTgsIHFZZjEKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjJVOCwgcVlmMgorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmM1U4LCBxWWYzCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY0VTgsIHFZZjQKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjVVOCwgcVlmNQorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNlU4LCBxWWY2CisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY3VTgsIHFZZjcKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCisgICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFstMjU2IHRvICsyNTVdCisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMCwgcVlmMCwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMSwgcVlmMSwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMiwgcVlmMiwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMywgcVlmMywgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNCwgcVlmNCwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNSwgcVlmNSwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNiwgcVlmNiwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNywgcVlmNywgIzE2LTkKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gU3RvcmUgb3V0cHV0IGRlcGVuZGluZyBvbiB0aGUgU3RyaWRlIHNpemUKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMSwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNCwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNywgW3BEZXN0IEA2NF0gICAgICAgICAgICAKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYwVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjFVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMlU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYzVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjRVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNVU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY2VTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjdVOCwgW3BEZXN0IEA2NF0KKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICA7Ly8gKCIkb3V0c2l6ZSI9InM5Iikgb3IgKCIkb3V0c2l6ZSI9InMxNiIpCisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYyLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY1LCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdCisgICAgICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ESUYKKworCisKKyAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4CisKKworCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLyBTY2FsZSBUV08gaW5wdXQgcm93cyB3aXRoIFRXTyByb3dzIG9mIDE2IGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgTV9JRENUX1BSRVNDQUxFMTYgdG8gcHJlLXNjYWxlIG9uZSByb3cKKyAgICAgICAgOy8vIGlucHV0IChFaWdodCBpbnB1dCB2YWx1ZXMpIHdpdGggb25lIHJvdyBvZiBzY2FsZSB2YWx1ZXMuIEFsc28gCisgICAgICAgIDsvLyBMb2FkcyBuZXh0IHNjYWxlIHZhbHVlcyBmcm9tIHBTY2FsZSwgaWYgJExhc3RSb3cgZmxhZyBpcyBub3Qgc2V0LgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkZEFsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCisgICAgICAgIDsvLyAkZEFoaSAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4KKyAgICAgICAgOy8vICRkQmxvICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4rMQorICAgICAgICA7Ly8gJGRCaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLyBxVDBsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gcVQwaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIHFUMWxvICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBxVDFoaSAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gZFNjYWxlMWxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4KKyAgICAgICAgOy8vIGRTY2FsZTFoaSAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCisgICAgICAgIDsvLyBkU2NhbGUybG8gICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCisgICAgICAgIDsvLyBkU2NhbGUyaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgRmxhZworICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRMYXN0Um93ICAgICAgICAtIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjdXJyZW50IHJvdyBpcyBsYXN0IHJvdworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKQorICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKG5leHQgZm91ciBTMTYgb2Ygcm93IG4pCisgICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAoZmlyc3QgZm91ciBTMTYgb2Ygcm93IG4rMSkKKyAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCisgICAgICAgIDsvLyBxU2NhbGUxICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93CisgICAgICAgIDsvLyBxU2NhbGUyICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93KzEKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1RfU0NBTEUxNiAkZEFsbywgJGRBaGksICRkQmxvLCAkZEJoaSwgJExhc3RSb3cKKyAgICAgICAgVk1VTEwgICAgICAgcVQwbG8sICRkQWxvLCBkU2NhbGUxbG8KKyAgICAgICAgVk1VTEwgICAgICAgcVQwaGksICRkQWhpLCBkU2NhbGUxaGkKKyAgICAgICAgVk1VTEwgICAgICAgcVQxbG8sICRkQmxvLCBkU2NhbGUybG8KKyAgICAgICAgVk1VTEwgICAgICAgcVQxaGksICRkQmhpLCBkU2NhbGUyaGkKKyAgICAgICAgSUYgIiRMYXN0Um93Ij0iMCIKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTEsIFtwU2NhbGVdLCAjMTYgIDsvLyBMb2FkIHNjYWxlIGZvciByb3cgbisxCisgICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMgorICAgICAgICBFTkRJRgorICAgICAgICBWUVJTSFJOICAgICAgICRkQWxvLCBxVDBsbywgIzEyICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEFoaSwgcVQwaGksICMxMiAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRCbG8sIHFUMWxvLCAjMTIgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICAgICRkQmhpLCBxVDFoaSwgIzEyICAgICAgICAKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBTY2FsZSA4eDggYmxvY2sgaW5wdXQgdmFsdWVzIHdpdGggMTYgYml0IHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBwcmUtc2NhbGUgYmxvY2sgb2YgOHg4IGlucHV0LgorICAgICAgICA7Ly8gVGhpcyBhbHNvIGRvIHRoZSBJc3Qgc3RhZ2UgdHJhbnNmb3JtYXRpb25zIG9mIElEQ1QuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIGRYam5sbyAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gZFhqbmhpICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIHFYam4gICAgICAgICAgICAtIG4gdGggaW5wdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBxWGluICAgICAgICAgICAgLSBuIHRoIG91dHB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgorICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAorICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGowbG8sIGRYajBoaSwgZFhqMWxvLCBkWGoxaGksIDAgICAgICAgIDsvLyBQcmUgc2NhbGUgcm93IDAgJiAxCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajJsbywgZFhqMmhpLCBkWGozbG8sIGRYajNoaSwgMCAgICAgICAgCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajRsbywgZFhqNGhpLCBkWGo1bG8sIGRYajVoaSwgMCAgICAgICAgCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajZsbywgZFhqNmhpLCBkWGo3bG8sIGRYajdoaSwgMSAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgIHFYaTUsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFYaTYsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gajEtajcKKyAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICBWSEFERCAgICAgICBxWGkzLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICBWU1VCICAgICAgICBxWGkyLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIGoyLWo2CisgICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICA7Ly8gTG9hZCBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCisgICAgICAgIFZIQUREICAgICAgIHFYaTcsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgIFZTVUIgICAgICAgIHFYaTQsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgTUVORCAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDMyIGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KKyAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIDMyYml0IHNjYWxlIHZhbHVlcyBpbiBRMjMgZm9ybWF0CisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGlubG8gICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKKyAgICAgICAgOy8vIGRYaW5oaSAgICAgICAgICAtIG4gdGggb3V0cHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgorcVNjYWxlMGxvICAgICAgIFFOIDAuUzMyCitxU2NhbGUwaGkgICAgICAgUU4gMS5TMzIKK3FTY2FsZTFsbyAgICAgICBRTiAyLlMzMgorcVNjYWxlMWhpICAgICAgIFFOIDMuUzMyCitxU2NhbGUybG8gICAgICAgUU4gcVNjYWxlMWxvCitxU2NhbGUyaGkgICAgICAgUU4gcVNjYWxlMWhpCitxU2NhbGUzbG8gICAgICAgUU4gcVNjYWxlMWxvCitxU2NhbGUzaGkgICAgICAgUU4gcVNjYWxlMWhpCitxU2NhbGU0bG8gICAgICAgUU4gcVNjYWxlMWxvCitxU2NhbGU0aGkgICAgICAgUU4gcVNjYWxlMWhpCitxU2NhbGU1bG8gICAgICAgUU4gcVNjYWxlMGxvCitxU2NhbGU1aGkgICAgICAgUU4gcVNjYWxlMGhpCitxU2NhbGU2bG8gICAgICAgUU4gcVNjYWxlMGxvCitxU2NhbGU2aGkgICAgICAgUU4gcVNjYWxlMGhpCitxU2NhbGU3bG8gICAgICAgUU4gcVNjYWxlMGxvCitxU2NhbGU3aGkgICAgICAgUU4gcVNjYWxlMGhpCisKK3FTcmMwbG8gICAgICAgICBRTiA0LlMzMgorcVNyYzBoaSAgICAgICAgIFFOIDUuUzMyCitxU3JjMWxvICAgICAgICAgUU4gNi5TMzIKK3FTcmMxaGkgICAgICAgICBRTiBTcmM0LlMzMgorcVNyYzJsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmMyaGkgICAgICAgICBRTiBxU3JjMGhpCitxU3JjM2xvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzNoaSAgICAgICAgIFFOIHFTcmMwaGkKK3FTcmM0bG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjNGhpICAgICAgICAgUU4gcVNyYzBoaQorcVNyYzVsbyAgICAgICAgIFFOIHFTcmMxbG8KK3FTcmM1aGkgICAgICAgICBRTiBxU3JjMWhpCitxU3JjNmxvICAgICAgICAgUU4gcVNyYzFsbworcVNyYzZoaSAgICAgICAgIFFOIHFTcmMxaGkKK3FTcmM3bG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjN2hpICAgICAgICAgUU4gcVNyYzBoaQorCitxUmVzMTdsbyAgICAgICAgUU4gcVNjYWxlMGxvCitxUmVzMTdoaSAgICAgICAgUU4gcVNjYWxlMGhpCitxUmVzMjZsbyAgICAgICAgUU4gcVNjYWxlMGxvCitxUmVzMjZoaSAgICAgICAgUU4gcVNjYWxlMGhpCitxUmVzNTNsbyAgICAgICAgUU4gcVNjYWxlMGxvCitxUmVzNTNoaSAgICAgICAgUU4gcVNjYWxlMGhpCisKKyAgICAgICAgICAgIEFERCAgICAgICAgIHBUZW1wLCBwU2NhbGUsICM0KjgqNyAgICAgICAgICAgOy8vIEFkZHJlc3Mgb2YgIHBTY2FsZVs3XQorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gUm93IDAKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUwbG8sIHFTY2FsZTBoaX0sIFtwU2NhbGVdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBsbywgZFhqMGxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMGhpLCBkWGowaGksICMoMTItMSkgICAgICAgICAgICAKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUxbG8sIHFTY2FsZTFoaX0sIFtwU2NhbGVdIQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBsbywgcVNjYWxlMGxvLCBxU3JjMGxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMGhpLCBxU2NhbGUwaGksIHFTcmMwaGkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU3bG8sIHFTY2FsZTdoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWxvLCBkWGoxbG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMxaGksIGRYajFoaSwgIygxMi0xKSAgICAgICAgICAgIAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGxvLCBxU3JjMGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkwCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkwaGksIHFTcmMwaGkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3bG8sIGRYajdsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzdoaSwgZFhqN2hpLCAjKDEyLTEpCisgICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWxvLCBxU2NhbGUxbG8sIHFTcmMxbG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMxaGksIHFTY2FsZTFoaSwgcVNyYzFoaQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdsbywgcVNjYWxlN2xvLCBxU3JjN2xvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjN2hpLCBxU2NhbGU3aGksIHFTcmM3aGkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUybG8sIHFTY2FsZTJoaX0sIFtwU2NhbGVdIQorCisgICAgICAgICAgICA7Ly8gUm93IDEgJiA3CisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMxN2hpLCBxU3JjMWhpLCBxU3JjN2hpICAgICAgOy8vIChqMStqNykvMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk1CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk1aGksIHFSZXMxN2hpICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMxN2xvLCBxU3JjMWxvLCBxU3JjN2xvICAgICAgOy8vIGoxLWo3CisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyBqMS1qNworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk2CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk2aGksIHFSZXMxN2hpICAgICAgCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmxvLCBkWGoybG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMyaGksIGRYajJoaSwgIygxMi0xKQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTZsbywgcVNjYWxlNmhpfSwgW3BUZW1wXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2bG8sIGRYajZsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzZoaSwgZFhqNmhpLCAjKDEyLTEpCisgICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmxvLCBxU2NhbGUybG8sIHFTcmMybG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMyaGksIHFTY2FsZTJoaSwgcVNyYzJoaQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZsbywgcVNjYWxlNmxvLCBxU3JjNmxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNmhpLCBxU2NhbGU2aGksIHFTcmM2aGkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUzbG8sIHFTY2FsZTNoaX0sIFtwU2NhbGVdIQorCisgICAgICAgICAgICA7Ly8gUm93IDIgJiA2CisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMyNmhpLCBxU3JjMmhpLCBxU3JjNmhpICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2xvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkzCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkzaGksIHFSZXMyNmhpICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMyNmxvLCBxU3JjMmxvLCBxU3JjNmxvICAgICAgOy8vIGoyLWo2CisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyBqMi1qNgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmxvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkyCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkyaGksIHFSZXMyNmhpICAgICAgCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2xvLCBkWGozbG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMzaGksIGRYajNoaSwgIygxMi0xKQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTVsbywgcVNjYWxlNWhpfSwgW3BUZW1wXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1bG8sIGRYajVsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzVoaSwgZFhqNWhpLCAjKDEyLTEpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2xvLCBxU2NhbGUzbG8sIHFTcmMzbG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMzaGksIHFTY2FsZTNoaSwgcVNyYzNoaQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVsbywgcVNjYWxlNWxvLCBxU3JjNWxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNWhpLCBxU2NhbGU1aGksIHFTcmM1aGkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgOy8vIFJvdyAzICYgNQorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzNTNoaSwgcVNyYzVoaSwgcVNyYzNoaSAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMxNioyKjIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpN2hpLCBxUmVzNTNoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzNTNsbywgcVNyYzVsbywgcVNyYzNsbyAgICAgIDsvLyBqNS1qMworICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gajUtajMKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHFYajQsIFtwU3JjIEA2NF0KKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNGhpLCBxUmVzNTNoaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRsbywgZFhqNGxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNGhpLCBkWGo0aGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU0bG8sIHFTY2FsZTRoaX0sIFtwU2NhbGVdICAgICAgICAgICAgCisgICAgICAgICAgICBMRFIgICAgICAgICBwU3JjLCA9YXJtQ09NTV9JRENUQ29lZiAgICAgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRsbywgcVNjYWxlNGxvLCBxU3JjNGxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNGhpLCBxU2NhbGU0aGksIHFTcmM0aGkKKyAgICAgICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICAgICAgOy8vIFJvdyA0CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxbG8sIHFTcmM0bG8gICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTEKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTFoaSwgcVNyYzRoaSAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBNRU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkYTlkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5CisgKi8KKyAKKworCisjaWZuZGVmIF9BUk1DT01NX01BU0tUQUJMRV9IXworI2RlZmluZSBfQVJNQ09NTV9NQVNLVEFCTEVfSF8KKworI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCisgIAorLyogTWFzayB0YWJsZSAqLworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fVmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX1ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U1YjJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX1ZlcnNpb24uaApAQCAtMCwwICsxLDQzIEBACisvKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLworI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKworCisvKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCisjZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgorCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KKyNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCisjZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKKworLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KKyNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKKworCisvKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLworI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworCisjaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCisKKworLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCisvKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLworCisvKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLworI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjBwMC0wMGJldDEiCisKKy8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLworI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQVJNIEFyY2hpdGVjdHVyZSBWNiIKKworLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCisKKworI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmMWZjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmgKQEAgLTAsMCArMSwxMTU0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIGNvbW1vbiBoZWFkZXIgZmlsZQorOy8vCisKKzsvLyBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uCisgSUYgOkxOT1Q6OkRFRjpBUk1DT01NX1NfSAorIEdCTEwgQVJNQ09NTV9TX0gKKworICAgICAgICBSRVFVSVJFOCAgICAgICAgICAgIDsvLyBSZXF1aXJlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50CisgICAgICAgIFBSRVNFUlZFOCAgICAgICAgICAgOy8vIFByZXNlcnZlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50CisgICAgICAgIAorICAgICAgICBHQkxMICAgIEFSTV9FUlJPUkNIRUNLCitBUk1fRVJST1JDSEVDSyAgU0VUTCB7RkFMU0V9CisKKzsvLyBHbG9iYWxzCisKKyAgICAgICAgR0JMUyAgICBfUlJlZ0xpc3QgICA7Ly8gUiBzYXZlZCByZWdpc3RlciBsaXN0CisgICAgICAgIEdCTFMgICAgX0RSZWdMaXN0ICAgOy8vIEQgc2F2ZWQgcmVnaXN0ZXIgbGlzdAorICAgICAgICBHQkxTICAgIF9WYXJpYW50ICAgIDsvLyBTZWxlY3RlZCBwcm9jZXNzb3IgdmFyaWFudAorICAgICAgICBHQkxTICAgIF9DUFUgICAgICAgIDsvLyBDUFUgbmFtZQorICAgICAgICBHQkxTICAgIF9TdHJ1Y3QgICAgIDsvLyBTdHJ1Y3R1cmUgbmFtZQorICAgICAgICAKKyAgICAgICAgR0JMTCAgICBfSW5GdW5jICAgICA7Ly8gSW5zaWRlIGZ1bmN0aW9uIGFzc2VtYmx5IGZsYWcKKyAgICAgICAgR0JMTCAgICBfU3dMb25nICAgICA7Ly8gTG9uZyBzd2l0Y2ggZmxhZworICAgICAgICAKKyAgICAgICAgR0JMQSAgICBfUkJ5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHJlZ2lzdGVyIGJ5dGVzIG9uIHN0YWNrCisgICAgICAgIEdCTEEgICAgX1NCeXRlcyAgICAgOy8vIE51bWJlciBvZiBzY3JhdGNoIGJ5dGVzIG9uIHN0YWNrIAorICAgICAgICBHQkxBICAgIF9BQnl0ZXMgICAgIDsvLyBTdGFjayBvZmZzZXQgb2YgbmV4dCBhcmd1bWVudAorICAgICAgICBHQkxBICAgIF9Xb3Jrc3BhY2UgIDsvLyBTdGFjayBvZmZzZXQgb2Ygc2NyYXRjaCB3b3Jrc3BhY2UKKyAgICAgICAgR0JMQSAgICBfRiAgICAgICAgICA7Ly8gRnVuY3Rpb24gbnVtYmVyCisgICAgICAgIEdCTEEgICAgX1N0T2ZmICAgICAgOy8vIFN0cnVjdCBvZmZzZXQKKyAgICAgICAgR0JMQSAgICBfU3dOdW0gICAgICA7Ly8gU3dpdGNoIG51bWJlcgorICAgICAgICBHQkxTICAgIF8zMiAgICAgICAgIDsvLyBTdWZmaXggZm9yIDMyIGJ5dGUgYWxpZ25tbmV0CisgICAgICAgIEdCTFMgICAgXzE2ICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMTYgYnl0ZSBhbGlnbm1uZXQKKyAgICAgICAgCitfSW5GdW5jICAgICAgICAgU0VUTCAgICB7RkFMU0V9CitfU0J5dGVzICAgICAgICAgU0VUQSAgICAwCitfRiAgICAgICAgICAgICAgU0VUQSAgICAwCitfU3dOdW0gICAgICAgICAgU0VUQSAgICAwCitfMzIgICAgICAgICAgICAgU0VUUyAgICAiQUxJR04zMiIKK18xNiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjE2IgorCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gT3ZlcnJpZGUgdGhlIHRvb2xzIHNldHRpbmdzIG9mIHRoZSBDUFUgaWYgdGhlICNkZWZpbmUKKzsvLyBVU0VDUFUgaXMgc2V0LCBvdGhlcndpc2UgdXNlIHRoZSBDUFUgZGVmaW5lZCBieSB0aGUKKzsvLyBhc3NlbWJsZXIgc2V0dGluZ3MuCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICBJRiA6REVGOiBPVkVSUklERUNQVQorX0NQVSAgICAgICBTRVRTICBPVkVSUklERUNQVQorICAgICAgIEVMU0UKK19DUFUgICAgICAgU0VUUyAgICB7Q1BVfSAgICAgICAKKyAgICAgICBFTkRJRgorCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFdvcmsgb3V0IHdoaWNoIGNvZGUgdG8gYnVpbGQKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBJRiA6REVGOkFSTTExMzZKUzpMT1I6OkRFRjpDb3J0ZXhBODpMT1I6OkRFRjpBUk1fR0VORVJJQworICAgICAgICAgICAgSU5GTyAxLCJQbGVhc2Ugc3dpdGNoIHRvIHVzaW5nIE1fVkFSSUFOVFMiCisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIERlZmluZSBhbmQgcmVzZXQgYWxsIG9mZmljaWFsbHkgcmVjb25nbmlzZWQgdmFyaWFudHMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTkyNkVKUworICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlMKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNMTEzNkpTX1UKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQ29ydGV4QTgKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNN1RETUkKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREVGX1ZBUklBTlQgJHZhcgorICAgICAgICBHQkxMICR2YXIKKyAgICAgICAgR0JMTCBfb2skdmFyCiskdmFyICAgIFNFVEwge0ZBTFNFfQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisKKyAgICAgICAgOy8vIFZhcmlhbnQgZGVjbGFyYXRpb24KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWZpbmUgYSBsaXN0IG9mIGNvZGUgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgICAgOy8vIHNvdXJjZSBmaWxlLiBUaGlzIG1hY3JvIHRoZW4gY2hvb3NlcyB0aGUgbW9zdAorICAgICAgICA7Ly8gYXBwcm9wcmlhdGUgdmFyaWFudCB0byBidWlsZCBmb3IgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkCisgICAgICAgIDsvLyBjb3JlLgorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX1ZBUklBTlRTICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHRvIFRSVUUgdmFyaWFudHMgdGhhdCBhcmUgc3VwcG9ydGVkCisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBfTV9WQVJJQU5UICR2MAorICAgICAgICBfTV9WQVJJQU5UICR2MQorICAgICAgICBfTV9WQVJJQU5UICR2MgorICAgICAgICBfTV9WQVJJQU5UICR2MworICAgICAgICBfTV9WQVJJQU5UICR2NAorICAgICAgICBfTV9WQVJJQU5UICR2NQorICAgICAgICBfTV9WQVJJQU5UICR2NgorICAgICAgICBfTV9WQVJJQU5UICR2NworICAgICAgICAKKyAgICAgICAgOy8vIExvb2sgZm9yIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IHRvIG1hdGNoIGEgQ1BVCisgICAgICAgIDsvLyBfTV9UUlkgY3B1LCB2YXJpYW50IGZhbGwgYmFjayBsaXN0CitfVmFyaWFudCBTRVRTICIiICAgICAgICAgICAgICAgIAorICAgICAgICBfTV9UUlkgQVJNOTI2RUotUywgICBBUk05MjZFSlMKKyAgICAgICAgX01fVFJZIEFSTTExNzZKWi1TLCAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTc2SlpGLVMsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTE1NlQyLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExNTZUMkYtUywgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTM2Si1TLCAgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTEzNkpGLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIE1QQ29yZSwgICAgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBDb3J0ZXgtQTgsICAgIENvcnRleEE4LCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIENvcnRleC1SNCwgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk03VERNSQorICAgICAgICAKKyAgICAgICAgOy8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YXJpYW50CisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBJRiBfVmFyaWFudD0iIgorICAgICAgICAgICAgSU5GTyAxLCAiTm8gbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTFNFCiskX1ZhcmlhbnQgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gUmVnaXN0ZXIgYSB2YXJpYW50IGFzIGF2YWlsYWJsZQorICAgICAgICBNQUNSTworICAgICAgICBfTV9WQVJJQU5UICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiA6TE5PVDo6REVGOl9vayR2YXIKKyAgICAgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCB2YXJpYW50ICckdmFyJyIKKyAgICAgICAgRU5ESUYKKyR2YXIgICAgU0VUTCB7VFJVRX0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEZvciBhIGdpdmVuIENQVSwgc2VlIGlmIGFueSBvZiB0aGUgdmFyaWFudHMgc3VwcG9ydGluZworICAgICAgICA7Ly8gdGhpcyBDUFUgYXJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IGlzCisgICAgICAgIDsvLyBjaG9zZW4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fVFJZICRjcHUsICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcKKyAgICAgICAgSUYgIiRjcHUiPD5fQ1BVCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBfTV9UUlkxICR2MAorICAgICAgICBfTV9UUlkxICR2MQorICAgICAgICBfTV9UUlkxICR2MgorICAgICAgICBfTV9UUlkxICR2MworICAgICAgICBfTV9UUlkxICR2NAorICAgICAgICBfTV9UUlkxICR2NQorICAgICAgICBfTV9UUlkxICR2NgorICAgICAgICBfTV9UUlkxICR2NworICAgICAgICA7Ly8gQ2hlY2sgYSBtYXRjaCB3YXMgZm91bmQKKyAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKKyAgICAgICAgICAgIElORk8gMSwgIk5vIHZhcmlhbnQgbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9UUlkxICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoX1ZhcmlhbnQ9IiIpOkxBTkQ6JHZhcgorX1ZhcmlhbnQgU0VUUyAiJHZhciIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBvZiBnaXZlbiBuYW1lCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSVUNUICRzbmFtZQorX1N0cnVjdCBTRVRTICIkc25hbWUiCitfU3RPZmYgIFNFVEEgMAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBmaWVsZAorICAgICAgICA7Ly8gVGhlIGZpZWxkIGlzIGNhbGxlZCAkc25hbWVfJGZuYW1lCisgICAgICAgIDsvLyAkc2l6ZSAgID0gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSwgbXVzdCBiZSBwb3dlciBvZiAyIAorICAgICAgICA7Ly8gJG51bWJlciA9IChpZiBwcm92aWRlZCkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZvciBhbiBhcnJheQorICAgICAgICBNQUNSTworICAgICAgICBNX0ZJRUxEICRmbmFtZSwgJHNpemUsICRudW1iZXIKKyAgICAgICAgSUYgKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSE9MAorX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAoJHNpemUgLSAoX1N0T2ZmOkFORDooJHNpemUtMSkpKQorICAgICAgICBFTkRJRgorJF9TdHJ1Y3QuXyRmbmFtZSBFUVUgX1N0T2ZmCisgICAgICAgIElGICIkbnVtYmVyIjw+IiIKK19TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUqJG51bWJlcgorICAgICAgICBFTFNFCitfU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNUUlVDVAorc2l6ZW9mXyRfU3RydWN0IEVRVSBfU3RPZmYKK19TdHJ1Y3QgU0VUUyAiIgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gU3dpdGNoIGFuZCB0YWJsZSBtYWNyb3MKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIFN0YXJ0IGEgcmVsYXRpdmUgc3dpdGNoIHRhYmxlIHdpdGggcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHYgPSB0aGUgcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLyAkcyA9IGlmIHNwZWNpZmllZCBtdXN0IGJlICJMIiB0byBpbmRpY2F0ZSBsb25nCisgICAgICAgIDsvLyAgICAgIHRoaXMgYWxsb3dzIGEgZ3JlYXRlciByYW5nZSB0byB0aGUgY2FzZSBjb2RlCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1dJVENIICR2LCAkcworICAgICAgICBBU1NFUlQgIiRzIj0iIjpMT1I6IiRzIj0iTCIKK19Td0xvbmcgU0VUTCB7RkFMU0V9CisgICAgICAgIElGICIkcyI9IkwiCitfU3dMb25nICAgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorX1N3TnVtICBTRVRBIF9Td051bSsxICAgICAgICAKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIFRCSCBbcGMsICR2LCBMU0wjMV0KKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBUQkIgW3BjLCAkdl0KKyAgICAgICAgICAgIEVORElGCitfU3dpdGNoJF9Td051bQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBBREQgcGMsIHBjLCAkdiwgTFNMICMyCisgICAgICAgICAgICBOT1AKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9DQVNFICAkbGFiZWwKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIERDVyAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBEQ0IgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBCICAgJGxhYmVsCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBFbmQgb2Ygc3dpdGNoIHN0YXRlbWVudAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICBBTElHTiAyCisgICAgICAgIE1FTkQgICAgICAgCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRGF0YSBhcmVhIGFsbG9jYXRpb24KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBDb25zdGFudCB0YWJsZSBhbGxvY2F0b3IgbWFjcm8KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gZm9yIGVhY2ggY29uc3RhbnQgdGFibGUKKyAgICAgICAgOy8vICRuYW1lIGlzIHN5bWJvbCB0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSBjYW4gYmUgYWNjZXNzZWQuCisgICAgICAgIDsvLyAkYWxpZ24gaXMgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBvZiB0aGUgdGFibGUsIGxvZzIgb2YgCisgICAgICAgIDsvLyAgdGhlIGJ5dGUgYWxpZ25tZW50IC0gJGFsaWduPTQgaXMgMTYgYnl0ZSBhbGlnbmVkCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVEFCTEUgICRuYW1lLCAkYWxpZ24KKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgIiRhbGlnbiI9IiIKKyAgICAgICAgICAgIEFSRUEgfC5jb25zdGRhdGF8LCBSRUFET05MWSwgREFUQQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJFQXMgaW5oZXJpdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIDsvLyBUaGVyZWZvcmUgZm9yIGVhY2ggYWxpZ25tZW50IHNpemUgd2UgbXVzdCBoYXZlIGFuIGFyZWEKKyAgICAgICAgICAgIDsvLyBvZiBhIGRpZmZlcmVudCBuYW1lLgorICAgICAgICAgICAgQVJFQSBjb25zdGRhdGFfYSRhbGlnbiwgUkVBRE9OTFksIERBVEEsIEFMSUdOPSRhbGlnbgorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gV2UgYWxzbyBmb3JjZSBhbGlnbm1lbnQgaW5jYXNlIHdlIGFyZSB0YWdnaW5nIG9udG8KKyAgICAgICAgICAgIDsvLyBhbiBhbHJlYWR5IHN0YXJ0ZWQgYXJlYS4KKyAgICAgICAgICAgIEFMSUdOICgxPDwkYWxpZ24pCisgICAgICAgIEVORElGCiskbmFtZQorICAgICAgICBNRU5ECisgICAgICAgIAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gTWFjcm9zIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjaworOy8vCis7Ly8gVGhlc2UgYWxsIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAorOy8vIGF0IGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgCis7Ly8gMzItYnl0ZSBhbGlnbm1lbnQgbWFjcm8gbmVlZHMgdG8gd29yayBpbiBhCis7Ly8gYml0IG1vcmUgb2YgYSBzcGVjaWFsIHdheS4uLgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgCisKKworICAgICAgICA7Ly8gQWxsb2NhdGUgMS1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMSAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORAorICAgICAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSAyLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MyICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjEpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoMiAtIChfU0J5dGVzOkFORDoxKSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5ECisgICAgICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDQtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzQgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg0IC0gKF9TQnl0ZXM6QU5EOjMpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DOCAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzE2KSBieXRlcy4KKyAgICAgICAgOy8vIFRoZSBleHRyYSAxNiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAxNiBieXRlcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzE2ICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GJF8xNiAgIEVRVSAoX1NCeXRlcyArIDgpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyA4CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMzIpIGJ5dGVzLgorICAgICAgICA7Ly8gVGhlIGV4dHJhIDMyIGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDMyIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMzIgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YkXzMyICAgRVFVIChfU0J5dGVzICsgMjQpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyAyNAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBBcmd1bWVudCBEZWNsYXJhdGlvbiBNYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEFsbG9jYXRlIGFuIGFyZ3VtZW50IG5hbWUgJG5hbWUKKyAgICAgICAgOy8vIHNpemUgJHNpemUgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BUkcgICAgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgX0luRnVuYworJG5hbWUkX0YgICAgRVFVIF9BQnl0ZXMKK19BQnl0ZXMgU0VUQSBfQUJ5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBNYWNyb3MgdG8gYWNjZXNzIHN0YWNrZWQgdmFyaWFibGVzCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24KKyAgICAgICAgOy8vIHdpdGggYSBjb25zdGFudCBzZWNvbmQgb3BlcmFuZAorICAgICAgICBNQUNSTworICAgICAgICBfTV9PUEMgJG9wLCRyZCwkcm4sJGNvbnN0CisgICAgICAgIExDTEEgICAgX3NoCisgICAgICAgIExDTEEgICAgX2NzdAorX3NoICAgICBTRVRBICAgIDAKK19jc3QgICAgU0VUQSAgICAkY29uc3QKKyAgICAgICAgSUYgX2NzdD0wCisgICAgICAgICRvcCAkcmQsICRybiwgI19jc3QKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIFdISUxFIChfY3N0OkFORDozKT0wCitfY3N0ICAgICAgICBTRVRBIF9jc3Q+PjIKK19zaCAgICAgICAgIFNFVEEgX3NoKzIKKyAgICAgICAgV0VORAorICAgICAgICAkb3AgJHJkLCAkcm4sICMoX2NzdDpBTkQ6MHgwMDAwMDBGRik8PF9zaAorICAgICAgICBJRiBfY3N0Pj0yNTYKKyAgICAgICAgICAgICRvcCAkcmQsICRyZCwgIyhfY3N0OkFORDoweEZGRkZGRjAwKTw8X3NoCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgYWNjZXNzIG9wZXJhdGlvbgorICAgICAgICA7Ly8gU3VjaCBhcyBMRFIgb3IgU1RSCisgICAgICAgIDsvLyBUaGUgYWRkcmVzc2luZyBtb2RlIGlzIG1vZGlmaWVkIHN1Y2ggdGhhdAorICAgICAgICA7Ly8gMS4gSWYgbm8gYWRkcmVzcyBpcyBnaXZlbiB0aGVuIHRoZSBuYW1lIGlzIHRha2VuCisgICAgICAgIDsvLyAgICBhcyBhIHN0YWNrIG9mZnNldAorICAgICAgICA7Ly8gMi4gSWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUKKyAgICAgICAgOy8vICAgIHN0YXRlIGJlaW5nIGFzc2VtYmxlZCBmb3IgKGVnIFRodW1iKSB0aGVuIGEgc3VpdGFibGUKKyAgICAgICAgOy8vICAgIGFkZHJlc3NpbmcgbW9kZSBpcyBzdWJzdGl0dXRlZC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPbiBFbnRyeToKKyAgICAgICAgOy8vICRpID0gSW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSAoZWcgIkxEUkIiKQorICAgICAgICA7Ly8gJGEgPSBSZXF1aXJlZCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8gJHIgPSBSZWdpc3RlcihzKSB0byB0cmFuc2ZlciAoZWcgInIxIikKKyAgICAgICAgOy8vICRhMCwkYTEsJGEyLiBBZGRyZXNzaW5nIG1vZGUgYW5kIGNvbmRpdGlvbi4gT25lIG9mOgorICAgICAgICA7Ly8gICAgIGxhYmVsIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdICAgICAgICAgICAgICAgICAgICB7LCwsY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldF17IX0gICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0LCBzaGlmdF17IX0gIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQgICAgICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCwgc2hpZnQgICAgIHssY2N9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0RBVEEgJGksJGEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIElGICIkYTAiOkxFRlQ6MT0iWyIKKyAgICAgICAgICAgIElGICIkYTEiPSIiCisgICAgICAgICAgICAgICAgJGkkYTMgICAkciwgJGEwCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgSUYgIiRhMCI6UklHSFQ6MT0iXSIKKyAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgJGExCisgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCisgICAgICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAkYTEKKyAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKKyAgICAgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTENMQSAgICBfT2Zmc2V0CitfT2Zmc2V0ICAgICBTRVRBICAgIF9Xb3Jrc3BhY2UgKyAkYTAkX0YKKyAgICAgICAgICAgIEFTU0VSVCAgKF9PZmZzZXQ6QU5EOigkYS0xKSk9MAorICAgICAgICAgICAgJGkkYTEgICAkciwgW3NwLCAjX09mZnNldF0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEhhbmRsZSBwb3N0IGluZGV4ZWQgbG9hZC9zdG9yZXMKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlXSwgb2Zmc2V0CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BPU1RJTkQgJGksJHIsJGEwLCRhMQorICAgICAgICBMQ0xTIF9iYXNlCisgICAgICAgIExDTFMgX29mZnNldAorICAgICAgICBJRiB7Q09ORklHfT0xNiA7Ly8gVGh1bWIKK19iYXNlICAgICAgIFNFVFMgKCIkYTAiOkxFRlQ6KDpMRU46IiRhMCItMSkpOlJJR0hUOig6TEVOOiIkYTAiLTIpICAgOy8vIHJlbW92ZSBbXQorX29mZnNldCAgICAgU0VUUyAiJGExIgorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9IisiCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAkaSAgJHIsICRhMAorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9Ii0iCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgICAgICBTVUIgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVMU0UgOy8vIEFSTQorICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gSGFuZGxlIHByZSBpbmRleGVkIGxvYWQvc3RvcmUKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlLCBvZmZzZXRdeyF9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BSRUlORCAkaSwkciwkYTAsJGExCisgICAgICAgIExDTFMgX2Jhc2UKKyAgICAgICAgTENMUyBfb2Zmc2V0CisgICAgICAgIElGICh7Q09ORklHfT0xNik6TEFORDooKCIkYTEiOlJJR0hUOjIpPSJdISIpCitfYmFzZSAgICAgICBTRVRTICIkYTAiOlJJR0hUOig6TEVOOigiJGEwIiktMSkKK19vZmZzZXQgICAgIFNFVFMgIiRhMSI6TEVGVDooOkxFTjooIiRhMSIpLTIpCisgICAgICAgICAgICAkaSAkciwgWyRfYmFzZSwgJF9vZmZzZXRdCisgICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgIEVMU0UKKyAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGJ5dGUgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgYnl0ZSBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSU0IgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUlNCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgYnl0ZSB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkggICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJTSCAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSU0giLDIsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBoYWxmIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJIICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUiAgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSICAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIGRvdWJsZSB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgZG91YmxlIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbgorICAgICAgICBNQUNSTworICAgICAgICBNX0FEUiAgICRhLCAkYiwgJGNjCisgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YpCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDE2IGJ5dGVzCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQURSMTYgJGEsICRiLCAkY2MKKyAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzE2KQorICAgICAgICAKKyAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMTYgYnl0ZXMKKyAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MEYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMzIgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BRFIzMiAkYSwgJGIsICRjYworICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMzIpCisgICAgICAgIAorICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAzMiBieXRlcworICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgxRgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRnVuY3Rpb24gaGVhZGVyIGFuZCBmb290ZXIgbWFjcm9zCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIEhlYWRlciBNYWNybyAgICAKKyAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gcHJvbG9ndWUKKyAgICAgICAgOy8vIE5vdGUgdGhhdCBmdW5jdGlvbnMgc2hvdWxkIGFsbCBiZSAic3RhY2stbW92ZXMtb25jZSIKKyAgICAgICAgOy8vIFRoZSBGTlNUQVJUIGFuZCBGTkVORCBtYWNyb3Mgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlcworICAgICAgICA7Ly8gd2hlcmUgdGhlIHN0YWNrIG1vdmVzLgorICAgICAgICA7Ly8gICAgCisgICAgICAgIDsvLyAkbmFtZSAgPSBmdW5jdGlvbiBuYW1lCisgICAgICAgIDsvLyAkcnJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSByZWdpc3RlcnMKKyAgICAgICAgOy8vICAgICAgICAgICJsciIgc3RhY2sgImxyIiBvbmx5CisgICAgICAgIDsvLyAgICAgICAgICAick4iIHN0YWNrIHJlZ2lzdGVycyAicjQtck4sbHIiCisgICAgICAgIDsvLyAkZHJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSBEIHJlZ2lzdGVycworICAgICAgICA7Ly8gICAgICAgICAgImROIiBzdGFjayByZWdpc3RlcnMgImQ4LWROIgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5vdGU6IEFSTSBBcmNoaWN0dXJlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIEFBUENTCisgICAgICAgIDsvLyBzdGF0ZXMgdGhhdCByNC1yMTEsIHNwLCBkOC1kMTUgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkKKyAgICAgICAgOy8vIGEgY29tcGxpYW50IGZ1bmN0aW9uLgorICAgICAgICBNQUNSTworICAgICAgICBNX1NUQVJUICRuYW1lLCAkcnJlZywgJGRyZWcKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgQVNTRVJUICIkbmFtZSIhPSIiCitfSW5GdW5jIFNFVEwge1RSVUV9CitfUkJ5dGVzIFNFVEEgMAorX1dvcmtzcGFjZSBTRVRBIDAKKworICAgICAgICA7Ly8gQ3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBmdW5jdGlvbiAgICAgICAgCisgICAgICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorICAgICAgICBFWFBPUlQgICRuYW1lCiskbmFtZSAgIEZVTkNUSU9OCisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBSIHJlZ2lzdGVycworICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZworICAgICAgICBJRiBfUlJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBTVE1GRCAgIHNwISwgeyRfUlJlZ0xpc3QsIGxyfQorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBEIHJlZ2lzdGVycworICAgICAgICBfTV9HRVREUkVHTElTVCAgJGRyZWcgICAgICAgIAorICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWU1RNRkQgIHNwISwgeyRfRFJlZ0xpc3R9CisgICAgICAgIEVORElGICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBFbnN1cmUgc2l6ZSBjbGFpbWVkIG9uIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCisgICAgICAgIElGICgoX1NCeXRlczpBTkQ6NykhPTApCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGIChfU0J5dGVzIT0wKQorICAgICAgICAgICAgX01fT1BDIFNVQiwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICAKK19BQnl0ZXMgU0VUQSBfU0J5dGVzICsgX1JCeXRlcyAtIF9Xb3Jrc3BhY2UKKworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBQcmludCBmdW5jdGlvbiBuYW1lIGlmIGRlYnVnIGVuYWJsZWQKKyAgICAgICAgTV9QUklOVEYgIiRuYW1lXG4iLAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIFIgc2F2ZWQgcmVnaXN0ZXJzCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCisgICAgICAgIElGICIkcnJlZyI9IiIKK19SUmVnTGlzdCAgIFNFVFMgIiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgSUYgIiRycmVnIj0ibHIiOkxPUjoiJHJyZWciPSJyNCIKK19SUmVnTGlzdCAgIFNFVFMgInI0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InI1IjpMT1I6IiRycmVnIj0icjYiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yNiIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjciOkxPUjoiJHJyZWciPSJyOCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXI4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyOSI6TE9SOiIkcnJlZyI9InIxMCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXIxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjExIjpMT1I6IiRycmVnIj0icjEyIgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEyIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgciByZWdpc3RlciBsaW1pdCAnJHJyZWcnIgorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgRCBzYXZlZCByZWdpc3RlcnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fR0VURFJFR0xJU1QgJGRyZWcKKyAgICAgICAgSUYgIiRkcmVnIj0iIgorX0RSZWdMaXN0ICAgU0VUUyAiIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBJRiAiJGRyZWciPSJkOCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQ5IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDkiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDExIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDExIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTIiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTIiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMyIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMyIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0OAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDE0IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzU2CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTUiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTUiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNjQKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCBkIHJlZ2lzdGVyIGxpbWl0ICckZHJlZyciCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBQcm9kdWNlIGZ1bmN0aW9uIHJldHVybiBpbnN0cnVjdGlvbnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUkVUICRjYworICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWUE9QJGNjIHskX0RSZWdMaXN0fQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBfUlJlZ0xpc3Q9IiIKKyAgICAgICAgICAgIEJYJGNjIGxyCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSRjYy5GRCBzcCEsIHskX1JSZWdMaXN0LCBwY30KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRWFybHkgRnVuY3Rpb24gRXhpdCBNYWNybworICAgICAgICA7Ly8gJGNjID0gY29uZGl0aW9uIHRvIGV4aXQgd2l0aAorICAgICAgICA7Ly8gKEV4YW1wbGU6IE1fRVhJVCBFUSkKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9FWElUICAkY2MKKyAgICAgICAgQVNTRVJUICBfSW5GdW5jCisgICAgICAgIElGICBfU0J5dGVzIT0wCisgICAgICAgICAgICA7Ly8gUmVzdG9yZSBzdGFjayBmcmFtZSBhbmQgZXhpdAorICAgICAgICAgICAgQiRjYyAgX0VuZCRfRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQ2FuIHJldHVybiBkaXJlY3RseQorICAgICAgICAgICAgX01fUkVUICRjYworICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBGb290ZXIgTWFjcm8gICAgICAgIAorICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQorICAgICAgICBNQUNSTworICAgICAgICBNX0VORAorICAgICAgICBBU1NFUlQgX0luRnVuYworX0luRnVuYyBTRVRMIHtGQUxTRX0KK19FbmQkX0YKKworICAgICAgICA7Ly8gUmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciB0byBpdHMgb3JpZ2luYWwgdmFsdWUgb24gZnVuY3Rpb24gZW50cnkKKyAgICAgICAgSUYgX1NCeXRlcyE9MAorICAgICAgICAgICAgX01fT1BDIEFERCwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIF9NX1JFVAorICAgICAgICBFTkRGVU5DCisKKyAgICAgICAgOy8vIFJlc2V0IHRoZSBnbG9iYWwgc3RhY2sgdHJhY2tpbmcgdmFyaWFibGVzIGJhY2sgdG8gdGhlaXIgCisgICAgICAgIDsvLyBpbml0aWFsIHZhbHVlcywgYW5kIGluY3JlbWVudCB0aGUgZnVuY3Rpb24gY291bnQKK19TQnl0ZXMgICAgICAgIFNFVEEgMAorX0YgICAgICAgICAgICAgU0VUQSBfRisxCisgICAgICAgIE1FTkQKKworICAgICAgICAgICAgICAgIAorOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsvLyBEZWJ1ZyBNYWNyb3MKKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgR0JMTCAgICBERUJVR19PTgorREVCVUdfT04gU0VUTCAgIHtGQUxTRX0KKyAgICAgICAgR0JMTCAgICBERUJVR19TVEFMTFNfT04KK0RFQlVHX1NUQUxMU19PTiBTRVRMIHtGQUxTRX0KKyAgICAgICAgCisgICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIDsvLyBEZWJ1ZyBjYWxsIHRvIHByaW50ZgorICAgICAgICA7Ly8gIE1fUFJJTlRGICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBFeGFtcGxlczoKKyAgICAgICAgOy8vICBNX1BSSU5URiAieD0lMDh4XG4iLCByMAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzIGluY2x1ZGluZyB0aGUKKyAgICAgICAgOy8vIGZsYWdzLgorICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fUFJJTlRGICAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCisgICAgICAgIElGIERFQlVHX09OCisgICAgICAgIAorICAgICAgICBJTVBPUlQgIHByaW50ZgorICAgICAgICBMQ0xBICAgIG5BcmdzCituQXJncwlTRVRBICAgIDAKKyAgICAgICAgCisgICAgICAgIDsvLyBzYXZlIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBjb3JydXB0IHRoZW0KKyAgICAgICAgU1RNRkQgICBzcCEsIHtyMC1yMTIsIGxyfQorICAgICAgICAKKyAgICAgICAgOy8vIERyb3Agc3RhY2sgdG8gZ2l2ZSB1cyBzb21lIHdvcmtzcGFjZQorICAgICAgICBTVUIgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgd2UgbmVlZCB0byBwcmludCB0byB0aGUgc3RhY2sKKyAgICAgICAgSUYgIiR2YWwyIiA8PiAiIgorICAgICAgICAgICAgQVNTRVJUICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMiwgW3NwLCAjOF0KK25BcmdzICAgICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIEFTU0VSVCAiJHZhbDAiIDw+ICIiCisgICAgICAgICAgICBTVFIgICAgJHZhbDEsIFtzcCwgIzRdCituQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiR2YWwwIjw+IiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMCwgW3NwXQorbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gTm93IHdlIGFyZSBzYWZlIHRvIGNvcnJ1cHQgcmVnaXN0ZXJzCisgICAgICAgIEFEUiAgICAgcjAsICVGVDAwCisgICAgICAgIElGIG5BcmdzPTEKKyAgICAgICAgICBMRFIgICByMSwgW3NwXQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBuQXJncz0yCisgICAgICAgICAgTERNSUEgc3AsIHtyMSxyMn0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgbkFyZ3M9MworICAgICAgICAgIExETUlBIHNwLCB7cjEscjIscjN9CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gcHJpbnQgdGhlIHZhbHVlcworICAgICAgICBNUlMgICAgIHI0LCBjcHNyICAgICAgICA7Ly8gcHJlc2VydmUgZmxhZ3MKKyAgICAgICAgQkwgICAgICBwcmludGYKKyAgICAgICAgTVNSICAgICBjcHNyX2YsIHI0ICAgICAgOy8vIHJlc3RvcmUgZmxhZ3MKKyAgICAgICAgQiAgICAgICAlRlQwMQorMDAgICAgICA7Ly8gc3RyaW5nIHRvIHByaW50CisgICAgICAgIERDQiAgICAgIiRmb3JtYXQiLCAwCisgICAgICAgIEFMSUdOCiswMSAgICAgIDsvLyBGaW5pc2hlZAorICAgICAgICBBREQgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIDsvLyBSZXN0b3JlIHJlZ2lzdGVycworICAgICAgICBMRE1GRAlzcCEsIHtyMC1yMTIsbHJ9CisKKyAgICAgICAgRU5ESUYgICA7Ly8gREVCVUdfT04KKyAgICAgICAgTUVORAorCisKKyAgICAgICAgOy8vIFN0YWxsIFNpbXVsYXRpb24gTWFjcm8KKyAgICAgICAgOy8vIEluc2VydHMgYSBnaXZlbiBudW1iZXIgb2YgTk9QcyBmb3IgdGhlIGN1cnJlbnRseQorICAgICAgICA7Ly8gIGRlZmluZWQgcGxhdGZvcm0KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVEFMTCAkcGxhdDFzdGFsbCwgJHBsYXQyc3RhbGwsICRwbGF0M3N0YWxsLCAkcGxhdDRzdGFsbCwgJHBsYXQ1c3RhbGwsICRwbGF0NnN0YWxsCisgICAgICAgIElGIERFQlVHX1NUQUxMU19PTgorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MnN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0M3N0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NHN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NnN0YWxsICAgIAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXRzdGFsbAorICAgICAgICBJRiAiJHBsYXRzdGFsbCIhPSIiCisgICAgICAgICAgICBMQ0xBIF9wbGxlbgorICAgICAgICAgICAgTENMUyBfcGwKKyAgICAgICAgICAgIExDTEwgX3BsbG9nCitfcGxsZW4gICAgICBTRVRBIDpMRU46IiRwbGF0c3RhbGwiCitfcGwgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpMRUZUOihfcGxsZW4gLSAyKQorICAgICAgICAgICAgSUYgOkRFRjokX3BsCisgICAgICAgICAgICAgICAgSUYgJF9wbAorICAgICAgICAgICAgICAgICAgICBMQ0xTIF9zdAorICAgICAgICAgICAgICAgICAgICBMQ0xBIF9zdG51bQorX3N0ICAgICAgICAgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpSSUdIVDoxICAgICAgICAKK19zdG51bSAgICAgICAgICAgICAgU0VUQSAkX3N0CisgICAgICAgICAgICAgICAgICAgIFdISUxFIF9zdG51bT4wCisJCQlNT1Ygc3AsIHNwCitfc3RudW0gICAgICAgICAgICAgICAgICBTRVRBIF9zdG51bSAtIDEKKyAgICAgICAgICAgICAgICAgICAgV0VORAorICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOy8vIEVuZGlhbiBJbnZhcmllbmNlIE1hY3JvcworOy8vIAorOy8vIFRoZSBpZGVhIGJlaGluZCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBpZiBhbiBhcnJheSBpcworOy8vIGxvYWRlZCBhcyB3b3JkcyB0aGVuIHRoZSBTTVVMMDAgbWFjcm8gd2lsbCBtdWx0aXBseQorOy8vIGFycmF5IGVsZW1lbnRzIDAgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQorOy8vIHN5c3RlbS4gRm9yIGxpdHRsZSBlbmRpYW4gU01VTDAwPVNNVUxCQiwgZm9yIGJpZworOy8vIGVuZGlhbiBTTVVMMDA9U01VTFRUIGFuZCBzaW1pbGFybHkgZm9yIG90aGVyIHBhY2tlZCBvcGVyYXRpb25zLgorOy8vCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIExJQkk0ICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgSUYge0VORElBTn09ImJpZyIKKyAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjLCAkZAorICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYywgJGQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTElCSTMgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIElGIHtFTkRJQU59PSJiaWciCisgICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU01MQXh5IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTAwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTBUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFNNVUx4eSBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDAxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMEIgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwVCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDEwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMTEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxQiAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDFUICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMQjAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxCMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFQwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVDEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTTUxBV3gsIFNNVUxXeCBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFXMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBV0IsIFNNTEFXVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVzEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVdULCBTTUxBV0IsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFcwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFdCLCBTTVVMV1QsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVzEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMV1QsIFNNVUxXQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU01MQUx4eSBtYWNyb3MKKworCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDAxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDEwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTEIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICBFTkRJRiA7Ly8gQVJNQ09NTV9TX0gKKyAgICAgICAgICAgIAorICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybU9NWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjlmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybU9NWC5oCkBAIC0wLDAgKzEsMjc0IEBACisvKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIFRoaXMgZmlsZSBhbGxvd3MgYSB2ZXJzaW9uIG9mIHRoZSBPTVggREwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IHdoZXJlIHNvbWUgb3IKKyAqIGFsbCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIGdpdmVuIGEgdXNlciBzcGVjaWZpZWQgc3VmZml4LiAKKyAqCisgKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgaXQgd2hlcmU6CisgKgorICogLSB5b3Ugd2FudCB0byByZW5hbWUgYSBmdW5jdGlvbiAib3V0IG9mIHRoZSB3YXkiIHNvIHRoYXQgeW91IGNvdWxkIHJlcGxhY2UKKyAqICAgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gKHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdvdWxkIHN0aWxsIGJlCisgKiAgIGluIHRoZSBsaWJyYXJ5IGp1c3Qgd2l0aCBhIGRpZmZlcmVudCBuYW1lIC0gc28geW91IGNvdWxkIGRlYnVnIHRoZSBuZXcKKyAqICAgdmVyc2lvbiBieSBjb21wYXJpbmcgaXQgdG8gdGhlIG91dHB1dCBvZiB0aGUgb2xkKQorICoKKyAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGFsbCB0aGUgZnVuY3Rpb25zIHRvIHZlcnNpb25zIHdpdGggYSBzdWZmaXggc28gdGhhdCAKKyAqICAgeW91IGNhbiBpbmNsdWRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBhbmQgY2hvb3NlIGJldHdlZW4gZnVuY3Rpb25zCisgKiAgIGF0IHJ1bnRpbWUuCisgKgorICogICAgIGUuZy4gb214SVBCTV9Db3B5X1U4X0MxUiBjb3VsZCBiZSByZW5hbWVkIG9teElQQk1fQ29weV9VOF9DMVJfQ29ydGV4QTgKKyAqIAorICovCisKKyAgCisjaWZuZGVmIF9hcm1PTVhfSF8KKyNkZWZpbmUgX2FybU9NWF9IXworCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgaW4gb3JkZXIgdG8gZXhwYW5kIGFuZCBjb25jYXRlbmF0ZSB0aGUgbmFtZXMgKi8KKyNkZWZpbmUgT01YQ0FUMkJBUihBLCBCKSBvbXggIyMgQSAjIyBCCisjZGVmaW5lIE9NWENBVEJBUihBLCBCKSBPTVhDQVQyQkFSKEEsIEIpCisKKy8qIERlZmluZSB0aGUgc3VmZml4IHRvIGFkZCB0byBhbGwgZnVuY3Rpb25zIC0gdGhlIGRlZmF1bHQgaXMgbm8gc3VmZml4ICovCisjZGVmaW5lIEJBUkVfU1VGRklYIAorCisKKworLyogRGVmaW5lIHdoYXQgaGFwcGVucyB0byB0aGUgYmFyZSBzdWZmaXgtbGVzcyBmdW5jdGlvbnMsIGRvd24gdG8gdGhlIHN1Yi1kb21haW4gYWNjdXJhY3kgKi8KKyNkZWZpbmUgT01YQUNBQUNfU1VGRklYICAgIEJBUkVfU1VGRklYICAgCisjZGVmaW5lIE9NWEFDTVAzX1NVRkZJWCAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJQ0pQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBCTV9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQQ1NfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUFBQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YU1BfU1VGRklYICAgICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDQ09NTV9TVUZGSVggICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ000UDEwX1NVRkZJWCAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNNNFAyX1NVRkZJWCAgIEJBUkVfU1VGRklYCisKKworCisKKy8qIERlZmluZSB3aGF0IHRoZSBlYWNoIGJhcmUsIHVuLXN1ZmZpeGVkIE9wZW5NQVggQVBJIGZ1bmN0aW9uIG5hbWVzIGlzIHRvIGJlIHJlbmFtZWQgKi8KKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlRGF0U3RyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRGF0U3RyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUZpbGxFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUZpbGxFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZVByZ0NmZ0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVByZ0NmZ0VsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0VuY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0VuY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0kgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEZ3ZF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEZ3ZF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEludl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEludl9TMzJfUzE2LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX05vaXNlbGVzc0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX05vaXNlbGVzc0RlY29kZSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19RdWFudEludl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19RdWFudEludl9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRElGSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRElGSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciwgT01YQUNBQUNfU1VGRklYKQorCisKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZV9TMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZV9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfTURDVEludl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfTURDVEludl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZV9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZV9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2LCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTaWRlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTaWRlSW5mbywgT01YQUNNUDNfU1VGRklYKQorCisjZGVmaW5lIG9teElDSlBfQ29weUV4cGFuZF9VOF9DMyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfQ29weUV4cGFuZF9VOF9DMywgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorCisjZGVmaW5lIG9teElQQk1fQWRkQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQWRkQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fQ29weV9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DM1IsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX01pcnJvcl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX01pcnJvcl9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX011bENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX011bENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCisKKyNkZWZpbmUgb214SVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiAgICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisKKyNkZWZpbmUgb214SVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlckZJUl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlckZJUl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50R2V0U3RhdGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50R2V0U3RhdGVTaXplLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRJbml0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DM1IsIE9NWElQUFBfU1VGRklYKQorCisjZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfQ29weV9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQ29weV9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV84eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaywgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5MTZ4MTYsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5OHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5OHg4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fRXhwYW5kRnJhbWVfSSwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0xpbWl0TVZUb1JlY3QsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9TQURfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQXZlcmFnZV80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrTHVtYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgT01YQ0FUQkFSKFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0dldFZMQ0luZm8sIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FSW5pdCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfMTZ4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzh4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQVREXzR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQVREXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVBhZE1WX1BWT1AsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlTVYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRmluZE1WcHJlZCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0lEQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NQ1JlY29uQmxvY2ssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUluaXQsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLCBPTVhWQ000UDJfU1VGRklYKQorCisKKyNlbmRpZiAvKiBfYXJtT01YX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyOTVhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaApAQCAtMCwwICsxLDI1MiBAQAorLyoqCisgKiBGaWxlOiBvbXh0eXBlcy5oCisgKiBCcmllZjogRGVmaW5lcyBiYXNpYyBEYXRhIHR5cGVzIHVzZWQgaW4gT3Blbk1BWCB2MS4wLjIgaGVhZGVyIGZpbGVzLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorICoKKyAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAorICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKKyAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKKyAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCisgKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCisgKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKKyAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAorICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCisgKgorICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCisgKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKKyAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAorICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAorICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCisgKiBtYXRlcmlhbHMuCisgKiAKKyAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqCisgKi8KKyAgCisjaWZuZGVmIF9PTVhUWVBFU19IXworI2RlZmluZSBfT01YVFlQRVNfSF8KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAKKworI2RlZmluZSBPTVhfSU4KKyNkZWZpbmUgT01YX09VVAorI2RlZmluZSBPTVhfSU5PVVQKKworCit0eXBlZGVmIGVudW0geworICAgIAorICAgIC8qIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uICovCisgICAgT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgPSAgMCwgICAgLyogTm8gZXJyb3IsIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgPSAtMiwgICAgLyogVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAqLyAgICAKKyAgICBPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICA9IC0xODIsICAvKiBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAqLyAgICAKKyAgICBPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICA9IC05LCAgICAvKiBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gKi8KKyAgICBPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICA9IC0xNTksICAvKiBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkICovCisgICAgT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgPSAtMTY3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAqLworICAgIE9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgID0gLTE2MywgIC8qIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgKi8gICAgIAorICAgIE9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgID0gLTE2MiwgIC8qIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICovICAgIAorCU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgID0gLTE2MCwgIC8qIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgKi8KKworICAgIC8qIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24qLworICAgIE9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgID0gLTUsICAgIC8qIEJhZCBBcmd1bWVudHMgKi8KKworICAgIE9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgID0gLTE1NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgPSAtMTU2LCAgLyogQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAqLyAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgID0gLTE1NSwgIC8qIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgID0gLTE1NCwgIC8qIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgPSAtMTUzLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgID0gLTE1MiwgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgKi8gIAorCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgPSAtMTgzLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICovCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgPSAtMTgxLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICA9IC0xNywgICAvKiBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gKi8KKworICAgIE9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgID0gLTE4MCwgIC8qIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAqLworCisgICAgT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgPSBJTlRfTUFYICAvKlBsYWNlaG9sZGVyLCBmb3JjZXMgZW51bSBvZiBzaXplIE9NWF9JTlQqLworICAgIAorIH0gT01YUmVzdWx0OyAgICAgICAgICAvKiogUmV0dXJuIHZhbHVlIG9yIGVycm9yIHZhbHVlIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbi4gSWRlbnRpY2FsIHRvIE9NWF9JTlQgKi8KKworIAorLyogT01YX1U4ICovCisjaWYgVUNIQVJfTUFYID09IDB4ZmYKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7CisjZWxpZiBVU0hSVF9NQVggPT0gMHhmZiAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VODsgCisjZWxzZQorI2Vycm9yIE9NWF9VOCB1bmRlZmluZWQKKyNlbmRpZiAKKworIAorLyogT01YX1M4ICovCisjaWYgU0NIQVJfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKKyNlbGlmIFNIUlRfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKKyNlbHNlCisjZXJyb3IgT01YX1M4IHVuZGVmaW5lZAorI2VuZGlmCisgCisgCisvKiBPTVhfVTE2ICovCisjaWYgVVNIUlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKKyNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCisjZWxzZQorI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfUzE2ICovCisjaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7CisjZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKKyNlbHNlCisjZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9VMzIgKi8KKyNpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTMyOworI2VsaWYgTE9OR19NQVggPT0gMHhmZmZmZmZmZgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBPTVhfVTMyOyAKKyNlbHNlCisjZXJyb3IgT01YX1UzMiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9TMzIgKi8KKyNpZiBJTlRfTUFYID09IDB4N2ZmZmZmZmYKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzMyOworI2VsaWYgTE9OR19NQVggPT0gMHg3ZmZmZmZmZgordHlwZWRlZiBsb25nIHNpZ25lZCBpbnQgT01YX1MzMjsgCisjZWxzZQorI2Vycm9yIE9NWF9TMzIgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfVTY0ICYgT01YX1M2NCAqLworI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQorICAgIHR5cGVkZWYgX19pbnQ2NCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQorI2Vsc2UKKyAgICB0eXBlZGVmIGxvbmcgbG9uZyBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKKyAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCisgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKKyNlbmRpZgorCisKKy8qIE9NWF9TQzggKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzE2ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDMzIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0M2NCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9GMzIgKi8KK3R5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KKworCisvKiBPTVhfRjY0ICovCit0eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLworCisKKy8qIE9NWF9JTlQgKi8KK3R5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KKworCisjZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCisjZGVmaW5lIE9NWF9NSU5fVTggIAkJMAorI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQorI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKKyNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKKyNkZWZpbmUgT01YX01JTl9VMzIJCQkwCisKKyNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCisjZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQorI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKKyNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQorI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQorI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQorCit0eXBlZGVmIHZvaWQgT01YVm9pZDsKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkKikwKQorI2VuZGlmCisKKy8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAorICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCisgICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKKyAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KKwlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCisJT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCisJT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLworfU9NWFJlY3Q7CisKKworLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCisgT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCisJCit9IE9NWFBvaW50OworCisKKy8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KK3R5cGVkZWYgc3RydWN0IAoreworIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCisgT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCisJCit9IE9NWFNpemU7CisKKyNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyNGI2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oCkBAIC0wLDAgKzEsNzcgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teHR5cGVzX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAKK09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgIEVRVSAgMCAgICA7Ly8gTm8gZXJyb3IgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgCitPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICBFUVUgLTIgICAgOy8vIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgICAgIAorT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgRVFVIC0xODIgIDsvLyBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAgICAgCitPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICBFUVUgLTkgICAgOy8vIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAKK09NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgIEVRVSAtMTU5ICA7Ly8gQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAKK09NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgIEVRVSAtMTY3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAKK09NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgIEVRVSAtMTYzICA7Ly8gQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAgICAgIAorT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgRVFVIC0xNjIgIDsvLyBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAgICAgCitPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICBFUVUgLTE2MCAgOy8vIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgCisKKzsvLyBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uCitPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICBFUVUgLTUgICAgOy8vIEJhZCBBcmd1bWVudHMgCisKK09NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgIEVRVSAtMTU3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgCitPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICBFUVUgLTE1NiAgOy8vIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgICAgCitPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICBFUVUgLTE1NSAgOy8vIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAgICAgICAgICAgICAgICAgICAKK09NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgIEVRVSAtMTU0ICA7Ly8gQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgCitPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICBFUVUgLTE1MyAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgCitPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICBFUVUgLTE1MiAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgICAKKworT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgRVFVIC0xODMgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgCitPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICBFUVUgLTE4MSAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgIAorT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgRVFVIC0xNyAgIDsvLyBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gCisKK09NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgIEVRVSAtMTgwICA7Ly8gRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lIAorCitPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICBFUVUgMHg3RkZGRkZGRgorCisKKworT01YX01JTl9TOCAgICAgIEVRVSAJICAgCSgtMTI4KQorT01YX01JTl9VOCAgCUVRVSAgICAgCTAKK09NWF9NSU5fUzE2CQlFUVUgICAgICAJKC0zMjc2OCkKK09NWF9NSU5fVTE2CQlFUVUJICAgICAgICAwCisKKworT01YX01JTl9TMzIJCUVRVQkoLTIxNDc0ODM2NDctMSkKK09NWF9NSU5fVTMyCQlFUVUJMAorCitPTVhfTUFYX1M4CQlFUVUJKDEyNykKK09NWF9NQVhfVTgJCUVRVQkoMjU1KQorT01YX01BWF9TMTYJCUVRVQkoMzI3NjcpCitPTVhfTUFYX1UxNgkJRVFVCSgweEZGRkYpCitPTVhfTUFYX1MzMgkJRVFVCSgyMTQ3NDgzNjQ3KQorT01YX01BWF9VMzIJCUVRVQkoMHhGRkZGRkZGRikKKworT01YX1ZDX1VQUEVSICAgIEVRVSAweDEgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCitPTVhfVkNfTEVGVCAgICAgRVFVIDB4MiAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgCitPTVhfVkNfVVBQRVJfUklHSFQgICAgRVFVIDB4NDAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKKworTlVMTCAgICBFUVUgMAorCis7Ly8gU3RydWN0dXJlcworCisgICAgSU5DTFVERSAgICAgYXJtQ09NTV9zLmgKKworICAgIE1fU1RSVUNUICAgIE9NWFBvaW50CisgICAgTV9GSUVMRCAgICAgeCwgNAorICAgIE1fRklFTEQgICAgIHksIDQKKyAgICBNX0VORFNUUlVDVAorCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhZTcwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwKQEAgLTAsMCArMSwxMTEgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyAKKyMgRmlsZSBOYW1lOiAgYnVpbGRfdmMucGwKKyMgT3Blbk1BWCBETDogdjEuMC4yCisjIFJldmlzaW9uOiAgIDk2NDEKKyMgRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyMgCisjIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAKKyMgCisjCisjIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KKyMKKwordXNlIEZpbGU6OlNwZWM7Cit1c2Ugc3RyaWN0OworCitteSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOworCiskQ0MgICAgICAgPSAnYXJtY2MnOworJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk0xMTM2Si1TIC1jJzsKKyRBUyAgICAgICA9ICdhcm1hc20nOworJEFTX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk0xMTM2Si1TJzsKKyMgJExJQiAgICAgID0gJ2FybWxpbmsnOworIyAkTElCX09QVFMgPSAnLS1wYXJ0aWFsIC1vJzsKKyMgJExJQl9UWVBFID0gJy5vJzsKKyRMSUIgICAgICA9ICdhcm1hcic7CiskTElCX09QVFMgPSAnLS1jcmVhdGUgLXInOworJExJQl9UWVBFID0gJy5hJzsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAoQGhlYWRlcmxpc3QsIEBmaWxlbGlzdCwgJGhkLCAkZmlsZSwgJG9maWxlLCAkY29tbWFuZCwgJG9iamxpc3QsICRsaWJmaWxlLCAkaCk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaW5jbHVkZWQgaGVhZGVyIGZpbGVzLgorQGhlYWRlcmxpc3QgPSBxdyhhcGkgdmMvYXBpIHZjL200cDIvYXBpIHZjL200cDEwL2FwaSk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgorb3BlbihGSUxFUywgJzxmaWxlbGlzdF92Yy50eHQnKSBvciBkaWUoIkNhbid0IG9wZW4gc291cmNlIGZpbGUgbGlzdFxuIik7CitAZmlsZWxpc3QgPSA8RklMRVM+OworY2xvc2UoRklMRVMpOworCisjIEZpeCB0aGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBoZWFkZXIgcGF0aHMKK2ZvcmVhY2ggJGggKEBoZWFkZXJsaXN0KQoreworICAgICAgICAkaCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkaCk7Cit9CisKKyMgQ3JlYXRlIHRoZSBpbmNsdWRlIHBhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorJGhkID0gJy1JJyAuIGpvaW4oJyAtSScsIEBoZWFkZXJsaXN0KTsKKworIyBDcmVhdGUgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzICIvbGliLyIgYW5kICIvb2JqLyIgKGlmIHRoZXkgYXJlIG5vdCB0aGVyZSBhbHJlYWR5KQorbWtkaXIgIm9iaiIsIDA3NzcgaWYgKCEgLWQgIm9iaiIpOworbWtkaXIgImxpYiIsIDA3NzcgaWYgKCEgLWQgImxpYiIpOworCiskb2JqbGlzdCA9ICcnOworCisjIENvbXBpbGUgZWFjaCBmaWxlCitmb3JlYWNoICRmaWxlIChAZmlsZWxpc3QpCit7CisJbXkgJGY7CisJbXkgJGJhc2U7CisJbXkgJGV4dDsKKwlteSAkb2JqZmlsZTsKKworCWNob21wKCRmaWxlKTsKKwkkZmlsZSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkZmlsZSk7CisKKwkodW5kZWYsIHVuZGVmLCAkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJGZpbGUpOworCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQorCXsKKwkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKKworCQlpZigkZXh0IGVxICdjJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNpZigkZXh0IGVxICdzJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKKwkJfQorCX0KKwllbHNlCisJeworCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKKwl9Cit9CisKKyMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCiskbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKKyRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7CitwcmludCAiJGNvbW1hbmRcbiI7Cisoc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvZmlsZWxpc3RfdmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTYyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvZmlsZWxpc3RfdmMudHh0CkBAIC0wLDAgKzEsNzQgQEAKKy4vYXBpL2FybUNPTU0uaAorLi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCisuL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisuL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCisuL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisuL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCisuL2FwaS9hcm1DT01NX3MuaAorLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKy4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisuL2FwaS9vbXh0eXBlcy5oCisuL2FwaS9vbXh0eXBlc19zLmgKKy4vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKKy4vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKy4vdmMvYXBpL2FybVZDLmgKKy4vdmMvYXBpL2FybVZDQ09NTV9zLmgKKy4vdmMvYXBpL29teFZDLmgKKy4vdmMvYXBpL29teFZDX3MuaAorLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCisuL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworLi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTcyYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMKQEAgLTAsMCArMSw5MzYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlZmluZXMgQ29tbW9uIEFQSXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncworICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIE1pc2NlbGxhbmVvdXMgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIFZhbHVlICs9IDAuNTsKKyAgICAgICAgCisgICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMTYpT01YX01BWF9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gMC41OworCisgICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMTYpT01YX01JTl9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgVmFsdWUgKz0gMC41OworICAgICAgICAKKyAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MzMilPTVhfTUFYX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUFYX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAwLjU7CisKKyAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MzMilPTVhfTUlOX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUlOX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYgZm9ybWF0CisgKgorICovCisKK09NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTE2KU9NWF9NQVhfVTE2ICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UxNilPTVhfTUFYX1UxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTE2KVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMzIgZm9ybWF0CisgKgorICovCisKK09NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTMyKU9NWF9NQVhfVTMyICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UzMilPTVhfTUFYX1UzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTMyKVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzY0CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIDY0IGJpdCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzY0IGZvcm1hdAorICoKKyAqLworCitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNpZ25DaGVjaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6CisgKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKi8gCisKK09NWF9JTlQgYXJtU2lnbkNoZWNrICgKKyAgICBPTVhfUzE2IHZhcgorKQorCit7CisgICAgT01YX0lOVCBTaWduOworICAgIAorICAgIGlmICh2YXIgPCAwKQorICAgIHsKKyAgICAgICAgU2lnbiA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmICggdmFyID4gMCkKKyAgICB7CisgICAgICAgIFNpZ24gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTaWduID0gMDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFNpZ247Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXAKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybUNsaXAgKAorICAgIE9NWF9JTlQgbWluLAorICAgIE9NWF9JTlQgbWF4LCAKKyAgICBPTVhfUzMyIHNyYyAKKykKKyAKK3sKKyAgICBpZiAoc3JjID4gbWF4KQorICAgIHsKKyAgICAgICAgc3JjID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPCBtaW4pCisgICAgeworICAgICAgICBzcmMgPSBtaW47CisgICAgfQorICAgIAorICAgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgT01YX0YzMiBtaW4sCisgICAgT01YX0YzMiBtYXgsIAorICAgIE9NWF9GMzIgc3JjIAorKQorIAoreworICAgIGlmIChzcmMgPiBtYXgpCisgICAgeworICAgICAgICBzcmMgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKKyAgICB7CisgICAgICAgIHNyYyA9IG1pbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCisgKgorICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKKyAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCisgKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKKyAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAorICogdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgorICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKKyAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKE9NWF9GMzIgdiwgT01YX0lOVCBzaGlmdCwgT01YX0lOVCBzYXRCaXRzKSAKK3sKKyAgICBPTVhfVTMyIGFsbE9uZXMgPSAoT01YX1UzMikoLTEpOworICAgIE9NWF9VMzIgbWF4ViA9IGFsbE9uZXMgPj4gKDMyLXNhdEJpdHMpOworICAgIE9NWF9GMzIgdlNoaWZ0ZWQsIHZSb3VuZGVkLCBzaGlmdERpdiA9IChPTVhfRjMyKSgxIDw8IHNoaWZ0KTsKKyAgICBPTVhfVTMyIHZJbnQ7CisgICAgT01YX1UzMiB2SW50U2F0OworICAgIAorICAgIGlmKHYgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgdlNoaWZ0ZWQgPSB2IC8gc2hpZnREaXY7CisgICAgdlJvdW5kZWQgPSAoT01YX0YzMikodlNoaWZ0ZWQgKyAwLjUpOworICAgIHZJbnQgPSAoT01YX1UzMil2Um91bmRlZDsKKyAgICB2SW50U2F0ID0gdkludDsKKyAgICBpZih2SW50U2F0ID4gbWF4VikgCisgICAgICAgIHZJbnRTYXQgPSBtYXhWOworICAgIHJldHVybiB2SW50U2F0OworfQorCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZXNlIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgorICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgorICovCitPTVhSZXN1bHQgYXJtU3dhcEVsZW0oCisgICAgICAgIE9NWF9VOCAqcEJ1ZjEsCisgICAgICAgIE9NWF9VOCAqcEJ1ZjIsCisgICAgICAgIE9NWF9JTlQgZWxlbVNpemUKKyAgICAgICApCit7CisgICAgT01YX0lOVCBpOworICAgIE9NWF9VOCB0ZW1wOworICAgIGFybVJldEFyZ0VycklmKCFwQnVmMSB8fCAhcEJ1ZjIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBmb3IoaSA9IDA7IGkgPCBlbGVtU2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICoocEJ1ZjEgKyBpKTsKKyAgICAgICAgKihwQnVmMSArIGkpID0gKihwQnVmMiArIGkpOworICAgICAgICAqKHBCdWYyICsgaSkgPSB0ZW1wOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycworICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKKyAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKKyAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtTWVkaWFuT2YzICgKKyAgICBPTVhfUzMyIGZFbnRyeSwKKyAgICBPTVhfUzMyIHNFbnRyeSwgCisgICAgT01YX1MzMiB0RW50cnkgCispCit7CisgICAgT01YX1MzMiBhLCBiLCBjOworICAgIAorICAgIGEgPSBhcm1NaW4gKGZFbnRyeSwgc0VudHJ5KTsKKyAgICBiID0gYXJtTWF4IChmRW50cnksIHNFbnRyeSk7CisgICAgYyA9IGFybU1pbiAoYiwgdEVudHJ5KTsKKyAgICByZXR1cm4gKGFybU1heCAoYSwgYykpOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgICAgUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHBvc2l0aXZlIHZhbHVlLiAKKyAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc21hbGxlc3Qgaz49MCBzdWNoIHRoYXQgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gKDE8PGspLgorICovIAorIAorT01YX1U4IGFybUxvZ1NpemUgKAorICAgIE9NWF9VMTYgdmFsdWUgCispCit7CisgICAgT01YX1U4IGk7ICAgIAorICAgIGZvciAoIGkgPSAwOyB2YWx1ZSA+IDA7IHZhbHVlID0gdmFsdWUgPj4gMSkgCisgICAgeworICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRBZGRfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKKyAgICB7CisgICAgICAgIC8qU2FtZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0QWRkX1M2NChPTVhfUzY0IFZhbHVlMSxPTVhfUzY0IFZhbHVlMikKK3sKKyAgICBPTVhfUzY0IFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCisgICAgeworICAgICAgICAvKlNhbWUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgUmVzdWx0ID0gT01YX01BWF9TNjQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1M2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKKyAqIAorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRTdWJfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPCAwKQorICAgIHsKKyAgICAgICAgLypPcHBvc2l0ZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCisgKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICoqLworCitPTVhfUzMyIGFybVNhdE1hY19TMzIoT01YX1MzMiBNYWMsT01YX1MxNiBWYWx1ZTEsT01YX1MxNiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gKE9NWF9TMzIpKFZhbHVlMSpWYWx1ZTIpOworICAgIFJlc3VsdCA9IGFybVNhdEFkZF9TMzIoIE1hYyAsIFJlc3VsdCApOworCisgICAgcmV0dXJuIFJlc3VsdDsgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMihPTVhfUzMyIG1hYywgT01YX1MzMiBkZWxheUVsZW0sIE9NWF9TMTYgZmlsVGFwICkKK3sKKyAgICAKKyAgICBPTVhfUzMyIHJlc3VsdDsKKworICAgIHJlc3VsdCA9IGFybVNhdE11bFMxNlMzMl9TMzIoZmlsVGFwLGRlbGF5RWxlbSk7IAorCisgICAgaWYgKCByZXN1bHQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXN1bHQgPSBPTVhfTUFYX1MzMjsKKyAgICB9CisgICAgZWxzZSBpZiggcmVzdWx0IDwgT01YX01JTl9TMTYgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gT01YX01JTl9TMzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGRlbGF5RWxlbSAqIGZpbFRhcDsKKyAgICB9CisKKyAgICBtYWMgPSBhcm1TYXRBZGRfUzMyKG1hYyxyZXN1bHQpOworICAgIAorICAgIHJldHVybiBtYWM7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKKyAqCisgKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodC9MZWZ0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzaGlmdCApICkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgorICogW2luXSBzaGlmdCBUaGUgc2hpZnQgbnVtYmVyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KE9NWF9TMzIgaW5wdXQsIE9NWF9JTlQgc2hpZnQpCit7CisgICAgaW5wdXQgPSBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoaW5wdXQsLXNoaWZ0KTsKKworICAgIGlmICggaW5wdXQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgfQorICAgIGVsc2UgaWYgKGlucHV0IDwgT01YX01JTl9TMTYpCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIChPTVhfUzE2KWlucHV0OworICAgIH0KKworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICogICAgIAorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBTaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKE9NWF9TMzIgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCit7CisgICAgT01YX0lOVCBpOworICAgIAorICAgIGlmIChTaGlmdCA8IDApCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDsKKyAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCAoMSA8PCAoU2hpZnQgLSAxKSkpOworICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoT01YX1M2NCBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgaWYgKFNoaWZ0IDwgMCkKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OworICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsICgoT01YX1M2NCkxIDw8IChTaGlmdCAtIDEpKSk7CisgICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsIFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoT01YX1MxNiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCit7CisgICAgT01YX1MxNiBoaTIsbG8xOworICAgIE9NWF9VMTYgbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDI7CisgICAgT01YX1MzMiByZXN1bHQ7CisgICAgCisgICAgbG8xICA9IGlucHV0MTsKKworICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKKyAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7CisgICAgCisgICAgdGVtcDEgPSBoaTIgKiBsbzE7CisgICAgdGVtcDIgPSAoIGxvMiogbG8xICkgPj4gMTY7CisKKyAgICByZXN1bHQgPSAgYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMihPTVhfUzMyIGlucHV0MSxPTVhfUzMyIGlucHV0MikKK3sKKyAgICBPTVhfUzE2IGhpMSxoaTI7CisgICAgT01YX1UxNiBsbzEsbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDIsdGVtcDM7CisgICAgT01YX1MzMiByZXN1bHQ7CisKKyAgICBoaTEgID0gKCBpbnB1dDEgPj4gIDE2ICk7CisgICAgbG8xICA9ICggKE9NWF9VMzIpKCBpbnB1dDEgPDwgMTYgKSA+PiAxNiApOworCisgICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOworICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKKyAgICAKKyAgICB0ZW1wMSA9ICAgaGkxICogaGkyOworICAgIHRlbXAyID0gKCBoaTEqIGxvMiApID4+IDE2OworICAgIHRlbXAzID0gKCBoaTIqIGxvMSApID4+IDE2OworCisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMihyZXN1bHQsdGVtcDMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKKyAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybworICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAorICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKQoreworICAgIE9NWF9GNjQgcmVzdWx0OworICAgIAorICAgIHJlc3VsdCA9ICgoT01YX0Y2NClOdW0pLygoT01YX0Y2NClEZW5vKTsKKyAgICAKKyAgICBpZiAocmVzdWx0ID49IDApCisgICAgeworICAgICAgICByZXN1bHQgKz0gMC41OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgLT0gMC41OworICAgIH0KKworICAgIHJldHVybiAoT01YX1MzMikocmVzdWx0KTsKK30KKworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjkzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLi4zMgorICoKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKworICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKyAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogUmV0dXJuIE4gYml0cyAqLworICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKKworT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAKKyAgICBpZihOID09IDApCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLworICAgIE9mZnNldCArPSBOOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7CisKKyAgICAvKiBSZXR1cm4gTiBiaXRzICovCisgICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKK3sKKyAgICBpZigqcE9mZnNldCA+IDApCisgICAgeworICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKKyAgICAgICAgKnBPZmZzZXQgPSAwOworICAgIH0gICAgCit9CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKKworT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKK3sKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgIAorICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCisgICAgT2Zmc2V0ICs9IE47CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCisgKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKKyAqIHBvaW50ZWQgYnkgcENvZGVCb29rCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIHBDb2RlQm9vaworICogCisgKiBbb3V0XSAgICAqcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisjaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAorCitPTVhfVTE2IGFybVVuUGFja1ZMQzMyKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKKykKK3sgICAgCisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICBPTVhfSU5UIEluZGV4OworICAgICAgICAKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAorICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCisgICAgeworICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKKyAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKKyAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBJbmRleDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIHBDb2RlQm9vaysrOworICAgIH0KKworICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KKyAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOworfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrQml0cyAoCisgICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIE9NWF9VMzIgY29kZVdvcmQsIAorICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKKykKK3sKKyAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAgICAgCisgICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCisgICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7CisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOworICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOworCisgICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCisgICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCisgICAgeworICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKKyAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOworICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7CisgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7CisgICAgfQorCisgICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLworICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7CisgICAgCisgICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOworfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKykKK3sKKyAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKK30KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0Njc5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9JRENUVGFibGUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAgIAorICogRmlsZTogYXJtQ09NTV9JRENUVGFibGUuYworICogQnJpZWY6IERlZmluZXMgVGFibGVzIHVzZWQgaW4gSURDVCBjb21wdXRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAiYXJtQ09NTV9JRENUVGFibGUuaCIKKworICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1CisgICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQorICAgICAgKiAgcyg2KT0yLjAKKyAgICAgICogIHMoNyk9NC4wCisgICAgICAqICBBKDApID0gMipzcXJ0KDIpCisgICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKKwkgICovCisJICAKK19fYWxpZ24oNCkgY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdID0KK3sKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDU4YzUsIDB4N2IyMSwgMHg3M2ZjLCAweDY4NjIsIDB4NThjNSwgMHg0NWJmLCAweDYwMTYsIDB4NjFmOCwKKyAgICAweDUzOWYsIDB4NzNmYywgMHg2ZDQxLCAweDYyNTQsIDB4NTM5ZiwgMHg0MWIzLCAweDVhODIsIDB4NWM0OCwKKyAgICAweDRiNDIsIDB4Njg2MiwgMHg2MjU0LCAweDU4N2UsIDB4NGI0MiwgMHgzYjIxLCAweDUxNzUsIDB4NTMwZCwKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDMyNDksIDB4NDViZiwgMHg0MWIzLCAweDNiMjEsIDB4MzI0OSwgMHgyNzgyLCAweDM2NmQsIDB4Mzc3ZSwKKyAgICAweDIyYTMsIDB4MzAwYiwgMHgyZDQxLCAweDI4YmEsIDB4MjJhMywgMHgxYjM3LCAweDI1N2UsIDB4MjYzYSwKKyAgICAweDExYTgsIDB4MTg3ZSwgMHgxNzEyLCAweDE0YzMsIDB4MTFhOCwgMHgwZGUwLCAweDEzMWQsIDB4MTM3ZCAgICAKK307CisgICAgLyogQWJvdmUgYXJyYXkgYXJtQ09NTV9JRENUUHJlU2NhbGUsICBpbiBRMjMgZm9ybWF0ICovCitjb25zdCBPTVhfVTMyIGFybUNPTU1fSURDVFByZVNjYWxlVTMyIFs2NF0gPQoreworICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKKyAgICAweDU4YzU0MywgMHg3YjIwZDgsIDB4NzNmYmZjLCAweDY4NjIxNCwgMHg1OGM1NDMsIDB4NDViZjFmLCAweDYwMTVhNSwgMHg2MWY3OGIsCisgICAgMHg1MzllYmEsIDB4NzNmYmZjLCAweDZkNDEzZCwgMHg2MjUzYTYsIDB4NTM5ZWJhLCAweDQxYjMyOCwgMHg1YTgyN2EsIDB4NWM0ODY5LAorICAgIDB4NGI0MThjLCAweDY4NjIxNCwgMHg2MjUzYTYsIDB4NTg3ZGUzLCAweDRiNDE4YywgMHgzYjIwZDgsIDB4NTE3NGUwLCAweDUzMGQ2OSwKKyAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCisgICAgMHgzMjQ4ZDQsIDB4NDViZjFmLCAweDQxYjMyOCwgMHgzYjIwZDgsIDB4MzI0OGQ0LCAweDI3ODIxZCwgMHgzNjZkNzIsIDB4Mzc3ZTZiLAorICAgIDB4MjJhMmY1LCAweDMwMGFkMywgMHgyZDQxM2QsIDB4MjhiYTcwLCAweDIyYTJmNSwgMHgxYjM2YjksIDB4MjU3ZDg2LCAweDI2Mzk4ZCwKKyAgICAweDExYTg1NiwgMHgxODdkZTMsIDB4MTcxMjFhLCAweDE0YzM1YSwgMHgxMWE4NTYsIDB4MGRkZjliLCAweDEzMWNjNywgMHgxMzdjYTIKK307CisgICAKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF0gPQoreworICAgIDB4NWE4MiwgLyogSW52U3FydDIgKi8KKyAgICAweDMwZmMsIC8qIFNpblBJQnk4ICovCisgICAgMHg3NjQyLCAvKiBDb3NQSUJ5OCAqLworICAgIDB4MDAwMCAgICAKK307CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0MWRiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBNYXNrIFRhYmxlIHRvIG1hc2sgdGhlIGVuZCBvZiBhcnJheS4KKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCisKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9xTWFza1RhYmxlMTZbTWFza1RhYmxlU2l6ZV0gPSAKK3sKKyAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGICAgIAorfTsKKworY29uc3QgT01YX1U4IGFybUNPTU1fcU1hc2tUYWJsZThbTWFza1RhYmxlU2l6ZV0gPSAKK3sKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsICAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgICAgCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTc3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmgKQEAgLTAsMCArMSwxMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtVmlkZW8uaAorICogQnJpZWY6IERlY2xhcmVzIEFQSSdzL0Jhc2ljIERhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NQVggVmlkZW8gZG9tYWluCisgKgorICovCisKKworI2lmbmRlZiBfYXJtVmlkZW9fSF8KKyNkZWZpbmUgX2FybVZpZGVvX0hfCisKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKgorICogQVJNIHNwZWNpZmljIHN0YXRlIHN0cnVjdHVyZSB0byBob2xkIE1vdGlvbiBFc3RpbWF0aW9uIGluZm9ybWF0aW9uLgorICovCisgCitzdHJ1Y3QgbTRwMl9NRVNwZWMKK3sKKyAgICBPTVhWQ000UDJNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDJNRU1vZGUgICBNRU1vZGU7Cit9OworCitzdHJ1Y3QgbTRwMTBfTUVTcGVjCit7CisgICAgT01YVkNNNFAxME1FUGFyYW1zIE1FUGFyYW1zOworICAgIE9NWFZDTTRQMTBNRU1vZGUgICBNRU1vZGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBtNHAyX01FU3BlYyAgQVJNVkNNNFAyX01FU3BlYzsKK3R5cGVkZWYgc3RydWN0IG00cDEwX01FU3BlYyBBUk1WQ000UDEwX01FU3BlYzsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUKKyAqIGJlc3QgTVYgYW5kIFNBRAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgIG12WCAgICAgeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgbXZZICAgICB5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBjYW5kU0FEIENhbmRpZGF0ZSBTQUQKKyAqIFtpbl0gICAgIGJlc3RNVlggeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RNVlkgeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RTQUQgYmVzdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QKKyAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKKyAqLworCitPTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAorICAgIE9NWF9TMTYgbXZYLAorICAgIE9NWF9TMTYgbXZZLAorICAgIE9NWF9JTlQgY2FuZFNBRCwKKyAgICBPTVhfUzE2IGJlc3RNVlgsCisgICAgT01YX1MxNiBiZXN0TVZZLAorICAgIE9NWF9JTlQgYmVzdFNBRCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgorICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bworICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKKyAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAorICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCisgKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50ICB2aWRlb0NvbXAsCisgICAgIE9NWF9VOCBmbGFnLAorICAgICBPTVhfSU5UICpwU3VtRXJyCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQworICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCisgKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICAgT01YX0lOVCAqcHJlZERpciwKKyAgICAgT01YX0lOVCAqcHJlZFFQLAorICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KKyAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIE9NWF9VOCBzdGFydAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gdmlkZW9Db21wICAgICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwgCisgICAgIE9NWF9VOCAgc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCisgKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAorICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAorICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCisgKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCisgKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKKyAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKKyAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAorICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAorICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKKyAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCisgICAgT01YX1UzMiBzdG9yZVJ1biwKKyAgICBPTVhfUzE2ICogcERzdCwKKyAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCisgICAgT01YX1U4ICBzaWduLAorICAgIE9NWF9VOCAgbGFzdCwKKyAgICBPTVhfVTggICogaW5kZXgsCisgICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCisgKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAorICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAorICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisJCQkgIE9NWF9TMTYgKiBwRHN0LAorCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisJCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAorCQkJICBPTVhfVTggICogcExhc3QsCisJCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKKyAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKKworT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAorICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcworICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKKwkJCSAgT01YX1UzMiBydW5QbHVzLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCisgICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCisJCQkgIE9NWF9VOCAgbGFzdCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAorICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICoKKyAqICAgICAgICAgICAgICAgICAgICAgIAorICogUmV0dXJuIFZhbHVlOgorICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKKyAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAorICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCisgKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCisgKgorICovCisKK09NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAorICAgICBPTVhfVTMyIHJ1biwKKyAgICAgT01YX1UzMiBydW5QbHVzLAorICAgICBPTVhfUzE2IGxldmVsLAorICAgICBPTVhfUzE2IGxldmVsUGx1cywKKyAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKKyAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKKyk7CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCisgKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCisgKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCisgKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAorICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCisgKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKKyAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAorICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAorICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCisgKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKKyAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQorICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCisgKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAorICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCisgKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAorICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgorICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCisgKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCisgKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCisgKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCisgKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKKyAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKKyAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCisgKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAorICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAorICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCisgKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgT01YX0lOVCBybmRWYWwsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUGFkTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBmb3IgYSBtYWNyb2Jsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jaworICogW2luXSBwVHJhbnNwICAgICAgICAgcG9pbnRlciB0byB0cmFuc3BhcmVudCBzdGF0dXMgYnVmZmVyIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sKKyAqIFtvdXRdICAgIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGluIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyBoYXZlIGJlZW4gcGFkZGVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9QYWRNVigKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjRHN0TVYsCisgICAgIE9NWF9VOCAqIHBUcmFuc3AKKyk7CisKKy8qIAorICogSC4yNjQgU3BlY2lmaWMgRGVjbGFyYXRpb25zIAorICovCisvKiBEZWZpbmVzICovCisjZGVmaW5lIEFSTV9NNFAxMF9RX09GRlNFVCAgICAgICAgKDE1KQorCisKKy8qIERlcXVhbnQgdGFibGVzICovCisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXTsKKworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKKyAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCisgKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKKyAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucworICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCisgKgkJCQkJCQkJdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgblRhYmxlLAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCisgKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCisgKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCisgKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCisgKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCisgKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCisgKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCisgKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKKyAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscworICogCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KKyAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KKyAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KKyAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KKyAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLworICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCisgICAgaW50IENocm9tYUZsYWcKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucworICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAJCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW291dF0JcERzdAkgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKKyAgICAgICAgY29uc3QgT01YX1U4KgkJcFNyYywgCisJCU9NWF9VMzIgCWlTcmNTdGVwLCAKKwkJT01YX1U4KiAJcERzdCwgCisJCU9NWF9VMzIgCWlEc3RTdGVwLCAKKwkJT01YX1UzMiAJaVdpZHRoLCAKKwkJT01YX1UzMiAJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKgkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QgICAgCVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSgJCisJIGNvbnN0IE9NWF9VOCogCXBTcmMsIAorCSBPTVhfVTMyIAlpU3JjU3RlcCwgCisgCSBPTVhfVTgqIAlwRHN0LAorIAkgT01YX1UzMiAJaURzdFN0ZXAsIAorIAkgT01YX1UzMiAJaVdpZHRoLCAKKyAJIE9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKKyAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7CisKK09NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAorICAgIE9NWF9TMTYgIG12WCwKKyAgICBPTVhfUzE2ICBtdlksCisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKKyAgICBPTVhfSU5UIGNhbmRTQUQsIAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKKyAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKKyAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCitPTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCisJY29uc3QgT01YX1U4KiAJcFNyY09yZywKKwlPTVhfVTMyIAlpU3RlcE9yZywKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAorCU9NWF9VMzIgCWlTdGVwUmVmLAorCU9NWF9TMzIqCXBEc3RTQUQsCisJT01YX1UzMgkJaUhlaWdodCwKKwlPTVhfVTMyCQlpV2lkdGgpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCisgKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcworICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaVdpZHRoLAorCSBPTVhfVTMyCQlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAorICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAorICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKKyAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKKwljb25zdCBPTVhfVTgqIAlwU3JjLAorICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKKyAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIqCXBEc3RTQUQsCisgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICBPTVhfVTMyICAgICBpV2lkdGgKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAorICAgICAgICBPTVhfVTggICAgICAqcFNyYywKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCisgICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAorICAgICAgICBPTVhfVTMyICAgICBkeCwKKyAgICAgICAgT01YX1UzMiAgICAgZHkKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAorICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAorICAgICBPTVhfVTggICAgICpwRHN0LAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAorICAgICBPTVhfVTMyICAgIGlXaWR0aCwKKyAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAorICAgICBPTVhfVTMyICAgIGR4LAorICAgICBPTVhfVTMyICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ0gyNjRfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLAorICogcGVyZm9ybSBkZXF1YW50aXNhdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YKKyAqIHJlc2lkdWFscyBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uCisgKgkJCQkJCQlwYWlyIGJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtpbl0JcERDCQkJUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTAorICoJCQkJCQkJaWYgaXQgZG9lc24ndCBleGlzdAorICogW2luXQlRUAkJCVF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAqIFtpbl0gQUMgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBjb2VmZmljaWVudCBleGlzdHMKKyAqIFtvdXRdCXBEc3QJCXBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGEKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4KAorICAgICBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiAqcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX1MxNiogcERDLAorICAgICBpbnQgQUMKKyk7CisKKyNlbmRpZiAgLypfYXJtVmlkZW9fSF8qLworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMGE5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDQ09NTV9zLmgKQEAgLTAsMCArMSw3MiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNDT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIEFDIGhlYWRlciBmaWxlCis7Ly8gCis7Ly8gRm9ybXVsYSB1c2VkOgorOy8vIE1BQ1JPIGZvciBjYWxjdWxhdGluZyBtZWRpYW4gZm9yIHRocmVlIHZhbHVlcy4KKworCisKKyAgICBJRiA6TE5PVDo6REVGOkFSTVZDQ09NTV9TX0gKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgIE1fVkFSSUFOVFMgICAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCisgICAgCisgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4IAorICAgICAKKyAgICAgOy8vLyoKKyAgICAgOy8vICogTWFjcm86IE1fTUVESUFOMworICAgICA7Ly8gKgorICAgICA7Ly8gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgICAgIDsvLyAqIAorICAgICA7Ly8gKiBSZW1hcmtzOgorICAgICA7Ly8gKgorICAgICA7Ly8gKiBQYXJhbWV0ZXJzOgorICAgICA7Ly8gKiBbaW5dIHggICAgIEZpcnN0IGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiBbaW5dIHkgICAgIFNlY29uZCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBtYXkgYmUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YKKyAgICAgOy8vICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0geiAgICAgVGhpcmQgZW50cnkgb2YgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgCisgICAgIDsvLyAqICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0gdCAgICAgVGVtcG9yYXJ5IHNjcmF0Y2ggIHJlZ2lzdGVyLgorICAgICA7Ly8gKiBbb3V0XXogICAgIE1lZGlhbiBvZiB0aGUgdGhyZWUgbnVtYmVycy4gICAgICAgCisgICAgIDsvLyAqLworICAgICAKKyAgICAgTUFDUk8KKworICAgICBNX01FRElBTjMgJHgsICR5LCAkeiwgJHQgCisgICAgIAorICAgICBTVUJTICAkdCwgJHksICR6OyAvLyBpZiAoeSA8IHopCisgICAgIEFERExUICR6LCAkeiwgJHQ7IC8vICBzd2FwIHkgYW5kIHoKKyAgICAgU1VCTFQgJHksICR5LCAkdDsKKworICAgICA7Ly8gTm93IHonIDw9IHknLCBzbyB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgZm9yIHRoZQorICAgICA7Ly8gbWVkaWFuIHZhbHVlLCBkZXBlbmRpbmcgb24geC4KKworICAgICA7Ly8gMSkgeCA8PSB6JyAgICAgIDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeicKKyAgICAgOy8vIDIpICAgICAgeicgPD0geCA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHgKKyAgICAgOy8vIDMpICAgICAgeicgICAgICA8PSB5JyA8PSB4IDogbWVkaWFuIHZhbHVlIGlzIHknCisKKyAgICAgQ01QICAgJHosICR4OyAgICAgLy8gaWYgKCB4ID4gbWluKHkseikgKQorICAgICBNT1ZMVCAkeiwgJHg7ICAgICAvLyBhbnMgPSB4IAorCisgICAgIENNUCAgICR4LCAkeTsgICAgIC8vIGlmICggeCA+IG1heCh5LHopICkKKyAgICAgTU9WR1QgJHosICR5OyAgICAgLy8gYW5zID0gbWF4KHkseikKKyAgICAgCisgICAgIE1FTkQKKyAgICBFTkRJRiAgICAgIAorICAgIAorICAgIAorICAgICAgICAKKyAgICBFTkRJRiA7Ly8gQVJNQUNDT01NX1NfSAorCisgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2NjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmgKQEAgLTAsMCArMSw0MzgxIEBACisvKioKKyAqIEZpbGU6IG9teFZDLmgKKyAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfT01YVkNfSF8KKyNkZWZpbmUgX09NWFZDX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KKy8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzE2IGR4OworICAgIE9NWF9TMTYgZHk7Cit9IE9NWFZDTW90aW9uVmVjdG9yOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKKyAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCisgKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCisgKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKKyAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAorICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAorICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAorICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCisgKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKKyAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCisgKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCisgKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAorICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKKyAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKKyAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAorICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAorICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCisgICAgT01YX1UzMiBpUGxhbmVTdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKKyAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAorICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAorICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAorICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAorICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKKyAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKKyAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAorICogICAgICAgICAgICAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCisgKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKKyAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAorICAgIE9NWF9JTlQgWGNvb3JkLAorICAgIE9NWF9JTlQgWWNvb3JkLAorICAgIE9NWF9JTlQgc2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCisvKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAorICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKKyAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCit9OworCisKKworLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLworLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKK307CisKKworCisvKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLworLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19DRU5URVIgPSA0LAorICAgIE9NWF9WQ19SSUdIVCA9IDgsCisgICAgT01YX1ZDX0xPV0VSID0gMTYsCisgICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAorICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKK307CisKKworCisvKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCisgICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKK30gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7CisKKworCisvKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLworLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCB4OworICAgIE9NWF9JTlQgeTsKK30gT01YVkNNNFAyQ29vcmRpbmF0ZTsKKworCisKKy8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDJNRU1vZGU7CisKKworCisvKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCisgICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCisgICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCisgICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KK30gT01YVkNNNFAyTUVQYXJhbXM7CisKKworCisvKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCisgICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAorICAgIE9NWF9JTlQgaUJsaworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKKyAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCisgKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCisgKiAgICAgICAgICAgIC00LiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAorICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCisgKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKKyAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCisgKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKKyAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAorICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAorICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAorICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAorICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKKyAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAorICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKKyAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAorICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCisgKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAorICogICAgICAgICAgICBpZ25vcmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCisgKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAorICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAorICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAorICogICAgICAgICAgICBmb3IgSU5URVI0ViAKKyAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAorICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAorICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA2LjEuMy44LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKKyAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKKyAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCisgKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCisgKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAorICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCisgKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKKyAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAorICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAorICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAorICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAorICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAorICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAorICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCisgKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKKyAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAorICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAorICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKKyAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAorICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKKyAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAorICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKKyAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAorICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKKyAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAorICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCisgKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKKyAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb24gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKKyAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCisgKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCisgKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCisgKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAorICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgcFNyYywgcFJlYy4gIAorICoKKyAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4ICpwUmVjLAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCisgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX1U4IGN1clFwLAorICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1MxNiAqcFJlYywKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKKyAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCisgKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCisgKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCisgKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAorICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAorICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAorICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAorICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAorICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAorICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAorICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKKyAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKKyAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAorICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCisgKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAorICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCisgKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCisgKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCisgKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAorICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIHN5bnRheCAKKyAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKKyAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKKyAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQorICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KKyAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCisgKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCisgKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAorICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCisgKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCisgKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKKyAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAorICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcCwKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICBPTVhfVTggY3VyUVAsCisgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCisgKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKKyAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAorICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAorICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCisgKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIFFQIDw9IDAuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKKyAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAorICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCisgKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKKyAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKKyAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAorICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAorICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKKyAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCisgKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9JTlQgY3VyUVAsCisgICAgT01YX0lOVCBwcmVkUVAsCisgICAgT01YX0lOVCBwcmVkRGlyLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKKyAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKKyAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKKyAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKKyAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKKyAqICAgICAgICAgICAgNi4yLjEuMi4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAorICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKKyAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKKyAgICBPTVhfSU5UIHJuZFZhbAorKTsKKworCisKKy8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLworICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCisgICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLworICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOworCisKKworLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCisgICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCisgICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOworCisKKworLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDEwTUVNb2RlOworCisKKworLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfUF8xNng4ICA9IDEsCisgICAgT01YX1ZDX1BfOHgxNiAgPSAyLAorICAgIE9NWF9WQ19QXzh4OCAgPSAzLAorICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKKyAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAorICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKKyAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKKyAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCit9IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCisgICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCisgICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCit9IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KKyAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLworICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLworICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworfSBPTVhWQ000UDEwVkxDSW5mbzsKKworCisKKy8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KKyAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLworICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCisgICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLworICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCit9IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOworCisKKworLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLworICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OworfSBPTVhWQ000UDEwTUVQYXJhbXM7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAorICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAorICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKKyAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKKyAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAorICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCisgKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAorICogICAgICAgICAgICAwLi4xNSkgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKKyAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCisgKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICogTm90ZTogCisgKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKKyAqICAgICAgICAgICAgMC4uNykuIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCisgKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAorICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAorICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCisgKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKKyAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aCAKKyAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCisgKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoLiAKKyAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCisgKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKKyAqICAgICAgICAgICAgICBpcyBOVUxMLiAKKyAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAorICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAorICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCisgKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAorICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKKyAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAorICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKKyAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCisgKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAorICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAorICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAorICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKKyAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCisgKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKKyAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKKyAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCisgKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKKyAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKKyAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAorICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAorICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKKyAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKKyAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKKyAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKKyAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAorICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKKyAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKKyAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAorICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAorICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKKyAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKKyAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAorICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKKyAqCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyICpwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKKyAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCisgKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAorICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCisgKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKKyAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCisgKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKKyAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAorICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAorICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCisgKiAxLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCisgKiAgICAgICAgICAgIGV4aXN0IAorICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCisgKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCisgKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKKyAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERDLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHByZWRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCisgKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKKyAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKKyAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKKyAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAorICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKKyAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAorICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKKyAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCisgKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKKyAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKKyAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6CisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCisgKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKKyAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCisgKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKKyAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCisgKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAorICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAorICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCisgKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCisgKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCisgKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAorICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAorICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAorICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAorICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCisgKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCisgKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKKyAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gCisgKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVEVSLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5UUkEuIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAorICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCisgKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCisgKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKKyAqICAgICAgICAgICAgLSAgTWJUeXBlIAorICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCisgKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKKyAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAorICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCisgKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKKyAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAorICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1UzMiBMYW1iZGEsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCisgICAgT01YX0lOVCAqcERzdENvc3QsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAorICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKKyAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKKyAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1UzMiAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKKyAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKC0xLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RMZWZ0LAorICAgIE9NWF9VOCAqcERzdFJpZ2h0LAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKKyAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0VXAsCisgICAgT01YX1U4ICpwRHN0RG93biwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAorICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCisgKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAorICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAorICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKKyAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgbWF0cml4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCisgICAgT01YX1U4ICpwRHN0UmVjb24sCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAorICAgIE9NWF9VOCBiQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAorICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAorICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAorICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKKyAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAorICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICA0LiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCisgKiAgICAgICAgICAgIG9mIDQuIAorICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCisgKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAorICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCisgKiAgICAgICAgICAgIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCisgKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCisgKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRENDb2VmZiwKKyAgICBPTVhfUzggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAorICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAorICogc3RydWN0dXJlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAorICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAorICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAorICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAorICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAorICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAorICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKKyAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAorICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKKyAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAorICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAorICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCisgICAgT01YX1U4IGJBQywKKyAgICBPTVhfVTMyIE1heE51bUNvZWYsCisgICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KKyk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLworCisvKiogRU9GICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5NzRkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oCkBAIC0wLDAgKzEsMTI5IEBACis7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKzsvKiogPT09PT09PT09PT09PT09IFN0cnVjdHVyZSBEZWZpbml0aW9uIGZvciBTYW1wbGUgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PSAqLworOy8qKiB0cmFuc3BhcmVudCBzdGF0dXMgKi8KKworO2VudW0geworT01YX1ZJREVPX1RSQU5TUEFSRU5UCUVRVSAwOwkvKiogV2hvbGx5IHRyYW5zcGFyZW50ICovCitPTVhfVklERU9fUEFSVElBTAkJRVFVIDE7CS8qKiBQYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKi8KK09NWF9WSURFT19PUEFRVUUJCUVRVSAyOwkvKiogT3BhcXVlICovCis7fQorCis7LyoqIGRpcmVjdGlvbiAqLworO2VudW0geworT01YX1ZJREVPX05PTkUJCQlFUVUgMDsKK09NWF9WSURFT19IT1JJWk9OVEFMCUVRVSAxOworT01YX1ZJREVPX1ZFUlRJQ0FMCQlFUVUgMjsKKzt9CisKKzsvKiogYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlICovCis7ZW51bSB7CitPTVhfVklERU9fSU5URUdFUl9QSVhFTCBFUVUgMDsJLyoqIGNhc2UgobBhobEgKi8KK09NWF9WSURFT19IQUxGX1BJWEVMX1ggIEVRVSAxOwkvKiogY2FzZSChsGKhsSAqLworT01YX1ZJREVPX0hBTEZfUElYRUxfWSAgRVFVIDI7CS8qKiBjYXNlIKGwY6GxICovCitPTVhfVklERU9fSEFMRl9QSVhFTF9YWSBFUVUgMzsJLyoqIGNhc2UgobBkobEgKi8KKzt9CisKKztlbnVtIHsKK09NWF9VUFBFUiAgCQkJCUVRVSAxOwkJCS8qKiBzZXQgaWYgdGhlIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTEVGVCAgIAkJCQlFUVUgMjsJCQkvKiogc2V0IGlmIHRoZSBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfQ0VOVEVSIAkJCQlFUVUgNDsKK09NWF9SSUdIVAkJCQlFUVUgODsKK09NWF9MT1dFUiAgCQkJCUVRVQkxNjsKK09NWF9VUFBFUl9MRUZUICAJCUVRVSAzMjsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9VUFBFUl9SSUdIVCAJCUVRVSA2NDsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTE9XRVJfTEVGVCAgCQlFUVUgMTI4OworT01YX0xPV0VSX1JJR0hUIAkJRVFVIDI1NgorO30KKworO2VudW0geworT01YX1ZJREVPX0xVTUlOQU5DRSAgCUVRVSAwOwkvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLworT01YX1ZJREVPX0NIUk9NSU5BTkNFICAJRVFVIDE7CS8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8KK09NWF9WSURFT19BTFBIQSAgCQlFUVUgMjsJCQkvKiogQWxwaGEgY29tcG9uZW50ICovCis7fQorCis7ZW51bSB7CitPTVhfVklERU9fSU5URVIJCQlFUVUgMDsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSX1EJCUVRVSAxOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVklERU9fSU5URVI0VgkJRVFVIDI7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WSURFT19JTlRSQQkJCUVRVSAzOwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KK09NWF9WSURFT19JTlRSQV9RCQlFUVUgNDsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCitPTVhfVklERU9fSU5URVI0Vl9RCQlFUVUgNTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK09NWF9WSURFT19ESVJFQ1QJCUVRVSA2OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QIChNUEVHLTQgb25seSkgKi8KK09NWF9WSURFT19JTlRFUlBPTEFURQlFUVUgNzsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX0JBQ0tXQVJECQlFUVUgODsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX0ZPUldBUkQJCUVRVSA5OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCitPTVhfVklERU9fTk9UQ09ERUQJCUVRVSAxMDsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworO30KKworO2VudW0geworT01YXzE2WDE2X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF8xNlgxNl9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzE2WDE2X0RDIAkJCUVRVSAyOwkJLyoqIEludHJhXzE2eDE2X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfMTZYMTZfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhXzE2eDE2X1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7ZW51bSB7CitPTVhfNHg0X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0hPUiAgCQkJRVFVIDE7CQkvKiogSW50cmFfNHg0X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfREMgICAJCQlFUVUgMjsJCS8qKiBJbnRyYV80eDRfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfRElBR19ETCAJCUVRVSAzOwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9ESUFHX0RSIAkJRVFVIDQ7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9WUiAJCQkJRVFVIDU7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IRCAJCQkJRVFVIDY7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfVkwgCQkJCUVRVSA3OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IVSAJCQkJRVFVIDg7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7ZW51bSB7CitPTVhfQ0hST01BX0RDIAkJCUVRVSAwOwkJLyoqIEludHJhX0Nocm9tYV9EQyAocHJlZGljdGlvbiBtb2RlKSAqLworT01YX0NIUk9NQV9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF9DSFJPTUFfVkVSVCAJCUVRVSAyOwkvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfQ0hST01BX1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KKzt9CisKKzt0eXBlZGVmCXN0cnVjdCB7CQoreAlFUVUJMDsKK3kJRVFVCTQ7Cis7fU9NWENvb3JkaW5hdGU7CisKKzt0eXBlZGVmIHN0cnVjdCB7CitkeAlFUVUJMDsKK2R5CUVRVQkyOworO31PTVhNb3Rpb25WZWN0b3I7CisKKzt0eXBlZGVmIHN0cnVjdCB7Cit4eAkJRVFVCTA7Cit5eQkJRVFVCTQ7Cit3aWR0aAlFUVUJODsKK2hlaWdodAlFUVUJMTI7Cis7fU9NWGlSZWN0OworCis7dHlwZWRlZiBlbnVtIHsKK09NWF9WQ19JTlRFUiAgICAgICAgIEVRVSAwOyAgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZDX0lOVEVSX1EgICAgICAgRVFVIDE7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WQ19JTlRFUjRWICAgICAgIEVRVSAyOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVkNfSU5UUkEgICAgICAgICBFUVUgMzsgICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworT01YX1ZDX0lOVFJBX1EgICAgICAgRVFVIDQ7ICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworT01YX1ZDX0lOVEVSNFZfUSAgICAgRVFVIDU7ICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCis7fSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKKworO2VudW0geworT01YX1ZDX05PTkUgICAgICAgICAgRVFVIDAKK09NWF9WQ19IT1JJWk9OVEFMICAgIEVRVSAxCitPTVhfVkNfVkVSVElDQUwgICAgICBFUVUgMiAKKzt9OworCisKKwlFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjNhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKQEAgLTAsMCArMSwxNDggQEAKKyA7LyoqCisgOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTE2eDE2CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KKyA7ICogUGFyYW1ldGVyczoKKyA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAxNi4KKyA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogUmV0dXJuIFZhbHVlOgorIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCisgOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuICAKKyA7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAKKyAgICAgCisgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjICAgIFJOIDAgICAgICAgIAorcERzdCAgICBSTiAxICAgICAgICAKK3N0ZXAgICAgUk4gMgorCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK0NvdW50ICAgUk4gMTQKK1gwICAgICAgUk4gMgorWDEgICAgICBSTiA0CisKK1JldHVybiAgUk4gMAorICAgICAKKyAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTE2eDE2LHI1CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNVQiAgIENvdW50LHN0ZXAsIzggICAgICAgICAgICAgICAgIDsvL0NvdW50PXN0ZXAtOAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggICAgICAgICAgICAgICAgICA7Ly9wU3JjIGFmdGVyIGxvYWRpbmcgcFNyYz1wU3JjKzgKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50ICAgICAgICAgICAgICAgOy8vcFNyYyBhZnRlciBsb2FkaW5nIHBTcmM9cFNyYytzdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKworICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzODczYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKQEAgLTAsMCArMSw3MiBAQAorIDsvKioKKyA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5OHg4CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgOyAqIFBhcmFtZXRlcnM6CisgOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDguCisgOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFJldHVybiBWYWx1ZToKKyA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgorIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgCisgOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgCisgICAgIAorICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAKKworCisKKyAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworcFNyYyAgICBSTiAwICAgICAgICAKK3BEc3QgICAgUk4gMSAgICAgICAgCitzdGVwICAgIFJOIDIKKworOy8vTG9jYWwgVmFyaWFibGVzCitDb3VudCAgIFJOIDE0CitYMCAgICAgIFJOIDIKK1gxICAgICAgUk4gNAorUmV0dXJuICBSTiAwCisgICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHk4eDgscjUKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgQ291bnQsc3RlcCAgICAgICAgICAgICAgICAgOy8vQ291bnQ9c3RlcCAKKyAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAgICAgICAgICAgIDsvL3BTcmMgYWZ0ZXIgbG9hZGluZyA6IHBTcmM9cFNyYytzdGVwCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sQ291bnQKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjRiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCkBAIC0wLDAgKzEsMTg5IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBFeHBhbmQgRnJhbWUgYm91bmRhcnkgcGl4ZWxzIGludG8gUGxhbmUKKzsvLyAKKzsvLyAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworCisgICAgCisKKworCisgICAgICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworCitwU3JjRHN0UGxhbmUgICAgUk4gIDAKK2lGcmFtZVdpZHRoICAgICBSTiAgMQoraUZyYW1lSGVpZ2h0ICAgIFJOICAyICAgIAoraUV4cGFuZFBlbHMgICAgIFJOICAzCisKKworOy8vT3V0cHV0IFJlZ2lzdGVycworCityZXN1bHQgICAgICAgICAgUk4gIDAKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKKworaVBsYW5lU3RlcCAgICAgIFJOICA0CitwVG9wICAgICAgICAgICAgUk4gIDUKK3BCb3R0b20gICAgICAgICBSTiAgNgorcEJvdHRvbUluZGV4ICAgIFJOICA3Cit4ICAgICAgICAgICAgICAgUk4gIDgKK3kgICAgICAgICAgICAgICBSTiAgOQordGVtcFRvcCAgICAgICAgIFJOICAxMAordGVtcEJvdCAgICAgICAgIFJOICAxMQorQ29sU3RlcCAgICAgICAgIFJOICAxMgorcExlZnQgICAgICAgICAgIFJOICA1CitwUmlnaHQgICAgICAgICAgUk4gIDYKK3BSaWdodEluZGV4ICAgICBSTiAgNwordGVtcExlZnQxICAgICAgIFJOICAxMAordGVtcFJpZ2h0MSAgICAgIFJOICAxMQordGVtcExlZnQyICAgICAgIFJOICAxNAordGVtcFJpZ2h0MiAgICAgIFJOICAyCitpbmRleFkgICAgICAgICAgUk4gIDE0CitSb3dTdGVwICAgICAgICAgUk4gIDEyCitleHBhbmRUbzRieXRlcyAgUk4gIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvcHkgYSBieXRlIHRvIDQgYnl0ZXMgb2YgYSB3b3JkCisgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JLHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBpUGxhbmVTdGVwT25TdGFjaywgNAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICBpUGxhbmVTdGVwLCBpUGxhbmVTdGVwT25TdGFjaworICAgICAgICAKKyAgICAgICAgTVVMICAgICBwVG9wLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAKKyAgICAgICAgTUxBICAgICBwQm90dG9tLGlGcmFtZUhlaWdodCxpUGxhbmVTdGVwLHBTcmNEc3RQbGFuZQorICAgICAgICBTVUIgICAgIHgsaUZyYW1lV2lkdGgsIzQKKyAgICAgICAgTU9WICAgICBpbmRleFkscFRvcAorICAgICAgICBBREQgICAgIENvbFN0ZXAsaW5kZXhZLCM0CisgICAgICAgIFNVQiAgICAgcEJvdHRvbUluZGV4LHBCb3R0b20saVBsYW5lU3RlcAorICAgICAgICBTVUIgICAgIHBUb3AscFNyY0RzdFBsYW5lLHBUb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBUb3AscFRvcCx4CisgICAgICAgIEFERCAgICAgcEJvdHRvbSxwQm90dG9tLHgKKworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFRoZSBmb2xsb3dpbmcgaW1wcm92ZXMgdXBvbiB0aGUgQyBpbXBsbWVudGF0aW9uCisgICAgICAgIDsvLyBUaGUgeCBhbmQgeSBsb29wcyBhcmUgaW50ZXJjaGFuZ2VkOiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmFsdWVzIG9mCisgICAgICAgIDsvLyBwU3JjRHN0UGxhbmUgW3hdIGFuZCBwU3JjRHN0UGxhbmUgWyhpRnJhbWVIZWlnaHQgLSAxKSAqIGlQbGFuZVN0ZXAgKyB4XSAKKyAgICAgICAgOy8vIHdoaWNoIGRlcGVuZCBvbmx5IG9uIGxvb3AgdmFyaWFibGUgJ3gnIGFyZSBsb2FkZWQgb25jZSBhbmQgdXNlZCBpbiAKKyAgICAgICAgOy8vIG11bHRpcGxlIHN0b3JlcyBpbiB0aGUgJ1knIGxvb3AKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgOy8vIHhsb29wCitFeHBhbmRGcmFtZVRvcEJvdFhsb29wCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHRlbXBUb3AsW3BTcmNEc3RQbGFuZSx4XQorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSBbKGlGcmFtZUhlaWdodCAtIDEpICogaVBsYW5lU3RlcCArIHhdIGlzIHNpbXBsaWZpZWQgYXM6CisgICAgICAgIDsvLyBwU3JjRHN0UGxhbmUgKyAoaUZyYW1lSGVpZ2h0ICogaVBsYW5lU3RlcCkgLSBpUGxhbmVTdGVwICsgeCA9PQorICAgICAgICA7Ly8gcEJvdHRvbSAtIGlQbGFuZVN0ZXAgKyB4ID09IHBCb3R0b21JbmRleCBbeF0KKyAgICAgICAgOy8vIFRoZSB2YWx1ZSBvZiBwQm90dG9tSW5kZXggaXMgY2FsY3VsYXRlZCBhYm92ZSB0aGlzICd4JyBsb29wCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIHRlbXBCb3QsW3BCb3R0b21JbmRleCx4XQorICAgICAgICAKKyAgICAgICAgOy8vIHlsb29wCisgICAgICAgIE1PViAgICAgeSxpRXhwYW5kUGVscworCitFeHBhbmRGcmFtZVRvcEJvdFlsb29wICAgICAgICAKKyAgICAgICAgU1VCUyAgICB5LHksIzEKKyAgICAgICAgTV9TVFIgICB0ZW1wVG9wLFtwVG9wXSxpUGxhbmVTdGVwCisgICAgICAgIE1fU1RSICAgdGVtcEJvdCxbcEJvdHRvbV0saVBsYW5lU3RlcAorICAgICAgICBCR1QgICAgIEV4cGFuZEZyYW1lVG9wQm90WWxvb3AKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgeCx4LCM0CisgICAgICAgIFNVQiAgICAgcFRvcCxwVG9wLENvbFN0ZXAKKyAgICAgICAgU1VCICAgICBwQm90dG9tLHBCb3R0b20sQ29sU3RlcAorICAgICAgICBCR0UgICAgIEV4cGFuZEZyYW1lVG9wQm90WGxvb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8geSBsb29wCisgICAgICAgIDsvLyBUaGUgcHJvZHVjdCBpcyBhbHJlYWR5IGNhbGN1bGF0ZWQgYWJvdmUgOiBSZXVzZQorICAgICAgICA7Ly9NVUwgICAgIGluZGV4WSxpRXhwYW5kUGVscyxpUGxhbmVTdGVwICAgICAgCisgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjRHN0UGxhbmUscFNyY0RzdFBsYW5lLGluZGV4WQorICAgICAgICBTVUIgICAgIHBMZWZ0LHBTcmNEc3RQbGFuZSxpRXhwYW5kUGVscyAgICAgICAgICAgICAgICAgIDsvLyBwTGVmdC0+cG9pbnRzIHRvIHRoZSB0b3AgbGVmdCBvZiB0aGUgZXhwYW5kZWQgYmxvY2sKKyAgICAgICAgQUREICAgICBwUmlnaHQscFNyY0RzdFBsYW5lLGlGcmFtZVdpZHRoCisgICAgICAgIFNVQiAgICAgcFJpZ2h0SW5kZXgscFJpZ2h0LCMxIAorICAgICAgICAKKyAgICAgICAgQUREICAgICB5LGlGcmFtZUhlaWdodCxpRXhwYW5kUGVscyxMU0wgIzEKKyAgICAgICAgTERSICAgICBleHBhbmRUbzRieXRlcyw9MHgwMTAxMDEwMQorICAgICAgICAKKyAgICAgICAgUlNCICAgICBSb3dTdGVwLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAsTFNMICMxCisKKyAgICAgICAgOy8vIFRoZSBZIExvb3AgaXMgdW5yb2xsZWQgdHdpY2UKK0V4cGFuZEZyYW1lTGVmdFJpZ2h0WWxvb3AgIAorICAgICAgICBMRFJCICAgIHRlbXBMZWZ0MixbcFNyY0RzdFBsYW5lLGlQbGFuZVN0ZXBdICAgICAgICAgICAgIDsvLyBQcmVMb2FkIHRoZSB2YWx1ZXMKKyAgICAgICAgTERSQiAgICB0ZW1wUmlnaHQyLFtwUmlnaHRJbmRleCxpUGxhbmVTdGVwXQorICAgICAgICBNX0xEUkIgIHRlbXBMZWZ0MSxbcFNyY0RzdFBsYW5lXSxpUGxhbmVTdGVwLExTTCAjMSAgICAgIDsvLyBQcmVMb2FkIHRoZSB2YWx1ZXMKKyAgICAgICAgTV9MRFJCICB0ZW1wUmlnaHQxLFtwUmlnaHRJbmRleF0saVBsYW5lU3RlcCxMU0wgIzEKKyAgICAgICAgICAgICAgCisgICAgICAgIFNVQiAgICAgeCxpRXhwYW5kUGVscywjNAorICAgICAgICBNVUwgICAgIHRlbXBMZWZ0Mix0ZW1wTGVmdDIsZXhwYW5kVG80Ynl0ZXMgICAgICAgICAgICAgIDsvLyBDb3B5IHRoZSBzaW5nbGUgYnl0ZSB0byA0IGJ5dGVzCisgICAgICAgIE1VTCAgICAgdGVtcFJpZ2h0Mix0ZW1wUmlnaHQyLGV4cGFuZFRvNGJ5dGVzCisgICAgICAgIE1VTCAgICAgdGVtcExlZnQxLHRlbXBMZWZ0MSxleHBhbmRUbzRieXRlcyAgICAgICAgICAgICAgOy8vIENvcHkgdGhlIHNpbmdsZSBieXRlIHRvIDQgYnl0ZXMKKyAgICAgICAgTVVMICAgICB0ZW1wUmlnaHQxLHRlbXBSaWdodDEsZXhwYW5kVG80Ynl0ZXMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8geCBsb29wCitFeHBhbmRGcmFtZUxlZnRSaWdodFhsb29wICAgICAgICAKKyAgICAgICAgU1VCUyAgICB4LHgsIzQKKyAgICAgICAgU1RSICAgICB0ZW1wTGVmdDIsW3BMZWZ0LGlQbGFuZVN0ZXBdICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSA0IGJ5dGVzIGF0IG9uZSBnbworICAgICAgICBTVFIgICAgIHRlbXBSaWdodDIsW3BSaWdodCxpUGxhbmVTdGVwXQorICAgICAgICBTVFIgICAgIHRlbXBMZWZ0MSxbcExlZnRdLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIDQgYnl0ZXMgYXQgb25lIGdvCisgICAgICAgIFNUUiAgICAgdGVtcFJpZ2h0MSxbcFJpZ2h0XSwjNAorICAgICAgICBCR0UgICAgIEV4cGFuZEZyYW1lTGVmdFJpZ2h0WGxvb3AKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgeSx5LCMyCisgICAgICAgIEFERCAgICAgcExlZnQscExlZnQsUm93U3RlcAorICAgICAgICBBREQgICAgIHBSaWdodCxwUmlnaHQsUm93U3RlcAorICAgICAgICBCR1QgICAgIEV4cGFuZEZyYW1lTGVmdFJpZ2h0WWxvb3AKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAKK0VuZCAgICAgICAgICAgICAKKyAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAKKyAKKyAgICAgICAgICAgIAorICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0MGYyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBIZWFkZXIgZmlsZSBmb3Igb3B0aW1pemVkIEguMjY0IENBTFZDIHRhYmxlcworICogCisgKi8KKyAKKyNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisjZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAorICAKKy8qIENBVkxDIHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF07CitleHRlcm4gY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmNkOWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIyMiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisKKzsvLyBGdW5jdGlvbnM6Cis7Ly8gICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ248QUxJR05NRU5UPl91bnNhZmUgIAorOy8vCis7Ly8gSW1wbGVtZW50cyBBdmVyYWdlIG9mIDR4NCB3aXRoIGVxdWF0aW9uIGMgPSAoYStiKzEpPj4xLgorOy8vIEZpcnN0IG9wZXJhbmQgd2lsbCBiZSBhdCBvZmZzZXQgQUxJR05NRU5UIGZyb20gYWxpZ25lZCBhZGRyZXNzCis7Ly8gU2Vjb25kIG9wZXJhbmQgd2lsbCBiZSBhdCBhbGlnbmVkIGxvY2F0aW9uIGFuZCB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0LgorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgorOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyMixyMyB3aGVyZSByMiBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByMyBzdGVwIHNpemUKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjIgLSBwb2ludGVyIHRvIHRoZSBhbGlnbmVkIGxvY2F0aW9uCis7Ly8gcjMgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwUHJlZDAgICAgICAgICAgUk4gMAoraVByZWRTdGVwMCAgICAgIFJOIDEKK3BQcmVkMSAgICAgICAgICBSTiAyCitpUHJlZFN0ZXAxICAgICAgUk4gMworcERzdFByZWQgICAgICAgIFJOIDIKK2lEc3RTdGVwICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lQcmVkQTAgICAgICAgICBSTiAxMAoraVByZWRBMSAgICAgICAgIFJOIDExCitpUHJlZEIwICAgICAgICAgUk4gMTIKK2lQcmVkQjEgICAgICAgICBSTiAxNAorVGVtcDEgICAgICAgICAgIFJOIDQKK1RlbXAyICAgICAgICAgICBSTiA1CitSZXN1bHRBICAgICAgICAgUk4gNQorUmVzdWx0QiAgICAgICAgIFJOIDQKK3IweDgwODA4MDgwICAgICBSTiA3CisKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAwIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4CisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAorRW5kMAorICAgICAgICBNX0VORAorCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAyIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBNX0xEUiAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMSAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2CisKKyAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgorCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCitFbmQyCisgICAgICAgIE1fRU5ECisKKworICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMyBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4CisKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKK0VuZDMKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ZlNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKQEAgLTAsMCArMSwzMjcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIE9wdGltaXplZCBDQVZMQyB0YWJsZXMgZm9yIEguMjY0CisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCisKKy8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XSA9Cit7CisgICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQorfTsKKworLyogMngyIERlWmlnWmFnIHRhYmxlICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF0gPQoreworICAgIDAsIDEsIDIsIDMKK307CisKKworLyoKKyAqIFN1ZmZpeCBUbyBMZXZlbCB0YWJsZQorICogV2UgaW5jcmVtZW50IHRoZSBzdWZmaXggbGVuZ3RoIGlmIAorICogKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZT4+MSk+PSgzPDwoU3VmZml4TGVuZ3RoLTEpKSAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogIExldmVsQ29kZSAgICA+PSAzPDxTdWZmaXhMZW5ndGggICAgICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZSsyKSA+PSAoMzw8U3VmZml4TGVuZ3RoKSsyICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICovCitjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddID0KK3sKKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MikrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTIgKi8KKyAgICAoMzw8MykrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTMgKi8KKyAgICAoMzw8NCkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTQgKi8KKyAgICAoMzw8NSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTUgKi8KKyAgICAtMSAgICAgICAgICAgICAgLyogU3VmZml4TGVuZ3RoPTYgLSBuZXZlciBpbmNyZW1lbnQgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzBbMTMyXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwMCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDAwMjgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAzMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDBlOCwKKyAgICAweDAwMzgsIDB4MDBhMCwgMHgwMGM4LCAweDAwZDAsIDB4MDA0MCwgMHgwMDY4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MjdmZiwgMHgyN2ZmLCAweDIwNmIsIDB4MjA2YiwKKyAgICAweDAwODEsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA4NywgMHgwMDdkLCAweDAwN2IsIDB4MDA3MSwKKyAgICAweDAwN2YsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwKKyAgICAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsIDB4MjA1YiwgMHgyMDViLCAweDIwNTksIDB4MjA1OSwKKyAgICAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNTEsIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0OSwKKyAgICAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MjA0MSwgMHgyMDQxLCAweDIwNGQsIDB4MjA0ZCwKKyAgICAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwKKyAgICAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwKKyAgICAweDIwMzMsIDB4MjAzMywgMHgyMDI5LCAweDIwMjksIDB4MDA0NywgMHgwMDM1LCAweDAwMmIsIDB4MDAyMSwKKyAgICAweDIwM2YsIDB4MjAzZiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMTksIDB4MjAxOSwKKyAgICAweDAwMzcsIDB4MDAyNSwgMHgwMDFiLCAweDAwMTEsIDB4MjAyZiwgMHgyMDJmLCAweDIwMWQsIDB4MjAxZCwKKyAgICAweDAwMTMsIDB4MDAwOSwgMHgyMDFmLCAweDIwMWYKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzFbMTI4XSA9IHsKKyAgICAweDAwMjAsIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDFmLCAweDIwMTUsIDB4MjAxNSwKKyAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKKyAgICAweDAwMjgsIDB4MDBkMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDk4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwMzgsIDB4MDA2MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDdmLCAweDIwN2YsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA4MSwKKyAgICAweDAwN2IsIDB4MDA3OSwgMHgwMDdkLCAweDAwNzMsIDB4MjA3NSwgMHgyMDc1LCAweDIwNzEsIDB4MjA3MSwKKyAgICAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwKKyAgICAweDIwNmIsIDB4MjA2YiwgMHgyMDY5LCAweDIwNjksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKKyAgICAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsIDB4MDA1OSwgMHgwMDVkLCAweDAwNWIsIDB4MDA1MSwKKyAgICAweDAwNjcsIDB4MDA1NSwgMHgwMDUzLCAweDAwNDksIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwKKyAgICAweDIwNWYsIDB4MjA1ZiwgMHgyMDRkLCAweDIwNGQsIDB4MjA0YiwgMHgyMDRiLCAweDIwNDEsIDB4MjA0MSwKKyAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDAwMjksIDB4MDAzNSwgMHgwMDMzLCAweDAwMjEsIDB4MjA0NywgMHgyMDQ3LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDE5LCAweDIwMTksIDB4MDAzZiwgMHgwMDI1LCAweDAwMjMsIDB4MDAxMSwKKyAgICAweDAwMzcsIDB4MDAxZCwgMHgwMDFiLCAweDAwMDksIDB4MjAyZiwgMHgyMDJmLCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMlsxMTJdID0geworICAgIDB4MDAyMCwgMHgwMDg4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAorICAgIDB4MDAzZiwgMHgwMDM3LCAweDAwMmYsIDB4MDAyNywgMHgwMDFmLCAweDAwMTUsIDB4MDAwYiwgMHgwMDAxLAorICAgIDB4MDAyOCwgMHgwMDUwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LAorICAgIDB4MDdmZiwgMHgwMDgxLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA3ZiwgMHgwMDdkLAorICAgIDB4MDA3YiwgMHgwMDcxLCAweDAwNzcsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MjA2YiwgMHgyMDZiLAorICAgIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgyMDYxLCAweDIwNjEsIDB4MjA2ZCwgMHgyMDZkLAorICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNTksIDB4MjA1OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAorICAgIDB4MjA1YiwgMHgyMDViLCAweDIwNTEsIDB4MjA1MSwgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDQ5LAorICAgIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0MSwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LAorICAgIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwgMHgyMDRkLCAweDIwNGQsIDB4MjAyOSwgMHgyMDI5LAorICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAyMSwgMHgyMDIxLAorICAgIDB4MDAxOSwgMHgwMDNkLCAweDAwM2IsIDB4MDAxMSwgMHgwMDRmLCAweDAwMzUsIDB4MDAzMywgMHgwMDA5LAorICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAyNSwgMHgyMDI1LAorICAgIDB4MjAxYiwgMHgyMDFiLCAweDIwNDcsIDB4MjA0NywgMHgyMDFkLCAweDIwMWQsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zWzgwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwMDksIDB4MDAwYiwgMHgwN2ZmLCAweDAwMDEsIDB4MDAxMSwgMHgwMDEzLCAweDAwMTUsIDB4MDdmZiwKKyAgICAweDAwMTksIDB4MDAxYiwgMHgwMDFkLCAweDAwMWYsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywKKyAgICAweDAwMjksIDB4MDAyYiwgMHgwMDJkLCAweDAwMmYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzUsIDB4MDAzNywKKyAgICAweDAwMzksIDB4MDAzYiwgMHgwMDNkLCAweDAwM2YsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NywKKyAgICAweDAwNDksIDB4MDA0YiwgMHgwMDRkLCAweDAwNGYsIDB4MDA1MSwgMHgwMDUzLCAweDAwNTUsIDB4MDA1NywKKyAgICAweDAwNTksIDB4MDA1YiwgMHgwMDVkLCAweDAwNWYsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NywKKyAgICAweDAwNjksIDB4MDA2YiwgMHgwMDZkLCAweDAwNmYsIDB4MDA3MSwgMHgwMDczLCAweDAwNzUsIDB4MDA3NywKKyAgICAweDAwNzksIDB4MDA3YiwgMHgwMDdkLCAweDAwN2YsIDB4MDA4MSwgMHgwMDgzLCAweDAwODUsIDB4MDA4NworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNFszMl0gPSB7CisgICAgMHgwMDIwLCAweDAwMzgsIDB4MjAxNSwgMHgyMDE1LCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsCisgICAgMHgwMDI4LCAweDAwMzAsIDB4MDAyMSwgMHgwMDE5LCAweDIwMjcsIDB4MjAyNywgMHgwMDI1LCAweDAwMjMsCisgICAgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLCAweDAwMTEsIDB4MDAxZiwgMHgwMDEzLCAweDAwMDkKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0yICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz01ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTcgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEwICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEzICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE2ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNCAgLyogbkM9LTEgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMFs0MF0gPSB7CisgICAgMHgwMDIwLCAweDAwNDgsIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCisgICAgMHgwMDI4LCAweDAwNDAsIDB4MDAxMSwgMHgwMDBmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDE5LCAweDAwMTcsCisgICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjAxZiwgMHgyMDFmLCAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsCisgICAgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzLCAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMVsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksCisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEsCisgICAgMHgwMDFkLCAweDAwMWIsIDB4MDAxOSwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMlsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBiLCAweDAwMDksIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgwMDFiLCAweDAwMTcsIDB4MjAxOSwgMHgyMDE5LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfM1syNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMywgMHgwMDBmLCAweDAwMDcsIDB4MDAwNSwgMHgyMDExLCAweDIwMTEsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgyMDE5LCAweDIwMTksIDB4MjAxNywgMHgyMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNFsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMTUsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsCisgICAgMHgyMDE3LCAweDIwMTcsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzVbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDExLCAweDIwMTMsIDB4MjAxMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLAorICAgIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LAorICAgIDB4MDAxNSwgMHgwMDAxLCAweDIwMDMsIDB4MjAwMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZiwgMHgyMDExLCAweDIwMTEsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDksIDB4MjAwOSwKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDAwMTMsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfN1syMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMDMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsCisgICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksCisgICAgMHgwMDExLCAweDAwMDEsIDB4MjAwNSwgMHgyMDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzhbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDA1LCAweDIwMGIsIDB4MjAwYiwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAorICAgIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZCwgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKKyAgICAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTBbMTZdID0geworICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDUsIDB4MjAwNSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwYiwgMHgyMDBiLAorICAgIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExWzE2XSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA5LCAweDIwMDksIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKKyAgICAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMlsxNl0gPSB7CisgICAgMHgyMDAxLCAweDIwMDEsIDB4MjAwMywgMHgyMDAzLCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCisgICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTNbMTZdID0geworICAgIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0WzE2XSA9IHsKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMworfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzcsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTQKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzBbMTZdID0geworICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xWzE2XSA9IHsKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMlsxNl0gPSB7CisgICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wWzhdID0geworICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzFbOF0gPSB7CisgICAgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMls4XSA9IHsKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zWzhdID0geworICAgIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzRbOF0gPSB7CisgICAgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNVs4XSA9IHsKKyAgICAweDAwMDMsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDcsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182WzI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDAwZCwgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwKKyAgICAweDAwMTgsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsIDB4MDAyMCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywKKyAgICAweDAwMjgsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MDdmZiwgMHgwMDFkLCAweDIwMWIsIDB4MjAxYgorfTsKKworLyogVGFibGVzIDcgdG8gMTQgYXJlIGR1cGxpY2F0ZXMgb2YgdGFibGUgNiAqLworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wLCAgLyogWmVyb3NMZWZ0PTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181LCAgLyogWmVyb3NMZWZ0PTYgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9NyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTkgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTAgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTIgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTMgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYgICAvKiBaZXJvc0xlZnQ9MTUgKi8KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2JjZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpAQCAtMCwwICsxLDIwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisKKyAgICAgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGIzN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwzNjYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisKKyAgICBJRiAgQVJNMTEzNkpTCisKK01BU0tfMSAgRVFVIDB4MDEwMTAxMDEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BRMCAgICAgICAgUk4gMAorU3RlcEFyZyAgICBSTiAxCit0QzBBcmcgICAgIFJOIDIKK2FscGhhICAgICAgUk4gNgorCitiZXRhICAgICAgIFJOIDE0CitiUyAgICAgICAgIFJOIDE0Cit0QzAgICAgICAgIFJOIDE0CitwdEMwICAgICAgIFJOIDEKKworOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcworCis7Ly8gUGl4ZWxzCitwXzAgICAgIFJOIDMgCitwXzEgICAgIFJOIDUgIAorcF8yICAgICBSTiA0ICAKK3BfMyAgICAgUk4gMiAgCitxXzAgICAgIFJOIDggIAorcV8xICAgICBSTiA5ICAKK3FfMiAgICAgUk4gMTAgCitxXzMgICAgIFJOIDEyIAorCisKKzsvLyBGaWx0ZXJpbmcKKworYXAwcTAgICBSTiAxICAKK2ZpbHQgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgUk4gNworbTAxICAgICBSTiAxMQorCithcGZsZyAgIFJOIDAgCithcWZsZyAgIFJOIDYKKwordEMgICAgICBSTiAxCisKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKKworcG9zICAgICBSTiA3CituZWcgICAgIFJOIDEyCisKK1AwYSAgICAgUk4gMSAgIAorUDFhICAgICBSTiA4ICAgCitRMGEgICAgIFJOIDcgIAorUTFhICAgICBSTiA0ICAgCisKK3UxICAgICAgUk4gMyAgIAorbWF4ICAgICBSTiAxMgorbWluICAgICBSTiAyICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCisKK3FfM2IgICAgUk4gOSAgIAorcF8zYiAgICBSTiAwCithcHFmbGcgIFJOIDEyCisKK1AwYiAgICAgUk4gNgorUDFiICAgICBSTiA3IAorUDJiICAgICBSTiAxCisKK1EwYiAgICAgUk4gOSAKK1ExYiAgICAgUk4gMCAKK1EyYiAgICAgUk4gMgorCis7Ly8gTWlzY2VsbGFub3VzCisKK2EgICAgICAgUk4gMAordDAgICAgICBSTiAzIAordDEgICAgICBSTiAxMgordDIgICAgICBSTiA3Cit0MyAgICAgIFJOIDExCit0NCAgICAgIFJOIDQgICAKK3Q1ICAgICAgUk4gMSAgIAordDggICAgICBSTiA2ICAgCit0OSAgICAgIFJOIDE0ICAKK3QxMCAgICAgUk4gNSAgIAordDExICAgICBSTiA5ICAgCisKKzsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlKCkKKzsvLworOy8vIElucHV0cyAtIDMsNCw1LDgsOSwxMCAtIElucHV0IFBpeGVscyAocDAtcDIscTAtcTIpCis7Ly8gICAgICAgIC0gMiAtIGZpbHQsIDAgLSBhcGZsZywgNiAtIGFxZmxnCis7Ly8gICAgICAgIC0gMTEgLSBtMDEsIDcgLSB0QzAKKzsvLyAgICAgICAgIAorOy8vIE91dHB1dHMgLSAxLDgsNywxMSAtIE91dHB1dCBQaXhlbHMoUDBhLFAxYSxRMGEsUTFhKQorOy8vCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0CisKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUsIGxyCisKKyAgICAgICAgOy8vIFNpbmNlIGJldGEgPD0gMTggYW5kIGFscGhhIDw9IDI1NSB3ZSBrbm93CisgICAgICAgIDsvLyAtMjU0IDw9IHAwLXEwIDw9IDI1NAorICAgICAgICA7Ly8gIC0xNyA8PSBxMS1xMCA8PSAxNworICAgICAgICA7Ly8gIC0xNyA8PSBwMS1wMCA8PSAxNworCisgICAgICAgIDsvLyBkZWx0YSA9IENsaXAzKCAtdEMsIHRDLCAoKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MykpCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vICAgIENhbGN1bGF0ZSBBID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoNCpxMCAtIDQqcDAgKyBwMSAtIHExICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKChwMS1wMCkgLSAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMKKyAgICAgICAgCisgICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCisgICAgICAgIE1VTCAgICAgdEMwLCB0MiwgbTAxCisgICAgICAgIAorICAgICAgICBVU1VCOCAgIHQyLCBxXzEsIHFfMAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKKworICAgICAgICBVU1VCOCAgIHQyLCBwXzAsIHFfMAorICAgICAgICBBTkQgICAgIHQyLCB0MiwgbTAxCisgICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0MgorICAgICAgICBVSFNVQjggIHQ1LCBwXzAsIHFfMAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIE1PViAgICAgbTAwLCAjMAorICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCisgICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NQorICAgICAgICAKKyAgICAgICAgOy8vIHRDID0gdEMwCisgICAgICAgIDsvLyBpZiAoYXAgPCBiZXRhKSB0QysrOworICAgICAgICA7Ly8gaWYgKGFxIDwgYmV0YSkgdEMrKzsKKyAgICAgICAgVVNVQjggICB0NSwgZmlsdCwgbTAxICAgCisgICAgICAgIFNFTCAgICAgdEMwLCB0QzAsIG0wMAorICAgICAgICBVUUFERDggIHRDLCB0QzAsIGFwZmxnCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKKyAgICAgICAgVVFBREQ4ICB0QywgdEMsIGFxZmxnCisKKyAgICAgICAgOy8vIFNwbGl0IGludG8gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBhcnQgYW5kIGNsaXAgCisgICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCisgICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCisgICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKKyAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKKyAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QworICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZworICAgICAgICAKKyAgICAgICAgOy8vUmVsb2FkIG0wMQorICAgICAgICBMRFIgICAgIG0wMSw9TUFTS18xCisKKyAgICAgICAgVVFBREQ4ICBQMGEsIHBfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUTBhLCBxXzAsIHBvcworICAgICAgICBVUVNVQjggIFAwYSwgUDBhLCBuZWcKKyAgICAgICAgVVFBREQ4ICBRMGEsIFEwYSwgbmVnCisgICAgICAgIAorICAgICAgICA7Ly8gQ2hvb3NlIHRvIHN0b3JlIHRoZSBmaWx0ZXJlZAorICAgICAgICA7Ly8gdmFsdWUgb3IgdGhlIG9yaWdpbmFsIHBpeGVsCisgICAgICAgIFVTVUI4ICAgdDEsIGZpbHQsIG0wMSAgICAKKyAgICAgICAgU0VMICAgICBQMGEsIFAwYSwgcF8wCisgICAgICAgIFNFTCAgICAgUTBhLCBRMGEsIHFfMAorICAgIAorICAgICAgICA7Ly8gZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOworICAgICAgICA7Ly8gdTEgPSAocDAgKyBxMCArIDEpPj4xCisgICAgICAgIDsvLyB1MSA9ICggKHFfMCAtIHBfMCcpPj4xICkgXiAweDgwCisgICAgICAgIE1WTiAgICAgcF8wLCBwXzAKKyAgICAgICAgVUhTVUI4ICB1MSwgcV8wLCBwXzAgCisgICAgICAgIFVRQUREOCAgbWF4LCBwXzEsIHRDMAorICAgICAgICBFT1IgICAgIHUxLCB1MSwgbTAxICxMU0wgIzcKKyAgICAKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBID0gKHAyK3UxKT4+MSAKKyAgICAgICAgOy8vIFRoZW4gZGVsdGEgPSBDbGlwMyggLXRDMCwgdEMwLCBBIC0gcDEpCisKKyAgICAgICAgOy8vIENsaXAgUDEKKyAgICAgICAgVUhBREQ4ICBQMWEsIHBfMiwgdTEKKyAgICAgICAgVVFTVUI4ICBtaW4sIHBfMSwgdEMwCisgICAgICAgIFVTVUI4ICAgdDQsIFAxYSwgbWF4CisgICAgICAgIFNFTCAgICAgUDFhLCBtYXgsIFAxYQorICAgICAgICBVU1VCOCAgIHQ0LCBQMWEsIG1pbgorICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBtaW4KKworICAgICAgICA7Ly8gQ2xpcCBRMQorICAgICAgICBVSEFERDggIFExYSwgcV8yLCB1MQorICAgICAgICBVUUFERDggIG1heCwgcV8xLCB0QzAKKyAgICAgICAgVVFTVUI4ICBtaW4sIHFfMSwgdEMwCisgICAgICAgIFVTVUI4ICAgdDAsIFExYSwgbWF4CisgICAgICAgIFNFTCAgICAgUTFhLCBtYXgsIFExYQorICAgICAgICBVU1VCOCAgIHQwLCBRMWEsIG1pbgorICAgICAgICBTRUwgICAgIFExYSwgUTFhLCBtaW4KKyAgICAgICAgCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MCwgYXBmbGcsIG0wMQorICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBwXzEKKyAgICAgICAgVVNVQjggICB0MCwgYXFmbGcsIG0wMQorICAgICAgICBTRUwgICAgIHQzLCBRMWEsIHFfMQorICAgICAgICAKKyAgICAgICAgTV9FTkQKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQorOy8vCis7Ly8gSW5wdXRzIC0gMyw0LDUsOCw5LDEwIC0gSW5wdXQgUGl4ZWxzIChwMC1wMixxMC1xMikKKzsvLyAgICAgICAgLSAyIC0gZmlsdCwgMCAtIGFwZmxnLGFxZmxnCis7Ly8gICAgICAgIC0gMSAtIGFwMHEwLCA2IC0gYWxwaGEKKzsvLyAgICAgICAgLSA3IC0gbTAwLCAxMSAtIG0wMQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIDYsNywxLDksMCwyIC0gT3V0cHV0IFBpeGVscyhQMGIsUDFiLFAyYiwgUTBiLFExYixRMmIpCis7Ly8gCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0CisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlLCBscgorICAgIAorICAgICAgICA7Ly8gYXBmbGcgPSBhcGZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAorICAgICAgICA7Ly8gYXBmbGcgPSBhcWZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAorCisgICAgICAgIE1fQVJHICAgcER1bW15LDQKKyAgICAgICAgTV9BUkcgICBwUV8zLDQKKyAgICAgICAgTV9BUkcgICBwUF8zLDQKKyAgICAgICAgCisgICAgICAgIFVIQUREOCAgYWxwaGEsIGFscGhhLCBtMDAKKyAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgOy8vdDkgPSBkcDJwMAorICAgICAgICBVSEFERDggIGFscGhhLCBhbHBoYSwgbTAwCisgICAgICAgIEFERCAgICAgYWxwaGEsIGFscGhhLCBtMDEsIExTTCAjMSAgICAgICAgCisgICAgICAgIFVTVUI4ICAgYXAwcTAsIGFwMHEwLCBhbHBoYQorICAgICAgICBTRUwgICAgIGFwcWZsZywgbTAwLCBhcGZsZworCisgICAgICAgIDsvLyBQMCA9IChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMgCisgICAgICAgIDsvLyAgICA9ICgocDItcDApICsgMioocDEtcDApICsgKHExLXEwKSArIDMqKHEwLXAwKSArIDgqcDAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIDIqKHAxLXAwKSArIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MykKKworICAgICAgICA7Ly8gUDEgPSAocDIgKyBwMSArIHEwICsgcDAgKyAyKT4+MgorICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIChwMS1wMCkgLSAocDAtcTApICsgMik+PjIpCisgICAgICAgIAorICAgICAgICA7Ly8gUDIgPSAoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSAoMioocDMtcDApICsgMyoocDItcDApICsgKHAxLXAwKSAtIChwMC1xMCkgKyA4KnAwICsgNCk+PjMKKyAgICAgICAgOy8vICAgID0gcDAgKyAoKChwMy1wMCkgKyAocDItcDApICsgdDIgKyAyKT4+MikKKworICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKKyAgICAgICAgVVNVQjggICB0MiwgcF8wLCBxXzAgICAgICAgICAKKyAgICAgICAgU1NVQjggICB0NSwgdDksIHQyICAgICAgICAgICAKKworICAgICAgICBVU1VCOCAgIHQ4LCBxXzEsIHFfMCAgICAgICAgIAorICAgICAgICBTSEFERDggIHQ4LCB0NSwgdDgKKworICAgICAgICBVU1VCOCAgIHQ5LCBwXzEsIHBfMCAgICAgICAgIAorICAgICAgICBTQUREOCAgIHQ4LCB0OCwgdDkKKyAgICAgICAgU0hTVUI4ICB0OCwgdDgsIHQyCisgICAgICAgIFNIQUREOCAgdDUsIHQ1LCB0OQorICAgICAgICBTSEFERDggIHQ4LCB0OCwgbTAxCisgICAgICAgIFNIQUREOCAgdDksIHQ1LCBtMDEKKyAgICAgICAgU0FERDggICBQMGIsIHBfMCwgdDggICAgICAgICAKKyAgICAgICAgOy8vIFAwYiByZWFkeQorICAgICAgICAKKyAgICAgICAgOy8vIENvbXB1dGUgUDFiCisgICAgICAgIE1fTERSICAgcF8zYiwgcFBfMworICAgICAgICBTQUREOCAgIFAxYiwgcF8wLCB0OSAgICAgICAgIAorICAgICAgICA7Ly8gUDFiIHJlYWR5CisgICAgICAgIAorICAgICAgICA7Ly8gQ29tcHV0ZSBQMmIKKyAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgICAgICAKKyAgICAgICAgU0FERDggICB0NSwgdDUsIHQ5CisgICAgICAgIFVIU1VCOCAgdDksIHBfM2IsIHBfMCAgICAgICAgCisgICAgICAgIEVPUiAgICAgYSwgcF8zYiwgcF8wICAgICAgICAgCisgICAgICAgIEFORCAgICAgYSwgYSwgbTAxCisgICAgICAgIFNIQUREOCAgdDUsIHQ1LCBhCisgICAgICAgIFVIQUREOCAgYSwgcF8wLCBxXzEKKyAgICAgICAgU0FERDggICB0NSwgdDUsIG0wMQorICAgICAgICBTSEFERDggIHQ1LCB0NSwgdDkKKyAgICAgICAgTVZOICAgICB0OSwgcF8xCisgICAgICAgIFNBREQ4ICAgUDJiLCBwXzAsIHQ1ICAgICAgICAgCisgICAgICAgIDsvLyBQMmIgcmVhZHkKKyAgICAgICAgCisgICAgICAgIFVIU1VCOCAgYSwgYSwgdDkKKyAgICAgICAgT1JSICAgICB0OSwgYXBxZmxnLCBtMDEKKyAgICAgICAgVVNVQjggICB0OSwgYXBxZmxnLCB0OQorCisgICAgICAgIEVPUiAgICAgYSwgYSwgbTAxLCBMU0wgIzcKKyAgICAgICAgU0VMICAgICBQMGIsIFAwYiwgYQorICAgICAgICBTRUwgICAgIFAxYiwgUDFiLCBwXzEKKyAgICAgICAgU0VMICAgICBQMmIsIFAyYiwgcF8yCisKKyAgICAgICAgVVNVQjggICB0NCwgZmlsdCwgbTAxCisgICAgICAgIFNFTCAgICAgUDBiLCBQMGIsIHBfMAorCisgICAgICAgIAorICAgICAgICA7Ly8gUTAgPSAocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zIAorICAgICAgICA7Ly8gICAgPSAoKHEyLXEwKSArIDIqKHExLXEwKSArIChwMS1wMCkgKyAzKihwMC1xMCkgKyA4KnEwICsgNCk+PjMKKyAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAyKihxMS1xMCkgKyAocDEtcDApICsgMyoocDAtcTApICsgNCk+PjMpCisKKyAgICAgICAgOy8vIFExID0gKHEyICsgcTEgKyBwMCArIHEwICsgMik+PjIKKyAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDIpPj4yKQorCisgICAgICAgIDsvLyBRMiA9ICgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zCisgICAgICAgIDsvLyAgICA9ICgyKihxMy1xMCkgKyAzKihxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDgqcTAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSBxMCArICgoKHEzLXEwKSArIChxMi1xMCkgKyB0MiArIDIpPj4yKQorCisKKyAgICAgICAgOy8vIENvbXB1dGUgUTBiIFExYgorICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMCAgICAgICAgICAgCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBxXzAKKyAgICAgICAgVVNVQjggICB0OSwgcF8xLCBwXzAKKyAgICAgICAgU0FERDggICB0MCwgdDQsIGEKKyAgICAgICAgU0hBREQ4ICB0OSwgdDAsIHQ5CisgICAgICAgIFVIQUREOCAgdDEwLCBxXzAsIHBfMQorICAgICAgICBTQUREOCAgIHQ5LCB0OSwgYQorICAgICAgICBVU1VCOCAgIGEsIHFfMSwgcV8wCisgICAgICAgIFNIQUREOCAgdDksIHQ5LCBhCisgICAgICAgIFNIQUREOCAgdDAsIHQwLCBhCisgICAgICAgIFNIQUREOCAgdDksIHQ5LCBtMDEKKyAgICAgICAgU0hBREQ4ICBhLCB0MCwgbTAxCisgICAgICAgIFNBREQ4ICAgdDksIHFfMCwgdDkgICAgICAgICAgICAKKyAgICAgICAgOy8vIFEwYiByZWFkeSAtIHQ5CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHQ0LCAjMAorICAgICAgICBVSEFERDggIGFwcWZsZywgYXBxZmxnLCB0NAorICAgICAgICAKKyAgICAgICAgU0FERDggICBRMWIsIHFfMCwgYSAKKyAgICAgICAgOy8vIFExYiByZWFkeQorICAgICAgIAorICAgICAgICBVU1VCOCAgIHQ0LCBhcHFmbGcsIG0wMQorICAgICAgICBTRUwgICAgIFExYiwgUTFiLCBxXzEKKyAgICAgICAgTVZOICAgICB0MTEsIHFfMQorICAgICAgICBVSFNVQjggIHQxMCwgdDEwLCB0MTEKKyAgICAgICAgTV9MRFIgICBxXzNiLCBwUV8zCisgICAgICAgIEVPUiAgICAgdDEwLCB0MTAsIG0wMSwgTFNMICM3CisgICAgICAgIFNFTCAgICAgdDksIHQ5LCB0MTAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb21wdXRlIFEyYgorICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMAorICAgICAgICBTQUREOCAgIHQ0LCB0MCwgdDQKKyAgICAgICAgRU9SICAgICB0MCwgcV8zYiwgcV8wIAorICAgICAgICBBTkQgICAgIHQwLCB0MCwgbTAxCisgICAgICAgIFNIQUREOCAgdDQsIHQ0LCB0MAorICAgICAgICBVSFNVQjggIHQxMCwgcV8zYiwgcV8wCisgICAgICAgIFNBREQ4ICAgdDQsIHQ0LCBtMDEKKyAgICAgICAgU0hBREQ4ICB0NCwgdDQsIHQxMAorCisgICAgICAgIFVTVUI4ICAgdDEwLCBmaWx0LCBtMDEKKyAgICAgICAgU0VMICAgICBRMGIsIHQ5LCBxXzAKKworICAgICAgICBTQUREOCAgIHQ0LCBxXzAsIHQ0ICAgICAgICAgICAgCisgICAgICAgIDsvLyBRMmIgcmVhZHkgLSB0NAorCisgICAgICAgIFVTVUI4ICAgdDEwLCBhcHFmbGcsIG0wMQorICAgICAgICBTRUwgICAgIFEyYiwgdDQsIHFfMgorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDQ4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwpAQCAtMCwwICsxLDMyNSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisgICAgICAgIAorTEFTVF9DT0VGRiAgICAgICAgICAgICAgIEVRVSAweDIwICAgICAgICA7Ly8gRW5kIG9mIGJsb2NrIGZsYWcKK1RXT19CWVRFX0NPRUZGICAgICAgICAgICBFUVUgMHgxMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcHBCaXRTdHJlYW0gICAgIFJOIDAKK3BPZmZzZXQgICAgICAgICBSTiAxCitwTnVtQ29lZmYgICAgICAgUk4gMgorcHBQb3NDb2VmYnVmICAgIFJOIDMKK25DICAgICAgICAgICAgICBSTiA0IDsvLyBudW1iZXIgb2YgY29lZmZzIG9yIDE3IGZvciBjaHJvbWEKK3NNYXhOdW1Db2VmZiAgICBSTiA1CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCisKKzsvLyBMZXZlbCBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorVHJhaWxpbmdPbmVzICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitMZXZlbFN1ZmZpeCAgICAgUk4gMworU3VmZml4TGVuZ3RoICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIFJ1biBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorWmVyb3NMZWZ0ICAgICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitwcFJ1blRhYmxlICAgICAgUk4gMworcFJ1biAgICAgICAgICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIEZpbGwgaW4gY29lZmZpY2llbnRzIGxvb3AKK3BQb3NDb2VmYnVmICAgICBSTiAwCit0ZW1wICAgICAgICAgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK3BwUG9zQ29lZmJ1ZiAgICBSTiAzCitwUnVuICAgICAgICAgICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKK3BaaWdaYWcgICAgICAgICBSTiA2CisKK1QxICAgICAgICAgICAgICBSTiA4CitUMiAgICAgICAgICAgICAgUk4gOQorUkJpdFN0cmVhbSAgICAgIFJOIDEwCitSQml0QnVmZmVyICAgICAgUk4gMTEKK1JCaXRDb3VudCAgICAgICBSTiAxMgorQ29lZmZOdW0gICAgICAgIFJOIDE0CisKKworCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DNCBwcHBCaXRTdHJlYW0sIDQKKyAgICAgICAgTV9BTExPQzQgcHBPZmZzZXQsIDQKKyAgICAgICAgTV9BTExPQzQgcHBwUG9zQ29lZmJ1ZiwgNAorICAgICAgICBNX0FMTE9DNCBwcExldmVsLCAxNioyCisgICAgICAgIE1fQUxMT0M0IHBwUnVuLCAxNgorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcE5DLCA0CisgICAgICAgIE1fQVJHICAgcFNNYXhOdW1Db2VmZiw0CisgICAgICAgIAorICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDAgcHBCaXRTdHJlYW0sIHBPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgICBMRFIgICAgICAgIHBWTERUYWJsZSwgPWFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgICAgIE1fTERSICAgICAgbkMsIHBOQworICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMSBUMSwgVDIsIGxyCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBuQywgTFNMICMyXSAgOy8vIEZpbmQgVkxEIHRhYmxlICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMiBUMSwgVDIsIGxyCisKKyAgICAgICAgOy8vIERlY29kZSBTeW1ib2wgPSBUb3RhbENvZWZmKjQgKyBUcmFpbGluZ09uZXMKKyAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIKKyAgICAKKyAgICAgICAgTU9WUyAgICBUb3RhbENvZWZmLCBTeW1ib2wsIExTUiAjMiAgICAKKyAgICAgICAgU1RSQiAgICBUb3RhbENvZWZmLCBbcE51bUNvZWZmXSAgICAKKyAgICAgICAgTV9QUklOVEYgIlRvdGFsQ29lZmY9JWRcbiIsIFRvdGFsQ29lZmYKKyAgICAgICAgQkVRLlcgICBFbmROb0Vycm9yICAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGVkIGlmIG5vIGNvZWZmaWNpZW50cworCisgICAgICAgIENNUCAgICAgU3ltYm9sLCAjMTcqNAorICAgICAgICBCR0UuVyAgIEVuZEJhZFN5bWJvbCAgICAgICAgICAgICAgICA7Ly8gRXJyb3IgaWYgYmFkIHN5bWJvbAorICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgYml0c3RyZWFtIHBvaW50ZXJzCisgICAgICAgIE1fU1RSICAgcHBCaXRTdHJlYW0sICBwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9TVFIgICBwT2Zmc2V0LCAgICAgIHBwT2Zmc2V0CisgICAgICAgIE1fU1RSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBUcmFpbGluZyBPbmVzCisgICAgICAgIEFORFMgICAgVHJhaWxpbmdPbmVzLCBTeW1ib2wsICMzCisgICAgICAgIE1fQURSICAgcExldmVsLCBwcExldmVsICAgICAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJUcmFpbGluZ09uZXM9JWRcbiIsIFRyYWlsaW5nT25lcworICAgICAgICBCRVEgICAgIFRyYWlsaW5nT25lc0RvbmUgICAgCisgICAgICAgIE1PViAgICAgQ291bnQsIFRyYWlsaW5nT25lcworVHJhaWxpbmdPbmVzTG9vcCAgICAKKyAgICAgICAgTV9CRF9SRUFEOCBTeW1ib2wsIDEsIFQxCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNT1YgICAgIFQxLCAjMQorICAgICAgICBTVUIgICAgIFQxLCBUMSwgU3ltYm9sLCBMU0wgIzEKKyAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQorICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIKKyAgICAgICAgQkdUICAgICBUcmFpbGluZ09uZXNMb29wCitUcmFpbGluZ09uZXNEb25lICAgIAorICAgIAorICAgICAgICA7Ly8gRGVjb2RlIGxldmVsIHZhbHVlcyAgICAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzICAgICA7Ly8gTnVtYmVyIG9mIGxldmVscyB0byByZWFkCisgICAgICAgIEJFUSAgICAgRGVjb2RlUnVucyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5vbmUgbGVmdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTdWZmaXhMZW5ndGgsICMxCisgICAgICAgIENNUCAgICAgVG90YWxDb2VmZiwgIzEwCisgICAgICAgIE1PVkxFICAgU3VmZml4TGVuZ3RoLCAjMAorICAgICAgICBDTVAgICAgIFRyYWlsaW5nT25lcywgIzMgICAgOy8vIGlmIChUcmFpbGluZ09uZXM8MykKKyAgICAgICAgTU9WTFQgICBUcmFpbGluZ09uZXMsICM0ICAgIDsvLyB0aGVuIFRyYWlsaW5nT25lcyA9ICs0CisgICAgICAgIE1PVkdFICAgVHJhaWxpbmdPbmVzLCAjMiAgICA7Ly8gZWxzZSBUcmFpbGluZ09uZXMgPSArMgorICAgICAgICBNT1ZHRSAgIFN1ZmZpeExlbmd0aCwgIzAgICAgOy8vICAgICAgU3VmZml4TGVuZ3RoID0gMAorICAgICAgICAKK0xldmVsTG9vcAorICAgICAgICBNX0JEX0NMWjE2IFN5bWJvbCwgVDEsIFQyICAgOy8vIFN5bWJvbD1MZXZlbFByZWZpeAorICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKKyAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgbHIsIFN1ZmZpeExlbmd0aCAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCisgICAgICAgIFRFUUVRICAgU3ltYm9sLCAjMTQgICAgICAgICA7Ly8gICBhbmQgIExldmVsUHJlZml4PT0xNAorICAgICAgICBNT1ZFUSAgIGxyLCAjNCAgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9NAorICAgICAgICBURVEgICAgIFN5bWJvbCwgIzE1ICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MTUKKyAgICAgICAgTU9WRVEgICBsciwgIzEyICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTEyCisgICAgICAgIAorICAgICAgICBURVFFUSAgIFN1ZmZpeExlbmd0aCwjMAorICAgICAgICBBRERFUSAgIFN5bWJvbCxTeW1ib2wsIzE1CisgICAgICAgIAorICAgICAgICBURVEgICAgIGxyLCAjMCAgICAgICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAorICAgICAgICBCRVEgICAgIExldmVsQ29kZVJlYWQgICAgICAgOy8vIExldmVsQ29kZSA9IExldmVsUHJlZml4CisgICAgICAgIAorICAgICAgICBNX0JEX1ZSRUFEMTYgTGV2ZWxTdWZmaXgsIGxyLCBUMSwgVDIgIDsvLyBSZWFkIExldmVsIFN1ZmZpeAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTeW1ib2wsIFN5bWJvbCwgTFNMIFN1ZmZpeExlbmd0aAorICAgICAgICBBREQgICAgIFN5bWJvbCwgTGV2ZWxTdWZmaXgsIFN5bWJvbAorICAgICAgICAgICAgIAorTGV2ZWxDb2RlUmVhZCAgICAgICAgCisgICAgICAgIDsvLyBTeW1ib2wgPSBMZXZlbENvZGUKKyAgICAgICAgQUREICAgICBTeW1ib2wsIFN5bWJvbCwgVHJhaWxpbmdPbmVzIDsvLyArNCBpZiBsZXZlbCBjYW5ub3QgYmUgKy8tMSwgKzIgby93CisgICAgICAgIE1PViAgICAgVHJhaWxpbmdPbmVzLCAjMgorICAgICAgICBNT1ZTICAgIFQxLCBTeW1ib2wsIExTUiAjMQorICAgICAgICBSU0JDUyAgIFQxLCBUMSwgIzAgICAgICAgICAgICAgICAgICA7Ly8gSWYgU3ltYm9sIG9kZCB0aGVuIG5lZ2F0ZQorICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCisgICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMiAgICAgICAgICAgIDsvLyBTdG9yZSBsZXZlbC4KKyAgICAgICAgCisgICAgICAgIExEUiAgICAgVDIsID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgTERSU0IgICBUMSwgW1QyLCBTdWZmaXhMZW5ndGhdICAgICAgOy8vIEZpbmQgaW5jcmVtZW50IGxldmVsICAgICAgICAKKyAgICAgICAgVEVRICAgICBTdWZmaXhMZW5ndGgsICMwCisgICAgICAgIE1PVkVRICAgU3VmZml4TGVuZ3RoLCAjMQorICAgICAgICBDTVAgICAgIFN5bWJvbCwgVDEKKyAgICAgICAgQUREQ1MgICBTdWZmaXhMZW5ndGgsIFN1ZmZpeExlbmd0aCwgIzEgICAgICAgIAorICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgIAorICAgICAgICBCR1QgICAgIExldmVsTG9vcAorICAgICAgICAKK0RlY29kZVJ1bnMgICAgICAgIAorICAgICAgICA7Ly8gRmluZCBudW1iZXIgb2YgemVyb3MKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBTVUIgICAgIENvdW50LCBUb3RhbENvZWZmLCAjMSAgICAgICA7Ly8gTnVtYmVyIG9mIHJ1bnMgZXhjbHVkaW5nIGxhc3QKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFQxLCBUb3RhbENvZWZmICAgOy8vIE1heGltdW0gbnVtYmVyIG9mIHplcm9zIHRoZXJlIGNvdWxkIGJlCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WICAgICBDb2VmZk51bSxUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKKyAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAorICAgICAgICAKKyAgICAgICAgOy8vIFVucGFjayBudW1iZXIgb2YgemVyb3MgZnJvbSBiaXRzdHJlYW0KKyAgICAgICAgVEVRICAgICBUMSwgIzQgICAgICAgIAorICAgICAgICBMRFJFUSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcy00KQorICAgICAgICBMRFJORSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzLTQpCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBUb3RhbENvZWZmLCBMU0wgIzJdCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMiA7Ly8gU3ltYm9sID0gWmVyb3NMZWZ0CisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAorCisgICAgICAgIExEUiAgICAgcHBSdW5UYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzLTQpCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WUyAgICBaZXJvc0xlZnQsIFN5bWJvbAorCisgICAgICAgIEFERCAgICAgQ29lZmZOdW0sQ29lZmZOdW0sWmVyb3NMZWZ0ICAgICAgICAKKworICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0CisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgemVyb3MgYXJlIGxlZnQgYW5kIG1vcmUgdGhhbiBvbmUgY29lZmZpY2llbnQKK1J1bkxvb3AgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BwUnVuVGFibGUsIFplcm9zTGVmdCwgTFNMIzJdCisgICAgICAgIEJMVCAgICAgTGFzdFJ1bgorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgMywgMiA7Ly8gU3ltYm9sID0gUnVuCisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNSAgICAgICAgIAorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbCAgICAgICAgCisKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFplcm9zTGVmdCwgU3ltYm9sCisgICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFN5bWJvbAorICAgICAgICBTVFJCICAgIFN5bWJvbCwgW3BSdW5dLCAjMQorICAgICAgICBCR1QgICAgIFJ1bkxvb3AKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSBubyB6ZXJvcyBhcmUgbGVmdAorTm9aZXJvc0xlZnQgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSR0VCICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEKKyAgICAgICAgQkdUICAgICBOb1plcm9zTGVmdAorCitMYXN0UnVuICAgICAgICAKKyAgICAgICAgOy8vIEZpbmFsIHJ1biBsZW5ndGggaXMgcmVtYWluaW5nIHplcm9zCisgICAgICAgIE1fUFJJTlRGICJMYXN0UnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSQiAgICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGNvZWZmaWNpZW50cyB0byBvdXRwdXQgYXJyYXkKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBURVEgICAgIFQxLCAjMTUKKyAgICAgICAgQURERVEgICBDb2VmZk51bSxDb2VmZk51bSwjMQorICAgICAgICAKKworICAgICAgICBTVUIgICAgIHBSdW4scFJ1bixUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAKKyAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgICAKKworICAgICAgICBNX0xEUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZgorICAgICAgICBMRFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQorICAgICAgICBURVEgICAgIFQxLCAjNAorICAgICAgICBMRFJFUSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAgICAgTERSTkUgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKKyAgICAgICAgCisgICAgICAgIAorT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgTERSQiAgICBUMiwgW3BSdW5dLCMxCisgICAgICAgIExEUkIgICAgVDEsIFtwWmlnWmFnLCBDb2VmZk51bV0KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sICMxICAgICAgOy8vIFNraXAgTm9uIHplcm8KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sIFQyICAgICAgOy8vIFNraXAgWmVybyBydW4KKyAgICAgICAgCisgICAgICAgIExEUlNIICAgVDIsIFtwTGV2ZWxdLCMyCisgICAgICAgIAorICAgICAgICBTVUJTICAgIFRvdGFsQ29lZmYsIFRvdGFsQ29lZmYsICMxICAgICAgIAorICAgICAgICBPUlJFUSAgIFQxLCBUMSwgI0xBU1RfQ09FRkYKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgdGVtcCwgVDIsICMxMjgKKyAgICAgICAgQ01QICAgICB0ZW1wLCAjMjU2CisgICAgICAgIE9SUkNTICAgVDEsIFQxLCAjVFdPX0JZVEVfQ09FRkYKKworICAgICAgICAKKyAgICAgICAgVEVRICAgICBUb3RhbENvZWZmLCAjMCAgICAgICAgICAgICAgOy8vIFByZXNlcnZlcyBjYXJyeSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1BSSU5URiAiT3V0cHV0PSUwMnggJTA0eFxuIiwgVDEsIFQyCisgICAgICAgIFNUUkIgICAgVDEsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIFNUUkIgICAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIE1PViAgICAgVDIsIFQyLCBMU1IgIzgKKyAgICAgICAgU1RSQ1NCICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIEZpbmlzaGVkCisgICAgICAgIFNUUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCisgICAgICAgIE1fTERSICAgcHBCaXRTdHJlYW0sIHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgIHBPZmZzZXQsIHBwT2Zmc2V0CisgICAgICAgIEIgICAgICAgRW5kTm9FcnJvcgorICAgICAgICAgICAgCitFbmRCYWRTeW1ib2wKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfRXJyCisgICAgICAgIEIgICAgICAgRW5kICAgIAorICAgICAgICAKK0VuZE5vRXJyb3IKKyAgICAgICAgOy8vIEZpbmlzaGVkIHJlYWRpbmcgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBPZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyICAgIAorRW5kCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZmMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCkBAIC0wLDAgKzEsMTIzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKworICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXggCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgICAgIAorICAgICAgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKyAgICAgICAgICAgCisgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMSwgMiwgMQorICAgICAgICAgRENCICAwLCAyLCAwLCAyCisgICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKKworCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgICAgICBEQ0IgIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMQorCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4CisgICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKKyAgICAgICAgIERDQiAgMTEsIDE4LCAxNAorICAgICAgICAgRENCICAxMywgMjAsIDE2CisgICAgICAgICBEQ0IgIDE0LCAyMywgMTgKKyAgICAgICAgIERDQiAgMTYsIDI1LCAyMAorICAgICAgICAgRENCICAxOCwgMjksIDIzCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQorICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKKyAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCisgICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAorICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKKyAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2CisgICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNworICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKKyAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcworOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgRENXIDEwLCAxNiwgMTMgCisgICAgICAgICBEQ1cgMTEsIDE4LCAxNAorICAgICAgICAgRENXIDEzLCAyMCwgMTYKKyAgICAgICAgIERDVyAxNCwgMjMsIDE4CisgICAgICAgICBEQ1cgMTYsIDI1LCAyMAorICAgICAgICAgRENXIDE4LCAyOSwgMjMgCisgICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiOTU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCisgICAgSUYgQVJNMTEzNkpTIAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDgKK2lIZWlnaHQgICAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCit4ICAgICAgICAgICAgICAgUk4gNworeDAgICAgICAgICAgICAgIFJOIDcKK3gxICAgICAgICAgICAgICBSTiAxMAoreDIgICAgICAgICAgICAgIFJOIDExCitTY3JhdGNoICAgICAgICAgUk4gMTIKKworOy8vIEZ1bmN0aW9uOiAKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGEgNCBieXRlIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uLgorOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA5IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gcm93cyB0byBjb3B5Cis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMixyMyxyNCxyNSxyNgorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYworOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZSAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29weSBwRHN0IHRvIHNjcmF0Y2gKKyAgICAgICAgTU9WICAgICBTY3JhdGNoLCBwRHN0CisKK1N0YXJ0QWxpZ25lZFN0YWNrQ29weQorICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMKKyAgICAgICAgCisgICAgICAgIE1fU1dJVENIIHgKKyAgICAgICAgTV9DQVNFICAgQ29weTB0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTF0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTJ0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTN0b0FsaWduZWQKKyAgICAgICAgTV9FTkRTV0lUQ0gKKworQ29weTB0b0FsaWduZWQgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MHRvQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlFbmQgIAorICAgICAgCitDb3B5MXRvQWxpZ25lZCAgICAgICAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMjQKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTF0b0FsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5RW5kICAKKworQ29weTJ0b0FsaWduZWQgICAgICAgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMTYKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkydG9BbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weUVuZCAgCisKK0NvcHkzdG9BbGlnbmVkICAgICAgICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjOAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTN0b0FsaWduZWQKKworQ29weUVuZCAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBTcmMsIFNjcmF0Y2gKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjMTIKKworICAgICAgICBNX0VORAorICAgIAorCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIG9mIHJvd3MgdG8gY29weQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjIscjMscjQscjUscjYKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyOCxyOSxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKKzsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENvcHkgcFNyYyB0byBzdGFjaworU3RhcnRWQWxpZ25lZFN0YWNrQ29weQorICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NXSVRDSCB4CisgICAgICAgIE1fQ0FTRSAgIENvcHkwdG9WQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MXRvVkFsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTJ0b1ZBbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkzdG9WQWxpZ25lZAorICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICAKK0NvcHkwdG9WQWxpZ25lZCAgCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MHRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisgICAgICAKK0NvcHkxdG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICM4CisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTF0b1ZBbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weVZFbmQgIAorCitDb3B5MnRvVkFsaWduZWQgICAgICAgIAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMTYKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MnRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisKK0NvcHkzdG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzI0CisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTN0b1ZBbGlnbmVkCisKK0NvcHlWRW5kICAKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBEc3QsICMyOAorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0CisKKyAgICAgICAgTV9FTkQKKworCisgICAgRU5ESUYKKworICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBiNmVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwxNDkgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIxLHIzLHI0LHI1LHI2LHI3LHIxMCxyMTEscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjAscjIscjgscjkscjEyCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKKyAgICAgICAgCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK3gwICAgICAgICAgICAgICBSTiA0Cit4MSAgICAgICAgICAgICAgUk4gNQoreDIgICAgICAgICAgICAgIFJOIDgKK3gzICAgICAgICAgICAgICBSTiA5CitUZW1wICAgICAgICAgICAgUk4gMTIKKworICAgIElGIEFSTTExMzZKUworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUsIHI2CisKK0NvcHk0eDRTdGFydAorICAgICAgICA7Ly8gRG8gQ29weSBhbmQgYnJhbmNoIHRvIEVuZE9mSW50ZXJwb2xhdGlvbgorICAgICAgICBBTkQgICAgIFRlbXAsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBNX1NXSVRDSCBUZW1wCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMAorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjEKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24yCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMworICAgICAgICBNX0VORFNXSVRDSAorCitDb3B5NHg0QWxpZ24wCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX0xEUiAgIHgxLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgxLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTV9MRFIgICB4MywgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNX1NUUiAgIHgzLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKworQ29weTR4NEFsaWduMQorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKyAgICAgIAorQ29weTR4NEFsaWduMgorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRBbGlnbjMgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKworICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRFbmQKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjZmU1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE3OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKworOy8vIEZ1bmN0aW9uczogCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSBhbmQKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlIAorOy8vCis7Ly8gSW1wbGVtZW50cyByZS1hcnJhbmdlbWVudCBvZiBkYXRhIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciB0byBhIGJ1ZmZlciBwb2ludGVkIGJ5IHBCdWYuCis7Ly8gVGhpcyB3aWxsIGRvIHRoZSBjb252ZXJ0aW9uIG9mIGRhdGEgZnJvbSAxNiBiaXQgdG8gOCBiaXQgYW5kIGl0IGFsc28KKzsvLyByZW1vdmUgb2Zmc2V0IGFuZCBjaGVjayBmb3Igc2F0dXJhdGlvbi4KKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjcgd2hlcmUgcjAgaXMgaW5wdXQgcG9pbnRlciBhbmQgcjIgaXRzIHN0ZXAgc2l6ZSwgcjcgaXMgb3V0cHV0IHBvaW50ZXIKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbgorOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgZGVzdGluYXRpb24gbG9jYXRpb24KKworCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKyAgICAgICAgCitNQVNLICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAgIDsvLyBNYXNrIGlzIHVzZWQgdG8gaW1wbGVtZW50IChhK2IrMSkvMgorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyYzAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAwICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1RlbXAxICAgICAgICAgICBSTiA0CitUZW1wMiAgICAgICAgICAgUk4gNQorVGVtcDMgICAgICAgICAgIFJOIDEwCitUZW1wNCAgICAgICAgICAgUk4gMTEKK3BCdWYgICAgICAgICAgICBSTiA3CityMHgwZmUwMGZlMCAgICAgUk4gNgorcjB4MDBmZjAwZmYgICAgIFJOIDEyCitDb3VudCAgICAgICAgICAgUk4gMTQKK1ZhbHVlQTAgICAgICAgICBSTiAxMAorVmFsdWVBMSAgICAgICAgIFJOIDExCisKKyAgICBJRiBBUk0xMTM2SlMKKworCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgIAorICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzQgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgCitMb29wU3RhcnQxCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMCAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICAgICAgIAorICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFJEICAgICAgICBWYWx1ZUEwLCBbcEJ1Zl0sICM4IAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQxCitFbmQxCisgICAgICAgIFNVQiAgICAgICAgcFNyYzAsIHBCdWYsICMzMgorICAgICAgICBNT1YgICAgICAgIHNyY1N0ZXAwLCAjOAorCisgICAgICAgIE1fRU5ECisKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlLCByNgorICAgICAgICAKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmCisgICAgICAgIE1PViAgICAgICAgIENvdW50LCAjMgorCitMb29wU3RhcnQgICAgCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjLTQgIAorCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisgICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjNCAgCisgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQKK0VuZDIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYzAsIHBCdWYsICMzMi04CisgICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAwLCAjNAorCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTFmZjZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjk2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisKKyAgICBJRiBBUk0xMTM2SlMgCisKKworICAgICAgICBNX0FMTE9DOCBwcERzdEFyZ3MsIDgKKyAgICAgICAgTV9BTExPQzggcFRlbXBSZXN1bHQxLCA4CisgICAgICAgIE1fQUxMT0M4IHBUZW1wUmVzdWx0MiwgOAorICAgICAgICBNX0FMTE9DNCBwcFNyYywgNAorICAgICAgICBNX0FMTE9DNCBwcERzdCwgNAorICAgICAgICBNX0FMTE9DNCBwRHN0U3RlcCwgNAorICAgICAgICBNX0FMTE9DNCBwU3JjU3RlcCwgNAorICAgICAgICBNX0FMTE9DNCBwQ291bnRlciwgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgOy8vIEZ1bmN0aW9uOiAKKyAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbXBsZW1lbnRzIGRpYWdvbmFsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAorICAgICAgICA7Ly8gYmUgYWxpZ25lZC4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLCByOCB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgc3RlcCBzaXplLCByOCBpbnRlcm1lZGlhdGUtYnVmIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycworICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlLCByNgorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK0FjYzAgICAgICAgICAgICBSTiA0CitBY2MxICAgICAgICAgICAgUk4gNQorQWNjMiAgICAgICAgICAgIFJOIDYKK0FjYzMgICAgICAgICAgICBSTiA3CisKK1ZhbEEgICAgICAgICAgICBSTiA0CitWYWxCICAgICAgICAgICAgUk4gNQorVmFsQyAgICAgICAgICAgIFJOIDYKK1ZhbEQgICAgICAgICAgICBSTiA3CitWYWxFICAgICAgICAgICAgUk4gOAorVmFsRiAgICAgICAgICAgIFJOIDkKK1ZhbEcgICAgICAgICAgICBSTiAxMgorVmFsSCAgICAgICAgICAgIFJOIDE0CitWYWxJICAgICAgICAgICAgUk4gMQorCitUZW1wMSAgICAgICAgICAgUk4gMworVGVtcDIgICAgICAgICAgIFJOIDEKK1RlbXAzICAgICAgICAgICBSTiAxMgorVGVtcDQgICAgICAgICAgIFJOIDcKK1RlbXA1ICAgICAgICAgICBSTiA1CityMHgwZmUwMGZlMCAgICAgUk4gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KK3IweDAwZmYwMGZmICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gd2hlcmUgMjU1IGlzIG9mZnNldAorQ291bnRlciAgICAgICAgIFJOIDExCitwSW50ZXJCdWYgICAgICAgUk4gOAorCitWYWxDQSAgICAgICAgICAgUk4gOAorVmFsREIgICAgICAgICAgIFJOIDkKK1ZhbEdFICAgICAgICAgICBSTiAxMAorVmFsSEYgICAgICAgICAgIFJOIDExCityMHgwMDE0MDAwMSAgICAgUk4gMTIKK3IweDAwMTRmZmZiICAgICBSTiAxNAorCityMHgwMDAxZmMwMCAgICAgUk4gMTEKKworQWNjeCAgICAgICAgICAgIFJOIDgKK0FjY3kgICAgICAgICAgICBSTiA5CitUZW1wNiAgICAgICAgICAgUk4gMTQKKworICAgICAgICBNX1NUUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKKworICAgICAgICBNT1YgICAgICAgICBwRHN0LCBwSW50ZXJCdWYgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGRzdFN0ZXAsICMxNgorCisgICAgICAgIDsvLyBTZXQgdXAgY291bnRlciBvZiBmb3JtYXQsIFswXSAgWzBdICBbMSAoaGVpZ2h0KV0gIFs4ICh3aWR0aCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0CisgICAgICAgIE1fU1RSICAgICAgIGRzdFN0ZXAsIHBEc3RTdGVwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgc3JjU3RlcCwgcFNyY1N0ZXAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCisKK0hlaWdodExvb3AKK05leHRUd29Sb3dzTG9vcAorICAgICAgICBMRFIgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbZDEgYzEgYjEgYTFdCisgICAgICAgIExEUiAgICAgVmFsQSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtkMCBjMCBiMCBhMF0KKyAgICAgICAgTERSICAgICBWYWxILCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtoMSBnMSBmMSBlMV0gICAgICAgIAorICAgICAgICBMRFIgICAgIFZhbEUsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gwIGcwIGYwIGUwXQorICAgICAgICBMRFJCICAgIFRlbXAyLCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbbDEgazEgajEgaTFdCisgICAgICAgIExEUkIgICAgVGVtcDEsIFtwU3JjXSwgIy04ICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtsMCBrMCBqMCBpMF0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgVmFsQiwgVmFsQSwgVmFsRCwgTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbYjEgYTEgYjAgYTBdCisgICAgICAgIFBLSFRCICAgVmFsRCwgVmFsRCwgVmFsQSwgQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbZDEgYzEgZDAgYzBdCisgICAgICAgIFVYVEFCMTYgVmFsQSwgcjB4MDBmZjAwZmYsIFZhbEIgICAgICAgICAgICAgICAgIDsvLyBbMDAgYTEgMDAgYTBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2IFZhbEMsIHIweDAwZmYwMGZmLCBWYWxEICAgICAgICAgICAgICAgICA7Ly8gWzAwIGMxIDAwIGMwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgUEtIQlQgICBWYWxJLCBUZW1wMSwgVGVtcDIsIExTTCAjMTYgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICBWYWxGLCBWYWxFLCBWYWxILCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtmMSBlMSBmMCBlMF0KKyAgICAgICAgUEtIVEIgICBWYWxILCBWYWxILCBWYWxFLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtoMSBnMSBoMCBnMF0KKyAgICAgICAgVVhUQUIxNiBWYWxFLCByMHgwMGZmMDBmZiwgVmFsRiAgICAgICAgICAgICAgICAgOy8vIFswMCBlMSAwMCBlMF0gKyBbMCAyNTUgMCAyNTVdCisKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MwCisgICAgICAgIDsvLyBBY2MwID0gYSAtIDUqYiArIDIwKmMgKyAyMCpkIC0gNSplICsgZgorICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxDLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsRSwgVmFsQiwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2IEFjYzAsIFZhbEEsIFZhbEYsIFJPUiAjOAorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMCwgQWNjMCwgVGVtcDEgICAgICAgCisKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MxCisgICAgICAgIDsvLyBBY2MxID0gYiAtIDUqYyArIDIwKmQgKyAyMCplIC0gNSpmICsgZworICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxFLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsQywgVmFsRiwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgVmFsRywgcjB4MDBmZjAwZmYsIFZhbEggICAgICAgICAgICAgICAgIDsvLyBbMDAgZzEgMDAgZzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMSwgVmFsRywgVmFsQiwgUk9SICM4CisgICAgICAgIEFERCAgICAgQWNjMSwgQWNjMSwgVGVtcDEgICAgICAgIAorCisgICAgICAgIFVYVEFCMTYgQWNjMiwgVmFsQywgVmFsSCwgUk9SICM4ICAgICAgICAKKyAgICAgICAgQUREICAgICBWYWxJLCByMHgwMGZmMDBmZiwgVmFsSSAgICAgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMgorICAgICAgICA7Ly8gQWNjMiA9IGMgLSA1KmQgKyAyMCplICsgMjAqZiAtIDUqZyArIGgKKyAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRywgVmFsRCwgUk9SICM4CisgICAgICAgIFVYVEFCMTYgQWNjMywgVmFsSSwgVmFsRCwgUk9SICM4CisgICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEUsIFZhbEYsIFJPUiAjOAorICAgICAgICAKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDEsIFRlbXAyLCBMU0wgIzIgICAgICAgIAorICAgICAgICBVWFRBQjE2IFRlbXAyLCBWYWxHLCBWYWxGLCBST1IgIzgKKyAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAorICAgICAgICBBREQgICAgIEFjYzIsIEFjYzIsIFRlbXAxICAgICAgICAKKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzMKKyAgICAgICAgOy8vIEFjYzMgPSBkIC0gNSplICsgMjAqZiArIDIwKmcgLSA1KmggKyBpCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEgsIFJPUiAjOAorICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDIsIExTTCAjMgorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMywgQWNjMywgVGVtcDEKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgZHN0U3RlcCwgcERzdFN0ZXAgICAgICAgIAorICAgICAgICBNX0xEUiAgIHNyY1N0ZXAsIHBTcmNTdGVwCisKKyAgICAgICAgOy8vIElmIENvdW50ZXIgaXMgZXZlbiBzdG9yZSBBY2MwLUFjYzMgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyCisgICAgICAgIDsvLyBJZiBDb3VudGVyIGlzIG9mZiBzdG9yZSBBY2MwLUFjYzMgYW5kIHByZXZpb3VzIEFjYzAtQWNjMyBpbiBhIGludGVybWVkaWF0ZSBidWYgCisgICAgICAgIEFORFMgICAgICAgIFRlbXAzLCBDb3VudGVyLCAjMQorICAgICAgICBCRVEgICAgICAgICBOb1Byb2Nlc3NpbmcgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFBhY2tpbmcgcHJldmlvdXMgYW5kIGN1cnJlbnQgQWNjMC1BY2MzIHZhbHVlcworICAgICAgICBNX0xEUkQgICAgICBBY2N4LCBBY2N5LCBwVGVtcFJlc3VsdDEKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3gsIEFjYzAsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYTIgMCBhMF0gPSBbMCBhMyAwIGEyXSBbMCBhMSAwIGEwXQorICAgICAgICBQS0hUQiAgICAgICBBY2MwLCBBY2MwLCBBY2N4LCBBU1IgIzE2ICAgICAgICAgICA7Ly9bMCBhMyAwIGExXSA9IFswIGExIDAgYTBdIFswIGEzIDAgYTJdIAorICAgICAgICBTVFIgICAgICAgICBBY2MwLCBbcERzdCwgZHN0U3RlcF0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDYsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N5LCBBY2MxLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGIyIDAgYjBdID0gWzAgYjMgMCBiMl0gWzAgYjEgMCBiMF0KKyAgICAgICAgUEtIVEIgICAgICAgQWNjMSwgQWNjMSwgQWNjeSwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGIzIDAgYjFdID0gWzAgYjEgMCBiMF0gWzAgYjMgMCBiMl0KKyAgICAgICAgTV9MRFJEICAgICAgQWNjeCwgQWNjeSwgcFRlbXBSZXN1bHQyCisgICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N4LCBBY2MyLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGMyIDAgYzBdID0gWzAgYzMgMCBjMl0gWzAgYzEgMCBjMF0KKyAgICAgICAgUEtIVEIgICAgICAgQWNjMiwgQWNjMiwgQWNjeCwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGMzIDAgYzFdID0gWzAgYzEgMCBjMF0gWzAgYzMgMCBjMl0KKyAgICAgICAgU1RSICAgICAgICAgQWNjMiwgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgICAgICBUZW1wNiwgQWNjeSwgQWNjMywgTFNMICMxNiAgICAgICAgICA7Ly9bMCBkMiAwIGQwXSA9IFswIGQzIDAgZDJdIFswIGQxIDAgZDBdCisgICAgICAgIFBLSFRCICAgICAgIEFjYzMsIEFjYzMsIEFjY3ksIEFTUiAjMTYgICAgICAgICAgICA7Ly9bMCBkMyAwIGQxXSA9IFswIGQxIDAgZDBdIFswIGQzIDAgZDJdCisgICAgICAgIFNUUiAgICAgICAgIEFjYzMsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjLTEyCisgICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQWZ0ZXJTdG9yZQorCitOb1Byb2Nlc3NpbmcKKyAgICAgICAgTV9TVFJEICAgICAgQWNjMCwgQWNjMSwgcFRlbXBSZXN1bHQxCisgICAgICAgIE1fU1RSRCAgICAgIEFjYzIsIEFjYzMsIHBUZW1wUmVzdWx0MgorQWZ0ZXJTdG9yZQorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMSAgICAgICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIGhlaWdodCBpcyAxMAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQlBMICAgICAgICAgSGVpZ2h0TG9vcAorCisgICAgICAgIFNUUiAgICAgICAgIEFjYzAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgIDsvL1swIGExIDAgYTBdCisgICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0XSwgIzQKKyAgICAgICAgU1RSICAgICAgICAgQWNjMiwgW3BEc3RdLCAjNAorICAgICAgICBTVFIgICAgICAgICBBY2MzLCBbcERzdF0sICMtMTIKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICAgIDsvLworICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcCwgIzE2CisgICAgICAgIE1fTERSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncworCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0CisgICAgICAgIExEUiAgICAgICAgIHIweDAwMTRmZmZiLCA9MHgwMDE0ZmZmYgorICAgICAgICBMRFIgICAgICAgICByMHgwMDE0MDAwMSwgPTB4MDAxNDAwMDEKKworSGVpZ2h0TG9vcDEKKyAgICAgICAgTV9TVFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKKworICAgICAgICBNX0xEUiAgICAgICBWYWxDQSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGMgMCBhXQorICAgICAgICBNX0xEUiAgICAgICBWYWxEQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGQgMCBiXQorICAgICAgICBNX0xEUiAgICAgICBWYWxHRSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGcgMCBlXQorICAgICAgICBNX0xEUiAgICAgICBWYWxIRiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGggMCBmXQorCisKKyAgICAgICAgOy8vIEFjYzAgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGMgMCBhXSArIFswIGQgMCBmXSkpIC0gKDUgKiAoYiArIGUpKSAKKyAgICAgICAgOy8vIEFjYzEgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGUgMCBnXSArIFswIGQgMCBiXSkpIC0gKDUgKiAoYyArIGYpKSAKKyAgICAgICAgOy8vIEFjYzIgPSBzbXVhZCAoWzAgMSAwIDIwXSwgYWRkKFswIGMgMCBlXSArIFswIGggMCBmXSkpIC0gKDUgKiAoZCArIGcpKSAKKyAgICAgICAgOy8vIEFjYzMgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGQgMCBmXSArIFswIGkgMCBnXSkpIC0gKDUgKiAoZSArIGgpKSAKKworICAgICAgICBTTVVBRCAgICAgICBBY2MwLCBWYWxDQSwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMCAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNVUFEICAgICAgIEFjYzEsIFZhbERCLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MxICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01VQURYICAgICAgQWNjMiwgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzIgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKyAgICAgICAgU01VQUQgICAgICAgQWNjMywgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzMgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBRCAgICAgICBBY2MwLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBkIDAgYl0gKiBbMCAyMCAwIC01XQorICAgICAgICBTTUxBRFggICAgICBBY2MxLCBWYWxHRSwgcjB4MDAxNDAwMDEsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBnIDAgZV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNTEFEWCAgICAgIEFjYzIsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGggMCBmXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01MQURYICAgICAgQWNjMywgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxHRSwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBnIDAgZV0gKiBbMCAwIDAgLTVdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzEsIFZhbENBLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzMsIFZhbERCLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQorCisgICAgICAgIExEUkggICAgICAgIFZhbENBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyA4ID0gc3JjU3RlcCAtIDE2CisgICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGggMCBmXSAqIFswIDAgMCAxXSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzEsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGggMCBmXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzMsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGQgMCBiXSAqIFswIDAgMCAxXQorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDAwMWZjMDAsID0weDAwMDFmYzAwICAgICAgICAgICAgOy8vICgweGZmICogMTYgKiAzMikgLSA1MTIKKyAgICAgICAgU1VCICAgICAgICAgQWNjMCwgQWNjMCwgcjB4MDAwMWZjMDAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBBY2MxLCBBY2MxLCByMHgwMDAxZmMwMCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIEFjYzIsIEFjYzIsIHIweDAwMDFmYzAwICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgQWNjMywgQWNjMywgcjB4MDAwMWZjMDAgICAgICAgIAorCisgICAgICAgIFVTQVQgICAgICAgIEFjYzAsICMxOCwgQWNjMAorICAgICAgICBVU0FUICAgICAgICBBY2MxLCAjMTgsIEFjYzEKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMiwgIzE4LCBBY2MyCisgICAgICAgIFVTQVQgICAgICAgIEFjYzMsICMxOCwgQWNjMworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMCwgQWNjMCwgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMSwgQWNjMSwgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MxLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMiwgQWNjMiwgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMywgQWNjMywgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MzLCBbcERzdF0sIGRzdFN0ZXAKKworCisgICAgICAgIE1fTERSICAgICAgIENvdW50ZXIsIHBDb3VudGVyCisgICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzEKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEKKyAgICAgICAgQkdUICAgICAgICAgSGVpZ2h0TG9vcDEKK0VuZAorICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCAjNAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0OGUxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDI3NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgCisgICAgCisgICAgCisKKyAgICBJRiBBUk0xMTM2SlMgCisgICAgICAgIAorICAgICAgICBNX0FMTE9DOCBwcERzdEFyZ3MsIDgKKyAgICAgICAgTV9BTExPQzQgcHBTcmMsIDQKKyAgICAgICAgTV9BTExPQzQgcHBEc3QsIDQKKyAgICAgICAgTV9BTExPQzQgcENvdW50ZXIsIDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIDsvLyBGdW5jdGlvbjoKKyAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbXBsZW1lbnRzIGRpYWdvbmFsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAorICAgICAgICA7Ly8gYmUgYWxpZ25lZC4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLCByOCB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgc3RlcCBzaXplLCByOCBpbnRlcm1lZGlhdGUtYnVmIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycworICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlLCByNgorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCitWYWxBICAgICAgICAgICAgUk4gNQorVmFsQTAgICAgICAgICAgIFJOIDQKK1ZhbEExICAgICAgICAgICBSTiA1CitWYWxBRjAgICAgICAgICAgUk4gNAorVmFsQUYxICAgICAgICAgIFJOIDUKKworVmFsQiAgICAgICAgICAgIFJOIDExCisKK1ZhbEMgICAgICAgICAgICBSTiA1CitWYWxDMCAgICAgICAgICAgUk4gNAorVmFsQzEgICAgICAgICAgIFJOIDUKK1ZhbENEMCAgICAgICAgICBSTiAxMgorVmFsQ0QxICAgICAgICAgIFJOIDE0CitWYWxDRjAgICAgICAgICAgUk4gNAorVmFsQ0YxICAgICAgICAgIFJOIDUKKworVmFsRCAgICAgICAgICAgIFJOIDEwCisKK1ZhbEUgICAgICAgICAgICBSTiA3CitWYWxFMCAgICAgICAgICAgUk4gNgorVmFsRTEgICAgICAgICAgIFJOIDcKK1ZhbEVCMCAgICAgICAgICBSTiAxMAorVmFsRUIxICAgICAgICAgIFJOIDExCitWYWxFRDAgICAgICAgICAgUk4gNgorVmFsRUQxICAgICAgICAgIFJOIDcKKworVmFsRiAgICAgICAgICAgIFJOIDEwCisKK1ZhbEcgICAgICAgICAgICBSTiAxNAorVmFsRzAgICAgICAgICAgIFJOIDEyCitWYWxHMSAgICAgICAgICAgUk4gMTQKK1ZhbEdCMCAgICAgICAgICBSTiAxMgorVmFsR0IxICAgICAgICAgIFJOIDE0CisKK0FjYzAgICAgICAgICAgICBSTiA0CitBY2MxICAgICAgICAgICAgUk4gNQorQWNjMiAgICAgICAgICAgIFJOIDYKK0FjYzMgICAgICAgICAgICBSTiA3CisKK1RlbXAgICAgICAgICAgICBSTiA3CitTdGVwICAgICAgICAgICAgUk4gNgorCitwSW50ZXJCdWYgICAgICAgUk4gOAorQ291bnRlciAgICAgICAgIFJOIDgKK3IweDAwZmYwMGZmICAgICBSTiA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKK3IweDAwMDFmYzAwICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KKworICAgIAorOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK1ZhbENBICAgICAgICAgICBSTiA4CitWYWxEQiAgICAgICAgICAgUk4gOQorVmFsR0UgICAgICAgICAgIFJOIDEwCitWYWxIRiAgICAgICAgICAgUk4gMTEKK3IweDAwMTQwMDAxICAgICBSTiAxMgorcjB4MDAxNGZmZmIgICAgIFJOIDE0CisKK3IweDAwMDAwMjAwICAgICBSTiAxMgorcjB4MDAwMDAwZmYgICAgIFJOIDEyCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKKyAgICAgICAgTU9WICAgICAgICAgcERzdCwgcEludGVyQnVmICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBkc3RTdGVwLCAjMjQKKworICAgICAgICA7Ly8gU2V0IHVwIGNvdW50ZXIgb2YgZm9ybWF0LCBbMF0gIFswXSAgWzEgKGhlaWdodCldICBbOCAod2lkdGgpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCAjMQorICAgICAgICBNT1YgICAgICAgICBUZW1wLCAjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIENvdW50ZXIsIFRlbXAsIENvdW50ZXIsIExTTCAjOCAgICAgICAgOy8vIFswIDAgSCBXXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKK1dpZHRoTG9vcAorICAgICAgICBNX1NUUiAgICAgICBwU3JjLCBwcFNyYworICAgICAgICBNX1NUUiAgICAgICBwRHN0LCBwcERzdAorSGVpZ2h0TG9vcAorVHdvUm93c0xvb3AKKyAgICAgICAgTV9MRFIgICAgICAgVmFsQywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYzMgYzIgYzEgYzBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEQsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBNX0xEUiAgICAgICBWYWxFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtlMyBlMiBlMSBlMF0gICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMwLCByMHgwMGZmMDBmZiwgVmFsQyAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMxLCByMHgwMGZmMDBmZiwgVmFsQywgUk9SICM4ICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVmFsQiwgW3BTcmNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRTAsIHIweDAwZmYwMGZmLCBWYWxFICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRTEsIHIweDAwZmYwMGZmLCBWYWxFLCBST1IgIzggICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDAsIFZhbEMwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENEMSwgVmFsQzEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjAsIFZhbEUwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCisgICAgICAgIFJTQiAgICAgICAgIFZhbENEMCwgVmFsRUIwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSkKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzFdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjEsIFZhbEUxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCICAgICAgICAgVmFsQ0QxLCBWYWxFQjEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQwLCBWYWxFMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDEsIFZhbEUxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxGLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtmMyBmMiBmMSBmMF0KKyAgICAgICAgTV9MRFIgICAgICAgVmFsQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBWYWxDRDAsIFZhbENEMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSldCisgICAgICAgIEFERCAgICAgICAgIFZhbENEMSwgVmFsQ0QxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENGMSwgVmFsQzEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjAsIFZhbEMwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdICAgICAgICAKKyAgICAgICAgUlNCICAgICAgICAgVmFsRUQxLCBWYWxDRjEsIFZhbEVEMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIFZhbEEsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBMRFIgICAgICAgICBWYWxBLCBbVmFsQV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFthMyBhMiBhMSBhMF0KKyAgICAgICAgUlNCICAgICAgICAgVmFsRUQwLCBWYWxDRjAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA0KihPZmYrRStEKSAtIChPZmYrQytGKSAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFZhbEVEMSwgVmFsRUQxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsRUQwLCBWYWxFRDAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitFK0QpIC0gKE9mZitDK0YpXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBMCwgcjB4MDBmZjAwZmYsIFZhbEEgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBMSwgcjB4MDBmZjAwZmYsIFZhbEEsIFJPUiAjOCAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjAsIFZhbEEwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMSwgVmFsQTEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIEFjYzEsIFZhbENEMSwgVmFsQUYxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEcsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2czIGcyIGcxIGcwXQorICAgICAgICBBREQgICAgICAgICBBY2MwLCBWYWxDRDAsIFZhbEFGMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzAgPSAxNipPZmYgKyAoQStGKSArIDIwKihDK0QpIC0gNSooQitFKSAgICAgICAgCisgICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0LCAjNF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKKyAgICAgICAgTV9TVFIgICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlcgorICAgICAgICBVWFRBQjE2ICAgICBWYWxHMCwgcjB4MDBmZjAwZmYsIFZhbEcgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxHMSwgcjB4MDBmZjAwZmYsIFZhbEcsIFJPUiAjOCAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjAsIFZhbEcwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMSwgVmFsRzEsIFZhbEIsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjMgMCBiMV0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgQWNjMiwgVmFsRUQwLCBWYWxHQjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MyID0gMTYqT2ZmICsgKEIrRykgKyAyMCooRCtFKSAtIDUqKEMrRikKKyAgICAgICAgQUREICAgICAgICAgQWNjMywgVmFsRUQxLCBWYWxHQjEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1RSICAgICAgICAgQWNjMywgW3BEc3QsICM0XSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxIDw8IDggICAgICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIGhlaWdodCBpcyAxMAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQlBMICAgICAgICAgSGVpZ2h0TG9vcAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcFNyYywgcHBTcmMKKyAgICAgICAgTV9MRFIgICAgICAgcERzdCwgcHBEc3QKKyAgICAgICAgQUREUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIygxIDw8IDgpLTQgICAgICAgICAgIDsvLyBMb29wIHRpbGwgd2lkdGggaXMgMTIKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzQKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzgKKyAgICAgICAgQUREICAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzE8PDgKKyAgICAgICAgQlBMICAgICAgICAgV2lkdGhMb29wCisgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICAgIDsvLworICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwRHN0LCAjMjQKKyAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcCwgIzI0CisgICAgICAgIE1fTERSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncworCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0CisgICAgICAgIExEUiAgICAgICAgIHIweDAwMTRmZmZiLCA9MHgwMDE0ZmZmYgorICAgICAgICBMRFIgICAgICAgICByMHgwMDE0MDAwMSwgPTB4MDAxNDAwMDEKKworSGVpZ2h0TG9vcDEKKyAgICAgICAgTV9TVFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKKworCisgICAgICAgIExEUiAgICAgICAgIFZhbENBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBjIDAgYV0KKyAgICAgICAgTERSICAgICAgICAgVmFsREIsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGQgMCBiXQorICAgICAgICBMRFIgICAgICAgICBWYWxHRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZyAwIGVdCisgICAgICAgIExEUiAgICAgICAgIFZhbEhGLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBoIDAgZl0KKworICAgICAgICA7Ly8gQWNjMCA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgYyAwIGFdICsgWzAgZCAwIGZdKSkgLSAoNSAqIChiICsgZSkpIAorICAgICAgICA7Ly8gQWNjMSA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZSAwIGddICsgWzAgZCAwIGJdKSkgLSAoNSAqIChjICsgZikpIAorICAgICAgICA7Ly8gQWNjMiA9IHNtdWFkIChbMCAxIDAgMjBdLCBhZGQoWzAgYyAwIGVdICsgWzAgaCAwIGZdKSkgLSAoNSAqIChkICsgZykpIAorICAgICAgICA7Ly8gQWNjMyA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZCAwIGZdICsgWzAgaSAwIGddKSkgLSAoNSAqIChlICsgaCkpIAorICAgICAgICBTTVVBRCAgICAgICBBY2MwLCBWYWxDQSwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMCAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNVUFEICAgICAgIEFjYzEsIFZhbERCLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MxICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01VQURYICAgICAgQWNjMiwgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzIgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKyAgICAgICAgU01VQUQgICAgICAgQWNjMywgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzMgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBRCAgICAgICBBY2MwLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBkIDAgYl0gKiBbMCAyMCAwIC01XQorICAgICAgICBTTUxBRFggICAgICBBY2MxLCBWYWxHRSwgcjB4MDAxNDAwMDEsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBnIDAgZV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNTEFEWCAgICAgIEFjYzIsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGggMCBmXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01MQURYICAgICAgQWNjMywgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxHRSwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBnIDAgZV0gKiBbMCAwIDAgLTVdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzEsIFZhbENBLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzMsIFZhbERCLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQorCisgICAgICAgIExEUkggICAgICAgIFZhbENBLCBbcFNyY10sICM4ICAgICAgICAgICAgICAgICAgIDsvLyA4ID0gc3JjU3RlcCAtIDE2CisgICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGggMCBmXSAqIFswIDAgMCAxXSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzEsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGggMCBmXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzMsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGQgMCBiXSAqIFswIDAgMCAxXQorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDAwMWZjMDAsID0weDAwMDFmYzAwICAgICAgICAgICAgOy8vICgweGZmICogMTYgKiAzMikgLSA1MTIKKyAgICAgICAgU1VCICAgICAgICAgQWNjMCwgQWNjMCwgcjB4MDAwMWZjMDAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBBY2MxLCBBY2MxLCByMHgwMDAxZmMwMCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIEFjYzIsIEFjYzIsIHIweDAwMDFmYzAwICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgQWNjMywgQWNjMywgcjB4MDAwMWZjMDAgICAgICAgIAorCisgICAgICAgIFVTQVQgICAgICAgIEFjYzAsICMxOCwgQWNjMAorICAgICAgICBVU0FUICAgICAgICBBY2MxLCAjMTgsIEFjYzEKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMiwgIzE4LCBBY2MyCisgICAgICAgIFVTQVQgICAgICAgIEFjYzMsICMxOCwgQWNjMworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMCwgQWNjMCwgTFNSICMxMAorICAgICAgICBNT1YgICAgICAgICBBY2MxLCBBY2MxLCBMU1IgIzEwCisgICAgICAgIE1PViAgICAgICAgIEFjYzIsIEFjYzIsIExTUiAjMTAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMywgQWNjMywgTFNSICMxMAorCisgICAgICAgIE1fTERSICAgICAgIENvdW50ZXIsIHBDb3VudGVyICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgQWNjMCwgQWNjMCwgQWNjMSwgTFNMICM4CisgICAgICAgIE9SUiAgICAgICAgIEFjYzIsIEFjYzIsIEFjYzMsIExTTCAjOAorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMQorICAgICAgICBPUlIgICAgICAgICBBY2MwLCBBY2MwLCBBY2MyLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBCR1QgICAgICAgICBIZWlnaHRMb29wMQorRW5kCisgICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTBjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDIzOSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworCisgICAgSUYgQVJNMTEzNkpTCisKKzsvLyBGdW5jdGlvbjogCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCis7Ly8gYmUgYWxpZ25lZC4gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBjb3JyZXNwb25kaW5nIHN0ZXAgc2l6ZQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCisKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworQWNjMCAgICAgICAgICAgIFJOIDQKK0FjYzEgICAgICAgICAgICBSTiA1CitBY2MyICAgICAgICAgICAgUk4gNgorQWNjMyAgICAgICAgICAgIFJOIDcKKworVmFsQSAgICAgICAgICAgIFJOIDQKK1ZhbEIgICAgICAgICAgICBSTiA1CitWYWxDICAgICAgICAgICAgUk4gNgorVmFsRCAgICAgICAgICAgIFJOIDcKK1ZhbEUgICAgICAgICAgICBSTiA4CitWYWxGICAgICAgICAgICAgUk4gOQorVmFsRyAgICAgICAgICAgIFJOIDEyCitWYWxIICAgICAgICAgICAgUk4gMTQKK1ZhbEkgICAgICAgICAgICBSTiAxCisKK1RlbXAxICAgICAgICAgICBSTiAzCitUZW1wMiAgICAgICAgICAgUk4gMQorVGVtcDMgICAgICAgICAgIFJOIDEyCitUZW1wNCAgICAgICAgICAgUk4gNworVGVtcDUgICAgICAgICAgIFJOIDUKK3IweDBmZTAwZmUwICAgICBSTiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQorcjB4MDBmZjAwZmYgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0CitDb3VudGVyICAgICAgICAgUk4gMTEKKworSGVpZ2h0ICAgICAgICAgIFJOIDMKKworICAgICAgICBNX0FMTE9DNCBwRHN0U3RlcCwgNAorICAgICAgICBNX0FMTE9DNCBwU3JjU3RlcCwgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSwgcjYKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgQ291bnRlciwgIzIKKyAgICAgICAgTV9TVFIgICBkc3RTdGVwLCBwRHN0U3RlcCAgICAgICAgCisgICAgICAgIE1fU1RSICAgc3JjU3RlcCwgcFNyY1N0ZXAgICAgICAgIAorICAgICAgICBMRFIgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKKworTmV4dFR3b1Jvd3NMb29wCisgICAgICAgIExEUiAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtkMSBjMSBiMSBhMV0KKyAgICAgICAgTERSICAgICBWYWxBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2QwIGMwIGIwIGEwXQorICAgICAgICBMRFIgICAgIFZhbEgsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gxIGcxIGYxIGUxXSAgICAgICAgCisgICAgICAgIExEUiAgICAgVmFsRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDAgZzAgZjAgZTBdCisgICAgICAgIExEUkIgICAgVGVtcDIsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtsMSBrMSBqMSBpMV0KKyAgICAgICAgTERSQiAgICBUZW1wMSwgW3BTcmNdLCAjLTggICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2wwIGswIGowIGkwXQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBWYWxCLCBWYWxBLCBWYWxELCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtiMSBhMSBiMCBhMF0KKyAgICAgICAgUEtIVEIgICBWYWxELCBWYWxELCBWYWxBLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtkMSBjMSBkMCBjMF0KKyAgICAgICAgVVhUQUIxNiBWYWxBLCByMHgwMGZmMDBmZiwgVmFsQiAgICAgICAgICAgICAgICAgOy8vIFswMCBhMSAwMCBhMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgVmFsQywgcjB4MDBmZjAwZmYsIFZhbEQgICAgICAgICAgICAgICAgIDsvLyBbMDAgYzEgMDAgYzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBQS0hCVCAgIFZhbEksIFRlbXAxLCBUZW1wMiwgTFNMICMxNiAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgIFZhbEYsIFZhbEUsIFZhbEgsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2YxIGUxIGYwIGUwXQorICAgICAgICBQS0hUQiAgIFZhbEgsIFZhbEgsIFZhbEUsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2gxIGcxIGgwIGcwXQorICAgICAgICBVWFRBQjE2IFZhbEUsIHIweDAwZmYwMGZmLCBWYWxGICAgICAgICAgICAgICAgICA7Ly8gWzAwIGUxIDAwIGUwXSArIFswIDI1NSAwIDI1NV0KKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzAKKyAgICAgICAgOy8vIEFjYzAgPSBhIC0gNSpiICsgMjAqYyArIDIwKmQgLSA1KmUgKyBmCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEMsIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxFLCBWYWxCLCBST1IgIzgKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMCwgVmFsQSwgVmFsRiwgUk9SICM4CisgICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgQUREICAgICBBY2MwLCBBY2MwLCBUZW1wMSAgICAgICAKKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzEKKyAgICAgICAgOy8vIEFjYzEgPSBiIC0gNSpjICsgMjAqZCArIDIwKmUgLSA1KmYgKyBnCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxDLCBWYWxGLCBST1IgIzgKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBWYWxHLCByMHgwMGZmMDBmZiwgVmFsSCAgICAgICAgICAgICAgICAgOy8vIFswMCBnMSAwMCBnMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBBY2MxLCBWYWxHLCBWYWxCLCBST1IgIzgKKyAgICAgICAgQUREICAgICBBY2MxLCBBY2MxLCBUZW1wMSAgICAgICAgCisKKyAgICAgICAgTERSICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAgICAgICAgICAgICAgICAgOy8vIDB4MGZlMDBmZTAgPSAoMTYgKiBPZmZzZXQpIC0gMTYgd2hlcmUgT2Zmc2V0IGlzIDI1NSAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMiwgVmFsQywgVmFsSCwgUk9SICM4ICAgICAgICAKKyAgICAgICAgQUREICAgICBWYWxJLCByMHgwMGZmMDBmZiwgVmFsSSAgICAgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgVVFTVUIxNiBBY2MwLCBBY2MwLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgQWNjMSwgQWNjMSwgcjB4MGZlMDBmZTAKKyAgICAgICAgVVNBVDE2ICBBY2MwLCAjMTMsIEFjYzAKKyAgICAgICAgVVNBVDE2ICBBY2MxLCAjMTMsIEFjYzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MyCisgICAgICAgIDsvLyBBY2MyID0gYyAtIDUqZCArIDIwKmUgKyAyMCpmIC0gNSpnICsgaAorICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxHLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBBY2MzLCBWYWxJLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRSwgVmFsRiwgUk9SICM4CisgICAgICAgIEFORCAgICAgQWNjMSwgcjB4MDBmZjAwZmYsIEFjYzEsIExTUiAjNQorICAgICAgICBBTkQgICAgIEFjYzAsIHIweDAwZmYwMGZmLCBBY2MwLCBMU1IgIzUKKyAgICAgICAgT1JSICAgICBBY2MwLCBBY2MwLCBBY2MxLCBMU0wgIzggICAgICAgIAorICAgICAgICBSU0IgICAgIFRlbXA1LCBUZW1wMSwgVGVtcDIsIExTTCAjMiAgICAgICAgCisgICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEcsIFZhbEYsIFJPUiAjOAorICAgICAgICBBREQgICAgIFRlbXA1LCBUZW1wNSwgVGVtcDUsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMiwgQWNjMiwgVGVtcDUgICAgICAgIAorCisgICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMworICAgICAgICA7Ly8gQWNjMyA9IGQgLSA1KmUgKyAyMCpmICsgMjAqZyAtIDUqaCArIGkKKyAgICAgICAgVVhUQUIxNiBUZW1wNSwgVmFsRSwgVmFsSCwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDUsIFRlbXA1LCBUZW1wMiwgTFNMICMyCisgICAgICAgIExEUiAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCisgICAgICAgIEFERCAgICAgVGVtcDUsIFRlbXA1LCBUZW1wNSwgTFNMICMyICAgICAgICAKKyAgICAgICAgQUREICAgICBBY2MzLCBBY2MzLCBUZW1wNQorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiBBY2MzLCBBY2MzLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgQWNjMiwgQWNjMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVU0FUMTYgIEFjYzMsICMxMywgQWNjMworICAgICAgICBVU0FUMTYgIEFjYzIsICMxMywgQWNjMiAgICAgICAgCisKKyAgICAgICAgTV9MRFIgICBkc3RTdGVwLCBwRHN0U3RlcAorICAgICAgICBBTkQgICAgIEFjYzMsIHIweDAwZmYwMGZmLCBBY2MzLCBMU1IgIzUKKyAgICAgICAgQU5EICAgICBBY2MyLCByMHgwMGZmMDBmZiwgQWNjMiwgTFNSICM1CisgICAgICAgIE9SUiAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4CisgICAgICAgIAorICAgICAgICBTVUJTICAgIENvdW50ZXIsIENvdW50ZXIsICMxCisgICAgICAgIE1fTERSICAgc3JjU3RlcCwgcFNyY1N0ZXAKKyAgICAgICAgUEtIQlQgICBBY2MxLCBBY2MwLCBBY2MyLCBMU0wgIzE2ICAgCisgICAgICAgIE1fU1RSICAgQWNjMSwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQxCisgICAgICAgIFBLSFRCICAgQWNjMiwgQWNjMiwgQWNjMCwgQVNSICMxNiAgIAorICAgICAgICBNX1NUUiAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0MgorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICAKKyAgICAgICAgQkdUICAgICBOZXh0VHdvUm93c0xvb3AKK0VuZAorICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworICAgIEVORAorICAgIAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwN2NkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE4NSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorCisKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorCisgICAgICAgIDsvLyBGdW5jdGlvbjogCisgICAgICAgIDsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEltcGxlbWVudHMgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCisgICAgICAgIDsvLyBiZSBhbGlnbmVkLiAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorICAgICAgICA7Ly8gcjAscjEscjIscjMgd2hlcmUgcjAscjIgIGlucHV0IHBvaW50ZXIgYW5kIHIxLHIzIGNvcnJlc3BvbmRpbmcgc3RlcCBzaXplCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCisgICAgICAgIDsvLyByMCxyMSxyMixyMyxyNCxyNSxyNixyMTQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIDsvLyByNyxyOCxyOSxyMTAscjExLHIxMgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCByZWdpc3RlcnMKKyAgICAgICAgOy8vIE5vbmUuIEZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgcjAtcjMKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSwgcjYKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworVmFsQSAgICAgICAgICAgIFJOIDUKK1ZhbEEwICAgICAgICAgICBSTiA0CitWYWxBMSAgICAgICAgICAgUk4gNQorVmFsQUYwICAgICAgICAgIFJOIDQKK1ZhbEFGMSAgICAgICAgICBSTiA1CisKK1ZhbEIgICAgICAgICAgICBSTiAxMQorCitWYWxDICAgICAgICAgICAgUk4gNQorVmFsQzAgICAgICAgICAgIFJOIDQKK1ZhbEMxICAgICAgICAgICBSTiA1CitWYWxDRDAgICAgICAgICAgUk4gMTIKK1ZhbENEMSAgICAgICAgICBSTiAxNAorVmFsQ0YwICAgICAgICAgIFJOIDQKK1ZhbENGMSAgICAgICAgICBSTiA1CisKK1ZhbEQgICAgICAgICAgICBSTiAxMAorCitWYWxFICAgICAgICAgICAgUk4gNworVmFsRTAgICAgICAgICAgIFJOIDYKK1ZhbEUxICAgICAgICAgICBSTiA3CitWYWxFQjAgICAgICAgICAgUk4gMTAKK1ZhbEVCMSAgICAgICAgICBSTiAxMQorVmFsRUQwICAgICAgICAgIFJOIDYKK1ZhbEVEMSAgICAgICAgICBSTiA3CisKK1ZhbEYgICAgICAgICAgICBSTiAxMAorCitWYWxHICAgICAgICAgICAgUk4gMTQKK1ZhbEcwICAgICAgICAgICBSTiAxMgorVmFsRzEgICAgICAgICAgIFJOIDE0CitWYWxHQjAgICAgICAgICAgUk4gMTIKK1ZhbEdCMSAgICAgICAgICBSTiAxNAorCitBY2MwICAgICAgICAgICAgUk4gNAorQWNjMSAgICAgICAgICAgIFJOIDUKK0FjYzIgICAgICAgICAgICBSTiA2CitBY2MzICAgICAgICAgICAgUk4gNworCitUZW1wICAgICAgICAgICAgUk4gNworSGVpZ2h0ICAgICAgICAgIFJOIDMKK1N0ZXAgICAgICAgICAgICBSTiA2CisKK0NvdW50ZXIgICAgICAgICBSTiA4CityMHgwMGZmMDBmZiAgICAgUk4gOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0CityMHgwZmUwMGZlMCAgICAgUk4gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgKDE2KjI1NSAtIDE2KSAwICgxNioyNTUgLSAxNildCisKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICMyCisgICAgICAgIAorVHdvUm93c0xvb3AKKyAgICAgICAgTV9MRFIgICAgICAgVmFsQywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYzMgYzIgYzEgYzBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEQsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBNX0xEUiAgICAgICBWYWxFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtlMyBlMiBlMSBlMF0gICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEIsIFtwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMwLCByMHgwMGZmMDBmZiwgVmFsQyAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMxLCByMHgwMGZmMDBmZiwgVmFsQywgUk9SICM4ICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEUwLCByMHgwMGZmMDBmZiwgVmFsRSAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEUxLCByMHgwMGZmMDBmZiwgVmFsRSwgUk9SICM4ICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0QwLCBWYWxDMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDEsIFZhbEMxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIwLCBWYWxFMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQorICAgICAgICBSU0IgICAgICAgICBWYWxDRDAsIFZhbEVCMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitDK0QpIC0gKE9mZitCK0UpCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxELCBbcFNyYywgc3JjU3RlcCwgTFNMICMxXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtkMyBkMiBkMSBkMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIxLCBWYWxFMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFJTQiAgICAgICAgIFZhbENEMSwgVmFsRUIxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDAsIFZhbEUwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMSwgVmFsRTEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVmFsRiwgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMl0gICAgICAgICAgIDsvLyBMb2FkICBbZjMgZjIgZjEgZjBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEIsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsQ0QwLCBWYWxDRDAsIFZhbENEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitDK0QpIC0gKE9mZitCK0UpXQorICAgICAgICBBREQgICAgICAgICBWYWxDRDEsIFZhbENEMSwgVmFsQ0QxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjEsIFZhbEMxLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0YwLCBWYWxDMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXQorICAgICAgICBSU0IgICAgICAgICBWYWxFRDEsIFZhbENGMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgVmFsQSwgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIExEUiAgICAgICAgIFZhbEEsIFtWYWxBXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2EzIGEyIGExIGEwXQorICAgICAgICBSU0IgICAgICAgICBWYWxFRDAsIFZhbENGMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitFK0QpIC0gKE9mZitDK0YpICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsRUQxLCBWYWxFRDEsIFZhbEVEMSwgTFNMICMyICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBWYWxFRDAsIFZhbEVEMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRildCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEEwLCByMHgwMGZmMDBmZiwgVmFsQSAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEExLCByMHgwMGZmMDBmZiwgVmFsQSwgUk9SICM4ICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMCwgVmFsQTAsIFZhbEYgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjIgMCBmMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYxLCBWYWxBMSwgVmFsRiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMyAwIGYxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAorICAgICAgICBBREQgICAgICAgICBBY2MxLCBWYWxDRDEsIFZhbEFGMSAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxHLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtnMyBnMiBnMSBnMF0KKyAgICAgICAgQUREICAgICAgICAgQWNjMCwgVmFsQ0QwLCBWYWxBRjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MwID0gMTYqT2ZmICsgKEErRikgKyAyMCooQytEKSAtIDUqKEIrRSkgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBBY2MxLCBBY2MxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgOy8vIEFjYzEgLT0gKDE2Kk9mZiAtIDE2KQorICAgICAgICBVUVNVQjE2ICAgICBBY2MwLCBBY2MwLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEcwLCByMHgwMGZmMDBmZiwgVmFsRyAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEcxLCByMHgwMGZmMDBmZiwgVmFsRywgUk9SICM4ICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMCwgVmFsRzAsIFZhbEIgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjIgMCBiMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IxLCBWYWxHMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBBY2MyLCBWYWxFRDAsIFZhbEdCMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzIgPSAxNipPZmYgKyAoQitHKSArIDIwKihEK0UpIC0gNSooQytGKQorICAgICAgICBBREQgICAgICAgICBBY2MzLCBWYWxFRDEsIFZhbEdCMSAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIEFjYzMsIEFjYzMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICA7Ly8gQWNjMyAtPSAoMTYqT2ZmIC0gMTYpCisgICAgICAgIFVRU1VCMTYgICAgIEFjYzIsIEFjYzIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgQWNjMSwgIzEzLCBBY2MxICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXR1cmF0ZSB0byA4KzUgPSAxMyBiaXRzCisgICAgICAgIFVTQVQxNiAgICAgIEFjYzAsICMxMywgQWNjMAorICAgICAgICBVU0FUMTYgICAgICBBY2MzLCAjMTMsIEFjYzMgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBBY2MyLCAjMTMsIEFjYzIKKyAgICAgICAgQU5EICAgICAgICAgQWNjMSwgcjB4MDBmZjAwZmYsIEFjYzEsIExTUiAjNSAgICAgICAgIDsvLyBbMCBhMyAwIGExXQorICAgICAgICBBTkQgICAgICAgICBBY2MwLCByMHgwMGZmMDBmZiwgQWNjMCwgTFNSICM1ICAgICAgICAgOy8vIFswIGEyIDAgYTBdCisgICAgICAgIE9SUiAgICAgICAgIEFjYzAsIEFjYzAsIEFjYzEsIExTTCAjOCAgICAgICAgICAgICAgICA7Ly8gW2EzIGEyIGExIGEwXQorICAgICAgICBBTkQgICAgICAgICBBY2MzLCByMHgwMGZmMDBmZiwgQWNjMywgTFNSICM1ICAgICAgICAgOy8vIFswIGIzIDAgYjFdCisgICAgICAgIEFORCAgICAgICAgIEFjYzIsIHIweDAwZmYwMGZmLCBBY2MyLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYjIgMCBiMF0KKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKKyAgICAgICAgT1JSICAgICAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4ICAgICAgICAgICAgICAgIDsvLyBbYjMgYjIgYjEgYjBdICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgQWNjMiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxCisgICAgICAgIEJHVCAgICAgICAgIFR3b1Jvd3NMb29wCitFbmQKKyAgICAgICAgU1VCICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFkMTdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKQEAgLTAsMCArMSwyNzMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKyAgICBJRiBBUk0xMTM2SlMKKworOy8vIGlucHV0IHJlZ2lzdGVycworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitpU3JjU3RlcCAgICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitpRHN0U3RlcCAgICAgICAgICAgICBSTiAzCitpV2lkdGggICAgICAgICAgICAgICBSTiA0CitpSGVpZ2h0ICAgICAgICAgICAgICBSTiA1CitkeCAgICAgICAgICAgICAgICAgICBSTiA2CitkeSAgICAgICAgICAgICAgICAgICBSTiA3CisKKworOy8vIGxvY2FsIHZhcmlhYmxlIHJlZ2lzdGVycwordGVtcCAgICAgICAgICAgICAgICAgUk4gMTEKK3IweDIwICAgICAgICAgICAgICAgIFJOIDEyCit0bXAweDIwICAgICAgICAgICAgICBSTiAxNAorcmV0dXJuICAgICAgICAgICAgICAgUk4gMAorZHhQbHVzZHkgICAgICAgICAgICAgUk4gMTAKK0VpZ2h0TWludXNkeCAgICAgICAgIFJOIDggCitFaWdodE1pbnVzZHkgICAgICAgICBSTiA5CitkeEVpZ2h0TWludXNkeCAgICAgICBSTiA4CitCQUNvZWZmICAgICAgICAgICAgICBSTiA2CitEQ0NvZWZmICAgICAgICAgICAgICBSTiA3CisgICAgICAgICAgICAgICAgICAgICAKK2lEc3RTdGVweDJNaW51c1dpZHRoIFJOIDgKK2lTcmNTdGVweDJNaW51c1dpZHRoIFJOIDkKK2lTcmNTdGVwMSAgICAgICAgICAgIFJOIDEwCisKK3BTcmMxICAgICAgICAgICAgICAgIFJOIDEKK3BTcmMyICAgICAgICAgICAgICAgIFJOIDgKK3BEc3QxICAgICAgICAgICAgICAgIFJOIDgKK3BEc3QyICAgICAgICAgICAgICAgIFJOIDEyCisgICAgICAgICAgICAgICAgICAgICAKK3BpeDAwICAgICAgICAgICAgICAgIFJOIDgKK3BpeDAxICAgICAgICAgICAgICAgIFJOIDkKK3BpeDEwICAgICAgICAgICAgICAgIFJOIDEwCitwaXgxMSAgICAgICAgICAgICAgICBSTiAxMQorCitPdXQwMTAwICAgICAgICAgICAgICBSTiA4ICAKK091dDExMTAgICAgICAgICAgICAgIFJOIDEwIAorCit4MDAgICAgICAgICAgICAgICAgICBSTiA4Cit4MDEgICAgICAgICAgICAgICAgICBSTiAxMAoreDAyICAgICAgICAgICAgICAgICAgUk4gMTIKK3gxMCAgICAgICAgICAgICAgICAgIFJOIDkKK3gxMSAgICAgICAgICAgICAgICAgIFJOIDExCit4MTIgICAgICAgICAgICAgICAgICBSTiAxNAoreDIwICAgICAgICAgICAgICAgICAgUk4gMTAKK3gyMSAgICAgICAgICAgICAgICAgIFJOIDEyCit4MjIgICAgICAgICAgICAgICAgICBSTiAxNAorICAgICAgICAgICAgICAgICAgICAgCit4MDF4MDAgICAgICAgICAgICAgICBSTiA4ICAKK3gwMngwMSAgICAgICAgICAgICAgIFJOIDEwIAoreDExeDEwICAgICAgICAgICAgICAgUk4gOSAgCit4MTJ4MTEgICAgICAgICAgICAgICBSTiAxMSAKK3gyMXgyMCAgICAgICAgICAgICAgIFJOIDEwIAoreDIyeDIxICAgICAgICAgICAgICAgUk4gMTIgCisgICAgICAgICAgICAgICAgICAgICAKK091dFJvdzAwICAgICAgICAgICAgIFJOIDEyCitPdXRSb3cwMSAgICAgICAgICAgICBSTiAxNAorT3V0Um93MTAgICAgICAgICAgICAgUk4gMTAKK091dFJvdzExICAgICAgICAgICAgIFJOIDEyCisgICAgICAgICAgICAgICAgICAgICAKK091dFJvdzAxMDAgICAgICAgICAgIFJOIDEyCitPdXRSb3cxMTEwICAgICAgICAgICBSTiAxMgorICAgICAgICAgICAgICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBXaWR0aCwgICAgICA0CisgICAgICAgIE1fQVJHICAgSGVpZ2h0LCAgICAgNAorICAgICAgICBNX0FSRyAgIER4LCAgICAgICAgIDQKKyAgICAgICAgTV9BUkcgICBEeSwgICAgICAgICA0CisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBpV2lkdGgsICBXaWR0aCAgCisgICAgICAgIE1fTERSICAgaUhlaWdodCwgSGVpZ2h0ICAKKyAgICAgICAgTV9MRFIgICBkeCwgICAgICBEeCAKKyAgICAgICAgTV9MRFIgICBkeSwgICAgICBEeQorICAgICAgICAKKyAgICAgICAgOy8vIEVpZ2h0TWludXNkeCA9IDggLSBkeAorICAgICAgICA7Ly8gRWlnaHRNaW51c2R5ID0gOCAtIGR5CisgICAgICAgIAorICAgICAgICA7Ly8gQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5CisgICAgICAgIDsvLyBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeQorICAgICAgICA7Ly8gQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHkKKyAgICAgICAgOy8vIERDb2VmZiA9IGR4ICogZHkKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcFNyYzEsIHBTcmMsIGlTcmNTdGVwCisgICAgICAgIFNVQiAgICAgdGVtcCwgaVdpZHRoLCAjMQorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeCwgZHgsICM4IAorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeSwgZHksICM4CisgICAgICAgIENNTiAgICAgZHgsZHkKKyAgICAgICAgQUREICAgICBkeEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R4LCBkeCwgTFNMICMxNgorICAgICAgICBPUlIgICAgIGlXaWR0aCwgaVdpZHRoLCB0ZW1wLCBMU0wgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gUGFja2VkIENvZWZmcy4KKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgQkFDb2VmZiwgZHhFaWdodE1pbnVzZHgsIEVpZ2h0TWludXNkeQorICAgICAgICBNVUwgICAgIERDQ29lZmYsIGR4RWlnaHRNaW51c2R4LCBkeSAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNraW5nIGVpdGhlciBvZiBkeCBhbmQgZHkgYmVpbmcgbm9uLXplcm8KKyAgICAgICAgCisgICAgICAgIEJFUSAgICAgTVZJc1plcm8KKyAgICAgICAgCis7Ly8gUGl4ZWwgbGF5b3V0OgorOy8vCis7Ly8gICB4MDAgeDAxIHgwMgorOy8vICAgeDEwIHgxMSB4MTIKKzsvLyAgIHgyMCB4MjEgeDIyCisKKzsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgbm90ICgwLCAwKQorICAgICAgICAKK091dGVyTG9vcE1WSXNOb3RaZXJvCisKK0lubmVyTG9vcE1WSXNOb3RaZXJvCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgwMCwgW3BTcmMsICAjKzBdICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDEwLCBbcFNyYzEsICMrMF0gICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTERSQiAgICB4MDEsIFtwU3JjLCAgIysxXSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDExLCBbcFNyYzEsICMrMV0gICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgwMiwgW3BTcmMsICAjKzJdISAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgxMiwgW3BTcmMxLCAjKzJdISAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgwMXgwMCwgeDAwLCB4MDEsIExTTCAjMTYgICAgICAgIAorICAgICAgICAgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgICAgICAgICAgT1JSICAgICB4MDJ4MDEsIHgwMSwgeDAyLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgICAgICAgICBNT1YgICAgIHIweDIwLCAgIzMyCisgICAgICAgICAgICAgICAgT1JSICAgICB4MTF4MTAsIHgxMCwgeDExLCBMU0wgIzE2ICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgeDEyeDExLCB4MTEsIHgxMiwgTFNMICMxNiAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICB4MDF4MDAsIHgwMXgwMCwgQkFDb2VmZiwgcjB4MjAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIHgwMngwMSwgeDAyeDAxLCBCQUNvZWZmLCByMHgyMCAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA7Ly8gaVdpZHRoIHBhY2tlZCB3aXRoIE1TQiAodG9wIDE2IGJpdHMpIAorICAgICAgICAgICAgICAgIDsvLyBhcyBpbm5lciBsb29wIGNvdW50ZXIgdmFsdWUgaS5lIAorICAgICAgICAgICAgICAgIDsvLyAoaVdpZHRoIC0xKSBhbmQgTFNCIChsb3dlciAxNiBiaXRzKQorICAgICAgICAgICAgICAgIDsvLyBhcyBvcmlnaW5hbCB3aWR0aAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNNTEFEICAgT3V0Um93MDAsIHgxMXgxMCwgRENDb2VmZiwgeDAxeDAwICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cwMSwgeDEyeDExLCBEQ0NvZWZmLCB4MDJ4MDEgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBSU0IgICAgIHBTcmMyLCBwU3JjLCBwU3JjMSwgTFNMICMxCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cwMCwgT3V0Um93MDAsIExTUiAjNgorICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MDEsIE91dFJvdzAxLCBMU1IgIzYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgyMCxbcFNyYzIsICMtMl0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIE91dFJvdzAxMDAsIE91dFJvdzAwLCBPdXRSb3cwMSwgTFNMICM4CisgICAgICAgICAgICAgICAgU1RSSCAgICBPdXRSb3cwMTAwLCBbcERzdF0sICMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTERSQiAgICB4MjEsW3BTcmMyLCAjLTFdCisgICAgICAgICAgICAgICAgTERSQiAgICB4MjIsW3BTcmMyLCAjKzBdCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRHN0MSwgcERzdCwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgyMXgyMCwgeDIwLCB4MjEsIExTTCAjMTYKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgyMngyMSwgeDIxLCB4MjIsIExTTCAjMTYgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE1PViAgICAgdG1wMHgyMCwgIzMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgOy8vIFJldXNpbmcgdGhlIHBhY2tlZCBkYXRhIHgxMXgxMCBhbmQgeDEyeDExCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICB4MTF4MTAsICB4MTF4MTAsICBCQUNvZWZmLCB0bXAweDIwCisgICAgICAgICAgICAgICAgU01MQUQgICB4MTJ4MTEsICB4MTJ4MTEsICBCQUNvZWZmLCB0bXAweDIwCisgICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cxMCwgeDIxeDIwLCBEQ0NvZWZmLCB4MTF4MTAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzExLCB4MjJ4MjEsIERDQ29lZmYsIHgxMngxMQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MTAsIE91dFJvdzEwLCBMU1IgIzYKKyAgICAgICAgICAgICAgICBNT1YgICAgIE91dFJvdzExLCBPdXRSb3cxMSwgTFNSICM2CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0Um93MTExMCwgT3V0Um93MTAsIE91dFJvdzExLCBMU0wgIzgKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVFJIICAgIE91dFJvdzExMTAsIFtwRHN0MSwgIy0yXQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2CisgICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCisgICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCisgICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCisgICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQorICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCisgICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgorICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisKKzsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgKDAsIDApCisKK01WSXNaZXJvCisgICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKK091dGVyTG9vcE1WSXNaZXJvCisKK0lubmVyTG9vcE1WSXNaZXJvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDAsIFtwU3JjXSwgICMrMQorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDEsIFtwU3JjXSwgICMrMQorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTAsIFtwU3JjMV0sICMrMQorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTEsIFtwU3JjMV0sICMrMQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERzdDIsICBwRHN0LCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIE91dDAxMDAsIHBpeDAwLCBwaXgwMSwgTFNMICM4IAorICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0MTExMCwgcGl4MTAsIHBpeDExLCBMU0wgIzgKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVFJIICAgIE91dDAxMDAsIFtwRHN0XSwgICMyCisgICAgICAgICAgICAgICAgU1RSSCAgICBPdXQxMTEwLCBbcERzdDJdLCAjMgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc1plcm8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2CisgICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCisgICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCisgICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCisgICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQorICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCisgICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgorICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc1plcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FTkQKKworICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKyAgICAgICAgCisgICAgICAgIEVORAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTYyZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpAQCAtMCwwICsxLDc0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIERlc2NyaXB0aW9uOgorOy8vIFRoaXMgZmlsZSBjb250YWlucyBxdWFudGl6YXRpb24gdGFibGVzCis7Ly8gCis7Ly8gCisKKyAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgIAorICAgICAgICAgCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUgIAorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCisgICAgICAgICBEQ0IgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgorICAgICAgICAgRENCIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKKyAgICAgICAgIERDQiAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4CisgICAgICAgICBEQ0IgMTksIDE5LCAxOSwgMTksIDE5LCAxOQorICAgICAgICAgRENCIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKKyAgICAgICAgIERDQiAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCisgICAgICAgICBEQ0IgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgorICAgICAgICAgRENCIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKKyAgICAgICAgIERDQiAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIAorICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZSwgMgorICAgICAgICAgRENEIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKKyAgICAgICAgIERDRCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCisgICAgICAgICBEQ0QgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQorICAgICAgICAgRENEIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKKyAgICAgICAgIERDRCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1CisgICAgICAgICBEQ0QgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAorICAgICAgICAgRENEIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKKyAgICAgICAgIERDRCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCisgICAgICAgICBEQ0QgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBFTkQKKyAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MWQxODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCkBAIC0wLDAgKzEsNDA3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKzsvLyAKKzsvLyAKKworICAgICAgICAKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKUyAKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcERzdCAgICAgICAgICAgICAgICBSTiAgMAorcFNyYyAgICAgICAgICAgICAgICBSTiAgMQorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCisKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKKworOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKK2luMDAgICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgOy8vIFNyY1swXSAmIFNyY1sxXSAKK2luMDIgICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgOy8vIFNyY1syXSAmIFNyY1szXQoraW4xMCAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzRdICYgU3JjWzVdCitpbjEyICAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNl0gJiBTcmNbN10KK2luMjAgICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s4XSAmIFNyY1s5XQoraW4yMiAgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEwXSAmIFNyY1sxMV0KK2luMzAgICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMl0gJiBTcmNbMTNdCitpbjMyICAgICAgICAgICAgICAgIFJOICA5ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTRdICYgU3JjWzE1XQorCis7Ly8gVHJhbnNwb3NlIGZvciBSb3cgb3BlcmF0aW9ucyAoUm93cyB0byBjb2xzKQordHJSb3cwMCAgICAgICAgICAgICBSTiAgMgordHJSb3cxMCAgICAgICAgICAgICBSTiAgMTAKK3RyUm93MDIgICAgICAgICAgICAgUk4gIDMKK3RyUm93MTIgICAgICAgICAgICAgUk4gIDUKK3RyUm93MjAgICAgICAgICAgICAgUk4gIDExCit0clJvdzMwICAgICAgICAgICAgIFJOICAxMgordHJSb3czMiAgICAgICAgICAgICBSTiAgMTQKK3RyUm93MjIgICAgICAgICAgICAgUk4gIDcKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2UwICAgICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitlMSAgICAgICAgICAgICAgICAgIFJOICA2CitlMiAgICAgICAgICAgICAgICAgIFJOICA4CitlMyAgICAgICAgICAgICAgICAgIFJOICA5Citjb25zdFplcm8gICAgICAgICAgIFJOICAxCisKKzsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCityb3dPcDAwICAgICAgICAgICAgIFJOICAyCityb3dPcDEwICAgICAgICAgICAgIFJOICAxMAorcm93T3AyMCAgICAgICAgICAgICBSTiAgMTEKK3Jvd09wMzAgICAgICAgICAgICAgUk4gIDEyCityb3dPcDAyICAgICAgICAgICAgIFJOICAzCityb3dPcDEyICAgICAgICAgICAgIFJOICA1Cityb3dPcDIyICAgICAgICAgICAgIFJOICA3Cityb3dPcDMyICAgICAgICAgICAgIFJOICAxNAorCis7Ly8gVHJhbnNwb3NlIGZvciBjb2x1bG1uIG9wZXJhdGlvbnMKK3RyQ29sMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCit0ckNvbDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAordHJDb2wxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKK3RyQ29sMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCit0ckNvbDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAordHJDb2wyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKK3RyQ29sMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCit0ckNvbDMyICAgICAgICAgICAgIFJOICA5ICAKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2cwICAgICAgICAgICAgICAgICAgUk4gIDEwCitnMSAgICAgICAgICAgICAgICAgIFJOICAxMQorZzIgICAgICAgICAgICAgICAgICBSTiAgMTIKK2czICAgICAgICAgICAgICAgICAgUk4gIDE0ICAgCisKKzsvLyBDb2xvdW1uIG9wZXJhdGVkIHBpeGVscworY29sT3AwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK2NvbE9wMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCitjb2xPcDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAorY29sT3AxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK2NvbE9wMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCitjb2xPcDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAorY29sT3AzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK2NvbE9wMzIgICAgICAgICAgICAgUk4gIDkgIAorCisKK3RlbXAxICAgICAgICAgICAgICAgUk4gIDEwICAgICAgICAgICAgICAgICAgOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcworY29uc3QxICAgICAgICAgICAgICBSTiAgMTEgICAgICAKK2NvbnN0MiAgICAgICAgICAgICAgUk4gIDEyCittYXNrICAgICAgICAgICAgICAgIFJOICAxNAorCis7Ly8gT3V0cHV0IHBpeGVscworb3V0MDAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK291dDAyICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCitvdXQxMCAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAorb3V0MTIgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK291dDIwICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCitvdXQyMiAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAorb3V0MzAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK291dDMyICAgICAgICAgICAgICAgUk4gIDkgIAorICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCxyMTEKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgorICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICAKKyAgICAgICAgTERNSUEgICBwU3JjLHtpbjAwLGluMDIsaW4xMCxpbjEyLGluMjAsaW4yMixpbjMwLGluMzJ9CisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgY29uc3RaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCisgICAgICAgIDtMRFIgICAgICAgY29uc3RaZXJvLD0weDAwMDAwMDAwICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgbWF0cml4IGlub3JkZXIgdG8gcGVyZm9ybSByb3cgb3BzIGFzIGNvbG91bW4gb3BzCisgICAgICAgIDsvLyBJbnB1dDogICBpbltdW10gPSBvcmlnaW5hbCBtYXRyaXgKKyAgICAgICAgOy8vIE91dHB1dDogIHRyUm93W11bXT0gdHJhbnNwb3NlZCBtYXRyaXgKKyAgICAgICAgOy8vIFN0ZXAxOiBPYnRhaW4gdGhlIExMIHBhcnQgb2YgdGhlIHRyYW5zcG9zZWQgbWF0cml4CisgICAgICAgIDsvLyBTdGVwMjogT2J0YWluIHRoZSBITCBwYXJ0CisgICAgICAgIDsvLyBzdGVwMzogT2J0YWluIHRoZSBMSCBwYXJ0CisgICAgICAgIDsvLyBTdGVwNDogT2J0YWluIHRoZSBISCBwYXJ0CisgICAgICAgIDsvLworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIGQwIGQxIC0gLQorICAgICAgICA7Ly8gICBkNCBkNSAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0clJvdzEwLGluMTAsaW4wMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXSAgICAKKyAgICAgICAgUEtIQlQgICB0clJvdzAwLGluMDAsaW4xMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCisgICAgICAgIAorICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KKyAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBQS0hUQiAgIHRyUm93MzAsaW4xMixpbjAyLEFTUiAjMTYgICAgICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KKyAgICAgICAgIFBLSEJUICAgdHJSb3cyMCxpbjAyLGluMTIsTFNMICMxNiAgICAgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCisgICAgICAgIAorICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCisgICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgdHJSb3cwMixpbjIwLGluMzAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKKyAgICAgICAgUEtIVEIgICB0clJvdzEyLGluMzAsaW4yMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQorICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1CisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyUm93MzIsaW4zMixpbjIyLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KKyAgICAgICAgUEtIQlQgICB0clJvdzIyLGluMjIsaW4zMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCisgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAwLHRyUm93MjAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFNTVUIxNiAgICBlMSwgdHJSb3cwMCx0clJvdzIwICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyICAKKyAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFNIQUREMTYgICBlMywgdHJSb3czMCxjb25zdFplcm8gICAgICAgICAgICAgICAgIDsvLyAgYXZvaWQgcGlwZWxpbmUgc3RhbGxzIGZvciBlMiBhbmQgZTMKKyAgICAgICAgU1NVQjE2ICAgIGUyLCBlMiwgdHJSb3czMCAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAgCisgICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgIAorICAgICAgICBTQUREMTYgICAgcm93T3AwMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMyAgCisgICAgICAgIFNBREQxNiAgICByb3dPcDEwLCBlMSwgZTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyICAKKyAgICAgICAgU1NVQjE2ICAgIHJvd09wMjAsIGUxLCBlMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIgIAorICAgICAgICBTU1VCMTYgICAgcm93T3AzMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMworICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAyLHRyUm93MjIKKyAgICAgICAgU1NVQjE2ICAgIGUxLCB0clJvdzAyLHRyUm93MjIKKyAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgU0hBREQxNiAgIGUzLCB0clJvdzMyLGNvbnN0WmVybworICAgICAgICBTU1VCMTYgICAgZTIsIGUyLCB0clJvdzMyCisgICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTIKKyAgICAgICAgU0FERDE2ICAgIHJvd09wMDIsIGUwLCBlMworICAgICAgICBTQUREMTYgICAgcm93T3AxMiwgZTEsIGUyCisgICAgICAgIFNTVUIxNiAgICByb3dPcDIyLCBlMSwgZTIKKyAgICAgICAgU1NVQjE2ICAgIHJvd09wMzIsIGUwLCBlMworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4CisgICAgICAgIDsvLyBJbnB1dDogIHJvd09wW11bXQorICAgICAgICA7Ly8gT3V0cHV0OiB0ckNvbFtdW10gCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgZDAgZDEgLSAtCisgICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyQ29sMTAscm93T3AxMCxyb3dPcDAwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0KKyAgICAgICAgUEtIQlQgICB0ckNvbDAwLHJvd09wMDAscm93T3AxMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKKyAgICAgICAgCisgICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQorICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFBLSFRCICAgdHJDb2wzMCxyb3dPcDEyLHJvd09wMDIsQVNSICMxNiAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCisgICAgICAgICBQS0hCVCAgIHRyQ29sMjAscm93T3AwMixyb3dPcDEyLExTTCAjMTYgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCisgICAgICAgIAorICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCisgICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgdHJDb2wwMixyb3dPcDIwLHJvd09wMzAsTFNMICMxNiAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAorICAgICAgICBQS0hUQiAgIHRyQ29sMTIscm93T3AzMCxyb3dPcDIwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKKyAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0ckNvbDMyLHJvd09wMzIscm93T3AyMixBU1IgIzE2ICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCisgICAgICAgIFBLSEJUICAgdHJDb2wyMixyb3dPcDIyLHJvd09wMzIsTFNMICMxNiAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQorICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnMKKyAgICAgICAgCisgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAwLHRyQ29sMjAKKyAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAwLHRyQ29sMjAKKyAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzAsY29uc3RaZXJvCisgICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzAKKyAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMAorICAgICAgICBTQUREMTYgICAgY29sT3AwMCwgZzAsIGczCisgICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBnMSwgZzIKKyAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjAsIGcxLCBnMgorICAgICAgICBTU1VCMTYgICAgY29sT3AzMCwgZzAsIGczCisgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAyLHRyQ29sMjIKKyAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAyLHRyQ29sMjIKKyAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzIsY29uc3RaZXJvCisgICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzIKKyAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMgorICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgZzAsIGczCisgICAgICAgIFNBREQxNiAgICBjb2xPcDEyLCBnMSwgZzIKKyAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjIsIGcxLCBnMgorICAgICAgICBTU1VCMTYgICAgY29sT3AzMiwgZzAsIGczCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42CisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIDsvLyBjb25zdDE6IFNlcnZlcyBkdWFsIHB1cnBvc2UgCisgICAgICAgIDsvLyAoMSkgQWRkICMzMiB0byBib3RoIHRoZSBsb3dlciBhbmQgaGlnaGVyIDE2Yml0cyBvZiB0aGUgU0lNRCByZXN1bHQgCisgICAgICAgIDsvLyAoMikgQ29udmVydCB0aGUgbG93ZXIgMTYgYml0IHZhbHVlIHRvIGFuIHVuc2lnbmVkIG51bWJlciAoQWRkIDMyNzY4KQorICAgICAgICAKKyAgICAgICAgTERSICAgICBjb25zdDEsID0weDAwMjA4MDIwICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICBtYXNrLCA9MHhmZmZmMDNmZiAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gbWFzayB0aGUgZG93biBzaGlmdGVkIDYgYml0cyAgCisgICAgICAgIAorICAgICAgICA7Ly8gY29uc3QyKCM1MTIpOiB1c2VkIHRvIGNvbnZlcnQgdGhlIGxvd2VyIDE2Yml0IG51bWJlciBiYWNrIHRvIHNpZ25lZCB2YWx1ZSAKKyAgICAgIAorICAgICAgICBNT1YgICAgIGNvbnN0MiwjMHgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29uc3QyID0gMl45CisgICAgICAgIAorICAgICAgICA7Ly8gRmlyc3QgUm93IAorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMDAsIGNvbE9wMDAsIGNvbnN0MQorICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgY29sT3AwMiwgY29uc3QxCisgICAgICAgIEFORCAgICAgY29sT3AwMCwgbWFzaywgY29sT3AwMCwgQVNSICM2CisgICAgICAgIEFORCAgICAgY29sT3AwMiwgbWFzaywgY29sT3AwMiwgQVNSICM2CisgICAgICAgIFNTVUIxNiAgb3V0MDAsY29sT3AwMCxjb25zdDIKKyAgICAgICAgU1NVQjE2ICBvdXQwMixjb2xPcDAyLGNvbnN0MiAgICAKKyAgICAgICAgCisKKyAgICAgICAgOy8vIFNlY29uZCBSb3cKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBjb2xPcDEwLCBjb25zdDEKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMTIsIGNvbE9wMTIsIGNvbnN0MQorICAgICAgICBBTkQgICAgIGNvbE9wMTAsIG1hc2ssIGNvbE9wMTAsIEFTUiAjNgorICAgICAgICBBTkQgICAgIGNvbE9wMTIsIG1hc2ssIGNvbE9wMTIsIEFTUiAjNgorICAgICAgICBTU1VCMTYgIG91dDEwLGNvbE9wMTAsY29uc3QyCisgICAgICAgIFNTVUIxNiAgb3V0MTIsY29sT3AxMixjb25zdDIgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFRoaXJkIFJvdworICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMjAsIGNvbE9wMjAsIGNvbnN0MQorICAgICAgICBTQUREMTYgICAgY29sT3AyMiwgY29sT3AyMiwgY29uc3QxCisgICAgICAgIEFORCAgICAgY29sT3AyMCwgbWFzaywgY29sT3AyMCwgQVNSICM2CisgICAgICAgIEFORCAgICAgY29sT3AyMiwgbWFzaywgY29sT3AyMiwgQVNSICM2CisgICAgICAgIFNTVUIxNiAgb3V0MjAsY29sT3AyMCxjb25zdDIKKyAgICAgICAgU1NVQjE2ICBvdXQyMixjb2xPcDIyLGNvbnN0MgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBGb3VydGggUm93ICAgCisgICAgICAgIAorICAgICAgICBTQUREMTYgICAgY29sT3AzMCwgY29sT3AzMCwgY29uc3QxCisgICAgICAgIFNBREQxNiAgICBjb2xPcDMyLCBjb2xPcDMyLCBjb25zdDEKKyAgICAgICAgQU5EICAgICBjb2xPcDMwLCBtYXNrLCBjb2xPcDMwLCBBU1IgIzYKKyAgICAgICAgQU5EICAgICBjb2xPcDMyLCBtYXNrLCBjb2xPcDMyLCBBU1IgIzYKKyAgICAgICAgU1NVQjE2ICBvdXQzMCxjb2xPcDMwLGNvbnN0MgorICAgICAgICBTU1VCMTYgIG91dDMyLGNvbE9wMzIsY29uc3QyCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBEc3Qse291dDAwLG91dDAyLG91dDEwLG91dDEyLG91dDIwLG91dDIyLG91dDMwLG91dDMyfQorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgCitFbmQgICAgICAgICAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgCisgICAgCisgICAgCisKKworCisKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgICAgICAgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNmQ5Y2IwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpAQCAtMCwwICsxLDkyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBJbnB1dCBBcmd1bWVudHMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHBTcmMgICAgICAgICAgIFJOIDAgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKK3BEc3QgICAgICAgICAgICBSTiAxICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVmFyaWFibGVzIGFuZCB0aGVpciBzY29wZS91c2FnZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmMgICAgICAgICAgICBSTiAyICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlcworRmxhZyAgICAgICAgICAgIFJOIDMgICAgCitWYWx1ZSAgICAgICAgICAgUk4gNCAgICAKK1ZhbHVlMiAgICAgICAgICBSTiA1ICAgIAorc3RyT2Zmc2V0ICAgICAgIFJOIDYgICAgCitjc3RPZmZzZXQgICAgICAgUk4gNyAgICAKKworICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LCByNworICAgICAgICAKKyAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCisgICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7IEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgVmFsdWUsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBNT1YgICAgICBWYWx1ZTIsICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCisgICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KKyAgICAgICAgCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzBdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICM4XSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzRdICA9IHBEc3RbNV0gID0gcERzdFs2XSAgPSBwRHN0WzddICA9IDAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMTZdICAgICAgICAgICAgICAgICA7Ly8gcERzdFs4XSAgPSBwRHN0WzldICA9IHBEc3RbMTBdID0gcERzdFsxMV0gPSAwCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzI0XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTJdID0gcERzdFsxM10gPSBwRHN0WzE0XSA9IHBEc3RbMTVdID0gMAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gVGhlIGxvb3AgYmVsb3cgcGFyc2VzIGFuZCB1bnBhY2tzIHRoZSBpbnB1dCBzdHJlYW0uIFRoZSBDLW1vZGVsIGhhcyAKKyAgICAgICAgOy8vIGEgc29tZXdoYXQgY29tcGxpY2F0ZWQgbG9naWMgZm9yIHNpZ24gZXh0ZW5zaW9uLiAgQnV0IGluIHRoZSB2NiB2ZXJzaW9uLAorICAgICAgICA7Ly8gdGhhdCBjYW4gYmUgZWFzaWx5IHRha2VuIGNhcmUgYnkgbG9hZGluZyB0aGUgZGF0YSBmcm9tIDxwU3JjPiBzdHJlYW0gYXMgCisgICAgICAgIDsvLyBTSUdORUQgYnl0ZS9oYWxmd29yZC4gU28sIGJhc2VkIG9uIHRoZSBmaXJzdCBUU1QgaW5zdHJ1Y3Rpb24sIDgtYml0cyBvciAKKyAgICAgICAgOy8vIDE2LWJpdHMgYXJlIHJlYWQuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTmV4dCwgdG8gY29tcHV0ZSB0aGUgb2Zmc2V0LCB3aGVyZSB0aGUgdW5wYWNrZWQgdmFsdWUgbmVlZHMgdG8gYmUgc3RvcmVkLAorICAgICAgICA7Ly8gd2UgbW9kaWZ5IHRoZSBjb21wdXRhdGlvbiB0byBwZXJmb3JtIFsoRmxhZyAmIDE1KSA8IDFdIGFzIFsoRmxhZyA8IDEpICYgMzFdCisgICAgICAgIDsvLyBUaGlzIHJlc3VsdHMgaW4gYSBzYXZpbmcgb2Ygb25lIGN5Y2xlLgorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAordW5wYWNrTG9vcAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKKyAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MgICAKKyAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7CisgICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCisgICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCisgICAgICAgIAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKKyAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgorICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZworICAgICAgICAKKyAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorICAgIAorICAgIAorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmU2YjYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCkBAIC0wLDAgKzEsODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgbWFjcm9ibG9jayAoMTZ4MTYpLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCisgKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBTdGVwIG9mIHRoZSBhcnJheXMKKyAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCAgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBUaHJlc2hvbGRzCQlBQXJyYXkgb2Ygc2l6ZSAgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluICBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQorICogW2luXQlwQlMJCQkJYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOworICogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMsIG9yIHBCUyBpcyBOVUxMLgorICogICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgorICogICAtIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgorICogICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgorICogICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSgKKwlPTVhfVTgqIHBTcmNEc3QsIAorCU9NWF9TMzIgc3JjZHN0U3RlcCwgCisJY29uc3QgT01YX1U4KiBwQWxwaGEsIAorCWNvbnN0IE9NWF9VOCogcEJldGEsIAorCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKykKK3sKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7CisKKyAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQorICAgIAorICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcys4LCBwQlMrMTYpOworCisgICAgcmV0dXJuIGVycm9yQ29kZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjM4NjIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpAQCAtMCwwICsxLDkxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgbHVtYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorIAorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrCisgKigxNngxNikuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KKyAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIGltYWdlIHdpZHRoCisgKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwVGhyZXNob2xkcwkJcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyB2YWx1ZXMgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcikKKyAqIFtpbl0JcEJTCQkJCSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KKyAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzIG9yIHBCUyBpcyBOVUxMLgorICogICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4CisgKiAgICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgorLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JKAorCU9NWF9VOCogcFNyY0RzdCwgCisJT01YX1MzMiBzcmNkc3RTdGVwLCAKKwljb25zdCBPTVhfVTgqIHBBbHBoYSwgCisJY29uc3QgT01YX1U4KiBwQmV0YSwgCisJY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywgCisJY29uc3QgT01YX1U4ICpwQlMKKykKK3sKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKKworICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCisgICAgCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcysxNiwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTlmMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDYyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHJhc3RlciBzY2FuIG9yZGVyLCBuYW1lbHkgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0KKyAqCQkJCQkJCQlidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKgkJCQkJCQkJcG9pbnRlZCB0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMKKyAqCQkJCQkJCQlpbiB0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqIHBwUG9zQ29lZmJ1ZiAgICAgICAgCisgKQorCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgMTcsIDQpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmI0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIAorICogSW52ZXJzZSBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHppZ3phZyBvcmRlciBpbnN0ZWFkIAorICogb2YgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sKKyAqIFtpbl0Jc1ZMQ1NlbGVjdAkJVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIG51bWJlciBvZiBub24temVybworICoJCQkJCQkJCUFDIGNvZWZmaWNpZW50cyBvZiBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiBJdCBpcyAKKyAqCQkJCQkJCQllcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgCisgKgkJCQkJCQkJdGFibGUgOS01LCBleGNlcHQgaXRzIHZhbHVlIGNhbqGvdCBiZSBsZXNzIHRoYW4gemVyby4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICkKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCBzVkxDU2VsZWN0LCBzTWF4TnVtQ29lZmYpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3MTQ4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKQEAgLTAsMCArMSw0ODAgQEAKKzsvLworOy8vIChjKSBDb3B5cmlnaHQgMjAwNyBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKzsvLyAKKzsvLyAKKworICAgICAgICAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlIAorICAgICAgICAKKyAgICBNX1ZBUklBTlRTIEFSTTExMzZKUywgQVJNMTEzNkpTX1UKKyAgICAgICAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCis7Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQorCisKKzsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKUyAKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcFNyY0RzdCAgICAgICBSTiAgMAorUVAgICAgICAgICAgICBSTiAgMQorCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcFFQZGl2ICAgICAgICAgIFJOICA0CitwUVBtb2QgICAgICAgICAgUk4gIDUKK3BWUm93ICAgICAgICAgICBSTiAgMgorUVBtb2QgICAgICAgICAgIFJOICA2CitzaGlmdCAgICAgICAgICAgUk4gIDMKK3Jvd0x1bWEwMSAgICAgICBSTiAgMQorcm93THVtYTIzICAgICAgIFJOICA0CisKK1NyY0RzdDAwICAgICAgICBSTiAgNQorU3JjRHN0MDIgICAgICAgIFJOICA2CitTcmNEc3QxMCAgICAgICAgUk4gIDcKK1NyY0RzdDEyICAgICAgICBSTiAgOAorU3JjRHN0MjAgICAgICAgIFJOICA5CitTcmNEc3QyMiAgICAgICAgUk4gIDEwCitTcmNEc3QzMCAgICAgICAgUk4gIDExCitTcmNEc3QzMiAgICAgICAgUk4gIDEyCisKK3RlbXAxICAgICAgICAgICBSTiAgMgordGVtcDIgICAgICAgICAgIFJOICAzCit0ZW1wMyAgICAgICAgICAgUk4gIDE0CisgICAgCisgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0LHIxMQorICAgICAgICAgCisgICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAorICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgCisgICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKKyAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSSCAgICByb3dMdW1hMDEsW3BWUm93LFFQbW9kXSEgICAgICAgICAgICAgOy8vIHJvd0x1bWEwMSA9IFswMHwwYV0KKyAgICAgICAgTERSSCAgICB0ZW1wMyxbcFZSb3csIzJdICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAzICAgICA9IFswMHwwYl0gICAKKyAgICAgICAgTERSSCAgICByb3dMdW1hMjMsW3BWUm93LCM0XSAgICAgICAgICAgICAgICAgOy8vIHJvd0x1bWEyMyA9IFswMHwwY10gCisgICAgICAgIE9SUiAgICAgcm93THVtYTAxLHJvd0x1bWEwMSx0ZW1wMyxMU0wgIzE2ICAgIDsvLyByb3dMdW1hMDEgPSBbMGJ8MGFdICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDE2ICdzcmMnIHZhbHVlcworICAgICAgICBMRE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICdTaGlmdCcgcmFuZ2VzIGJldHdlZW4gWzAsOF0gCisgICAgICAgIDsvLyBTbyB3ZSBjYW4gc2hpZnQgdGhlIHBhY2tlZCByb3dMdW1hIHZhbHVlcyBbMGJ8MGFdIHdpdGggYSBzaW5nbGUgTFNMIG9wZXJhdGlvbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBMU0wgICAgcm93THVtYTAxLHJvd0x1bWEwMSxzaGlmdAorICAgICAgICBMU0wgICAgcm93THVtYTIzLHJvd0x1bWEyMyxzaGlmdAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGUgaWRlYSBpcyB0byB1bnJvbGwgdGhlIExvb3AgY29tcGxldGVseQorICAgICAgICA7Ly8gQWxsIHRoZSAxNiBzcmMgdmFsdWVzIGFyZSBsb2FkZWQgYXQgb25jZSBpbnRvIDggcmVnaXN0ZXJzIDogU3JjRHN0PHk+PHg+IChhYm92ZSkKKyAgICAgICAgOy8vIDA8PSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXSA8PTIgZm9yIGFueSAnaTwxNicgCisgICAgICAgIDsvLyBTbyB0aGUgb25seSB2YWx1ZXMgb2YgcFZSb3dbaV0gdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBhcmUgZm9yIGk9MCwxLDIKKyAgICAgICAgOy8vIFRoZXNlIDMgdmFsdWVzIGFyZSBsb2FkZWQgaW50byByb3dMdW1hMDEgYW5kIHJvd0x1bWEyMyAoYWJvdmUpCisgICAgICAgIDsvLyBXZSBmaXJzdCBjYWxjdWxhdGUgcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdCB3aGljaCBmaXRzIGludG8gMTYgYml0cyAoYWJvdmUpCisgICAgICAgIDsvLyBUaGVuIHRoZSBwcm9kdWN0IHBTcmNEc3RbaV0gKiAocFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dIDw8IFNoaWZ0KSBpcyBjYWxjdWxhdGVkCisgICAgICAgIDsvLyBIZXJlIHdlIGludGVybGVhdmUgdGhlIFBLSEJUIG9wZXJhdGlvbnMgZm9yIHZhcmlvdXMgcm93cyAgdG8gYXZvaWRlIHBpcGVsaW5lIHN0YWxscworICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBXZSB0aGVuIHBhY2sgdGhlIHR3byAxNiBiaXQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGludG8gYSB3b3JkIGFuZCBzdG9yZSBhdCBvbmUgZ28KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDEKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDAwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QwMCxTcmNEc3QwMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzBdICogKHBWUm93WzBdPDxTaGlmdCkgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QwMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzNdICogKHBWUm93WzJdPDxTaGlmdCkgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MDIsU3JjRHN0MDIscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsyXSAqIChwVlJvd1swXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDAwLFNyY0RzdDAwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIGZpcnN0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAyCisgICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MTAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs1XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MTAsU3JjRHN0MTAscm93THVtYTIzICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs0XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDAyLFNyY0RzdDAyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFNNVUxUVCAgdGVtcDIsU3JjRHN0MTIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs3XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MTIsU3JjRHN0MTIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs2XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDEwLFNyY0RzdDEwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMyAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MjAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs5XSAqIChwVlJvd1syXTw8U2hpZnQpICAgICAgICAgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MjAsU3JjRHN0MjAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs4XSAqIChwVlJvd1swXTw8U2hpZnQpICAKKyAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QxMixTcmNEc3QxMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MjIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QyMixTcmNEc3QyMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEwXSAqIChwVlJvd1swXTw8U2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QyMCxTcmNEc3QyMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyA0ICAgCisgICAgICAgIAorICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDMwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTNdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QzMCxTcmNEc3QzMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEyXSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBTTVVMVFQgIHRlbXAzLFNyY0RzdDMyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTVdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QzMixTcmNEc3QzMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE0XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MjIsU3JjRHN0MjIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgcmVtYWluaW5nIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFBLSEJUICAgU3JjRHN0MzAsU3JjRHN0MzAsdGVtcDEsTFNMICMxNgorICAgICAgICBQS0hCVCAgIFNyY0RzdDMyLFNyY0RzdDMyLHRlbXAzLExTTCAjMTYKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgCisgCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQVJNMTEzNkpTX1UKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcFNyY0RzdCAgICAgICBSTiAgMAorUVAgICAgICAgICAgICBSTiAgMQorCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcFFQZGl2ICAgICAgICAgIFJOICA0CitwUVBtb2QgICAgICAgICAgUk4gIDUKK3BWUm93ICAgICAgICAgICBSTiAgMgorUVBtb2QgICAgICAgICAgIFJOICA2CitzaGlmdCAgICAgICAgICAgUk4gIDMKK3Jvd0x1bWEwMSAgICAgICBSTiAgMQorcm93THVtYTIzICAgICAgIFJOICA0CisKK1NyY0RzdDAwICAgICAgICBSTiAgNQorU3JjRHN0MDIgICAgICAgIFJOICA2CitTcmNEc3QxMCAgICAgICAgUk4gIDcKK1NyY0RzdDEyICAgICAgICBSTiAgOAorU3JjRHN0MjAgICAgICAgIFJOICA5CitTcmNEc3QyMiAgICAgICAgUk4gIDEwCitTcmNEc3QzMCAgICAgICAgUk4gIDExCitTcmNEc3QzMiAgICAgICAgUk4gIDEyCisKK3RlbXAxICAgICAgICAgICBSTiAgMgordGVtcDIgICAgICAgICAgIFJOICAzCit0ZW1wMyAgICAgICAgICAgUk4gIDE0CisgICAgCisgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0LHIxMQorICAgICAgICAgCisgICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAorICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgCisgICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKKyAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgIHJvd0x1bWEwMSxbcFZSb3csUVBtb2RdISAgICAgICAgICAgICA7Ly8gcm93THVtYTAxID0gWzBifDBhXQorICAgICAgICBMRFIgICAgcm93THVtYTIzLFtwVlJvdywjNF0gICAgICAgICAgICAgICAgIDsvLyByb3dMdW1hMjMgPSBbMGR8MGNdICAgIAorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgMTYgJ3NyYycgdmFsdWVzCisgICAgICAgIExETUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJ1NoaWZ0JyByYW5nZXMgYmV0d2VlbiBbMCw4XSAKKyAgICAgICAgOy8vIFNvIHdlIGNhbiBzaGlmdCB0aGUgcGFja2VkIHJvd0x1bWEgdmFsdWVzIFswYnwwYV0gd2l0aCBhIHNpbmdsZSBMU0wgb3BlcmF0aW9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIExTTCAgICByb3dMdW1hMDEscm93THVtYTAxLHNoaWZ0CisgICAgICAgIExTTCAgICByb3dMdW1hMjMscm93THVtYTIzLHNoaWZ0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoZSBpZGVhIGlzIHRvIHVucm9sbCB0aGUgTG9vcCBjb21wbGV0ZWx5CisgICAgICAgIDsvLyBBbGwgdGhlIDE2IHNyYyB2YWx1ZXMgYXJlIGxvYWRlZCBhdCBvbmNlIGludG8gOCByZWdpc3RlcnMgOiBTcmNEc3Q8eT48eD4gKGFib3ZlKQorICAgICAgICA7Ly8gMDw9IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldIDw9MiBmb3IgYW55ICdpPDE2JyAKKyAgICAgICAgOy8vIFNvIHRoZSBvbmx5IHZhbHVlcyBvZiBwVlJvd1tpXSB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGFyZSBmb3IgaT0wLDEsMgorICAgICAgICA7Ly8gVGhlc2UgMyB2YWx1ZXMgYXJlIGxvYWRlZCBpbnRvIHJvd0x1bWEwMSBhbmQgcm93THVtYTIzIChhYm92ZSkKKyAgICAgICAgOy8vIFdlIGZpcnN0IGNhbGN1bGF0ZSBwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0pIDw8IFNoaWZ0IHdoaWNoIGZpdHMgaW50byAxNiBiaXRzIChhYm92ZSkKKyAgICAgICAgOy8vIFRoZW4gdGhlIHByb2R1Y3QgcFNyY0RzdFtpXSAqIChwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0gPDwgU2hpZnQpIGlzIGNhbGN1bGF0ZWQKKyAgICAgICAgOy8vIEhlcmUgd2UgaW50ZXJsZWF2ZSB0aGUgUEtIQlQgb3BlcmF0aW9ucyBmb3IgdmFyaW91cyByb3dzICB0byBhdm9pZGUgcGlwZWxpbmUgc3RhbGxzCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIFdlIHRoZW4gcGFjayB0aGUgdHdvIDE2IGJpdCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaW50byBhIHdvcmQgYW5kIHN0b3JlIGF0IG9uZSBnbworICAgICAgICA7Ly8KKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MDAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDAwLFNyY0RzdDAwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDAyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbM10gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QwMixTcmNEc3QwMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzJdICogKHBWUm93WzBdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MDAsU3JjRHN0MDAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgZmlyc3QgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDIKKyAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QxMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzVdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QxMCxTcmNEc3QxMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzRdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MDIsU3JjRHN0MDIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgU01VTFRUICB0ZW1wMixTcmNEc3QxMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzddICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QxMixTcmNEc3QxMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzZdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MTAsU3JjRHN0MTAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAzICAgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QyMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzldICogKHBWUm93WzJdPDxTaGlmdCkgICAgICAgICAKKyAgICAgICAgU01VTEJCICBTcmNEc3QyMCxTcmNEc3QyMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzhdICogKHBWUm93WzBdPDxTaGlmdCkgIAorICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDEyLFNyY0RzdDEyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QyMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzExXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDIyLFNyY0RzdDIyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTBdICogKHBWUm93WzBdPDxTaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDIwLFNyY0RzdDIwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDQgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MzAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxM10gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDMwLFNyY0RzdDMwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTJdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFNNVUxUVCAgdGVtcDMsU3JjRHN0MzIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNV0gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDMyLFNyY0RzdDMyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTRdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QyMixTcmNEc3QyMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSByZW1haW5pbmcgcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgUEtIQlQgICBTcmNEc3QzMCxTcmNEc3QzMCx0ZW1wMSxMU0wgIzE2CisgICAgICAgIFBLSEJUICAgU3JjRHN0MzIsU3JjRHN0MzIsdGVtcDMsTFNMICMxNgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNUTUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTX1UgICAgICAgIAorCisKKworCisKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAorICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcHBTcmMgICAgICAgUk4gIDAKK3BQcmVkICAgICAgIFJOICAxCitwREMgICAgICAgICBSTiAgMgorcERzdCAgICAgICAgUk4gIDMKKyAgIAorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCityZXN1bHQgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcERlbHRhICAgICAgUk4gIDQKK3BEZWx0YVRtcCAgIFJOICA2CitBQyAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKK3BQcmVkVGVtcCAgIFJOICA3CitwRENUZW1wICAgICBSTiAgOAorcERzdFRlbXAgICAgUk4gIDkKK3BEZWx0YUFyZzEgIFJOICAxCitwRGVsdGFBcmcwICBSTiAgMAorUVAgICAgICAgICAgUk4gIDEgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCitEQ3ZhbCAgICAgICBSTiAgMTAgIAorREN2YWxDb3B5ICAgUk4gIDExCitwcmVkc3RlcCAgICBSTiAgMQorZHN0U3RlcCAgICAgUk4gIDEwCit5Y291bnRlciAgICBSTiAgMAorUHJlZFZhbDEgICAgUk4gIDMKK1ByZWRWYWwyICAgIFJOICA1CitEZWx0YVZhbDEgICBSTiAgMgorRGVsdGFWYWwyICAgUk4gIDExCitQcmVkVmFsICAgICBSTiAgOAordG1wRGVsdGFWYWwgUk4gIDYKK3N1bTEgICAgICAgIFJOICAxMgorc3VtMiAgICAgICAgUk4gIDE0CisgICAgCisgICAgCisgICAgICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIE1fQUxMT0M4IHBCdWZmZXIsIDMyCisgICAgICAgICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwcmVkU3RlcE9uU3RhY2ssIDQKKyAgICAgICAgTV9BUkcgICBkc3RTdGVwT25TdGFjayw0CisgICAgICAgIE1fQVJHICAgUVBPblN0YWNrLCA0CisgICAgICAgIE1fQVJHICAgQUNPblN0YWNrLDQKKyAgCisgICAgICAgIAorICAgICAgICBNX0FEUiAgIHBEZWx0YSxwQnVmZmVyIAorICAgICAgICBNX0xEUiAgIEFDLEFDT25TdGFjayAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHIxLHIyLHIzIGJlZm9yZSBmdW5jdGlvbiBjYWxsICAgIAorICAgICAgICBNT1YgICAgIHBQcmVkVGVtcCxwUHJlZAorICAgICAgICBNT1YgICAgIHBEQ1RlbXAscERDCisgICAgICAgIE1PViAgICAgcERzdFRlbXAscERzdAorICAgICAgICAKKyAgICAgICAgQ01QICAgICBBQywjMAorICAgICAgICBCRVEgICAgIERDY2FzZQorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAKKyAgICAgICAgTV9MRFIgICBRUCxRUE9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIERlcXVhbnRMdW1hQUM0eDQKKyAgICAgICAgTU9WICAgICBwRGVsdGFBcmcwLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjAgZm9yIERlcXVhbnRMdW1hQUM0eDQKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgcERDVGVtcCwjMAorICAgICAgICBMRFJTSE5FIERDdmFsLFtwRENUZW1wXQorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzAscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMCBmb3IgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICBTVFJITkUgIERDdmFsLFtwRGVsdGFdCisgICAgICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgQiAgICAgICBPdXREQ2Nhc2UgCisgICAgICAgIAorCitEQ2Nhc2UKKyAgICAgICAgTERSU0ggICBEQ3ZhbCxbcERDVGVtcF0gCisgICAgICAgIEFERCAgICAgREN2YWwsREN2YWwsIzMyIAorICAgICAgICBBU1IgICAgIERDdmFsLERDdmFsLCM2CisgICAgICAgIFBLSEJUICAgREN2YWwsREN2YWwsREN2YWwsTFNMICMxNiAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGluZyB0aGUgTG93ZXIgaGFsZndvcmQKKyAgICAgICAgTU9WICAgICBEQ3ZhbENvcHksIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5lZWRlZCBmb3IgU1RSRAorICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjMF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzBdICA9IHBEZWx0YVsxXSAgPSBwRGVsdGFbMl0gID0gcERlbHRhWzNdID0gREN2YWwKKyAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzhdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs0XSAgPSBwRGVsdGFbNV0gID0gcERlbHRhWzZdICA9IHBEZWx0YVs3XSA9IERDdmFsCisgICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICMxNl0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbOF0gID0gcERlbHRhWzldICA9IHBEZWx0YVsxMF0gPSBwRGVsdGFbMTFdID0gREN2YWwKKyAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzI0XSAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorT3V0RENjYXNlICAgICAgCisgICAgICAgIE1fTERSICAgcHJlZHN0ZXAscHJlZFN0ZXBPblN0YWNrCisgICAgICAgIE1fTERSICAgZHN0U3RlcCxkc3RTdGVwT25TdGFjaworICAgICAgICAKKyAgICAgICAgTERNSUEgICBwRGVsdGEhLHt0bXBEZWx0YVZhbCxEZWx0YVZhbDJ9ICAgICAgICAgICAgIDsvLyBQcmUgbG9hZAorICAgICAgICBNT1YgICAgIHljb3VudGVyLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvdW50ZXIgZm9yIHRoZSBQcmVkUGx1c0RlbHRhTG9vcAorICAgICAgICBMRFIgICAgIFByZWRWYWwsW3BQcmVkVGVtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZSBsb2FkCisKK1ByZWRQbHVzRGVsdGFMb29wCisgICAgICAgIAorICAgICAgIAorICAgICAgICBTVUJTICAgIHljb3VudGVyLHljb3VudGVyLCMxCisgICAgICAgIEFERCAgICAgcFByZWRUZW1wLHBQcmVkVGVtcCxwcmVkc3RlcCAgICAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBQcmVkIHB0cgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBEZWx0YVZhbDEsdG1wRGVsdGFWYWwsRGVsdGFWYWwyLExTTCAjMTYgICAgIDsvLyBEZWx0YXZhbDEgPSBbQyBBXSAgIAorICAgICAgICBQS0hUQiAgIERlbHRhVmFsMixEZWx0YVZhbDIsdG1wRGVsdGFWYWwsQVNSICMxNiAgICAgOy8vIERlbHRhVmFsMiA9IFtEIEJdCisgICAgICAgIAorICAgICAgICBVWFRCMTYgIFByZWRWYWwxLFByZWRWYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZWRWYWwxID0gWzBjMGFdCisgICAgICAgIFVYVEIxNiAgUHJlZFZhbDIsUHJlZFZhbCxST1IgIzggICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlZFZhbDIgPSBbMGQwYl0KKyAgICAgICAgCisgICAgICAgIExEUkdUICAgUHJlZFZhbCxbcFByZWRUZW1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlIGxvYWQKKyAgICAgICAgCisgICAgICAgIFFBREQxNiAgc3VtMixEZWx0YVZhbDIsUHJlZFZhbDIgICAgICAgICAgICAgICAgICAgICA7Ly8gQWRkIGFuZCBzYXR1cmF0ZSB0byAxNiBiaXRzCisgICAgICAgIFFBREQxNiAgc3VtMSxEZWx0YVZhbDEsUHJlZFZhbDEKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgc3VtMiwjOCxzdW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYXJtQ2xpcCgwLDI1NSxzdW0yKQorICAgICAgICBVU0FUMTYgIHN1bTEsIzgsc3VtMQorICAgICAgICAKKyAgICAgICAgTERNR1RJQSAgIHBEZWx0YSEse3RtcERlbHRhVmFsLERlbHRhVmFsMn0gICAgICAgICAgIDsvLyBQcmUgbG9hZAorICAgICAgICAgIAorICAgICAgICBPUlIgICAgIHN1bTEsc3VtMSxzdW0yLExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgPSBbZGNiYV0KKyAgICAgICAgU1RSICAgICBzdW0xLFtwRHN0VGVtcF0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcERzdFRlbXAscERzdFRlbXAsZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBEc3QgcHRyCisgICAgICAgIEJHVCAgICAgUHJlZFBsdXNEZWx0YUxvb3AgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyCisgICAgICAgIAorRW5kICAgICAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgCisgICAgCisgICAgCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKKyAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICAKKyAgICAgICAgIAorICAgICAgICAgICAgCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk2MGYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpAQCAtMCwwICsxLDMzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTE9PUF9DT1VOVCAgRVFVIDB4NTAwMDAwMDAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYUFyZyAgIFJOIDIKK3BCZXRhQXJnICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNgorcEJTICAgICAgICAgUk4gOQorcFEwICAgICAgICAgUk4gMAorYlMgICAgICAgICAgUk4gMTAKKworYWxwaGEgICAgICAgUk4gNgorYWxwaGEwICAgICAgUk4gNgorYWxwaGExICAgICAgUk4gOAorCitiZXRhICAgICAgICBSTiA3CitiZXRhMCAgICAgICBSTiA3CitiZXRhMSAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKKworOy8vIFBpeGVscworcF8wICAgICAgICAgUk4gMyAgCitwXzEgICAgICAgICBSTiA1ICAKK3FfMCAgICAgICAgIFJOIDggIAorcV8xICAgICAgICAgUk4gOSAgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorCithcDBxMCAgICAgICBSTiA0ICAKK2ZpbHQgICAgICAgIFJOIDIKKyAgICAgICAgCittMDAgICAgICAgICBSTiAxNAorbTAxICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorcFEwICAgICAgICAgUk4gMAorU3RlcCAgICAgICAgUk4gMQorICAgICAgICAgICAgCis7Ly8gT3V0cHV0CisgICAgICAgICAgICAKK1BfMCAgICAgICAgIFJOIDYKK1FfMCAgICAgICAgIFJOIDcgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDICAgICAgICAgIFJOIDEyCit0QzAgICAgICAgICBSTiA1Cit0QzEgICAgICAgICBSTiAxMgorcG9zICAgICAgICAgUk4gNQorbmVnICAgICAgICAgUk4gOQorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCisKKzsvLyBNaXNjZWxsYW5vdXMKK1hZICAgICAgICAgIFJOIDgKKworYSAgICAgICAgICAgUk4gMTAKK3QxICAgICAgICAgIFJOIDEwCit0MiAgICAgICAgICBSTiAxMgordDMgICAgICAgICAgUk4gMTQKK3Q0ICAgICAgICAgIFJOIDYKK3Q1ICAgICAgICAgIFJOIDUKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKKyAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4CisgICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKKyAgICAgICAgTV9BTExPQzQgcHBCUyw0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgcjExCisgICAgICAgIAorICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0CisgICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAorICAgICAgICAKKyAgICAgICAgTERSQiAgICBhbHBoYTEsIFtwQWxwaGFBcmcsIzFdCisgICAgICAgIExEUkIgICAgYmV0YTEsICBbcEJldGFBcmcsIzFdCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZworICAgICAgICBMRFIgICAgIGEsPU1BU0tfMQorICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCisKKyAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgYQorICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgYQorICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCBhCisgICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCBhCisKKyAgICAgICAgTV9TVFJEICBhbHBoYTEsIGJldGExLCBwQWxwaGFCZXRhMQorICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZworICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCisKKyAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAorICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCitMb29wWQorTG9vcFgKKzsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFJIICAgIGJTLCBbcEJTXSwgIzIKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgcF8xLCBbcFEwXSxzcmNkc3RTdGVwCisKKyAgICAgICAgQ01QICAgICBiUywgIzAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgcF8wLCBbcFEwXSxzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8wLCBbcFEwXSxzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8xLCBbcFEwXQorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJCUzAKKworICAgICAgICAKKyAgICAgICAgOy8vIHBfMCA9IFtyM3AwIHIycDAgcjFwMCByMHAwXQorICAgICAgICA7Ly8gcF8xID0gW3IzcDEgcjJwMSByMXAxIHIwcDFdCisgICAgICAgIDsvLyBxXzAgPSBbcjNxMCByMnEwIHIxcTAgcjBxMF0KKyAgICAgICAgOy8vIHFfMSA9IFtyM3ExIHIycTEgcjFxMSByMHExXQorCis7Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKKworICAgICAgICBNT1YgICAgIGZpbHQsIG0wMQorICAgICAgICBUU1QgICAgIGJTLCAjMHhmZjAwCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNSICMxNgorICAgICAgICBUU1QgICAgIGJTLCAjMHhmZgorICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTTCAjMTYKKyAgICAgICAgVFNUICAgICBiUywgIzQKKworICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgQkVRICAgICBiU0xUNCAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2JTR0U0ICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIENNUCAgICAgZmlsdCwgIzAKKworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKworICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKKyAgICAgICAgVUhBREQ4ICB0MSwgcF8wLCBxXzEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIE1WTiAgICAgdDIsIHBfMQorICAgICAgICBVSFNVQjggIHQxLCB0MSwgdDIKKyAgICAgICAgVVNVQjggICB0MiwgZmlsdCwgbTAxCisgICAgICAgIEVPUiAgICAgdDEsIHQxLCBtMDEsIExTTCAjNworCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMscFRocmVzaG9sZHMsICMyCisgICAgICAgIAorICAgICAgICA7Ly8gQ29tcHV0ZSBRMGIgCisgICAgICAgIFVIQUREOCAgdDIsIHFfMCwgcF8xCisgICAgICAgIE1WTiAgICAgdDMsIHFfMQorICAgICAgICBVSFNVQjggIHQyLCB0MiwgdDMKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFNFTCAgICAgUF8wLCB0MSwgcF8wCisgICAgICAgIEVPUiAgICAgdDIsIHQyLCBtMDEsIExTTCAjNworICAgICAgICBTRUwgICAgIFFfMCwgdDIsIHFfMAorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBCICAgICAgIFN0b3JlUmVzdWx0QW5kRXhpdAorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckZpbHQwCitOb0ZpbHRlckJTMAorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCisKKyAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFkKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKyAgICAgICAgCitiU0xUNCAgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIENNUCAgICAgZmlsdCwgIzAKKyAgICAgICAgCisgICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdworICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKKyAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKKyAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKKworICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCisKKyAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIAorICAgICAgICBMRFJCICAgIHRDMCwgW3BUaHJlc2hvbGRzXSwjMQorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKKyAgICAgICAgTERSQiAgICB0QzEsIFtwVGhyZXNob2xkc10sIzEKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFVIU1VCOCAgdDQsIHBfMCwgcV8wCisgICAgICAgIE9SUiAgICAgdEMsIHRDMCwgdEMxLCBMU0wgIzE2CisgICAgICAgIFVTVUI4ICAgdDUsIHBfMCwgcV8wCisgICAgICAgIEFORCAgICAgdDUsIHQ1LCBtMDEKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIE9SUiAgICAgdEMsIHRDLCBMU0wgIzggICAgICAgIAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDUKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFVRQUREOCAgdEMsIHRDLCBtMDEKKyAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQorICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFNFTCAgICAgdEMsIHRDLCBtMDAKKworICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKKworICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCisgICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCisgICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCisgICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKKyAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKKyAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QworICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZworICAgICAgICBVUUFERDggIFBfMCwgcF8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBRXzAsIHFfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUF8wLCBQXzAsIG5lZworICAgICAgICBVUUFERDggIFFfMCwgUV8wLCBuZWcKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAorICAgICAgICBTRUwgICAgIFBfMCwgUF8wLCBwXzAKKyAgICAgICAgU0VMICAgICBRXzAsIFFfMCwgcV8wCisgICAgCitTdG9yZVJlc3VsdEFuZEV4aXQKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKworICAgICAgICA7Ly8gUF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyBRXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKworICAgICAgICBNX1NUUiAgIFBfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgU1RSICAgICBRXzAsIFtwUTBdLCAjNAorCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorCitFeGl0TG9vcFkKKyAgICAgICAgQUREICAgICBwQlMsIHBCUywgIzQKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzgKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIE1fU1RSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgQk5FICAgICBMb29wWQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0VORAorCisgICAgRU5ESUYgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM4MzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpAQCAtMCwwICsxLDQzNyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTUFTS18yICAgICAgRVFVIDB4MDAwMGZmMDAKK0xPT1BfQ09VTlQgIEVRVSAweDUwMDAwMDAwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGFBcmcgICBSTiAyCitwQmV0YUFyZyAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDYKK3BCUyAgICAgICAgIFJOIDkKK3BRMCAgICAgICAgIFJOIDAKK2JTICAgICAgICAgIFJOIDIKK2JTVGVtcCAgICAgIFJOIDEwCisKK2FscGhhICAgICAgIFJOIDYKK2FscGhhMCAgICAgIFJOIDYKK2FscGhhMSAgICAgIFJOIDgKKworYmV0YSAgICAgICAgUk4gNworYmV0YTAgICAgICAgUk4gNworYmV0YTEgICAgICAgUk4gOQorCis7Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCisKKzsvLyBQaXhlbHMKK3BfMCAgICAgICAgIFJOIDMgIAorcF8xICAgICAgICAgUk4gNSAgCitxXzAgICAgICAgICBSTiA4ICAKK3FfMSAgICAgICAgIFJOIDkgIAorCis7Ly8gVW5wYWNraW5nCittYXNrICAgICAgICBSTiAxMSAKKworcm93MCAgICAgICAgUk4gMgorcm93MSAgICAgICAgUk4gNAorcm93MiAgICAgICAgUk4gNQorcm93MyAgICAgICAgUk4gMworCityb3c0ICAgICAgICBSTiA4Cityb3c1ICAgICAgICBSTiA5Cityb3c2ICAgICAgICBSTiAxMAorcm93NyAgICAgICAgUk4gMTIKKwordHVucGswICAgICAgUk4gMgordHVucGsyICAgICAgUk4gMTAKK3R1bnBrMyAgICAgIFJOIDEyCisKK3R1bnBrNCAgICAgIFJOIDQKK3R1bnBrNSAgICAgIFJOIDUKK3R1bnBrNiAgICAgIFJOIDE0Cit0dW5wazcgICAgICBSTiAyIAorCis7Ly8gRmlsdGVyaW5nCisKK2RwMHEwICAgICAgIFJOIDEyCitkcDFwMCAgICAgICBSTiAxMgorZHExcTAgICAgICAgUk4gMTIKKworYXAwcTAgICAgICAgUk4gNCAgCitmaWx0ICAgICAgICBSTiAyCisgICAgICAgIAorbTAwICAgICAgICAgUk4gMTQKK20wMSAgICAgICAgIFJOIDExCisgICAgICAgICAgICAKK3BRMCAgICAgICAgIFJOIDAKK1N0ZXAgICAgICAgIFJOIDEKKyAgICAgICAgICAgIAorOy8vIE91dHB1dAorICAgICAgICAgICAgCitQXzAgICAgICAgICBSTiA2CitRXzAgICAgICAgICBSTiA3IAorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAorCit0QyAgICAgICAgICBSTiAxMgordEMwICAgICAgICAgUk4gNQordEMxICAgICAgICAgUk4gMTIKK3BvcyAgICAgICAgIFJOIDUKK25lZyAgICAgICAgIFJOIDkKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKKworCis7Ly8gTWlzY2VsbGFub3VzCitYWSAgICAgICAgICBSTiA4CisKK2EgICAgICAgICAgIFJOIDEwCit0MSAgICAgICAgICBSTiAxMAordDIgICAgICAgICAgUk4gMTIKK3QzICAgICAgICAgIFJOIDE0Cit0NCAgICAgICAgICBSTiA2Cit0NSAgICAgICAgICBSTiA1CisKKworICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKKyAgICAgICAgTV9BTExPQzggcFhZQlMsNAorICAgICAgICBNX0FMTE9DNCBwcEJTLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0CisgICAgICAgIAorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCisgICAgICAgIExEUiAgICAgYSw9TUFTS18xCisgICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KKworICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCBhCisgICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCBhCisgICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIGEKKyAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIGEKKworICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisgICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCisgICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKKworICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCisgICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgCisgICAgICAgIAorTG9vcFkKK0xvb3BYCis7Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcTAtcTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFJIICAgIGJTLCBbcEJTXSwgIzgKKyAgICAgICAgTERSICAgICBtYXNrLCA9TUFTS18yCisKKyAgICAgICAgTV9MRFJIICByb3c0LCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICBNX1NUUiAgIHBCUywgcHBCUworICAgICAgICBNX0xEUkggIHJvdzUsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIEJFUS5XICAgTm9GaWx0ZXJCUzAKKyAgICAgICAgTERSSCAgICByb3c2LCBbcFEwXQorICAgICAgICBMRFJIICAgIHJvdzcsIFtwUTAsIHNyY2RzdFN0ZXBdCisKKyAgICAgICAgOy8vIHJvdzQgPSBbMCAwIHIwcTAgcjBxMV0KKyAgICAgICAgOy8vIHJvdzUgPSBbMCAwIHIxcTAgcjFxMV0KKyAgICAgICAgOy8vIHJvdzYgPSBbMCAwIHIycTAgcjJxMV0KKyAgICAgICAgOy8vIHJvdzcgPSBbMCAwIHIzcTAgcjNxMV0KKworICAgICAgICBBTkQgICAgIHR1bnBrNCwgbWFzaywgcm93NAorICAgICAgICBBTkQgICAgIHR1bnBrNSwgbWFzaywgcm93NCwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazQsIHR1bnBrNCwgcm93NSwgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazUsIHR1bnBrNSwgcm93NQorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93NgorICAgICAgICBBTkQgICAgIHR1bnBrNywgbWFzaywgcm93NiwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazYsIHR1bnBrNiwgcm93NywgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazcsIHR1bnBrNywgcm93NworCisgICAgICAgIDsvLyB0dW5wazQgPSBbMCAwIHIwcTAgcjFxMF0KKyAgICAgICAgOy8vIHR1bnBrNSA9IFswIDAgcjBxMSByMXExXQorICAgICAgICA7Ly8gdHVucGs2ID0gWzAgMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyB0dW5wazcgPSBbMCAwIHIycTEgcjNxMV0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzIKKworICAgICAgICBQS0hCVCAgIHFfMSwgdHVucGs2LCB0dW5wazQsIExTTCMxNgorICAgICAgICBQS0hCVCAgIHFfMCwgdHVucGs3LCB0dW5wazUsIExTTCMxNgorCisgICAgICAgIDsvLyBxXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKyAgICAgICAgOy8vIHFfMSA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQorCisKKzsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHAwLXAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBNX0xEUkggIHJvdzAsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAorICAgICAgICBNX0xEUkggIHJvdzEsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAorICAgICAgICBMRFJIICAgIHJvdzIsIFtwUTBdCisgICAgICAgIExEUkggICAgcm93MywgW3BRMCwgc3JjZHN0U3RlcF0KKyAgICAgICAgCisgICAgICAgIDsvLyByb3cwID0gWzAgMCByMHAwIHIwcDFdCisgICAgICAgIDsvLyByb3cxID0gWzAgMCByMXAwIHIxcDFdCisgICAgICAgIDsvLyByb3cyID0gWzAgMCByMnAwIHIycDFdCisgICAgICAgIDsvLyByb3czID0gWzAgMCByM3AwIHIzcDFdCisKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2ssIHJvdzAKKyAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzAsIExTTCM4CisgICAgICAgIFVYVEFCICAgdHVucGsyLCB0dW5wazIsIHJvdzEsIFJPUiM4CisgICAgICAgIFVYVEFCICAgdHVucGs2LCB0dW5wazYsIHJvdzEKKworICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFzaywgcm93MgorICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFzaywgcm93MiwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazAsIHR1bnBrMCwgcm93MywgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazMsIHR1bnBrMywgcm93MworCisgICAgICAgIDsvLyB0dW5wazIgPSBbMCAwIHIwcDAgcjFwMF0KKyAgICAgICAgOy8vIHR1bnBrNiA9IFswIDAgcjBwMSByMXAxXQorICAgICAgICA7Ly8gdHVucGswID0gWzAgMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyB0dW5wazMgPSBbMCAwIHIycDEgcjNwMV0KKworICAgICAgICBQS0hCVCAgIHBfMCwgdHVucGswLCB0dW5wazIsIExTTCMxNgorICAgICAgICBNX0xEUiAgIGJTVGVtcCwgcHBCUworICAgICAgICBQS0hCVCAgIHBfMSwgdHVucGszLCB0dW5wazYsIExTTCMxNgorCisgICAgICAgIDsvLyBwXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIHBfMSA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQorCis7Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMQorICAgICAgICBMRFJIICAgIGJTVGVtcCwgW2JTVGVtcCAsIy04XQorICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCisgICAgICAgIAorICAgICAgICBNT1YgICAgIGZpbHQsIG0wMQorICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzB4ZmYwMAorICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTTCAjMTYKKyAgICAgICAgVFNUICAgICBiU1RlbXAsICMweGZmCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNSICMxNgorICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzQKKworICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKKyAgICAgICAgVVNVQjggICBhLCBxXzAsIHBfMAorICAgICAgICBTRUwgICAgIGFwMHEwLCBhLCBkcDBxMAorICAgICAgICBVU1VCOCAgIGEsIGFwMHEwLCBhbHBoYQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICBCRVEgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIDsvLyBDb21wdXRlIFAwYgorICAgICAgICBVSEFERDggIHQxLCBwXzAsIHFfMQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKyAgICAgICAgTVZOICAgICB0MiwgcF8xCisgICAgICAgIFVIU1VCOCAgdDEsIHQxLCB0MgorICAgICAgICBVU1VCOCAgIHQyLCBmaWx0LCBtMDEKKyAgICAgICAgRU9SICAgICB0MSwgdDEsIG0wMSwgTFNMICM3CisKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcyxwVGhyZXNob2xkcywgIzQKKyAgICAgICAgCisgICAgICAgIDsvLyBDb21wdXRlIFEwYiAKKyAgICAgICAgVUhBREQ4ICB0MiwgcV8wLCBwXzEKKyAgICAgICAgTVZOICAgICB0MywgcV8xCisgICAgICAgIFVIU1VCOCAgdDIsIHQyLCB0MworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU0VMICAgICBQXzAsIHQxLCBwXzAKKyAgICAgICAgRU9SICAgICB0MiwgdDIsIG0wMSwgTFNMICM3CisgICAgICAgIFNFTCAgICAgUV8wLCB0MiwgcV8wCisKKyAgICAgICAgQiAgICAgICBTdG9yZVJlc3VsdEFuZEV4aXQKKworOy8vLS0tLS0tLS0tLSBFeGl0IG9mIExvb3BYIC0tLS0tLS0tLS0tLS0tCis7Ly8tLS0tIGZvciB0aGUgY2FzZSBvZiBubyBmaWx0ZXJpbmcgLS0tLS0KKworTm9GaWx0ZXJGaWx0MAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjMgorTm9GaWx0ZXJCUzAKKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKworICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFkKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKyAgICAgICAgCitiU0xUNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICAKKworICAgICAgICA7Ly8gU2luY2UgYmV0YSA8PSAxOCBhbmQgYWxwaGEgPD0gMjU1IHdlIGtub3cKKyAgICAgICAgOy8vIC0yNTQgPD0gcDAtcTAgPD0gMjU0CisgICAgICAgIDsvLyAgLTE3IDw9IHExLXEwIDw9IDE3CisgICAgICAgIDsvLyAgLTE3IDw9IHAxLXAwIDw9IDE3CisKKyAgICAgICAgOy8vIGRlbHRhID0gQ2xpcDMoIC10QywgdEMsICgoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zKSkKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gICAgQ2FsY3VsYXRlIEEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICg0KnEwIC0gNCpwMCArIHAxIC0gcTEgKyA0KT4+MworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoKHAxLXAwKSAtIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MworCisgICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgdDIsIHFfMSwgcV8wCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICAKKyAgICAgICAgTERSQiAgICB0QzAsIFtwVGhyZXNob2xkc10sICMxCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgorICAgICAgICBMRFJCICAgIHRDMSwgW3BUaHJlc2hvbGRzXSwgIzMKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFVIU1VCOCAgdDQsIHBfMCwgcV8wCisgICAgICAgIE9SUiAgICAgdEMsIHRDMSwgdEMwLCBMU0wgIzE2CisgICAgICAgIFVTVUI4ICAgdDUsIHBfMCwgcV8wCisgICAgICAgIEFORCAgICAgdDUsIHQ1LCBtMDEKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIE9SUiAgICAgdEMsIHRDLCBMU0wgIzggICAgICAgIAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDUKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFVRQUREOCAgdEMsIHRDLCBtMDEKKyAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQorICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFNFTCAgICAgdEMsIHRDLCBtMDAKKworICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKKworICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCisgICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCisgICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCisgICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKKyAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKKyAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QworICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZworICAgICAgICBVUUFERDggIFBfMCwgcF8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBRXzAsIHFfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUF8wLCBQXzAsIG5lZworICAgICAgICBVUUFERDggIFFfMCwgUV8wLCBuZWcKKyAgICAgICAgCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAorICAgICAgICBTRUwgICAgIFBfMCwgUF8wLCBwXzAKKyAgICAgICAgU0VMICAgICBRXzAsIFFfMCwgcV8wCisgICAgCitTdG9yZVJlc3VsdEFuZEV4aXQKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKworICAgICAgICA7Ly8gUF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyBRXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICAgICBwUTAsIHBRMCwgIzEgICAgICAKKyAKKyAgICAgICAgTU9WICAgICB0MSwgUV8wLCBMU1IgIzI0CisgICAgICAgIFNUUkIgICAgdDEsIFtwUTAsICMxXQorICAgICAgICBNT1YgICAgIHQxLCBQXzAsIExTUiAjMjQKKyAgICAgICAgTV9TVFJCICB0MSwgW3BRMF0sIHNyY2RzdFN0ZXAKKworICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICB0MSwgW3BRMCwgIzFdCisgICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICMxNgorICAgICAgICBNX1NUUkIgIHQxLCBbcFEwXSwgc3JjZHN0U3RlcAorCisgICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICM4CisgICAgICAgIFNUUkIgICAgdDEsIFtwUTBdCisgICAgICAgIFNUUkIgICAgUF8wLCBbcFEwLCBzcmNkc3RTdGVwXQorICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjOAorICAgICAgICBTVFJCICAgIHQxLCBbcFEwLCAjMV0hCisgICAgICAgIFNUUkIgICAgUV8wLCBbcFEwLCBzcmNkc3RTdGVwXQorCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorCitFeGl0TG9vcFkKKworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzgKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgcEJTLCBwQlMsICMxNCAKKyAgICAgICAgU1VCICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM2CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgQk5FICAgICBMb29wWQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgorOy8vLS0tLS0tLS0tLS0tLS0tLS1FbmQgRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBNX0VORAorCisgICAgICAgIEVORElGICAgICAgICAKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjg0MDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKQEAgLTAsMCArMSwzMzEgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorCisgICAgCisKKyAgICBJRiBBUk0xMTM2SlMKKworCitNQVNLXzAgICAgICBFUVUgMHgwMDAwMDAwMCAgIAorTUFTS18xICAgICAgRVFVIDB4MDEwMTAxMDEKK01BU0tfMiAgICAgIEVRVSAweGZmMDBmZjAwCitMT09QX0NPVU5UICBFUVUgMHgxMTExMDAwMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhQXJnICAgUk4gMgorcEJldGFBcmcgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiAxNAorcEJTICAgICAgICAgUk4gOQorcFEwICAgICAgICAgUk4gMAorYlMgICAgICAgICAgUk4gMgorCithbHBoYSAgICAgICBSTiA2CithbHBoYTAgICAgICBSTiA2CithbHBoYTEgICAgICBSTiA4CisKK2JldGEgICAgICAgIFJOIDcKK2JldGEwICAgICAgIFJOIDcKK2JldGExICAgICAgIFJOIDkKKworOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcworCis7Ly8gUGl4ZWxzCitwXzAgICAgICAgICBSTiAzICAKK3BfMSAgICAgICAgIFJOIDUgIAorcF8yICAgICAgICAgUk4gNCAgCitwXzMgICAgICAgICBSTiAyICAKK3FfMCAgICAgICAgIFJOIDggIAorcV8xICAgICAgICAgUk4gOSAgCitxXzIgICAgICAgICBSTiAxMCAKK3FfMyAgICAgICAgIFJOIDEyIAorCis7Ly8gRmlsdGVyaW5nCisKK2RwMHEwICAgICAgIFJOIDEyCitkcDFwMCAgICAgICBSTiAxMgorZHExcTAgICAgICAgUk4gMTIKK2RwMnAwICAgICAgIFJOIDEyCitkcTJxMCAgICAgICBSTiAxMgorICAgICAgICAgICAgCithcDBxMCAgICAgICBSTiAxICAKK2ZpbHQgICAgICAgIFJOIDIKKyAgICAgICAgCittMDAgICAgICAgICBSTiAxNAorbTAxICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorYXBmbGcgICAgICAgUk4gMCAKK2FxZmxnICAgICAgIFJOIDYKK2FwcWZsZyAgICAgIFJOIDAKKyAgICAgICAgICAgIAorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAorCit0QzAgICAgICAgICBSTiA3CitwdEMwICAgICAgICBSTiAxCisKK3BRMGEgICAgICAgIFJOIDAgICAgCitTdGVwYSAgICAgICBSTiAxICAgIAorbWFza2EgICAgICAgUk4gMTQKKyAgICAgICAgICAgIAorUDBhICAgICAgICAgUk4gMQorUDFhICAgICAgICAgUk4gOAorUTBhICAgICAgICAgUk4gNworUTFhICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKKworcFEwYiAgICAgICAgUk4gMAorU3RlcGIgICAgICAgUk4gMQorbWFza2IgICAgICAgUk4gMTQKKyAgICAgICAgICAgIAorUDBiICAgICAgICAgUk4gNgorUDFiICAgICAgICAgUk4gNworUDJiICAgICAgICAgUk4gMQorUDNiICAgICAgICAgUk4gMworICAgICAgICAgICAgCitRMGIgICAgICAgICBSTiA5IAorUTFiICAgICAgICAgUk4gMCAgIAorUTJiICAgICAgICAgUk4gMiAKK1EzYiAgICAgICAgIFJOIDMgCisKKzsvLyBNaXNjZWxsYW5vdXMKK1hZICAgICAgICAgIFJOIDgKK3QwICAgICAgICAgIFJOIDMgCit0MSAgICAgICAgICBSTiAxMgordDIgICAgICAgICAgUk4gMTQKK3Q3ICAgICAgICAgIFJOIDcKK3Q0ICAgICAgICAgIFJOIDQKK3Q1ICAgICAgICAgIFJOIDEgIAordDggICAgICAgICAgUk4gNiAgCithICAgICAgICAgICBSTiAwCisKKyAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DNCBwUV8zLDQKKyAgICAgICAgTV9BTExPQzQgcFBfMyw0CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAorICAgICAgICBNX0FMTE9DOCBwWFlCUyw0CisgICAgICAgIE1fQUxMT0M0IHBwQlMsNAorICAgICAgICBNX0FMTE9DOCBwcFEwU3RlcCw0CisgICAgICAgIE1fQUxMT0M0IHBTdGVwLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgcjExCisgICAgICAgIAorICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0CisgICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAorCisgICAgICAgIExEUiAgICAgdDQsPU1BU0tfMQorCisgICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQorICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKworICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCB0NAorICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgdDQKKyAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgdDQKKyAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIHQ0CisKKyAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAorICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisKKyAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAorICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKKyAgICAgICAgTV9TVFIgICBzcmNkc3RTdGVwLCBwU3RlcAorICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKK0xvb3BZCitMb29wWAorOy8vLS0tLS0tLS0tLS0tLS0tTG9hZCBQaXhlbHMtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fU1RSICAgcFEwLCBwcFEwU3RlcAorICAgICAgICBNX0xEUiAgIHBfMywgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBwXzIsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fU1RSICAgcF8zLCBwUF8zCisgICAgICAgIExEUkIgICAgYlMsIFtwQlNdLCAjMQorICAgICAgICBNX1NUUiAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgIHBfMSwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQ01QICAgICBiUywgIzAKKyAgICAgICAgTV9MRFIgICBwXzAsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8wLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHFfMSwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzIsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8zLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBCRVEgICAgIE5vRmlsdGVyQlMwCisgICAgICAgIENNUCAgICAgYlMsICM0CisgICAgICAgIE1fU1RSICAgcV8zLCBwUV8zCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEgICAgICAgICAgICAgICAgOy8vICAwMTAxMDEwMSBtYXNrIAorICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCisKKyAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBtMDEKKyAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgOy8vIENoZWNrIGFwPEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAycDAsIHBfMiwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzIKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDJwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBhcGZsZywgbTAwLCBmaWx0ICAgICAgICAgICAgOy8vIGFwZmxnID0gZmlsdCAmJiAoYXA8YmV0YSkKKworICAgICAgICA7Ly8gQ2hlY2sgYXE8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcTJxMCwgcV8yLCBxXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8wLCBxXzIKKyAgICAgICAgU0VMICAgICB0MiwgdDIsIGRxMnEwCisgICAgICAgIFVTVUI4ICAgdDIsIHQyLCBiZXRhCisgICAgICAgIE1PViAgICAgdDcsIzAKKworICAgICAgICBCTFQgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICB0MSwgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBPUlIgICAgIGFwcWZsZywgYXBmbGcsIHQxLCBMU0wgIzEKKyAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTU9WICAgICBwXzIsIFExYgorICAgICAgICBNT1YgICAgIHBfMSwgUDJiCisgICAgICAgIE1fTERSRCAgcFEwYiwgU3RlcGIsIHBwUTBTdGVwCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsICMxCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX1NUUiAgIHBfMSwgW3BRMGIsIFN0ZXBiXSEKKyAgICAgICAgTV9TVFIgICBQMWIsIFtwUTBiLCBTdGVwYl0hCisgICAgICAgIE1fU1RSICAgUDBiLCBbcFEwYiwgU3RlcGJdIQorICAgICAgICBNX1NUUiAgIFEwYiwgW3BRMGIsIFN0ZXBiXSEKKyAgICAgICAgU1RSICAgICBwXzIsIFtwUTBiLCBTdGVwYl0KKyAgICAgICAgU1RSICAgICBRMmIsIFtwUTBiLCBTdGVwYiwgTFNMICMxXQorCisKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBTVUIgICAgIHBRMCwgcFEwYiwgU3RlcGIsIExTTCAjMgorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckJTMAorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzMKK05vRmlsdGVyRmlsdDAKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKyAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzEKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKworYlNMVDQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICBhcWZsZywgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgTV9MRFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICAKKyAgICAgICAgTERSQiAgICB0QzAsIFtwdEMwXSwgIzEKKyAgICAgICAgTV9TVFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTU9WICAgICBwXzIsIFAwYQorICAgICAgICBNX0xEUkQgIHBRMGEsIFN0ZXBhLCBwcFEwU3RlcAorICAgICAgICBNX1NUUiAgIFAxYSwgW3BRMGEsIFN0ZXBhLCBMU0wgIzFdIQorICAgICAgICBNX1NUUiAgIHBfMiwgW3BRMGEsIFN0ZXBhXSEKKyAgICAgICAgTV9TVFIgICBRMGEsIFtwUTBhLCBTdGVwYV0hCisgICAgICAgIFNUUiAgICAgUTFhLCBbcFEwYSwgU3RlcGFdCisgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGNvdW50ZXIKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTBhLCBTdGVwYSwgTFNMICMyCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CisKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFgKKyAgICAgICAgCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorRXhpdExvb3BZCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICMxNgorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgTV9TVFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBCTkUgICAgIExvb3BZCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0VORAorCisgICAgRU5ESUYgICAgICAgIAorICAgICAgICAKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3ZGRjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCkBAIC0wLDAgKzEsNTUwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAgICAgCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTUFTS18yICAgICAgRVFVIDB4ZmYwMGZmMDAKK0xPT1BfQ09VTlQgIEVRVSAweDExMTEwMDAwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGFBcmcgICBSTiAyCitwQmV0YUFyZyAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDE0CitwQlMgICAgICAgICBSTiA5CitwUTAgICAgICAgICBSTiAwCitiUyAgICAgICAgICBSTiAyCisKK2FscGhhICAgICAgIFJOIDYKK2FscGhhMCAgICAgIFJOIDYKK2FscGhhMSAgICAgIFJOIDgKKworYmV0YSAgICAgICAgUk4gNworYmV0YTAgICAgICAgUk4gNworYmV0YTEgICAgICAgUk4gOQorCis7Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCisKKzsvLyBQaXhlbHMKK3BfMCAgICAgICAgIFJOIDMgIAorcF8xICAgICAgICAgUk4gNSAgCitwXzIgICAgICAgICBSTiA0ICAKK3BfMyAgICAgICAgIFJOIDIgIAorcV8wICAgICAgICAgUk4gOCAgCitxXzEgICAgICAgICBSTiA5ICAKK3FfMiAgICAgICAgIFJOIDEwIAorcV8zICAgICAgICAgUk4gMTIgCisKKzsvLyBVbnBhY2tpbmcKK21hc2sgICAgICAgIFJOIDExIAorCityb3cwICAgICAgICBSTiAyCityb3cxICAgICAgICBSTiA0Cityb3cyICAgICAgICBSTiA1Cityb3czICAgICAgICBSTiAzCisKK3JvdzQgICAgICAgIFJOIDgKK3JvdzUgICAgICAgIFJOIDkKK3JvdzYgICAgICAgIFJOIDEwCityb3c3ICAgICAgICBSTiAxMgorcm93OCAgICAgICAgUk4gMTQKK3JvdzkgICAgICAgIFJOIDcKKyAgICAgICAgICAgIAordHVucGswICAgICAgUk4gOAordHVucGsxICAgICAgUk4gOQordHVucGsyICAgICAgUk4gMTAKK3R1bnBrMyAgICAgIFJOIDEyCit0dW5wazQgICAgICBSTiAwCisKK3R1bnBrNSAgICAgIFJOIDEKK3R1bnBrNiAgICAgIFJOIDE0Cit0dW5wazcgICAgICBSTiAyIAordHVucGs4ICAgICAgUk4gNSAKK3R1bnBrOSAgICAgIFJOIDYgCisgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorZHAycDAgICAgICAgUk4gMTIKK2RxMnEwICAgICAgIFJOIDEyCisgICAgICAgICAgICAKK2FwMHEwICAgICAgIFJOIDEgIAorZmlsdCAgICAgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgICAgIFJOIDE0CittMDEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCithcGZsZyAgICAgICBSTiAwIAorYXFmbGcgICAgICAgUk4gNgorYXBxZmxnICAgICAgUk4gMAorICAgICAgICAgICAgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDMCAgICAgICAgIFJOIDcKK3B0QzAgICAgICAgIFJOIDEKKworcFEwYSAgICAgICAgUk4gMCAgICAKK1N0ZXBhICAgICAgIFJOIDEgICAgCittYXNrYSAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGEgICAgICAgICBSTiAxCitQMWEgICAgICAgICBSTiA4CitRMGEgICAgICAgICBSTiA3CitRMWEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCitwUTBiICAgICAgICBSTiAwCitTdGVwYiAgICAgICBSTiAxCittYXNrYiAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGIgICAgICAgICBSTiA2CitQMWIgICAgICAgICBSTiA3CitQMmIgICAgICAgICBSTiAxCitQM2IgICAgICAgICBSTiAzCisgICAgICAgICAgICAKK1EwYiAgICAgICAgIFJOIDkgCitRMWIgICAgICAgICBSTiAwICAgCitRMmIgICAgICAgICBSTiAyIAorUTNiICAgICAgICAgUk4gMyAKKworOy8vIE1pc2NlbGxhbm91cworWFkgICAgICAgICAgUk4gOAordDAgICAgICAgICAgUk4gMyAKK3QxICAgICAgICAgIFJOIDEyCit0MiAgICAgICAgICBSTiAxNAordDcgICAgICAgICAgUk4gNwordDQgICAgICAgICAgUk4gNAordDUgICAgICAgICAgUk4gMSAgCit0OCAgICAgICAgICBSTiA2ICAKK2EgICAgICAgICAgIFJOIDAKKworICAgICAgICAgICAgCisKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKKyAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKKyAgICAgICAgTV9BTExPQzQgcFFfMyw0CisgICAgICAgIE1fQUxMT0M0IHBQXzMsNAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKKyAgICAgICAgTV9BTExPQzggcFhZQlMsNAorICAgICAgICBNX0FMTE9DNCBwcEJTLDQKKyAgICAgICAgTV9BTExPQzggcHBRMFN0ZXAsNAorICAgICAgICBNX0FMTE9DNCBwU3RlcCw0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAorICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgdDQsPU1BU0tfMQorCisgICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQorICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKworICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCB0NAorICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgdDQKKyAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgdDQKKyAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIHQ0CisKKyAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAorICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisKKyAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAorICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKKyAgICAgICAgTV9TVFIgICBzcmNkc3RTdGVwLCBwU3RlcAorICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICAKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzQKK0xvb3BZCis7Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcDAtcDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIG1hc2ssID1NQVNLXzIKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgcm93MCwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIE1fTERSICAgcm93MSwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIExEUiAgICAgcm93MiwgW3BRMF0KKyAgICAgICAgTERSICAgICByb3czLCBbcFEwLCBzcmNkc3RTdGVwXQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgCisgICAgICAgIDsvLyByb3cwID0gW3IwcDAgcjBwMSByMHAyIHIwcDNdCisgICAgICAgIDsvLyByb3cxID0gW3IxcDAgcjFwMSByMXAyIHIxcDNdCisgICAgICAgIDsvLyByb3cyID0gW3IycDAgcjJwMSByMnAyIHIycDNdCisgICAgICAgIDsvLyByb3czID0gW3IzcDAgcjNwMSByM3AyIHIzcDNdCisKKyAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2ssIHJvdzAKKyAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzAsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGswLCB0dW5wazAsIHJvdzEsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGs2LCB0dW5wazYsIHJvdzEKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2ssIHJvdzIKKyAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2ssIHJvdzIsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIHJvdzMsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIHJvdzMKKworICAgICAgICA7Ly8gdHVucGswID0gW3IwcDAgcjFwMCByMHAyIHIxcDJdCisgICAgICAgIDsvLyB0dW5wazYgPSBbcjBwMSByMXAxIHIwcDMgcjFwM10KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMnAwIHIzcDAgcjJwMiByM3AyXQorICAgICAgICA7Ly8gdHVucGszID0gW3IycDEgcjNwMSByMnAzIHIzcDNdCisKKyAgICAgICAgUEtIVEIgICBwXzAsIHR1bnBrMCwgdHVucGsyLCBBU1IjMTYKKyAgICAgICAgUEtIVEIgICBwXzEsIHR1bnBrNiwgdHVucGszLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICBwXzIsIHR1bnBrMiwgdHVucGswLCBMU0wjMTYKKyAgICAgICAgUEtIQlQgICBwXzMsIHR1bnBrMywgdHVucGs2LCBMU0wjMTYKKworCisgICAgICAgIDsvLyBwXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIHBfMSA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQorICAgICAgICA7Ly8gcF8yID0gW3IwcDIgcjFwMiByMnAxIHIzcDJdCisgICAgICAgIDsvLyBwXzMgPSBbcjBwMyByMXAzIHIycDMgcjNwM10KKworICAgICAgICBNX1NUUiAgIHBfMywgcFBfMworCis7Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBxMC1xMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMb29wWAorICAgICAgICBMRFJCICAgIGJTLCBbcEJTXSwgIzQKKyAgICAgICAgTV9TVFIgICBwUTAsIHBwUTBTdGVwCisgICAgICAgIExEUiAgICAgbWFzaywgPU1BU0tfMgorICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICBNX1NUUiAgIHBCUywgcHBCUworCisgICAgICAgIExEUiAgICAgcm93NCwgW3BRMCwgIzRdIQorICAgICAgICBCRVEuVyAgIE5vRmlsdGVyQlMwCisgICAgICAgIE1fTERSICAgcm93NSwgW3BRMCwgc3JjZHN0U3RlcF0hCisgICAgICAgIE1fTERSICAgcm93NiwgW3BRMCwgc3JjZHN0U3RlcF0hCisgICAgICAgIE1fTERSICAgcm93NywgW3BRMCwgc3JjZHN0U3RlcF0KKworICAgICAgICA7Ly8gcm93NCA9IFtyMHEzIHIwcTIgcjBxMSByMHEwXQorICAgICAgICA7Ly8gcm93NSA9IFtyMXEzIHIxcTIgcjFxMSByMXEwXQorICAgICAgICA7Ly8gcm93NiA9IFtyMnEzIHIycTIgcjJxMSByMnEwXQorICAgICAgICA7Ly8gcm93NyA9IFtyM3EzIHIzcTIgcjNxMSByM3EwXQorICAgIAorICAgICAgICBBTkQgICAgIHR1bnBrNCwgbWFzaywgcm93NAorICAgICAgICBDTVAgICAgIGJTLCAjNAorICAgICAgICBBTkQgICAgIHR1bnBrNSwgbWFzaywgcm93NCwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazQsIHR1bnBrNCwgcm93NSwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazUsIHR1bnBrNSwgcm93NQorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93NgorICAgICAgICBBTkQgICAgIHR1bnBrNywgbWFzaywgcm93NiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazYsIHR1bnBrNiwgcm93NywgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazcsIHR1bnBrNywgcm93NworCisgICAgICAgIDsvLyB0dW5wazQgPSBbcjBxMCByMXEwIHIwcTIgcjFxMl0KKyAgICAgICAgOy8vIHR1bnBrNSA9IFtyMHExIHIxcTEgcjBxMyByMXEzXQorICAgICAgICA7Ly8gdHVucGs2ID0gW3IycTAgcjNxMCByMnEyIHIzcTJdCisgICAgICAgIDsvLyB0dW5wazcgPSBbcjJxMSByM3ExIHIycTMgcjNxM10KKworICAgICAgICBQS0hUQiAgIHFfMywgdHVucGs0LCB0dW5wazYsIEFTUiMxNgorICAgICAgICBQS0hUQiAgIHFfMiwgdHVucGs1LCB0dW5wazcsIEFTUiMxNgorICAgICAgICBQS0hCVCAgIHFfMSwgdHVucGs2LCB0dW5wazQsIExTTCMxNgorICAgICAgICBNX1NUUiAgIHFfMywgcFFfMworICAgICAgICBQS0hCVCAgIHFfMCwgdHVucGs3LCB0dW5wazUsIExTTCMxNgorCisKKyAgICAgICAgOy8vIHFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorICAgICAgICA7Ly8gcV8xID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCisgICAgICAgIDsvLyBxXzIgPSBbcjBxMiByMXEyIHIycTEgcjNxMl0KKyAgICAgICAgOy8vIHFfMyA9IFtyMHEzIHIxcTMgcjJxMyByM3EzXQorCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEgICAgICAgICAgICAgICAgOy8vICAwMTAxMDEwMSBtYXNrIAorICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCisKKyAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBtMDEKKyAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgOy8vIENoZWNrIGFwPEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAycDAsIHBfMiwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzIKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDJwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBhcGZsZywgbTAwLCBmaWx0ICAgICAgICAgICAgOy8vIGFwZmxnID0gZmlsdCAmJiAoYXA8YmV0YSkKKworICAgICAgICA7Ly8gQ2hlY2sgYXE8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcTJxMCwgcV8yLCBxXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8wLCBxXzIKKyAgICAgICAgU0VMICAgICB0MiwgdDIsIGRxMnEwCisgICAgICAgIFVTVUI4ICAgdDIsIHQyLCBiZXRhCisgICAgICAgIE1PViAgICAgdDcsIzAKKyAgICAgICAgCisKKyAgICAgICAgQkxUICAgICBiU0xUNCAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2JTR0U0ICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNFTCAgICAgdDEsIHQ3LCBmaWx0ICAgICAgICAgICAgOy8vIGFxZmxnID0gZmlsdCAmJiAoYXE8YmV0YSkgCisgICAgICAgIENNUCAgICAgZmlsdCwgIzAKKyAgICAgICAgT1JSICAgICBhcHFmbGcsIGFwZmxnLCB0MSwgTFNMICMxCisgICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBMRFIgICAgIG1hc2tiLD1NQVNLXzIKKworICAgICAgICA7Ly8gUDBiID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyBQMWIgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KKyAgICAgICAgOy8vIFAyYiA9IFtyMHAyIHIxcDIgcjJwMiByM3AyXQorICAgICAgICA7Ly8gUDNiID0gW3IwcDMgcjFwMyByMnAzIHIzcDNdCisKKyAgICAgICAgTV9MRFIgICBQM2IsIHBQXzMgICAKKyAgICAgICAgTV9TVFIgICBRMGIsIHBQXzMgICAKKworICAgICAgICA7Ly8tLS0tLS1QYWNrIHAwLXAzLS0tLS0tCisgICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrYiwgUDBiCisgICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrYiwgUDBiLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMCwgdHVucGswLCBQMWIsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIFAxYgorCisgICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYiwgUDJiCisgICAgICAgIEFORCAgICAgdHVucGs4LCBtYXNrYiwgUDJiLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBQM2IsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGs4LCB0dW5wazgsIFAzYgorCisgICAgICAgIDsvLyB0dW5wazAgPSBbcjBwMCByMHAxIHIycDAgcjJwMV0KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXAwIHIxcDEgcjNwMCByM3AxXQorICAgICAgICA7Ly8gdHVucGszID0gW3IwcDIgcjBwMyByMnAyIHIycDNdCisgICAgICAgIDsvLyB0dW5wazggPSBbcjFwMiByMXAzIHIzcDIgcjNwM10KKworICAgICAgICBNT1YgICAgIHBfMiwgUTFiCisgICAgICAgIE1fTERSRCAgcFEwYiwgU3RlcGIsIHBwUTBTdGVwCisKKyAgICAgICAgUEtIVEIgICByb3c5LCB0dW5wazAsIHR1bnBrMywgQVNSIzE2CisgICAgICAgIFBLSEJUICAgcm93NywgdHVucGszLCB0dW5wazAsIExTTCMxNgorICAgICAgICBQS0hUQiAgIHJvdzMsIHR1bnBrMiwgdHVucGs4LCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c2LCB0dW5wazgsIHR1bnBrMiwgTFNMIzE2CisKKyAgICAgICAgOy8vIHJvdzkgPSBbcjBwMCByMHAxIHIwcDIgcjBwM10KKyAgICAgICAgOy8vIHJvdzMgPSBbcjFwMCByMXAxIHIxcDIgcjFwM10KKyAgICAgICAgOy8vIHJvdzcgPSBbcjJwMCByMnAxIHIycDIgcjJwM10KKyAgICAgICAgOy8vIHJvdzYgPSBbcjNwMCByM3AxIHIzcDIgcjNwM10KKworICAgICAgICBNX1NUUiAgIHJvdzksIFtwUTBiXSwgU3RlcGIKKyAgICAgICAgU1RSICAgICByb3c3LCBbcFEwYiwgU3RlcGJdCisgICAgICAgIFNUUiAgICAgcm93NiwgW3BRMGIsIFN0ZXBiLCBMU0wgIzFdCisgICAgICAgIFNUUiAgICAgcm93MywgW3BRMGJdLCAjNAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBRM2IsIHBRXzMKKworICAgICAgICA7Ly8gUTBiID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyBRMWIgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KKyAgICAgICAgOy8vIFEyYiA9IFtyMHEyIHIxcTIgcjJxMiByM3EyXQorICAgICAgICA7Ly8gUTNiID0gW3IwcTMgcjFxMyByMnEzIHIzcTNdCisKKyAgICAgICAgOy8vLS0tLS0tUGFjayBxMC1xMy0tLS0tLQorICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFza2IsIHBfMgorICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFza2IsIHBfMiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazAsIHR1bnBrMCwgUTBiLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCBRMGIKKworICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFza2IsIFEzYgorICAgICAgICBBTkQgICAgIHR1bnBrOCwgbWFza2IsIFEzYiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgUTJiLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrOCwgdHVucGs4LCBRMmIKKworICAgICAgICA7Ly8gdHVucGswID0gW3IwcTEgcjBxMCByMnExIHIycTBdCisgICAgICAgIDsvLyB0dW5wazIgPSBbcjFxMSByMXEwIHIzcTEgcjNxMF0KKyAgICAgICAgOy8vIHR1bnBrMyA9IFtyMHEzIHIwcTIgcjJxMyByMnEyXQorICAgICAgICA7Ly8gdHVucGs4ID0gW3IxcTMgcjFxMiByM3EzIHIzcTJdCisKKyAgICAgICAgUEtIVEIgICByb3c4LCB0dW5wazMsIHR1bnBrMCwgQVNSIzE2CisgICAgICAgIFBLSEJUICAgcm93NywgdHVucGswLCB0dW5wazMsIExTTCMxNgorICAgICAgICBQS0hUQiAgIHJvdzQsIHR1bnBrOCwgdHVucGsyLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c2LCB0dW5wazIsIHR1bnBrOCwgTFNMIzE2CisKKyAgICAgICAgOy8vIHJvdzggPSBbcjBxMCByMHExIHIwcTIgcjBxM10KKyAgICAgICAgOy8vIHJvdzQgPSBbcjFxMCByMXExIHIxcTIgcjFxM10KKyAgICAgICAgOy8vIHJvdzcgPSBbcjJxMCByMnExIHIycTIgcjJxM10KKyAgICAgICAgOy8vIHJvdzYgPSBbcjNxMCByM3ExIHIzcTIgcjNxM10KKworICAgICAgICBTVFIgICAgIHJvdzQsIFtwUTBiXQorICAgICAgICBTVFIgICAgIHJvdzcsIFtwUTBiLCBTdGVwYl0KKyAgICAgICAgU1RSICAgICByb3c2LCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwYiwgU3RlcGIKKyAgICAgICAgTU9WICAgICBwXzEsIFEyYgorCisgICAgICAgIFNUUiAgICAgcm93OCwgW3BRMF0KKworICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckZpbHQwCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CitOb0ZpbHRlckJTMAorICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BZCisgICAgICAgIEIgICAgICAgRXhpdExvb3BZCisgICAgICAgIAorYlNMVDQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICBhcWZsZywgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgTV9MRFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICAKKyAgICAgICAgTERSQiAgICB0QzAsIFtwdEMwXSwgIzQKKyAgICAgICAgTV9TVFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vLS0tLS0tLS1QYWNrIHAxLHAwLHExLHEwLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly9Mb2FkIGRlc3RpbmF0aW9uIHBvaW50ZXIKKyAgICAgICAgTERSICAgICBtYXNrYSw9TUFTS18yCisgICAgICAgIE1fU1RSICAgUTBhLCBwUF8zCisgICAgICAgIE1PViAgICAgcF8xLCBxXzIKKworICAgICAgICA7Ly8gUDFhID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCisgICAgICAgIDsvLyBQMGEgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIFEwYSA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorICAgICAgICA7Ly8gUTFhID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCisKKyAgICAgICAgQU5EICAgICB0dW5wazEsIG1hc2thLCBQMGEKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2thLCBQMGEsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGsxLCB0dW5wazEsIFAxYSwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgUDFhCisKKyAgICAgICAgTV9MRFJEICBwUTBhLCBTdGVwYSwgcHBRMFN0ZXAKKworICAgICAgICBBTkQgICAgIHR1bnBrOSwgbWFza2EsIFExYQorICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFza2EsIFExYSwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazksIHR1bnBrOSwgUTBhLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBRMGEKKworICAgICAgICA7Ly8gdHVucGsxID0gW3IwcDAgcjBwMSByMnAwIHIycDFdCisgICAgICAgIDsvLyB0dW5wazIgPSBbcjFwMCByMXAxIHIzcDAgcjNwMV0KKyAgICAgICAgOy8vIHR1bnBrOSA9IFtyMHExIHIwcTAgcjJxMSByMnEwXQorICAgICAgICA7Ly8gdHVucGszID0gW3IxcTEgcjFxMCByM3ExIHIzcTBdCisKKyAgICAgICAgTU9WICAgICB0NCwgdHVucGsxLCBMU1IgIzE2CisgICAgICAgIE1PViAgICAgdDAsIHR1bnBrOSwgTFNSICMxNgorCisgICAgICAgIFNUUkggICAgdDQsW3BRMGEsICMyXSEgICAgICAgICAgOy8vU3RvcmVzIFtyMHAwIHIwcDFdCisgICAgICAgIFNUUkggICAgdDAsW3BRMGEsICMyXSAgICAgICAgICAgOy8vU3RvcmVzIFtyMHEwIHIwcTFdCisKKyAgICAgICAgTU9WICAgICB0NCwgdHVucGsyLCBMU1IgIzE2CisgICAgICAgIE1PViAgICAgdDAsIHR1bnBrMywgTFNSICMxNgorCisgICAgICAgIE1fU1RSSCAgdDQsW3BRMGEsIFN0ZXBhXSEgICAgICAgOy8vU3RvcmVzIFtyMXAwIHIxcDFdCisgICAgICAgIFNUUkggICAgdDAsW3BRMGEsICMyXSAgICAgICAgICAgOy8vU3RvcmVzIFtyMXEwIHIxcTFdCisgICAgICAgIAorICAgICAgICBNX1NUUkggIHR1bnBrMSxbcFEwYSwgU3RlcGFdISAgIDsvL1N0b3JlcyBbcjJwMCByMnAxXQorICAgICAgICBTVFJIICAgIHR1bnBrMixbcFEwYSwgU3RlcGFdICAgIDsvL1N0b3JlcyBbcjNwMCByM3AxXQorICAgICAgICBTVFJIICAgIHR1bnBrOSxbcFEwYSwgIzJdISAgICAgICAgOy8vU3RvcmVzIFtyMnEwIHIycTFdCisgICAgICAgIFNUUkggICAgdHVucGszLFtwUTBhLCBTdGVwYV0gICAgOy8vU3RvcmVzIFtyM3EwIHIzcTFdCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMGEsIFN0ZXBhLCBMU0wgIzEKKworICAgICAgICA7Ly8gTG9hZCBjb3VudGVyCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKworICAgICAgICA7Ly8gUmVsb2FkIFBpeGVscworICAgICAgICBNX0xEUiAgIHBfMCwgcFFfMworICAgICAgICBNT1YgICAgIHBfMiwgUTFhCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFgKKyAgICAgICAgCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKK0V4aXRMb29wWQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMTYKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgcEJTLCBwQlMsICMxNQorICAgICAgICBTVUIgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzE1CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgQk5FICAgICBMb29wWQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRU5ESUYgICAgICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlODM1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpAQCAtMCwwICsxLDc5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjCVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCisgKiBbaW5dCXNyY1N0ZXAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQorICogW2luXQlkc3RTdGVwIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGguCisgKiBbaW5dCWR4CQlGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAorICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KKyAqIFtpbl0JZHkJCUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAorICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KKyAqIFtpbl0Jcm9pCQlEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4KKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KKyAqIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgT01YX1N0c19CYWRBcmdFcnI6CisgKglwU3JjIG9yIHBEc3QgaXMgTlVMTC4KKyAqCXNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguCisgKglkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uCisgKglyb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4KKyAqCXNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyYywKKyAgICAgT01YX1MzMiBzcmNTdGVwLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBkeCwKKyAgICAgT01YX1MzMiBkeSwKKyAgICAgT01YU2l6ZSByb2kKKyApCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAorICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjExYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwpAQCAtMCwwICsxLDQyNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorOy8vCis7Ly8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hIGluIHY2IGFzc2VtYmx5LgorOy8vIFBlcmZvcm1zIHF1YXJ0ZXIgcGVsIGludGVycG9sYXRpb24gb2YgaW50ZXIgbHVtYSBNQi4KKzsvLyBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCis7Ly8gUGFyYW1ldGVyczoKKzsvLyBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCis7Ly8gW2luXSAgICBzcmNTdGVwICAgICBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCis7Ly8gW2luXSAgICBkc3RTdGVwICAgICBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoCis7Ly8gW2luXSAgICBkeCAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIGR5ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIHJvaSAgICAgICAgIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuCis7Ly8gW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vCis7Ly8gUmV0dXJuIFZhbHVlOgorOy8vIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KKzsvLyBJdCBpcyBhc3N1ZWQgdGhhdCBmb2xsb3dpbmcgY2FzZXMgYXJlIHNhdGlzZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgorOy8vICBwU3JjIG9yIHBEc3QgaXMgbm90IE5VTEwuCis7Ly8gIHNyY1N0ZXAgb3IgZHN0U3RlcCA+PSByb2kud2lkdGguCis7Ly8gICAgIGR4IG9yIGR5IGlzIGluIHRoZSByYW5nZSBbMC0zXS4KKzsvLyAgICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgbm90IG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgRHN0IGlzIDQgYnl0ZSBhbGlnbmVkLgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgcERzdCBpcyA4IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDE2LCBwRHN0IGlzIDE2IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgc3JjU3RlcCBhbmQgZHN0U3RlcCBpcyBtdWx0aXBsZSBvZiA4LgorOy8vCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorICAgICAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCisgICAgRU5ESUYKKworICAgIElGIEFSTTExMzZKUworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIEVORElGCisgICAgCisgICAgCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKK2lIZWlnaHQgICAgICAgICBSTiA0CitpV2lkdGggICAgICAgICAgUk4gNQorCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCitpZHggICAgICAgICAgICAgUk4gNgoraWR5ICAgICAgICAgICAgIFJOIDcKK2luZGV4ICAgICAgICAgICBSTiA2CitUZW1wICAgICAgICAgICAgUk4gMTIKK3BBcmdzICAgICAgICAgICBSTiAxMQorCisKKyAgICAgICAgOy8vIEVuZCBvZiBDb3J0ZXhBOAorICAgICAgICAgICAgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAorICAgIElGIEFSTTExMzZKUworCisKKyAgICAgICAgTV9BTExPQzQgcHBEc3QsIDgKKyAgICAgICAgTV9BTExPQzQgcHBTcmMsIDgKKyAgICAgICAgTV9BTExPQzQgcHBBcmdzLCAxNgorICAgICAgICBNX0FMTE9DNCBwQnVmZmVyLCAxMjAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTIwID0gMTJ4MTAKKyAgICAgICAgTV9BTExPQzggcEludGVyQnVmLCAxMjAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDEyMCA9IDEyKjUqMgorICAgICAgICBNX0FMTE9DOCBwVGVtcEJ1ZiwgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMzIgPSAgOCo0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIDsvLyBJbnRlcnBvbGF0aW9uIG9mIGx1bWEgaXMgaW1wbGVtZW50ZWQgYnkgcHJvY2Vzc2luZyBibG9jayBvZiBwaXhlbHMsIHNpemUgNHg0IGF0IGEgdGltZS4KKyAgICAgICAgOy8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIG1vdGlvbiB2ZWN0b3IgZnJhY3Rpb25hbCBwYXJ0cyAoZHgsZHkpLCBvbmUgb3V0IG9mIDE2IGNhc2VzIHdpbGwgYmUgcHJvY2Vzc2VkLgorICAgICAgICA7Ly8gUmVnaXN0ZXJzIHI0LCByNSwgcjYgdG8gYmUgcHJlc2VydmVkIGJ5IGludGVybmFsIHVuc2FmZSBmdW5jdGlvbnMKKyAgICAgICAgOy8vIHI0IC0gaUhlaWdodAorICAgICAgICA7Ly8gcjUgLSBpV2lkdGgKKyAgICAgICAgOy8vIHI2IC0gaW5kZXgKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgcjExCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lkeCAgICAgICAgICAgICBSTiA2CitpZHkgICAgICAgICAgICAgUk4gNworaW5kZXggICAgICAgICAgIFJOIDYKK1RlbXAgICAgICAgICAgICBSTiAxMgorcEFyZ3MgICAgICAgICAgIFJOIDExCisKK3BCdWYgICAgICAgICAgICBSTiA4CitIZWlnaHQgICAgICAgICAgUk4gOSAKK2J1ZlN0ZXAgICAgICAgICBSTiA5CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIHB0cmlkeCwgNAorICAgICAgICBNX0FSRyAgIHB0cmlkeSwgNCAgICAgICAgCisgICAgICAgIE1fQVJHICAgcHRyV2lkdGgsIDQKKyAgICAgICAgTV9BUkcgICBwdHJIZWlnaHQsIDQgICAgICAgIAorCisgICAgICAgIDsvLyBMb2FkIHN0cnVjdHVyZSBlbGVtZW50cyBvZiByb2kgCisgICAgICAgIE1fTERSICAgaWR4LCBwdHJpZHgKKyAgICAgICAgTV9MRFIgICBpZHksIHB0cmlkeQorICAgICAgICBNX0xEUiAgIGlXaWR0aCwgcHRyV2lkdGgKKyAgICAgICAgTV9MRFIgICBpSGVpZ2h0LCBwdHJIZWlnaHQKKyAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJyb2kud2lkdGggJWRcbiIsIGlXaWR0aAorICAgICAgICBNX1BSSU5URiAicm9pLmhlaWdodCAlZFxuIiwgaUhlaWdodAorCisgICAgICAgIEFERCAgICAgaW5kZXgsIGlkeCwgaWR5LCBMU0wgIzIgICAgICAgICAgICAgICAgIDsvLyAgW2luZGV4XSA9IFtpZHldW2lkeF0KKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisKK0ludGVycG9sYXRlTHVtYQorQmxvY2s0eDRXaWR0aExvb3AKK0Jsb2NrNHg0SGVpZ2h0TG9vcAorCisgICAgICAgIFNUTSAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgOy8vIHN3aXRjaCB0YWJsZSB1c2luZyBtb3Rpb24gdmVjdG9yIGFzIGluZGV4CisgICAgICAgIE1fU1dJVENIIGluZGV4LCBMCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8wCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8xCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8yCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8zCisgICAgICAgIE1fQ0FTRSAgQ2FzZV80CisgICAgICAgIE1fQ0FTRSAgQ2FzZV81CisgICAgICAgIE1fQ0FTRSAgQ2FzZV82CisgICAgICAgIE1fQ0FTRSAgQ2FzZV83CisgICAgICAgIE1fQ0FTRSAgQ2FzZV84CisgICAgICAgIE1fQ0FTRSAgQ2FzZV85CisgICAgICAgIE1fQ0FTRSAgQ2FzZV9hCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9iCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9jCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9kCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9lCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9mCisgICAgICAgIE1fRU5EU1dJVENICisKK0Nhc2VfMAorICAgICAgICA7Ly8gQ2FzZSBHCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDAgXG4iCisKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorCitDYXNlXzEKKyAgICAgICAgOy8vIENhc2UgYQorICAgICAgICBNX1BSSU5URiAiQ2FzZSAxIFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV8yCisgICAgICAgIDsvLyBDYXNlIGIKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMiBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzMKKyAgICAgICAgOy8vIENhc2UgYworICAgICAgICBNX1BSSU5URiAiQ2FzZSAzIFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV80CisgICAgICAgIDsvLyBDYXNlIGQKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNCBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfNQorICAgICAgICA7Ly8gQ2FzZSBlCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDUgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9CisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICAKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV82CisgICAgICAgIDsvLyBDYXNlIGYKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNiBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfNworICAgICAgICA7Ly8gQ2FzZSBnCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDcgXG4iCisgICAgICAgIAorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV84CisgICAgICAgIDsvLyBDYXNlIGgKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgOCBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzkKKyAgICAgICAgOy8vIENhc2UgaQorICAgICAgICBNX1BSSU5URiAiQ2FzZSA5IFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9hCisgICAgICAgIDsvLyBDYXNlIGoKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgYSBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2IKKyAgICAgICAgOy8vIENhc2UgaworICAgICAgICBNX1BSSU5URiAiQ2FzZSBiIFxuIgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYworICAgICAgICA7Ly8gQ2FzZSBuCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGMgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHBTcmMgdG8gb25lIHJvdyBkb3duCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2QKKyAgICAgICAgOy8vIENhc2UgcAorICAgICAgICBNX1BSSU5URiAiQ2FzZSBkIFxuIgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9CisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9lCisgICAgICAgIDsvLyBDYXNlIHEKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZSBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzQgICAgCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZgorICAgICAgICA7Ly8gQ2FzZSByCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGYgXG4iCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworQmxvY2s0eDRMb29wRW5kCisKKyAgICAgICAgOy8vIFdpZHRoIExvb3AKKyAgICAgICAgU1VCUyAgICBpV2lkdGgsIGlXaWR0aCwgIzQKKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisgICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAgOy8vIExvYWQgYXJndW1lbnRzCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzQgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0LCBwRHN0LCAjNAorICAgICAgICBCR1QgICAgIEJsb2NrNHg0V2lkdGhMb29wCisKKyAgICAgICAgOy8vIEhlaWdodCBMb29wCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzQKKyAgICAgICAgTV9MRFIgICBpV2lkdGgsIHB0cldpZHRoCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgIAorICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIGlXaWR0aAorICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGlXaWR0aAorICAgICAgICBCR1QgICAgIEJsb2NrNHg0SGVpZ2h0TG9vcAorCitFbmRPZkludGVycG9sYXRpb24KKyAgICAgICAgTU9WICAgICByMCwgIzAKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgICAgICAgICAgICAgICAgIAorCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmVkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKQEAgLTAsMCArMSw0OTQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgIAorICAgICBBUkVBIHRhYmxlLCBEQVRBICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9EQywgICAgIE9NWF9WQ19DSFJPTUFfSE9SIAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUgIAorICAgIAorICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgsMQorICAgIERDVyAgIDMsIDIsIDEsNCAKKyAgICBEQ1cgIC0zLC0yLC0xLDAKKyAgICBEQ1cgICAxLCAyLCAzLDQKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIENvbnN0YW50cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorCitCTEtfU0laRSAgICAgICAgRVFVIDB4OAorTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCitNQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKK01VTF9DT05TVDEgICAgICBFUVUgMHg4MDgwODA4MAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit5ICAgICAgICAgICAgICAgUk4gMTIgICAKK3BjICAgICAgICAgICAgICBSTiAxNSAgIAorcmV0dXJuICAgICAgICAgIFJOIDAgICAgCitwU3JjTGVmdDIgICAgICAgUk4gMSAgICAKK3BEc3QyICAgICAgICAgICBSTiAyICAgIAorc3VtMSAgICAgICAgICAgIFJOIDYgICAgCitzdW0yICAgICAgICAgICAgUk4gNyAgICAKK3BUYWJsZSAgICAgICAgICBSTiA5ICAgIAorZHN0U3RlcHgyICAgICAgIFJOIDExICAgCitsZWZ0U3RlcHgyICAgICAgUk4gMTQgICAKK291dGVyQ291bnQgICAgICBSTiAxNCAgIAorcjB4MDEwMTAxMDEgICAgIFJOIDEwICAgCityMHgwMEZGMDBGRiAgICAgUk4gMTEgICAKKwordFZhbDAgICAgICAgICAgIFJOIDAgICAgCit0VmFsMSAgICAgICAgICAgUk4gMSAgICAKK3RWYWwyICAgICAgICAgICBSTiAyICAgIAordFZhbDMgICAgICAgICAgIFJOIDMgICAgCit0VmFsNCAgICAgICAgICAgUk4gNCAgICAKK3RWYWw1ICAgICAgICAgICBSTiA1ICAgIAordFZhbDYgICAgICAgICAgIFJOIDYgICAgCit0VmFsNyAgICAgICAgICAgUk4gNyAgICAKK3RWYWw4ICAgICAgICAgICBSTiA4ICAgIAordFZhbDkgICAgICAgICAgIFJOIDkgICAgCit0VmFsMTAgICAgICAgICAgUk4gMTAgICAKK3RWYWwxMSAgICAgICAgICBSTiAxMSAgIAordFZhbDEyICAgICAgICAgIFJOIDEyICAgCit0VmFsMTQgICAgICAgICAgUk4gMTQgICAKKworYiAgICAgICAgICAgICAgIFJOIDE0ICAgCitjICAgICAgICAgICAgICAgUk4gMTIgICAKKworcDJwMCAgICAgICAgICAgIFJOIDAgICAgCitwM3AxICAgICAgICAgICAgUk4gMSAgICAKK3A2cDQgICAgICAgICAgICBSTiAyICAgIAorcDdwNSAgICAgICAgICAgIFJOIDQgICAgCisKK3BwMnBwMCAgICAgICAgICBSTiA2ICAgIAorcHAzcHAxICAgICAgICAgIFJOIDcgICAgCitwcDZwcDQgICAgICAgICAgUk4gOCAgICAKK3BwN3BwNSAgICAgICAgICBSTiA5ICAgIAorCitwMzIxMCAgICAgICAgICAgUk4gMTAgICAKK3A3NjU0ICAgICAgICAgICBSTiAxMCAgIAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIElucHV0IEFyZ3VtZW50cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4ICAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50CisgICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQorCitPTVhfVkNfQ0hST01BX0RDCisgICAgICAgIEFORCAgICAgIGF2YWlsYWJpbGl0eSwgYXZhaWxhYmlsaXR5LCMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICgjT01YX1ZDX1VQUEVSIHwgI09NWF9WQ19MRUZUKSkKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwCisgICAgICAgIEJORSAgICAgIFRTVF9VUFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBib3RoCisgICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDl9ICAgICAgICAgICAgIDsvLyB0VmFsIDggdG8gOSA9IHBTcmNBYm92ZVswIHRvIDddCisgICAgICAgIAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQorICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVBREQxNiAgIHN1bTEsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQorICAgICAgICBVQUREMTYgICBzdW0yLCB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQorICAgICAgICBVWFRIICAgICBzdW0xLCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKKyAgICAgICAgVVhUSCAgICAgc3VtMiwgc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMiAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gdFZhbDggKyB0VmFsOQorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbNV0KKyAgICAgICAgQUREICAgICAgdFZhbDE0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIAorICAgICAgICBMRFJCICAgICB0VmFsNCwgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQorICAgICAgICBMRFJCICAgICB0VmFsMTIsW3BTcmNMZWZ0Ml0gICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDE0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCisgICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIEFERCAgICAgIHRWYWwxNCwgdFZhbDgsIHRWYWw0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMiAgPSBzdW0ocFNyY0xlZnRbNF0gdG8gcFNyY0xlZnRbN10pCisgICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsMTQsICMyICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IGxlZnRzdW0yICsgMgorICAgICAgICBBREQgICAgICB0VmFsOSwgc3VtMiwgICAjMiAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB1cHN1bTIgKyAyCisgICAgICAgIEFERCAgICAgIHN1bTEsICBzdW0xLCB0VmFsMiAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gdXBzdW0xICsgbGVmdHN1bTEKKyAgICAgICAgQUREICAgICAgc3VtMiwgIHN1bTIsIHRWYWwxNCAgICAgICAgICAgICAgICAgOy8vIHN1bTIgPSB1cHN1bTIgKyBsZWZ0c3VtMgorICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KQorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyA0KQorICAgICAgICBNT1YgICAgICBzdW0xLCAgc3VtMSwgIExTUiAjMyAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KT4+MworICAgICAgICBNT1YgICAgICB0VmFsOSwgdFZhbDksIExTUiAjMiAgICAgICAgICAgICAgICA7Ly8gKHRWYWw5ICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgdFZhbDgsIHRWYWw4LCBMU1IgIzIgICAgICAgICAgICAgICAgOy8vICh0VmFsOCArIDIpPj4yCisgICAgICAgIE1PViAgICAgIHN1bTIsICBzdW0yLCAgTFNSICMzICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDQpPj4zCisgICAgICAgIAorICAgICAgICBNVUwgICAgICB0VmFsMCwgc3VtMSwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsMSwgdFZhbDkscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOSwgc3VtMiwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCAwIHRvIDEKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCAwIHRvIDEKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCAwIHRvIDEKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCAwIHRvIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDggdG8gOQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK1RTVF9VUFBFUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUiAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICAKKyAgICAgICAgQk5FICAgICAgVFNUX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKKyAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLHt0VmFsOCx0VmFsOX0gICAgICAgICAgICAgOy8vIHRWYWwgOCB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgVUFERDE2ICAgc3VtMSwgIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDksIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzUsIDddCisgICAgICAgIFVBREQxNiAgIHN1bTIsICB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQorICAgICAgICAKKyAgICAgICAgVVhUSCAgICAgc3VtMSwgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIFVYVEggICAgIHN1bTIsIHN1bTIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTIgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgKyAyCisgICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0yICsgMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgc3VtMSwgc3VtMSwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgc3VtMiwgc3VtMiwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIHN1bTEsIHN1bTEscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHN1bTIsIHN1bTIscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK1RTVF9MRUZUIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MyAgICAgICAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJORSAgICAgIFRTVF9DT1VOVDAKKyAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsbGVmdFN0ZXAgICAgICAgOy8vIGxlZnRTdGVweDIgPSAyICogbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzNdCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsOCArIHRWYWw5CisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs0XQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDQsIHRWYWwxMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsNCArIHRWYWwxMgorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs1XQorICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQorICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICBzdW0xLCAgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gc3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCisgICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIEFERCAgICAgIHN1bTIsICB0VmFsOCwgdFZhbDQgICAgICAgICAgICAgICAgIDsvLyBzdW0yICA9IHN1bShwU3JjTGVmdFs0XSB0byBwU3JjTGVmdFs3XSkKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0xICsgMgorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMiArIDIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHN1bTEsIHN1bTEsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDIpPj4yCisgICAgICAgIE1PViAgICAgIHN1bTIsIHN1bTIsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDIpPj4yCisgICAgICAgIAorICAgICAgICBNVUwgICAgICB0VmFsNiwgc3VtMSxyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOCwgc3VtMixyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgTU9WICAgICAgdFZhbDcsdFZhbDYgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gc3VtMQorICAgICAgICBNT1YgICAgICB0VmFsOSx0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSBzdW0yCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICAKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA4IHRvIDkKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA4IHRvIDkKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA4IHRvIDkKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA4IHRvIDkKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisKK1RTVF9DT1VOVDAKKyAgICAgICAgTERSICAgICAgc3VtMSwgPU1VTF9DT05TVDEgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSA9IDB4ODA4MDgwODAgaWYoY291bnQgPT0gMCkKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB0VmFsNywgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBzdW0xCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworT01YX1ZDX0NIUk9NQV9IT1IKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsIGxlZnRTdGVwICAgICAgOy8vIGxlZnRTdGVweDIgPSBsZWZ0U3RlcCAqIDIKKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyID0gcERzdCArIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIFNVQiAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcHgyLCAjNCAgICAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcCAgbWludXMgNAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAgICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCisgICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzNdCisgICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw5LCB0VmFsOSwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10gCisgICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQorICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10KKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsOCwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCisgICAgICAgIE1fU1RSICAgIHRWYWw5LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbNF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbNV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbN10KKyAgICAgICAgTVVMICAgICAgdFZhbDYsIHRWYWw2LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXSAKKyAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCisgICAgICAgIE1fU1RSICAgIHRWYWw3LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXQorICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KKyAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK09NWF9WQ19DSFJPTUFfVkVSVAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCB7dFZhbDYsdFZhbDd9ICAgICAgICAgICAgOy8vIHRWYWwgNiB0byA3ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA2IHRvIDcKKworICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfQ0hST01BX1BMQU5FCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgUlNCICAgICAgdFZhbDE0LCBsZWZ0U3RlcCwgbGVmdFN0ZXAsIExTTCAjMyAgOy8vIDcqbGVmdFN0ZXAKKyAgICAgICAgTERSQiAgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMrN10gICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs3XQorICAgICAgICBMRFJCICAgICB0VmFsNiwgW3BTcmNMZWZ0LCArdFZhbDE0XSAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0KKyAgICAgICAgTERSQiAgICAgdFZhbDgsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsICMrNiBdICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs2XQorICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzBdCisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbN10gKyBwU3JjTGVmdFs3KmxlZnRTdGVwXQorICAgICAgICBTVUIgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gVjAgPSBwU3JjTGVmdFs3KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIEgwID0gcFNyY0Fib3ZlWzddIC0gcFNyY0Fib3ZlTGVmdFswXSAgICAgICAgCisgICAgICAgIExTTCAgICAgIHRWYWwyLCB0VmFsMiwgIzQgICAgICAgICAgICAgICAgICAgIDsvLyBhID0gMTYgKiAocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxTXSkKKyAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWwyLCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNgorICAgICAgICBTVUIgICAgICB0VmFsOSwgdFZhbDksdFZhbDEwICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdCisgICAgICAgIExEUkIgICAgIHRWYWw4LCBbcFNyY0Fib3ZlLCMrNV0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0KKyAgICAgICAgTERSQiAgICAgdFZhbDEwLFtwU3JjQWJvdmUsIysxXSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxXQorICAgICAgICBBREQgICAgICB0VmFsOSwgdFZhbDksIHRWYWw5LCBMU0wgIzEgICAgICAgICA7Ly8gSDEgPSAzICogKHBTcmNBYm92ZVs2XSAtIHBTcmNBYm92ZVswXSkKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw5LCB0VmFsNywgTFNMICMyICAgICAgICAgOy8vIEggPSBIMSArIEgwCisgICAgICAgIFNVQiAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0gLSBwU3JjQWJvdmVbMV0KKyAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsIys0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XQorICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZSwjKzJdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzJdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyBIID0gSCArIEgyCisgICAgICAgIFNVQiAgICAgIHRWYWwxMSwgdFZhbDE0LGxlZnRTdGVwICAgICAgICAgICAgIDsvLyA2KmxlZnRTdGVwCisgICAgICAgIEFERCAgICAgIHRWYWwxMSwgcFNyY0xlZnQsIHRWYWwxMSAgICAgICAgICAgIDsvLyBwU3JjTGVmdCArIDYqbGVmdFN0ZXAKKyAgICAgICAgTU9WICAgICAgdFZhbDEyLCBwU3JjTGVmdCAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0CisgICAgICAgIFNVQiAgICAgIHRWYWw5LCB0VmFsOSwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNF0gLSBwU3JjQWJvdmVbMl0KKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIEggPSBIICsgSDMKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswXQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIHRWYWw3LCBMU0wgIzQgICAgICAgICA7Ly8gMTcgKiBICisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNyAqIEggKyAxNgorICAgICAgICBTVUIgICAgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXQorICAgICAgICBBU1IgICAgICBiLCB0VmFsNywgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYiA9ICgxNyAqIEggKyAxNikgPj4gNQorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gVjEgPSAzICogKHBTcmNMZWZ0WzYqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMF0pCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsOCwgdFZhbDYsIExTTCAjMiAgICAgICAgIDsvLyBWID0gVjAgK1YxCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbdFZhbDExXSwtbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsW3RWYWwxMl0sK2xlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiLCBMU0wgIzEgICAgICAgICAgICAgICAgIDsvLyAzKmIKKyAgICAgICAgU1VCICAgICAgdFZhbDIsIHRWYWwyLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNiAtIDMqYgorICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXSAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDcsIExTTCAjMSAgICAgICAgIDsvLyBWID0gViArIFYyCisgICAgICAgIExEUiAgICAgIHIweDAwRkYwMEZGLCA9TUFTS19DT05TVCAgICAgICAgICAgIDsvLyByMHgwMEZGMDBGRiA9IDB4MDBGRjAwRkYKKyAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIFYgPSBWICsgVjcKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzQgICAgICAgICAgICAgICAgOy8vIGRzdFN0ZXAgLSA0CisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDYsIExTTCAjNCAgICAgICAgIDsvLyAxNypWCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNypWICsgMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBU1IgICAgICBjLCB0VmFsNiwgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYyA9ICgxNypWICsgMTYpPj41CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDYsIGMsIGMsIExTTCAjMSAgICAgICAgICAgICAgICAgOy8vIDMqYworICAgICAgICBVWFRIICAgICBjLCBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb25seSBpbiBoYWxmIHdvcmQKKyAgICAgICAgU1VCICAgICAgdFZhbDYsIHRWYWwyLCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIGEgLSAzKmIgLSAzKmMgKyAxNgorICAgICAgICBPUlIgICAgICBjLCBjLCBjLCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8gYyBjCisgICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAyYgorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gcHAyID0gZCArIDIqYgorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIGIgICAgICAgICAgICAgICAgICAgICA7Ly8gM2IKKyAgICAgICAgT1JSICAgICAgcDJwMCwgICB0VmFsNiwgIHRWYWwyLCAgTFNMICMxNiAgICAgOy8vIHAycDAgICA9IHBhY2sge3AyLCBwMH0KKyAgICAgICAgVVhUSCAgICAgYiwgYgorICAgICAgICBVWFRIICAgICB0VmFsNywgdFZhbDcKKyAgICAgICAgT1JSICAgICAgYiwgYiwgYiwgTFNMICMxNiAgICAgICAgICAgICAgICAgICAgOy8vIHtiLGJ9CisgICAgICAgIE9SUiAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDcsIExTTCAjMTYgICAgICAgIDsvLyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDJwMCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwM3AxICAgPSBwMnAwICsge2IsYn0KKyAgICAgICAgU0FERDE2ICAgcDZwNCwgICBwM3AxLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIHA2cDQgICA9IHAzcDEgKyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDZwNCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwN3A1ICAgPSBwNnA0ICsge2IsYn0KKyAgICAgICAgTU9WICAgICAgb3V0ZXJDb3VudCwgI0JMS19TSVpFICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQgICAgICAgIAorICAgICAgICAKK0xPT1BfUExBTkUgICAgICAgIAorCisgICAgICAgIFVTQVQxNiAgIHA3cDUsICAgIzEzLCBwN3A1ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA3KSBjbGlwMTMocDUpCisgICAgICAgIFVTQVQxNiAgIHA2cDQsICAgIzEzLCBwNnA0ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA2KSBjbGlwMTMocDQpCisgICAgICAgIFVTQVQxNiAgIHAzcDEsICAgIzEzLCBwM3AxICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAzKSBjbGlwMTMocDEpCisgICAgICAgIFVTQVQxNiAgIHAycDAsICAgIzEzLCBwMnAwICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAyKSBjbGlwMTMocDApCisgICAgICAgIAorICAgICAgICBBTkQgICAgICBwcDdwcDUsIHIweDAwRkYwMEZGLCBwN3A1LCBBU1IgIzUgICAgOy8vIGNsaXA4KHA3KSBjbGlwOChwNSkKKyAgICAgICAgQU5EICAgICAgcHA2cHA0LCByMHgwMEZGMDBGRiwgcDZwNCwgQVNSICM1ICAgIDsvLyBjbGlwOChwNikgY2xpcDgocDQpCisgICAgICAgIEFORCAgICAgIHBwM3BwMSwgcjB4MDBGRjAwRkYsIHAzcDEsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDMpIGNsaXA4KHAxKQorICAgICAgICBBTkQgICAgICBwcDJwcDAsIHIweDAwRkYwMEZGLCBwMnAwLCBBU1IgIzUgICAgOy8vIGNsaXA4KHAyKSBjbGlwOChwMCkKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgIG91dGVyQ291bnQsIG91dGVyQ291bnQsICMxICAgICAgICAgICA7Ly8gb3V0ZXJDb3VudC0tCisgICAgICAKKyAgICAgICAgT1JSICAgICAgcDMyMTAsIHBwMnBwMCwgcHAzcHAxLCBMU0wgIzggICAgICAgIDsvLyBwYWNrIHtwMyxwMiwgcDEsIHAwfQorICAgICAgICBTVFIgICAgICBwMzIxMCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtwRHN0WzBdIHRvIHBEc3RbM119ICAKKyAgICAgICAgCisgICAgICAgIE9SUiAgICAgIHA3NjU0LCBwcDZwcDQsIHBwN3BwNSwgTFNMICM4ICAgICAgICA7Ly8gcGFjayB7cDcscDYsIHA1LCBwNH0KKyAgICAgICAgTV9TVFIgICAgcDc2NTQsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7cERzdFs0XSB0byBwRHN0WzddfQorCisgICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDdwNSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A3ICsgY30sIHtwNSArIGN9CisgICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDZwNCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A2ICsgY30sIHtwNCArIGN9CisgICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDNwMSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AzICsgY30sIHtwMSArIGN9CisgICAgICAgIFNBREQxNiAgIHAycDAsICAgcDJwMCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AyICsgY30sIHtwMCArIGN9CisgICAgICAKKyAgICAgICAgQk5FICAgICAgTE9PUF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTU3MjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKQEAgLTAsMCArMSw1MDEgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMgICAgCisgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2CisgICAgRENEICBPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUiAKKyAgICBEQ0QgIE9NWF9WQ18xNlgxNl9EQywgICBPTVhfVkNfMTZYMTZfUExBTkUKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBDb25zdGFudHMgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitCTEtfU0laRSAgICAgICAgRVFVIDB4MTAKK01VTF9DT05TVDAgICAgICBFUVUgMHgwMTAxMDEwMQorTVVMX0NPTlNUMSAgICAgIEVRVSAweDAwMDYwMDA0CitNVUxfQ09OU1QyICAgICAgRVFVIDB4MDAwNzAwMDUKK01VTF9DT05TVDMgICAgICBFUVUgMHgwMDAzMDAwMQorTUFTS19DT05TVCAgICAgIEVRVSAweDAwRkYwMEZGCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3kgICAgICAgICAgICAgICBSTiAxMiAgIAorcGMgICAgICAgICAgICAgIFJOIDE1ICAgCisKK3JldHVybiAgICAgICAgICBSTiAwICAgIAoraW5uZXJDb3VudCAgICAgIFJOIDAgICAgCitvdXRlckNvdW50ICAgICAgUk4gMSAgICAKK3BTcmNMZWZ0MiAgICAgICBSTiAxICAgIAorcERzdDIgICAgICAgICAgIFJOIDIgICAgCitzdW0gICAgICAgICAgICAgUk4gNiAgICAKK3BUYWJsZSAgICAgICAgICBSTiA5ICAgIAordGVtcDEgICAgICAgICAgIFJOIDEwICAgCit0ZW1wMiAgICAgICAgICAgUk4gMTIgICAKK2NNdWwxICAgICAgICAgICBSTiAxMSAgIAorY011bDIgICAgICAgICAgIFJOIDEyICAgCitjb3VudCAgICAgICAgICAgUk4gMTIgICAKK2RzdFN0ZXB4MiAgICAgICBSTiAxMSAgIAorbGVmdFN0ZXB4MiAgICAgIFJOIDE0ICAgCityMHgwMTAxMDEwMSAgICAgUk4gMTAgICAKK3IweDAwRkYwMEZGICAgICBSTiAxMQorCit0VmFsMCAgICAgICAgICAgUk4gMCAgICAKK3RWYWwxICAgICAgICAgICBSTiAxICAgIAordFZhbDIgICAgICAgICAgIFJOIDIgICAgCit0VmFsMyAgICAgICAgICAgUk4gMyAgICAKK3RWYWw0ICAgICAgICAgICBSTiA0ICAgIAordFZhbDUgICAgICAgICAgIFJOIDUgICAgCit0VmFsNiAgICAgICAgICAgUk4gNiAgICAKK3RWYWw3ICAgICAgICAgICBSTiA3ICAgIAordFZhbDggICAgICAgICAgIFJOIDggICAgCit0VmFsOSAgICAgICAgICAgUk4gOSAgICAKK3RWYWwxMCAgICAgICAgICBSTiAxMCAgIAordFZhbDExICAgICAgICAgIFJOIDExICAgCit0VmFsMTIgICAgICAgICAgUk4gMTIgICAKK3RWYWwxNCAgICAgICAgICBSTiAxNCAgIAorCitiICAgICAgICAgICAgICAgUk4gMTIgICAKK2MgICAgICAgICAgICAgICBSTiAxNCAgIAorCitwMnAwICAgICAgICAgICAgUk4gMCAgICAKK3AzcDEgICAgICAgICAgICBSTiAxICAgIAorcDZwNCAgICAgICAgICAgIFJOIDIgICAgCitwN3A1ICAgICAgICAgICAgUk4gNCAgICAKK3AxMHA4ICAgICAgICAgICBSTiA2ICAgIAorcDExcDkgICAgICAgICAgIFJOIDcgICAgCitwMTRwMTIgICAgICAgICAgUk4gOCAgICAKK3AxNXAxMyAgICAgICAgICBSTiA5ICAgIAorCitwMzIxMCAgICAgICAgICAgUk4gMTAgICAKK3A3NjU0ICAgICAgICAgICBSTiAxMCAgIAorcDExMTA5OCAgICAgICAgIFJOIDEwICAgCitwMTUxNDEzMTIgICAgICAgUk4gMTAgICAKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAorICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0CisgICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2IDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisgICAgICAgIAorT01YX1ZDXzE2WDE2X1ZFUlQKKyAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9Oy8vIHRWYWwgNiB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gMTVdCisgICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDItIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdGFsbCBvdXRzaWRlIHRoZSBsb29wCisKK0xPT1BfVkVSVAorICAgICAgICBTVE0gICAgICBwRHN0LCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgICA7Ly8gcERzdFswIHRvIDE1XSA9IHRWYWwgNiB0byA5CisgICAgICAgIFNVQlMgICAgIHksIHksICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KKyAgICAgICAgQUREICAgICAgcERzdCwgcERzdCwgZHN0U3RlcHgyICAgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBTVE0gICAgICBwRHN0Miwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICA7Ly8gcERzdDJbMTYgdG8gMzFdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QyLCBkc3RTdGVweDIgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBCTkUgICAgICBMT09QX1ZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgOCB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorCisgICAgICAgIAorT01YX1ZDXzE2WDE2X0hPUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTYgCisgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwICAgICAgICAgICAgOy8vIENvbnN0IHRvIHJlcGVhdCB0aGUgYnl0ZSBpbiByZWcgNCB0aW1lcworICAgICAgICBNT1YgICAgICB5LCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICBNX0xEUkIgICB0VmFsNiwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDYgPSBwU3JjTGVmdFswIHRvIDNdCisgICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsMSA9IHBTcmNMZWZ0WzQgdG8gN10KKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIFNVQiAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcHgyLCAjMTIgICAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcCAgbWludXMgMTIKKyAgICAgICAKK0xPT1BfSE9SICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMCB0byAzXQorICAgICAgICBNVUwgICAgICB0VmFsNiwgdFZhbDYsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs0IHRvIDddCisgICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIFNVQlMgICAgIHksIHksICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFswIHRvIDNdIAorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbOCB0byAxMV0KKyAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbOCB0byAxMV0KKyAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgZHN0U3RlcHgyICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFsxMiB0byAxNV0KKyAgICAgICAgTV9TVFIgICAgdFZhbDcsIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMTIgdG8gMTVdCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMCB0byAzXSAKKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzQgdG8gN10KKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzggdG8gMTFdCisgICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzggdG8gMTFdCisgICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sIGRzdFN0ZXB4MiAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMTIgdG8gMTVdCisgICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMTIgdG8gMTVdCisgICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzQgdG8gN10KKyAgICAgICAgQk5FICAgICAgTE9PUF9IT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDMgdGltZXMKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfREMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY291bnQgPSAwCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUiAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICBCRVEgICAgICBUU1RfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgorICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUse3RWYWw4LHRWYWw5LHRWYWwxMCx0VmFsMTF9Oy8vIHRWYWwgOCB0byAxMSA9IHBTcmNBYm92ZVswIHRvIDE1XQorICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgdXBwZXIgaW5jIGNvdW50IGJ5IDEKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsMiwgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw2LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgVUFERDE2ICAgdFZhbDIsIHRWYWwyLCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsOSwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNSwgN10KKyAgICAgICAgVUFERDE2ICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXSArIHBTcmNBYm92ZVs1LCA3XQorICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbN10pCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzgsIDEwXQorICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEyLCAxNF0KKyAgICAgICAgVUFERDE2ICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs4LCAxMF0gKyBwU3JjQWJvdmVbMTIsIDE0XQorICAgICAgICBVWFRCMTYgICB0VmFsMTAsIHRWYWwxMCwgUk9SICM4ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzksIDExXQorICAgICAgICBVWFRCMTYgICB0VmFsMTEsIHRWYWwxMSwgUk9SICM4ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEzLCAxNV0KKyAgICAgICAgVUFERDE2ICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs5LCAxMV0gKyBwU3JjQWJvdmVbMTMsIDE1XQorICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs4XSB0byBwU3JjQWJvdmVbMTVdKQorICAgICAgICAKKyAgICAgICAgVUFERDE2ICAgdFZhbDIsIHRWYWwyLCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzE1XSkKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDIsIHRWYWwyLCBMU1IgIzE2ICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbMTVdKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEggICAgIHN1bSwgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeHRyYWN0IHRoZSBsb3dlciBoYWxmIGZvciByZXN1bHQKKyAgICAgICAgCitUU1RfTEVGVCAgICAgICAgCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJFUSAgICAgIFRTVF9DT1VOVAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMD0gcFNyY0xlZnRbMl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDExLCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMT0gcFNyY0xlZnRbM10KKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICA7Ly8gSW5jIENvdW50ZXIgaWYgTGVmdCBpcyBhdmFpbGFibGUKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gdFZhbDEwICsgdFZhbDExCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBzdW0sIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgQUREICAgICAgc3VtLCBzdW0sIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bSArIHRWYWw3CisKK1RTVF9DT1VOVCAgICAgICAgCisgICAgICAgIENNUCAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAwKQorICAgICAgICBNT1ZFUSAgICBzdW0sICMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gMTI4IGlmKGNvdW50ID09IDApCisgICAgICAgIEJFUSAgICAgIFRTVF9DT1VOVDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAwKQorICAgICAgICBDTVAgICAgICBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYoY291bnQgPT0gMSkKKyAgICAgICAgQURERVEgICAgc3VtLCBzdW0sICM4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSArPSA4IGlmKGNvdW50ID09IDEpCisgICAgICAgIEFERE5FICAgIHN1bSwgc3VtLCB0VmFsMiAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW1sZWZ0ICsgc3VtdXBwZXIKKyAgICAgICAgQURETkUgICAgc3VtLCBzdW0sICMxNiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSArPSAxNiBpZihjb3VudCA9PSAyKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEggICAgIHN1bSwgc3VtICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gb25seSBieXRlIHJlc3QgY2xlYXJlZAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIExTUkVRICAgIHN1bSwgc3VtLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPj4gNCBpZihjb3VudCA9PSAxKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIExTUk5FICAgIHN1bSwgc3VtLCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPj4gNSBpZihjb3VudCA9PSAyKQorCitUU1RfQ09VTlQwCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgT1JSICAgICAgc3VtLCBzdW0sIHN1bSwgTFNMICM4ICAgICAgICAgICAgICAgOy8vIHN1bSByZXBsaWNhdGVkIGluIHR3byBoYWxmd29yZAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE9SUiAgICAgIHRWYWw2LCBzdW0sIHN1bSwgTFNMICMxNiAgICAgICAgICAgIDsvLyBzdW0gIHJlcGxpY2F0ZWQgaW4gYWxsIGJ5dGVzCisgICAgICAgIENQWSAgICAgIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMSA9IHRWYWwwCisgICAgICAgIENQWSAgICAgIHRWYWw4LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IHRWYWwwCisgICAgICAgIENQWSAgICAgIHRWYWw5LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMyA9IHRWYWwwCisgICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDItIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICAKK0xPT1BfREMgICAgICAgIAorICAgICAgICBTVE0gICAgICBwRHN0LCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgICA7Ly8gcERzdFswIHRvIDE1XSA9IHRWYWwgNiB0byA5CisgICAgICAgIFNVQlMgICAgIHksIHksICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KKyAgICAgICAgQUREICAgICAgcERzdCwgcERzdCwgZHN0U3RlcHgyICAgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBTVE0gICAgICBwRHN0Miwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICA7Ly8gcERzdDJbMTYgdG8gMzFdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QyLCBkc3RTdGVweDIgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBCTkUgICAgICBMT09QX0RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgOCB0aW1lcworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKworT01YX1ZDXzE2WDE2X1BMQU5FCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICBSU0IgICAgICB0VmFsMTQsIGxlZnRTdGVwLCBsZWZ0U3RlcCwgTFNMICM0ICA7Ly8gdFZhbDE0ID0gMTUqbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIExEUkIgICAgIHRWYWwxMCwgW3BTcmNMZWZ0LCAgdFZhbDE0XSAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0KKyAgICAgICAgTERSQiAgICAgdFZhbDExLCBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgOy8vIHRWYWwxMSA9IHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgTERSQiAgICAgdFZhbDEyLCBbcFNyY0Fib3ZlLCAjMTVdCisKKyAgICAgICAgQUREICAgICAgdFZhbDIsICB0VmFsMTIsICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0KKyAgICAgICAgU1VCICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTEgICAgICAgICAgICAgOy8vIHRWYWwxMCA9IFYwID0gcFNyY0xlZnRbMTUqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBTVUIgICAgICB0VmFsMTEsIHRWYWwxMiwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDExID0gSDAgPSBwU3JjQWJvdmVbMTVdIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBNT1YgICAgICB0VmFsMiwgIHRWYWwyLCAgIExTTCAjNCAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gYSA9IDE2ICogKHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0pCisKKyAgICAgICAgTU9WICAgICB0VmFsMTEsIHRWYWwxMSwgTFNMICMzICAgICAgICAgICAgICA7Ly8gOCpbMTVdLVstMV0KKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzBdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxNF0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIFJTQiAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMzICAgICAgICAgOy8vIDcqWzE0XS1bMF0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzFdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxM10KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOAorICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyA2KlsxM10tWzFdCisgICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4CisgICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMyXQorICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTJdCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgorICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMiAgICAgICAgIDsvLyA1KlsxMl0tWzJdCisgICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4CisgICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMzXQorICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTFdCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgorICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgTFNMICMyICAgICAgIDsvLyArIDQqWzExXS1bM10KKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzRdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMF0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIDMqWzEwXS1bNF0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzVdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICM5XQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgsIExTTCAjMSAgICAgICA7Ly8gKyAyKls5XS1bNV0KKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzZdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICM4XQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyAxKls4XS1bNl0KKyAgICAgICAgQUREICAgICB0VmFsNywgdFZhbDExLCB0VmFsOAorCisgICAgICAgIEFERCAgICAgIHRWYWwyLCAgdFZhbDIsICAgIzE2ICAgICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhICsgMTYKKyAgICAgICAgTU9WICAgICAgdFZhbDEsICBwU3JjTGVmdCAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw0ICA9IHBTcmNMZWZ0CisgICAgICAgIFNVQiAgICAgIHRWYWw5LCAgdFZhbDE0LCAgIGxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOSAgPSAxNCpsZWZ0U3RlcAorICAgICAgICBBREQgICAgICB0VmFsOSwgIHBTcmNMZWZ0LCB0VmFsOSAgICAgICAgICAgICA7Ly8gdFZhbDkgID0gcFNyY0xlZnQgKyAxNCpsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzE0KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDExID0gcFNyY0xlZnRbMF0KKyAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgIHRWYWw3LCAgTFNMICMyICAgICAgOy8vIHRWYWw3ICA9IDUgKiBICisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAjMzIgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSA1ICogSCArIDMyCisgICAgICAgIFNVQiAgICAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxNCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXQorICAgICAgICBBU1IgICAgICB0VmFsMTIsIHRWYWw3LCAgIzYgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyID0gYiA9ICg1ICogSCArIDMyKSA+PiA2CisgICAgICAgIAorICAgICAgICBSU0IgICAgICB0VmFsOCwgIHRWYWw4LCAgdFZhbDgsICBMU0wgIzMgICAgICA7Ly8gdFZhbDggID0gVjEgPSA3KiAocFNyY0xlZnRbMTQqbGVmdFN0ZXBdLXBTcmNMZWZ0WzBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw4LCAgdFZhbDEwLCBMU0wgIzMgICAgICA7Ly8gdFZhbDYgID0gViA9IFYwICtWMQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTMqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgUlNCICAgICAgdFZhbDcsICB0VmFsMTIsICB0VmFsMTIsICBMU0wgIzMgICAgOy8vIHRWYWw3ICA9IDcqYgorICAgICAgICBTVUIgICAgICB0VmFsMiwgIHRWYWwyLCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gYSArIDE2IC0gNypiCisgICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMypsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzEyKmxTXQorICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gMiAqIChwU3JjTGVmdFsxMypsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0pCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFsyKmxlZnRTdGVwXSAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNyAgPSA2ICogKHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXSkKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjIKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzEyKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMSpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzIgICAgIDsvLyB0VmFsNyAgPSA1ICogKHBTcmNMZWZ0WzEyKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWMworICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTEqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzEwKmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNywgIExTTCAjMiAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjQKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzE2ICAgICAgICAgICAgICAgOy8vIHRWYWw1ICA9IGRzdFN0ZXAgLSAxNgorICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTAqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzkqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3LCAgTFNMICMxICAgICA7Ly8gdFZhbDcgID0gMyAqIChwU3JjTGVmdFsxMCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs0KmxlZnRTdGVwXSkKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjUKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzkqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzgqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs2KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3LCAgTFNMICMxICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzgqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjcKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDYsICBMU0wgIzIgICAgIDsvLyB0VmFsNiAgPSA1KlYKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICAjMzIgICAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IDUqViArIDMyCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICBBU1IgICAgICB0VmFsMTQsIHRWYWw2LCAgICM2ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gYyA9ICg1KlYgKyAzMik+PjYKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIFJTQiAgICAgIHRWYWw2LCAgdFZhbDE0LCAgdFZhbDE0LCBMU0wgIzMgICAgIDsvLyB0VmFsNiAgPSA3KmMKKyAgICAgICAgVVhUSCAgICAgdFZhbDE0LCB0VmFsMTQgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMiwgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEwID0gMipiCisgICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDE0LCAgdFZhbDE0LCBMU0wgIzE2ICAgIDsvLyB0VmFsMTQgPSB7YyAgLCAgY30KKyAgICAgICAgU1VCICAgICAgdFZhbDYsICB0VmFsMiwgICB0VmFsNiAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IGQgPSBhIC0gNypiIC0gNypjICsgMTYKKyAgICAgICAgQUREICAgICAgdFZhbDEsICB0VmFsNiwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwxICA9IHBwMiA9IGQgKyAyKmIKKyAgICAgICAgQUREICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxMCA9MypiCisgICAgICAgIE9SUiAgICAgIHRWYWwwLCAgdFZhbDYsICAgdFZhbDEsICBMU0wgIzE2ICAgIDsvLyB0dmFsMCAgPSBwMnAwICAgPSBwYWNrIHtwMiwgcDB9CisgICAgICAgIFVYVEggICAgIHRWYWwxMiwgdFZhbDEyICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgPSBDbGVhcmVkIHRoZSB1cHBlciBoYWxmIHdvcmQKKyAgICAgICAgVVhUSCAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMiA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAorICAgICAgICBPUlIgICAgICB0VmFsMTIsIHRWYWwxMiwgIHRWYWwxMiwgTFNMICMxNiAgICA7Ly8gdFZhbDEyID0ge2IgICwgIGJ9CisgICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCAgdFZhbDEwLCBMU0wgIzE2ICAgIDsvLyB0VmFsMTAgPSB7M2IgLCAzYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDEsICB0VmFsMCwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxICA9IHAzcDEgICA9IHAycDAgICArIHtiLGJ9CisgICAgICAgIFNBREQxNiAgIHRWYWwyLCAgdFZhbDEsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBwNnA0ICAgPSBwM3AxICAgKyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHRWYWw0LCAgdFZhbDIsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsNCAgPSBwN3A1ICAgPSBwNnA0ICAgKyB7YixifQorICAgICAgICBTQUREMTYgICB0VmFsNiwgIHRWYWw0LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gcDEwcDggID0gcDdwNSAgICsgezNiLDNifQorICAgICAgICBTQUREMTYgICB0VmFsNywgIHRWYWw2LCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcDExcDkgID0gcDEwcDggICsge2IsYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDgsICB0VmFsNywgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw4ICA9IHAxNHAxMiA9IHAxMXA5ICArIHszYiwzYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDksICB0VmFsOCwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWw5ICA9IHAxNXAxMyA9IHAxNHAxMiArIHtiLGJ9CisgICAgICAgIExEUiAgICAgIHIweDAwRkYwMEZGLCAgICAgPU1BU0tfQ09OU1QgICAgICAgIDsvLyByMHgwMEZGMDBGRiA9IDB4MDBGRjAwRkYKKyAgICAgICAgCitMT09QX1BMQU5FICAgICAgICAKKworICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwM3AxCisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAycDAKKyAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwM3AxLCAgIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICBwMnAwLCAgIHAycDAsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQorICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKKyAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4CisgICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0CisgICAgICAgIAorICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwN3A1CisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHA2cDQKKyAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwN3A1LCAgIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICBwNnA0LCAgIHA2cDQsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQorICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKKyAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4CisgICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0CisgICAgICAgIAorICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwMTFwOQorICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwMTBwOAorICAgICAgICBTQUREMTYgICBwMTFwOSwgIHAxMXA5LCAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgIHAxMHA4LCAgcDEwcDgsICBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1CisgICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQorICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKKyAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAxNXAxMworICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwMTRwMTIKKyAgICAgICAgU0FERDE2ICAgcDE1cDEzLCBwMTVwMTMsIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICBwMTRwMTIsIHAxNHAxMiwgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQorICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKKyAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4CisgICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0CisgICAgICAgIAorICAgICAgICBBRERTICAgICByMHgwMEZGMDBGRiwgcjB4MDBGRjAwRkYsICMxPDwyOCAgICAgOy8vIExvb3AgY291bnRlciB2YWx1ZSBpbiB0b3AgNCBiaXRzCisgICAgICAgIAorICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgQkNDICAgICAgTE9PUF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciAxNiB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKyAgICAgICAgICAgIAorICAgICAgICBFTkQKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBlbmRzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBmNDYwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpAQCAtMCwwICsxLDU2NyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQorICAgICAgICAgCisgICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKKzsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0CisgICAgRENEICBPTVhfVkNfNHg0X1ZFUlQsICAgICBPTVhfVkNfNHg0X0hPUiAKKyAgICBEQ0QgIE9NWF9WQ180eDRfREMsICAgICAgIE9NWF9WQ180eDRfRElBR19ETAorICAgIERDRCAgT01YX1ZDXzR4NF9ESUFHX0RSLCAgT01YX1ZDXzR4NF9WUgorICAgIERDRCAgT01YX1ZDXzR4NF9IRCwgICAgICAgT01YX1ZDXzR4NF9WTAorICAgIERDRCAgT01YX1ZDXzR4NF9IVSAgIAorICAgIAorICAgIElGIEFSTTExMzZKUworICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gQ29uc3RhbnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitCTEtfU0laRSAgICAgICAgICAgICAgRVFVIDB4OAorTVVMX0NPTlNUMCAgICAgICAgICAgIEVRVSAweDAxMDEwMTAxCitBRERfQ09OU1QxICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmV0dXJuICAgICAgICAgIFJOIDAKK3BUYWJsZSAgICAgICAgICBSTiA5CitwYyAgICAgICAgICAgICAgUk4gMTUKK3IweDAxMDEwMTAxICAgICBSTiAxCityMHg4MDgwODA4MCAgICAgUk4gMAorCit0VmFsMCAgICAgICAgICAgUk4gMAordFZhbDEgICAgICAgICAgIFJOIDEKK3RWYWwyICAgICAgICAgICBSTiAyCit0VmFsNCAgICAgICAgICAgUk4gNAordFZhbDYgICAgICAgICAgIFJOIDYKK3RWYWw3ICAgICAgICAgICBSTiA3Cit0VmFsOCAgICAgICAgICAgUk4gOAordFZhbDkgICAgICAgICAgIFJOIDkKK3RWYWwxMCAgICAgICAgICBSTiAxMAordFZhbDExICAgICAgICAgIFJOIDExCit0VmFsMTIgICAgICAgICAgUk4gMTIKK3RWYWwxNCAgICAgICAgICBSTiAxNAorCitPdXQwICAgICAgICAgICAgUk4gNgorT3V0MSAgICAgICAgICAgIFJOIDcKK091dDIgICAgICAgICAgICBSTiA4CitPdXQzICAgICAgICAgICAgUk4gOQorCitMZWZ0MCAgICAgICAgICAgUk4gNgorTGVmdDEgICAgICAgICAgIFJOIDcKK0xlZnQyICAgICAgICAgICBSTiA4CitMZWZ0MyAgICAgICAgICAgUk4gOQorCitBYm92ZTAxMjMgICAgICAgUk4gMTIKK0Fib3ZlNDU2NyAgICAgICBSTiAxNAorCitBYm92ZUxlZnQgICAgICAgUk4gMTAKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NCAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisKK09NWF9WQ180eDRfVkVSVAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IHBTcmNBYm92ZVswIHRvIDNdCisgICAgICAgIE1fU1RSICAgIEFib3ZlMDEyMywgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgIDsvLyBwRHN0WzAgIHRvIDNdICA9IEFib3ZlMDEyMworICAgICAgICBNX1NUUiAgICBBYm92ZTAxMjMsICBbcERzdF0sICBkc3RTdGVwICAgICAgICA7Ly8gcERzdFs0ICB0byA3XSAgPSBBYm92ZTAxMjMKKyAgICAgICAgTV9TVFIgICAgQWJvdmUwMTIzLCAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgOy8vIHBEc3RbOCAgdG8gMTFdID0gQWJvdmUwMTIzCisgICAgICAgIFNUUiAgICAgIEFib3ZlMDEyMywgIFtwRHN0XSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEyIHRvIDE1XSA9IEFib3ZlMDEyMworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisKK09NWF9WQ180eDRfSE9SCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NiAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyBDb25zdCB0byByZXBlYXQgdGhlIGJ5dGUgaW4gcmVnIDQgdGltZXMKKyAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KKyAgICAgICAgTVVMICAgICAgT3V0MCwgICBMZWZ0MCwgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgT3V0MSwgICBMZWZ0MSwgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgT3V0MiwgICBMZWZ0MiwgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgT3V0MywgICBMZWZ0MywgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0gCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gYXQgcERzdCBbNCAgdG8gNyBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorT01YX1ZDXzR4NF9EQworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTYKKyAgICAgICAgCisgICAgICAgIEFORCAgICAgIGF2YWlsYWJpbGl0eSwgIGF2YWlsYWJpbGl0eSwgICMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgICMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCisgICAgICAgIEJORSAgICAgIFVwcGVyT3JMZWZ0T3JOb25lQXZhaWxhYmxlICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBib3RoCisgICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgID0gcFNyY0Fib3ZlWzAgdG8gM10KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsNywgIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgUk9SICM4ICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgVUFERDE2ICAgdFZhbDExLCB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQorICAgICAgICBBREQgICAgICB0VmFsMTEsIHRWYWwxMSwgIExTUiAjMTYgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbM10pCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIFVYVEggICAgIHRWYWwxMSwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIExlZnQwLCAgTGVmdDEgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSBMZWZ0MCArIExlZnQxCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgTGVmdDIsICBMZWZ0MyAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IExlZnQyICsgTGVmdDMKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gdFZhbDYgKyB0VmFsNworICAgICAgICBBREQgICAgICBPdXQwLCAgIHRWYWw2LCAgdFZhbDExICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSB0VmFsNiArIHRWYWwxMSAgIAorICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzQgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgNAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgICA9TVVMX0NPTlNUMCAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBNT1YgICAgICBPdXQwLCAgIE91dDAsICBMU1IgIzMgICAgICAgICAgICAgICA7Ly8gT3V0MCA9IChPdXQwICsgNCk+PjMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICByMHgwMTAxMDEwMSAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK1VwcGVyT3JMZWZ0T3JOb25lQXZhaWxhYmxlCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICAjT01YX1ZDX1VQUEVSICAgICAgICA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgI09NWF9WQ19VUFBFUikKKyAgICAgICAgQk5FICAgICAgTGVmdE9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKKyAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyAgPSBwU3JjQWJvdmVbMCB0byAzXQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw3LCAgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDYsICBBYm92ZTAxMjMsICBST1IgIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICBVQUREMTYgICBPdXQwLCAgIHRWYWw2LCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgID1NVUxfQ09OU1QwICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzE2ICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBVWFRIICAgICBPdXQwLCAgIE91dDAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKKyAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgICMyICAgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCArIDIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBPdXQwLCAgIE91dDAsICAgTFNSICMyICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSAoT3V0MCArIDIpPj4yCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgIHRvIDMgXQorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0ICB0byA3IF0gCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK0xlZnRPck5vbmVBdmFpbGFibGUgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICAgPU1VTF9DT05TVDAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQk5FICAgICAgTm9uZUF2YWlsYWJsZQorICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQorICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBPdXQwLCAgIExlZnQwLCAgTGVmdDEgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBMZWZ0MCArIExlZnQxCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgT3V0MSwgICBMZWZ0MiwgIExlZnQzICAgICAgICAgICAgICAgOy8vIE91dDEgID0gTGVmdDIgKyBMZWZ0MworICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgT3V0MSAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICArIE91dDEKKyAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgICMyICAgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCArIDIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBPdXQwLCAgIE91dDAsICAgTFNSICMyICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSAoT3V0MCArIDIpPj4yCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdIAorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworTm9uZUF2YWlsYWJsZQorICAgICAgICBNT1YgICAgICBPdXQwLCAgICMxMjggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCA9IDEyOCBpZihjb3VudCA9PSAwKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTUKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgIHIweDAxMDEwMTAxICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXQorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzQgIHRvIDcgXSAKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorT01YX1ZDXzR4NF9ESUFHX0RMCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIGYgPSAoYSsyKmIrYysyKT4+MgorICAgICAgICA7Ly8gQ2FsY3VsYXRlIGFzOgorICAgICAgICA7Ly8gZCA9IChhICsgYyApPj4xCisgICAgICAgIDsvLyBlID0gKGQgLSBiJyk+PjEKKyAgICAgICAgOy8vIGYgPSBlICsgMTI4CisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUl9SSUdIVCAgICAgICAgICAgICAgICAgIAorICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsICB7QWJvdmUwMTIzLCBBYm92ZTQ1Njd9ICA7Ly8gQWJvdmUwMTIzLCBBYm92ZTQ1NjcgPSBwU3JjQWJvdmVbMCB0byA3XQorICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAorICAgICAgICBCTkUgICAgICBETFVwcGVyUmlnaHRBdmFpbGFibGUKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgTU9WICAgICAgdFZhbDcsICBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHswMCwgIDAwLCAgMDAsICBVMyB9CisgICAgICAgIE1PViAgICAgIHRWYWwxMSwgdFZhbDcsICBMU0wgIzI0ICAgICAgICAgICAgIDsvLyB7VTMsICAwMCwgIDAwLCAgMDAgfQorICAgICAgICBNVUwgICAgICBPdXQzLCAgIHRWYWw3LCAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8ge1UzLCAgVTMsICBVMywgIFUzIH0gCisgICAgICAgIE1PViAgICAgIHRWYWw4LCAgQWJvdmUwMTIzLCAgTFNSICMxNiAgICAgICAgIDsvLyB7MDAsICAwMCwgIFUzLCAgVTIgfQorICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTUiAjOCAgICAgICAgICA7Ly8gezAwLCAgVTMsICBVMiwgIFUxIH0KKyAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHswMCcsIFUzJywgVTInLCBVMSd9CisgICAgICAgIFVIQUREOCAgIHRWYWw4LCAgdFZhbDgsICBBYm92ZTAxMjMgICAgICAgICAgIDsvLyB7eHgsICB4eCwgIGQxLCAgZDAgfQorICAgICAgICBVSEFERDggICB0VmFsNiwgIEFib3ZlMDEyMywgIHRWYWw5ICAgICAgICAgICA7Ly8ge3h4LCAgZDIsICB4eCwgIHh4IH0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsOCwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHt4eCwgIHh4LCAgZTEsICBlMCB9CisgICAgICAgIFVIU1VCOCAgIHRWYWw2LCAgdFZhbDYsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB7eHgsICBlMiwgIHh4LCAgeHggfQorICAgICAgICBVQUREOCAgICB0VmFsOCwgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge3h4LCAgeHgsICBmMSwgIGYwIH0KKyAgICAgICAgVUFERDggICAgdFZhbDYsICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHt4eCwgIGYyLCAgeHgsICB4eCB9CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgdFZhbDYsICB0VmFsOCwgIHRWYWw2ICAgICAgICAgICAgICAgOy8vIHt4eCwgIGYyLCAgZjEsICBmMCB9CisgICAgICAgIEJJQyAgICAgIHRWYWw2LCAgdFZhbDYsICAjMHhGRjAwMDAwMCAgICAgICAgIDsvLyB7MDAsICBmMiwgIGYxLCAgZjAgfQorICAgICAgICBPUlIgICAgICBPdXQwLCAgIHRWYWw2LCAgdFZhbDExICAgICAgICAgICAgICA7Ly8ge1UzLCAgZjIsICBmMSwgIGYwIH0KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBQS0hUQiAgICBPdXQxLCAgIE91dDMsICAgT3V0MCwgIEFTUiAjOCAgICAgICA7Ly8ge1UzLCAgVTMsICBmMiwgIGYxIH0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBQS0hUQiAgICBPdXQyLCAgIE91dDMsICAgT3V0MSwgIEFTUiAjOCAgICAgICA7Ly8ge1UzLCAgVTMsICBVMywgIGYyIH0KKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjMgdG8gZjB9IGF0IHBEc3RbMyAgdG8gMCBdCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjQgdG8gZjF9IGF0IHBEc3RbNyAgdG8gNCBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjUgdG8gZjJ9IGF0IHBEc3RbMTEgdG8gOCBdCisgICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjYgdG8gZjN9IGF0IHBEU3RbMTUgdG8gMTJdCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorCitETFVwcGVyUmlnaHRBdmFpbGFibGUgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHswMCwgIDAwLCAgMDAsICBVMyB9CisgICAgICAgIE1PViAgICAgIHRWYWw5LCAgQWJvdmUwMTIzLCAgTFNSICMxNiAgICAgICAgIDsvLyB7MDAsICAwMCwgIFUzLCAgVTIgfQorICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTUiAjOCAgICAgICAgICA7Ly8gezAwLCAgVTMsICBVMiwgIFUxIH0KKyAgICAgICAgT1JSICAgICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlNDU2NywgTFNMICM4ICAgOy8vIHtVNiwgIFU1LCAgVTQsICBVMyB9CisgICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCBBYm92ZTQ1NjcsIExTTCAjMjQgIDsvLyB7VTQsICBVMywgIFUyLCAgVTEgfQorICAgICAgICBQS0hCVCAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmU0NTY3LCBMU0wgIzE2ICA7Ly8ge1U1LCAgVTQsICBVMywgIFUyIH0KKyAgICAgICAgTVZOICAgICAgdFZhbDEsICB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHtVNicsIFU1JywgVTQnLCBVMyd9CisgICAgICAgIE1WTiAgICAgIHRWYWwxMCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgIDsvLyB7VTQnLCBVMycsIFUyJywgVTEnfQorICAgICAgICBNVk4gICAgICB0VmFsMiwgIEFib3ZlNDU2NyAgICAgICAgICAgICAgICAgICA7Ly8ge1U3JywgVTYnLCBVNScsIFU0J30KKyAgICAgICAgVUhBREQ4ICAgdFZhbDYsICBBYm92ZTAxMjMsICB0VmFsOSAgICAgICAgICAgOy8vIHtkMywgIGQyLCAgZDEsICBkMCB9CisgICAgICAgIFVIQUREOCAgIHRWYWw5LCAgdFZhbDksICBBYm92ZTQ1NjcgICAgICAgICAgIDsvLyB7ZDUsICBkNCwgIGQzLCAgZDIgfQorICAgICAgICBVSEFERDggICB0VmFsOCwgIEFib3ZlNDU2NywgIHRWYWw4ICAgICAgICAgICA7Ly8ge2Q2LCAgeHgsICB4eCwgIHh4IH0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHtlMywgIGUyLCAgZTEsICBlMCB9CisgICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDksICB0VmFsMSAgICAgICAgICAgICAgIDsvLyB7ZTUsICBlNCwgIGUzLCAgZTIgfQorICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw4LCAgdFZhbDIgICAgICAgICAgICAgICA7Ly8ge2U2LCAgeHgsICB4eCwgIHh4IH0KKyAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHtmMywgIGYyLCAgZjEsICBmMCB9CisgICAgICAgIFVBREQ4ICAgIHRWYWw5LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7ZjYsICB4eCwgIHh4LCAgeHggfQorICAgICAgICBVQUREOCAgICBPdXQyLCAgIHRWYWwxMiwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge2Y1LCAgZjQsICBmMywgIGYyIH0KKyAgICAgICAgTU9WICAgICAgdFZhbDcsICBPdXQwLCAgIExTUiAjOCAgICAgICAgICAgICAgOy8vIHswMCwgIGYzLCAgZjIsICBmMSB9CisgICAgICAgIEFORCAgICAgIHRWYWw5LCAgdFZhbDksICAjMHhGRjAwMDAwMCAgICAgICAgIDsvLyB7ZjYsICAwMCwgIDAwLCAgMDAgfQorICAgICAgICBQS0hCVCAgICBPdXQxLCAgIHRWYWw3LCAgT3V0MiwgIExTTCAjOCAgICAgICA7Ly8ge2Y0LCAgZjMsICBmMiwgIGYxIH0KKyAgICAgICAgT1JSICAgICAgT3V0MywgICB0VmFsOSwgIE91dDIsICBMU1IgIzggICAgICAgOy8vIHtmNiwgIGY1LCAgZjQsICBmMyB9CisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjMgdG8gZjB9IGF0IHBEc3RbMyAgdG8gMCBdCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjQgdG8gZjF9IGF0IHBEc3RbNyAgdG8gNCBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjUgdG8gZjJ9IGF0IHBEc3RbMTEgdG8gOCBdCisgICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjYgdG8gZjN9IGF0IHBEU3RbMTUgdG8gMTJdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorCitPTVhfVkNfNHg0X0RJQUdfRFIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQorICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQorICAgICAgICBMRFJCICAgICBBYm92ZUxlZnQsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICA7Ly8gQWJvdmVMZWZ0ID0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBPUlIgICAgICB0VmFsNywgIExlZnQxLCAgTGVmdDAsICBMU0wgIzggICAgICA7Ly8gdFZhbDcgPSAwMCAwMCBMMCBMMQorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKKyAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsID1BRERfQ09OU1QxICAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKKyAgICAgICAgT1JSICAgICAgdFZhbDgsICBMZWZ0MywgIExlZnQyLCAgTFNMICM4ICAgICAgOy8vIHRWYWw4ID0gMDAgMDAgTDIgTDMKKyAgICAgICAgUEtIQlQgICAgdFZhbDcsICB0VmFsOCwgIHRWYWw3LCAgTFNMICMxNiAgICAgOy8vIHRWYWw3ID0gTDAgTDEgTDIgTDMKKyAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU0wgIzggICAgICAgICAgOy8vIHRWYWw4ID0gVTIgVTEgVTAgMDAKKyAgICAgICAgTU9WICAgICAgdFZhbDksICB0VmFsNywgIExTUiAjOCAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gMDAgTDAgTDEgTDIKKyAgICAgICAgT1JSICAgICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlTGVmdCAgICAgICAgICAgOy8vIHRWYWw4ID0gVTIgVTEgVTAgVUwKKyAgICAgICAgT1JSICAgICAgdFZhbDksICB0VmFsOSwgIEFib3ZlTGVmdCwgTFNMICMyNCAgOy8vIHRWYWw5ID0gVUwgTDAgTDEgTDIKKyAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTAxMjMsICBMU0wgIzI0ICAgICAgICAgOy8vIHRWYWwxMD0gVTAgMDAgMDAgMDAKKyAgICAgICAgVVhUQiAgICAgdFZhbDExLCB0VmFsNywgIFJPUiAjMjQgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgMDAgMDAgTDAKKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIHRWYWw5LCAgTFNSICM4ICAgICAgOy8vIHRWYWwxMD0gVTAgVUwgTDAgTDEKKyAgICAgICAgT1JSICAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4LCAgTFNMICM4ICAgICAgOy8vIHRWYWwxMT0gVTEgVTAgVUwgTDAKKyAgICAgICAgVUhBREQ4ICAgdFZhbDExLCBBYm92ZTAxMjMsICB0VmFsMTEgICAgICAgICAgOy8vIHRWYWwxMT0gZDEgZDAgZEwgZzAKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEwLCB0VmFsNywgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gZzAgZzEgZzIgZzMKKyAgICAgICAgTVZOICAgICAgdFZhbDgsICB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gVTInVTEnVTAnVUwnCisgICAgICAgIE1WTiAgICAgIHRWYWw5LCAgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IFVMJ0wwJ0wxJ0wyJworICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWwxMSwgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDExPSBlMSBlMCBlTCBoMAorICAgICAgICBVSFNVQjggICB0VmFsMTAsIHRWYWwxMCwgdFZhbDkgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBoMCBoMSBoMiBoMworICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWwxMCwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MyAgPSBpMCBpMSBpMiBpMworICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MCAgPSBmMSBmMCBmTCBpMAorICAgICAgICBVWFRIICAgICB0VmFsMTEsIE91dDMsICAgUk9SICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCAwMCBpMSBpMgorICAgICAgICBNT1YgICAgICB0VmFsNywgIE91dDAsICAgTFNMICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBmMCBmTCBpMCAwMAorICAgICAgICBPUlIgICAgICBPdXQxLCAgIHRWYWw3LCAgdFZhbDExLCAgTFNSICM4ICAgICA7Ly8gT3V0MSAgPSBmMCBmTCBpMCBpMQorICAgICAgICBQS0hCVCAgICBPdXQyLCAgIHRWYWwxMSwgT3V0MCwgICAgTFNMICMxNiAgICA7Ly8gT3V0MiAgPSBmTCBpMCBpMSBpMgorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YxIHRvIGkwfSBhdCBwRHN0WzMgIHRvIDAgXQorICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YwIHRvIGkxfSBhdCBwRHN0WzcgIHRvIDQgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2ZMIHRvIGkyfSBhdCBwRHN0WzExIHRvIDggXQorICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge2kwIHRvIGkzfSBhdCBwRHN0WzE1IHRvIDEyXSAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisKK09NWF9WQ180eDRfVlIKKworICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IFUzIFUyIFUxIFUwCisgICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSAwMCAwMCAwMCBVTAorICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgICAgID0gMDAgMDAgMDAgTDAKKyAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxICAgICA9IDAwIDAwIDAwIEwxCisgICAgICAgIExEUkIgICAgIExlZnQyLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MiAgICAgPSAwMCAwMCAwMCBMMgorICAgICAgICBNT1YgICAgICB0VmFsMCwgIEFib3ZlMDEyMywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDAgICAgID0gVTIgVTEgVTAgMDAKKyAgICAgICAgTU9WICAgICAgdFZhbDksICBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw5ICAgICA9IFUzIFUyIFUxIFUwIAorICAgICAgICBPUlIgICAgICB0VmFsMTQsIHRWYWwwLCAgIEFib3ZlTGVmdCAgICAgICAgICA7Ly8gdFZhbDE0ICAgID0gVTIgVTEgVTAgVUwKKyAgICAgICAgTVZOICAgICAgdFZhbDExLCB0VmFsMTQgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMSAgICA9IFUyJ1UxJ1UwJ1VMJworICAgICAgICBNT1YgICAgICB0VmFsMiwgIHRWYWwxNCwgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDIgICAgID0gVTEgVTAgVUwgMDAKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEsICBBYm92ZTAxMjMsICB0VmFsMTEgICAgICAgICAgOy8vIHRWYWwxICAgICA9IGQyIGQxIGQwIGRMCisgICAgICAgIFVIQUREOCAgIHRWYWwxMCwgQWJvdmVMZWZ0LCBMZWZ0MSAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSAwMCAwMCAwMCBqMSAgICAgICAKKyAgICAgICAgTVZOICAgICAgdFZhbDQsICBMZWZ0MCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw0ICAgICA9IDAwIDAwIDAwIEwwJworICAgICAgICBVSFNVQjggICB0VmFsNCwgIHRWYWwxMCwgIHRWYWw0ICAgICAgICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgazEKKyAgICAgICAgT1JSICAgICAgdFZhbDEyLCB0VmFsMCwgICBMZWZ0MCAgICAgICAgICAgICAgOy8vIHRWYWwxMiAgICA9IFUyIFUxIFUwIEwwCisgICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDIsICAgTGVmdDAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgICAgPSBVMSBVMCBVTCBMMAorICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAorICAgICAgICBVSEFERDggICB0VmFsMTAsIHRWYWw5LCAgIHRWYWwxNCAgICAgICAgICAgICA7Ly8gdFZhbDEwICAgID0gZzMgZzIgZzEgZzAKKyAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsMSwgICByMHg4MDgwODA4MCAgICAgICAgOy8vIE91dDAgICAgICA9IGUyIGUxIGUwIGVMCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMCwgdFZhbDEwLCAgdFZhbDExICAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSBoMyBoMiBoMSBoMAorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge2UyIHRvIGVMfSBhdCBwRHN0WzMgIHRvIDAgXQorICAgICAgICBNT1YgICAgICB0VmFsMSwgIHRWYWwxNCwgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gVTAgVUwgTDAgMDAKKyAgICAgICAgTU9WICAgICAgdFZhbDYsICBPdXQwLCAgICBMU0wgIzggICAgICAgICAgICAgOy8vIHRWYWw2ICAgICA9IGUxIGUwIGVMIDAwCisgICAgICAgIE9SUiAgICAgIHRWYWwyLCAgdFZhbDIsICAgTGVmdDEgICAgICAgICAgICAgIDsvLyB0VmFsMiAgICAgPSBVMSBVMCBVTCBMMQorICAgICAgICBVQUREOCAgICB0VmFsNCwgIHRWYWw0LCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgbDEgICAgICAgIAorICAgICAgICBVQUREOCAgICBPdXQxLCAgIHRWYWwxMCwgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MSAgICAgID0gaTMgaTIgaTEgaTAKKyAgICAgICAgTVZOICAgICAgdFZhbDIsICB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxNCAgICA9IFUxJ1UwJ1VMJ0wxJworICAgICAgICBPUlIgICAgICB0VmFsMSwgIHRWYWwxLCAgIExlZnQyICAgICAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gVTAgVUwgTDAgTDIKKyAgICAgICAgT1JSICAgICAgT3V0MiwgICB0VmFsNiwgICB0VmFsNCAgICAgICAgICAgICAgOy8vIE91dDIgICAgICA9IGUxIGUwIGVMIGwxCisgICAgICAgIFVIQUREOCAgIHRWYWwxLCAgdFZhbDEsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBnMiBnMSBnMCBqMgorICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge2kzIHRvIGkwfSBhdCBwRHN0WzcgIHRvIDQgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge2UxIHRvIGwxfSBhdCBwRHN0WzExIHRvIDggXQorICAgICAgICBVSFNVQjggICB0VmFsOSwgIHRWYWwxLCAgIHRWYWwyICAgICAgICAgICAgICA7Ly8gdFZhbDkgICAgID0gaDIgaDEgaDAgazIKKyAgICAgICAgVUFERDggICAgT3V0MywgICB0VmFsOSwgICByMHg4MDgwODA4MCAgICAgICAgOy8vIE91dDMgICAgICA9IGkyIGkxIGkwIGwyCisgICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7aTIgdG8gbDJ9IGF0IHBEc3RbMTUgdG8gMTJdIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfNHg0X0hECisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IFUzIFUyIFUxIFUwCisgICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSAwMCAwMCAwMCBVTAorICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSAwMCAwMCAwMCBMMAorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSAwMCAwMCAwMCBMMQorICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSAwMCAwMCAwMCBMMgorICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSAwMCAwMCAwMCBMMworICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAorICAgICAgICBPUlIgICAgICB0VmFsMiwgIEFib3ZlTGVmdCwgQWJvdmUwMTIzLCBMU0wgIzg7Ly8gdFZhbDIgPSBVMiBVMSBVMCBVTAorICAgICAgICBNVk4gICAgICB0VmFsMSwgIExlZnQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEgPSAwMCAwMCAwMCBMMCcKKyAgICAgICAgT1JSICAgICAgdFZhbDQsICBMZWZ0MCwgIHRWYWwyLCAgTFNMICM4ICAgICAgOy8vIHRWYWw0ID0gVTEgVTAgVUwgTDAKKyAgICAgICAgTVZOICAgICAgdFZhbDIsICB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gVTInVTEnVTAnVUwnCisgICAgICAgIFVIQUREOCAgIHRWYWw0LCAgdFZhbDQsICBBYm92ZTAxMjMgICAgICAgICAgIDsvLyB0VmFsNCA9IGczIGcyIGcxIGcwCisgICAgICAgIFVIU1VCOCAgIHRWYWwxLCAgQWJvdmVMZWZ0LCAgdFZhbDEgICAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIGRMCisgICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDQsICB0VmFsMiAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IGgzIGgyIGgxIGgwCisgICAgICAgIFVBREQ4ICAgIHRWYWwxLCAgdFZhbDEsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIGVMCisgICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsNCA9IGkzIGkyIGkxIGkwCisgICAgICAgIE9SUiAgICAgIHRWYWwyLCAgTGVmdDAsICBBYm92ZUxlZnQsICBMU0wgIzE2IDsvLyB0VmFsMiA9IDAwIFVMIDAwIEwwCisgICAgICAgIE1PViAgICAgIHRWYWw0LCAgdFZhbDQsICBMU0wgIzggICAgICAgICAgICAgIDsvLyB0VmFsNCA9IGkyIGkxIGkwIDAwCisgICAgICAgIE9SUiAgICAgIHRWYWwxMSwgTGVmdDEsICBMZWZ0MCwgIExTTCAjMTYgICAgIDsvLyB0VmFsMTE9IDAwIEwwIDAwIEwxCisgICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDIsICBMZWZ0MSwgIExTTCAjMTYgICAgIDsvLyB0VmFsNyA9IDAwIEwxIDAwIEwyCisgICAgICAgIE9SUiAgICAgIHRWYWwxMCwgTGVmdDMsICBMZWZ0MiwgIExTTCAjMTYgICAgIDsvLyB0VmFsMTA9IDAwIEwyIDAwIEwzCisgICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDQsICB0VmFsMSAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IGkyIGkxIGkwIGVMCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXSAKKyAgICAgICAgTU9WICAgICAgdFZhbDQsICBPdXQwLCAgIExTTCAjMTYgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaTEgaTAgMDAgMDAKKyAgICAgICAgVUhBREQ4ICAgdFZhbDIsICB0VmFsMiwgIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gMDAgajEgMDAgajIKKyAgICAgICAgVUhBREQ4ICAgdFZhbDYsICB0VmFsMTEsIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgajIgMDAgajMKKyAgICAgICAgTVZOICAgICAgdFZhbDEyLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgTDAnMDAgTDEnCisgICAgICAgIE1WTiAgICAgIHRWYWwxNCwgdFZhbDcgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQ9IDAwIEwxJzAwIEwyJworICAgICAgICBVSFNVQjggICB0VmFsMiwgIHRWYWwyLCAgdFZhbDEyICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBrMSAwMCBrMgorICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw3LCAgdFZhbDEyICAgICAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBkMSAwMCBkMgorICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWw2LCAgdFZhbDE0ICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBrMiAwMCBrMworICAgICAgICBVSFNVQjggICB0VmFsOSwgIHRWYWwxMCwgdFZhbDE0ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBkMiAwMCBkMworICAgICAgICBVQUREOCAgICB0VmFsMiwgIHRWYWwyLCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBsMSAwMCBsMgorICAgICAgICBVQUREOCAgICB0VmFsOCwgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBlMSAwMCBlMgorICAgICAgICBVQUREOCAgICB0VmFsMTEsIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBsMiAwMCBsMworICAgICAgICBVQUREOCAgICB0VmFsOSwgIHRWYWw5LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBlMiAwMCBlMworICAgICAgICBPUlIgICAgICBPdXQyLCAgIHRWYWw4LCAgdFZhbDIsICBMU0wgIzggICAgICA7Ly8gT3V0MiAgPSBsMSBlMSBsMiBlMgorICAgICAgICBPUlIgICAgICBPdXQzLCAgIHRWYWw5LCAgdFZhbDExLCBMU0wgIzggICAgICA7Ly8gT3V0MyAgPSBsMiBlMiBsMyBlMworICAgICAgICBQS0hUQiAgICBPdXQxLCAgIHRWYWw0LCAgT3V0MiwgICBBU1IgIzE2ICAgICA7Ly8gT3V0MSAgPSBpMSBpMCBsMSBlMQorICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9ICBhdCBwRHN0IFs0ICB0byA3IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSAgYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gIGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfNHg0X1ZMCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCB7QWJvdmUwMTIzLCBBYm92ZTQ1Njd9ICAgOy8vIEFib3ZlMDEyMywgQWJvdmU0NTY3ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIE1PViAgICAgIHRWYWwxMSwgQWJvdmUwMTIzLCAgTFNSICMyNCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIDAwIDAwIFUzCisgICAgICAgIE1VTEVRICAgIEFib3ZlNDU2NywgdFZhbDExLCByMHgwMTAxMDEwMSAgICAgIDsvLyBBYm92ZTQ1NjcgPSBVMyBVMyBVMyBVMworICAgICAgICBNT1YgICAgICB0VmFsOSwgIEFib3ZlMDEyMywgIExTUiAjOCAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBVMyBVMiBVMQorICAgICAgICBNVk4gICAgICB0VmFsMTAsIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBVMydVMidVMSdVMCcKKyAgICAgICAgT1JSICAgICAgdFZhbDIsICB0VmFsOSwgIEFib3ZlNDU2NywgIExTTCAjMjQgOy8vIHRWYWwyID0gVTQgVTMgVTIgVTEKKyAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsMiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gZDQgZDMgZDIgZDEKKyAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDAgPSBlNCBlMyBlMiBlMQorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9ICBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgTU9WICAgICAgdFZhbDksICB0VmFsOSwgIExTUiAjOCAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gMDAgMDAgVTMgVTIKKyAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTQ1NjcsICBMU0wgIzggICAgICAgICAgOy8vIHRWYWwxMD0gVTYgVTUgVTQgMDAKKyAgICAgICAgUEtIQlQgICAgdFZhbDksICB0VmFsOSwgIEFib3ZlNDU2NywgTFNMICMxNiAgOy8vIHRWYWw5ID0gVTUgVTQgVTMgVTIKKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gVTYgVTUgVTQgVTMKKyAgICAgICAgVUhBREQ4ICAgdFZhbDExLCB0VmFsOSwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHRWYWwxMT0gZzUgZzQgZzMgZzIKKyAgICAgICAgVUhBREQ4ICAgdFZhbDE0LCB0VmFsMiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxND0gZzYgZzUgZzQgZzMKKyAgICAgICAgTVZOICAgICAgdFZhbDgsICB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gVTQnVTMnVTInVTEnCisgICAgICAgIE1WTiAgICAgIHRWYWw3LCAgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IFU1J1U0J1UzJ1UyJworICAgICAgICBVSFNVQjggICB0VmFsMTIsIHRWYWw5LCAgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSBkNSBkNCBkMyBkMgorICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWwxMSwgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDExPSBoNSBoNCBoMyBoMgorICAgICAgICBVSFNVQjggICB0VmFsMiwgIHRWYWwxNCwgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSBoNiBoNSBoNCBoMworICAgICAgICBVQUREOCAgICBPdXQxLCAgIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MSAgPSBpNSBpNCBpMyBpMgorICAgICAgICBVQUREOCAgICBPdXQyLCAgIHRWYWwxMiwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MiAgPSBlNSBlNCBlMyBlMgorICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWwyLCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MyAgPSBpNiBpNSBpNCBpMworICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9IGF0IHBEc3QgWzQgIHRvIDcgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9IGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBNX1NUUiAgICBPdXQzLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDN9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ180eDRfSFUKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQorICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQorICAgICAgICBNT1YgICAgICByMHg4MDgwODA4MCwgIHIweDAxMDEwMTAxLCBMU0wgIzcgICA7Ly8gMHg4MDgwODA4MAorICAgICAgICBPUlIgICAgICB0VmFsNiwgIExlZnQwLCAgTGVmdDEsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDYgPSAwMCBMMSAwMCBMMAorICAgICAgICBPUlIgICAgICB0VmFsNywgIExlZnQxLCAgTGVmdDIsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDcgPSAwMCBMMiAwMCBMMQorICAgICAgICBPUlIgICAgICB0VmFsMTEsIExlZnQyLCAgTGVmdDMsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDExPSAwMCBMMyAwMCBMMgorICAgICAgICBNVUwgICAgICBPdXQzLCAgIExlZnQzLCAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gT3V0MyAgPSBMMyBMMyBMMyBMMworICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBMMicwMCBMMScKKyAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gMDAgTDMnMDAgTDInCisgICAgICAgIFVIQUREOCAgIHRWYWw0LCAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IDAwIGczIDAwIGcyCisgICAgICAgIFVYVEIxNiAgIHRWYWwxMiwgT3V0MyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIEwzIDAwIEwzCisgICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDQsICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IDAwIGgzIDAwIGgyCisgICAgICAgIFVIU1VCOCAgIHRWYWw2LCAgdFZhbDYsICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IDAwIGQyIDAwIGQxCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGQzIDAwIGQyCisgICAgICAgIFVIQUREOCAgIHRWYWwxMiwgdFZhbDEyLCB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIGc0IDAwIGczCisgICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsNCA9IDAwIGkzIDAwIGkyCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDEyLCB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIGg0IDAwIGgzCisgICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDYsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGUyIDAwIGUxCisgICAgICAgIFVBREQ4ICAgIHRWYWwxMSwgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGUzIDAwIGUyCisgICAgICAgIFVBREQ4ICAgIHRWYWwxMiwgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTI9IDAwIGk0IDAwIGkzCisgICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDgsICB0VmFsNCwgIExTTCAjOCAgICAgIDsvLyBPdXQwICA9IGkzIGUyIGkyIGUxCisgICAgICAgIE9SUiAgICAgIE91dDEsICAgdFZhbDExLCB0VmFsMTIsIExTTCAjOCAgICAgIDsvLyBPdXQxICA9IGk0IGUzIGkzIGUyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXQorICAgICAgICBQS0hUQiAgICBPdXQyLCAgIE91dDMsICAgT3V0MSwgICBBU1IgIzE2ICAgICA7Ly8gT3V0MiAgPSBMMyBMMyBpNCBlMworICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9ICBhdCBwRHN0IFs0ICB0byA3IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSAgYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gIGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORAorCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBFTkQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IGVuZHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzU5N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpAQCAtMCwwICsxLDEyOCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAKKworICAgIElGIEFSTTExMzZKUworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHBTcmMgICAgICAgUk4gMAorcERzdCAgICAgICAgUk4gMQorUVAgICAgICAgICAgUk4gMgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUgZm9yIFVucGFjazJ4MiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjICAgICAgICBSTiA5CitWYWx1ZSAgICAgICBSTiA0CitWYWx1ZTIgICAgICBSTiA1CitGbGFnICAgICAgICBSTiA2CitzdHJPZmZzZXQgICBSTiA3Citjc3RPZmZzZXQgICBSTiA4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3IwdzAgICAgICAgIFJOICAzCityMHcxICAgICAgICBSTiAgNAorCitjMHcwICAgICAgICBSTiAgNQorYzF3MCAgICAgICAgUk4gIDYKKworcmV0dXJuICAgICAgUk4gIDAKK3BRUERpdlRhYmxlIFJOICA1CitwUVBNb2RUYWJsZSAgICBSTiAgNgorU2hpZnQgICAgICAgIFJOICA5CitTY2FsZSAgICAgICAgUk4gIDIKKworVGVtcDEgICAgICAgUk4gIDMKK1RlbXAyICAgICAgIFJOICA0CitUZW1wMyAgICAgICBSTiAgNworVGVtcDQgICAgICAgUk4gIDgKKworICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgcjkKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCisgICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgVmFsdWUsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKKyAgICAgICAgTU9WICAgICAgVmFsdWUyLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKKyAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMF0gICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMAorICAgICAgICAKKwordW5wYWNrTG9vcAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKKyAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgIAorICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcworICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOworICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKworICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKworICAgICAgICAKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCisgICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgorICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KKyAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKKyAgICAgICAgCisgICAgICAgIExETUlBICAgIHBEc3QsIHtyMHcwLCByMHcxfSAgICAgICAgICAgICAgICAgIDsvLyByMHcwID0gfGMxfGMwfCAmIHIwdzEgPSB8YzN8YzJ8CisKKworICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgOy8vIFFQIERpdmlzaW9uIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIExEUiAgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIAorICAgICAgICBTQUREU1VCWCByMHcwLCByMHcwLCAgcjB3MCAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMDArYzAxLCBjMDAtYzAxIF0KKyAgICAgICAgU0FERFNVQlggcjB3MSwgcjB3MSwgIHIwdzEgICAgICAgICAgICAgICAgICAgOy8vIFsgYzEwK2MxMSwgYzEwLWMxMSBdCisgICAgICAgIAorICAgICAgICBMRFJTQiAgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KKyAgICAgICAgTERSU0IgICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNjYWxlID0gcFFQTW9kVGFibGVbUVBdCisgICAgICAgIAorICAgICAgICBTQUREMTYgICBjMHcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDArZDEwLCBkMDErZDExIF0KKyAgICAgICAgU1NVQjE2ICAgYzF3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwLWQxMCwgZDAxLWQxMSBdCisgICAgICAgIAorICAgICAgICBMU0wgICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAorICAgICAgICAKKyAgICAgICAgU01VTFRCICAgVGVtcDIsIGMwdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlCisgICAgICAgIFNNVUxUQiAgIFRlbXA0LCBjMXcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZQorICAgICAgICBTTVVMQkIgICBUZW1wMSwgYzB3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUKKyAgICAgICAgU01VTEJCICAgVGVtcDMsIGMxdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlCisgICAgICAgIE1PViAgICAgIFRlbXAyLCBUZW1wMiwgQVNSICMxICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFRlbXAyID4+IDEgJiBUZW1wMSA9IChUZW1wMSA+PiAxKSA8PCAxNgorICAgICAgICBNT1YgICAgICBUZW1wNCwgVGVtcDQsIEFTUiAjMSAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUZW1wNCA+PiAxICYgVGVtcDMgPSAoVGVtcDMgPj4gMSkgPDwgMTYKKyAgICAgICAgUEtIQlQgICAgYzB3MCwgIFRlbXAyLCBUZW1wMSwgTFNMICMxNSAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMSB8IFRlbXAyIHwKKyAgICAgICAgUEtIQlQgICAgYzF3MCwgIFRlbXA0LCBUZW1wMywgTFNMICMxNSAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMyB8IFRlbXA0IHwKKyAgICAgICAgU1RNSUEgICAgcERzdCwge2MwdzAsIGMxdzB9ICAgICAgICAgICAgICAgICAgOy8vIFN0b3JpbmcgYWxsIHRoZSBjb2VmZmljaWVudHMgYXQgb25jZQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjYWVjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCkBAIC0wLDAgKzEsNDY5IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKzsvLyAKKzsvLyAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gSW1wb3J0L0V4cG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20vdG8gb3RoZXIgZmlsZXMKKzsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQorICAgICAgICAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisgICAgCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQVJNMTEzNkpTIAorCisKKzsvL0lucHV0IFJlZ2lzdGVycworcERhdGEgICAgICAgICAgICAgICBSTiAgMAorUVAgICAgICAgICAgICAgICAgICBSTiAgMQorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCisKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKKworOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKK2luMDAgICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgOy8vIFNyY1swXSAmIFNyY1sxXSAKK2luMDIgICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgOy8vIFNyY1syXSAmIFNyY1szXQoraW4xMCAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzRdICYgU3JjWzVdCitpbjEyICAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNl0gJiBTcmNbN10KK2luMjAgICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s4XSAmIFNyY1s5XQoraW4yMiAgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEwXSAmIFNyY1sxMV0KK2luMzAgICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMl0gJiBTcmNbMTNdCitpbjMyICAgICAgICAgICAgICAgIFJOICA5ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTRdICYgU3JjWzE1XQorCis7Ly8gVHJhbnNwb3NlIGZvciBSb3cgb3BlcmF0aW9ucyAoUm93cyB0byBjb2xzKQordHJSb3cwMCAgICAgICAgICAgICBSTiAgMgordHJSb3cxMCAgICAgICAgICAgICBSTiAgMTAKK3RyUm93MDIgICAgICAgICAgICAgUk4gIDMKK3RyUm93MTIgICAgICAgICAgICAgUk4gIDUKK3RyUm93MjAgICAgICAgICAgICAgUk4gIDExCit0clJvdzMwICAgICAgICAgICAgIFJOICAxMgordHJSb3czMiAgICAgICAgICAgICBSTiAgMTQKK3RyUm93MjIgICAgICAgICAgICAgUk4gIDcKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK3Jvd1N1bTEgICAgICAgICAgICAgUk4gIDQKK3Jvd1N1bTIgICAgICAgICAgICAgUk4gIDYKK3Jvd0RpZmYxICAgICAgICAgICAgUk4gIDgKK3Jvd0RpZmYyICAgICAgICAgICAgUk4gIDkKKworCis7Ly8gUm93IG9wZXJhdGVkIHBpeGVscworcm93T3AwMCAgICAgICAgICAgICBSTiAgMgorcm93T3AxMCAgICAgICAgICAgICBSTiAgMTAKK3Jvd09wMjAgICAgICAgICAgICAgUk4gIDExCityb3dPcDMwICAgICAgICAgICAgIFJOICAxMgorcm93T3AwMiAgICAgICAgICAgICBSTiAgMworcm93T3AxMiAgICAgICAgICAgICBSTiAgNQorcm93T3AyMiAgICAgICAgICAgICBSTiAgNworcm93T3AzMiAgICAgICAgICAgICBSTiAgMTQKKworOy8vIFRyYW5zcG9zZSBmb3IgY29sdWxtbiBvcGVyYXRpb25zCit0ckNvbDAwICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAordHJDb2wwMiAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKK3RyQ29sMTAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCit0ckNvbDEyICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAordHJDb2wyMCAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKK3RyQ29sMjIgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCit0ckNvbDMwICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAordHJDb2wzMiAgICAgICAgICAgICBSTiAgOSAgCisKKzsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCitjb2xTdW0xICAgICAgICAgICAgIFJOICAxMAorY29sU3VtMiAgICAgICAgICAgICBSTiAgMTEKK2NvbERpZmYxICAgICAgICAgICAgUk4gIDEyCitjb2xEaWZmMiAgICAgICAgICAgIFJOICAxNAorCisKKzsvLyBDb2xvdW1uIG9wZXJhdGVkIHBpeGVscworY29sT3AwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK2NvbE9wMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCitjb2xPcDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAorY29sT3AxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK2NvbE9wMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCitjb2xPcDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAorY29sT3AzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK2NvbE9wMzIgICAgICAgICAgICAgUk4gIDkgIAorCis7Ly8gVGVtcG9yYXJ5IHNjcmF0Y2ggdmFyYWlibGVzCitwUVBEaXZUYWJsZSAgICAgICAgIFJOICAwCitwUVBNb2RUYWJsZSAgICAgICAgIFJOICAxMQorU2hpZnQgICAgICAgICAgICAgICBSTiAgMTAKK1NjYWxlICAgICAgICAgICAgICAgUk4gIDE0CitSb3VuZCAgICAgICAgICAgICAgIFJOICAwCisKK3RlbXAxICAgICAgICAgICAgICAgUk4gIDEwCit0ZW1wMiAgICAgICAgICAgICAgICBSTiAgMTEKK3RlbXAzICAgICAgICAgICAgICAgUk4gIDEyCit0ZW1wNCAgICAgICAgICAgICAgIFJOICAxCisKKworCis7Ly8gSW52VHJhbnNmb3JtZWQgYW5kIERlcXVhbnRpemVkIHBpeGVscworb3V0MDAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK291dDAyICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCitvdXQxMCAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAorb3V0MTIgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK291dDIwICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCitvdXQyMiAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAorb3V0MzAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK291dDMyICAgICAgICAgICAgICAgUk4gIDkgIAorICAgICAgCisgICAgICAgIAorCisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgTV9BTExPQzQgICAgcERhdGFPblN0YWNrLCA0CisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0LHIxMQorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCisgICAgICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA4IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgY29sb3VtbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgIDsvLyBTdG9yZSB0aGUgNHg0IGJsb2NrIGF0IG9uZSBnbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzCisgICAgICAgIAorICAgICAgICBMRE1JQSAgIHBEYXRhLHtpbjAwLGluMDIsaW4xMCxpbjEyLGluMjAsaW4yMixpbjMwLGluMzJ9CisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgbWF0cml4IGlub3JkZXIgdG8gcGVyZm9ybSByb3cgb3BzIGFzIGNvbG91bW4gb3BzCisgICAgICAgIDsvLyBJbnB1dDogICBpbltdW10gPSBvcmlnaW5hbCBtYXRyaXgKKyAgICAgICAgOy8vIE91dHB1dDogIHRyUm93W11bXT0gdHJhbnNwb3NlZCBtYXRyaXgKKyAgICAgICAgOy8vIFN0ZXAxOiBPYnRhaW4gdGhlIExMIHBhcnQgb2YgdGhlIHRyYW5zcG9zZWQgbWF0cml4CisgICAgICAgIDsvLyBTdGVwMjogT2J0YWluIHRoZSBITCBwYXJ0CisgICAgICAgIDsvLyBzdGVwMzogT2J0YWluIHRoZSBMSCBwYXJ0CisgICAgICAgIDsvLyBTdGVwNDogT2J0YWluIHRoZSBISCBwYXJ0CisgICAgICAgIDsvLworICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgZDAgZDEgLSAtCisgICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyUm93MTAsaW4xMCxpbjAwLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzUgNF0gPSBbZjU6ZjFdICAgIAorICAgICAgICBQS0hCVCAgIHRyUm93MDAsaW4wMCxpbjEwLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKKyAgICAgICAgCisgICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQorICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFBLSFRCICAgdHJSb3czMCxpbjEyLGluMDIsQVNSICMxNiAgICAgICAgICAgICAgOy8vIFsxMyAxMl0gPSBbNyAzXQorICAgICAgICAgUEtIQlQgICB0clJvdzIwLGluMDIsaW4xMixMU0wgIzE2ICAgICAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKKyAgICAgICAgCisgICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKKyAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB0clJvdzAyLGluMjAsaW4zMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAorICAgICAgICBQS0hUQiAgIHRyUm93MTIsaW4zMCxpbjIwLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzcgNl0gPSBbZjEzOmY5XSAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICA7Ly8gSEggMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICBkMTAgZDExCisgICAgICAgIDsvLyAgICAtIC0gIGQxNCBkMTUKKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJSb3czMixpbjMyLGluMjIsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbMTUgMTRdID0gWzE1IDExXQorICAgICAgICBQS0hCVCAgIHRyUm93MjIsaW4yMixpbjMyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzExIDEwXSA9IFsxNCAxMF0KKyAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIGZpcnN0IHR3byBjb2x1bW5zKHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCisgICAgICAgIAorICAgICAgICBTQUREMTYgICAgICByb3dTdW0xLHRyUm93MDAsdHJSb3cxMCAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQorICAgICAgICBTQUREMTYgICAgICByb3dTdW0yLHRyUm93MjAsdHJSb3czMCAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQorICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMSx0clJvdzAwLHRyUm93MTAgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQorICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMix0clJvdzIwLHRyUm93MzAgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQorICAgICAgICBTQUREMTYgICAgICByb3dPcDAwLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQorICAgICAgICBTU1VCMTYgICAgICByb3dPcDEwLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQorICAgICAgICBTU1VCMTYgICAgICByb3dPcDIwLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQorICAgICAgICBTQUREMTYgICAgICByb3dPcDMwLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQorICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTEsdHJSb3cwMix0clJvdzEyICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCisgICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTIsdHJSb3cyMix0clJvdzMyICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYxLHRyUm93MDIsdHJSb3cxMiAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYyLHRyUm93MjIsdHJSb3czMiAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCisgICAgICAgIFNBREQxNiAgICAgIHJvd09wMDIscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd09wMTIscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd09wMjIscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCisgICAgICAgIFNBREQxNiAgICAgIHJvd09wMzIscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4CisgICAgICAgIDsvLyBJbnB1dDogIHJvd09wW11bXQorICAgICAgICA7Ly8gT3V0cHV0OiB0ckNvbFtdW10gCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgZDAgZDEgLSAtCisgICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyQ29sMTAscm93T3AxMCxyb3dPcDAwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0KKyAgICAgICAgUEtIQlQgICB0ckNvbDAwLHJvd09wMDAscm93T3AxMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKKyAgICAgICAgCisgICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQorICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFBLSFRCICAgdHJDb2wzMCxyb3dPcDEyLHJvd09wMDIsQVNSICMxNiAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCisgICAgICAgICBQS0hCVCAgIHRyQ29sMjAscm93T3AwMixyb3dPcDEyLExTTCAjMTYgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCisgICAgICAgIAorICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCisgICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgdHJDb2wwMixyb3dPcDIwLHJvd09wMzAsTFNMICMxNiAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAorICAgICAgICBQS0hUQiAgIHRyQ29sMTIscm93T3AzMCxyb3dPcDIwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKKyAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0ckNvbDMyLHJvd09wMzIscm93T3AyMixBU1IgIzE2ICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCisgICAgICAgIFBLSEJUICAgdHJDb2wyMixyb3dPcDIyLHJvd09wMzIsTFNMICMxNiAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQorICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFN0b3JlIHBEYXRhKFJOMCkgb24gc3RhY2sgYW5kIHJlc3RvcmUgaXQgb25seSBhdCB0aGUgZmluYWwgc3RvcmUgYmFjaworICAgICAgICA7Ly8gVGhpcyBmcmVlcyB1cCBhIHJlZ2lzdGVyIChSTjApIHdoaWNoIGlzIHVzZWQgdG8gcmVkdWNlIG51bWJlciBvZiBpbnRlcm1lZGlhdGUgc3RhbGxzIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX1NUUiAgICAgICBwRGF0YSxwRGF0YU9uU3RhY2sKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIGZpcnN0IHR3byBjb2x1bW5zKHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGNvbFN1bTEsdHJDb2wwMCx0ckNvbDEwICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCisgICAgICAgIFNBREQxNiAgICAgIGNvbFN1bTIsdHJDb2wyMCx0ckNvbDMwICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIGNvbERpZmYxLHRyQ29sMDAsdHJDb2wxMCAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCisgICAgICAgIFNTVUIxNiAgICAgIGNvbERpZmYyLHRyQ29sMjAsdHJDb2wzMCAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCisgICAgICAgIFNBREQxNiAgICAgIGNvbE9wMDAsY29sU3VtMSxjb2xTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMTAsY29sU3VtMSxjb2xTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCisgICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMjAsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCisgICAgICAgIFNBREQxNiAgICAgIGNvbE9wMzAsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMobmV4dCB0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgOy8vIFFQIERpdmlzaW9uIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIFNBREQxNiAgICAgIGNvbFN1bTEsdHJDb2wwMix0ckNvbDEyICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCisgICAgICAgIFNBREQxNiAgICAgIGNvbFN1bTIsdHJDb2wyMix0ckNvbDMyICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIGNvbERpZmYxLHRyQ29sMDIsdHJDb2wxMiAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCisgICAgICAgIFNTVUIxNiAgICAgIGNvbERpZmYyLHRyQ29sMjIsdHJDb2wzMiAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCisgICAgICAgIFNBREQxNiAgICAgIGNvbE9wMDIsY29sU3VtMSxjb2xTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMTIsY29sU3VtMSxjb2xTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCisgICAgICAgIExEUiAgICAgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIExEUlNCICAgICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQorICAgICAgICBTU1VCMTYgICAgICBjb2xPcDIyLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQorICAgICAgICBTQUREMTYgICAgICBjb2xPcDMyLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICBMRFJTQiAgICAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0gCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLworICAgICAgICA7Ly8gPERlcXVhbnRpemU+IGltcHJvdmVzIG9uIHRoZSBjLXJlZmVyZW5jZSBjb2RlCisgICAgICAgIDsvLyBCb3RoIHRoZSAgY2FzZXMgaS5lLiwgU2hpZnQ+PTAgYW5kIFNoaWZ0PDAgY2FzZXMgYXJlIGNvdmVyZWQgdG9nZXRoZXIKKyAgICAgICAgOy8vIFdlIGRvIG5vdCBzdWJ0cmFjdCAyIGZyb20gU2hpZnQgYXMgaW4gQyByZWZlcmVuY2UsIGluc3RlYWQgcGVyZm9ybSBhCisgICAgICAgIDsvLyBTY2FsZSA8PCBTaGlmdCBvbmNlIGluIHRoZSBiZWdpbm5pbmcgYW5kIGRvIGEgcmlnaHQgc2hpZnQgYnkgYSAKKyAgICAgICAgOy8vIGNvbnN0YW50IDIgYWZ0ZXIgdGhlIE11bHRpcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgUm91bmQgd291bGQgYmUgMiAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gQnkgZG9pbmcgdGhpcyB3ZSBhdmlvZCB0aGUgQnJhbmNoZXMgcmVxdWlyZWQgYW5kIGFsc28gCisgICAgICAgIDsvLyByZWR1Y2UgdGhlIGNvZGUgc2l6ZSBzdWJzdGFudGlhbGx5CisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgUm91bmQsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSb3VuZCA9IDIKKyAgICAgICAgTFNMICAgICAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0CisgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDEKKyAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AwMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMDIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDAwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AwMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIAorICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgorICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgorICAgICAgICBQS0hCVCAgIG91dDAwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgUEtIQlQgICBvdXQwMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAyCisgICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMTAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDEyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AxMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMTIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICAKKyAgICAgICAgQVNSICAgICB0ZW1wMSwgdGVtcDEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IFRlbXAxID4+IDIKKyAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKKyAgICAgICAgUEtIQlQgICBvdXQxMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIFBLSEJUICAgb3V0MTIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAzCisgICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMjAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDIyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AyMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMjIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICAKKyAgICAgICAgQVNSICAgICB0ZW1wMSwgdGVtcDEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IFRlbXAxID4+IDIgCisgICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCisgICAgICAgIFBLSEJUICAgb3V0MjAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICBQS0hCVCAgIG91dDIyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgNAorICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDMwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AzMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMzAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDMyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgcERhdGEscERhdGFPblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmVzdG9yZSBwRGF0YSBwb2ludGVyIGZyb20gc3RhY2sKKyAgICAgICAgQVNSICAgICB0ZW1wMSwgdGVtcDEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IFRlbXAxID4+IDIKKyAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKKyAgICAgICAgUEtIQlQgICBvdXQzMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIFBLSEJUICAgb3V0MzIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBTdG9yZSBhbGwgdGhlIDR4NCBwaXhlbHMKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitzdG9yZV9jb2VmZgorICAgICAgICAKKyAgICAgICAgU1RNSUEgICBwRGF0YSx7b3V0MDAsb3V0MDIsb3V0MTAsb3V0MTIsb3V0MjAsb3V0MjIsb3V0MzAsb3V0MzJ9CisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQgICAgICAgIAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAKKyAgICAKKworOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICAgICAgCisKKworOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgorICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwcFNyYyAgICAgICAgICAgICAgIFJOICAwCitwRHN0ICAgICAgICAgICAgICAgIFJOICAxCitRUFIyICAgICAgICAgICAgICAgIFJOICAyCisKKzsvL091dHB1dCBSZWdpc3RlcnMKK3Jlc3VsdCAgICAgICAgICAgICAgUk4gIDAKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3BEc3RSNCAgICAgICAgICAgICAgUk4gIDQKK3BEc3RSMCAgICAgICAgICAgICAgUk4gIDAKK1FQUjEgICAgICAgICAgICAgICAgUk4gIDEKK1FQUjUgICAgICAgICAgICAgICAgUk4gIDUKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGIEFSTTExMzZKUworICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLHI1CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBEc3RSNCxwRHN0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjEKKyAgICAgICAgTU9WICAgICBRUFI1LFFQUjIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIyCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBwRHN0UjAscERzdFI0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMAorICAgICAgICBNT1YgICAgIFFQUjEsUVBSNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIxCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAKKyAgICAKKworICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMTE1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzLmgKKyAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgSHVmZmZtYW4gY29kaW5nIGFuZCBkZWNvZGluZyAKKyAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWEhVRkZUQUJfSF8KKyNkZWZpbmUgX09NWEhVRkZUQUJfSF8KKworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF07CisKKworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludGVyVmxjTDBMMVsyMDBdOworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdOworLy9leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFszMl07CitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdOworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFs1M107CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXQorCisjZW5kaWYgLyogX09NWEhVRkZUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmODY1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmgKKyAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgWmlnemFnIHNjYW4gaW4gTVA0UDIgY29kZWMuCisgKgorICovCisgCisjaWZuZGVmIF9PTVhaSUdaQUdUQUJfSAorI2RlZmluZSBfT01YWklHWkFHVEFCX0gKKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml07CisvL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdOworLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuIFs2NF07CisKKyNlbmRpZiAvKiBfT01YWklHWkFHVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDFlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwpAQCAtMCwwICsxLDc1IEBACis7IC8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9DbGlwOF9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGUgZm9yIENsaXBwaW5nIDE2IGJpdCB2YWx1ZSB0byBbMCwyNTVdIFJhbmdlCis7ICovIAorCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgCisgICAgIAorICAgICAgSUYgQVJNMTEzNkpTCisgCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcFNyYyAgICAgICAgICAgICAgICAgUk4gMAorcERzdCAgICAgICAgICAgICAgICAgUk4gMQorc3RlcCAgICAgICAgICAgICAgICAgUk4gMgorCis7Ly8gTG9jYWwgdmFyaWFibGVzCisKK3gwICAgICAgICAgICAgICAgICAgIFJOIDMKK3gxICAgICAgICAgICAgICAgICAgIFJOIDQKK3gyICAgICAgICAgICAgICAgICAgIFJOIDUKK3gzICAgICAgICAgICAgICAgICAgIFJOIDYKKworQ291bnQgICAgICAgICAgICAgICAgUk4gMTQKKyAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMl9DbGlwOCxyNgorICAgICAgIAorCisgICAgICAgIE1PViAgICAgICAgICBDb3VudCwjOAorbG9vcAorCisgICAgICAgIExETUlBICAgICAgICBwU3JjISx7eDAsIHgxfQorICAgICAgICBTVUJTICAgICAgICAgQ291bnQsQ291bnQsICMxICAgICAgICAgIDsvLyBjb3VudCBkb3duCisgICAgICAgIExETUlBICAgICAgICBwU3JjISx7eDIsIHgzfQorICAgICAgICBVU0FUMTYgICAgICAgeDAsICM4LCB4MCAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQorICAgICAgICBVU0FUMTYgICAgICAgeDEsICM4LCB4MSAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQorICAgICAgICBTVFJCICAgICAgICAgeDAsIFtwRHN0XQorICAgICAgICBNT1YgICAgICAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIFNUUkIgICAgICAgICB4MCwgW3BEc3QsIzFdCisgICAgICAgIFNUUkIgICAgICAgICB4MSwgW3BEc3QsIzJdCisgICAgICAgIE1PViAgICAgICAgICB4MSwgeDEsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICAgICAgIHgxLCBbcERzdCwjM10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgIHgyLCAjOCwgeDIgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KKyAgICAgICAgVVNBVDE2ICAgICAgIHgzLCAjOCwgeDMgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KKyAgICAgICAgU1RSQiAgICAgICAgIHgyLCBbcERzdCwjNF0KKyAgICAgICAgTU9WICAgICAgICAgIHgyLCB4MiwgTFNSICMxNgorICAgICAgICBTVFJCICAgICAgICAgeDIsIFtwRHN0LCM1XQorICAgICAgICBTVFJCICAgICAgICAgeDMsIFtwRHN0LCM2XQorICAgICAgICBNT1YgICAgICAgICAgeDMsIHgzLCBMU1IgIzE2CisgICAgICAgIFNUUkIgICAgICAgICB4MywgW3BEc3QsIzddCisgICAgICAgIEFERCAgICAgICAgICBwRHN0LHBEc3Qsc3RlcCAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBEc3QgYnkgc3RlcCB2YWx1ZQorICAgICAgICAgCisgICAgICAgIEJHVCAgICAgICAgICBsb29wICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29udGludWUgbG9vcCB1bnRpbCBDb3VudCByZWFjaGVzIDY0IAorCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzA5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCkBAIC0wLDAgKzEsMzk4IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIsIGludHJhIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIAorOyAqCis7ICogCis7ICoKKzsgKiAKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIAorCisKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK3Nob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKKworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CisKK2Z0eXBlICAgICAgICAgICAgICAgIFJOIDAKK3RlbXAzICAgICAgICAgICAgICAgIFJOIDQKK3RlbXAgICAgICAgICAgICAgICAgIFJOIDUKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKK0VzY2FwZSAgICAgICAgICAgICAgIFJOIDUKKworOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCit6aWd6YWcgICAgICAgICAgICAgICBSTiAwCitzdG9yZUxldmVsICAgICAgICAgICBSTiAxCit0ZW1wMiAgICAgICAgICAgICAgICBSTiA0Cit0ZW1wMSAgICAgICAgICAgICAgICBSTiA1CitzaWduICAgICAgICAgICAgICAgICBSTiA1CitMYXN0ICAgICAgICAgICAgICAgICBSTiA3CitzdG9yZVJ1biAgICAgICAgICAgICBSTiAxNAorCisKK3BhY2tSZXRJbmRleCAgICAgICAgIFJOIDUKKworCittYXJrZXJiaXQgICAgICAgICAgICBSTiA1CisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICBSTiA4CitSQml0QnVmZmVyICAgICAgICAgICBSTiA5CitSQml0Q291bnQgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKK0xSICAgICAgICAgICAgICAgICAgIFJOIDE0ICAgICAgICAKKyAgICAgICAgCisKKworICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwT2Zmc2V0LDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBMaW5rUmVnaXN0ZXIsNCAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworICAgICAgICA7Ly8gZ2V0IHRoZSB0YWJsZSBhZGRyZXNzZXMgZnJvbSBzdGFjayAgICAgICAKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgQUxMIHplcm9zIGF0IHBEc3QKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSBDb3VudCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgIExhc3QsIzAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMaW5rIFJlZ2lzdGVyIG9uIFN0YWNrCisgICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMiwjMAorICAgICAgICBNT1YgICAgICAgICAgICAgTFIsIzAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgTWFjcm8gYW5kIFN0b3JlIGFsbCB6ZXJvcyB0byBwRHN0IAorICAKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBwQml0c3RyZWFtIG9uIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcEJpdE9mZnNldCBvbiBzdGFjaworICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgICAgICBwRHN0LHBEc3QsIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmVzdG9yZSBwRHN0CisKKyAgICAgICAgOy8vIFRoZSBhcm1WQ000UDJfR2V0VkxDQml0cyBiZWdpbnMKKworZ2V0VkxDYml0cworICAgICAgICAKKyAgICAgICAgTV9CRF9MT09LOCAgICAgIEVzY2FwZSw3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEVzY2FwZSBWYWx1ZQorICAgICAgICBMU1IgICAgICAgICAgICAgRXNjYXBlLEVzY2FwZSwjMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRXNjYXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGZvciBlc2NhcGUgbW9kZQorICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzAKKyAgICAgICAgQk5FICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggaWYgbm90IGluIEVzY2FwZSBtb2RlIDMKKworICAgICAgICBNX0JEX1ZTS0lQOCAgICAgIzcsVDEKKyAgICAgICAgQ01QICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBzaG9ydFZpZGVvSGVhZGVyIGZsYWcgdG8ga25vdyB0aGUgdHlwZSBvZiBFc2NhcGUgbW9kZQorICAgICAgICBCRVEgICAgICAgICAgICAgZW5kRmlsbFZMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEVzY2FwZSBNb2RlIDQKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZUxldmVsLDgsVDEKKworICAgICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHdoZXRoZXIgdGhlIFJlc2VydmVkIHZhbHVlcyBmb3IgTGV2ZWwgYXJlIHVzZWQgYW5kIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGl0IGlzIHNvCisKKyAgICAgICAgVEVRICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzAKKyAgICAgICAgVEVRTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsIzEyOCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGVycm9yIGlmIENvdW50K3N0b3JlUnVuID49IDY0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBBZGRyZXNzIG9mIFppZ3phZyB0YWJsZQorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorICAgICAgICAgICAgICAgIAorICAgICAgICBTWFRCICAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gRXh0ZW5kIHN0b3JlTGV2ZWwgdG8gMzIgYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5ndGgKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSBMZXZlbAorICAgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworICAgICAgIAorICAgICAgICAKKworZW5kRmlsbFZMRAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBGdHlwZSggRXNjYXBlIE1vZGUpIHZhbHVlIGJhc2VkIG9uIHRoZSB0d28gc3VjY2Vzc2l2ZSBiaXRzIGluIHRoZSBiaXRzdHJlYW0KKyAgICAgCisgICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgIAorICAgICAgICBNT1ZFUSAgICAgICAgICAgZnR5cGUsIzEKKyAgICAgICAgQkVRICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMxCisgICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMworICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzIKKyAgICAgICAgCisKK25vdEVzY2FwZW1vZGUKKworICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgcGFja2VkIFZMQyB0YWJsZSB3aXRoIGxhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQ29tYmluZWQgVkxDIFRhYmxlCisgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZnR5cGUgPj0zIGdldCBwZXJmb3JtIEZpeGVkIExlbmd0aCBEZWNvZGluZyAoRXNjYXBlIE1vZGUgMykKKyAgICAgICAgQkdFICAgICAgICAgICAgIEVzY2FwZU1vZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIGNvbnRpbnVlIG5vcm1hbCBWTEMgRGVjb2RpbmcKKyAgICAgICAgCisgICAgICAgIDsvLyBWYXJpYWJsZSBsZW5naCBkZWNvZGluZywgImFybVVuUGFja1ZMQzMyIiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgICAgICAgcGFja1JldEluZGV4LFQxLFQyLHBWbGNUYWJsZUwwTDEsNCwyCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHRlbXAzLD0weEZGRgorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIHBhY2tSZXRJbmRleCx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBmb3IgaW52YWxpZCBzeW1ib2wKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBpbnZhbGlkIHN5bWJvbCBvY2N1cnMgZXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgICAgICBMYXN0LHBhY2tSZXRJbmRleCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IExhc3QgZnJvbSBwYWNrZWQgSW5kZXgKKyAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgCisKKyAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlUnVuLHBhY2tSZXRJbmRleCwjNyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgUnVuIFZhbHVlIGZyb20gUGFja2VkIGluZGV4CisgICAgICAgIEFORCAgICAgICAgICAgICBzdG9yZUxldmVsLHBhY2tSZXRJbmRleCwjMHg3YyAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmVMZXZlbD1wYWNrUmV0SW5kZXhbMi02XSxzdG9yZUxldmVsWzAtMV09MCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIExNQVggdGFibGUKKyAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIExTUiAgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTGV2ZWwgdmFsdWUKKworICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgICAgIGZ0eXBlMgorICAgICAgICAKKyAgICAgICAgOy8vIGZ0eXBlPT0xOyBFc2NhcGUgbW9kZSA9MQorICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBMTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgOy8vIElmIHRoZSBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSxzdG9yZVJ1bl0KKworICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVMZXZlbCx0ZW1wMSxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgCisKK2Z0eXBlMgorCisgICAgICAgIDsvLyBmdHlwZSA9MjsgRXNjYXBlIG1vZGUgPTIKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlIAorICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzIKKyAgICAgICAgQk5FICAgICAgICAgICAgIEZpbGxWTERMMQorICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgIHRlbXAxLCBwUk1BWFRhYmxlTDBMMSwgTGFzdCwgTFNMIzQgICAgICAgICAgICAgICA7Ly8gSWYgTGFzdD0xIGFkZCAzMiB0byB0YWJsZSBhZGRyZXNzCisgICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wMixzdG9yZUxldmVsLCMxCisgICAgICAgIExEUkIgICAgICAgICAgICB0ZW1wMSxbdGVtcDEsdGVtcDJdCisKKyAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHN0b3JlUnVuLCMxCisgICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZVJ1bix0ZW1wMQorICAgICAgICAKK0ZpbGxWTERMMSAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZSAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHNpZ24sMSxUMQorCisgICAgICAgIENNUCAgICAgICAgICAgICBzaWduLCMxCisgICAgICAgIFJTQkVRICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzAKKyAKKyAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVubGVuZ2h0CisKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCisgCitzdG9yZUxldmVsTDEKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KKyAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgTGV2ZWwgdmFsIGlzIExhc3Qgbm9uIHplcm8gdmFsCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBMU1IgICAgICAgICAgICAgTGFzdCxMYXN0LCMxCisgICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKKyAKKworCisgICAgICAgIDsvLyBGaXhlZCBMZW5naCBEZWNvZGluZyBFc2NhcGUgTW9kZSAzCisKK0VzY2FwZU1vZGUzCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIExhc3QsMSxUMQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVSdW4sNixUMQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBSdW4gKyBDb3VudCBleGNlZWRzIDYzCisgICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMiwjNjQKKyAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQorICAgICAgICBURVEgICAgICAgICAgICAgbWFya2VyYml0LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIG1hcmtlciBiaXQgaXMgemVybworICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCisgICAgICAgIAorICAgICAgICBNX0JEX1JFQUQxNiAgICAgc3RvcmVMZXZlbCwxMixUMQorCisgICAgICAgIFRTVCAgICAgICAgICAgICBzdG9yZUxldmVsLCMweDgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVzdCBpZiB0aGUgbGV2ZWwgaXMgbmVnYXRpdmUKKyAgICAgICAgU1VCTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjNDA5NgorICAgICAgICBDTVAgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAorICAgICAgICBDTVBORSAgICAgICAgICAgc3RvcmVMZXZlbCwjLTIwNDgKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBMZXZlbD09MCBvciAgLTIwNDggCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUKKyAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQorICAgICAgICAgICAKKworICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIgKCBTaWduIG5vdCB1c2VkIGFzIHN0b3JlTGV2ZWwgaXMgcHJlcHJvY2Vzc2VkKQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAKKworICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW4gTGVuZ3RoCisKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCisKKworIAorc3RvcmVMZXZlbExhc3QKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KKyAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzEKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCisgICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICAgICAgZW5kIAorICAgICAgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKKyAgICAgICAgCitlbmQKKworICAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vUnVuIHRoZSBMb29wIHVudGlsbCBDb3VudCByZWFjaGVzIDY0CisKKyAgICAgICAgQkxUICAgICAgICAgICAgIGdldFZMQ2JpdHMKKworICAgICAgICAKK0V4aXRPaworICAgICAgICA7Ly8gRXhpdCBXaGVuIFZMQyBEZWNvZGluZyBpcyBkb25lIFN1Y2Nlc3NmdWxseSAKKyAgIAorICAgICAgICA7Ly8gTG9hZGluZyBwcEJpdFN0cmVhbSBhbmQgcEJpdE9mZnNldCBmcm9tIHN0YWNrCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQorICAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0CisKKyAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0CisgICAgICAgICAgICAgCisgICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTU9WTkUgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKyAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIExpbmsgUmVnaXN0ZXIgQmFjaworICAgICAgICBCICAgICAgICAgICAgICAgZXhpdDIKKworRXhpdEVycm9yCisgICAgICAgIDsvLyBFeGl0IFdoZW4gYW4gRXJyb3Igb2NjdXJzIAorCisgICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKKyAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0CisgICAgICAgIE1fTERSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyCisgICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCisKK2V4aXQyCisgICAgICAgCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0ZDA1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKQEAgLTAsMCArMSwyMTEgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBIdWZmbWFuIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworCisKKworLy8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBQYWNrZWQgVkxDIHRhYmxlcyB3aXRoIExhc3Q9MCBhbmQgTGFzdD0xCisKKy8vICAgICAgICAgICAgICBvcHRpbWl6ZWQgUGFja2VkIFZMQyB0YWJsZSBFbnRyeSBGb3JtYXQgCisvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAKKy8vICAgICAgICAxNSAxNCAxMyAxMiAxMSAxMCAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAorLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vICAgICAgIHwgIExlbiAgIHwgICAgICAgUnVuICAgICAgIHwgICAgIExldmVsICAgIHxMIHwgMSB8CisvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKKy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYSBsZWFmIGVudHJ5IHRoZW4gYml0IDAgc2V0OgorLy8gICAgTGVuICAgID0gTnVtYmVyIG9mIGJpdHMgb3ZlcnJlYWQgICgwIHRvIDcpICAzIGJpdHMKKy8vICAgIFJ1biAgICA9IFJ1bkxlbmd0aCBvZiB0aGUgU3ltYm9sICAoMCB0byA2MykgNiBiaXRzCisvLyAgICBMZXZlbCAgPSBMZXZlbCBvZiB0aGUgU3ltYm9sICAgICAgKDAgdG8gMzEpIDUgYml0cworLy8gICAgTCAgICAgID0gTGFzdCBWYWx1ZSBvZiB0aGUgU3ltYm9sICgwIG9yIDEpICAxIGJpdAorLy8KKy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhbiBpbnRlcm5hbCBub2RlIHRoZW4gYml0IDAgaXMgY2xlYXI6CisvLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQorLy8gICAgICAgICAgICAgc3RhcnQgdG8gdGhlIG5leHQgdGFibGUgbm9kZQorLy8KKy8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKKy8vIG5leHQgU3RlcCBiaXRzIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gdW50aWwgYSBsZWFmIG5vZGUKKy8vIGlzIG9idGFpbmVkLiBUaGUgU3RlcCBzaXplcyBhcmUgc3VwcGxpZWQgdG8gdGhlIFZMRCBtYWNyby4KKworLy8gVGhlIFZMQyB0YWJsZXMgdXNlZCBmb3IgSW50cmEgYW5kIG5vbiBpbnRhIGNvZWZmaWNpZW50cyBpbiBub24gRXNjYXBlIG1vZGUKKy8vIGNvbnRhaW5zIHN5bWJvbHMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xLgorLy8gSWYgYSBzeW1ib2wgaXMgbm90IGZvdW5kIGluIHRoZSB0YWJsZSBpdCB3aWxsIGJlIGNvZGVkIGFzIDB4RkZGCisgCisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludGVyVmxjTDBMMVsyMDBdID0geworICAgIDB4MDAyMCwgMHgwMTA4LCAweDAxNDgsIDB4MDE3MCwgMHgwMTc4LCAweDAxODAsIDB4MDE4OCwgMHgxYjA5LAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHgyMTA5LCAweDIxMDksIDB4MDIwOSwgMHgwMDExLAorICAgIDB4MDAyOCwgMHgwMDYwLCAweDAwYjgsIDB4MDBlMCwgMHgwMDMwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAorICAgIDB4M2ZmZiwgMHgzZmZmLCAweDAwMzgsIDB4MDA0MCwgMHgyMTE1LCAweDIxMTUsIDB4MjAxZCwgMHgyMDFkLAorICAgIDB4MjA1OSwgMHgyMDU5LCAweDIwNTEsIDB4MjA1MSwgMHgxYzBkLCAweDFiMGQsIDB4MWEwZCwgMHgxOTBkLAorICAgIDB4MDkxMSwgMHgwODExLCAweDA3MTEsIDB4MDYxMSwgMHgwNTExLCAweDAzMTksIDB4MDIxOSwgMHgwMTIxLAorICAgIDB4MDA2OCwgMHgwMDkwLCAweDNmZmYsIDB4M2ZmZiwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAorICAgIDB4MjA2MSwgMHgyMDYxLCAweDIxMjksIDB4MjEyOSwgMHgzNzA5LCAweDM3MDksIDB4MzgwOSwgMHgzODA5LAorICAgIDB4M2QwZCwgMHgzZDBkLCAweDNlMGQsIDB4M2UwZCwgMHgzZjBkLCAweDNmMGQsIDB4MjAwZCwgMHgyMDBkLAorICAgIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMTMxLCAweDAyMjEsIDB4MDQxOSwgMHgwNTE5LAorICAgIDB4MDYxOSwgMHgwYTExLCAweDE5MDksIDB4MWEwOSwgMHgyMTBkLCAweDIyMGQsIDB4MjMwZCwgMHgyNDBkLAorICAgIDB4MjUwZCwgMHgyNjBkLCAweDI3MGQsIDB4MjgwZCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAorICAgIDB4MDA0OSwgMHgwMDQxLCAweDM4MGQsIDB4MzgwZCwgMHgzNzBkLCAweDM3MGQsIDB4MzYwZCwgMHgzNjBkLAorICAgIDB4MzUwZCwgMHgzNTBkLCAweDM0MGQsIDB4MzQwZCwgMHgzMzBkLCAweDMzMGQsIDB4MzIwZCwgMHgzMjBkLAorICAgIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDEwMCwgMHgzMTBkLCAweDMxMGQsIDB4MjAxNSwgMHgyMDE1LAorICAgIDB4MzYwOSwgMHgzNjA5LCAweDM1MDksIDB4MzUwOSwgMHgzNDA5LCAweDM0MDksIDB4MzMwOSwgMHgzMzA5LAorICAgIDB4MzIwOSwgMHgzMjA5LCAweDMxMDksIDB4MzEwOSwgMHgwMTEwLCAweDAxMzAsIDB4MDEzOCwgMHgwMTQwLAorICAgIDB4MDExOCwgMHgwMTIwLCAweDAxMjgsIDB4MTAwZCwgMHgzMDA5LCAweDMwMDksIDB4MmYwOSwgMHgyZjA5LAorICAgIDB4MjQxMSwgMHgyNDExLCAweDIzMTEsIDB4MjMxMSwgMHgyMDM5LCAweDIwMzksIDB4MjAzMSwgMHgyMDMxLAorICAgIDB4MGYwZCwgMHgwZTBkLCAweDBkMGQsIDB4MGMwZCwgMHgwYjBkLCAweDBhMGQsIDB4MDkwZCwgMHgwZTA5LAorICAgIDB4MGQwOSwgMHgwMjExLCAweDAxMTksIDB4MDAyOSwgMHgwMTUwLCAweDAxNTgsIDB4MDE2MCwgMHgwMTY4LAorICAgIDB4MjgwZCwgMHgyODBkLCAweDI3MGQsIDB4MjcwZCwgMHgyNjBkLCAweDI2MGQsIDB4MjUwZCwgMHgyNTBkLAorICAgIDB4MmMwOSwgMHgyYzA5LCAweGI3NTksIDB4Yjc1OSwgMHgyYTA5LCAweDJhMDksIDB4MjAyMSwgMHgyMDIxLAorICAgIDB4MDQwZCwgMHgwMzBkLCAweDBiMzUsIDB4MDEwZCwgMHgwOTA5LCAweDA4MDksIDB4MDcwOSwgMHgwNjA5LAorICAgIDB4MDExMSwgMHgwMDE5LCAweDI1MDksIDB4MjUwOSwgMHgyNDA5LCAweDI0MDksIDB4MjMwOSwgMHgyMzA5Cit9OworCisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludHJhVmxjTDBMMVsyMDBdID0geworICAgIDB4MDAyMCwgMHgwMTA4LCAweDAxNDgsIDB4MDE3MCwgMHgwMTc4LCAweDAxODAsIDB4MDE4OCwgMHgwZjA5LAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHgyMDExLCAweDIwMTEsIDB4MDEwOSwgMHgwMDE5LAorICAgIDB4MDAyOCwgMHgwMDYwLCAweDAwYjgsIDB4MDBlMCwgMHgwMDMwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAorICAgIDB4M2ZmZiwgMHgzZmZmLCAweDAwMzgsIDB4MDA0MCwgMHgyMDNkLCAweDIwM2QsIDB4MjAzNSwgMHgyMDM1LAorICAgIDB4MjBiMSwgMHgyMGIxLCAweDIwYTksIDB4MjBhOSwgMHgwMjE1LCAweDAxMWQsIDB4MDAyZCwgMHgwZDA5LAorICAgIDB4MDUxOSwgMHgwODExLCAweDA0MTksIDB4MDMyMSwgMHgwMjIxLCAweDAxMzksIDB4MDBhMSwgMHgwMDk5LAorICAgIDB4MDA2OCwgMHgwMDkwLCAweDNmZmYsIDB4M2ZmZiwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAorICAgIDB4MjBiOSwgMHgyMGI5LCAweDIwYzEsIDB4MjBjMSwgMHgyMTQxLCAweDIxNDEsIDB4MjkxMSwgMHgyOTExLAorICAgIDB4MjMxNSwgMHgyMzE1LCAweDI0MTUsIDB4MjQxNSwgMHgyZjBkLCAweDJmMGQsIDB4MzAwZCwgMHgzMDBkLAorICAgIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMGM5LCAweDAwZDEsIDB4MDBkOSwgMHgwMTQ5LAorICAgIDB4MDYxOSwgMHgwMTUxLCAweDAyMjksIDB4MDcxOSwgMHgwZTA5LCAweDAwNDUsIDB4MDUxNSwgMHgwNjE1LAorICAgIDB4MTEwZCwgMHgxMjBkLCAweDEzMGQsIDB4MTQwZCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAorICAgIDB4MDA5MSwgMHgwMDg5LCAweDJlMGQsIDB4MmUwZCwgMHgyZDBkLCAweDJkMGQsIDB4MmMwZCwgMHgyYzBkLAorICAgIDB4MmIwZCwgMHgyYjBkLCAweDJhMGQsIDB4MmEwZCwgMHgyMTE1LCAweDIxMTUsIDB4MjAyNSwgMHgyMDI1LAorICAgIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDEwMCwgMHgyYzA5LCAweDJjMDksIDB4MmIwOSwgMHgyYjA5LAorICAgIDB4MjcxMSwgMHgyNzExLCAweDI2MTEsIDB4MjYxMSwgMHgyNTExLCAweDI1MTEsIDB4MjMxOSwgMHgyMzE5LAorICAgIDB4MjIxOSwgMHgyMjE5LCAweDIxMzEsIDB4MjEzMSwgMHgwMTEwLCAweDAxMzAsIDB4MDEzOCwgMHgwMTQwLAorICAgIDB4MDExOCwgMHgwMTIwLCAweDAxMjgsIDB4MDgwZCwgMHgyMTI5LCAweDIxMjksIDB4MjA4MSwgMHgyMDgxLAorICAgIDB4MjQxMSwgMHgyNDExLCAweDIwNzksIDB4MjA3OSwgMHgyMDcxLCAweDIwNzEsIDB4MjA2OSwgMHgyMDY5LAorICAgIDB4MWJiNSwgMHgwNjBkLCAweDAwMWQsIDB4ZDNmOSwgMHgwOTA5LCAweDA4MDksIDB4MDkwZCwgMHgwMzExLAorICAgIDB4MDEyMSwgMHgwMDYxLCAweDAwNTksIDB4MDA1MSwgMHgwMTUwLCAweDAxNTgsIDB4MDE2MCwgMHgwMTY4LAorICAgIDB4MjQwZCwgMHgyNDBkLCAweDIzMGQsIDB4MjMwZCwgMHgyNjA5LCAweDI2MDksIDB4MjUwZCwgMHgyNTBkLAorICAgIDB4MjcwOSwgMHgyNzA5LCAweDIyMTEsIDB4MjIxMSwgMHgyMTE5LCAweDIxMTksIDB4MjA0OSwgMHgyMDQ5LAorICAgIDB4MDAxNSwgMHgwNTA5LCAweDAyMGQsIDB4MDEwZCwgMHgwNDA5LCAweDAzMDksIDB4MDA0MSwgMHgwMDM5LAorICAgIDB4MDExMSwgMHgwMDMxLCAweDIyMDksIDB4MjIwOSwgMHgyMDI5LCAweDIwMjksIDB4MjAyMSwgMHgyMDIxCit9OworCitjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF0gPSB7CisgICAgMHgwMDIwLCAweDAwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywgMHgyMDAxLCAweDIwMDEsCisgICAgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCisgICAgMHgwMDI4LCAweDAwMGYsIDB4MjAwZCwgMHgyMDBkLCAweDAwMzAsIDB4MDAxMywgMHgyMDExLCAweDIwMTEsCisgICAgMHgwMDM4LCAweDAwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDNmZmYsIDB4M2ZmZiwgMHgyMDE5LCAweDIwMTksCisKKwkweDAwMjAsIDB4MDAwOSwgMHgyMDA3LCAweDIwMDcsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKKyAgICAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKKyAgICAweDAwMjgsIDB4MDAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MDAzMCwgMHgwMDExLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDAwMzgsIDB4MDAxNSwgMHgyMDEzLCAweDIwMTMsIDB4MWZmZiwgMHgwMDE5LCAweDIwMTcsIDB4MjAxNworfTsKKworCitjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF0gPSB7CisgICAgMHgwMDEwLCAweDAwZjAsIDB4MDA0MywgMHgwMDNmLCAweDQwNDEsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsCisgICAgMHgwMDE4LCAweDAwZDgsIDB4MDA0NywgMHgwMDNiLCAweDAwMjAsIDB4MDA4MCwgMHgwMGE4LCAweDAwZDAsCisgICAgMHgwMDI4LCAweDAwNDgsIDB4MDA3MCwgMHgwMDc4LCAweDFmZmYsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsCisgICAgMHgwMDgxLCAweDAwMDEsIDB4MDA3ZiwgMHgwMDAzLCAweDIwN2QsIDB4MjA3ZCwgMHgyMDA1LCAweDIwMDUsCisgICAgMHgyMDdiLCAweDIwN2IsIDB4MjAwNywgMHgyMDA3LCAweDAwNTAsIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsCisgICAgMHgyMDc5LCAweDIwNzksIDB4MjAwOSwgMHgyMDA5LCAweDIwNzcsIDB4MjA3NywgMHgyMDBiLCAweDIwMGIsCisgICAgMHgyMDc1LCAweDIwNzUsIDB4MjAwZCwgMHgyMDBkLCAweDIwNzMsIDB4MjA3MywgMHgyMDBmLCAweDIwMGYsCisgICAgMHgwMDcxLCAweDAwMTEsIDB4MDA2ZiwgMHgwMDEzLCAweDAwNmQsIDB4MDAxNSwgMHgwMDZiLCAweDAwMTcsCisgICAgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwgMHgwMGEwLCAweDAwNjksIDB4MDAxOSwgMHgwMDY3LCAweDAwMWIsCisgICAgMHgwMDY1LCAweDAwMWQsIDB4MDA2MywgMHgwMDFmLCAweDAwNjEsIDB4MDAyMSwgMHgwMDVmLCAweDAwMjMsCisgICAgMHgwMDVkLCAweDAwMjUsIDB4MDA1YiwgMHgwMDI3LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsCisgICAgMHgwMDU5LCAweDAwMjksIDB4MDA1NywgMHgwMDJiLCAweDIwNTUsIDB4MjA1NSwgMHgyMDJkLCAweDIwMmQsCisgICAgMHgyMDUzLCAweDIwNTMsIDB4MjAyZiwgMHgyMDJmLCAweDIwNTEsIDB4MjA1MSwgMHgyMDMxLCAweDIwMzEsCisgICAgMHgyMDRmLCAweDIwNGYsIDB4MjAzMywgMHgyMDMzLCAweDAwZTAsIDB4MDBlOCwgMHgwMDQ5LCAweDAwMzksCisgICAgMHgyMDRkLCAweDIwNGQsIDB4MjAzNSwgMHgyMDM1LCAweDIwNGIsIDB4MjA0YiwgMHgyMDM3LCAweDIwMzcsCisgICAgMHgyMDQ1LCAweDIwNDUsIDB4MjAzZCwgMHgyMDNkCit9OworCisvKiBMTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQKKyAgIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgZWZmZWN0aXZlbHkKKworKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFs3M10gPSAKK3sKKyAgIDEyLCAgNiwgIDQsICAzLCAgMywgIDMsICAzLCAgMiwgCisgICAgMiwgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgMywgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAorCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorCTEKK307CisKKy8qIFJNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZCAKKyBwYWRkZWQgYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMTItMzFdIHdpdGggemVyb3MgdG8gYWNjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSB0YWJsZSBlZmZlY3RpdmVseSAqLworCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV0gPSAKK3sKKyAgIDI2LCAxMCwgIDYsICAyLCAgMSwgIDEsICAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAorICAgIDAsICAwLCAgMCwgIDAsICA0MCwgIDEsICAwCit9OworCisvKiBMTUFYIHRhYmxlIGZvciBub24gSW50cmEgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQKKyAgIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFsxNS0zMV0gd2l0aCB6ZXJvcyB0byBhY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgZWZmZWN0aXZlbHkKKworKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFs1M10gPSAKK3sKKyAgIDI3LCAxMCwgIDUsICA0LCAgMywgIDMsICAzLCAgCisgICAgMywgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCTAsCisJMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAorCisJOCwgIDMsICAyLCAgMiwgIDIsICAyLCAgMiwgIDEsIAorCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorCTEsICAxLCAgMSwgIDEsICAxCit9OworCisKKy8qIFJNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZCAKKyBwYWRkZWQgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbMjctMzFdIHdpdGggemVyb3MgdG8gYWNjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSB0YWJsZSBlZmZlY3RpdmVseSAqLworCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFs0MF0gPQoreworICAgMTQsICA5LCAgNywgIDMsICAyLCAgMSwJMSwgIAorICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgCTAsICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkwLAkwLAkwLAkwLAorCQorCTIwLCAgNiwgIDEsICAwLCAgMCwgIDAsICAwLCAgMAorCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWNmOGRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKQEAgLTAsMCArMSw3NSBAQAorIC8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgTG9va3VwIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisgICAgLyogKiBUYWJsZSBFbnRyaWVzIGNvbnRhaW4gRGMgU2NhbGVyIHZhbHVlcworICAgICAgICogYXJtVkNNNFAyX0RDU2NhbGVyW2ldPSA4ICAgICAgICAgICBmb3IgaT0xICB0byAgNCBhbmQgaT0zMyB0byAzNgorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmkgICAgICAgICBmb3IgaT01ICB0byAgOAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpKzggICAgICAgICBmb3IgaT05ICB0byAgMjUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippLTE2ICAgICAgZm9yIGk9MjYgdG8gIDMxCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IChpLTMyKzEzKS8yIGZvciBpPTM3IHRvICA1OQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpLTYtMzIgICAgICBmb3IgaT02MCB0byAgNjMKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMjU1ICAgICAgICAgZm9yIGk9MCBhbmQgaT0zMgorICAgICAgICovCisgICAgICAgCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0RDU2NhbGVyWzY0XT17CisJMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHhhLCAgMHhjLCAgMHhlLCAgCisgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgCisgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKKyAgICAweDIwLCAweDIyLCAweDI0LCAweDI2LCAweDI4LCAweDJhLCAweDJjLCAweDJlLAorICAgIDB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4OSwgIDB4OSwgIDB4YSwgIAorICAgIDB4YSwgIDB4YiwgIDB4YiwgIDB4YywgIDB4YywgIDB4ZCwgIDB4ZCwgIDB4ZSwgIAorICAgIDB4ZSwgIDB4ZiwgIDB4ZiwgIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIAorICAgIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCisKK307CisKKyAgICAgICAgICAgICAgCisgICAgIC8qICBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCisgICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbaV09cm91bmQoMzI3NjcvaSkKKyAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNlswXT0gMAorICAgICAgKi8KKworY29uc3QgT01YX1MxNiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbNjRdPXsKKwkweDAwMDAsMHg3ZmZmLDB4NDAwMCwweDJhYWEsMHgyMDAwLDB4MTk5OSwweDE1NTUsMHgxMjQ5LAorICAgIDB4MTAwMCwweDBlMzksMHgwY2NkLDB4MGJhMywweDBhYWIsMHgwOWQ5LDB4MDkyNSwweDA4ODgsCisgICAgMHgwODAwLDB4MDc4NywweDA3MWMsMHgwNmJkLDB4MDY2NiwweDA2MTgsMHgwNWQxLDB4MDU5MSwKKyAgICAweDA1NTUsMHgwNTFmLDB4MDRlYywweDA0YmUsMHgwNDkyLDB4MDQ2YSwweDA0NDQsMHgwNDIxLAorICAgIDB4MDQwMCwweDAzZTEsMHgwM2M0LDB4MDNhOCwweDAzOGUsMHgwMzc2LDB4MDM1ZSwweDAzNDgsCisgICAgMHgwMzMzLDB4MDMxZiwweDAzMGMsMHgwMmZhLDB4MDJlOSwweDAyZDgsMHgwMmM4LDB4MDJiOSwKKyAgICAweDAyYWIsMHgwMjlkLDB4MDI4ZiwweDAyODIsMHgwMjc2LDB4MDI2YSwweDAyNWYsMHgwMjU0LAorICAgIDB4MDI0OSwweDAyM2YsMHgwMjM1LDB4MDIyYiwweDAyMjIsMHgwMjE5LDB4MDIxMSwweDAyMDgKKwkgICAKK307CisgICAgIAorICAgICAgLyogVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MworICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyW2ldPXJvdW5kKDEzMTA3MS9pKQorICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzBdPSAwCisgICAgICAgKi8KKworY29uc3QgT01YX1MzMiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbNjRdPXsKKwkweDAwMDAwMDAwLDB4MDAwMWZmZmYsMHgwMDAxMDAwMCwweDAwMDBhYWFhLCAweDAwMDA4MDAwLCAweDAwMDA2NjY2LCAweDAwMDA1NTU1LCAweDAwMDA0OTI0LAorICAgIDB4MDAwMDQwMDAsMHgwMDAwMzhlMywweDAwMDAzMzMzLDB4MDAwMDJlOGMsIDB4MDAwMDJhYWIsIDB4MDAwMDI3NjIsIDB4MDAwMDI0OTIsIDB4MDAwMDIyMjIsCisgICAgMHgwMDAwMjAwMCwweDAwMDAxZTFlLDB4MDAwMDFjNzIsMHgwMDAwMWFmMiwgMHgwMDAwMTk5YSwgMHgwMDAwMTg2MSwgMHgwMDAwMTc0NiwgMHgwMDAwMTY0MywKKyAgICAweDAwMDAxNTU1LDB4MDAwMDE0N2IsMHgwMDAwMTNiMSwweDAwMDAxMmY2LCAweDAwMDAxMjQ5LCAweDAwMDAxMWE4LCAweDAwMDAxMTExLCAweDAwMDAxMDg0LAorICAgIDB4MDAwMDEwMDAsMHgwMDAwMGY4NCwweDAwMDAwZjBmLDB4MDAwMDBlYTEsIDB4MDAwMDBlMzksIDB4MDAwMDBkZDYsIDB4MDAwMDBkNzksIDB4MDAwMDBkMjEsCisgICAgMHgwMDAwMGNjZCwweDAwMDAwYzdkLDB4MDAwMDBjMzEsMHgwMDAwMGJlOCwgMHgwMDAwMGJhMywgMHgwMDAwMGI2MSwgMHgwMDAwMGIyMSwgMHgwMDAwMGFlNSwKKyAgICAweDAwMDAwYWFiLDB4MDAwMDBhNzMsMHgwMDAwMGEzZCwweDAwMDAwYTBhLCAweDAwMDAwOWQ5LCAweDAwMDAwOWE5LCAweDAwMDAwOTdiLCAweDAwMDAwOTRmLAorICAgIDB4MDAwMDA5MjUsMHgwMDAwMDhmYiwweDAwMDAwOGQ0LDB4MDAwMDA4YWUsIDB4MDAwMDA4ODksIDB4MDAwMDA4NjUsIDB4MDAwMDA4NDIsIDB4MDAwMDA4MjAKKwkKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjkyZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpAQCAtMCwwICsxLDEwNCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOyAqKgorOyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorOyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorOyAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKKzsgKiBbb3V0XXByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworOyAqIFtvdXRdcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKzsgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorOyAqCis7ICovCisKKyAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICBJTkNMVURFIG9teFZDX3MuaAorCisKKyAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisKKyAgICAgICBJRiBBUk0xMTM2SlMKKyAKKzsvLyBJbnB1dCBBcmd1bWVudHMKK0Jsb2NrSW5kZXggICAgICAgICBSTiAwCitwQ29lZkJ1ZlJvdyAgICAgICAgUk4gMQorcENvZWZCdWZDb2wgICAgICAgIFJOIDIKK3ByZWREaXIgICAgICAgICAgICBSTiAzCitwcmVkUVAgICAgICAgICAgICAgUk4gNAorcFFwQnVmICAgICAgICAgICAgIFJOIDUKKworOy8vIExvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgUk4gMAorYmxvY2tEQ0xlZnQgICAgICAgIFJOIDYgIAorYmxvY2tEQ1RvcCAgICAgICAgIFJOIDcKK2Jsb2NrRENUb3BMZWZ0ICAgICBSTiA4Cit0ZW1wMSAgICAgICAgICAgICAgUk4gOQordGVtcDIgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICBNX1NUQVJUICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyLHI5CisKKyAgICAgICBNX0FSRyAgICAgICBwcHJlZFFQLDQKKyAgICAgICBNX0FSRyAgICAgICBwcFFwQnVmLDQKKyAgICAKKyAgICAgICBMRFJIICAgICAgICBibG9ja0RDVG9wTGVmdCxbcENvZWZCdWZSb3csIy0xNl0KKyAgICAgICBMRFJIICAgICAgICBibG9ja0RDTGVmdCxbcENvZWZCdWZDb2xdCisgICAgICAgCisgICAgICAgVEVRICAgICAgICAgQmxvY2tJbmRleCwjMworICAgICAgIExEUkVRSCAgICAgIGJsb2NrRENUb3AsW3BDb2VmQnVmQ29sLCMtMTZdCisgICAgICAgTERSTkVIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZSb3ddCisgICAgICAgICAgICAgCisgICAgICAgU1VCUyAgICAgICAgdGVtcDEsYmxvY2tEQ0xlZnQsYmxvY2tEQ1RvcExlZnQKKyAgICAgICBSU0JMVCAgICAgICB0ZW1wMSx0ZW1wMSwjMAorICAgICAgIFNVQlMgICAgICAgIHRlbXAyLGJsb2NrRENUb3BMZWZ0LGJsb2NrRENUb3AKKyAgICAgICBSU0JMVCAgICAgICB0ZW1wMix0ZW1wMiwjMAorICAgICAgCisgICAgICAgTV9MRFIgICAgICAgcFFwQnVmLHBwUXBCdWYKKyAgICAgICBNX0xEUiAgICAgICBwcmVkUVAscHByZWRRUAorICAgICAgIENNUCAgICAgICAgIHRlbXAxLHRlbXAyCisgICAgICAgTU9WICAgICAgICAgdGVtcDIsI09NWF9WQ19WRVJUSUNBTAorICAgICAgIExEUkxUQiAgICAgIHRlbXAxLFtwUXBCdWYsIzFdCisgICAgICAgU1RSTFQgICAgICAgdGVtcDIsW3ByZWREaXJdCisgICAgICAgU1RSTFQgICAgICAgdGVtcDEsW3ByZWRRUF0KKyAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX0hPUklaT05UQUwgICAgICAgICAgIAorICAgICAgIExEUkdFQiAgICAgIHRlbXAxLFtwUXBCdWZdCisgICAgICAgU1RSR0UgICAgICAgdGVtcDIsW3ByZWREaXJdCisgICAgICAgTU9WICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgU1RSR0UgICAgICAgdGVtcDEsW3ByZWRRUF0gCisKKyAgICAgICAgIAorICAgIAorICAgICAgIE1fRU5ECisgCisgICAgICAgRU5ESUYKKworICAgICAgIEVORCAgICAKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxN2Y5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSB6aWd6YWcgdGFibGVzCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisvKiBDb250YWlucyBEb3VibGUgdGhlIHZhbHVlcyBpbiB0aGUgcmVmZXJlbmNlIFppZ3phZyBUYWJsZQorICogQ29udGFpbnMgQ2xhc3NpY2FsLFZldGljYWwgYW5kIEhvcml6b250YWwgWmlnemFnc2NhbiB0YWJsZXMgaW4gb25lIGFycmF5ICAKKyAqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdID0gCit7CisgICAgIDAsICAyLCAgMTYsIDMyLCAgMTgsICA0LCAgNiwgMjAsCisgICAgMzQsIDQ4LCA2NCwgNTAsIDM2LCAyMiwgIDgsICAxMCwKKyAgICAyNCwgMzgsIDUyLCA2NiwgODAsIDk2LCA4MiwgNjgsCisgICAgNTQsIDQwLCAyNiwgIDEyLCAgMTQsIDI4LCA0MiwgNTYsIAorICAgIDcwLCA4NCwgOTgsIDExMiwgMTE0LCAxMDAsIDg2LCA3MiwKKyAgICA1OCwgNDQsIDMwLCA0NiwgNjAsIDc0LCA4OCwgMTAyLAorICAgIDExNiwgMTE4LCAxMDQsIDkwLCA3NiwgNjIsIDc4LCA5MiwKKyAgICAxMDYsIDEyMCwgMTIyLCAxMDQsIDk0LCAxMTAsIDEyNCwgMTI2LAorCisJMCwgIDE2LCAzMiwgNDgsICAyLCAgMTgsICA0LCAyMCwKKyAgICAzNCwgNTAsIDY0LCA4MCwgOTYsIDExMiwgMTE0LCA5OCwKKyAgICA4MiwgNjYsIDUyLCAzNiwgIDYsIDIyLCAgOCwgMjQsCisgICAgMzgsIDU0LCA2OCwgODQsIDEwMCwgMTE2LCA3MCwgODYsCisgICAgMTAyLCAxMTgsIDQwLCA1NiwgIDEwLCAyNiwgIDEyLCAyOCwKKyAgICA0MiwgNTgsIDcyLCA4OCwgMTA0LCAxMjAsIDc0LCA5MCwgCisgICAgMTA2LCAxMjIsIDQ0LCA2MCwgIDE0LCAzMCwgNDYsIDYyLAorICAgIDc2LCA5MiwgMTA4LCAxMjQsIDc4LCA5NCwgMTEwLCAxMjYsCisKKyAgICAwLCAgMiwgIDQsICA2LCAgMTYsICAxOCwgMzIsIDM0LAorICAgIDIwLCAyMiwgIDgsICAxMCwgIDEyLCAgMTQsIDMwLCAyOCwKKyAgICAyNiwgMjQsIDM4LCAzNiwgNDgsIDUwLCA2NCwgNjYsCisgICAgNTIsIDU0LCA0MCwgNDIsIDQ0LCA0NiwgNTYsIDU4LAorICAgIDYwLCA2MiwgNjgsIDcwLCA4MCwgODIsIDk2LCA5OCwKKyAgICA4NCwgODYsIDcyLCA3NCwgNzYsIDc4LCA4OCwgOTAsIAorICAgIDkyLCA5NCwgMTAwLCAxMDIsIDExMiwgMTE0LCAxMTYsIDExOCwKKyAgICAxMDQsIDEwNiwgMTA4LCAxMTAsIDEyMCwgMTIyLCAxMjQsIDEyNgorCisKK307CisKKworCisKKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjNkMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KKyAqIAorICovCisgCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZworICogcG9zaXRpb25pbmcgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCisgKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheQorICogb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IKKyAqIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQorICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCisgKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqCQkJCQkJCQlbMC03XQorICogW2luXQlRUAkJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIGluZGljYXRlcyB1c2luZyBxdWFudGl6YXRpb24gbWV0aG9kIGRlZmluZWQgaW4gc2hvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gaGVhZGVyIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIGluZGljYXRlcyBub3JtYWlsIHF1YW50aXphdGlvbiBtZXRob2QuCisgKiBbb3V0XSBwcEJpdFN0cmVhbSAJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbQorICogW291dF0gcERzdAkJCXBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZGF0YSB0eXBlKS4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdAorICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZToKKyAqICAgLSAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBRUCA8PSAwOworICoJIC0gcERzdCBub3QgMTYtYnl0ZSBhbGlnbmVkCisgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfSU5UIFFQLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCisgICAgMTUgbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjE7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLworICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYpOworICAgIAorICAgIAorICAgIC8qIFZMRCBhbmQgemlnemFnICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBCdWYxLHNob3J0VmlkZW9IZWFkZXIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIERlcXVhbnRpemF0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKKyAgICAgcFRlbXBCdWYxLAorICAgICBRUCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayhwVGVtcEJ1ZjEsIHBEc3QpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworCSAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjA5YTYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpAQCAtMCwwICsxLDIwOCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgcmVjb25zdHJ1Y3Rpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZworICogcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIHBlcmZvcm1lZAorICogb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgZnJhbWUvcGxhbmUgb24KKyAqIGEgcGl4ZWwgYmFzaXMuIEZvciBJTlRSQSBibG9jaywgdGhlIG91dHB1dCB2YWx1ZXMgYXJlIGNsaXBwZWQgdG8gWzAsIDI1NV0gYW5kCisgKiB3cml0dGVuIHRvIGNvcnJlc3BvbmRpbmcgYmxvY2sgYnVmZmVyIHdpdGhpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQorICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCisgKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqCQkJCQkJCQlbMC03XS4KKyAqIFtpbl0Jc3RlcAkJCXdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZQorICogW2luL291dF0JcENvZWZCdWZSb3cJCVtpbl0gIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgW291dF0gdXBkYXRlZCBjb2VmZmljaWVudCByd28gYnVmZmVyCisgKiBbaW4vb3V0XQlwQ29lZkJ1ZkNvbAkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtpbl0JY3VyUVAJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoCisgKgkJCQkJCQkJdGhlIGN1cnJlbnQgYmxvY2sgYmVsb25ncyB0bworICogW2luXQlwUXBCdWYJCSBQb2ludGVyIHRvIGEgMi1lbGVtZW50IFFQIGFycmF5LiBwUXBCdWZbMF0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sgbGVmdCB0bworICogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2soUVBhKS4gcFFwQnVmWzFdIGhvbGRzIHRoZSBRUCBvZiB0aGUgOHg4IGJsb2NrIGp1c3QgYWJvdmUgdGhlCisgKiAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrKFFQYykuCisgKiAgICAgICAgICAgICAgICAgICBOb3RlLCBpbiBjYXNlIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGlzIG91dCBvZiBWT1AgYm91bmQsIHRoZSBRUCB2YWx1ZSB3aWxsIGhhdmUKKyAqICAgICAgICAgICAgICAgICAgIG5vIGVmZmVjdCB0byB0aGUgaW50cmEtcHJlZGljdGlvbiBwcm9jZXNzLiBSZWZlciB0byBzdWJjbGF1c2UgICI3LjQuMy4zIEFkYXB0aXZlCisgKiAgICAgICAgICAgICAgICAgICBhYyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIiBvZiBJU08vSUVDIDE0NDk2LTIoTVBFRzQgUGFydDIpIGZvciBhY2N1cmF0ZSBkZXNjcmlwdGlvbi4KKyAqIFtpbl0JYmxvY2tJbmRleAkJYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCisgKgkJCQkJCQkJcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwKKyAqCQkJCQkJCQlGaWd1cmUgNi01IG9mIElTTy9JRUMgMTQ0OTYtMi4gCisgKiBbaW5dCWludHJhRENWTEMJCWEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLgorICoJCQkJCQkJCVRoaXMgYWxsb3dzIGEgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMKKyAqCQkJCQkJCQlmb3IgY29kaW5nIG9mIEludHJhIERDIGNvZWZmaWNpZW50cyBhcyBwZXIgVGFibGUKKyAqCQkJCQkJCQk2LTIxIG9mIElTTy9JRUMgMTQ0OTYtMi4gCisgKiBbaW5dCUFDUHJlZEZsYWcJCWEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZworICoJCQkJCQkJCWlmIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdAorICoJCQkJCQkJCWNvbHVtbiBhcmUgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkCisgKgkJCQkJCQkJbWFjcm9ibG9jay4KKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKKyAqCQkJCQkJCWFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCisgKgkJCQkJCQkJZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorICoJCQkJCQkJCWluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW291dF0JcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCQkJKnBwQml0U3RyZWFtCisgKiBbb3V0XQlwRHN0CQkJcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lLgorICoJCQkJCQkJCXBEc3Qgc2hvdWxkIGJlIDE2LWJ5dGUgYWxpZ25lZC4KKyAqIFtvdXRdCXBDb2VmQnVmUm93CQlwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgLQlBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRUEJ1ZiwgcERzdC4KKyAqICAgICAgb3IKKyAqICAgLSAgQXQgbGVhc3Qgb25lIG9mIHRoZSBiZWxvdyBjYXNlOiAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBjdXJRUCBleGNlZWRzICgxLCAzMSksCisgKiAgICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw5XSwgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgsIGludHJhRENWTEMgaXMgemVybyB3aGlsZQorICogICAgICBibG9ja0luZGV4IGdyZWF0ZXIgdGhhbiA1LgorICogICAgICBvcgorICogICAtCXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZAorICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgT01YX1U4ICpwRHN0LAorICAgICBPTVhfSU5UIHN0ZXAsCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICAgT01YX1U4IGN1clFQLAorICAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfSU5UIGludHJhRENWTEMsCisgICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCisgKQoreworICAgIE9NWF9TMTYgdGVtcEJ1ZjFbNzldLCB0ZW1wQnVmMls3OV07CisgICAgT01YX1MxNiAqcFRlbXBCdWYxLCAqcFRlbXBCdWYyOworICAgIE9NWF9JTlQgcHJlZERpciwgcHJlZEFDRGlyOworICAgIE9NWF9JTlQgIHByZWRRUDsKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICAKKyAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLworICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYxKTsKKyAgICBwVGVtcEJ1ZjIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMik7CisgICAgCisgICAgLyogU2V0dGluZyB0aGUgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gYW5kIHByZWRpY3Rpb24gZGlyZWN0aW9uICovCisgICAgYXJtVkNNNFAyX1NldFByZWREaXIoCisgICAgICAgIGJsb2NrSW5kZXgsCisgICAgICAgIHBDb2VmQnVmUm93LAorICAgICAgICBwQ29lZkJ1ZkNvbCwKKyAgICAgICAgJnByZWREaXIsCisgICAgICAgICZwcmVkUVAsCisgICAgICAgIHBRUEJ1Zik7CisKKyAgICBwcmVkQUNEaXIgPSBwcmVkRGlyOworCisgICAgCisgICAgaWYgKEFDUHJlZEZsYWcgPT0gMCkKKyAgICB7CisgICAgICAgIHByZWRBQ0RpciA9IE9NWF9WQ19OT05FOworICAgIH0KKworICAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLworICAgIGlmIChibG9ja0luZGV4IDw9IDMpCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7CisgICAgfQorICAgIAorCisgICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KKyAgICBpZiAoaW50cmFEQ1ZMQyA9PSAxKQorICAgIHsKKyAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAorICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICAgICAgcHJlZEFDRGlyLAorICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgIHZpZGVvQ29tcCk7CisgICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCisgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgICAgICBwcmVkQUNEaXIsCisgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgfQorCisgICAgLyogQUMgREMgcHJlZGljdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEoCisgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICBjdXJRUCwKKyAgICAgICAgcHJlZFFQLAorICAgICAgICBwcmVkRGlyLAorICAgICAgICBBQ1ByZWRGbGFnLAorICAgICAgICB2aWRlb0NvbXApOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIERlcXVhbnRpemF0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKKyAgICAgcFRlbXBCdWYxLAorICAgICBjdXJRUCwKKyAgICAgdmlkZW9Db21wLAorICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogUGxhY2luZyB0aGUgbGluZWFyIGFycmF5IGludG8gdGhlIGRlc3RpbmF0aW9uIHBsYW5lIGFuZCBjbGlwcGluZworICAgICAgIGl0IHRvIDAgdG8gMjU1ICovCisgICAgCisJYXJtVkNNNFAyX0NsaXA4KHBUZW1wQnVmMixwRHN0LHN0ZXApOworCQorCQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODYxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCkBAIC0wLDAgKzEsMzY0IEBACis7ICoqKioqKioqKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKiAKKzsgKioKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIERlY29kZXMgYW5kIHBhZHMgZm91ciBtb3Rpb24gdmVjdG9ycyBvZiB0aGUgbm9uLWludHJhIG1hY3JvYmxvY2sgaW4gUC1WT1AuCis7ICogVGhlIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBwcm9jZXNzIGlzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy42LjEuNiBvZgorOyAqIElTTy9JRUMgMTQ0OTYtMi4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgorOyAqIFtpbl0gICAgcFNyY01WTGVmdE1CICAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCis7ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCis7ICogW2luXSAgICBwU3JjTVZVcHBlck1CICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXIgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCis7ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCis7ICogW2luXSAgICBwU3JjTVZVcHBlclJpZ2h0TUIgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCis7ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCis7ICogW2luXSAgICBmY29kZUZvcndhcmQgICAgICAgYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNAorOyAqICAgICAgICAgICAgICAgICAgICAgYml0IHN0cmVhbSBzeW50YXgKKzsgKiBbaW5dICAgIE1CVHlwZSAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZQorOyAqICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24KKzsgKiAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIGZpbGxlZCB3aXRoIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgc2FtZSBkZWNvZGVkIHZlY3Rvci4KKzsgKiBbb3V0XSAgIHBwQml0U3RyZWFtICAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsCis7ICogICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKzsgKiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorOyAqICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICBwRHN0TVZDdXJNQiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrIHdoaWNoIGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycworOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLW5vIGVycm9yCis7ICogCis7ICogICAgICAgICAgICAgICAgICAgICAKKzsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorOyAqCis7ICoKKyAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKyAgICAgICAgSU5DTFVERSBvbXhWQ19zLmgKKyAgICAgICAgCisgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAKKyAgICAgICAgICAgICAgICAKKworCisgICAgICAgIElGIEFSTTExMzZKUworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgICBSTiAxCitwU3JjTVZMZWZ0TUIgICAgICAgICAgUk4gMgorcFNyY01WVXBwZXJNQiAgICAgICAgIFJOIDMKK3BTcmNNVlVwcGVyUmlnaHRNQiAgICBSTiA0CitwRHN0TVZDdXJNQiAgICAgICAgICAgUk4gNQorZmNvZGVGb3J3YXJkICAgICAgICAgIFJOIDYKK01CVHlwZSAgICAgICAgICAgICAgICBSTiA3CisKKzsvL0xvY2FsIFZhcmlhYmxlcworCit6ZXJvICAgICAgICAgICAgICAgICAgUk4gNAorb25lICAgICAgICAgICAgICAgICAgIFJOIDQKK3NjYWxlRmFjdG9yICAgICAgICAgICBSTiAxCisKKworUmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKKworVmxjTVZEICAgICAgICAgICAgICAgIFJOIDAKK2luZGV4ICAgICAgICAgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICAgUk4gNworCittdkhvckRhdGEgICAgICAgICAgICAgUk4gNAorbXZIb3JSZXNpZHVhbCAgICAgICAgIFJOIDAKKworbXZWZXJEYXRhICAgICAgICAgICAgIFJOIDQgICAgICAgICAgICAgCittdlZlclJlc2lkdWFsICAgICAgICAgUk4gMAorCit0ZW1wICAgICAgICAgICAgICAgICAgUk4gMQorCit0ZW1wMSAgICAgICAgICAgICAgICAgUk4gMworSGlnaCAgICAgICAgICAgICAgICAgIFJOIDQKK0xvdyAgICAgICAgICAgICAgICAgICBSTiAyCitSYW5nZSAgICAgICAgICAgICAgICAgUk4gMQorCitCbGtDb3VudCAgICAgICAgICAgICAgUk4gMTQKKworZGlmZk1WZHggICAgICAgICAgICAgIFJOIDAKK2RpZmZNVmR5ICAgICAgICAgICAgICBSTiAxCisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICAgUk4gOAorUkJpdENvdW50ICAgICAgICAgICAgIFJOIDkKK1JCaXRCdWZmZXIgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICAgUk4gMTEKK1QyICAgICAgICAgICAgICAgICAgICBSTiAxMgorTFIgICAgICAgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FWbGNNVkQKKyAgICAgICBJTVBPUlQgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKKworICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgICAgICAgIAorICAgICAgIAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcERzdE1WQ3VyTUIsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwRHN0TVZQcmVkTUUsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwQmxrQ291bnQsNAorICAgICAgIAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcEJpdE9mZnNldCw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZMZWZ0TUIsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WVXBwZXJNQiw0CisgICAgICAgCisgICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeCw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeSw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBIaWdoLDQKKyAgICAgICAKKyAgICAgICAgICAgICAgCisKKworICAgICAgIE1fU1RBUlQgICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCxyMTEKKyAgICAgICAKKyAgICAgICBNX0FSRyAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1Cb25TdGFjayw0ICAgICAgICAgICA7Ly8gcG9pbnRlciB0byAgcFNyY01WVXBwZXJSaWdodE1CIG9uIHN0YWNrCisgICAgICAgTV9BUkcgICAgICAgICAgIHBEc3RNVkN1ck1Cb25TdGFjayw0ICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gcERzdE1WQ3VyTUIgb24gc3RhY2sKKyAgICAgICBNX0FSRyAgICAgICAgICAgZmNvZGVGb3J3YXJkb25TdGFjayw0ICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBmY29kZUZvcndhcmQgb24gc3RhY2sgCisgICAgICAgTV9BUkcgICAgICAgICAgIE1CVHlwZW9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gTUJUeXBlIG9uIHN0YWNrCisKKyAgICAgIAorICAgICAgIAorICAgICAgIAorICAgICAgIAorICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIEJpdFN0cmVhbSBNYWNybworCisgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKKyAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBNQlR5cGUgZnJvbSBzdGFjaworICAgICAgIE1fTERSICAgICAgICAgICBwRHN0TVZDdXJNQixwRHN0TVZDdXJNQm9uU3RhY2sgICAgICAgIDsvLyBMb2FkIHBEc3RNVkN1ck1CIGZyb20gc3RhY2sKKyAgICAgICBNT1YgICAgICAgICAgICAgemVybywjMAorCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkEKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkFfUSAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQV9RCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CXQorICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBNT1YgICAgICAgICAgICAgQmxrQ291bnQsIzAKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgCisgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRPSworCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFYgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0VgorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWX1EgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFZfUQorICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjNAorCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVIKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUl9RCisgICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCMxCisgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIGZjb2RlRm9yd2FyZCxmY29kZUZvcndhcmRvblN0YWNrICAgICAgOy8vIExvYWQgZmNvZGVGb3J3YXJkICBmcm9tIHN0YWNrCisKKyAgICAgICA7Ly8gU3RvcmluZyB0aGUgdmFsdWVzIHRlbXBvcmFyaWx5IG9uIHN0YWNrCisKKyAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAKKyAgICAgICBNX1NUUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAorICAgICAgICAgICAgCisKKyAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1mY29kZUZvcndhcmQtMQorICAgICAgIE1PViAgICAgICAgICAgICBvbmUsIzEKKyAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKKyAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isb25lLHRlbXAgICAgICAgICAgICAgICAgICA7Ly8gc2NhbGVGYWN0b3I9MTw8KGZjb2RlRm9yd2FyZC0xKQorICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCisgICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLHNjYWxlRmFjdG9yLCM1ICAgICAgICAgICAgCisgICAgICAgTV9TVFIgICAgICAgICAgIHNjYWxlRmFjdG9yLHBIaWdoICAgICAgICAgICAgICAgICAgICAgOy8vIFtwSGlnaF09MzIqc2NhbGVGYWN0b3IKKyAgICAgICAgICAgICAgCisgICAgICAgOy8vIFZMRCBEZWNvZGluZworCisKK0xvb3AKKworICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWQgdGhlIG9wdGltaXplZCBNVkQgVkxDIHRhYmxlCisKKyAgICAgICA7Ly8gSG9yaXpvbnRhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgorCisgICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIHZhcmlhYmxlIGxlbmdodCBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KKyAgICAgIAorICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCisgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIHRoZSBkZWNvZGVkIHN5bWJvbCBpcyBhbiBpbnZhbGllZCBzeW1ib2wgCisgICAgICAgCisgICAgICAgU1VCICAgICAgICAgICAgIG12SG9yRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCwjMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JSZXNpZHVhbD0xCisgICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQorICAgICAgIFRFUU5FICAgICAgICAgICBtdkhvckRhdGEsIzAKKyAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZIb3JEYXRhPTAgZGlmZk1WZHg9bXZIb3JEYXRhICAgICAgICAgCisgICAgICAgQkVRICAgICAgICAgICAgIFZlcnRpY2FsRGF0YQorICAgICAgIAorICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQorICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdkhvclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBnZXQgbXZIb3JSZXNpZHVhbCBmcm9tIGJpdHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbXZIb3JEYXRhIT0wICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgbXZIb3JEYXRhLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIG12SG9yRGF0YSxtdkhvckRhdGEsIzAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1hYnMobXZIb3JEYXRhKQorICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLG12SG9yUmVzaWR1YWwsZmNvZGVGb3J3YXJkCisgICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSxmY29kZUZvcndhcmQsbXZIb3JSZXNpZHVhbCA7Ly8gZGlmZk1WZHg9YWJzKG12SG9yRGF0YSkqZmNvZGVGb3J3YXJkK212SG9yUmVzaWR1YWwtZmNvZGVGb3J3YXJkCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMxCisgICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMwCisgICAgICAgCisgICAgICAgOy8vIFZlcnRpY2FsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCisKK1ZlcnRpY2FsRGF0YQorCisgICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSBkaWZmTVZkeCBvbiBzdGFjaworICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWRpbmcgdGhlIGFkZHJlc3Mgb2Ygb3B0aW1pemVkIFZMQyB0YWJsZXMKKworICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRgorICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyBWTEMgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCisgICAgICAgCisgICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKKyAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgYW4gSW52YWxpZWQgU3ltYm9sIG9jY3VycworICAgICAgIAorICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdlZlckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsIzEgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKKyAgICAgICBURVFORSAgICAgICAgICAgbXZWZXJEYXRhLCMwCisgICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR5ID0gbXZWZXJEYXRhIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12VmVyRGF0YT0wCisgICAgICAgQkVRICAgICAgICAgICAgIEZpbmRNVlByZWQKKworICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQorICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdlZlclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBHZXQgbXZWZXJSZXNpZHVhbCBmcm9tIGJpdCBzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG1uVmVyRGF0YSE9MAorICAgICAgICAgICAgIAorCisgICAgICAgQ01QICAgICAgICAgICAgIG12VmVyRGF0YSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICBtdlZlckRhdGEsbXZWZXJEYXRhLCMwCisgICAgICAgU1VCICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsbXZWZXJSZXNpZHVhbCxmY29kZUZvcndhcmQKKyAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhLGZjb2RlRm9yd2FyZCxtdlZlclJlc2lkdWFsIDsvLyBkaWZmTVZkeT1hYnMobXZWZXJEYXRhKSpmY29kZUZvcndhcmQrbXZWZXJSZXNpZHVhbC1mY29kZUZvcndhcmQKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzEKKyAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzAKKworICAgICAgIDsvL0NhbGxpbmcgdGhlIEZ1bmN0aW9uIG9teFZDTTRQMl9GaW5kTVZwcmVkCisgICAgICAgIAorRmluZE1WUHJlZAorCisgICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR5LHBkaWZmTVZkeQorICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHBEc3RNVkN1ck1CLEJsa0NvdW50LExTTCAjMiAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQorICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBwRHN0TVZDdXJNQiAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wIG9uIHN0YWNrIGZvciBwYXNzaW5nIGFzIGFuIGFyZ3VtZW50IHRvIEZpbmRNVlByZWQKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCwjMAorICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBEc3RNVlByZWRNRSAgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzIHBEc3RNVlByZWRNRT1OVUxMIGFzIGFuIGFyZ3VtZW50ICAgICAgICAgCisgICAgICAgTV9TVFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3NzIEJsa0NvdW50IGFzIEFyZ3VtZW50IHRocm91Z2ggc3RhY2sKKworICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLHBTcmNNVkxlZnRNQiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wIChSTiAxKT1wU3JjTVZMZWZ0TUIKKyAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1CLHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2sKKyAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WTGVmdE1CLHBTcmNNVlVwcGVyTUIgICAgICAgICAgICA7Ly8gcFNyY01WTGVmdE1CICggUk4gMikgPSBwU3JjTVZVcHBlck1CCisgICAgICAgTU9WICAgICAgICAgICAgIHBwQml0U3RyZWFtLHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgOy8vIHBwQml0U3RyZWFtICAoIFJOIDApID0gcERzdE1WQ3VyTUIKKyAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WVXBwZXJNQixwU3JjTVZVcHBlclJpZ2h0TUIgICAgICA7Ly8gcFNyY01WVXBwZXJNQiggUk4gMykgPSBwU3JjTVZVcHBlclJpZ2h0TUIgICAgICAKKyAgICAgICBCTCAgICAgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gc3Vicm91dGluZSBvbXhWQ000UDJfRmluZE1WcHJlZAorCisgICAgICAgOy8vIFN0b3JlIEhvcml6b250YWwgTW90aW9uIFZlY3RvcgorICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBCbGtDb3VudCBmcm9tIHN0YWNrCisgICAgICAgTV9MRFIgICAgICAgICAgIEhpZ2gscEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9MzIqc2NhbGVGYWN0b3IKKyAgICAgICBMU0wgICAgICAgICAgICAgdGVtcDEsQmxrQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1CbGtDb3VudCo0CisgICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHgKKyAgICAgICAKKyAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KKyAgICAgICAKKyAgICAgICAKKyAgICAgICBSU0IgICAgICAgICAgICAgTG93LEhpZ2gsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG93ID0gLTMyKnNjYWxlRmFjdG9yCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4PXBEc3RNVkN1ck1CW0Jsa0NvdW50XStkaWZmTVZkeAorICAgICAgIEFERCAgICAgICAgICAgICBSYW5nZSxIaWdoLEhpZ2ggICAgICAgICAgICAgICAgICAgICAgIDsvLyBSYW5nZT02NCpTY2FsZUZhY3RvcgorICAgICAgIFNVQiAgICAgICAgICAgICBIaWdoLEhpZ2gsIzEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPSAzMipzY2FsZUZhY3Rvci0xCisKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHg8TG93ICAgICAgICAgIAorICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeCs9UmFuZ2UKKyAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4ID4gSGlnaCBkaWZmTVZkeC09UmFuZ2UKKyAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXQorCisgICAgICAgOy8vIFN0b3JlIFZlcnRpY2FsCisKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsdGVtcDEsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9NCpCbGtDb3VudCsyCisgICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeSAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHkKKyAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0uZGlmZk1WZHkKKyAgICAgICBBREQgICAgICAgICAgICAgQmxrQ291bnQsQmxrQ291bnQsIzEgICAgICAgICAgICAgICAgICA7Ly8gQmxrQ291bnQ9QmxrQ291bnQrMQorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cKKyAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHk8TG93ICBkaWZmTVZkeSs9UmFuZ2UgICAgICAgICAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2gKKyAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHkgPiBIaWdoIGRpZmZNVmR5LT1SYW5nZQorICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgIAorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBCbGtDb3VudCxDb3VudAorICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgorICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCisKKyAgICAgICBCTFQgICAgICAgICAgICAgTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgQmxrQ291bnQ8Q291bnQgQ29udGludWUgdGhlIExvb3AKKworCisgICAgICAgOy8vIElmIE1CVHlwZT1PTVhfVkNfSU5URVIgb3IgTUJ0eXBlPU9NWF9WQ19JTlRFUl9RIGNvcHkgcERzdE1WQ3VyTUJbMF0gdG8KKyAgICAgICA7Ly8gcERzdE1WQ3VyTUJbMV0sIHBEc3RNVkN1ck1CWzJdLCBwRHN0TVZDdXJNQlszXSAKKworICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjaworCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgTERSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CXQorICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgCisgICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM4XQorICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjMTJdCisgICAgICAgCisgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKKyAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hpbmcgdGhlIE1hY3JvICAgICAgIAorCisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKKyAKK0V4aXRFcnJvcgorCisgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0CisgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0CisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKworRXhpdE9LICAgICAgICAgICAgIAorCisgICAgICAgTV9FTkQKKyAgICAgICBFTkRJRgorICAgICAgIEVORAorCisKKyAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0M2IyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKQEAgLTAsMCArMSwxMzIgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlciBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICBSTiA2CisKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSB0aGUgVkxDLFppZ3phZyxMTUFYIGFuZCBSTUFYIHRhYmxlcworICAgICAKKyAgICAgICAgCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcixyMTIKKworICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICA7Ly8gTG9hZCB6aWd6YWcgdGFibGUKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjayB0byBwYXNzIGFzIGFyZ3VtZW50IHRvIHVuc2FmZSBmdW5jdGlvbgorICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBWTEMgdGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIG9wdGltaXplZCBWTEMgdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIExNQVggVGFibGVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gTG9hZCBJbnRlcmxlYXZlZCBMPTAgYW5kIEw9MSBSTUFYIFRhYmxlcworICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc2V0IHN0YXJ0PTAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIFJNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICAgICAgICAgIAorCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgOy8vIGNhbGwgVW5zYWZlIEZ1bmN0aW9uIGZvciBWTEMgWmlnemFnIERlY29kaW5nCisgICAgICAgICAKKyAgICAgICAKKworICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NjcyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwpAQCAtMCwwICsxLDEzNiBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciBibG9jay4KKzsgKgorOyAqCis7ICoKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKzsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCis7ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgorOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKzsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCis7ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKzsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCis7ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKzsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCis7ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKKzsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCis7ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KKzsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCis7ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCis7ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQorOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAorOyAqCis7ICovCisKKworICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisKKworICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAKKworCisKKyAgICAgSUYgQVJNMTEzNkpTCisgICAgIAorICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCisKKyAgICAgICAgCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIGNsYXNzaWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorUHJlZERpciAgICAgICAgICAgICAgUk4gMworc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICBSTiA2CisKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCisgICAgIAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKworICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMscjEyCisKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXJvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIElucHV0IEFyZ3VtZW50IG9uIHN0YWNrICAgICAgICAgICAKKworICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gTG9hZCBBZGRyZXNzIG9mIHRoZSBaaWd6YWcgdGFibGUgICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICA7Ly8gTG9hZGluZyBEaWZmZXJlbnQgdHlwZSBvZiB6aWd6YWcgdGFibGVzIGJhc2VkIG9uIFByZWREaXIKKyAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBaaWd6YWcgdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgcGFja2VkIFZMQyBUYWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcworICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFZMQyBUYWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgIDsvLyBMb2FkIExNQVggVGFibGUKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIFRhYmxlIGFkZHJlc3Mgb24gU3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQorICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydD0wICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgICAgICAgIAorCisgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLHNob3J0VmlkZW9IZWFkZXJvblN0YWNrICAgICAgICAgICAgICA7Ly8gZ2V0IHRoZSBJbnB1dCBBcmd1bWVudCBmcm9tIHN0YWNrCisKKyAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgOy8vIENhbGwgVW5zYWZlIEZ1bmN0aW9uCisKKworCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOWNiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwpAQCAtMCwwICsxLDIyNCBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciBibG9jay4KKzsgKgorOyAqCis7ICoKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKzsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCis7ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgorOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKzsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCis7ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKzsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCis7ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKzsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCis7ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKKzsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCis7ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KKzsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCis7ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCis7ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQorOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAorOyAqCis7ICovCisKKworICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisKKworICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAKKyAgICAgIAorCisKKyAgICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorCisgICAgIAorICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCisKKyAgICAgICAgCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIENMYXNzaWNhbCwgSG9yaXpvbnRhbCwgVmVydGljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4ICA7Ly8gQ29udGFpbnMgT3B0aW1pemVkIERDTHVtYSBhbmQgRENDaHJvbWEgSW5kZXggdGFibGUgRW50cmllcworICAgICAgICAKKworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK1ByZWREaXIgICAgICAgICAgICAgIFJOIDMKK3Nob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKK3ZpZGVvQ29tcCAgICAgICAgICAgIFJOIDUKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BEQ0x1bWFDaHJvbWFJbmRleCAgIFJOIDQKK3BEQ0Nocm9tYUluZGV4ICAgICAgIFJOIDcKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKK0RDVmFsdWVTaXplICAgICAgICAgIFJOIDYKK3Bvd09mU2l6ZSAgICAgICAgICAgIFJOIDcKK3RlbXAxICAgICAgICAgICAgICAgIFJOIDUKKworCis7Ly8gU2NyYXRjaCBSZWdpc3RlcnMKKworUkJpdFN0cmVhbSAgICAgICAgICAgUk4gOAorUkJpdEJ1ZmZlciAgICAgICAgICAgUk4gOQorUkJpdENvdW50ICAgICAgICAgICAgUk4gMTAKKworVDEgICAgICAgICAgICAgICAgICAgUk4gMTEKK1QyICAgICAgICAgICAgICAgICAgIFJOIDEyCitEQ1ZhbCAgICAgICAgICAgICAgICBSTiAxNAorCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKKyAgICAgCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcERDQ29lZmYsNAorICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMscjEyCisKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXJvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBvaW50ZXIgdG8gYXJndW1lbnQgb24gc3RhY2sgIAorICAgICAgICBNX0FSRyAgICAgICAgICAgdmlkZW9Db21wb25zdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjaworCisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIERDIENvZWZmaWNpZW50CisKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgsID1hcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggOy8vIExvYWQgT3B0aW1pemVkIFZMQyBUYWJsZSBmb3IgTHVtaW5hbmNlIGFuZCBDaHJvbWluYW5jZQorCisgICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIEJpdHN0cmVhbSBNYWNybworCisgICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50CisgICAgICAgIE1fTERSICAgICAgICAgICB2aWRlb0NvbXAsdmlkZW9Db21wb25zdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgorICAgICAgICBBREQgICAgICAgICAgICAgcERDTHVtYUNocm9tYUluZGV4LHBEQ0x1bWFDaHJvbWFJbmRleCx2aWRlb0NvbXAsIExTTCAjNiAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKKyAgICAKKyAgICAgICAgCisgICAgICAgIE1fQkRfVkxEICAgICAgICBEQ1ZhbHVlU2l6ZSxUMSxUMixwRENMdW1hQ2hyb21hSW5kZXgsNCwyICAgICAgICAgICAgICAgICAgICA7Ly8gVkxDIERlY29kZSB1c2luZyBvcHRpbWl6ZWQgTHVtaW5hbmNlIGFuZCBDaHJvbWluYW5jZSBWTEMgVGFibGUKKworICAgIAorICAgICAgIAorCitEZWNvZGVEQworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzEyICAgICAKKyAgICAgICAgQkdUICAgICAgICAgICAgIEV4aXRFcnJvcgorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCMwCisgICAgICAgIE1PVkVRICAgICAgICAgICBEQ1ZhbCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgaXMgemVybyB0aGVuIERDIGNvZWZmID0wCisgICAgICAgIEJFUSAgICAgICAgICAgICBBQ0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHBlcmZvcm0gQUMgQ29lZmYgRGVjb2RpbmcKKyAgICAgICAgCisgICAgICAgIE1fQkRfVlJFQUQxNiAgICBEQ1ZhbCxEQ1ZhbHVlU2l6ZSxUMSxUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IERDIFZhbHVlIEZyb20gQml0IHN0cmVhbQorICAgICAgICAgCisKKyAgICAgICAgTU9WICAgICAgICAgICAgIHBvd09mU2l6ZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBMU0wgICAgICAgICAgICAgcG93T2ZTaXplLERDVmFsdWVTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvd09mU2l6ZT1wb3coMixEQ1ZhbHVlU2l6ZSkKKyAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsLHBvd09mU2l6ZSxMU1IgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIERDVmFsIHdpdGggcG93T2ZTaXplLzIgCisgICAgICAgIEFERExUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCwjMQorICAgICAgICBTVUJMVCAgICAgICAgICAgRENWYWwsRENWYWwscG93T2ZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIExlc3N0aGFuIHBvd09mU2l6ZS8yIERDVmFsPURDVmFsLXBvd09mU2l6ZSsxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRWxzZSBEQ1ZhbD0gZmV0Y2hiaXRzIGZyb20gYml0IHN0cmVhbQorCitDaGVja0RDVmFsdWVTaXplCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIERDVmFsdWVTaXplIGdyZWF0ZXIgdGhhbiA4IGNoZWNrIG1hcmtlciBiaXQKKworICAgICAgICBCTEUgICAgICAgICAgICAgQUNEZWNvZGUKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQorICAgICAgICBURVEgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIE1hcmtlciBiaXQgaXMgemVybyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZQorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgICAgCisKKyAgICAgICAgOy8vIERlY29kZSBBQyBDb2VmZmljaWVudAorCitBQ0RlY29kZQorCisgICAgICAgIE1fU1RSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBEZWNvZGVkIERDIENvZWZmIG9uIFN0YWNrCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IHN0cmVhbSBNYWNybworICAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgICAgICAgOy8vIExvYWQgWmlnemFnIHRhbGJlIGFkZHJlc3MgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgICAgICAgOy8vIE1vZGlmeSB0aGUgWmlnemFnIHRhYmxlIGFkcmVzcyBiYXNlZCBvbiBQcmVkRGlyICAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICAgICAgOy8vIExvYWQgT3B0aW1pemVkIFZMQyBUYWJsZSBXaXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEgRW50cmllcworICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgT3B0aW1pemVkIFZMQyBUYWJsZSBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIExNQVggVGFibGUKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgU3RhcnQgPTEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFJNQVggVGFibGUgb24gU3RhY2sKKyAgICAgICAgCisgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLHNob3J0VmlkZW9IZWFkZXJvblN0YWNrICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBJbnB1dCBBcmd1bWVudCBGcm9tIFN0YWNrCisgICAgICAgIAorICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICAgICAgIDsvLyBDYWxsIHRoZSBVbnNhZmUgRnVuY3Rpb24KKworICAgICAgICBNX0xEUiAgICAgICAgICAgRENWYWwscERDQ29lZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IHRoZSBEZWNvZGVkIERDIFZhbHVlIEZyb20gU3RhY2sKKyAgICAgICAgU1RSSCAgICAgICAgICAgIERDVmFsLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSBEQyBWYWx1ZSAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPSworICAgICAgICAKKyAgICAgICAgICAgICAgCisKK0V4aXRFcnJvcgorIAorICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVybWluYXRpbmcgdGhlIEJpdCBTdHJlYW0gTWFjcm8gaW4gY2FzZSBvZiBhbiBFcnJvcgorICAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgCitFeGl0T0sKKyAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGJmYTcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucwpAQCAtMCwwICsxLDE5NCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAorOy8vCisgICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICBJTkNMVURFIGFybVZDQ09NTV9zLmgKKworICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgTV9UQUJMRSBhcm1WQ000UDJfcEJsa0luZGV4VGFibGUKKyAgICAgICAgRENEICBPTVhWQ0JsazAsIE9NWFZDQmxrMQorICAgICAgICBEQ0QgIE9NWFZDQmxrMiwgT01YVkNCbGszCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorcFNyY01WQ3VyTUIgICAgICAgICAgICBSTiAwCitwU3JjQ2FuZE1WMSAgICAgICAgICAgIFJOIDEKK3BTcmNDYW5kTVYyICAgICAgICAgICAgUk4gMgorcFNyY0NhbmRNVjMgICAgICAgICAgICBSTiAzCitwRHN0TVZQcmVkICAgICAgICAgICAgIFJOIDQKK3BEc3RNVlByZWRNRSAgICAgICAgICAgUk4gNQoraUJsayAgICAgICAgICAgICAgICAgICBSTiA2CisKK3BUYWJsZSAgICAgICAgICAgICAgICAgUk4gNAorQ2FuZE1WICAgICAgICAgICAgICAgICBSTiAxMgorCitwQ2FuZE1WMSAgICAgICAgICAgICAgIFJOIDcKK3BDYW5kTVYyICAgICAgICAgICAgICAgUk4gOAorcENhbmRNVjMgICAgICAgICAgICAgICBSTiA5CisKK0NhbmRNVjFkeCAgICAgICAgICAgICAgUk4gMCAKK0NhbmRNVjFkeSAgICAgICAgICAgICAgUk4gMSAKK0NhbmRNVjJkeCAgICAgICAgICAgICAgUk4gMgorQ2FuZE1WMmR5ICAgICAgICAgICAgICBSTiAzCitDYW5kTVYzZHggICAgICAgICAgICAgIFJOIDEwCitDYW5kTVYzZHkgICAgICAgICAgICAgIFJOIDExCisKK3RlbXAgICAgICAgICAgICAgICAgICAgUk4gMTQKKworemVybyAgICAgICAgICAgICAgICAgICBSTiAxNAorcmV0dXJuICAgICAgICAgICAgICAgICBSTiAwCisgICAgICAgIAorOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1haW4gcm91dGluZQorOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAKKworICAgICAgICBNX0FMTE9DNCBNViwgNAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlciAKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRmluZE1WcHJlZCwgcjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIHBwRHN0TVZQcmVkLCAgNAorICAgICAgICBNX0FSRyAgIHBwRHN0TVZQcmVkTUUsIDQKKyAgICAgICAgTV9BUkcgICBCbGssIDQKKyAgICAgICAgCisgICAgICAgIE1fQURSIENhbmRNViwgTVYKKyAgICAgICAgTU9WICAgemVybywgIzAKKyAgICAgICAgTV9MRFIgaUJsaywgQmxrCisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZQorICAgICAgICA7Ly8gdG8gYmUgdXNlZCBpZiBwU3JjQ2FuZE1WWzF8MnwzXSA9PSBOVUxMCisgICAgICAgIE1PViAgIHBDYW5kTVYxLCBDYW5kTVYKKyAgICAgICAgTU9WICAgcENhbmRNVjIsIENhbmRNVgorICAgICAgICBNT1YgICBwQ2FuZE1WMywgQ2FuZE1WCisgICAgCisgICAgICAgIFNUUiAgIHplcm8sIFtDYW5kTVZdCisKKyAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBibGsgbnVtYmVyCisgICAgICAgIE1fU1dJVENIIGlCbGsKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGswICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazEgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMiAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGszICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICAKK09NWFZDQmxrMAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjNAorICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzgKKworICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMSwgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYyCisgICAgICAgIE1PVkVRIHBDYW5kTVYxLCBwQ2FuZE1WMgorICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKKyAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjIsICMwCisgICAgCisgICAgICAgIE1PVkVRIHBDYW5kTVYxLCBwQ2FuZE1WMworICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjMKKyAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCisgICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQorICAgICAgICAKKyAgICAgICAgQiAgICAgQmxrRW5kCisgICAgCitPTVhWQ0JsazEKKyAgICAgICAgTU9WICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4CisgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjMTIKKyAgICAKKyAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCisgICAgCisgICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQorICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKKyAgICAgICAgICAgIAorICAgICAgICBCICAgICBCbGtFbmQKKworT01YVkNCbGsyCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKKyAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAorICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICMxMgorICAgICAgICBCICAgICBCbGtFbmQKKworT01YVkNCbGszCisgICAgICAgIEFERCAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQiwgIzgKKyAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCisgICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKKyAgICAKK0Jsa0VuZAorCisgICAgICAgIDsvLyBVc2luZyB0aGUgdHJhbnNwZXJhbmN5IGluZm8sIHplcm8KKyAgICAgICAgOy8vIG91dCB0aGUgY2FuZGlkYXRlIE1WIGlmIG5lY2Nlc2FyeQorICAgICAgICBMRFJTSCBDYW5kTVYxZHgsIFtwQ2FuZE1WMV0sICMyCisgICAgICAgIExEUlNIIENhbmRNVjJkeCwgW3BDYW5kTVYyXSwgIzIKKyAgICAgICAgTERSU0ggQ2FuZE1WM2R4LCBbcENhbmRNVjNdLCAjMgorICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiBwRHN0TVZQcmVkTUUsIHBwRHN0TVZQcmVkTUUKKworICAgICAgICBMRFJTSCBDYW5kTVYxZHksIFtwQ2FuZE1WMV0KKyAgICAgICAgTERSU0ggQ2FuZE1WMmR5LCBbcENhbmRNVjJdCisgICAgICAgIExEUlNIIENhbmRNVjNkeSwgW3BDYW5kTVYzXQorCisgICAgICAgIENNUCBwRHN0TVZQcmVkTUUsICMwICAgICAgICAKKworICAgICAgICA7Ly8gU3RvcmUgdGhlIGNhbmRpZGF0ZSBNVidzIGludG8gdGhlIHBEc3RNVlByZWRNRSwgCisgICAgICAgIDsvLyB0aGVzZSBjYW4gYmUgdXNlZCBpbiB0aGUgZmFzdCBhbGdvcml0aG0gaWYgaW1wbGVtZW50ZWQgCisKKyAgICAgICAgU1RSSE5FIENhbmRNVjFkeCwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYxZHksIFtwRHN0TVZQcmVkTUVdLCAjMiAgICAgICAgCisgICAgICAgIFNUUkhORSBDYW5kTVYyZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WMmR5LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjNkeCwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYzZHksIFtwRHN0TVZQcmVkTUVdCisgICAgICAgICAgIAorICAgICAgICA7IEZpbmQgdGhlIG1lZGlhbiBvZiB0aGUgMyBjYW5kaWRhdGUgTVYncworICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR4LCBDYW5kTVYyZHgsIENhbmRNVjNkeCwgdGVtcAorCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSIHBEc3RNVlByZWQsIHBwRHN0TVZQcmVkCisKKyAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeSwgQ2FuZE1WMmR5LCBDYW5kTVYzZHksIHRlbXAKKyAgICAKKyAgICAgICAgU1RSSCBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkXSwgIzIKKyAgICAgICAgU1RSSCBDYW5kTVYzZHksIFtwRHN0TVZQcmVkXQorCisgICAgICAgIE1PViByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgCisgICAgICAgIE1fRU5ECisgICAgRU5ESUYgOy8vIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorICAgIAorICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZWI1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCkBAIC0wLDAgKzEsNzMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9JRENUOHg4YmxrX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsKKzsvLworICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9JRENUX3MuaCAgICAgICAgCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtQ09NTV9JRENUUHJlU2NhbGUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBGdW5jdGlvbiBwcm90b3R5cGUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAgICAgT01YUmVzdWx0CisgICAgICAgIDsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsoY29uc3QgT01YX1MxNiogcFNyYywKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiogcERzdCkKKyAgICAgICAgOy8vICAgIAorICAgICAgICAKKyAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKyAgICAgICAgTV9BTExPQzQgIHBwRGVzdCwgNAorICAgICAgICBNX0FMTE9DNCAgcFN0cmlkZSwgNAorICAgICAgICBNX0FMTE9DOCAgcEJsaywgMio4KjgKKyAgICBFTkRJRgorICAgIAorICAgIElGIEFSTTExMzZKUworICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9JRENUOHg4YmxrLCByMTEKKyAgICBFTkRJRgorICAgIAorICAgICAgICAKKyAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKyAgICAgICAgCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitwRHN0ICAgICAgICAgICAgUk4gMQorCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCitSZXN1bHQgICAgICAgICAgUk4gMAorCis7Ly8gUHJvdG90eXBlIGZvciBtYWNybyBNX0lEQ1QKKzsvLyBwU3JjICAgICAgICAgICAgUk4gMCAgOy8vIHNvdXJjZSBkYXRhIGJ1ZmZlcgorOy8vIFN0cmlkZSAgICAgICAgICBSTiAxICA7Ly8gZGVzdGluYXRpb24gc3RyaWRlIGluIGJ5dGVzCis7Ly8gcERlc3QgICAgICAgICAgIFJOIDIgIDsvLyBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcgorOy8vIHBTY2FsZSAgICAgICAgICBSTiAzICA7Ly8gcG9pbnRlciB0byBzY2FsaW5nIHRhYmxlCisKK3BTcmMgICAgUk4gMCAgICAKK1N0cmlkZSAgUk4gMSAgICAKK3BEZXN0ICAgUk4gMiAgICAKK3BTY2FsZSAgUk4gMyAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcERlc3QsIHBEc3QKKyAgICAgICAgTERSICAgICAgICAgcFNjYWxlLCA9YXJtQ09NTV9JRENUUHJlU2NhbGUgICAgICAgIAorICAgICAgICBNX0lEQ1QgICAgICBzOSwgczE2LCAxNiAgICAgIAorICAgICAgICBNT1YgICAgICAgICBSZXN1bHQsICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5EICAgICAgIAorICAgIEVORElGICAKKyAgICAgICAgOy8vIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5NjViZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwpAQCAtMCwwICsxLDcxMyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vCis7Ly8KKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworCisgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIEFSTTExMzZKUyBpbXBsZW1lbnRhdGlvbgorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIElGICBBUk0xMTM2SlMKKyAgICAKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBNQUNSTyBERUZJTklUSU9OUworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8KKyAgICA7Ly8gICBkZXN0W2pdID0gKHhbal0gKyB5W2pdICsgcm91bmQpID4+IDEsICAgaj0wLi4zCisgICAgOy8vCisgICAgOy8vIFNpbWlsYXIgdG8gVUhBREQ4IGluc3RydWN0aW9uLCBidXQgd2l0aCBhIHJvdW5kaW5nIHZhbHVlIG9mIDEgYWRkZWQgdG8KKyAgICA7Ly8gZWFjaCBzdW0gYmVmb3JlIGRpdmlkaW5nIGJ5IHR3bywgaWYgcm91bmQgaXMgMQorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fVUhBREQ4UiAgICRkZXN0LCAkeCwgJHksICRyb3VuZCwgJG1hc2sKKyAgICA7Ly8KKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkeCAgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgeFszXSA6ICB4WzJdICA6ICB4WzFdICA6ICB4WzBdCisgICAgOy8vICR5ICAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB5WzNdIDogIHlbMl0gIDogIHlbMV0gIDogIHlbMF0KKyAgICA7Ly8gJHJvdW5kICAgIDAgaWYgbm8gcm91bmRpbmcgdG8gYmUgYWRkZWQsIDEgaWYgcm91bmRpbmcgdG8gYmUgZG9uZQorICAgIDsvLyAkbWFzayAgICAgc29tZSByZWdpc3RlciBzZXQgdG8gMHg4MDgwODA4MAorICAgIDsvLworICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkZGVzdCAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgelszXSA6ICB6WzJdICA6ICB6WzFdICA6ICB6WzBdCisKKyAgICBNQUNSTworICAgIE1fVUhBREQ4UiAgICRkZXN0LCAkeCwgJHksICRyb3VuZCwgJG1hc2sKKyAgICBJRiAkcm91bmQgPSAxCisgICAgICAgIElGICAkZGVzdCAvPSAkeQorICAgICAgICAgICAgTVZOICAgICAgICAgJGRlc3QsICR4CisgICAgICAgICAgICBVSFNVQjggICAgICAkZGVzdCwgJHksICRkZXN0CisgICAgICAgICAgICBFT1IgICAgICAgICAkZGVzdCwgJGRlc3QsICRtYXNrCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIE1WTiAgICAgICAgICRkZXN0LCAkeQorICAgICAgICAgICAgVUhTVUI4ICAgICAgJGRlc3QsICR4LCAkZGVzdAorICAgICAgICAgICAgRU9SICAgICAgICAgJGRlc3QsICRkZXN0LCAkbWFzaworICAgICAgICBFTkRJRgorICAgIEVMU0UKKyAgICAgICAgVUhBREQ4ICAgICAgJGRlc3QsICR4LCAkeQorICAgIEVORElGCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gTG9hZCA4IGJ5dGVzIGZyb20gJHBTcmMgKGFsaWduZWQgb3IgdW5hbGlnbmVkIGxvY2F0aW9ucykKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0xPQURfWCAgICAkcFNyYywgJHNyY1N0ZXAsICRvdXQwLCAkb3V0MSwgJHNjcmF0Y2gsICRvZmZzZXQKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHBTcmMgICAgICAgNCBieXRlIGFsaWduZWQgc291cmNlIHBvaW50ZXIgdG8gYW4gYWRkcmVzcyBqdXN0IGxlc3MgdGhhbiAKKyAgICA7Ly8gICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGRhdGEgbG9jYXRpb24KKyAgICA7Ly8gJHNyY1N0ZXAgICAgVGhlIHN0cmlkZSBvbiBzb3VyY2UKKyAgICA7Ly8gJHNjcmF0Y2ggICAgQSBzY3JhdGNoIHJlZ2lzdGVyLCB1c2VkIGludGVybmFsbHkgZm9yIHRlbXAgY2FsY3VsYXRpb25zCisgICAgOy8vICRvZmZzZXQgICAgIERpZmZlcmVuY2Ugb2Ygc291cmNlIGRhdGEgbG9jYXRpb24gdG8gdGhlIHNvdXJjZSBwb2ludGVyCisgICAgOy8vICAgICAgICAgICAgIFVzZSB3aGVuICRvZmZzZXQgIT0gMCAodW5hbGlnbmVkIGxvYWQpCisgICAgOy8vCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vICRwU3JjICAgICAgIEluIGNhc2UgdGhlIG1hY3JvIGFjY2VwdHMgc3RyaWRlLCBpdCBpbmNyZW1lbnRzIHRoZSBwU3JjIGJ5IAorICAgIDsvLyAgICAgICAgICAgICB0aGF0IHZhbHVlLCBlbHNlIHVuY2hhbmdlZAorICAgIDsvLyAkb3V0MCAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzNdIDogIHpbMl0gIDogIHpbMV0gIDogIHpbMF0KKyAgICA7Ly8gJG91dDEgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgels3XSA6ICB6WzZdICA6ICB6WzVdICA6ICB6WzRdCisgICAgOy8vCisgICAgOy8vIE5vdGU6IHskb3V0MCwgJG91dDEsICRzY3JhdGNofSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCisgICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZy4gSW4gY2FzZSBvZmZzZXQgaXMgMCwgJHNjcmF0Y2ggaXMgbm90IG1vZGlmaWVkLgorCisgICAgTUFDUk8KKyAgICBNX0xPQURfWCAgICAkcFNyYywgJHNyY1N0ZXAsICRvdXQwLCAkb3V0MSwgJHNjcmF0Y2gsICRvZmZzZXQKKyAgICAgICAgSUYgJG9mZnNldCA9IDAKKyAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JG91dDAsICRvdXQxfQorICAgICAgICAgICAgQUREICAgICAgICAgJHBTcmMsICRwU3JjLCAkc3JjU3RlcAorICAgICAgICBFTFNFCisgICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyRvdXQwLCAkb3V0MSwgJHNjcmF0Y2h9IAorICAgICAgICAgICAgQUREICAgICAgICAgJHBTcmMsICRwU3JjLCAkc3JjU3RlcAorICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgICAgICAkb3V0MCwgJG91dDAsIExTUiAjOCAqICRvZmZzZXQKKyAgICAgICAgICAgIE9SUiAgICAgICAgICRvdXQwLCAkb3V0MCwgJG91dDEsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKKyAgICAgICAgICAgIE1PViAgICAgICAgICRvdXQxLCAkb3V0MSwgTFNSICM4ICogJG9mZnNldAorICAgICAgICAgICAgT1JSICAgICAgICAgJG91dDEsICRvdXQxLCAkc2NyYXRjaCwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQorICAgICAgICBFTkRJRgorICAgIE1FTkQKKworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gTG9hZHMgdGhyZWUgd29yZHMgZm9yIFggaW50ZXJwb2xhdGlvbiwgdXBkYXRlIHBvaW50ZXIgdG8gbmV4dCByb3cuIEZvciAKKyAgICA7Ly8gWCBpbnRlcnBvbGF0aW9uLCBnaXZlbiBhIHRydW5jYXRlZC00Ynl0ZUFsaWduZWQgc291cmNlIHBvaW50ZXIsIAorICAgIDsvLyBpbnZhcmlhYmx5IHRocmVlIGNvbnRpbm91cyB3b3JkcyBhcmUgcmVxdWlyZWQgZnJvbSB0aGVyZSB0byBnZXQgdGhlCisgICAgOy8vIG5pbmUgYnl0ZXMgZnJvbSB0aGUgc291cmNlIHBvaW50ZXIgZm9yIGZpbHRlcmluZy4gCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9MT0FEX1hJTlQgJHBTcmMsICRzcmNTdGVwLCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHBTcmMgICAgICAgNCBieXRlIGFsaWduZWQgc291cmNlIHBvaW50ZXIgdG8gYW4gYWRkcmVzcyBqdXN0IGxlc3MgdGhhbiAKKyAgICA7Ly8gICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGRhdGEgbG9jYXRpb24KKyAgICA7Ly8KKyAgICA7Ly8gJHNyY1N0ZXAgICAgVGhlIHN0cmlkZSBvbiBzb3VyY2UKKyAgICA7Ly8KKyAgICA7Ly8gJG9mZnNldCAgICAgRGlmZmVyZW5jZSBvZiBzb3VyY2UgZGF0YSBsb2NhdGlvbiB0byB0aGUgc291cmNlIHBvaW50ZXIKKyAgICA7Ly8gICAgICAgICAgICAgVXNlIHdoZW4gJG9mZnNldCAhPSAwICh1bmFsaWduZWQgbG9hZCkKKyAgICA7Ly8KKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJHBTcmMgICAgICAgSW5jcmVtZW50ZWQgYnkgJHNyY1N0ZXAKKyAgICA7Ly8KKyAgICA7Ly8gJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgOy8vICAgICAgICAgICAgIFRocmVlIG9mIHRoZXNlIGFyZSBvdXRwdXRzIGJhc2VkIG9uIHRoZSAkb2Zmc2V0IHBhcmFtZXRlci4gCisgICAgOy8vICAgICAgICAgICAgIFRoZSBvdXRwdXRzIGFyZSBzcGVjaWZpY2FsbHkgZ2VuZXJhdGVkIHRvIGJlIHByb2Nlc3NlZCBieSAKKyAgICA7Ly8gICAgICAgICAgICAgdGhlIE1fRVhUX1hJTlQgbWFjcm8uIEZvbGxvd2luZyBpcyB0aGUgaWxsdXN0cmF0aW9uIHRvIHNob3cgCisgICAgOy8vICAgICAgICAgICAgIGhvdyB0aGUgbmluZSBieXRlcyBhcmUgc3Bhbm5lZCBmb3IgZGlmZmVyZW50IG9mZnNldHMgZnJvbSAKKyAgICA7Ly8gICAgICAgICAgICAgbm90VHJ1bmNhdGVkRm9yQWxpZ25tZW50U291cmNlUG9pbnRlci4KKyAgICA7Ly8KKyAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsvLyAgICAgICAgICAgICB8IE9mZnNldCB8IEFsaWduZWQgUHRyIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAorICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDAgICB8ICAgICAgIDAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDh4eHggIHwgICAgICAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDEgICB8ICAgICAgLTEgICAgIHwgeDAxMiAgfCAzNDU2ICB8IDc4eHggIHwgICAgICAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDIgICB8ICAgICAgLTIgICAgIHwgeHgwMSAgfCAyMzQ1ICB8IDY3OHggIHwgICAgICAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDMgICB8ICAgICAgLTMgICAgIHwgeHh4MCAgfCAgICAgICB8IDEyMzQgIHwgNTY3OCAgfAorICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vIAorICAgIDsvLyAgICAgICAgICAgICB3aGVyZSB0aGUgbnVtYmVyaW5nICgwLTgpIGlzIHRvIGRlc2lnbmF0ZSB0aGUgOSBieXRlcyBmcm9tCisgICAgOy8vICAgICAgICAgICAgIHN0YXJ0IG9mIGEgcGFydGljdWxhciByb3cuIFRoZSBpbGx1c3RyYXRpb24gZG9lc24ndCB0YWtlIGluIAorICAgIDsvLyAgICAgICAgICAgICBhY2NvdW50IHRoZSBwb3NpdGlvbmluZyBvZiBieXRlcyB3aXRoIGluIHRoZSB3b3JkIGFuZCB0aGUgCisgICAgOy8vICAgICAgICAgICAgIG1hY3JvIGNvbWJpbmF0aW9uIHdpdGggTV9FWFRfWElOVCB3aWxsIHdvcmsgb25seSBpbiBsaXR0bGUgCisgICAgOy8vICAgICAgICAgICAgIGVuZGlhbiBlbnZpcm9ucworICAgIDsvLyAKKyAgICA7Ly8gTm90ZTogeyR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkM30gc2hvdWxkIGJlIHJlZ2lzdGVycyB3aXRoIGFzY2VuZGluZworICAgIDsvLyByZWdpc3RlciBudW1iZXJpbmcKKworICAgIE1BQ1JPCisgICAgTV9MT0FEX1hJTlQgJHBTcmMsICRzcmNTdGVwLCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICAgICAgSUYgJG9mZnNldCAvPSAzCisgICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyR3b3JkMCwgJHdvcmQxLCAkd29yZDJ9CisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JHdvcmQwLCAkd29yZDIsICR3b3JkM30KKyAgICAgICAgRU5ESUYKKyAgICAgICAgQUREICAgICAgICAgJHBTcmMsICRwU3JjLCAkc3JjU3RlcAorICAgIE1FTkQKKworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gRXh0cmFjdCBmb3VyIHJlZ2lzdGVycyBvZiBmb3VyIHBpeGVscyBmb3IgWCBpbnRlcnBvbGF0aW9uIAorICAgIDsvLyAKKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0VYVF9YSU5UICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkb2Zmc2V0ICAgICBEaWZmZXJlbmNlIG9mIHNvdXJjZSBkYXRhIGxvY2F0aW9uIHRvIHRoZSBzb3VyY2UgcG9pbnRlcgorICAgIDsvLyAgICAgICAgICAgICBVc2Ugd2hlbiAkb2Zmc2V0ICE9IDAgKHVuYWxpZ25lZCBsb2FkKQorICAgIDsvLyAKKyAgICA7Ly8gJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgOy8vICAgICAgICAgICAgIFRocmVlIG9mIHRoZXNlIGFyZSBpbnB1dHMgYmFzZWQgb24gdGhlICRvZmZzZXQgcGFyYW1ldGVyLiAKKyAgICA7Ly8gICAgICAgICAgICAgVGhlIGlucHV0cyBhcmUgc3BlY2lmaWNhbGx5IHNlbGVjdGVkIHRvIGJlIHByb2Nlc3NlZCBieSAKKyAgICA7Ly8gICAgICAgICAgICAgdGhlIE1fRVhUX1hJTlQgbWFjcm8uCisgICAgOy8vCisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7Ly8gICAgICAgICAgICAgfCBPZmZzZXQgfCBBbGlnbmVkIFB0ciB8IHdvcmQwIHwgd29yZDEgfCB3b3JkMiB8IHdvcmQzIHwKKyAgICA7Ly8gICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICA7Ly8gICAgICAgICAgICAgfCAgICAwICAgfCAgICAgICAwICAgICB8IDAxMjMgIHwgNDU2NyAgfCA4eHh4ICB8IHl5eXkgIHwKKyAgICA7Ly8gICAgICAgICAgICAgfCAgICAxICAgfCAgICAgIC0xICAgICB8IHgwMTIgIHwgMzQ1NiAgfCA3OHh4ICB8IHl5eXkgIHwKKyAgICA7Ly8gICAgICAgICAgICAgfCAgICAyICAgfCAgICAgIC0yICAgICB8IHh4MDEgIHwgMjM0NSAgfCA2Nzh4ICB8IHl5eXkgIHwKKyAgICA7Ly8gICAgICAgICAgICAgfCAgICAzICAgfCAgICAgIC0zICAgICB8IHh4eDAgIHwgeXl5eSAgfCAxMjM0ICB8IDU2NzggIHwKKyAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsvLyAKKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgOy8vICAgICAgICAgICAgIEJ5dGVzIGZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZSBwb2ludGVyIChub3QgdHJ1bmNhdGVkIGZvcgorICAgIDsvLyAgICAgICAgICAgICA0IGJ5dGUgYWxpZ25tZW50KSBhcyBzaG93biBpbiB0aGUgdGFibGUuIAorICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsvLyAgICAgICAgICAgICB8IHdvcmQwIHwgd29yZDEgfCB3b3JkMiB8IHdvcmQzIHwKKyAgICA7Ly8gICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgOy8vICAgICAgICAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDEyMzQgIHwgNTY3OCAgfAorICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsvLworICAgIDsvLyBOb3RlOiB7JHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzfSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCisgICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZworCisgICAgTUFDUk8KKyAgICBNX0VYVF9YSU5UICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgICAgICBJRiAkb2Zmc2V0ID0gMAorICAgICAgICAgICAgOyAkd29yZDAgYW5kICR3b3JkMSBhcmUgb2sKKyAgICAgICAgICAgIDsgJHdvcmQyLCAkd29yZDMgYXJlIGp1c3QgOCBzaGlmdGVkIHZlcnNpb25zCisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDMsICR3b3JkMSwgTFNSICM4CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDMsICR3b3JkMywgJHdvcmQyLCBMU0wgIzI0CisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDIsICR3b3JkMCwgTFNSICM4CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDIsICR3b3JkMiwgJHdvcmQxLCBMU0wgIzI0CisgICAgICAgIEVMSUYgJG9mZnNldCA9IDMKKyAgICAgICAgICAgIDsgJHdvcmQyIGFuZCAkd29yZDMgYXJlIG9rICh0YWtlbiBjYXJlIHdoaWxlIGxvYWRpbmcgaXRzZWxmKQorICAgICAgICAgICAgOyBzZXQgJHdvcmQwICYgJHdvcmQxCisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDAsICR3b3JkMCwgTFNSICMyNAorICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQwLCAkd29yZDAsICR3b3JkMiwgTFNMICM4CisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDEsICR3b3JkMiwgTFNSICMyNAorICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQxLCAkd29yZDEsICR3b3JkMywgTFNMICM4CisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMCwgJHdvcmQwLCBMU1IgIzggKiAkb2Zmc2V0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDAsICR3b3JkMCwgJHdvcmQxLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDEsICR3b3JkMSwgTFNSICM4ICogJG9mZnNldAorICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQxLCAkd29yZDEsICR3b3JkMiwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQorCisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDMsICR3b3JkMSwgTFNSICM4CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDMsICR3b3JkMywgJHdvcmQyLCBMU0wgIygzMiAtIDggKiAoKCRvZmZzZXQpKzEpKQorICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQyLCAkd29yZDAsIExTUiAjOAorICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQyLCAkd29yZDIsICR3b3JkMSwgTFNMICMyNAorICAgICAgICBFTkRJRgorICAgIE1FTkQKKworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gQ29tcHV0ZXMgaGFsZi1zdW0gYW5kIHhvciBvZiB0d28gaW5wdXRzIGFuZCBwdXRzIHRoZW0gaW4gdGhlIGlucHV0IAorICAgIDsvLyByZWdpc3RlcnMgaW4gdGhhdCBvcmRlcgorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fSFNVTV9YT1IgICAgICAkdjAsICR2MSwgJHRtcAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkdjAgICAgICAgICBhLCBmaXJzdCBpbnB1dAorICAgIDsvLyAkdjEgICAgICAgICBiLCBzZWNvbmQgaW5wdXQKKyAgICA7Ly8gJHRtcCAgICAgICAgc2NyYXRjaCByZWdpc3RlcgorICAgIDsvLyAKKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJHYwICAgICAgICAgKGEgKyBiKS8yCisgICAgOy8vICR2MSAgICAgICAgIGEgXiBiCisKKyAgICBNQUNSTworICAgIE1fSFNVTV9YT1IgICAgICAkdjAsICR2MSwgJHRtcAorICAgICAgICBVSEFERDggICAgICAkdG1wLCAkdjAsICR2MSAgICAgOy8vIHMwID0gYSArIGIKKyAgICAgICAgRU9SICAgICAgICAgJHYxLCAkdjAsICR2MSAgICAgIDsvLyBsMCA9IGEgXiBiCisgICAgICAgIE1PViAgICAgICAgICR2MCwgJHRtcCAgICAgICAgICA7Ly8gczAKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBDYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNCB2YWx1ZXMgKGEsYixjLGQpIGZvciBIYWxmUGl4ZWxYWSBwcmVkaWN0IHR5cGUgaW4gCisgICAgOy8vIG1jUmVjb25CbG9jayBtb2R1bGUuIFZlcnkgc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIAorICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSBkb25lIGhlcmUuIFVzZXMgInRtcCIgYXMgc2NyYXRjaCByZWdpc3RlciBhbmQgCisgICAgOy8vICJ5TWFzayIgZm9yIG1hc2sgdmFyaWFibGUgIjB4MTAxMDEwMXgiIHNldCBpbiBpdC4gSW4geU1hc2sgNCBsc2JzIGFyZSAKKyAgICA7Ly8gbm90IHNpZ25pZmljYW50IGFuZCBhcmUgdXNlZCBieSB0aGUgY2FsbGVlIGZvciByb3cgY291bnRlciAoeSkKKyAgICA7Ly8KKyAgICA7Ly8gU29tZSBwb2ludHMgdG8gbm90ZSBhcmU6CisgICAgOy8vIDEuIElucHV0IGlzIHBhaXIgb2YgcGFpci1hdmVyYWdlcyBhbmQgWG9ycworICAgIDsvLyAyLiAkc3VtMSBhbmQgJGxzYjEgYXJlIG5vdCBtb2RpZmllZCBhbmQgaGVuY2UgY2FuIGJlIHJldXNlZCBpbiBhbm90aGVyIAorICAgIDsvLyAgICBydW5uaW5nIGF2ZXJhZ2UKKyAgICA7Ly8gMy4gT3V0cHV0IGlzIGluIHRoZSBmaXJzdCBhcmd1bWVudAorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fQVZHNCAgICAgICAgICRzdW0wLCAkbHNiMCwgJHN1bTEsICRsc2IxLCAkcm5kVmFsCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRzdW0wICAgICAgIChhICsgYikgPj4gMSwgd2hlcmUgYSBhbmQgYiBhcmUgMXN0IGFuZCAybmQgaW5wdXRzIHRvIGJlIGF2ZXJhZ2VkCisgICAgOy8vICRsc2IwICAgICAgIChhIF4gYikKKyAgICA7Ly8gJHN1bTEgICAgICAgKGMgKyBkKSA+PiAxLiBOb3QgbW9kaWZpZWQKKyAgICA7Ly8gJGxzYjEgICAgICAgKGMgXiBkKSAgICAgICBOb3QgbW9kaWZpZWQKKyAgICA7Ly8gJHJuZFZhbCAgICAgQXNzZW1ibGVyIFZhcmlhYmxlLiAwIGZvciByb3VuZGluZywgMSBmb3Igbm8gcm91bmRpbmcKKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vICRzdW0wICAgICAgIChhICsgYiArIGMgKyBkICsgMSkgLyA0IDogSWYgbm8gcm91bmRpbmcKKyAgICA7Ly8gICAgICAgICAgICAgKGEgKyBiICsgYyArIGQgKyAyKSAvIDQgOiBJZiByb3VuZGluZworCisgICAgTUFDUk8KKyAgICBNX0FWRzQgICAgICAgICAgJHN1bTAsICRsc2IwLCAkc3VtMSwgJGxzYjEsICRybmRWYWwKKyAgICAgICAgTENMUyBPUDEKKyAgICAgICAgTENMUyBPUDIKKyAgICAgICAgSUYgJHJuZFZhbCA9IDAgOy8vIHJvdW5kaW5nIGNhc2UKK09QMSBTRVRTICJBTkQiCitPUDIgU0VUUyAiT1JSIgorICAgICAgICBFTFNFICAgICAgICAgICA7Ly8gTm90IHJvdW5kaW5nIGNhc2UKK09QMSBTRVRTICJPUlIiCitPUDIgU0VUUyAiQU5EIgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgTENMUyBsc2IyCisgICAgICAgIExDTFMgc3VtMgorICAgICAgICBMQ0xTIGRlc3QKKyAgICAKK2xzYjIgIFNFVFMgInRtcCIKK3N1bTIgIFNFVFMgIiRsc2IwIgorZGVzdCAgU0VUUyAiJHN1bTAiCisKKyAgICAgICAgJE9QMSAgICAgICAgJGxzYjAsICRsc2IwLCAkbHNiMSAgICAgICAgICA7Ly8gZTAgPSBlMCAmIGUxCisgICAgICAgIEVPUiAgICAgICAgICRsc2IyLCAkc3VtMCwgJHN1bTEgICAgICAgICAgOy8vIGUyID0gczAgXiBzMQorICAgICAgICAkT1AyICAgICAgICAkbHNiMiwgJGxzYjIsICRsc2IwICAgICAgICAgIDsvLyBlMiA9IGUyIHwgZTAKKyAgICAgICAgQU5EICAgICAgICAgJGxzYjIsICRsc2IyLCB5TWFzaywgTFNSICMgNCA7Ly8gZTIgPSBlMiAmIG1hc2sKKyAgICAgICAgVUhBREQ4ICAgICAgJHN1bTIsICRzdW0wLCAkc3VtMSAgICAgICAgICA7Ly8gczIgPSAoczAgKyBzMSkvMgorICAgICAgICBVQUREOCAgICAgICAkZGVzdCwgJHN1bTIsICRsc2IyICAgICAgICAgIDsvLyBkZXN0ID0gIHMyICsgZTIKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gTW90aW9uIGNvbXBlbnNhdGlvbiBoYW5kbGVyIG1hY3JvcworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gSW1wbGVtZW50IG1vdGlvbiBjb21wZW5zYXRpb24gcm91dGluZXMgdXNpbmcgdGhlIG5hbWVkIHJlZ2lzdGVycyBpbiAKKyAgICA7Ly8gY2FsbGVlIGZ1bmN0aW9uLiBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgNCBpbXBsZW1lbnQgdGhlIDQgcHJlZGljdCB0eXBlCisgICAgOy8vIEVhY2ggaGFuZGxlcyA4IGNhc2VzIGVhY2ggaWUgYWxsIHRoZSBjb21iaW5hdGlvbnMgb2YgNCB0eXBlcyBvZiBzb3VyY2UgCisgICAgOy8vIGFsaWdubWVudCBvZmZzZXRzIGFuZCAyIHR5cGVzIG9mIHJvdW5kaW5nIGZsYWcKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICAgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICAgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSAgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcm5kVmFsICAgICBBc3NlbWJsZXIgVmFyaWFibGUuIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZworICAgIDsvLyAkb2Zmc2V0ICAgICAkcFNyYyBNT0QgNCB2YWx1ZS4gT2Zmc2V0IGZyb20gNCBieXRlIGFsaWduZWQgbG9jYXRpb24uCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyBPdXRwdXRzIGNvbWUgaW4gdGhlIG5hbWVkIHJlZ2lzdGVycyBvZiB0aGUgY2FsbGVlIGZ1bmN0aW9ucworICAgIDsvLyBUaGUgbWFjcm8gbG9hZHMgdGhlIGRhdGEgZnJvbSB0aGUgc291cmNlIHBvaW50ZXIsIHByb2Nlc3NlcyBpdCBhbmQgCisgICAgOy8vIHN0b3JlcyBpbiB0aGUgZGVzdGluYXRpb24gcG9pbnRlci4gRG9lcyB0aGUgd2hvbGUgcHJlZGljdGlvbiBjeWNsZQorICAgIDsvLyBvZiBNb3Rpb24gQ29tcGVuc2F0aW9uIHJvdXRpbmUgZm9yIGEgcGFydGljdWxhciBwcmVkaWN0VHlwZQorICAgIDsvLyBBZnRlciB0aGlzIG9ubHkgcmVzaWR1ZSBhZGRpdGlvbiB0byB0aGUgcHJlZGljdGVkIHZhbHVlcyByZW1haW4KKworICAgIE1BQ1JPCisgICAgTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsICRybmRWYWwsICRvZmZzZXQKKyAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246CisgICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBJbnRlZ2VyUGl4ZWwgcHJlZGljdFR5cGUuIEJvdGgKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZSBiYXNlLiBJdCBpcyBqdXN0IGEgY29weQorICAgIDsvLyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4gVHdvIGxpbmVzIGFyZSBkb25lIHBlciBsb29wIHRvIHJlZHVjZSAKKyAgICA7Ly8gc3RhbGxzLiBMb29wIGhhcyBiZWVuIHNvZnR3YXJlIHBpcGVsaW5lZCBhcyB3ZWxsIGZvciB0aGF0IHB1cnBvc2UuCisgICAgOy8vIAorICAgIDsvLyBNX0xPQURfWCBsb2FkcyBhIHdob2xlIHJvdyBpbiB0d28gcmVnaXN0ZXJzIGFuZCB0aGVuIHRoZXkgYXJlIHN0b3JlZAorICAgIAorQ2FzZUludGVnZXJQaXhlbFJuZDBPZmZzZXQkb2Zmc2V0CitDYXNlSW50ZWdlclBpeGVsUm5kMU9mZnNldCRvZmZzZXQKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXAzLCAkb2Zmc2V0CisgICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMywgdG1wNCwgdG1wNSwgJG9mZnNldAorWWxvb3BJbnRlZ2VyUGl4ZWxPZmZzZXQkb2Zmc2V0CisgICAgU1VCUyAgICAgICAgeSwgeSwgIzIKKyAgICBTVFJEICAgICAgICB0bXAxLCB0bXAyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICBTVFJEICAgICAgICB0bXAzLCB0bXA0LCBbcERzdF0sIGRzdFN0ZXAKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXAzLCAkb2Zmc2V0CisgICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMywgdG1wNCwgdG1wNSwgJG9mZnNldAorICAgIEJHVCAgICAgICAgIFlsb29wSW50ZWdlclBpeGVsT2Zmc2V0JG9mZnNldAorCisgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTUFDUk8KKyAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICRybmRWYWwsICRvZmZzZXQKKyAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246CisgICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBIYWxmUGl4ZWxYIHByZWRpY3RUeXBlLiBUaGUgdHdvCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAorICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIExvb3AgaGFzIGJlZW4gc29mdHdhcmUgcGlwZWxpbmVkIHRvIHJlZHVjZSAKKyAgICA7Ly8gc3RhbGxzLgorICAgIDsvLyAKKyAgICA7Ly8gRmlsdGVyaW5nIGludm9sdmVzIGF2ZXJhZ2luZyBhIHBpeGVsIHdpdGggdGhlIG5leHQgaG9yaXpvbnRhbCBwaXhlbC4KKyAgICA7Ly8gTV9MT0FEX1hJTlQgYW5kIE1fRVhUX1hJTlQgY29tYmluYXRpb24gZ2VuZXJhdGUgNCByZWdpc3RlcnMsIDIgd2l0aCAKKyAgICA7Ly8gYWxsIHBpeGVscyBpbiBhIHJvdyB3aXRoIDQgcGl4ZWwgaW4gZWFjaCByZWdpc3RlciBhbmQgYW5vdGhlciAyCisgICAgOy8vIHJlZ2lzdGVycyB3aXRoIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIG9uZSBob3Jpem9udGFsbHkgc2hpZnRlZCBwaXhlbAorICAgIDsvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbml0aWFsIHJvdyBwaXhlbHMuIFRoZXNlIGFyZSBzZXQgb2YgcGFja2VkIAorICAgIDsvLyByZWdpc3RlcnMgYXBwcm9wcmlhdGUgdG8gZG8gNCBsYW5lIFNJTUQuCisgICAgOy8vIEFmdGVyIHRoYXQgTV9VSEFERDhSIG1hY3JvIGRvZXMgdGhlIGF2ZXJhZ2luZyB0YWtpbmcgY2FyZSBvZiB0aGUgCisgICAgOy8vIHJvdW5kaW5nIGFzIHJlcXVpcmVkCisgICAgCitDYXNlSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIElGICRybmRWYWwgPSAwCisgICAgICAgIExEUiBtYXNrLCA9MHg4MDgwODA4MAorICAgIEVORElGCisKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0CitZbG9vcEhhbGZQaXhlbFhSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICBTVUJTICAgICAgICB5LCB5LCAjMQorICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKKyAgICBNX1VIQUREOFIgICB0bXA1LCB0bXAxLCB0bXAzLCAoMS0kcm5kVmFsKSwgbWFzaworICAgIE1fVUhBREQ4UiAgIHRtcDYsIHRtcDIsIHRtcDQsICgxLSRybmRWYWwpLCBtYXNrCisgICAgU1RSRCAgICAgICAgdG1wNSwgdG1wNiwgW3BEc3RdLCBkc3RTdGVwCisgICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgIEJHVCAgICAgICAgIFlsb29wSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorCisgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTUFDUk8KKyAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICRybmRWYWwsICRvZmZzZXQKKyAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246CisgICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBIYWxmUGl4ZWxZIHByZWRpY3RUeXBlLiBUaGUgdHdvCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAorICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIFByZUxvYWRpbmcgaXMgdXNlZCB0byBhdm9pZCByZWxvYWQgb2Ygc2FtZSBkYXRhLiAKKyAgICA7Ly8gCisgICAgOy8vIEZpbHRlcmluZyBpbnZvbHZlcyBhdmVyYWdpbmcgYSBwaXhlbCB3aXRoIHRoZSBuZXh0IHZlcnRpY2FsIHBpeGVsLgorICAgIDsvLyBNX0xPQURfWCBnZW5lcmF0ZXMgMiByZWdpc3RlcnMgd2l0aCBhbGwgcGl4ZWxzIGluIGEgcm93IHdpdGggNCBwaXhlbCBpbiAKKyAgICA7Ly8gZWFjaCByZWdpc3Rlci4gVGhlc2UgYXJlIHNldCBvZiBwYWNrZWQgcmVnaXN0ZXJzIGFwcHJvcHJpYXRlIHRvIGRvIAorICAgIDsvLyA0IGxhbmUgU0lNRC4gQWZ0ZXIgdGhhdCBNX1VIQUREOFIgbWFjcm8gZG9lcyB0aGUgYXZlcmFnaW5nIHRha2luZyBjYXJlIAorICAgIDsvLyBvZiB0aGUgcm91bmRpbmcgYXMgcmVxdWlyZWQKKyAgICAKK0Nhc2VIYWxmUGl4ZWxZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisgICAgSUYgJHJuZFZhbCA9IDAKKyAgICAgICAgTERSIG1hc2ssID0weDgwODA4MDgwCisgICAgRU5ESUYKKworICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDUsICRvZmZzZXQgOy8vIFByZS1sb2FkCitZbG9vcEhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICBTVUJTICAgICAgICB5LCB5LCAjMgorICAgIDsvLyBQcm9jZXNzaW5nIG9uZSBsaW5lCisgICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMywgdG1wNCwgdG1wNSwgJG9mZnNldAorICAgIE1fVUhBREQ4UiAgIHRtcDEsIHRtcDEsIHRtcDMsICgxLSRybmRWYWwpLCBtYXNrCisgICAgTV9VSEFERDhSICAgdG1wMiwgdG1wMiwgdG1wNCwgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBTVFJEICAgICAgICB0bXAxLCB0bXAyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICA7Ly8gUHJvY2Vzc2luZyBhbm90aGVyIGxpbmUKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXA1LCAkb2Zmc2V0CisgICAgTV9VSEFERDhSICAgdG1wMywgdG1wMywgdG1wMSwgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBNX1VIQUREOFIgICB0bXA0LCB0bXA0LCB0bXAyLCAoMS0kcm5kVmFsKSwgbWFzaworICAgIFNUUkQgICAgICAgIHRtcDMsIHRtcDQsIFtwRHN0XSwgZHN0U3RlcAorCisgICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisKKyAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBNQUNSTworICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZICRybmRWYWwsICRvZmZzZXQKKyAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246CisgICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBIYWxmUGl4ZWxYWSBwcmVkaWN0VHlwZS4gVGhlIHR3bworICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgZGlmZmVyZW50IGNvZGUgYmFzZSBhbmQgc3Bhbm5lZCBieSAKKyAgICA7Ly8gZGlmZmVyZW50IG1hY3JvIGNhbGxzLiBQcmVMb2FkaW5nIGlzIHVzZWQgdG8gYXZvaWQgcmVsb2FkIG9mIHNhbWUgZGF0YS4gCisgICAgOy8vIAorICAgIDsvLyBGaWx0ZXJpbmcgaW52b2x2ZXMgYXZlcmFnaW5nIGEgcGl4ZWwgd2l0aCB0aGUgbmV4dCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCAKKyAgICA7Ly8gYW5kIHJpZ2h0LWRvd24gZGlhZ29uYWwgcGl4ZWxzLiBKdXN0IGFzIGluIEhhbGZQaXhlbFggY2FzZSwgTV9MT0FEX1hJTlQKKyAgICA7Ly8gYW5kIE1fRVhUX1hJTlQgY29tYmluYXRpb24gZ2VuZXJhdGVzIDQgcmVnaXN0ZXJzIHdpdGggYSByb3cgYW5kIGl0cworICAgIDsvLyAxIHBpeGVsIHJpZ2h0IHNoaWZ0ZWQgdmVyc2lvbiwgd2l0aCA0IHBpeGVscyBpbiBvbmUgcmVnaXN0ZXIuIEFub3RoZXIgCisgICAgOy8vIGNhbGwgb2YgdGhhdCBtYWNyby1jb21iaW5hdGlvbiBnZXRzIGFub3RoZXIgcm93LiBUaGVuIE1fSFNVTV9YT1IgaXMgCisgICAgOy8vIGNhbGxlZCB0byBnZXQgbXV0dWFsIGhhbGYtc3VtIGFuZCB4b3IgY29tYmluYXRpb25zIG9mIGEgcm93IHdpdGggaXRzCisgICAgOy8vIHNoaWZ0ZWQgdmVyc2lvbiBhcyB0aGV5IGFyZSBpbnB1dHMgdG8gdGhlIE1fQVZHNCBtYWNybyB3aGljaCBjb21wdXRlcworICAgIDsvLyB0aGUgNCBlbGVtZW50IGF2ZXJhZ2Ugd2l0aCByb3VuZGluZy4gTm90ZSB0aGF0IGl0IGlzIHRoZSBoYWxmLXN1bS94b3IgCisgICAgOy8vIHZhbHVlcyB0aGF0IGFyZSBwcmVzZXJ2ZWQgZm9yIG5leHQgcm93IGFzIHRoZXkgY2FuIGJlIHJlLXVzZWQgaW4gdGhlIAorICAgIDsvLyBuZXh0IGNhbGwgdG8gdGhlIE1fQVZHNCBhbmQgc2F2ZXMgcmVjb21wdXRhdGlvbi4KKyAgICA7Ly8gRHVlIHRvIGxhY2sgb2YgcmVnaXN0ZXIsIHRoZSByb3cgY291bnRlciBhbmQgYSBtYXNraW5nIHZhbHVlIHJlcXVpcmVkIAorICAgIDsvLyBpbiBNX0FWRzQgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIHJlZ2lzdGVyIHlNYXNrIHdoZXJlIHRoZSBsYXN0IG5pYmJsZQorICAgIDsvLyBob2xkcyB0aGUgcm93IGNvdW50ZXIgdmFsdWVzIGFuZCByZXN0IGhvbGRzIHRoZSBtYXNraW5nIHZhcmlhYmxlIGxlZnQgCisgICAgOy8vIHNoaWZ0ZWQgYnkgNAorICAgIAorQ2FzZUhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisgICAgTERSICAgICAgICAgeU1hc2ssID0oKDB4MDEwMTAxMDEgPDwgNCkgKyA4KQorCisgICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExIDsvLyBMb2FkIGEsIGEnLCBiLCBiJworICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMQorICAgIE1fSFNVTV9YT1IgIHQwMCwgdDEwLCB0bXAgICAgICAgICAgICAgICA7Ly8gczAsIGwwCisgICAgTV9IU1VNX1hPUiAgdDAxLCB0MTEsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMCcsIGwwJworCitZbG9vcEhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisgICAgOy8vIFByb2Nlc3NzaW5nIG9uZSBsaW5lCisgICAgOy8vIHQwMCwgdDAxLCB0MTAsIHQxMSByZXF1aXJlZCBmcm9tIHByZXZpb3VzIGxvb3AKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MjAsIHQyMSwgdDMwLCB0MzEgOy8vIExvYWQgYywgYycsIGQsIGQnCisgICAgU1VCICAgICAgICAgeU1hc2ssIHlNYXNrLCAjMgorICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHQyMCwgdDIxLCB0MzAsIHQzMQorICAgIE1fSFNVTV9YT1IgIHQyMCwgdDMwLCB0bXAgICAgICAgICAgICAgICA7Ly8gczEsIGwxCisgICAgTV9IU1VNX1hPUiAgdDIxLCB0MzEsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMScsIGwxJworICAgIE1fQVZHNCAgICAgIHQwMCwgdDEwLCB0MjAsIHQzMCwgJHJuZFZhbCA7Ly8gczAsIGwwLCBzMSwgbDEKKyAgICBNX0FWRzQgICAgICB0MDEsIHQxMSwgdDIxLCB0MzEsICRybmRWYWwgOy8vIHMwJywgbDAnLCBzMScsIGwxJworICAgIFNUUkQgICAgICAgIHQwMCwgdDAxLCBbcERzdF0sIGRzdFN0ZXAgICA7Ly8gc3RvcmUgdGhlIGF2ZXJhZ2UKKyAgICAKKyAgICA7Ly8gUHJvY2Vzc3NpbmcgYW5vdGhlciBsaW5lCisgICAgOy8vIHQyMCwgdDIxLCB0MzAsIHQzMSByZXF1aXJlZCBmcm9tIGFib3ZlCisgICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExIDsvLyBMb2FkIGEsIGEnLCBiLCBiJworICAgIFRTVCAgICAgICAgIHlNYXNrLCAjNworICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMQorICAgIE1fSFNVTV9YT1IgIHQwMCwgdDEwLCB0bXAKKyAgICBNX0hTVU1fWE9SICB0MDEsIHQxMSwgdG1wCisgICAgTV9BVkc0ICAgICAgdDIwLCB0MzAsIHQwMCwgdDEwLCAkcm5kVmFsCisgICAgTV9BVkc0ICAgICAgdDIxLCB0MzEsIHQwMSwgdDExLCAkcm5kVmFsCisgICAgU1RSRCAgICAgICAgdDIwLCB0MjEsIFtwRHN0XSwgZHN0U3RlcAorCisgICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxYWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorCisgICAgSUYgJG9mZnNldC89MyA6TE9SOiAkcm5kVmFsLz0xCisgICAgICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgRU5ESUYKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gTW90aW9uIGNvbXBlbnNhdGlvbiBoYW5kbGVyIG1hY3JvcyBlbmQgaGVyZQorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gUG9wdWxhdGVzIGFsbCA0IGtpbmRzIG9mIG9mZnNldHMgImNhc2VzIiBmb3IgZWFjaCBwcmVkaWN0VHlwZSBhbmQgcm5kVmFsCisgICAgOy8vIGNvbWJpbmF0aW9uIGluIHRoZSAic3dpdGNoIiB0byBwcmVkaWN0aW9uIHByb2Nlc3NpbmcgY29kZSBzZWdtZW50CisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9DQVNFX09GRlNFVCAkcm5kLCAkcHJlZGljdFR5cGUKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHJuZCAgICAgICAgICAgIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZworICAgIDsvLyAkcHJlZGljdFR5cGUgICAgVGhlIHByZWRpY3Rpb24gbW9kZQorICAgIDsvLyAKKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gUG9wdWxhdGVkIGxpc3Qgb2YgIk1fQ0FTRSJzIGZvciB0aGUgIk1fU1dJVENIIiBtYWNybworCisgICAgTUFDUk8KKyAgICBNX0NBU0VfT0ZGU0VUICRybmQsICRwcmVkaWN0VHlwZQorICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MAorICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MQorICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MgorICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MworICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIFBvcHVsYXRlcyBhbGwgMiBraW5kcyBvZiByb3VuZGluZyAiY2FzZXMiIGZvciBlYWNoIHByZWRpY3RUeXBlIGluIHRoZSAKKyAgICA7Ly8gInN3aXRjaCIgdG8gcHJlZGljdGlvbiBwcm9jZXNzaW5nIGNvZGUgc2VnbWVudAorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fQ0FTRV9PRkZTRVQgJHByZWRpY3RUeXBlCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9DQVNFX09GRlNFVCIgbWFjcm9zCisKKyAgICBNQUNSTworICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgJHByZWRpY3RUeXBlCisgICAgICAgIE1fQ0FTRV9PRkZTRVQgIDAsICRwcmVkaWN0VHlwZSA7Ly8gMCBmb3Igcm91bmRpbmcKKyAgICAgICAgTV9DQVNFX09GRlNFVCAgMSwgJHByZWRpY3RUeXBlIDsvLyAxIGZvciBubyByb3VuZGluZworICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIFBvcHVsYXRlcyBhbGwgOCBraW5kcyBvZiByb3VuZGluZyBhbmQgb2Zmc2V0IGNvbWJpbmF0aW9ucyBoYW5kbGluZyBtYWNyb3MgCisgICAgOy8vIGZvciB0aGUgc3BlY2lmaWVkIHByZWRpY3RUeXBlLiBJbiBjYXNlIG9mICJJbnRlZ2VyUGl4ZWwiIHByZWRpY3RUeXBlLCAKKyAgICA7Ly8gcm91bmRpbmcgaXMgbm90IHJlcXVpcmVkIHNvIHNhbWUgY29kZSBzZWdtZW50IGhhbmRsZXMgYm90aCBjYXNlcworICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLICAgICRwcmVkaWN0VHlwZQorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcHJlZGljdFR5cGUgICAgVGhlIHByZWRpY3Rpb24gbW9kZQorICAgIDsvLyAKKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gUG9wdWxhdGVkIGxpc3Qgb2YgIk1fTUNSRUNPTkJMT0NLXzxwcmVkaWN0VHlwZT4iIG1hY3JvcyBmb3Igc3BlY2lmaWVkIAorICAgIDsvLyBwcmVkaWN0VHlwZS4gRWFjaCAKKyAgICA7Ly8gICAgICAgICAgICAgICAgIE1fTUNSRUNPTkJMT0NLXzxwcmVkaWN0VHlwZT4gJHJuZCwgJG9mZnNldCAKKyAgICA7Ly8gaXMgYW4gY29kZSBzZWdtZW50IChzdGFydGluZyB3aXRoIGEgbGFiZWwgaW5kaWNhdGluZyB0aGUgcHJlZGljdFR5cGUsIAorICAgIDsvLyByb3VuZGluZyBhbmQgb2Zmc2V0IGNvbWJpbmF0aW9uKQorICAgIDsvLyBGb3VyIGNhbGxzIG9mIHRoaXMgbWFjcm8gd2l0aCB0aGUgNCBwcmVkaWN0aW9uIG1vZGVzIHBvcHVsYXRlIGFsbCB0aGUgMzIgCisgICAgOy8vIGhhbmRsZXJzCisKKyAgICBNQUNSTworICAgIE1fTUNSRUNPTkJMT0NLICRwcmVkaWN0VHlwZQorICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMAorICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMQorICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMgorICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMworICAgIElGICIkcHJlZGljdFR5cGUiIC89ICJJbnRlZ2VyUGl4ZWwiIDsvLyBJZiBub3QgSW50ZWdlclBpeGVsIHRoZW4gcm91bmRpbmcgbWFrZXMgYSBkaWZmZXJlbmNlCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAwCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAxCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAyCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAzCisgICAgRU5ESUYKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gSW5wdXQvT3V0cHV0IFJlZ2lzdGVycworcFNyYyAgICAgICAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICAgICAgICBSTiAxCithcmdfcFNyY1Jlc2lkdWUgICAgICAgUk4gMgorcFNyY1Jlc2lkdWUgICAgICAgICAgIFJOIDEyCitwRHN0ICAgICAgICAgICAgICAgICAgUk4gMworZHN0U3RlcCAgICAgICAgICAgICAgIFJOIDIKK3ByZWRpY3RUeXBlICAgICAgICAgICBSTiAxMAorcm5kVmFsICAgICAgICAgICAgICAgIFJOIDExCittYXNrICAgICAgICAgICAgICAgICAgUk4gMTEKKworOy8vIExvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCit6ZXJvICAgICAgICAgICAgICAgICAgUk4gMTIKK3kgICAgICAgICAgICAgICAgICAgICBSTiAxNAorCit0bXAxICAgICAgICAgICAgICAgICAgUk4gNAordG1wMiAgICAgICAgICAgICAgICAgIFJOIDUKK3RtcDMgICAgICAgICAgICAgICAgICBSTiA2Cit0bXA0ICAgICAgICAgICAgICAgICAgUk4gNwordG1wNSAgICAgICAgICAgICAgICAgIFJOIDgKK3RtcDYgICAgICAgICAgICAgICAgICBSTiA5Cit0bXA3ICAgICAgICAgICAgICAgICAgUk4gMTAKK3RtcDggICAgICAgICAgICAgICAgICBSTiAxMQordG1wOSAgICAgICAgICAgICAgICAgIFJOIDEyCisKK3QwMCAgICAgICAgICAgICAgICAgICBSTiA0Cit0MDEgICAgICAgICAgICAgICAgICAgUk4gNQordDEwICAgICAgICAgICAgICAgICAgIFJOIDYKK3QxMSAgICAgICAgICAgICAgICAgICBSTiA3Cit0MjAgICAgICAgICAgICAgICAgICAgUk4gOAordDIxICAgICAgICAgICAgICAgICAgIFJOIDkKK3QzMCAgICAgICAgICAgICAgICAgICBSTiAxMAordDMxICAgICAgICAgICAgICAgICAgIFJOIDExCit0bXAgICAgICAgICAgICAgICAgICAgUk4gMTIKKworeU1hc2sgICAgICAgICAgICAgICAgIFJOIDE0CisKK2RzdCAgICAgICAgICAgICAgICAgICBSTiAxCityZXR1cm4gICAgICAgICAgICAgICAgUk4gMAorCisgICAgOy8vIEFsbG9jYXRlIG1lbW9yeSBvbiBzdGFjaworICAgIE1fQUxMT0M0ICAgIFN0a19wRHN0LCAgICAgICAgICAgNAorICAgIE1fQUxMT0M0ICAgIFN0a19wU3JjUmVzaWR1ZSwgICAgNAorICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICBNX1NUQVJUICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrLCByMTEKKyAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgIE1fQVJHICAgICAgIEFyZ19kc3RTdGVwLCAgICAgICAgNAorICAgIE1fQVJHICAgICAgIEFyZ19wcmVkaWN0VHlwZSwgICAgNAorICAgIE1fQVJHICAgICAgIEFyZ19ybmRWYWwsICAgICAgICAgNAorICAgIDsvLyBTYXZlIG9uIHN0YWNrCisgICAgTV9TVFIgICAgICAgcERzdCwgU3RrX3BEc3QKKyAgICBNX1NUUiAgICAgICBhcmdfcFNyY1Jlc2lkdWUsIFN0a19wU3JjUmVzaWR1ZQorICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgTV9MRFIgICAgICAgZHN0U3RlcCwgQXJnX2RzdFN0ZXAKKyAgICBNX0xEUiAgICAgICBwcmVkaWN0VHlwZSwgQXJnX3ByZWRpY3RUeXBlCisgICAgTV9MRFIgICAgICAgcm5kVmFsLCBBcmdfcm5kVmFsCisgICAgCisgICAgTU9WICAgICAgICAgeSwgIzgKKyAgICAKKyAgICBBTkQgICAgICAgICB0bXAxLCBwU3JjLCAjMworICAgIE9SUiAgICAgICAgIHByZWRpY3RUeXBlLCB0bXAxLCBwcmVkaWN0VHlwZSwgTFNMICMzCisgICAgT1JSICAgICAgICAgcHJlZGljdFR5cGUsIHByZWRpY3RUeXBlLCBybmRWYWwsIExTTCAjMgorICAgIDsvLyBUcnVuY2F0aW5nIHNvdXJjZSBwb2ludGVyIHRvIGFsaWduIHRvIDQgYnl0ZSBsb2NhdGlvbgorICAgIEJJQyAgICAgICAgIHBTcmMsIHBTcmMsICMzCisKKyAgICA7Ly8gSW1wbGVtZW50YXRpb24gdGFrZXMgY2FyZSBvZiBhbGwgY29tYmluYXRpb25zIG9mIGRpZmZlcmVudCAKKyAgICA7Ly8gcHJlZGljdFR5cGVzLCByb3VuZGluZyBjYXNlcyBhbmQgc291cmNlIHBvaW50ZXIgb2Zmc2V0cyB0byBhbGlnbm1lbnQgCisgICAgOy8vIG9mIDQgYnl0ZXMgaW4gZGlmZmVyZW50IGNvZGUgYmFzZXMgdW5sZXNzIG9uZSBvZiB0aGVzZSBwYXJhbWV0ZXIgd2Fzbid0IAorICAgIDsvLyBtYWtpbmcgYW55IGRpZmZlcmVuY2UgdG8gdGhlIGltcGxlbWVudGF0aW9uLiBCZWxvdyBNX0NBU0VfTUNSRUNPTkJMT0NLCisgICAgOy8vIG1hY3JvcyBicmFuY2ggaW50byA4IE1fQ0FTRSBtYWNyb3MgZm9yIGFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIDIgCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFuZCA0IG9mZnNldHMgb2YgdGhlIHBTcmMgcG9pbnRlciB0byB0aGUgNCBieXRlIAorICAgIDsvLyBhbGlnbm1lbnQuIAorICAgIE1fU1dJVENIICAgIHByZWRpY3RUeXBlCisgICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSW50ZWdlclBpeGVsCisgICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWAorICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFkKKyAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYWQorICAgIE1fRU5EU1dJVENICisKKyAgICA7Ly8gVGhlIE1fTUNSRUNPTkJMT0NLIG1hY3JvcyBwb3B1bGF0ZSB0aGUgY29kZSBiYXNlcyBieSBjYWxsaW5nIGFsbCA4IAorICAgIDsvLyBwYXJ0aWN1bGFyIG1hY3JvcyAoNCBpbiBjYXNlIG9mIEludGVnZXJQaXhlbCBhcyByb3VuZGluZyBtYWtlcyBubyAKKyAgICA7Ly8gZGlmZmVyZW5jZSB0aGVyZSkgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIGFsbCBjYXNlcyBvZiByb3VuZGluZyBhbmQgCisgICAgOy8vIG9mZnNldHMuIExUT1JHIGlzIHVzZWQgdG8gc2VnbWVudCB0aGUgY29kZSBhcyBjb2RlIHNpemUgYmxvYXRlZCBiZXlvbmQgCisgICAgOy8vIDRLQi4KKyAgICBNX01DUkVDT05CTE9DSyBJbnRlZ2VyUGl4ZWwKKyAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYCisgICAgTFRPUkcKKyAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxZCisgICAgTV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWFkKK1N3aXRjaFByZWRpY3RUeXBlRW5kCisKKyAgICA7Ly8gUmVzaWR1ZSBBZGRpdGlvbgorICAgIDsvLyBUaGlzIGlzIGRvbmUgaW4gMiBsYW5lIFNJTUQgdGhvdWdoIGxvYWRzIGFyZSBmdXJ0aGVyIG9wdGltaXplZCBhbmQKKyAgICA7Ly8gNCBieXRlcyBhcmUgbG9hZGVkIGluIGNhc2Ugb2YgZGVzdGluYXRpb24gYnVmZmVyLiBBbGdvcml0aG1pYyAKKyAgICA7Ly8gZGV0YWlscyBhcmUgaW4gaW5saW5lZCBjb21tZW50cworICAgIE1fTERSICAgICAgIHBTcmNSZXNpZHVlLCBTdGtfcFNyY1Jlc2lkdWUKKyAgICBDTVAgICAgICAgICBwU3JjUmVzaWR1ZSwgIzAKKyAgICBCRVEgICAgICAgICBwU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAorcFNyY1Jlc2lkdWVOb3ROdWxsICAgIAorICAgIE1fTERSICAgICAgIHBEc3QsIFN0a19wRHN0CisgICAgTU9WICAgICAgICAgeSwgIzgKKyAgICBTVUIgICAgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjNAorWWxvb3BfcFNyY1Jlc2lkdWVOb3ROdWxsCisgICAgU1VCUyAgICAgICAgeSwgeSwgIzEKKyAgICBMRFIgICAgICAgICBkc3QsIFtwRHN0XSAgICAgICAgICAgICAgICA7Ly8gZHN0ID0gW2RjYmFdCisgICAgTERNSUEgICAgICAgcFNyY1Jlc2lkdWUhLCB7dG1wMSwgdG1wMn0gOy8vIHRtcDE9W0RDXSB0bXAyPVtCQV0KKyAgICBQS0hCVCAgICAgICB0bXAzLCB0bXAxLCB0bXAyLCBMU0wgIzE2ICA7Ly8gRGVsdGF2YWwxID0gW0MgQV0KKyAgICBQS0hUQiAgICAgICB0bXA0LCB0bXAyLCB0bXAxLCBBU1IgIzE2ICA7Ly8gRGVsdGFWYWwyID0gW0QgQl0KKyAgICBVWFRCMTYgICAgICB0bXAxLCBkc3QgICAgICAgICAgICAgICAgICA7Ly8gdG1wMSA9IFswYzBhXQorICAgIFVYVEIxNiAgICAgIHRtcDIsIGRzdCwgUk9SICM4ICAgICAgICAgIDsvLyB0bXAyID0gWzBkMGJdCisgICAgUUFERDE2ICAgICAgdG1wMSwgdG1wMSwgdG1wMyAgICAgICAgICAgOy8vIEFkZCBhbmQgc2F0dXJhdGUgdG8gMTYgYml0cworICAgIFFBREQxNiAgICAgIHRtcDIsIHRtcDIsIHRtcDQKKyAgICBVU0FUMTYgICAgICB0bXAxLCAjOCwgdG1wMQorICAgIFVTQVQxNiAgICAgIHRtcDIsICM4LCB0bXAyICAgICAgICAgICAgIDsvLyBhcm1DbGlwKDAsIDI1NSwgdG1wMikKKyAgICBPUlIgICAgICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzggICA7Ly8gdG1wMSA9IFtkY2JhXQorICAgIFNUUiAgICAgICAgIHRtcDEsIFtwRHN0XSwgIzQKKyAgICAKKyAgICBMRFIgICAgICAgICBkc3QsIFtwRHN0XQorICAgIExETUlBICAgICAgIHBTcmNSZXNpZHVlISwge3RtcDEsIHRtcDJ9CisgICAgUEtIQlQgICAgICAgdG1wMywgdG1wMSwgdG1wMiwgTFNMICMxNgorICAgIFBLSFRCICAgICAgIHRtcDQsIHRtcDIsIHRtcDEsIEFTUiAjMTYKKyAgICBVWFRCMTYgICAgICB0bXAxLCBkc3QKKyAgICBVWFRCMTYgICAgICB0bXAyLCBkc3QsIFJPUiAjOAorICAgIFFBREQxNiAgICAgIHRtcDEsIHRtcDEsIHRtcDMKKyAgICBRQUREMTYgICAgICB0bXAyLCB0bXAyLCB0bXA0CisgICAgVVNBVDE2ICAgICAgdG1wMSwgIzgsIHRtcDEKKyAgICBVU0FUMTYgICAgICB0bXAyLCAjOCwgdG1wMgorICAgIE9SUiAgICAgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAorICAgIFNUUiAgICAgICAgIHRtcDEsIFtwRHN0XSwgZHN0U3RlcAorICAgIAorICAgIEJHVCAgICAgICAgIFlsb29wX3BTcmNSZXNpZHVlTm90TnVsbAorcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKKworICAgIE1PViAgICAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKworICAgIE1fRU5ECisgICAgRU5ESUYgOy8vIEFSTTExMzZKUworCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQ29ydGV4QTggaW1wbGVtZW50YXRpb24KKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBFTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBvbXhWQ000UDJfTUNSZWNvbkJsb2NrIGVuZHMKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTM0NDRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCkBAIC0wLDAgKzEsMjgzIEBACis7ICoqKioqKioqKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqIAorOyAqIERlc2NyaXB0aW9uOgorOyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbgorOyAqCis7ICogCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgorOyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCis7ICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIAorOyAqICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBUaGUgCis7ICogICAgICAgICAgICAgICAgICAgIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgCis7ICogICAgICAgICAgICAgICAgICAgIFstMjA0OCwgMjA0N10uCis7ICogW2luXSAgcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZAorOyAqICAgICAgICAgICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KKzsgKiBbaW5dICBwUHJlZEJ1ZkNvbCAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KKzsgKiBbaW5dICBjdXJRUCAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IAorOyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCAKKzsgKiAgICAgICAgICAgICAgICAgICAgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKzsgKiBbaW5dICBwcmVkUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCis7ICogW2luXSAgcHJlZERpciAgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCis7ICogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICAgIHByZWRpY3QgdmVydGljYWxseQorOyAqIFtpbl0gIEFDUHJlZEZsYWcgICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQorOyAqICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Cis7ICogICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00Cis7ICogW2luXSAgdmlkZW9Db21wICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCis7ICogICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworOyAqIFtvdXRdIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKzsgKiAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jaworOyAqIFtvdXRdIHBQcmVkQnVmUm93ICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKzsgKiBbb3V0XSBwUHJlZEJ1ZkNvbCAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKKzsgKiAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLgorOyAqIC0gQXQgbGVhc3Qgb25lIHRoZSBmb2xsb3dpbmcgY2FzZXM6IGN1clFQIDw9IDAsIHByZWRRUCA8PSAwLCBjdXJRUCA+MzEsIAorOyAqICAgcHJlZFFQID4gMzEsIHByZURpciBleGNlZWRzIFsxLDJdLgorOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IAorOyAqICAgNC1ieXRlIGFsaWduZWQuCis7ICoKKzsgKioqKioqKioqCisgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgCisgICAgICAgICAgICAgCisKKyAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMgorICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2CisgICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKKyAgICAgICAKKworCisgICAgICAgIElGIEFSTTExMzZKUworCisKKzsvLyBJbnB1dCBBcmd1bWVudHMKKworcFNyY0RzdCAgICAgICAgICBSTiAwCitwUHJlZEJ1ZlJvdyAgICAgIFJOIDEKK3BQcmVkQnVmQ29sICAgICAgUk4gMgorY3VyUVAgICAgICAgICAgICBSTiAzCitRUCAgICAgICAgICAgICAgIFJOIDMKK3ByZWRRUCAgICAgICAgICAgUk4gNAorcHJlZERpciAgICAgICAgICBSTiA1CitBQ1ByZWRGbGFnICAgICAgIFJOIDYKK3ZpZGVvQ29tcCAgICAgICAgUk4gNyAgCisKKzsvLyBMb2NhbCBWYXJpYWJsZXMKKwordGVtcDIgICAgICAgICAgICBSTiA1CituZWdDdXJRUCAgICAgICAgIFJOIDcKK25lZ2RjU2NhbGVyICAgICAgUk4gNwordGVtcFByZWQgICAgICAgICBSTiA4CisKK2RjU2NhbGVyICAgICAgICAgUk4gNAorQ29lZmZUYWJsZSAgICAgICBSTiA5CithYnNDb2VmZkRDICAgICAgIFJOIDkKK3RlbXAzICAgICAgICAgICAgUk4gNgorYWJzQ29lZmZBQyAgICAgICBSTiA2CisKK3Nob3J0VmlkZW9IZWFkZXIgUk4gOQorcHJlZENvZWZmVGFibGUgICBSTiAxMAorQ291bnQgICAgICAgICAgICBSTiAxMAordGVtcDEgICAgICAgICAgICBSTiAxMgoraW5kZXggICAgICAgICAgICBSTiAxMgorUmVtICAgICAgICAgICAgICBSTiAxNAordGVtcCAgICAgICAgICAgICBSTiAxMQorUmV0dXJuICAgICAgICAgICBSTiAwCisKKyAgICAgICAKKworICAgICAgIE1fU1RBUlQgICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLHIxMgorICAgICAgIAorICAgICAgIDsvLyBBc3NpZ25pbmcgcG9pbnRlcnMgdG8gSW5wdXQgYXJndW1lbnRzIG9uIFN0YWNrCisgICAgCisgICAgICAgTV9BUkcgICAgICAgICAgIHByZWRRUG9uU3RhY2ssNCAgCisgICAgICAgTV9BUkcgICAgICAgICAgIHByZWREaXJvblN0YWNrLDQKKyAgICAgICBNX0FSRyAgICAgICAgICAgQUNQcmVkRmxhZ29uU3RhY2ssNAorICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvblN0YWNrLDQKKyAgICAgICAKKyAgICAgICA7Ly8gREMgUHJlZGljdGlvbgorCisgICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvblN0YWNrICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmlkZW9Db21wIEZyb20gU3RhY2sgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgcHJlZERpcixwcmVkRGlyb25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBQcmVkaWN0aW9uIGRpcmVjdGlvbgorICAgICAgIAorICAgICAgIDsvLyBkY1NjYWxlciBDYWxjdWxhdGlvbgorCisgICAgICAgTERSICAgICAgICAgICAgIGluZGV4LCA9YXJtVkNNNFAyX0RDU2NhbGVyCisgICAgICAgQUREICAgICAgICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKKyAgICAgICBMRFJCICAgICAgICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQorICAgICAgICAgICAKKyAgICAKK2NhbERDVmFsCisgICAgICAKKyAgICAgICAKKyAgICAgICBMRFIgICAgICAgICAgICAgcHJlZENvZWZmVGFibGUsID1hcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYgICA7Ly8gTG9hZGluZyB0aGUgdGFibGUgd2l0aCBlbnRyaWVzIDMyNzY3LygxIHRvIDYzKSAKKyAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBwcmVkRGlyLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gaXMgdmVydGljYWwKKworICAgICAgIDsvLyBDYXVsdWNhdGUgdGVtcCBwcmVkIGJ5IHBlcmZvcm1pbmcgRGl2aXNpb24KKyAgICAgICAgICAgIAorICAgICAgIExEUkVRU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB2ZXRpY2FsIGxvYWQgdGhlIGNvZWZmIGZyb20gUm93IFByZWRpY3Rpb24gQnVmZmVyCisgICAgICAgTERSTkVTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmQ29sXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGhvcml6b250YWwgbG9hZCB0aGUgY29lZmYgZnJvbSBjb2x1bW4gUHJlZGljdGlvbiBCdWZmZXIKKyAgICAgICAKKyAgICAgICBSU0IgICAgICAgICAgICAgbmVnZGNTY2FsZXIsZGNTY2FsZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmVnZGNTY2FsZXI9LWRjU2NhbGVyICAKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9cHJlZGljdGlvbiBjb2VmZgorICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkRDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL2Fic0NvZWZmREM9YWJzKHRlbXAxKQorICAgICAgIAorICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLGRjU2NhbGVyLGRjU2NhbGVyCisgICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3ByZWRDb2VmZlRhYmxlLHRlbXBdICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmFsdWUgZnJvbSBjb2VmZiB0YWJsZSBmb3IgcGVyZm9ybWluZyBkaXZpc2lvbiB1c2luZyBtdWx0aXBsaWNhdGlvbgorICAgICAgIAorICAgICAgIFNNVUxCQiAgICAgICAgICB0ZW1wUHJlZCx0ZW1wLGFic0NvZWZmREMgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdKjMyNzY3L2RjU2NhbGVyCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAzLGRjU2NhbGVyLCMxCisgICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93KENvbClbMF0vZGNTY2FsZXIgICAgICAgICAgCisgICAgICAgTFNSICAgICAgICAgICAgIHRlbXAzLHRlbXAzLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAzPXJvdW5kKGRjU2NhbGVyLzIpCisgICAgICAgCisgICAgICAgTUxBICAgICAgICAgICAgIFJlbSxuZWdkY1NjYWxlcix0ZW1wUHJlZCxhYnNDb2VmZkRDICAgICAgICAgICAgOy8vIFJlbSA9IHBQcmVkQnVmUm93KENvbClbMF0tdGVtcFByZWQqZGNTY2FsZXIgICAgICAKKyAgICAgICAKKyAgICAgICAKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFByZWRCdWZDb2xdCisgICAgICAgQ01QICAgICAgICAgICAgIFJlbSx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgQURER0UgICAgICAgICAgIHRlbXBQcmVkLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIFJlbT49cm91bmQoZGNTY2FsZXIvMik7dGVtcFByZWQ9dGVtcFByZWQrMQorICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7LyBpZiBwUHJlZEJ1ZlJvdyhDb2wpWzBdPDA7IHRlbXBQcmVkPS10ZW1wUHJlZAorICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZlJvdywjLTE2XSAgICAgIAorCisgICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXQorICAgICAgIE1fTERSICAgICAgICAgICBBQ1ByZWRGbGFnLEFDUHJlZEZsYWdvblN0YWNrCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXSt0ZW1wUHJlZAorICAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICAgCisgICAgICAgU01VTEJCICAgICAgICAgIHRlbXAxLHRlbXAsZGNTY2FsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPWNsaXBwZWQocFNyY0RzdFswXSkqZGNTY2FsZXIgICAgICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBwcmVkUVAscHJlZFFQb25TdGFjaworICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBBQ1ByZWRGbGFnLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgQUMgcHJlZGljdGlvbiBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICBTVFJIICAgICAgICAgICAgdGVtcDEsW3BQcmVkQnVmQ29sXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgdGVtcDEgdG8gcFByZWRCdWZDb2wKKyAKKyAgICAgICA7Ly8gQUMgUHJlZGljdGlvbgorCisgICAgICAgICAgICAgIAorICAgICAgIEJORSAgICAgICAgICAgICBFeGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBub3Qgc2V0IEV4aXQKKyAgICAgICAKKyAgICAgICBMRFIgICAgICAgICAgICAgcHJlZENvZWZmVGFibGUsID1hcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIgICA7Ly8gTG9hZGluZyB0aGUgdGFibGUgd2l0aCBlbnRyaWVzIDB4MWZmZmYvKDEgdG8gNjMpCisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCM0CisgICAgICAgTVVMICAgICAgICAgICAgIHRlbXAxLGN1clFQLHRlbXAxCisgICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbgorICAgICAgIFJTQiAgICAgICAgICAgICBuZWdDdXJRUCxjdXJRUCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBMRFIgICAgICAgICAgICAgQ29lZmZUYWJsZSxbcHJlZENvZWZmVGFibGUsdGVtcDFdICAgICAgICAgICAgICA7Ly8gQ29lZmZUYWJsZT0weDFmZmZmL2N1clFQCisgICAgICAgQUREICAgICAgICAgICAgIGN1clFQLGN1clFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGN1clFQPWN1clFQKzEKKyAgICAgICBMU1IgICAgICAgICAgICAgY3VyUVAsY3VyUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9cm91bmQoY3VyUVAvMikgICAgICAgICAgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgTG9vcCBDb3VudAorICAgICAgIEJORSAgICAgICAgICAgICBIb3Jpem9udGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gaXMgaG9yaXpvbnRhbCBicmFuY2ggdG8gSG9yaXpvbnRhbAorCisgICAgICAgCisKK2xvb3AxICAgICAgIAorICAgICAgIDsvLyBDYWxjdWxhdGUgdGVtcFByZWQKKyAgICAgICAKKyAgICAgICBMRFJTSCAgICAgICAgICAgYWJzQ29lZmZBQyxbcFByZWRCdWZSb3csQ291bnRdICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZmZBQz1wUHJlZEJ1ZlJvd1tpXSwgMT08aTw9NworICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkFDCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgcFByZWRCdWZSb3dbaV0gd2l0aCB6ZXJvLCAxPTxpPD03CisgICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmQUMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGFic0NvZWZmQUM9IGFicyhwUHJlZEJ1ZlJvd1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgU01VTEJCICAgICAgICAgIGFic0NvZWZmQUMsYWJzQ29lZmZBQyxwcmVkUVAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPXBQcmVkQnVmUm93W2ldKnByZWRRUAorICAgICAgIE1VTCAgICAgICAgICAgICB0ZW1wUHJlZCxhYnNDb2VmZkFDLENvZWZmVGFibGUgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZlJvd1tpXSpwcmVkUVAqMHgxZmZmZi9jdXJRUAorICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTcgICAgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgTUxBICAgICAgICAgICAgIFJlbSxuZWdDdXJRUCx0ZW1wUHJlZCxhYnNDb2VmZkFDICAgICAgICAgICAgICAgOy8vIFJlbT1hYnMocFByZWRCdWZSb3dbaV0pLXRlbXBQcmVkKmN1clFQCisgICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFtpXSwxPD1pPDgKKyAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgUmVtLGN1clFQCisgICAgICAgQURER0UgICAgICAgICAgIHRlbXBQcmVkLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIFJlbT49cm91bmQoY3VyUVAvMik7IHRlbXBQcmVkPXRlbXBQcmVkKzEKKyAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgcFByZWRCdWZSb3dbaV08MCA7IHRlbXBQcmVkPS10ZW1wUHJlZAorICAgICAgICAgICAgICAKKyAgICAgICA7Ly8gVXBkYXRlIHNvdXJjZSBhbmQgUm93IFByZWRpY3Rpb24gYnVmZmVycworICAgICAgIAorICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHRlbXAsdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXRlbXBQcmVkK3BTcmNEc3RbaV0KKyAgICAgICBTU0FUMTYgICAgICAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2xpcCB0ZW1wIHRvIFstMjA0OCwyMDQ3XQorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0LENvdW50XQorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZlJvdyxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwUHJlZEJ1ZlJvd1tpXT10ZW1wCisgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGk9aSsxCisgICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgaWYgaT04CisgICAgICAgQkxUICAgICAgICAgICAgIGxvb3AxCisgICAgICAgQiAgICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0CisKK0hvcml6b250YWwKKworICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXppbmcgaT04CisKK2xvb3AyICAKKyAgICAgCisgICAgICAgTFNSICAgICAgICAgICAgIHRlbXAyLENvdW50LCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAyPWk+PjMKKyAgICAgICAKKyAgICAgICA7Ly8gQ2FsY3VsYXRlIHRlbXBQcmVkCisgICAgICAgCisgICAgICAgTERSSCAgICAgICAgICAgIGFic0NvZWZmQUMsW3BQcmVkQnVmQ29sLHRlbXAyXSAgICAgICAgICAgICAgICAgOy8vIGFic0NvZWZBQz1wUHJlZEJ1ZkNvbFtpPj4zXSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmQUMKKyAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBwUHJlZEJ1ZlJvd1tpXSB3aXRoIHplcm8sIDE9PGk8PTcKKyAgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZBQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZmZBQz1hYnMocFByZWRCdWZDb2xbaT4+M10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIFNNVUxCQiAgICAgICAgICBhYnNDb2VmZkFDLGFic0NvZWZmQUMscHJlZFFQICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAKKyAgICAgICBNVUwgICAgICAgICAgICAgdGVtcFByZWQsYWJzQ29lZmZBQyxDb2VmZlRhYmxlICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZDb2xbaT4+M10qcHJlZFFQKjB4MWZmZmYvY3VyUVAKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE3ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZDb2xbaT4+M10qcHJlZFFQL2N1clFQCisgICAgICAgCisgICAgICAgTUxBICAgICAgICAgICAgIFJlbSxuZWdDdXJRUCx0ZW1wUHJlZCxhYnNDb2VmZkFDCisgICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFtpXQorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBSZW0sY3VyUVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIFJlbSB3aXRoIHJvdW5kKGN1clFQLzIpCisgICAgICAgQURER0UgICAgICAgICAgIHRlbXBQcmVkLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXRlbXBQcmVkKzEgaWYgUmVtPj1yb3VuZChjdXJRUC8yKQorICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBwUHJlZEJ1ZkNvbFtpPj4zIDwwIHRlbXBQcmVkPS10ZW1wUHJlZAorICAgICAgIAorICAgICAgIDsvLyBVcGRhdGUgc291cmNlIGFuZCBSb3cgUHJlZGljdGlvbiBidWZmZXJzCisgICAgICAgCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFtpXSt0ZW1wUHJlZAorICAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMF09IGNsaXBwZWQgdmFsdWUKKyAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFByZWRCdWZDb2wsdGVtcDJdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFByZWRCdWZDb2xbaT4+M109dGVtcAorICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpPWkrOAorICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIGkgd2l0aCA2NAorICAgICAgIEJMVCAgICAgICAgICAgICBsb29wMgorCisgICAgICAgICAgICAgCitFeGl0CisgIAorICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIgCisKKyAgICAgICBNX0VORAorICAgICAgIEVORElGCisgICAgICAgRU5ECisKKworICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1OTFjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwpAQCAtMCwwICsxLDE0MSBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KKzsgKiAKKzsgKgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBpbnZlcnNlIHF1YW50aXphdGlvbiBvbiBpbnRyYS9pbnRlciBjb2RlZCBibG9jay4KKzsgKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gTWlzbWF0Y2ggY29udHJvbAorOyAqIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IE1QRUctNCBtb2RlIGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2U6IFstMjA0OCwgMjA0N10uCis7ICogTWlzbWF0Y2ggY29udHJvbCBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dIHBTcmNEc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqIFtpbl0gUVAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKKzsgKiBbaW5dIHZpZGVvQ29tcCAgICAgIChJbnRyYSB2ZXJzaW9uIG9ubHkuKSBWaWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0FMUEhBLgorOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKKzsgKiAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCis7ICogW291dF0gICAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiAgTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCis7ICogICAgLSBJZiBwU3JjRHN0IGlzIE5VTEwgb3IgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4KKzsgKiAgICAgIG9yCis7ICogICAgLSBJZiBRUCA8PSAwLgorOyAqICAgICAgb3IKKzsgKiAgICAtIHZpZGVvQ29tcCBpcyBub25lIG9mIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSBhbmQgT01YX1ZDX0FMUEhBLgorOyAqCis7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgIAorCisgICAgIElGIEFSTTExMzZKUworCis7Ly9JbnB1dCBBcmd1bWVudHMKK3BTcmNEc3QgICAgICAgICAgICBSTiAwCitRUCAgICAgICAgICAgICAgICAgUk4gMQorCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK1JldHVybiAgICAgICAgICAgICBSTiAwCitDb3VudCAgICAgICAgICAgICAgUk4gNCAgICAgIAordGVtcFZhbDIxICAgICAgICAgIFJOIDIKK3RlbXBWYWw0MyAgICAgICAgICBSTiAzCitRUDEgICAgICAgICAgICAgICAgUk4gNQorWDIgICAgICAgICAgICAgICAgIFJOIDYKK1gzICAgICAgICAgICAgICAgICBSTiAxNAorUmVzdWx0MSAgICAgICAgICAgIFJOIDgKK1Jlc3VsdDIgICAgICAgICAgICBSTiA5Cit0d28gICAgICAgICAgICAgICAgUk4gNworCisgICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLHI5CisgICAgICAgCisgICAgICAgIE1PViAgICAgIENvdW50LCM2NAorICAgICAgICBUU1QgICAgICBRUCwjMQorICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3RdICAgICAgOy8vIExvYWRzIGZpcnN0IHR3byB2YWx1ZXMgb2YgcFNyY0RzdCB0byB0ZW1wVmFsMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmV4dCB0d28gdmFsdWVzIHRvIHRlbXBWYWw0MworICAgICAgICBTVUJFUSAgICBRUDEsUVAsIzEgICAgICAgICAgICAgICAgOy8vIFFQMT1RUCBpZiBRUCBpcyBvZGQgLCBRUDE9UVAtMSBpZiBRUCBpcyBldmVuCisgICAgICAgIE1PVk5FICAgIFFQMSxRUAorICAgICAgICBNT1YgICAgICB0d28sIzIKKyAgICAgICAgCisgICAgICAgIAorCitMb29wCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIENNUCAgICAgIFgyLCMwCisgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMixYMiwjMCAgICAgICAgICAgICAgICAgOy8vIFgyPWFic29sdXRldmFsKGZpcnN0IHZhbCkKKyAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQIGlmIFFQIGlzIG9kZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQLTEgaWYgUVAgaXMgZXZlbiAKKyAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMz0gc2Vjb25kIHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIFgzLCMwCisgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCisgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBQS0hCVCAgICBSZXN1bHQxLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDFbMC0xNV09WDJbMC0xNV0sUmVzdWx0MVsxNi0zMV09WDNbMTYtMzFdCisgICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWw0MykqMgorICAgICAgICBTU0FUMTYgICBSZXN1bHQxLCMxMixSZXN1bHQxICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCisgICAgICAgIENNUCAgICAgIFgyLCMwCisgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxFICAgIFgyLFgyLCMwCisgICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMQorICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCisgICAgICAgIENNUCAgICAgIFgzLCMwCisgICAgICAgIAorICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3QsIzhdICAgOy8vIExvYWQgbmV4dCBmb3VyIFZhbHVlcyB0byB0ZW1wVmFsMjEsdGVtcFZhbDQzCisgICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBQS0hCVCAgICBSZXN1bHQyLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDJbMC0xNV09WDJbMC0xNV0sUmVzdWx0MlsxNi0zMV09WDNbMC0xNV0KKyAgICAgICAgU1NBVDE2ICAgUmVzdWx0MiwjMTIsUmVzdWx0MiAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQorICAgICAgICAKKyAgICAgICAgU1VCUyAgICAgQ291bnQsQ291bnQsIzQgICAgICAgICAgIDsvLyBEZWNyZW1lbnQgQ291bnQgYnkgNCBhbmQgY29udGludWUgaWYgaXQgaGFzIG5vdCByZWFjaGVkIDAgICAgICAgICAKKyAgICAgICAgU1RSRCAgICAgUmVzdWx0MSxbcFNyY0RzdF0sIzggICAgIDsvLyBTdG9yZSBEb3VibGUgd29yZHMgYW5kIGluY3JlbWVudCB0aGUgcG9pbnRlciB0byBwb2ludCB0aGUgbmV4dCBzdG9yZSBhZGRyZXNzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICBCR1QgICAgICBMb29wCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzI4ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCkBAIC0wLDAgKzEsMTg4IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorOyAqIAorOyAqCis7ICoKKzsgKgorOyAqCis7ICogCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludHJhX0kKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgorOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCis7ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KKzsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqIFtpbl0gICAgUVAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCis7ICogW2luXSAgICB2aWRlb0NvbXAgICAgICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCis7ICogW2luXSAgICBzaG9ydFZpZGVvSGVhZGVyICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCis7ICogICAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCis7ICogW291dF0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgICAtICAgIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgorOyAqICAgICAgb3IKKzsgKiAgICAtIElmIFFQIDw9IDAuCis7ICogICAgICBvcgorOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCis7ICoKKyAKKworICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgIAorICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgIAorICAgCisgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgorIAorICAgICAgICAgCisKKyAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworcFNyY0RzdCAgICAgICAgICAgIFJOIDAKK1FQICAgICAgICAgICAgICAgICBSTiAxCit2aWRlb0NvbXAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgIFJOIDMKKworOy8vTG9jYWwgVmFyaWFibGVzCitSZXR1cm4gICAgICAgICAgICAgUk4gMAorZGNTY2FsZXIgICAgICAgICAgIFJOIDQKK3RlbXAgICAgICAgICAgICAgICBSTiAxMgoraW5kZXggICAgICAgICAgICAgIFJOIDYKKyAgICAgIAordGVtcFZhbDIxICAgICAgICAgIFJOIDQKK3RlbXBWYWw0MyAgICAgICAgICBSTiA1CitRUDEgICAgICAgICAgICAgICAgUk4gNgorWDIgICAgICAgICAgICAgICAgIFJOIDcKK1gzICAgICAgICAgICAgICAgICBSTiAxNAorUmVzdWx0MSAgICAgICAgICAgIFJOIDgKK1Jlc3VsdDIgICAgICAgICAgICBSTiA5Cit0d28gICAgICAgICAgICAgICAgUk4gMTAKK0NvdW50ICAgICAgICAgICAgICBSTiAxMQorCisKKworICAgCisgICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLHIxMQorCisKKyAgICAgICAgCisgICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBEQyBjb2VmZmljaWVudAorCisgICAgICAgIFRFUSAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgOy8vIFRlc3QgaWYgc2hvcnQgVmlkZW8gSGVhZGVyIGZsYWcgPTAgICAgICAgICAgICAgCisgICAgICAgIE1PVk5FICAgICBkY1NjYWxlciwjOCAgICAgICAgICAgICAgOy8vIGlmIHNob3J0VmlkZW9IZWFkZXIgaXMgbm9uIHplcm8gZGNTY2FsZXI9OAorICAgICAgICBCTkUgICAgICAgY2FsRENWYWwKKyAgICAgICAgTERSICAgICAgIGluZGV4LCA9YXJtVkNNNFAyX0RDU2NhbGVyCisgICAgICBBREQgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQorICAgICAgTERSQiAgICAgIGRjU2NhbGVyLFtpbmRleCxRUF0KKworCisgICAgICAgIDsvL01fQ2FsRENTY2FsYXIgIHNob3J0VmlkZW9IZWFkZXIsdmlkZW9Db21wLCBRUAorCitjYWxEQ1ZhbAorCisgICAgICAgIExEUkggICAgIHRlbXAsW3BTcmNEc3RdCisgICAgICAgIFNNVUxCQiAgIHRlbXAsdGVtcCxkY1NjYWxlciAgICAgICA7Ly8gZGNDb2VmZiA9IGRjU2NhbGVyICogUXVhbnRpemVkIERDIGNvZWZmaWNpZW50KGZyb20gbWVtb3J5KQorICAgICAgICBTU0FUICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgOy8vIFNhdHVyYXRpbmcgdG8gMTIgYml0cworICAgICAgICAKKworICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKKyAgICAgICAgVFNUICAgICAgUVAsIzEKKyAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkcyBmaXJzdCB0d28gdmFsdWVzIG9mIHBTcmNEc3QgdG8gdGVtcFZhbDIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5leHQgdHdvIHZhbHVlcyB0byB0ZW1wVmFsNDMKKyAgICAgICAgU1VCRVEgICAgUVAxLFFQLCMxICAgICAgICAgICAgICAgIDsvLyBRUDE9UVAgaWYgUVAgaXMgb2RkICwgUVAxPVFQLTEgaWYgUVAgaXMgZXZlbgorICAgICAgICBNT1ZORSAgICBRUDEsUVAKKyAgICAgICAgTU9WICAgICAgdHdvLCMyCisKKworICAgICAgICAgICAgICAgIAorICAgICAgICAKKworTG9vcAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgorICAgICAgICBDTVAgICAgICBYMiwjMAorICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAgICAgICAgICAgICAgICAgIDsvLyBYMj1hYnNvbHV0ZXZhbChmaXJzdCB2YWwpCisgICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMSAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUCBpZiBRUCBpcyBvZGQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUC0xIGlmIFFQIGlzIGV2ZW4gCisgICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDM9IHNlY29uZCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCisgICAgICAgIAorICAgICAgICBDTVAgICAgICBYMywjMAorICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQorICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgUEtIQlQgICAgUmVzdWx0MSxYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQxWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDFbMTYtMzFdPVgzWzE2LTMxXQorICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsNDMpKjIKKyAgICAgICAgU1NBVDE2ICAgUmVzdWx0MSwjMTIsUmVzdWx0MSAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQorICAgICAgICBDTVAgICAgICBYMiwjMAorICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICBSU0JMRSAgICBYMixYMiwjMAorICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEKKyAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgorICAgICAgICBSU0JMVCAgICBYMixYMiwjMAorICAgICAgICBDTVAgICAgICBYMywjMAorICAgICAgICAKKyAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0LCM4XSAgIDsvLyBMb2FkIG5leHQgZm91ciBWYWx1ZXMgdG8gdGVtcFZhbDIxLHRlbXBWYWw0MworICAgICAgICAgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgUEtIQlQgICAgUmVzdWx0MixYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQyWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDJbMTYtMzFdPVgzWzE2LTMxXQorICAgICAgICBTU0FUMTYgICBSZXN1bHQyLCMxMixSZXN1bHQyICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCisgICAgICAgIAorICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjNCAgICAgICAgICAgOy8vIERlY3JlbWVudCBDb3VudCBieSA0IGFuZCBjb250aW51ZSBpZiBpdCBoYXMgbm90IHJlYWNoZWQgMCAgICAgICAgIAorICAgICAgICBTVFJEICAgICBSZXN1bHQxLFtwU3JjRHN0XSwjOCAgICAgOy8vIFN0b3JlIERvdWJsZSB3b3JkcyBhbmQgaW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHBvaW50IHRoZSBuZXh0IHN0b3JlIGFkZHJlc3MKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIEJHVCAgICAgIExvb3AKKworICAgICAgICBTVUIgICAgICBwU3JjRHN0LHBTcmNEc3QsIzEyOAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JpbmcgdGhlIEludmVyc2UgUXVhbnRpemVkIERDIGNvZWZmaWNpZW50CisKKyAgICAgICAgU1RSSCAgICAgdGVtcCxbcFNyY0RzdF0sIzIKKyAgICAgICAgCisgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MzY4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCkBAIC0wLDAgKzEsNiBAQAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9WZXJzaW9uLmgiCisKKyNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbiA9ICJBUk0gT3Blbk1BWCBETCB2IiBBUk1fVkVSU0lPTl9TVFJJTkcgIiAgIFJlbD0iIE9NWF9BUk1fUkVMRUFTRV9UQUcgIiAgIEFyY2g9IiBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiICAgVG9vbHM9IiAgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX0RFTElWRVJZLlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjMmQ3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX0RFTElWRVJZLlRYVApAQCAtMCwwICsxLDYzIEBACitUaGUgY29udGVudHMgb2YgdGhpcyB0cmFuc2FjdGlvbiB3YXMgY3JlYXRlZCBieSBIZWRsZXkgRnJhbmNpcworb2YgQVJNIG9uIDE5LUZlYi0yMDA4LgorCitJdCBjb250YWlucyB0aGUgQVJNIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGJlbG93LgorCitUaGlzIGRhdGEsIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBpcyBBUk0gUHJvcHJpZXRhcnkgYW5kIGFjY2VzcyB0byBpdAoraXMgc3ViamVjdCB0byB0aGUgYWdyZWVtZW50cyBpbmRpY2F0ZWQgYmVsb3cuCisKK0lmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggdGhpcyBkYXRhLCBwbGVhc2UgY29udGFjdCBBUk0gc3VwcG9ydAorcXVvdGluZyB0cmFuc2FjdGlvbiByZWZlcmVuY2UgPDk3NDE0Pi4KKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCistIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxCisgIFZpZGVvIGNvZGVjcyAtIG9wdGltaXNlZCBjb2RlCisgIFY3IGNvZGUgcmVsZWFzZSBmb3IgSGFudHJvIChWZXIgMS4wLjIpCisgIGludGVybmFsIGFjY2VzcworCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK1RoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgZGVsaXZlcmFibGVzIHdoaWNoIGFyZSBkZXNpZ25hdGVkIGFzIGJlaW5nIG9mCitiZXRhIHJlbGVhc2Ugc3RhdHVzIChCRVQpLgorCitCZXRhIHJlbGVhc2Ugc3RhdHVzIGhhcyBhIHBhcnRpY3VsYXIgbWVhbmluZyB0byBBUk0gb2Ygd2hpY2ggdGhlIHJlY2lwaWVudAorbXVzdCBiZSBhd2FyZS4gQmV0YSBpcyBhIHByZS1yZWxlYXNlIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRlbGl2ZXJhYmxlCitzbyBkZXNjcmliZWQgaXMgYmVsaWV2ZWQgdG8gcm9idXN0bHkgZGVtb25zdHJhdGUgc3BlY2lmaWVkIGJlaGF2aW91ciwgdG8gYmUKK2NvbnNpc3RlbnQgYWNyb3NzIGl0cyBpbmNsdWRlZCBhc3BlY3RzIGFuZCBiZSByZWFkeSBmb3IgZ2VuZXJhbCBkZXBsb3ltZW50LgorQnV0IEJldGEgYWxzbyBpbmRpY2F0ZXMgdGhhdCBwcmUtcmVsZWFzZSByZWxpYWJpbGl0eSB0cmlhbHMgYXJlIG9uZ29pbmcgYW5kCit0aGF0IGl0IGlzIHBvc3NpYmxlIHJlc2lkdWFsIGRlZmVjdHMgb3IgZXJyb3JzIGluIG9wZXJhdGlvbiwgY29uc2lzdGVuY3kKK2FuZCBkb2N1bWVudGF0aW9uIG1heSBzdGlsbCBiZSBlbmNvdW50ZXJlZC4gVGhlIHJlY2lwaWVudCBzaG91bGQgY29uc2lkZXIKK3RoaXMgcG9zaXRpb24gd2hlbiB1c2luZyB0aGlzIEJldGEgbWF0ZXJpYWwgc3VwcGxpZWQuIEFSTSB3aWxsIG5vcm1hbGx5CithdHRlbXB0IHRvIHByb3ZpZGUgZml4ZXMgb3IgYSB3b3JrLWFyb3VuZCBmb3IgZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZQorcmVjaXBpZW50LCBidXQgdGhlIHByb3Zpc2lvbiBvciB0aW1lbGluZXNzIG9mIHRoaXMgc3VwcG9ydCBjYW5ub3QgYmUKK2d1YXJhbnRlZWQuIEFSTSBzaGFsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yIGRpcmVjdCBvciBjb25zZXF1ZW50aWFsCitkYW1hZ2VzIGFzIGEgcmVzdWx0IG9mIGVuY291bnRlcmluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSByZXNpZHVhbCBkZWZlY3RzLgorQnkgYWNjZXB0aW5nIGEgQmV0YSByZWxlYXNlLCB0aGUgcmVjaXBpZW50IGFncmVlcyB0byB0aGVzZSBjb25zdHJhaW50cyBhbmQKK3RvIHByb3ZpZGluZyByZWFzb25hYmxlIGluZm9ybWF0aW9uIHRvIEFSTSB0byBlbmFibGUgdGhlIHJlcGxpY2F0aW9uIG9mIHRoZQorZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZSByZWNpcGllbnQuIFRoZSBzcGVjaWZpYyBCZXRhIHZlcnNpb24gc3VwcGxpZWQKK3dpbGwgbm90IGJlIHN1cHBvcnRlZCBhZnRlciByZWxlYXNlIG9mIGEgbGF0ZXIgb3IgaGlnaGVyIHN0YXR1cyB2ZXJzaW9uLgorSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgU3VwcG9ydCBmb3IgdGhlIEJldGEgcmVsZWFzZSBvZiB0aGUgZGVsaXZlcmFibGUKK3dpbGwgb25seSBiZSBwcm92aWRlZCBieSBBUk0gdG8gYSByZWNpcGllbnQgd2hvIGhhcyBhIGN1cnJlbnQgc3VwcG9ydCBhbmQKK21haW50ZW5hbmNlIGNvbnRyYWN0IGZvciB0aGUgZGVsaXZlcmFibGUuCisKKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitJbiBhZGRpdGlvbiB0byB0aGUgZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYWJvdmUsIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMKK3R3byBhZGRpdGlvbmFsIGZpbGVzIGF0IHRoZSB0b3AgbGV2ZWwuCisKK1RoZSBmaXJzdCBpcyB0aGlzIGZpbGUsIEFSTV9ERUxJVkVSWV85NzQxNC5UWFQsIHdoaWNoIGlzIHRoZSBkZWxpdmVyeQorbm90ZS4KKworVGhlIHNlY29uZCBpcyBBUk1fTUFOSUZFU1RfOTc0MTQuVFhUIHdoaWNoIGNvbnRhaW5zIGEgbWFuaWZlc3Qgb2YgYWxsIHRoZQorZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgdG9nZXRoZXIgd2l0aCB0aGVpciBjaGVja3N1bXMuCisKK1RoZSBjaGVja3N1bXMgcHJvdmlkZWQgYXJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCitNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLgorCitUaGUgY2hlY2tzdW1zIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoaXMgZGF0YSB1c2luZyB0aGUKKyJtZDVzdW0iIHRvb2wgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIEdOVSAidGV4dHV0aWxzIiBwYWNrYWdlKSBieSBydW5uaW5nOgorCisgICUgbWQ1c3VtIC0tY2hlY2sgQVJNX01BTklGRVNUXzk3NDE0LlRYVAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX01BTklGRVNULlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzMTBmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX01BTklGRVNULlRYVApAQCAtMCwwICsxLDkxIEBACisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS8KKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS8KK2UwNDk3OTFjZmFiNjA2MGEwOGNiYWM3YjNhZDc2N2Q2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9zLmgKK2VkNzk4ZmFjZTI1NDk3YjI3MDNlZGU3MzZkNmQ1MmI2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXNfcy5oCis0ZWViZDYzYWYwODczNzY4MTFkNjc0OWYwNjQ2Yjg2NCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0RGVjX3MuaAorNDNjZjQ2YzJjZjJmZTFmOTNjNjE1YjU3YmNiZTQ4MDkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NLmgKKzhmMjQ4Y2VhYWM4ZjYwMmUyNzdhNTIxYjY3OWRjYmJlICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAorOGFjNWZhODBlYTk4ZTM5MWY1NzMwYTM3NTI4MGI1YmQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorM2EyZjQyMGRkZjZhMWI5NTA0NzBiZDBmNWViZDVjNjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCis1MTFjMGJiNTM0ZmUyMjM1OTllMmM4NGVmZjI0YzllZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKKzg5NzE5MzJkNTZlZWQ2YjFhZDFiYTUwN2YwYmZmNWYwICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAorZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAorOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCiszMjMwMDhiNzJlOWYwNDA5OWE4Y2I0MmU5OWExZmFjZSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKK2U3MmQ5NmMwYTQxNTQ1OTc0OGRmOTgwN2YzZGFlNzJmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KKzVlZWFlNjU5YTI5NDc3ZjVjNTIyOTZkMjRhZmZmZDNjICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYworZDY0Y2RjZjM4Zjc3NDlkYzdmNzc0NjVlNWI3ZDM1NmQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy8KKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjLworZTdlMGMzMjA5Nzg1NjRhN2M5YjJjNzIzNzQ5YTk4ZDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKzRhZGNkMGRmMDgxOTkwYmRmYzQ3MjkwNDFhMmE5MTUyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCis4NTJlMDQwNDE0Mjk2NWRjMWYzYWE3ZjAwZWU1MTI3YiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCis3MDU0MTUxYzViZmVhNmI1ZTc0ZmVlZTg2YjJkN2IwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworNWY3MjEzYTRmMzc2MjdiM2M1OGY2Mjk0YmE0NzdlMzAgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCiszMmZmNGI4YmU2MmUyZjBmM2U3NjRiODNjMWU1ZTJmZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKK2QwNjZlM2M4MWQ4MjYxNmYzN2VjMTgxMGVhNDllN2I3ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCitmZTYyOWEzZTlkNTUzOTVhNjA5OGJkZjI0MzFiNWYwMiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCis1YjEzZmI5NTRiNzY3OWRlMjAwNzZiYjZhN2Y0ZWUxZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucworMDFiYTYwZWZmNjZlYTQ5YTRmODMzY2U2Mjc5ZjhlMmYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworZmExMDcyY2YxZDE3ZTk2NjZjOWYxZTIxNWZhMzAyYjEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKK2RiMzg3YjllNjZkMzI3ODdmNDdlZjljZjAzNDdkYTJhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworZWE1MzdlNGUyYWQwM2ExOTQwOTgxMDU1ZmEzYWNlMDEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKKzI5YTQyODM4ODViOTQ3M2EzNTUwYTgxZWZmMjU1OWQyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKzJkZGNhZjYwYThlYTFlNmU2Yjc3NzM3Zjc2OGJmYjlkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKK2MzMDAyYWFkNTYwMGY4NzJiNzBhNWQ3ZmUzOTE1ODQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworYTI5MDBmMmM0N2YxYzYxZDIwYmQ2YzFlZGEzM2Q2ZDQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKK2M5MjFkZjczMzk3YTMyYzk0N2RjOTk2YmE2ODU4NTUzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworMzc2OWUxNGYyZmMzZjUxNGQwMjVmZTZhYjczZmY2N2EgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKK2MwMjlkMWNlYmVhMGEwOWUxZDIzNWEzN2UyMTU1MDAyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKzA3NmEwMzNmODE2MTc1MGE2ODU3NTZmOWY1MWYwNGM5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucworYzViNWQyMjg0MjgyMmU2ZTVlMzEwOTQ4ODJjYmViNDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKK2Y2YmRmNmQ5MTRhNGExNDc5ZjUyNDk1MWEzNDA5ODQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKK2ViZWIwNzEzYTliMmVhMjU5ODYzNjBlZjI2MjEzOGM0ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCis3OGVkOWVhMjAwZmFhN2JlNjY1NDQ1YTcxMzg1OWFmMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworYzJkOTk1Zjc4N2I2ZjQ0ZWYxMGM3NTFjMTJkMTkzNWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCis0MGJlZDY3OWE5ZjZlMGQzZWZlMjE2YjdkNGE5Y2Y0NSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKzRhNTJiM2U5ZTI2OGI4YThmMDc4MjliZjUwMGQwM2FmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCisxMTI0OWY4YTk4YzVkNGI4NGNiNTU3NWIwZTM3Y2E5YyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisyNTEzYjYwNTU5YmE3MWFlNDk1YzYwNTNmYjc3OWZhOSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworMmZiMWVlMTdjMzZlM2MxNDY5YzE3MGY2ZGFjMTFiZjEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworY2M0YTZmMzJkYjBiNzJhOTFkM2YyNzhmNjg1NWRmNjkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLworNmU1MzBkZGFhN2MyYjU3ZmZlODgxNjJjMDIwY2I2NjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KK2JlYzZkZTM0OGIxMTM0Mzg0OTg4NjdiODY5MDAxNjIyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCitkYmE5ODI0ZTk1OWIyMWQ0MDFjYWM5MjVlNjhhMTFhNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKK2RmYTdlNWI1ODAyN2JlMzU0MmRkYTA1OTNiNzdiMmQzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworNGZiYTRjNDMxYTc4M2E3OGEyZWI2NDk3YTk0YWM5NjcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKzM5OTkxOTYxMTc5Y2EwM2I2MzgxYjZlNjUzYjFmMTRiICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworMWIwYjI5OTBjMjY2OWRmYjg3Y2Y2YjgxMDYxMWMwMWIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworMWM5Yjg3YWJmMzI4M2U5NTc4MTZiMzkzN2M2ODA3MDEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworNGZlMWFmY2E2NTlhOTA1NWZjMTE3MmU1OGY3OGE1MDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworMmVhMDY3ZjA0MzZmOTFiYTEzNTFlZGFmNDExY2I0ZWEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKzZjZTM2M2FhZGM5ZDY1YzMwOGI0MGNjYTg5MDJlNGY2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKK2JmMjEyZjc4Njc3MmFlZDJiYzcwNWQyMmZmNGU3NGY1ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKzI5M2E0OGE2NDhhMzA4NTQ1NmU2NjY1YmI3MzY2ZmFkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKzJiYjQ3ZWQ5YzllMjVjNTcwOWM2ZDliNGFkMzlhMzhhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworNDM3ZGZhMjA0NTA4ODUwZDYxZDRiODcwOTE0NDZlOWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKK2JjOTc3ODg5OGRkNDExMDFkYzBmYjAxMzllYWY4M2NjICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCitmYzE5MWVlYWU0M2Y4Y2U3MzVkYmQzMTFjYzdiY2I4ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKK2EwZDg1ZjRmNTE3Yzk0NWE0YzkzMTdhYzAyMWYyZDA4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKzM4NjAyMGRlZThiNzI1YzdmZTI1MjZmMWZjMjExZDdkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLworNDYyNGU3YzgzOGUxMGEyNDlhYmNjM2QzZjRmNDA3NDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorNjVlMTA1N2QwNGUyY2I4NDQ1NTlkYzlmNmUwOTc5NWEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KK2U2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCis3Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKKzEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAorMTE3MjZlMjg2YTgxMjU3Y2I0NWY1NTQ3ZmI0ZDM3NGMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQ19zLmgKK2E1YjJhZjYwNWMzMTljZDI0OTEzMTllNDMwNzQxMzc3ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkNDT01NX3MuaAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLworMWY4MTE4N2I0ODQ4N2E4ZWE2ZGJjMzI3NjQ4ZTNlNGYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCis5MzZkM2YyMDM4YTZmODYxM2VjMjVlNTBjYzYwMWZlOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCis4ZjY3MDhhMjQ5MTMwOTYyZTBiYzVjMDQ0YWM2ZGQ5MyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCithYWI3NzEzNDE0NDI4ZTk1ZGUwYmE3OTlhMjY3OWIzNiAgQVJNX0RFTElWRVJZXzk3NDE0LlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGMxOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NLmgKQEAgLTAsMCArMSw3ODUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAgIAorICogRmlsZTogYXJtQ09NTS5oCisgKiBCcmllZjogRGVjbGFyZXMgQ29tbW9uIEFQSXMvRGF0YSBUeXBlcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCisgKgorICovCisgCisgIAorI2lmbmRlZiBfYXJtQ29tbW9uX0hfCisjZGVmaW5lIF9hcm1Db21tb25fSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9GMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX0YzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorICAgICAgICAKK30gT01YX0ZDMzI7IC8qKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9GNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX0Y2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorICAgICAgICAKK30gT01YX0ZDNjQ7IC8qKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCisKKworLyogVXNlZCBieSBib3RoIElQIGFuZCBJQyBkb21haW5zIGZvciA4eDggSlBFRyBibG9ja3MuICovCit0eXBlZGVmIE9NWF9TMTYgQVJNX0JMT0NLOHg4WzY0XTsKKworCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNkZWZpbmUgIGFybVBJIChPTVhfRjY0KSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29tcGlsZXIgZXh0ZW5zaW9ucyAqLworI2lmZGVmIEFSTV9ERUJVRworLyogZGVidWcgdmVyc2lvbiAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIGFybUVycm9yKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTsgZXhpdCgtMSk7fQorI2RlZmluZSBhcm1XYXJuKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTt9CisjZGVmaW5lIGFybUlnbm9yZShhKSAoKHZvaWQpYSkKKyNkZWZpbmUgYXJtQXNzZXJ0KGEpIGFzc2VydChhKQorI2Vsc2UgCisvKiByZWxlYXNlIHZlcnNpb24gKi8KKyNkZWZpbmUgYXJtRXJyb3Ioc3RyKSAoKHZvaWQpIChzdHIpKQorI2RlZmluZSBhcm1XYXJuKHN0cikgICgodm9pZCkgKHN0cikpCisjZGVmaW5lIGFybUlnbm9yZShhKSAgKCh2b2lkKSAoYSkpCisjZGVmaW5lIGFybUFzc2VydChhKSAgKCh2b2lkKSAoYSkpCisjZW5kaWYgLyogQVJNX0RFQlVHICovCisKKy8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisjZGVmaW5lIGFybU1pbihhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChiKTooYSkgKQorI2RlZmluZSBhcm1NYXgoYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYSk6KGIpICkKKyNkZWZpbmUgYXJtQWJzKGEpICAgICAgICAgICAgICAgKCAoYSkgPCAgMCAgPyAtKGEpOihhKSApCisKKy8qIEFsaWdubWVudCBvcGVyYXRpb24gKi8KKworI2RlZmluZSBhcm1BbGlnblRvQnl0ZXMoUHRyLE4pICAgICAgKFB0ciArICggKChOLShpbnQpUHRyKSYoTi0xKSkgLyBzaXplb2YoKlB0cikgKSkKKyNkZWZpbmUgYXJtQWxpZ25UbzJCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMikKKyNkZWZpbmUgYXJtQWxpZ25UbzRCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsNCkKKyNkZWZpbmUgYXJtQWxpZ25UbzhCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsOCkKKyNkZWZpbmUgYXJtQWxpZ25UbzE2Qnl0ZXMoUHRyKSAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMTYpCisKKy8qIEVycm9yIGFuZCBBbGlnbm1lbnQgY2hlY2sgKi8KKworI2RlZmluZSBhcm1SZXRBcmdFcnJJZihjb25kaXRpb24sIGNvZGUpICBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQorI2RlZmluZSBhcm1SZXREYXRhRXJySWYoY29uZGl0aW9uLCBjb2RlKSBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQorCisjaWZuZGVmIEFMSUdOTUVOVF9ET0VTTlRfTUFUVEVSCisjZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoKCgoaW50KShQdHIpKSAlIE4pPT0wKQorI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKCgoKGludCkoUHRyKSkgJSBOKSE9MCkKKyNlbHNlCisjZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoMSkKKyNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgwKQorI2VuZGlmCisKKyNkZWZpbmUgYXJtSXMyQnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDIpCisjZGVmaW5lIGFybUlzNEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw0KQorI2RlZmluZSBhcm1JczhCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsOCkKKyNkZWZpbmUgYXJtSXMxNkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDE2KQorCisjZGVmaW5lIGFybU5vdDJCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMikKKyNkZWZpbmUgYXJtTm90NEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw0KQorI2RlZmluZSBhcm1Ob3Q4Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDgpCisjZGVmaW5lIGFybU5vdDE2Qnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMTYpCisjZGVmaW5lIGFybU5vdDMyQnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMzIpCisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtUm91bmRGbG9hdFRvUzMyX3JlZi9hcm1Sb3VuZEZsb2F0VG9TNjQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOworT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvVTMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2L09NWF9VMzIgZm9ybWF0CisgKgorICovCisKK09NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKKyAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqLyAKKyAKK09NWF9JTlQgYXJtU2lnbkNoZWNrIChPTVhfUzE2IHZhcik7CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXAKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybUNsaXAgKAorICAgICAgICBPTVhfSU5UIG1pbiwKKyAgICAgICAgT01YX0lOVCBtYXgsIAorICAgICAgICBPTVhfUzMyIHNyYworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9GMzIgYXJtQ2xpcF9GMzIgKAorICAgICAgICBPTVhfRjMyIG1pbiwKKyAgICAgICAgT01YX0YzMiBtYXgsIAorICAgICAgICBPTVhfRjMyIHNyYworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAorICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KKyAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAorICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCisgKiB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCisgKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgorICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQorICovIAorIAorT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoCisgICAgICAgIE9NWF9GMzIgdiwgCisgICAgICAgIE9NWF9JTlQgc2hpZnQsIAorICAgICAgICBPTVhfSU5UIHNhdEJpdHMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgorICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgorICovCitPTVhSZXN1bHQgYXJtU3dhcEVsZW0oT01YX1U4ICpwQnVmMSwgT01YX1U4ICpwQnVmMiwgT01YX0lOVCBlbGVtU2l6ZSk7CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycworICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKKyAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKKyAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtTWVkaWFuT2YzICgKKyAgICBPTVhfUzMyIGZFbnRyeSwKKyAgICBPTVhfUzMyIHNFbnRyeSwgCisgICAgT01YX1MzMiB0RW50cnkgCisgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQorICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfVTggLS0gICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwb3NpdGl2ZSB2YWx1ZQorICovIAorIAorT01YX1U4IGFybUxvZ1NpemUgKAorICAgIE9NWF9VMTYgdmFsdWUgCisgICAgKTsgICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0QWRkX1MzMigKKyAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKKyAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgorICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKworT01YX1M2NCBhcm1TYXRBZGRfUzY0KAorICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUxLAorICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUyCisgICAgICAgICAgICAgICAgKTsKKworLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKKyAqIAorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRTdWJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKKyAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKKyAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiovCisKK09NWF9TMzIgYXJtU2F0TWFjX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBNYWMsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMgorICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKKyAqCisgKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKKyAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAorICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIG1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGRlbGF5RWxlbSwgCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGZpbFRhcCApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgorICoKKyAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzY2FsZUZhY3RvciApICkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgorICogW2luXSBzY2FsZUZhY3RvciBUaGUgc2hpZnQgbnVtYmVyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dCwgCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNjYWxlRmFjdG9yKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGlucHV0MSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKKworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQorICoKKyAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAorICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCisgKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCisgKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEZWJ1Z2dpbmcgbWFjcm9zCisgKgorICovCisKKworLyoKKyAqIERlZmluaXRpb24gb2Ygb3V0cHV0IHN0cmVhbSAtIGNoYW5nZSB0byBzdGRlcnIgaWYgbmVjZXNzYXJ5CisgKi8KKyNkZWZpbmUgREVCVUdfU1RSRUFNIHN0ZG91dAorCisvKgorICogRGVidWcgcHJpbnRmIG1hY3Jvcywgb25lIGZvciBlYWNoIGFyZ3VtZW50IGNvdW50LgorICogQWRkIG1vcmUgaWYgbmVlZGVkLgorICovCisjaWZkZWYgREVCVUdfT04KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiKQorI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMpCisjZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlKQorI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYpCisjZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKQorI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpCisjZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKQorI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKQorI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pCisjZWxzZSAvKiBERUJVR19PTiAqLworI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgIAorI2VuZGlmIC8qIERFQlVHX09OICovCisKKworLyoKKyAqIERvbWFpbiBhbmQgc3ViIGRvbWFpbiBkZWZpbml0aW9ucworICoKKyAqIEluIG9yZGVyIHRvIHR1cm4gb24gZGVidWcgZm9yIGFuIGVudGlyZSBkb21haW4gb3Igc3ViLWRvbWFpbgorICogYXQgY29tcGlsZSB0aW1lLCBvbmUgb2YgdGhlIERFQlVHX0RPTUFJTl8qIGJlbG93IG1heSBiZSBkZWZpbmVkLAorICogd2hpY2ggd2lsbCBhY3RpdmF0ZSBkZWJ1ZyBpbiBhbGwgb2YgdGhlIGRlZmluZXMgaXQgY29udGFpbnMuCisgKi8KKworI2lmZGVmIERFQlVHX0RPTUFJTl9BQworI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVF9NUEVHNAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVEQVRTVFJFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFRklMTEVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVJU1NURVJFT19TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNQTlNfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TU1RFUkVPX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVBSR0NGR0VMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVUTlNfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVJTlRFUkxFQVZFU1BFQ1RSVU1fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0VOQ09ERVROU19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVBSRURJQ1RfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUkVDT05TVFJVQ1RfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RGV0RfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RJTlZfUzMyX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19OT0lTRUxFU1NERUNPREUKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfUVVBTlRJTlZfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURJRkhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRFRTRlJBTUVIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQk1CUF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERV9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfTURDVElOVl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRVNGQl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1NZTlRIUFFNRl9TMzJfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS0ZSQU1FSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NDQUxFRkFDVE9SU19TOAorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTSURFSU5GTworI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9BQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fVkMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0NIUk9NQV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0xVTUFfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNIUk9NQURDQ09FRkZTVE9QQUlSQ0FWTENfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVJDQVZMQ19VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFUVVBTlRUUkFOU0ZPUk1BQ0ZST01QQUlSX1U4X1MxNl9DMV9ETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9FWFBBTkRGUkFNRQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfSE9SRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9WRVJFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9IT1JFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9WRVJFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFDSFJPTUE4WDhfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzE2WDE2X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV80WDRfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQVREXzRYNAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRDSFJPTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRMVU1BRENGUk9NUEFJUl9VOF9TMTZfQzEKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9DSFJPTUFEQworI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0xVTUFEQworI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzE2WDE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfOFg4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfMTZYMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl84WDgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19TQURfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9EQ1Q4WDhCTEtETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERUJMT0NLQ09FRl9JTlRFUl9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVBBRE1WX1BWT1AKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVNVl9VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9GSU5ETVZQUkVECisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9JRENUOFg4QkxLRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9MSU1JVE1WVE9SRUNUCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9NT1RJT05FU1RJTUFUSU9OTUIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CR1JBWV9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJIT1JJWk9OVEFMX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQlZFUlRJQ0FMX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNVgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRFUl9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRSQV9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRFUl9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRSQV9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5URVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVFJBCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX1ZDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9JQworLyogVG8gYmUgZmlsbGVkIGluICovCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0lDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9TUAorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfQ09QWV9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MxNlMzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MxNl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMTZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSVNGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0lTRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTYKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fU1AgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX0lQCisjZGVmaW5lIERFQlVHX09NWElQQk1fQUREQ19VOF9DMVJfU0ZTCisjZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUEJNX01JUlJPUl9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9NVUxDX1U4X0MxUl9TRlMKKyNkZWZpbmUgREVCVUdfT01YSVBDU19DT0xPUlRXSVNUUTE0X1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjBMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMkxTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwUlNaUk9UX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVfVThfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWkNTQ1JPVFJHQl9VOF9DMlIKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWlJPVF9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1X1U4X1UxNl9DMkMzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQl9VOF9DMkMzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9DMlAzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQl9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRDRU5UUkFMTU9NRU5UX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVFNQQVRJQUxNT01FTlRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UR0VUU1RBVEVTSVpFX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVElOSVRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MzUgorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JUCAqLworCisKKyNlbmRpZiAvKiBfYXJtQ29tbW9uX0hfICovCisKKy8qRW5kIG9mIEZpbGUqLworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0RGVjX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3MzhmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0RGVjX3MuaApAQCAtMCwwICsxLDY3MCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXREZWNfcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLyAKKzsvLyBPcGVuTUFYIG9wdGltaXplZCBiaXRzdHJlYW0gZGVjb2RlIG1vZHVsZQorOy8vCis7Ly8gWW91IG11c3QgaW5jbHVkZSBhcm1DT01NX3MuaCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZQorOy8vCis7Ly8gVGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFjcm9zIHRvIHBlcmZvcm0gYXNzZW1ibHkgb3B0aW1pemVkIGZpeGVkIGFuZAorOy8vIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGluZyBmcm9tIGEgcmVhZC1vbmx5IGJpdHN0cmVhbS4gVGhlIHZhcmlhYmxlCis7Ly8gbGVuZ3RoIGRlY29kZSBtb2R1bGVzIHRha2UgYXMgaW5wdXQgYSBwb2ludGVyIHRvIGEgdGFibGUgb2YgMTYtYml0Cis7Ly8gZW50cmllcyBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdC4KKzsvLworOy8vIFZMRCBUYWJsZSBFbnRyeSBmb3JtYXQKKzsvLworOy8vICAgICAgICAxNSAxNCAxMyAxMiAxMSAxMCAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAorOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCis7Ly8gICAgICAgfCAgTGVuICAgfCAgICAgICAgICAgICAgIFN5bWJvbCAgICAgICAgICAgICAgfCAxIHwKKzsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworOy8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8Cis7Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzsvLworOy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6Cis7Ly8gICAgTGVuICAgID0gTnVtYmVyIG9mIGJpdHMgb3ZlcnJlYWQgKDAgdG8gNykKKzsvLyAgICBTeW1ib2wgPSBTeW1ib2wgcGF5bG9hZCAodW5zaWduZWQgMTIgYml0cykKKzsvLworOy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhbiBpbnRlcm5hbCBub2RlIHRoZW4gYml0IDAgaXMgY2xlYXI6Cis7Ly8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKKzsvLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCis7Ly8KKzsvLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCis7Ly8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQorOy8vIGlzIG9idGFpbmVkLiBUaGUgU3RlcCBzaXplcyBhcmUgc3VwcGxpZWQgdG8gdGhlIFZMRCBtYWNyby4KKzsvLworOy8vIFVTQUdFOgorOy8vCis7Ly8gVG8gdXNlIGFueSBvZiB0aGUgbWFjcm9zIGluIHRoaXMgcGFja2FnZSwgZmlyc3QgY2FsbDoKKzsvLworOy8vICAgIE1fQkRfSU5JVCBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LCBUbXAKKzsvLworOy8vIFRoaXMgY2FjaGVzIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBwb3NpdGlvbiBhbmQgbmV4dCBhdmFpbGFibGUKKzsvLyBiaXRzIGluIHJlZ2lzdGVycyBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQuIFRoZXNlIHJlZ2lzdGVycworOy8vIGFyZSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBiaXRzdHJlYW0gZGVjb2RlIHBhY2thZ2UgdW50aWwgeW91Cis7Ly8gY2FsbCBNX0JEX0ZJTkkuCis7Ly8KKzsvLyBOZXh0IGNhbGwgdGhlIGZvbGxvd2luZyBtYWNybyhzKSBhcyBtYW55IHRpbWVzIGFzIHlvdSBuZWVkOgorOy8vCis7Ly8gICAgTV9CRF9MT09LOCAgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX0xPT0sxNiAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfUkVBRDggICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9SRUFEMTYgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1ZSRUFEOCAgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfVlJFQUQxNiAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9WTEQgICAgICAgICAtIFBlcmZvcm0gdmFyaWFibGUgbGVuZ3RoIGRlY29kZSB1c2luZyBsb29rdXAgdGFibGUKKzsvLworOy8vIEZpbmFsbHkgY2FsbCB0aGUgbWFjcm86Cis7Ly8KKzsvLyAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQKKzsvLworOy8vIFRoaXMgd3JpdGVzIHRoZSBiaXRzdHJlYW0gc3RhdGUgYmFjayB0byBtZW1vcnkuCis7Ly8KKzsvLyBUaGUgdGhyZWUgYml0c3RyZWFtIGNhY2hlIHJlZ2lzdGVyIG5hbWVzIGFyZSBhc3NpZ25lZCB0byB0aGUgZm9sbG93aW5nIGdsb2JhbAorOy8vIHZhcmlhYmxlczoKKzsvLworCisgICAgICAgIEdCTFMgICAgcEJpdFN0cmVhbSAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIHBCaXRTdHJlYW0KKyAgICAgICAgR0JMUyAgICBCaXRCdWZmZXIgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0QnVmZmVyCisgICAgICAgIEdCTFMgICAgQml0Q291bnQgICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdENvdW50CisgICAKKzsvLyAgICAgICAgCis7Ly8gVGhlc2UgcmVnaXN0ZXIgdmFyaWFibGVzIG11c3QgaGF2ZSBhIGNlcnRhaW4gZGVmaW5lZCBzdGF0ZSBvbiBlbnRyeSB0byBldmVyeSBiaXRzdHJlYW0KKzsvLyBtYWNybyAoZXhjZXB0IE1fQkRfSU5JVCkgYW5kIG9uIGV4aXQgZnJvbSBldmVyeSBiaXRzdHJlYW0gbWFjcm8gKGV4Y2VwdCBNX0JEX0ZJTkkpLgorOy8vIFRoZSBzdGF0ZSBtYXkgZGVwZW5kIG9uIGltcGxlbWVudGF0aW9uLgorOy8vCis7Ly8gRm9yIHRoZSBkZWZhdWx0IChBUk0xMSkgaW1wbGVtZW50YXRpb24gdGhlIGZvbGxvd2luZyBob2xkOgorOy8vICAgIHBCaXRTdHJlYW0gLSBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgbm90IGhlbGQgaW4gdGhlIEJpdEJ1ZmZlcgorOy8vICAgIEJpdEJ1ZmZlciAgLSBpcyBhIGNhY2hlIG9mICg0IGJ5dGVzKSAzMiBiaXRzLCBiaXQgMzEgdGhlIGZpcnN0IGJpdAorOy8vICAgIEJpdENvdW50ICAgLSBpcyBvZmZzZXQgKGZyb20gdGhlIHRvcCBiaXQpIHRvIHRoZSBuZXh0IHVudXNlZCBiaXRzdHJlYW0gYml0Cis7Ly8gICAgMDw9Qml0Q291bnQ8PTE1IChzbyBCaXRCdWZmZXIgaG9sZHMgYXQgbGVhc3QgMTcgdW51c2VkIGJpdHMpCis7Ly8KKzsvLworCisgICAgICAgIDsvLyBCaXRzdHJlYW0gRGVjb2RlIGluaXRpYWxpc2UKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbml0aWFsaXNlcyB0aGUgYml0c3RyZWFtIGRlY29kZSBnbG9iYWwgcmVnaXN0ZXJzIGZyb20KKyAgICAgICAgOy8vIGJpdHN0cmVhbSBwb2ludGVycy4gVGhpcyBtYWNybyBpcyBzcGxpdCBpbnRvIDMgcGFydHMgdG8gZW5hYmxlCisgICAgICAgIDsvLyBzY2hlZHVsaW5nLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKKyAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKKyAgICAgICAgOy8vICRSQml0U3RyZWFtICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgcEJpdFN0cmVhbSAoY2FuIGJlICRwcEJpdFN0cmVhbSkKKyAgICAgICAgOy8vICRSQml0QnVmZmVyICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0QnVmZmVyCisgICAgICAgIDsvLyAkUkJpdENvdW50ICAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdENvdW50ICAgKGNhbiBiZSAkcEJpdE9mZnNldCkKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSwkVDIsJFQzICAgICAtIHJlZ2lzdGVycyB0aGF0IG11c3QgYmUgcHJlc2VydmVkIGJldHdlZW4gY2FsbHMgdG8KKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIE1fQkRfSU5JVDEgYW5kIE1fQkRfSU5JVDIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9JTklUMCAgJHBwQml0U3RyZWFtLCAkcEJpdE9mZnNldCwgJFJCaXRTdHJlYW0sICRSQml0QnVmZmVyLCAkUkJpdENvdW50CisKK3BCaXRTdHJlYW0gIFNFVFMgIiRSQml0U3RyZWFtIgorQml0QnVmZmVyICAgU0VUUyAiJFJCaXRCdWZmZXIiCitCaXRDb3VudCAgICBTRVRTICIkUkJpdENvdW50IiAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZCBpbnB1dHMKKyAgICAgICAgTERSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KKyAgICAgICAgTERSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9JTklUMSAgJFQxLCAkVDIsICRUMworICAgICAgICBMRFJCICAgICRUMiwgWyRwQml0U3RyZWFtLCAjMl0KKyAgICAgICAgTERSQiAgICAkVDEsIFskcEJpdFN0cmVhbSwgIzFdCisgICAgICAgIExEUkIgICAgJEJpdEJ1ZmZlciwgIFskcEJpdFN0cmVhbV0sICMzCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfSU5JVDIgICRUMSwgJFQyLCAkVDMKKyAgICAgICAgT1JSICAgICAkVDIsICRUMiwgJFQxLCBMU0wgIzgKKyAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDIsICRCaXRCdWZmZXIsIExTTCAjMTYKKyAgICAgICAgTUVORCAgICAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD04IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKKyAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4yNCBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0xPT0s4ICAkU3ltYm9sLCAkTgorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cworICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjE2IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfTE9PSzE2ICAkU3ltYm9sLCAkTiwgJFQxCisgICAgICAgIEFTU0VSVCAgKCROID49IDEpOkxBTkQ6KCROIDw9IDE2KQorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBTa2lwcyBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfU0tJUDggJE4sICRUMQorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9SRUFEOCAkU3ltYm9sLCAkTiwgJFQxCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgICAgICAgICAgCisgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1JFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD0xNikKKyAgICAgICAgQVNTRVJUICAkU3ltYm9sPD4kVDEKKyAgICAgICAgSUYgKCROPD04KQorICAgICAgICAgICAgTV9CRF9SRUFEOCAgJFN5bWJvbCwgJE4sICRUMQorICAgICAgICBFTFNFICAgICAgICAKKyAgICAgICAgICAgIDsvLyBOPjggc28gd2Ugd2lsbCBiZSBhYmxlIHRvIHJlZmlsbCBhdCBsZWFzdCBvbmUgYnl0ZSAgICAgICAgICAgIAorICAgICAgICAgICAgTERSQiAgICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCisgICAgICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKKyAgICAgICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygxNi0kTikKKyAgICAgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKKyAgICAgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9OAorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZTS0lQOCAkTiwgJFQxCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD0xNgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZTS0lQMTYgJE4sICRUMSwgJFQyCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAgICAgICAKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9OAorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9WUkVBRDggJFN5bWJvbCwgJE4sICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCisgICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgJFQyCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORAorCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD0xNgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9WUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgJFQyCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORAorCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDAwMDAuLi4wMDEgd2hlcmUgdGhlcmUKKyAgICAgICAgOy8vIGFyZSBOIHplcm9zIGJlZm9yZSB0aGUgMSBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0NMWjE2ICRTeW1ib2wsICRUMSwgJFQyCisgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMTExMS4uLjExMCB3aGVyZSB0aGVyZQorICAgICAgICA7Ly8gYXJlIE4gb25lcyBiZWZvcmUgdGhlIDAgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9DTE8xNiAkU3ltYm9sLCAkVDEsICRUMgorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKKyAgICAgICAgTVZOICAgICAkU3ltYm9sLCAkU3ltYm9sCisgICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgIAorCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBWYXJpYWJsZSBMZW5ndGggRGVjb2RlIG1vZHVsZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlY29kZXMgb25lIFZMRCBTeW1ib2wgZnJvbSBhIGJpdHN0cmVhbSBhbmQgcmVmaWxsIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vIGJ1ZmZlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBWTERUYWJsZSAgICAgIC0gcG9pbnRlciB0byBWTEQgZGVjb2RlIHRhYmxlIG9mIDE2LWJpdCBlbnRyaWVzLgorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgYWJvdmUgYXQgdGhlIHN0YXJ0IG9mCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICB0aGlzIGZpbGUuCisgICAgICAgIDsvLyAkUzAgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgdGhlIGZpcnN0IHN0ZXAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIDE8PSRTMDw9OAorICAgICAgICA7Ly8gJFMxICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIGVhY2ggc3Vic2VxdWVudAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgc3RlcCAxPD0kUzE8PSRTMC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSBkZWNvZGVkIFZMRCBzeW1ib2wgdmFsdWUKKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9WTEQgJFN5bWJvbCwgJFQxLCAkVDIsICRwVkxEVGFibGUsICRTMCwgJFMxCisgICAgICAgIEFTU0VSVCAoMTw9JFMwKTpMQU5EOigkUzA8PTgpCisgICAgICAgIEFTU0VSVCAoMTw9JFMxKTpMQU5EOigkUzE8PSRTMCkKKyAgICAgICAgCisgICAgICAgIDsvLyBOb3RlIDA8PUJpdENvdW50PD0xNSBvbiBlbnRyeSBhbmQgZXhpdAorICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXRzCisgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgIygyPDwkUzApLTIgICAgICAgICAgICAgICAgIDsvLyBjcmVhdGUgbWFzaworICAgICAgICBBTkQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMwKSA7Ly8gMioobmV4dCAkUzAgYml0cykKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIENTIGlmIGJ1ZmZlciBjYW4gYmUgZmlsbGVkCiswMQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAgICA7Ly8gbG9hZCByZWZpbGwgYnl0ZQorICAgICAgICBMRFJIICAgICRTeW1ib2wsIFskcFZMRFRhYmxlLCAkU3ltYm9sXSAgICAgICA7Ly8gbG9hZCB0YWJsZSBlbnRyeQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gcmVmaWxsIG5vdCBwb3NzaWJsZQorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjJFMwICAgICAgICAgICA7Ly8gYXNzdW1lICRTMCBiaXRzIHVzZWQKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgOy8vIG1lcmdlIGluIHJlZmlsbCBieXRlCisgICAgICAgIE1PVlMgICAgJFQxLCAkU3ltYm9sLCBMU1IgIzEgICAgICAgICAgICAgICAgIDsvLyBDUz1sZWFmIGVudHJ5CisgICAgICAgIEJDUyAgICAgJUZUMDIKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0CisgICAgICAgIElGICgyKiRTMC0kUzE8PTgpCisgICAgICAgICAgICA7Ly8gQ2FuIGNvbWJpbmUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgYW5kIGtlZXAgJEJpdENvdW50PD0xNQorICAgICAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgrKCRTMC0kUzEpCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDsvLyBTZXBhcmF0ZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBvZmZzZXQKKyAgICAgICAgICAgIFNVQlMgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICAgICAgU1VCICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoJFMwLSRTMSkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgQUREICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMSkgOy8vIGFkZCAyKihuZXh0ICRTMSBiaXRzKSB0bworICAgICAgICBCSUMgICAgICRTeW1ib2wsICRTeW1ib2wsICMxICAgICAgICAgICAgICAgICA7Ly8gICB0YWJsZSBvZmZzZXQKKyAgICAgICAgQiAgICAgICAlQlQwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCB0YWJsZSBlbnRyeQorMDIKKyAgICAgICAgOy8vIEJpdENvdW50IHJhbmdlIG5vdyBkZXBlbmQgb24gdGhlIHJvdXRlIGhlcmUKKyAgICAgICAgOy8vIGlmIChmaXJzdCBzdGVwKSAgICAgICBTMCA8PSBCaXRDb3VudCA8PSA3K1MwICAgICAgICA8PTE1CisgICAgICAgIDsvLyBlbHNlIGlmICgyKlMwLVMxPD04KSAgUzAgPD0gQml0Q291bnQgPD0gNysoMipTMC1TMSkgPD0xNQorICAgICAgICA7Ly8gZWxzZSAgICAgICAgICAgICAgICAgIFMxIDw9IEJpdENvdW50IDw9IDcrUzEgICAgICAgIDw9MTUKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wsIExTUiMxMworICAgICAgICBCSUMgICAgICRTeW1ib2wsICRUMSwgIzB4RjAwMAorICAgICAgICBNRU5ECisgICAgICAgIAorCisgICAgICAgIDsvLyBBZGQgYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cyAKKyAgICAgICAgOy8vIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgaXMgdXNlZCB0byBjb21wYXJlIGJpdHN0cmVhbSBwb3NpdGlvbnMgdXNpbmcuIE1fQkRfQ01QLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkT2Zmc2V0ICAgICAgICAgLSBPZmZzZXQgdG8gYmUgYWRkZWQgaW4gYml0cy4KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIGFkZGluZyB0aGUgT2Zmc2V0LiAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSA0IGJ5dGUgYWhlYWQgYW5kIG5lZWRzIHRvIHN1YnRyYWN0IGJ5IDQgdG8gZ2V0IGV4YWN0IAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgcG9pbnRlciAoYXMgaW4gTV9CRF9GSU5JKS4gQnV0IGZvciB1c2luZyB3aXRoIE1fQkRfQ01QIHN1YnRyYWN0IGlzIG5vdCBuZWVkZWQuCisgICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgYWRkaXRpb24gb2YgT2Zmc2V0IG51bWJlciBvZiBiaXRzCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0FERCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkT2Zmc2V0CisKKyAgICAgICAgOy8vICgkQnl0ZUluZGV4LCRCaXRJbmRleCkgPSBDdXJyZW50IHBvc2l0aW9uICsgJE9mZnNldCBiaXRzCisgICAgICAgIEFERCAgICAgJE9mZnNldCwgJE9mZnNldCwgJEJpdENvdW50CisgICAgICAgIEFORCAgICAgJEJpdEluZGV4LCAkT2Zmc2V0LCAjNworICAgICAgICBBREQgICAgICRCeXRlSW5kZXgsICRwQml0U3RyZWFtLCAkT2Zmc2V0LCBBU1IgIzMgICAgICAgIAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIE1vdmUgYml0c3RyZWFtIHBvaW50ZXJzIHRvIHRoZSBsb2NhdGlvbiBnaXZlbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byAgCisgICAgICAgIDsvLyB0aGUgY3VycmVudCBsb2NhdGlvbiBnaXZlbiAoY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCkuIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBtb3ZlLiAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSA0IGJ5dGUgYWhlYWQgYW5kIG5lZWRzIHRvIHN1YnRyYWN0IGJ5IDQgdG8gZ2V0IGV4YWN0IAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgcG9pbnRlciAoYXMgaW4gTV9CRF9GSU5JKS4KKyAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBtb3ZlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuICAKKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9NT1YgICRCeXRlSW5kZXgsICRCaXRJbmRleAorCisgICAgICAgIDsvLyAoJHBCaXRTdHJlYW0sICRPZmZzZXQpID0gKCRCeXRlSW5kZXgsJEJpdEluZGV4KQorICAgICAgICBNT1YgICAgICRCaXRDb3VudCwgJEJpdEluZGV4CisgICAgICAgIE1PViAgICAgJHBCaXRTdHJlYW0sICRCeXRlSW5kZXgKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBCaXRzdHJlYW0gQ29tcGFyZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvbXBhcmVzIGJpdHN0cmVhbSBwb3NpdGlvbiB3aXRoIHRoYXQgb2YgYSBkZXN0aW5hdGlvbiBwb3NpdGlvbi4gRGVzdGluYXRpb24gcG9zaXRpb24gCisgICAgICAgIDsvLyBpcyBoZWxkIGluIHR3byBpbnB1dCByZWdpc3RlcnMgd2hpY2ggYXJlIGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQgbWFjcm8KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyLCAoNCBieXRlIGFoZWFkIGFzIGRlc2NyaWJlZCBpbiBNX0JEX0FERCkKKyAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEZMQUdTICAgICAgICAgICAtIEdFIGlmIGRlc3RpbmF0aW9uIGlzIHJlYWNoZWQsIExUID0gaXMgZGVzdGluYXRpb24gaXMgYWhlYWQKKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQ01QICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRUMQorICAgICAgICAKKyAgICAgICAgOy8vIFJldHVybiBmbGFncyBzZXQgYnkgKGN1cnJlbnQgcG9zaXRvbiktKCRCeXRlSW5kZXgsJEJpdEluZGV4KQorICAgICAgICA7Ly8gc28gR0UgbWVhbnMgdGhhdCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGluZGljYXRlZCBwb3NpdGlvbgorCisgICAgICAgIEFERCAgICAgICAgICRUMSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSICMzCisgICAgICAgIENNUCAgICAgICAgICRUMSwgJEJ5dGVJbmRleAorICAgICAgICBBTkQgICAgICAgICAkVDEsICRCaXRDb3VudCwgIzcKKyAgICAgICAgQ01QRVEgICAgICAgJFQxLCAkQml0SW5kZXggICAgICAgIAorICAgICAgICBNRU5ECisKKyAgICAgICAgCisgICAgICAgIDsvLyBCaXRzdHJlYW0gRGVjb2RlIGZpbmFsaXNlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gV3JpdGVzIGJhY2sgdGhlIGJpdHN0cmVhbSBzdGF0ZSB0byB0aGUgYml0c3RyZWFtIHBvaW50ZXJzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCisgICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSB0aGVzZSByZWdpc3RlciBhcmUgY29ycnVwdGVkCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfRklOSSAgJHBwQml0U3RyZWFtLCAkcEJpdE9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vIEFkdmFuY2UgcG9pbnRlciBieSB0aGUgbnVtYmVyIG9mIGZyZWUgYml0cyBpbiB0aGUgYnVmZmVyCisgICAgICAgIEFERCAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiMzCisgICAgICAgIEFORCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3CisgICAgICAgIAorICAgICAgICA7Ly8gTm93IG1vdmUgYmFjayAzMiBiaXRzIHRvIHJlYWNoIHRoZSBmaXJzdCB1c3VlZCBiaXQKKyAgICAgICAgU1VCICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICM0CisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgb3V0IGJpdHN0cmVhbSBzdGF0ZQorICAgICAgICBTVFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQorICAgICAgICBTVFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBFTkQKKyAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2OTkwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6IGFybUNPTU1fQml0c3RyZWFtLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBjb21tb24gQVBJJ3MvRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1heCBFbmNvZGVycy9EZWNvZGVycy4KKyAqCisgKi8KKworI2lmbmRlZiBfYXJtQ29kZWNfSF8KKyNkZWZpbmUgX2FybUNvZGVjX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1U4ICAgY29kZUxlbjsKKyAgICBPTVhfVTMyCSBjb2RlV29yZDsKK30gQVJNX1ZMQzMyOworCisvKiBUaGUgYWJvdmUgc2hvdWxkIGJlIHJlbmFtZWQgYXMgIkFSTV9WTEMzMiIgKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKipwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uLjMyCisgKgorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7CisKKy8qKgorICogRnVuY3Rpb246IGFybUdldEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCisgKiAgICAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLjMyCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7CisKKy8qKgorICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKyAKK09NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpOworCisvKiogCisgKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE4KKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworCitPTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCisgKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKKyAqIHBvaW50ZWQgYnkgcENvZGVCb29rCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgcENvZGVCb29rCisgKiAKKyAqIFtvdXRdICAgICoqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCisgKiAgICAgICAgIDogIkFSTV9OT19DT0RFQk9PS19JTkRFWCA9IDB4RkZGRiIgaWYgc2VhcmNoIGZhaWxzLgorICoqLworCisjZGVmaW5lIEFSTV9OT19DT0RFQk9PS19JTkRFWCAoT01YX1UxNikoMHhGRkZGKQorCitPTVhfVTE2IGFybVVuUGFja1ZMQzMyKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBPZmZzZXQJICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCWNvZGVXb3JkCQlDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICogW2luXQljb2RlTGVuZ3RoCQlMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQkJc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tCaXRzICgKKyAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgT01YX1UzMiBjb2RlV29yZCwgCisgICAgT01YX0lOVCBjb2RlTGVuZ3RoIAorKTsKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKgorICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgQVJNX1ZMQzMyIGNvZGUgCispOworCisjZW5kaWYgICAgICAvKl9hcm1Db2RlY19IXyovCisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwY2ZkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGUgICAgICAgICA6IGFybUNPTU1fSURDVFRhYmxlLmgKKyAqIERlc2NyaXB0aW9uICA6IENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0YWJsZXMgZm9yIElEQ1QgY2FsY3VsYXRpb24uCisgKgorICovCisgIAorI2lmbmRlZiBfYXJtQ09NTV9JRENUVGFibGVfSF8KKyNkZWZpbmUgX2FybUNPTU1fSURDVFRhYmxlX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisgICAgIC8qICBUYWJsZSBvZiBzKHUpKkEodSkqQSh2KS8xNiBhdCBRMTUKKyAgICAgICogIHModSk9MS4wIDAgPD0gdSA8PSA1CisgICAgICAqICBzKDYpPTIuMAorICAgICAgKiAgcyg3KT00LjAKKyAgICAgICogIEEoMCkgPSAyKnNxcnQoMikKKyAgICAgICogIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKQorCSAgKi8KK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVFByZVNjYWxlIFs2NF07CitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RDb2VmIFs0XTsKKworI2VuZGlmIC8qIF9hcm1DT01NX0lEQ1RUYWJsZV9IXyAqLworCisKKy8qIEVuZCBvZiBGaWxlICovCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYmFhMDg3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCkBAIC0wLDAgKzEsMTQ1MSBAQAorOy8vCis7Ly8gVGhpcyBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG1heSBiZSB1c2VkIG9ubHkgYXMKKzsvLyBhdXRob3Jpc2VkIGJ5IGEgbGljZW5zaW5nIGFncmVlbWVudCBmcm9tIEFSTSBMaW1pdGVkCis7Ly8gICAoQykgQ09QWVJJR0hUIDIwMDQgQVJNIExpbWl0ZWQKKzsvLyAgICAgICBBTEwgUklHSFRTIFJFU0VSVkVECis7Ly8gVGhlIGVudGlyZSBub3RpY2UgYWJvdmUgbXVzdCBiZSByZXByb2R1Y2VkIG9uIGFsbCBhdXRob3Jpc2VkCis7Ly8gY29waWVzIGFuZCBjb3BpZXMgbWF5IG9ubHkgYmUgbWFkZSB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZAorOy8vIGJ5IGEgbGljZW5zaW5nIGFncmVlbWVudCBmcm9tIEFSTSBMaW1pdGVkLgorOy8vCis7Ly8gSURDVF9zLnMKKzsvLworOy8vIEludmVyc2UgRENUIG1vZHVsZQorOy8vCis7Ly8gCis7Ly8gQUxHT1JJVEhNIERFU0NSSVBUSU9OCis7Ly8KKzsvLyBUaGUgOHg4IDJEIElEQ1QgaXMgcGVyZm9ybWVkIGJ5IGNhbGN1bGF0aW5nIGEgMUQgSURDVCBmb3IgZWFjaAorOy8vIGNvbHVtbiBhbmQgdGhlbiBhIDFEIElEQ1QgZm9yIGVhY2ggcm93LgorOy8vCis7Ly8gVGhlIDgtcG9pbnQgMUQgSURDVCBpcyBkZWZpbmVkIGJ5Cis7Ly8gICBmKHgpID0gKEMoMCkqVCgwKSpjKDAseCkgKyAuLi4gKyBDKDcpKlQoNykqYyg3LHgpKS8yCis7Ly8KKzsvLyAgIEModSkgPSAxL3NxcnQoMikgaWYgdT0wIG9yIDEgaWYgdSE9MAorOy8vICAgYyh1LHgpID0gY29zKCAoMngrMSkqdSpwaS8xNiApCis7Ly8KKzsvLyBXZSBjb21wdXRlIHRoZSA4LXBvaW50IDFEIElEQ1QgdXNpbmcgdGhlIHJldmVyc2Ugb2YKKzsvLyB0aGUgQXJhaS1BZ3VpLU5ha2FqaW1hIGZsb3cgZ3JhcGggd2hpY2ggd2Ugc3BsaXQgaW50bworOy8vIDUgc3RhZ2VzIG5hbWVkIGluIHJldmVyc2Ugb3JkZXIgdG8gaWRlbnRpZnkgd2l0aCB0aGUKKzsvLyBmb3J3YXJkIERDVC4gRGlyZWN0IGludmVyc2lvbiBvZiB0aGUgZm9yd2FyZCBmb3JtdWxhZQorOy8vIGluIGZpbGUgRkRDVF9zLnMgZ2l2ZXM6Cis7Ly8KKzsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpICBbIEEodSk9NCpDKHUpKmModSwwKSBdCis7Ly8gICAgICAgICAgICAgWyBBKDApID0gMipzcXJ0KDIpCis7Ly8gICAgICAgICAgICAgICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkgXQorOy8vCis7Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Cis7Ly8gICAgICAgICAgICAgaTMgPSAoajIrajYpLzIgICAgICBpMiA9IChqMi1qNikvMgorOy8vICAgICAgICAgICAgIGk3ID0gKGo1K2ozKS8yICAgICAgaTQgPSAoajUtajMpLzIKKzsvLyAgICAgICAgICAgICBpNSA9IChqMStqNykvMiAgICAgIGk2ID0gKGoxLWo3KS8yCis7Ly8KKzsvLyBJU3RhZ2UgMzogICBoMCA9IChpMCtpMSkvMiAgICAgIGgxID0gKGkwLWkxKS8yCis7Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCis7Ly8gICAgICAgICAgICAgaDQgPSAgY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2Cis7Ly8gICAgICAgICAgICAgaDYgPSAtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2Cis7Ly8gICAgICAgICAgICAgWyBUaGUgYWJvdmUgdHdvIGxpbmVzIHJvdGF0ZSBieSAtKHBpLzgpIF0KKzsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykvc3FydDIgIGg3ID0gKGk1K2k3KS8yIAorOy8vICAgICAgICAgICAgIAorOy8vIElTdGFnZSAyOiAgIGcwID0gKGgwK2gzKS8yICAgICAgZzMgPSAoaDAtaDMpLzIKKzsvLyAgICAgICAgICAgICBnMSA9IChoMStoMikvMiAgICAgIGcyID0gKGgxLWgyKS8yCis7Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKKzsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQorOy8vCis7Ly8gSVN0YWdlIDE6ICAgZjAgPSAoZzArZzcpLzIgICAgICBmNyA9IChnMC1nNykvMgorOy8vICAgICAgICAgICAgIGYxID0gKGcxK2c2KS8yICAgICAgZjYgPSAoZzEtZzYpLzIKKzsvLyAgICAgICAgICAgICBmMiA9IChnMitnNSkvMiAgICAgIGY1ID0gKGcyLWc1KS8yCis7Ly8gICAgICAgICAgICAgZjMgPSAoZzMrZzQpLzIgICAgICBmNCA9IChnMy1nNCkvMgorOy8vCis7Ly8gTm90ZSB0aGF0IG1vc3QgY29lZmZpY2llbnRzIGFyZSBoYWx2ZWQgMyB0aW1lcyBkdXJpbmcgdGhlCis7Ly8gYWJvdmUgY2FsY3VsYXRpb24uIFdlIGNhbiByZXNjYWxlIHRoZSBhbGdvcml0aG0gZGl2aWRpbmcKKzsvLyB0aGUgaW5wdXQgYnkgOCB0byByZW1vdmUgdGhlIGhhbHZpbmdzLgorOy8vCis7Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KS84Cis7Ly8KKzsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKKzsvLyAgICAgICAgICAgICBpMyA9IGoyICsgajYgICAgICAgIGkyID0gajIgLSBqNgorOy8vICAgICAgICAgICAgIGk3ID0gajUgKyBqMyAgICAgICAgaTQgPSBqNSAtIGozCis7Ly8gICAgICAgICAgICAgaTUgPSBqMSArIGo3ICAgICAgICBpNiA9IGoxIC0gajcKKzsvLworOy8vIElTdGFnZSAzOiAgIGgwID0gaTAgKyBpMSAgICAgICAgaDEgPSBpMCAtIGkxCis7Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCis7Ly8gICAgICAgICAgICAgaDQgPSAyKiggY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2KQorOy8vICAgICAgICAgICAgIGg2ID0gMiooLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNikKKzsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykqc3FydDIgIGg3ID0gaTUgKyBpNyAKKzsvLyAgICAgICAgICAgICAKKzsvLyBJU3RhZ2UgMjogICBnMCA9IGgwICsgaDMgICAgICAgIGczID0gaDAgLSBoMworOy8vICAgICAgICAgICAgIGcxID0gaDEgKyBoMiAgICAgICAgZzIgPSBoMSAtIGgyCis7Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKKzsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQorOy8vCis7Ly8gSVN0YWdlIDE6ICAgZjAgPSBnMCArIGc3ICAgICAgICBmNyA9IGcwIC0gZzcKKzsvLyAgICAgICAgICAgICBmMSA9IGcxICsgZzYgICAgICAgIGY2ID0gZzEgLSBnNgorOy8vICAgICAgICAgICAgIGYyID0gZzIgKyBnNSAgICAgICAgZjUgPSBnMiAtIGc1Cis7Ly8gICAgICAgICAgICAgZjMgPSBnMyArIGc0ICAgICAgICBmNCA9IGczIC0gZzQKKzsvLworOy8vIE5vdGU6Cis7Ly8gMS4gVGhlIHNjYWxpbmcgYnkgQSh1KS84IGNhbiBvZnRlbiBiZSBjb21iaW5lZCB3aXRoIGludmVyc2UKKzsvLyAgICBxdWFudGl6YXRpb24uIFRoZSBjb2x1bW4gYW5kIHJvdyBzY2FsaW5ncyBjYW4gYmUgY29tYmluZWQuCis7Ly8gMi4gVGhlIGZsb3dncmFwaCBpbiB0aGUgQUFOIHBhcGVyIGhhcyBoNCxnNiBuZWdhdGVkIGNvbXBhcmVkCis7Ly8gICAgdG8gdGhlIGFib3ZlIGNvZGUgYnV0IGlzIG90aGVyd2lzZSBpZGVudGljYWwuCis7Ly8gMy4gVGhlIHJvdGF0aW9uIGJ5IC1waS84IGNhbiBiZSBwZWZvcm1lZCB1c2luZyB0aHJlZSBtdWx0aXBsaWVzCis7Ly8gICAgRWcgIGMqaTQrcyppNiA9IChpNi1pNCkqcyArIChjK3MpKmk0Cis7Ly8gICAgICAgLXMqaTQrYyppNiA9IChpNi1pNCkqcyArIChjLXMpKmk2Cis7Ly8gNC4gSWYgfFQodSl8PD0xIHRoZW4gZnJvbSB0aGUgSURDVCBkZWZpbml0aW9uLAorOy8vICAgIHxmKHgpfCA8PSAoKDEvc3FydDIpICsgfGMoMSx4KXwgKyAuLiArIHxjKDcseCl8KS8yCis7Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyBjb3MocGkvMTYpICsgLi4uICsgY29zKDcqcGkvMTYpKS8yCis7Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyAoY290KHBpLzMyKS0xKS8yKS8yCis7Ly8gICAgICAgICAgICA9ICgxICsgY29zKHBpLzE2KSArIGNvcygycGkvMTYpICsgY29zKDNwaS8xNikpL3NxcnQoMikKKzsvLyAgICAgICAgICAgID0gKGFwcHJveCkyLjY0Cis7Ly8gICAgU28gdGhlIG1heCBnYWluIG9mIHRoZSAyRCBJRENUIGlzIH54Ny4wID0gMyBiaXRzLgorOy8vICAgIFRoZSB0YWJsZSBiZWxvdyBzaG93cyBpbnB1dCBwYXR0ZXJucyBnZW5lcmF0aW5nIHRoZSBtYXhpbXVtCis7Ly8gICAgdmFsdWUgb2YgfGYodSl8IGZvciBpbnB1dCBpbiB0aGUgcmFuZ2UgfFQoeCl8PD0xLiBNPS0xLCBQPSsxCis7Ly8gICAgSW5wdXRQYXR0ZXJuICAgICAgTWF4IHxmKHgpfAorOy8vICAgICAgUFBQUFBQUFAgICAgICAgIHxmMHwgPSAgMi42NAorOy8vICAgICAgUFBQTU1NTU0gICAgICAgIHxmMXwgPSAgMi42NAorOy8vICAgICAgUFBNTU1QUFAgICAgICAgIHxmMnwgPSAgMi42NAorOy8vICAgICAgUFBNTVBQTU0gICAgICAgIHxmM3wgPSAgMi42NAorOy8vICAgICAgUE1NUFBNTVAgICAgICAgIHxmNHwgPSAgMi42NAorOy8vICAgICAgUE1NUE1NUE0gICAgICAgIHxmNXwgPSAgMi42NAorOy8vICAgICAgUE1QUE1QTVAgICAgICAgIHxmNnwgPSAgMi42NAorOy8vICAgICAgUE1QTVBNUE0gICAgICAgIHxmN3wgPSAgMi42NAorOy8vICAgTm90ZSB0aGF0IHRoaXMgaW5wdXQgcGF0dGVybiBpcyB0aGUgdHJhbnNwb3NlIG9mIHRoZQorOy8vICAgY29ycmVzcG9uZGluZyBtYXggaW5wdXQgcGF0dGVyIGZvciB0aGUgRkRDVC4KKworOy8vIEFyZ3VtZW50cworCitwU3JjICAgIFJOIDAgICAgOy8vIHNvdXJjZSBkYXRhIGJ1ZmZlcgorU3RyaWRlICBSTiAxICAgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKK3BEZXN0ICAgUk4gMiAgICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKK3BTY2FsZSAgUk4gMyAgICA7Ly8gcG9pbnRlciB0byBzY2FsaW5nIHRhYmxlCisKKworICAgICAgICA7Ly8gRENUIEludmVyc2UgTWFjcm8KKyAgICAgICAgOy8vIFRoZSBEQ1QgY29kZSBzaG91bGQgYmUgcGFyYW1ldHJpemVkIGFjY29yZGluZworICAgICAgICA7Ly8gdG8gdGhlIGZvbGxvd2luZyBpbnB1dHM6CisgICAgICAgIDsvLyAkb3V0c2l6ZSA9ICJ1OCIgIDogIDgtYml0IHVuc2lnbmVkIGRhdGEgc2F0dXJhdGVkICgwIHRvICsyNTUpCisgICAgICAgIDsvLyAgICAgICAgICAgICJzOSIgIDogMTYtYml0IHNpZ25lZCBkYXRhIHNhdHVyYXRlZCB0byA5LWJpdCAoLTI1NiB0byArMjU1KQorICAgICAgICA7Ly8gICAgICAgICAgICAiczE2IiA6IDE2LWJpdCBzaWduZWQgZGF0YSBub3Qgc2F0dXJhdGVkIChtYXggc2l6ZSB+Ky8tMTQyNzMpCisgICAgICAgIDsvLyAkaW5zY2FsZSA9ICJzMTYiIDogc2lnbmVkIDE2LWJpdCBhYW4tc2NhbGUgdGFibGUsIFExNSBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8gICAgICAgICAgICAiczMyIiA6IHNpZ25lZCAzMi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMjMgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dHM6CisgICAgICAgIDsvLyBwU3JjICAgPSByMCA9IFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICAgICAgICA7Ly8gICAgICAgICAgICAgICBSYW5nZSBpcyAtMjU2IHRvICsyNTUgKDktYml0KQorICAgICAgICA7Ly8gU3RyaWRlID0gcjEgPSBTdHJpZGUgYmV0d2VlbiBpbnB1dCBsaW5lcworICAgICAgICA7Ly8gcERlc3QgID0gcjIgPSBQb2ludGVyIHRvIG91dHB1dCBkYXRhCisgICAgICAgIDsvLyBwU2NhbGUgPSByMyA9IFBvaW50ZXIgdG8gYWFuLXNjYWxlIHRhYmxlIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBieSAkaW5zY2FsZQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1QgICRvdXRzaXplLCAkaW5zY2FsZSwgJHN0cmlkZQorICAgICAgICBMQ0xBICAgIFNISUZUCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorOy8vIFJFR0lTVEVSIEFMTE9DQVRJT04KKzsvLyBUaGlzIGlzIGhhcmQgc2luY2Ugd2UgaGF2ZSA4IHZhbHVlcywgOSBmcmVlIHJlZ2lzdGVycyBhbmQgZWFjaAorOy8vIGJ1dHRlcmZseSByZXF1aXJlcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gV2UgYWxzbyB3YW50IHRvIAorOy8vIG1haW50YWluIHJlZ2lzdGVyIG9yZGVyIHNvIHdlIGNhbiB1c2UgTERNL1NUTS4gVGhlIHRhYmxlIGJlbG93Cis7Ly8gc3VtbWFyaXNlcyB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiB0aGF0IG1lZXRzIGFsbCB0aGVzZSBjcml0ZXJpYS4KKzsvLyBhPTFzdGNvbCwgYj0ybmRjb2wsIGYsZyxoLGkgYXJlIGRhdGFmbG93IHBvaW50cyBkZXNjcmliZWQgYWJvdmUuCis7Ly8KKzsvLyByMSAgYTAxICAgICBnMCAgaDAKKzsvLyByNCAgYjAxIGYwICBnMSAgaDEgIGkwCis7Ly8gcjUgIGEyMyBmMSAgZzIgICAgICBpMQorOy8vIHI2ICBiMjMgZjIgIGczICBoMiAgaTIKKzsvLyByNyAgYTQ1IGYzICAgICAgaDMgIGkzCis7Ly8gcjggIGI0NSBmNCAgZzQgIGg0ICBpNAorOy8vIHI5ICBhNjcgZjUgIGc1ICBoNSAgaTUKKzsvLyByMTAgYjY3IGY2ICBnNiAgaDYgIGk2Cis7Ly8gcjExICAgICBmNyAgZzcgIGg3ICBpNworOy8vCityYTAxICAgIFJOIDEKK3JiMDEgICAgUk4gNAorcmEyMyAgICBSTiA1CityYjIzICAgIFJOIDYKK3JhNDUgICAgUk4gNworcmI0NSAgICBSTiA4CityYTY3ICAgIFJOIDkKK3JiNjcgICAgUk4gMTAKK3J0bXAgICAgUk4gMTEKK2NzUGlCeTggUk4gMTIgICA7Ly8gWyAoU2luKHBpLzgpQFExNSksIChDb3MocGkvOClAUTE1KSBdCitMb29wUlIyIFJOIDE0ICAgOy8vIFsgTG9vcE51bWJlcjw8MTMgLCAoMS9TcXJ0KDIpKUBRMTUgXQorOy8vIFRyYW5zcG9zZSBhbGxvY2F0aW9uCit4ZnQgICAgIFJOIHJhMDEKK3hmMCAgICAgUk4gcmIwMQoreGYxICAgICBSTiByYTIzCit4ZjIgICAgIFJOIHJiMjMKK3hmMyAgICAgUk4gcmE0NQoreGY0ICAgICBSTiByYjQ1Cit4ZjUgICAgIFJOIHJhNjcKK3hmNiAgICAgUk4gcmI2NworeGY3ICAgICBSTiBydG1wCis7Ly8gSVN0YWdlIDEgYWxsb2NhdGlvbgoreGcwICAgICBSTiB4ZnQKK3hnMSAgICAgUk4geGYwCit4ZzIgICAgIFJOIHhmMQoreGczICAgICBSTiB4ZjIKK3hndCAgICAgUk4geGYzCit4ZzQgICAgIFJOIHhmNAoreGc1ICAgICBSTiB4ZjUKK3hnNiAgICAgUk4geGY2Cit4ZzcgICAgIFJOIHhmNworOy8vIElTdGFnZSAyIGFsbG9jYXRpb24KK3hoMCAgICAgUk4geGcwCit4aDEgICAgIFJOIHhnMQoreGh0ICAgICBSTiB4ZzIKK3hoMiAgICAgUk4geGczCit4aDMgICAgIFJOIHhndAoreGg0ICAgICBSTiB4ZzQKK3hoNSAgICAgUk4geGc1Cit4aDYgICAgIFJOIHhnNgoreGg3ICAgICBSTiB4ZzcKKzsvLyBJU3RhZ2UgMyw0IGFsbG9jYXRpb24KK3hpdCAgICAgUk4geGgwCit4aTAgICAgIFJOIHhoMQoreGkxICAgICBSTiB4aHQKK3hpMiAgICAgUk4geGgyCit4aTMgICAgIFJOIHhoMworeGk0ICAgICBSTiB4aDQKK3hpNSAgICAgUk4geGg1Cit4aTYgICAgIFJOIHhoNgoreGk3ICAgICBSTiB4aDcKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgcERlc3QsICBwcERlc3QKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgTV9TVFIgICBTdHJpZGUsIHBTdHJpZGUKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTV9BRFIgICBwRGVzdCwgIHBCbGsKKyAgICAgICAgTERSICAgICBjc1BpQnk4LCA9MHgzMGZjNzY0MgorICAgICAgICBMRFIgICAgIExvb3BSUjIsID0weDAwMDA1YTgyCisgIAordjZfaWRjdF9jb2wkX0YKKyAgICAgICAgOy8vIExvYWQgZXZlbiB2YWx1ZXMKKyAgICAgICAgTERSICAgICB4aTQsIFtwU3JjXSwgIzQgIDsvLyBqMAorICAgICAgICBMRFIgICAgIHhpNSwgW3BTcmMsICM0KjE2LTRdICA7Ly8gajQKKyAgICAgICAgTERSICAgICB4aTYsIFtwU3JjLCAjMioxNi00XSAgOy8vIGoyCisgICAgICAgIExEUiAgICAgeGk3LCBbcFNyYywgIzYqMTYtNF0gIDsvLyBqNgorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIEV2ZW4gVmFsdWVzCisgICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgOy8vIDE2eDE2IG11bAorU0hJRlQgICAgICAgU0VUQSAgICAxMgorICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjNAorICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICM0KjE2LTRdICAgICAgICAKKyAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjMioxNi00XQorICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKKyAgICAgICAgICAgIFNNTEFCQiAgeGkzLCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNCwgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQUJCICB4aTAsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk1LCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkzLCB4aTQsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjE2LTRdCisgICAgICAgICAgICBTTUxBQkIgIHhpMSwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTYsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTAsIHhpNSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBTTUxBQkIgIHhpMiwgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTcsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGkxLCB4aTEsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTEsIHhpNiwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTcsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKK1NISUZUICAgICAgIFNFVEEgICAgKDEyKzgtMTYpCisgICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQorICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjOAorICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMwKjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNCozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM0KjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk1LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNSwgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlLCAjMiozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMyKjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNiozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk3LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNywgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgb2RkIHZhbHVlcworICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2LTRdICAgICAgOy8vIGoxCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTYtNF0gICAgICA7Ly8gajcKKyAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNi00XSAgICAgIDsvLyBqNQorICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2LTRdICAgICAgOy8vIGozCisgICAgICAgIAorICAgICAgICBJRiAge1RSVUV9CisgICAgICAgICAgICA7Ly8gc2hvcnRjdXQgaWYgb2RkIHZhbHVlcyAwCisgICAgICAgICAgICBURVEgICAgIHhpMCwgIzAKKyAgICAgICAgICAgIFRFUUVRICAgeGkxLCAjMAorICAgICAgICAgICAgVEVRRVEgICB4aTIsICMwCisgICAgICAgICAgICBURVFFUSAgIHhpMywgIzAKKyAgICAgICAgICAgIEJFUSAgICAgdjZPZGRaZXJvJF9GCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgc2NhbGVkIGV2ZW4gdmFsdWVzCisgICAgICAgIFNUTUlBICAgcERlc3QsIHt4aTQsIHhpNSwgeGk2LCB4aTd9CisgICAgICAgIAorICAgICAgICA7Ly8gU2NhbGUgb2RkIHZhbHVlcworICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiCisgICAgICAgICAgICA7Ly8gUGVyZm9ybSBBQU4gU2NhbGUKKyAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSoxNi00XQorICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM3KjE2LTRdICAgICAgICAKKyAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNSoxNi00XQorICAgICAgICAgICAgU01MQUJCICB4aTcsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkwLCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBQkIgIHhpNCwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTEsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGk3LCB4aTcsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTcsIHhpMCwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMTYtNF0KKyAgICAgICAgICAgIFNNTEFCQiAgeGk1LCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMiwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNCwgeGkxLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIFNNTEFCQiAgeGk2LCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMywgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTUsIHhpNSwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNSwgeGkyLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpMywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAorICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzEqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM3KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzcqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkwLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMCwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTEsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkxLCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICM1KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzUqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICMzKjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkyLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMiwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTMsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkzLCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgTERSICAgICB4aXQsID0weDAwMDEwMDAxICAgICAgICA7Ly8gcm91bmRpbmcgY29uc3RhbnQKKyAgICAgICAgU0FERDE2IHhpNSwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgU0hBREQxNiB4aTUsIHhpNSwgeGl0CisgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNworICAgICAgICBTQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBTSEFERDE2IHhpNywgeGk3LCB4aXQKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGk0LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIGo1LWozCisgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhpMywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgeGkwLCB4aTYsIHhpNCwgTFNMIzE2ICAgOy8vIFtpNCxpNl0gcm93IGEKKyAgICAgICAgUEtIVEIgICB4aTEsIHhpNCwgeGk2LCBBU1IjMTYgICA7Ly8gW2k0LGk2XSByb3cgYgorICAgICAgICAKKyAgICAgICAgU01VQURYICB4aTIsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbYyxzXQorICAgICAgICBTTVVBRFggIHhpNCwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFtjLHNdCisgICAgICAgIFNNVVNEICAgeGkwLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgWy1zLGNdICAgCisgICAgICAgIFNNVVNEICAgeGk2LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgWy1zLGNdCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkxLCB4aTMsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTMsIHhpMywgTG9vcFJSMgorICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hUQiAgIHhoNCwgeGk0LCB4aTIsIEFTUiMxNiAgIDsvLyBoNC80CisgICAgICAgIFBLSFRCICAgeGg2LCB4aTYsIHhpMCwgQVNSIzE2ICAgOy8vIGg2LzQKKyAgICAgICAgU0hBREQxNiB4aDcsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyB4aTAseGkxLHhpMix4aTMgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3MgMnRvMyB4MS8yCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDUsIHhpMywgeGkxLCBBU1IjMTUgICA7Ly8gaDUvNAorICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0LCAjOF0gICAgICAgIDsvLyBqMixqNiBzY2FsZWQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNworICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKKyAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2ICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4ZzQsIHhoNCwgeGc1CisgICAgICAgICAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80CisgICAgICAgIAorICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIExEUkQgICAgeGkwLCBbcERlc3RdICAgICAgICAgICAgOy8vIGowLCBqNCBzY2FsZWQKKyAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCisgICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEKKyAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKKyAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCisgICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMworICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBTQUREMTYgIHhmMywgeGczLCB4ZzQKKyAgICAgICAgU1NVQjE2ICB4ZjQsIHhnMywgeGc0CisgICAgICAgIFNBREQxNiAgeGYyLCB4ZzIsIHhnNQorICAgICAgICBTU1VCMTYgIHhmNSwgeGcyLCB4ZzUKKyAgICAgICAgU0FERDE2ICB4ZjEsIHhnMSwgeGc2CisgICAgICAgIFNTVUIxNiAgeGY2LCB4ZzEsIHhnNgorICAgICAgICBTQUREMTYgIHhmMCwgeGcwLCB4ZzcKKyAgICAgICAgU1NVQjE2ICB4ZjcsIHhnMCwgeGc3CisgICAgICAgIAorICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAorICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2CisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKKyAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgorICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKKyAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0CisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAorICAgICAgICBFTkRJRgorICAgICAgICBCICAgICAgIHY2X2lkY3Rfcm93JF9GCisgICAgICAgIAordjZPZGRaZXJvJF9GCisgICAgICAgIFNTVUIxNiAgeGkyLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMi1qNikKKyAgICAgICAgU0hBREQxNiB4aTMsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKKyAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCisgICAgICAgIAorICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhoMCwgeGk0LCB4aTUKKyAgICAgICAgU0hTVUIxNiB4aDEsIHhpNCwgeGk1ICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKKyAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCisgICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMworICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgTU9WICB4ZjMsIHhnMworICAgICAgICBNT1YgIHhmNCwgeGczCisgICAgICAgIE1PViAgeGYyLCB4ZzIKKyAgICAgICAgTU9WICB4ZjUsIHhnMgorICAgICAgICBNT1YgIHhmMSwgeGcxCisgICAgICAgIE1PViAgeGY2LCB4ZzEKKyAgICAgICAgTU9WICB4ZjAsIHhnMAorICAgICAgICBNT1YgIHhmNywgeGcwCisgICAgICAgIAorICAgICAgICA7Ly8gVHJhbnNwb3NlCisgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgorICAgICAgICAgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCisgICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKKyAgICAgICAgCisgICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKKyAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQorICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCisgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAKKyAgICAgICAgCit2Nl9pZGN0X3JvdyRfRgorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93czR0bzcgeDEvNAorICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAorICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2XSAgICAgIDsvLyBqMQorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2XSAgICAgIDsvLyA0Kmo3CisgICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTZdICAgICAgOy8vIGo1CisgICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTZdICAgICAgOy8vIGozCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyAyKmo3CisgICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo3ICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIFNIQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMworICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCisgICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKKyAgICAgICAgCisgICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KKyAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQorICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAorICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQorICAgICAgICAgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAorICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80CisgICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgorICAgICAgICAKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMioxNl0gICAgICA7Ly8gajIKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNioxNl0gICAgICA7Ly8gMipqNgorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNworICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKKyAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2CisgICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajYKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KSAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAorICAgICAgICAKKyAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM0KjE2XSAgICAgIDsvLyBqNAorICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmNdLCAjNCAgICAgICAgIDsvLyBqMAorCisgICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMworICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cworICAgICAgICAKKyAgICAgICAgQUREICAgICB4aTAsIHhpMCwgeGl0LCBMU0wgIzIgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKKyAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0CisgICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMQorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgorICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKKyAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCisgICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMworICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFNIQUREMTYgeGYzLCB4ZzMsIHhnNAorICAgICAgICBTSFNVQjE2IHhmNCwgeGczLCB4ZzQKKyAgICAgICAgU0hBREQxNiB4ZjIsIHhnMiwgeGc1CisgICAgICAgIFNIU1VCMTYgeGY1LCB4ZzIsIHhnNQorICAgICAgICBTSEFERDE2IHhmMSwgeGcxLCB4ZzYKKyAgICAgICAgU0hTVUIxNiB4ZjYsIHhnMSwgeGc2CisgICAgICAgIFNIQUREMTYgeGYwLCB4ZzAsIHhnNworICAgICAgICBTSFNVQjE2IHhmNywgeGcwLCB4ZzcKKyAgICAgICAgCisgICAgICAgIDsvLyBTYXR1cmF0ZQorICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQorICAgICAgICAgICAgVVNBVDE2ICB4ZjAsICM4LCB4ZjAKKyAgICAgICAgICAgIFVTQVQxNiAgeGYxLCAjOCwgeGYxCisgICAgICAgICAgICBVU0FUMTYgIHhmMiwgIzgsIHhmMgorICAgICAgICAgICAgVVNBVDE2ICB4ZjMsICM4LCB4ZjMKKyAgICAgICAgICAgIFVTQVQxNiAgeGY0LCAjOCwgeGY0CisgICAgICAgICAgICBVU0FUMTYgIHhmNSwgIzgsIHhmNQorICAgICAgICAgICAgVVNBVDE2ICB4ZjYsICM4LCB4ZjYKKyAgICAgICAgICAgIFVTQVQxNiAgeGY3LCAjOCwgeGY3ICAgICAgICAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKKyAgICAgICAgICAgIFNTQVQxNiAgeGYwLCAjOSwgeGYwCisgICAgICAgICAgICBTU0FUMTYgIHhmMSwgIzksIHhmMQorICAgICAgICAgICAgU1NBVDE2ICB4ZjIsICM5LCB4ZjIKKyAgICAgICAgICAgIFNTQVQxNiAgeGYzLCAjOSwgeGYzCisgICAgICAgICAgICBTU0FUMTYgIHhmNCwgIzksIHhmNAorICAgICAgICAgICAgU1NBVDE2ICB4ZjUsICM5LCB4ZjUKKyAgICAgICAgICAgIFNTQVQxNiAgeGY2LCAjOSwgeGY2CisgICAgICAgICAgICBTU0FUMTYgIHhmNywgIzksIHhmNyAgICAgICAgCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRvIFJvdywgUGFjayBhbmQgc3RvcmUKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgIE9SUiAgICAgeGYwLCB4ZjAsIHhmMSwgTFNMICM4IDsvLyBbIGIxIGIwIGExIGEwIF0KKyAgICAgICAgICAgIE9SUiAgICAgeGYyLCB4ZjIsIHhmMywgTFNMICM4IDsvLyBbIGIzIGIyIGEzIGEyIF0KKyAgICAgICAgICAgIE9SUiAgICAgeGY0LCB4ZjQsIHhmNSwgTFNMICM4IDsvLyBbIGI1IGI0IGE1IGE0IF0KKyAgICAgICAgICAgIE9SUiAgICAgeGY2LCB4ZjYsIHhmNywgTFNMICM4IDsvLyBbIGI3IGI2IGE3IGE2IF0KKyAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjIsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYyLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGY0LCB4ZjYsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGY2LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzfQorICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9CisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVORElGCisgICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpOkxPUjooIiRvdXRzaXplIj0iczE2IikgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgorICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAorICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBCQ0MgICAgIHY2X2lkY3Rfcm93JF9GCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKworCisgICAgICAgIElGIENvcnRleEE4CisgICAgICAgIAorU3JjMCAgICAgICAgICAgIEVRVSAgNyAgICAgICAgICAgICAgCitTcmMxICAgICAgICAgICAgRVFVICA4ICAgICAgICAgICAgICAKK1NyYzIgICAgICAgICAgICBFUVUgIDkgICAgICAgICAgICAgIAorU3JjMyAgICAgICAgICAgIEVRVSAgMTAgICAgICAgICAgICAgIAorU3JjNCAgICAgICAgICAgIEVRVSAgMTEgICAgICAgICAgICAgIAorU3JjNSAgICAgICAgICAgIEVRVSAgMTIgICAgICAgICAgICAgIAorU3JjNiAgICAgICAgICAgIEVRVSAgMTMKK1NyYzcgICAgICAgICAgICBFUVUgIDE0CitUbXAgICAgICAgICAgICAgRVFVICAxNQorCitxWGowICAgICAgICAgICAgUU4gU3JjMC5TMTYgCitxWGoxICAgICAgICAgICAgUU4gU3JjMS5TMTYKK3FYajIgICAgICAgICAgICBRTiBTcmMyLlMxNgorcVhqMyAgICAgICAgICAgIFFOIFNyYzMuUzE2CitxWGo0ICAgICAgICAgICAgUU4gU3JjNC5TMTYKK3FYajUgICAgICAgICAgICBRTiBTcmM1LlMxNgorcVhqNiAgICAgICAgICAgIFFOIFNyYzYuUzE2CitxWGo3ICAgICAgICAgICAgUU4gU3JjNy5TMTYKK3FYanQgICAgICAgICAgICBRTiBUbXAuUzE2CisKK2RYajBsbyAgICAgICAgICBETiAoU3JjMCoyKS5TMTYKK2RYajBoaSAgICAgICAgICBETiAoU3JjMCoyKzEpLlMxNgorZFhqMWxvICAgICAgICAgIEROIChTcmMxKjIpLlMxNgorZFhqMWhpICAgICAgICAgIEROIChTcmMxKjIrMSkuUzE2CitkWGoybG8gICAgICAgICAgRE4gKFNyYzIqMikuUzE2CitkWGoyaGkgICAgICAgICAgRE4gKFNyYzIqMisxKS5TMTYKK2RYajNsbyAgICAgICAgICBETiAoU3JjMyoyKS5TMTYKK2RYajNoaSAgICAgICAgICBETiAoU3JjMyoyKzEpLlMxNgorZFhqNGxvICAgICAgICAgIEROIChTcmM0KjIpLlMxNgorZFhqNGhpICAgICAgICAgIEROIChTcmM0KjIrMSkuUzE2CitkWGo1bG8gICAgICAgICAgRE4gKFNyYzUqMikuUzE2CitkWGo1aGkgICAgICAgICAgRE4gKFNyYzUqMisxKS5TMTYKK2RYajZsbyAgICAgICAgICBETiAoU3JjNioyKS5TMTYKK2RYajZoaSAgICAgICAgICBETiAoU3JjNioyKzEpLlMxNgorZFhqN2xvICAgICAgICAgIEROIChTcmM3KjIpLlMxNgorZFhqN2hpICAgICAgICAgIEROIChTcmM3KjIrMSkuUzE2CitkWGp0bG8gICAgICAgICAgRE4gKFRtcCoyKS5TMTYKK2RYanRoaSAgICAgICAgICBETiAoVG1wKjIrMSkuUzE2CisKK3FYaTAgICAgICAgICAgICBRTiBxWGowCitxWGkxICAgICAgICAgICAgUU4gcVhqNAorcVhpMiAgICAgICAgICAgIFFOIHFYajIKK3FYaTMgICAgICAgICAgICBRTiBxWGo3CitxWGk0ICAgICAgICAgICAgUU4gcVhqNQorcVhpNSAgICAgICAgICAgIFFOIHFYanQKK3FYaTYgICAgICAgICAgICBRTiBxWGoxCitxWGk3ICAgICAgICAgICAgUU4gcVhqNgorcVhpdCAgICAgICAgICAgIFFOIHFYajMKKworZFhpMGxvICAgICAgICAgIEROIGRYajBsbworZFhpMGhpICAgICAgICAgIEROIGRYajBoaQorZFhpMWxvICAgICAgICAgIEROIGRYajRsbworZFhpMWhpICAgICAgICAgIEROIGRYajRoaQorZFhpMmxvICAgICAgICAgIEROIGRYajJsbworZFhpMmhpICAgICAgICAgIEROIGRYajJoaQorZFhpM2xvICAgICAgICAgIEROIGRYajdsbworZFhpM2hpICAgICAgICAgIEROIGRYajdoaQorZFhpNGxvICAgICAgICAgIEROIGRYajVsbworZFhpNGhpICAgICAgICAgIEROIGRYajVoaQorZFhpNWxvICAgICAgICAgIEROIGRYanRsbworZFhpNWhpICAgICAgICAgIEROIGRYanRoaQorZFhpNmxvICAgICAgICAgIEROIGRYajFsbworZFhpNmhpICAgICAgICAgIEROIGRYajFoaQorZFhpN2xvICAgICAgICAgIEROIGRYajZsbworZFhpN2hpICAgICAgICAgIEROIGRYajZoaQorZFhpdGxvICAgICAgICAgIEROIGRYajNsbworZFhpdGhpICAgICAgICAgIEROIGRYajNoaQorCitxWGgwICAgICAgICAgICAgUU4gcVhpdAorcVhoMSAgICAgICAgICAgIFFOIHFYaTAKK3FYaDIgICAgICAgICAgICBRTiBxWGkyCitxWGgzICAgICAgICAgICAgUU4gcVhpMworcVhoNCAgICAgICAgICAgIFFOIHFYaTcKK3FYaDUgICAgICAgICAgICBRTiBxWGk1CitxWGg2ICAgICAgICAgICAgUU4gcVhpNAorcVhoNyAgICAgICAgICAgIFFOIHFYaTEKK3FYaHQgICAgICAgICAgICBRTiBxWGk2CisKK2RYaDBsbyAgICAgICAgICBETiBkWGl0bG8KK2RYaDBoaSAgICAgICAgICBETiBkWGl0aGkKK2RYaDFsbyAgICAgICAgICBETiBkWGkwbG8KK2RYaDFoaSAgICAgICAgICBETiBkWGkwaGkKK2RYaDJsbyAgICAgICAgICBETiBkWGkybG8KK2RYaDJoaSAgICAgICAgICBETiBkWGkyaGkKK2RYaDNsbyAgICAgICAgICBETiBkWGkzbG8KK2RYaDNoaSAgICAgICAgICBETiBkWGkzaGkKK2RYaDRsbyAgICAgICAgICBETiBkWGk3bG8KK2RYaDRoaSAgICAgICAgICBETiBkWGk3aGkKK2RYaDVsbyAgICAgICAgICBETiBkWGk1bG8KK2RYaDVoaSAgICAgICAgICBETiBkWGk1aGkKK2RYaDZsbyAgICAgICAgICBETiBkWGk0bG8KK2RYaDZoaSAgICAgICAgICBETiBkWGk0aGkKK2RYaDdsbyAgICAgICAgICBETiBkWGkxbG8KK2RYaDdoaSAgICAgICAgICBETiBkWGkxaGkKK2RYaHRsbyAgICAgICAgICBETiBkWGk2bG8KK2RYaHRoaSAgICAgICAgICBETiBkWGk2aGkKKworcVhnMCAgICAgICAgICAgIFFOIHFYaDIKK3FYZzEgICAgICAgICAgICBRTiBxWGh0CitxWGcyICAgICAgICAgICAgUU4gcVhoMQorcVhnMyAgICAgICAgICAgIFFOIHFYaDAKK3FYZzQgICAgICAgICAgICBRTiBxWGg0CitxWGc1ICAgICAgICAgICAgUU4gcVhoNQorcVhnNiAgICAgICAgICAgIFFOIHFYaDYKK3FYZzcgICAgICAgICAgICBRTiBxWGg3CitxWGd0ICAgICAgICAgICAgUU4gcVhoMworCitxWGYwICAgICAgICAgICAgUU4gcVhnNgorcVhmMSAgICAgICAgICAgIFFOIHFYZzUKK3FYZjIgICAgICAgICAgICBRTiBxWGc0CitxWGYzICAgICAgICAgICAgUU4gcVhndAorcVhmNCAgICAgICAgICAgIFFOIHFYZzMKK3FYZjUgICAgICAgICAgICBRTiBxWGcyCitxWGY2ICAgICAgICAgICAgUU4gcVhnMQorcVhmNyAgICAgICAgICAgIFFOIHFYZzAKK3FYZnQgICAgICAgICAgICBRTiBxWGc3CisKKworcVh0MCAgICAgICAgICAgIFFOIDEuUzMyCitxWHQxICAgICAgICAgICAgUU4gMi5TMzIKK3FUMGxvICAgICAgICAgICBRTiAxLlMzMiAgICAgICAgIAorcVQwaGkgICAgICAgICAgIFFOIDIuUzMyICAgICAgICAgCitxVDFsbyAgICAgICAgICAgUU4gMy5TMzIgICAgICAgICAKK3FUMWhpICAgICAgICAgICBRTiA0LlMzMiAgICAgICAgIAorcVNjYWxlbG8gICAgICAgIFFOIDUuUzMyICAgICAgICA7Ly8gdXNlZCB0byByZWFkIHBvc3Qgc2NhbGUgdmFsdWVzCitxU2NhbGVoaSAgICAgICAgUU4gNi5TMzIKK3FUZW1wMCAgICAgICAgICBRTiA1LlMzMiAgICAgICAgIAorcVRlbXAxICAgICAgICAgIFFOIDYuUzMyICAgIAorCisKK1NjYWxlMSAgICAgICAgICBFUVUgNgorU2NhbGUyICAgICAgICAgIEVRVSAxNQorcVNjYWxlMSAgICAgICAgIFFOIFNjYWxlMS5TMTYgICAgIAorcVNjYWxlMiAgICAgICAgIFFOIFNjYWxlMi5TMTYgICAgIAorZFNjYWxlMWxvICAgICAgIEROIChTY2FsZTEqMikuUzE2ICAgICAKK2RTY2FsZTFoaSAgICAgICBETiAoU2NhbGUxKjIrMSkuUzE2CitkU2NhbGUybG8gICAgICAgRE4gKFNjYWxlMioyKS5TMTYgICAgIAorZFNjYWxlMmhpICAgICAgIEROIChTY2FsZTIqMisxKS5TMTYKKworZENvZWZzICAgICAgICAgIEROIDAuUzE2ICAgICAgICA7Ly8gU2NhbGUgY29lZmZpY2llbnRzIGluIGZvcm1hdCB7WzBdIFtDXSBbU10gW0ludlNxcnQyXX0KK0ludlNxcnQyICAgICAgICBETiBkQ29lZnNbMF0gICAgOy8vIDEvc3FydCgyKSBpbiBRMTUKK1MgICAgICAgICAgICAgICBETiBkQ29lZnNbMV0gICAgOy8vIFNpbihQSS84KSBpbiBRMTUKK0MgICAgICAgICAgICAgICBETiBkQ29lZnNbMl0gICAgOy8vIENvcyhQSS84KSBpbiBRMTUKKworcFRlbXAgICAgICAgICAgIFJOIDEyCisKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgSU1QT1JUICBhcm1DT01NX0lEQ1RDb2VmCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7cVhqMCxxWGoxfSwgW3BTcmMgQDY0XSEKKyAgICAgICAgVkxEMSAgICAgICAge3FYajIscVhqM30sIFtwU3JjIEA2NF0hCisgICAgICAgIFZMRDEgICAgICAgIHtxWGo0LHFYajV9LCBbcFNyYyBANjRdIQorICAgICAgICBWTEQxICAgICAgICB7cVhqNixxWGo3fSwgW3BTcmMgQDY0XSEKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFByZVNjYWxlIGFuZCBtdWx0aXBseSB3aXRoIFNyYworICAgICAgICA7Ly8gSVN0YWdlIDQKKyAgICAgICAgCisgICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDE2WDE2IE11bAorICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDMyWDMyICx1bAorICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gSVN0YWdlIDMKKyAgICAgICAgVlFETVVMSCAgICAgcVhpMiwgcVhpMiwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaTIvc3FydCgyKQorICAgICAgICBWSEFERCAgICAgICBxWGgwLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAraTEpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVhoMSwgcVhpMCwgcVhpMSAgICAgICAgICAgICAgICA7Ly8gKGkwLWkxKS8yCisgICAgICAgIFZIQUREICAgICAgIHFYaDcsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICBWU1VCICAgICAgICBxWGg1LCBxWGk1LCBxWGk3ICAgICAgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKKyAgICAgICAgVlFETVVMSCAgICAgcVhoNSwgcVhoNSwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaDUvc3FydCgyKQorICAgICAgICBWU1VCICAgICAgICBxWGgyLCBxWGkyLCBxWGkzICAgICAgICAgICAgICAgIDsvLyBoMiwgaDMKKworICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk0bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk0CisgICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRYaTZsbywgUyAgICAgICAgICAgICAgICAgOy8vIGMqaTQrcyppNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk0aGksIEMKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFhpNmhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRYaDRsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg0CisgICAgICAgIFZTSFJOICAgICAgIGRYaDRoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk2bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk2CisgICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRYaTRsbywgUyAgICAgICAgICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk2aGksIEMKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFhpNGhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRYaDZsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg2CisgICAgICAgIFZTSFJOICAgICAgIGRYaDZoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIKKyAgICAgICAgVlNVQiAgICAgICAgcVhnNiwgcVhoNiwgcVhoNworICAgICAgICBWU1VCICAgICAgICBxWGc1LCBxWGg1LCBxWGc2CisgICAgICAgIFZTVUIgICAgICAgIHFYZzQsIHFYaDQsIHFYZzUKKyAgICAgICAgVkhBREQgICAgICAgcVhnMSwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMStoMikvMgorICAgICAgICBWSFNVQiAgICAgICBxWGcyLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxLWgyKS8yCisgICAgICAgIFZIQUREICAgICAgIHFYZzAsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAraDMpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVhnMywgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMC1oMykvMgorCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBWQUREICAgICAgICBxWGYzLCBxWGczLCBxWGc0ICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgcVhmNCwgcVhnMywgcVhnNCAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIHFYZjIsIHFYZzIsIHFYZzUgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWGY1LCBxWGcyLCBxWGc1ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMSwgcVhnMSwgcVhnNgorICAgICAgICBWU1VCICAgICAgICBxWGY2LCBxWGcxLCBxWGc2ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMCwgcVhnMCwgcVhnNworICAgICAgICBWU1VCICAgICAgICBxWGY3LCBxWGcwLCBxWGc3ICAgICAgCisKKyAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKK1hUUjAgICAgICAgICAgICBFUVUgU3JjNQorWFRSMSAgICAgICAgICAgIEVRVSBUbXAKK1hUUjIgICAgICAgICAgICBFUVUgU3JjNgorWFRSMyAgICAgICAgICAgIEVRVSBTcmM3CitYVFI0ICAgICAgICAgICAgRVFVIFNyYzMKK1hUUjUgICAgICAgICAgICBFUVUgU3JjMAorWFRSNiAgICAgICAgICAgIEVRVSBTcmMxCitYVFI3ICAgICAgICAgICAgRVFVIFNyYzIKK1hUUnQgICAgICAgICAgICBFUVUgU3JjNAorICAgICAgICAgICAgICAgIAorcUEwICAgICAgICAgICAgIFFOICBYVFIwLlMzMiAgOy8vIGZvciBYVFJwb3NlCitxQTEgICAgICAgICAgICAgUU4gIFhUUjEuUzMyCitxQTIgICAgICAgICAgICAgUU4gIFhUUjIuUzMyCitxQTMgICAgICAgICAgICAgUU4gIFhUUjMuUzMyCitxQTQgICAgICAgICAgICAgUU4gIFhUUjQuUzMyCitxQTUgICAgICAgICAgICAgUU4gIFhUUjUuUzMyCitxQTYgICAgICAgICAgICAgUU4gIFhUUjYuUzMyCitxQTcgICAgICAgICAgICAgUU4gIFhUUjcuUzMyCisKK2RCMCAgICAgICAgICAgICBETiAgWFRSMCoyKzEgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKK2RCMSAgICAgICAgICAgICBETiAgWFRSMSoyKzEKK2RCMiAgICAgICAgICAgICBETiAgWFRSMioyKzEKK2RCMyAgICAgICAgICAgICBETiAgWFRSMyoyKzEKK2RCNCAgICAgICAgICAgICBETiAgWFRSNCoyCitkQjUgICAgICAgICAgICAgRE4gIFhUUjUqMgorZEI2ICAgICAgICAgICAgIEROICBYVFI2KjIKK2RCNyAgICAgICAgICAgICBETiAgWFRSNyoyCisKKyAgICAgICAgICAKKyAgICAgICAgVlRSTiAgICAgICAgcVhmMCwgcVhmMQorICAgICAgICBWVFJOICAgICAgICBxWGYyLCBxWGYzCisgICAgICAgIFZUUk4gICAgICAgIHFYZjQsIHFYZjUKKyAgICAgICAgVlRSTiAgICAgICAgcVhmNiwgcVhmNworICAgICAgICBWVFJOICAgICAgICBxQTAsIHFBMgorICAgICAgICBWVFJOICAgICAgICBxQTEsIHFBMworICAgICAgICBWVFJOICAgICAgICBxQTQsIHFBNgorICAgICAgICBWVFJOICAgICAgICBxQTUsIHFBNyAgICAgICAgCisgICAgICAgIFZTV1AgICAgICAgIGRCMCwgZEI0CisgICAgICAgIFZTV1AgICAgICAgIGRCMSwgZEI1CisgICAgICAgIFZTV1AgICAgICAgIGRCMiwgZEI2CisgICAgICAgIFZTV1AgICAgICAgIGRCMywgZEI3CisgICAgICAgIAorCitxWWowICAgICAgICAgICAgUU4gcVhmMAorcVlqMSAgICAgICAgICAgIFFOIHFYZjEKK3FZajIgICAgICAgICAgICBRTiBxWGYyCitxWWozICAgICAgICAgICAgUU4gcVhmMworcVlqNCAgICAgICAgICAgIFFOIHFYZjQKK3FZajUgICAgICAgICAgICBRTiBxWGY1CitxWWo2ICAgICAgICAgICAgUU4gcVhmNgorcVlqNyAgICAgICAgICAgIFFOIHFYZjcKK3FZanQgICAgICAgICAgICBRTiBxWGZ0CisKK2RZajBsbyAgICAgICAgICBETiAoWFRSMCoyKS5TMTYKK2RZajBoaSAgICAgICAgICBETiAoWFRSMCoyKzEpLlMxNgorZFlqMWxvICAgICAgICAgIEROIChYVFIxKjIpLlMxNgorZFlqMWhpICAgICAgICAgIEROIChYVFIxKjIrMSkuUzE2CitkWWoybG8gICAgICAgICAgRE4gKFhUUjIqMikuUzE2CitkWWoyaGkgICAgICAgICAgRE4gKFhUUjIqMisxKS5TMTYKK2RZajNsbyAgICAgICAgICBETiAoWFRSMyoyKS5TMTYKK2RZajNoaSAgICAgICAgICBETiAoWFRSMyoyKzEpLlMxNgorZFlqNGxvICAgICAgICAgIEROIChYVFI0KjIpLlMxNgorZFlqNGhpICAgICAgICAgIEROIChYVFI0KjIrMSkuUzE2CitkWWo1bG8gICAgICAgICAgRE4gKFhUUjUqMikuUzE2CitkWWo1aGkgICAgICAgICAgRE4gKFhUUjUqMisxKS5TMTYKK2RZajZsbyAgICAgICAgICBETiAoWFRSNioyKS5TMTYKK2RZajZoaSAgICAgICAgICBETiAoWFRSNioyKzEpLlMxNgorZFlqN2xvICAgICAgICAgIEROIChYVFI3KjIpLlMxNgorZFlqN2hpICAgICAgICAgIEROIChYVFI3KjIrMSkuUzE2CitkWWp0bG8gICAgICAgICAgRE4gKFhUUnQqMikuUzE2CitkWWp0aGkgICAgICAgICAgRE4gKFhUUnQqMisxKS5TMTYKKworcVlpMCAgICAgICAgICAgIFFOIHFZajAKK3FZaTEgICAgICAgICAgICBRTiBxWWo0CitxWWkyICAgICAgICAgICAgUU4gcVlqMgorcVlpMyAgICAgICAgICAgIFFOIHFZajcKK3FZaTQgICAgICAgICAgICBRTiBxWWo1CitxWWk1ICAgICAgICAgICAgUU4gcVlqdAorcVlpNiAgICAgICAgICAgIFFOIHFZajEKK3FZaTcgICAgICAgICAgICBRTiBxWWo2CitxWWl0ICAgICAgICAgICAgUU4gcVlqMworCitkWWkwbG8gICAgICAgICAgRE4gZFlqMGxvCitkWWkwaGkgICAgICAgICAgRE4gZFlqMGhpCitkWWkxbG8gICAgICAgICAgRE4gZFlqNGxvCitkWWkxaGkgICAgICAgICAgRE4gZFlqNGhpCitkWWkybG8gICAgICAgICAgRE4gZFlqMmxvCitkWWkyaGkgICAgICAgICAgRE4gZFlqMmhpCitkWWkzbG8gICAgICAgICAgRE4gZFlqN2xvCitkWWkzaGkgICAgICAgICAgRE4gZFlqN2hpCitkWWk0bG8gICAgICAgICAgRE4gZFlqNWxvCitkWWk0aGkgICAgICAgICAgRE4gZFlqNWhpCitkWWk1bG8gICAgICAgICAgRE4gZFlqdGxvCitkWWk1aGkgICAgICAgICAgRE4gZFlqdGhpCitkWWk2bG8gICAgICAgICAgRE4gZFlqMWxvCitkWWk2aGkgICAgICAgICAgRE4gZFlqMWhpCitkWWk3bG8gICAgICAgICAgRE4gZFlqNmxvCitkWWk3aGkgICAgICAgICAgRE4gZFlqNmhpCitkWWl0bG8gICAgICAgICAgRE4gZFlqM2xvCitkWWl0aGkgICAgICAgICAgRE4gZFlqM2hpCisKK3FZaDAgICAgICAgICAgICBRTiBxWWl0CitxWWgxICAgICAgICAgICAgUU4gcVlpMAorcVloMiAgICAgICAgICAgIFFOIHFZaTIKK3FZaDMgICAgICAgICAgICBRTiBxWWkzCitxWWg0ICAgICAgICAgICAgUU4gcVlpNworcVloNSAgICAgICAgICAgIFFOIHFZaTUKK3FZaDYgICAgICAgICAgICBRTiBxWWk0CitxWWg3ICAgICAgICAgICAgUU4gcVlpMQorcVlodCAgICAgICAgICAgIFFOIHFZaTYKKworZFloMGxvICAgICAgICAgIEROIGRZaXRsbworZFloMGhpICAgICAgICAgIEROIGRZaXRoaQorZFloMWxvICAgICAgICAgIEROIGRZaTBsbworZFloMWhpICAgICAgICAgIEROIGRZaTBoaQorZFloMmxvICAgICAgICAgIEROIGRZaTJsbworZFloMmhpICAgICAgICAgIEROIGRZaTJoaQorZFloM2xvICAgICAgICAgIEROIGRZaTNsbworZFloM2hpICAgICAgICAgIEROIGRZaTNoaQorZFloNGxvICAgICAgICAgIEROIGRZaTdsbworZFloNGhpICAgICAgICAgIEROIGRZaTdoaQorZFloNWxvICAgICAgICAgIEROIGRZaTVsbworZFloNWhpICAgICAgICAgIEROIGRZaTVoaQorZFloNmxvICAgICAgICAgIEROIGRZaTRsbworZFloNmhpICAgICAgICAgIEROIGRZaTRoaQorZFloN2xvICAgICAgICAgIEROIGRZaTFsbworZFloN2hpICAgICAgICAgIEROIGRZaTFoaQorZFlodGxvICAgICAgICAgIEROIGRZaTZsbworZFlodGhpICAgICAgICAgIEROIGRZaTZoaQorCitxWWcwICAgICAgICAgICAgUU4gcVloMgorcVlnMSAgICAgICAgICAgIFFOIHFZaHQKK3FZZzIgICAgICAgICAgICBRTiBxWWgxCitxWWczICAgICAgICAgICAgUU4gcVloMAorcVlnNCAgICAgICAgICAgIFFOIHFZaDQKK3FZZzUgICAgICAgICAgICBRTiBxWWg1CitxWWc2ICAgICAgICAgICAgUU4gcVloNgorcVlnNyAgICAgICAgICAgIFFOIHFZaDcKK3FZZ3QgICAgICAgICAgICBRTiBxWWgzCisKK3FZZjAgICAgICAgICAgICBRTiBxWWc2CitxWWYxICAgICAgICAgICAgUU4gcVlnNQorcVlmMiAgICAgICAgICAgIFFOIHFZZzQKK3FZZjMgICAgICAgICAgICBRTiBxWWd0CitxWWY0ICAgICAgICAgICAgUU4gcVlnMworcVlmNSAgICAgICAgICAgIFFOIHFZZzIKK3FZZjYgICAgICAgICAgICBRTiBxWWcxCitxWWY3ICAgICAgICAgICAgUU4gcVlnMAorcVlmdCAgICAgICAgICAgIFFOIHFZZzcKKworICAgICAgICBWUlNIUiAgICAgICBxWWo3LCBxWWo3LCAjMgorICAgICAgICBWUlNIUiAgICAgICBxWWo2LCBxWWo2LCAjMQorICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgcVlpNSwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk1ID0gKGoxK2o3KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaTYsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNiA9IGoxLWo3CisgICAgICAgIFZIQUREICAgICAgIHFZaTMsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMyA9IChqMitqNikvMgorICAgICAgICBWU1VCICAgICAgICBxWWkyLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTIgPSBqMi1qNgorICAgICAgICBWSEFERCAgICAgICBxWWk3LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTcgPSAoajUrajMpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVlpNCwgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk0ID0gajUtajMKKworICAgICAgICBWUURNVUxIICAgICBxWWkyLCBxWWkyLCBJbnZTcXJ0MiAgICA7Ly8gaTIvc3FydCgyKQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBUZW1wLCAjMHg0ICAgICAgICAgICAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAorICAgICAgICBWRFVQICAgICAgICBxU2NhbGUxLCBwVGVtcCAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAorICAgICAgICBWQUREICAgICAgICBxWWkwLCBxWWkwLCBxU2NhbGUxCisgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWWgwLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwK2kxKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFZaDEsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAtaTEpLzIKKworICAgICAgICBWSEFERCAgICAgICBxWWg3LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIFZTVUIgICAgICAgIHFZaDUsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUtaTcpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVloMiwgcVlpMiwgcVlpMyAgICAgICAgOy8vIGgyLCBoMworICAgICAgICBWUURNVUxIICAgICBxWWg1LCBxWWg1LCBJbnZTcXJ0MiAgICA7Ly8gaDUvc3FydCgyKQorCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRZaTRsbywgQyAgICAgICAgIDsvLyBjKmk0CisgICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRZaTZsbywgUyAgICAgICAgIDsvLyBjKmk0K3MqaTYKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFlpNGhpLCBDCisgICAgICAgIFZNTEFMICAgICAgIHFYdDEsIGRZaTZoaSwgUworICAgICAgICBWU0hSTiAgICAgICBkWWg0bG8sIHFYdDAsICMxNiAgICAgICA7Ly8gaDQKKyAgICAgICAgVlNIUk4gICAgICAgZFloNGhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRZaTZsbywgQyAgICAgICAgIDsvLyBjKmk2CisgICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRZaTRsbywgUyAgICAgICAgIDsvLyAtcyppNCArIGMqaDYKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFlpNmhpLCBDCisgICAgICAgIFZNTFNMICAgICAgIHFYdDEsIGRZaTRoaSwgUworICAgICAgICBWU0hSTiAgICAgICBkWWg2bG8sIHFYdDAsICMxNiAgICAgICA7Ly8gaDYKKyAgICAgICAgVlNIUk4gICAgICAgZFloNmhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIHFZZzYsIHFZaDYsIHFZaDcKKyAgICAgICAgVlNVQiAgICAgICAgcVlnNSwgcVloNSwgcVlnNgorICAgICAgICBWU1VCICAgICAgICBxWWc0LCBxWWg0LCBxWWc1CisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFZIQUREICAgICAgIHFZZzEsIHFZaDEsIHFZaDIgICAgICAgIDsvLyAoaDEraDIpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVlnMiwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMS1oMikvMgorICAgICAgICBWSEFERCAgICAgICBxWWcwLCBxWWgwLCBxWWgzICAgICAgICA7Ly8gKGgwK2gzKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFZZzMsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAtaDMpLzIKKyAgICAgICAgCisKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFZIQUREICAgICAgICBxWWYzLCBxWWczLCBxWWc0ICAgICAgICAKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjQsIHFZZzMsIHFZZzQgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICAgcVlmMiwgcVlnMiwgcVlnNSAgICAgICAgCisgICAgICAgIFZIU1VCICAgICAgICBxWWY1LCBxWWcyLCBxWWc1ICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjEsIHFZZzEsIHFZZzYKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjYsIHFZZzEsIHFZZzYgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICAgcVlmMCwgcVlnMCwgcVlnNworICAgICAgICBWSFNVQiAgICAgICAgcVlmNywgcVlnMCwgcVlnNyAgICAgIAorCitZVFIwICAgICAgICAgICAgRVFVIFNyYzAKK1lUUjEgICAgICAgICAgICBFUVUgU3JjNAorWVRSMiAgICAgICAgICAgIEVRVSBTcmMxCitZVFIzICAgICAgICAgICAgRVFVIFNyYzIKK1lUUjQgICAgICAgICAgICBFUVUgU3JjNworWVRSNSAgICAgICAgICAgIEVRVSBTcmM1CitZVFI2ICAgICAgICAgICAgRVFVIFRtcAorWVRSNyAgICAgICAgICAgIEVRVSBTcmM2CitZVFJ0ICAgICAgICAgICAgRVFVIFNyYzMKKworcUMwICAgICAgICAgICAgIFFOICBZVFIwLlMzMiAgICAgICAgICAgICAgICA7Ly8gZm9yIFlUUnBvc2UKK3FDMSAgICAgICAgICAgICBRTiAgWVRSMS5TMzIKK3FDMiAgICAgICAgICAgICBRTiAgWVRSMi5TMzIKK3FDMyAgICAgICAgICAgICBRTiAgWVRSMy5TMzIKK3FDNCAgICAgICAgICAgICBRTiAgWVRSNC5TMzIKK3FDNSAgICAgICAgICAgICBRTiAgWVRSNS5TMzIKK3FDNiAgICAgICAgICAgICBRTiAgWVRSNi5TMzIKK3FDNyAgICAgICAgICAgICBRTiAgWVRSNy5TMzIKKworZEQwICAgICAgICAgICAgIEROICBZVFIwKjIrMSAgICAgICAgICAgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKK2REMSAgICAgICAgICAgICBETiAgWVRSMSoyKzEKK2REMiAgICAgICAgICAgICBETiAgWVRSMioyKzEKK2REMyAgICAgICAgICAgICBETiAgWVRSMyoyKzEKK2RENCAgICAgICAgICAgICBETiAgWVRSNCoyCitkRDUgICAgICAgICAgICAgRE4gIFlUUjUqMgorZEQ2ICAgICAgICAgICAgIEROICBZVFI2KjIKK2RENyAgICAgICAgICAgICBETiAgWVRSNyoyCisgICAgICAgICAgCisgICAgICAgIFZUUk4gICAgICAgIHFZZjAsIHFZZjEKKyAgICAgICAgVlRSTiAgICAgICAgcVlmMiwgcVlmMworICAgICAgICBWVFJOICAgICAgICBxWWY0LCBxWWY1CisgICAgICAgIFZUUk4gICAgICAgIHFZZjYsIHFZZjcKKyAgICAgICAgVlRSTiAgICAgICAgcUMwLCBxQzIKKyAgICAgICAgVlRSTiAgICAgICAgcUMxLCBxQzMKKyAgICAgICAgVlRSTiAgICAgICAgcUM0LCBxQzYKKyAgICAgICAgVlRSTiAgICAgICAgcUM1LCBxQzcgICAgICAgIAorICAgICAgICBWU1dQICAgICAgICBkRDAsIGRENAorICAgICAgICBWU1dQICAgICAgICBkRDEsIGRENQorICAgICAgICBWU1dQICAgICAgICBkRDIsIGRENgorICAgICAgICBWU1dQICAgICAgICBkRDMsIGRENworCisgICAgICAgIAorZFlmMFU4ICAgICAgICAgIEROIFlUUjAqMi5VOAorZFlmMVU4ICAgICAgICAgIEROIFlUUjEqMi5VOAorZFlmMlU4ICAgICAgICAgIEROIFlUUjIqMi5VOAorZFlmM1U4ICAgICAgICAgIEROIFlUUjMqMi5VOAorZFlmNFU4ICAgICAgICAgIEROIFlUUjQqMi5VOAorZFlmNVU4ICAgICAgICAgIEROIFlUUjUqMi5VOAorZFlmNlU4ICAgICAgICAgIEROIFlUUjYqMi5VOAorZFlmN1U4ICAgICAgICAgIEROIFlUUjcqMi5VOAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEbyBzYXR1cmF0aW9uIGlmIG91dHNpemUgaXMgb3RoZXIgdGhhbiBTMTYKKyAgICAgICAgOy8vCisgICAgICAgIAorICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQorICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbMC0yNTVdCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYwVTgsIHFZZjAKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjFVOCwgcVlmMQorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMlU4LCBxWWYyCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYzVTgsIHFZZjMKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjRVOCwgcVlmNAorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNVU4LCBxWWY1CisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY2VTgsIHFZZjYKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjdVOCwgcVlmNworICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKKyAgICAgICAgICAgIDsvLyBPdXRwdXQgcmFuZ2UgWy0yNTYgdG8gKzI1NV0KKyAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMCwgcVlmMCwgIzE2LTkKKyAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMSwgcVlmMSwgIzE2LTkKKyAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMiwgcVlmMiwgIzE2LTkKKyAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMywgcVlmMywgIzE2LTkKKyAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNCwgcVlmNCwgIzE2LTkKKyAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNSwgcVlmNSwgIzE2LTkKKyAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNiwgcVlmNiwgIzE2LTkKKyAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNywgcVlmNywgIzE2LTkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQorICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQorICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQorICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQorICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQorICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQorICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQorICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQorICAgICAgICBFTkRJRgorCisgICAgICAgIDsvLyBTdG9yZSBvdXRwdXQgZGVwZW5kaW5nIG9uIHRoZSBTdHJpZGUgc2l6ZQorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBWU1QxICAgICAgICBxWWYwLCBbcERlc3QgQDY0XSwgU3RyaWRlCisgICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgU3RyaWRlCisgICAgICAgICAgICBWU1QxICAgICAgICBxWWYyLCBbcERlc3QgQDY0XSwgU3RyaWRlCisgICAgICAgICAgICBWU1QxICAgICAgICBxWWYzLCBbcERlc3QgQDY0XSwgU3RyaWRlCisgICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgU3RyaWRlCisgICAgICAgICAgICBWU1QxICAgICAgICBxWWY1LCBbcERlc3QgQDY0XSwgU3RyaWRlCisgICAgICAgICAgICBWU1QxICAgICAgICBxWWY2LCBbcERlc3QgQDY0XSwgU3RyaWRlCisgICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XSAgICAgICAgICAgIAorICAgICAgICBFTFNFCisgICAgICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjBVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMVU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYyVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjNVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNFU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY1VTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjZVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmN1U4LCBbcERlc3QgQDY0XQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgIDsvLyAoIiRvdXRzaXplIj0iczkiKSBvciAoIiRvdXRzaXplIj0iczE2IikKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYwLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMSwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYzLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNCwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY2LCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNywgW3BEZXN0IEA2NF0KKyAgICAgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkRJRgorCisKKworICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKworCisKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgOy8vIFNjYWxlIFRXTyBpbnB1dCByb3dzIHdpdGggVFdPIHJvd3Mgb2YgMTYgYml0IHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCBieSBNX0lEQ1RfUFJFU0NBTEUxNiB0byBwcmUtc2NhbGUgb25lIHJvdworICAgICAgICA7Ly8gaW5wdXQgKEVpZ2h0IGlucHV0IHZhbHVlcykgd2l0aCBvbmUgcm93IG9mIHNjYWxlIHZhbHVlcy4gQWxzbyAKKyAgICAgICAgOy8vIExvYWRzIG5leHQgc2NhbGUgdmFsdWVzIGZyb20gcFNjYWxlLCBpZiAkTGFzdFJvdyBmbGFnIGlzIG5vdCBzZXQuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4KKyAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgorICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCisgICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4rMQorICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBuZXh0IHJvdyBvZiBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vIHFUMGxvICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBxVDBoaSAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gcVQxbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIHFUMWhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBkU2NhbGUxbG8gICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgorICAgICAgICA7Ly8gZFNjYWxlMWhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4KKyAgICAgICAgOy8vIGRTY2FsZTJsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vIGRTY2FsZTJoaSAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBGbGFnCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJExhc3RSb3cgICAgICAgIC0gRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGN1cnJlbnQgcm93IGlzIGxhc3Qgcm93CisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkZEFsbyAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAoZmlyc3QgZm91ciBTMTYgb2Ygcm93IG4pCisgICAgICAgIDsvLyAkZEFoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbikKKyAgICAgICAgOy8vICRkQmxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbisxKQorICAgICAgICA7Ly8gJGRCaGkgICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKG5leHQgZm91ciBTMTYgb2Ygcm93IG4rMSkKKyAgICAgICAgOy8vIHFTY2FsZTEgICAgICAgICAtIFNjYWxlIHZhbHVlcyBmb3IgbmV4dCByb3cKKyAgICAgICAgOy8vIHFTY2FsZTIgICAgICAgICAtIFNjYWxlIHZhbHVlcyBmb3IgbmV4dCByb3crMQorICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBuZXh0IHJvdyBvZiBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fSURDVF9TQ0FMRTE2ICRkQWxvLCAkZEFoaSwgJGRCbG8sICRkQmhpLCAkTGFzdFJvdworICAgICAgICBWTVVMTCAgICAgICBxVDBsbywgJGRBbG8sIGRTY2FsZTFsbworICAgICAgICBWTVVMTCAgICAgICBxVDBoaSwgJGRBaGksIGRTY2FsZTFoaQorICAgICAgICBWTVVMTCAgICAgICBxVDFsbywgJGRCbG8sIGRTY2FsZTJsbworICAgICAgICBWTVVMTCAgICAgICBxVDFoaSwgJGRCaGksIGRTY2FsZTJoaQorICAgICAgICBJRiAiJExhc3RSb3ciPSIwIgorICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzEKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTIsIFtwU2NhbGVdLCAjMTYgIDsvLyBMb2FkIHNjYWxlIGZvciByb3cgbisyCisgICAgICAgIEVORElGCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRBbG8sIHFUMGxvLCAjMTIgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICAgICRkQWhpLCBxVDBoaSwgIzEyICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEJsbywgcVQxbG8sICMxMiAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRCaGksIHFUMWhpLCAjMTIgICAgICAgIAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAxNiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCisgICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIHFYaW4gICAgICAgICAgICAtIG4gdGggb3V0cHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2CisgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTEsIFtwU2NhbGVdLCAjMTYgICAgICA7Ly8gTG9hZCBQcmUgc2NhbGUgZm9yIHJvdyAwCisgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTIsIFtwU2NhbGVdLCAjMTYgICAgICA7Ly8gTG9hZCBQcmUgc2NhbGUgZm9yIHJvdyAwCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajBsbywgZFhqMGhpLCBkWGoxbG8sIGRYajFoaSwgMCAgICAgICAgOy8vIFByZSBzY2FsZSByb3cgMCAmIDEKKyAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMmxvLCBkWGoyaGksIGRYajNsbywgZFhqM2hpLCAwICAgICAgICAKKyAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqNGxvLCBkWGo0aGksIGRYajVsbywgZFhqNWhpLCAwICAgICAgICAKKyAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqNmxvLCBkWGo2aGksIGRYajdsbywgZFhqN2hpLCAxICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgcVhpNSwgcVhqMSwgcVhqNyAgICAgICAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVhpNiwgcVhqMSwgcVhqNyAgICAgICAgICAgIDsvLyBqMS1qNworICAgICAgICBMRFIgICAgICAgICBwU3JjLCA9YXJtQ09NTV9JRENUQ29lZiA7Ly8gQWRkcmVzcyBvZiBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCisgICAgICAgIFZIQUREICAgICAgIHFYaTMsIHFYajIsIHFYajYgICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFYaTIsIHFYajIsIHFYajYgICAgICAgICAgICA7Ly8gajItajYKKyAgICAgICAgVkxEUiAgICAgICAgZENvZWZzLCBbcFNyY10gICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgVkhBREQgICAgICAgcVhpNywgcVhqNSwgcVhqMyAgICAgICAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVhpNCwgcVhqNSwgcVhqMyAgICAgICAgICAgIDsvLyBqNS1qMworICAgICAgICBNRU5EICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTY2FsZSA4eDggYmxvY2sgaW5wdXQgdmFsdWVzIHdpdGggMzIgYml0IHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBwcmUtc2NhbGUgYmxvY2sgb2YgOHg4IGlucHV0LgorICAgICAgICA7Ly8gVGhpcyBhbHNvIGRvIHRoZSBJc3Qgc3RhZ2UgdHJhbnNmb3JtYXRpb25zIG9mIElEQ1QuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIGRYam5sbyAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gZFhqbmhpICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIHFYam4gICAgICAgICAgICAtIG4gdGggaW5wdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gMzJiaXQgc2NhbGUgdmFsdWVzIGluIFEyMyBmb3JtYXQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIGRYaW5sbyAgICAgICAgICAtIG4gdGggb3V0cHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8gZFhpbmhpICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCitxU2NhbGUwbG8gICAgICAgUU4gMC5TMzIKK3FTY2FsZTBoaSAgICAgICBRTiAxLlMzMgorcVNjYWxlMWxvICAgICAgIFFOIDIuUzMyCitxU2NhbGUxaGkgICAgICAgUU4gMy5TMzIKK3FTY2FsZTJsbyAgICAgICBRTiBxU2NhbGUxbG8KK3FTY2FsZTJoaSAgICAgICBRTiBxU2NhbGUxaGkKK3FTY2FsZTNsbyAgICAgICBRTiBxU2NhbGUxbG8KK3FTY2FsZTNoaSAgICAgICBRTiBxU2NhbGUxaGkKK3FTY2FsZTRsbyAgICAgICBRTiBxU2NhbGUxbG8KK3FTY2FsZTRoaSAgICAgICBRTiBxU2NhbGUxaGkKK3FTY2FsZTVsbyAgICAgICBRTiBxU2NhbGUwbG8KK3FTY2FsZTVoaSAgICAgICBRTiBxU2NhbGUwaGkKK3FTY2FsZTZsbyAgICAgICBRTiBxU2NhbGUwbG8KK3FTY2FsZTZoaSAgICAgICBRTiBxU2NhbGUwaGkKK3FTY2FsZTdsbyAgICAgICBRTiBxU2NhbGUwbG8KK3FTY2FsZTdoaSAgICAgICBRTiBxU2NhbGUwaGkKKworcVNyYzBsbyAgICAgICAgIFFOIDQuUzMyCitxU3JjMGhpICAgICAgICAgUU4gNS5TMzIKK3FTcmMxbG8gICAgICAgICBRTiA2LlMzMgorcVNyYzFoaSAgICAgICAgIFFOIFNyYzQuUzMyCitxU3JjMmxvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzJoaSAgICAgICAgIFFOIHFTcmMwaGkKK3FTcmMzbG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjM2hpICAgICAgICAgUU4gcVNyYzBoaQorcVNyYzRsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmM0aGkgICAgICAgICBRTiBxU3JjMGhpCitxU3JjNWxvICAgICAgICAgUU4gcVNyYzFsbworcVNyYzVoaSAgICAgICAgIFFOIHFTcmMxaGkKK3FTcmM2bG8gICAgICAgICBRTiBxU3JjMWxvCitxU3JjNmhpICAgICAgICAgUU4gcVNyYzFoaQorcVNyYzdsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmM3aGkgICAgICAgICBRTiBxU3JjMGhpCisKK3FSZXMxN2xvICAgICAgICBRTiBxU2NhbGUwbG8KK3FSZXMxN2hpICAgICAgICBRTiBxU2NhbGUwaGkKK3FSZXMyNmxvICAgICAgICBRTiBxU2NhbGUwbG8KK3FSZXMyNmhpICAgICAgICBRTiBxU2NhbGUwaGkKK3FSZXM1M2xvICAgICAgICBRTiBxU2NhbGUwbG8KK3FSZXM1M2hpICAgICAgICBRTiBxU2NhbGUwaGkKKworICAgICAgICAgICAgQUREICAgICAgICAgcFRlbXAsIHBTY2FsZSwgIzQqOCo3ICAgICAgICAgICA7Ly8gQWRkcmVzcyBvZiAgcFNjYWxlWzddCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDsvLyBSb3cgMAorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTBsbywgcVNjYWxlMGhpfSwgW3BTY2FsZV0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMGxvLCBkWGowbG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwaGksIGRYajBoaSwgIygxMi0xKSAgICAgICAgICAgIAorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTFsbywgcVNjYWxlMWhpfSwgW3BTY2FsZV0hCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMGxvLCBxU2NhbGUwbG8sIHFTcmMwbG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwaGksIHFTY2FsZTBoaSwgcVNyYzBoaQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTdsbywgcVNjYWxlN2hpfSwgW3BUZW1wXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMxbG8sIGRYajFsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFoaSwgZFhqMWhpLCAjKDEyLTEpICAgICAgICAgICAgCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkwbG8sIHFTcmMwbG8gICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTAKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBoaSwgcVNyYzBoaQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzdsbywgZFhqN2xvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2hpLCBkWGo3aGksICMoMTItMSkKKyAgICAgICAgICAgIFNVQiAgICAgICAgIHBUZW1wLCBwVGVtcCwgIygoMTYqMikrKDQqOCoxKSkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMxbG8sIHFTY2FsZTFsbywgcVNyYzFsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFoaSwgcVNjYWxlMWhpLCBxU3JjMWhpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjN2xvLCBxU2NhbGU3bG8sIHFTcmM3bG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3aGksIHFTY2FsZTdoaSwgcVNyYzdoaQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTJsbywgcVNjYWxlMmhpfSwgW3BTY2FsZV0hCisKKyAgICAgICAgICAgIDsvLyBSb3cgMSAmIDcKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMxN2xvLCBxU3JjMWxvLCBxU3JjN2xvICAgICAgOy8vIChqMStqNykvMgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk1bG8sIHFSZXMxN2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTUKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVoaSwgcVJlczE3aGkgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gajEtajcKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMxN2hpLCBxU3JjMWhpLCBxU3JjN2hpICAgICAgOy8vIGoxLWo3CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk2bG8sIHFSZXMxN2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTYKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZoaSwgcVJlczE3aGkgICAgICAKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMybG8sIGRYajJsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJoaSwgZFhqMmhpLCAjKDEyLTEpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNmxvLCBxU2NhbGU2aGl9LCBbcFRlbXBdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzZsbywgZFhqNmxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmhpLCBkWGo2aGksICMoMTItMSkKKyAgICAgICAgICAgIFNVQiAgICAgICAgIHBUZW1wLCBwVGVtcCwgIygoMTYqMikrKDQqOCoxKSkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMybG8sIHFTY2FsZTJsbywgcVNyYzJsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJoaSwgcVNjYWxlMmhpLCBxU3JjMmhpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNmxvLCBxU2NhbGU2bG8sIHFTcmM2bG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2aGksIHFTY2FsZTZoaSwgcVNyYzZoaQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTNsbywgcVNjYWxlM2hpfSwgW3BTY2FsZV0hCisKKyAgICAgICAgICAgIDsvLyBSb3cgMiAmIDYKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMyNmxvLCBxU3JjMmxvLCBxU3JjNmxvICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkzbG8sIHFSZXMyNmxvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTMKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNoaSwgcVJlczI2aGkgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gajItajYKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMyNmhpLCBxU3JjMmhpLCBxU3JjNmhpICAgICAgOy8vIGoyLWo2CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkybG8sIHFSZXMyNmxvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJoaSwgcVJlczI2aGkgICAgICAKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMzbG8sIGRYajNsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNoaSwgZFhqM2hpLCAjKDEyLTEpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNWxvLCBxU2NhbGU1aGl9LCBbcFRlbXBdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzVsbywgZFhqNWxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWhpLCBkWGo1aGksICMoMTItMSkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMzbG8sIHFTY2FsZTNsbywgcVNyYzNsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNoaSwgcVNjYWxlM2hpLCBxU3JjM2hpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNWxvLCBxU2NhbGU1bG8sIHFTcmM1bG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1aGksIHFTY2FsZTVoaSwgcVNyYzVoaQorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gUm93IDMgJiA1CisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzNTNsbywgcVNyYzVsbywgcVNyYzNsbyAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIChqNStqMykvMgorICAgICAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzE2KjIqMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpN2xvLCBxUmVzNTNsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk3CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3aGksIHFSZXM1M2hpICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIGo1LWozCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzNTNoaSwgcVNyYzVoaSwgcVNyYzNoaSAgICAgIDsvLyBqNS1qMworICAgICAgICAgICAgVkxEMSAgICAgICAgcVhqNCwgW3BTcmMgQDY0XQorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNGxvLCBxUmVzNTNsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk0CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0aGksIHFSZXM1M2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNGxvLCBkWGo0bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0aGksIGRYajRoaSwgIygxMi0xKQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTRsbywgcVNjYWxlNGhpfSwgW3BTY2FsZV0gICAgICAgICAgICAKKyAgICAgICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmICAgICA7Ly8gQWRkcmVzcyBvZiBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNGxvLCBxU2NhbGU0bG8sIHFTcmM0bG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0aGksIHFTY2FsZTRoaSwgcVNyYzRoaQorICAgICAgICAgICAgVkxEUiAgICAgICAgZENvZWZzLCBbcFNyY10gICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCisgICAgICAgICAgICA7Ly8gUm93IDQKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTFsbywgcVNyYzRsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMQorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWhpLCBxU3JjNGhpICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MTExOGZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5CisgKi8KKyAKKworCisjaWZuZGVmIF9BUk1DT01NX01BU0tUQUJMRV9IXworI2RlZmluZSBfQVJNQ09NTV9NQVNLVEFCTEVfSF8KKworI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCisgIAorLyogTWFzayB0YWJsZSAqLworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX1ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MWIzZTFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX1ZlcnNpb24uaApAQCAtMCwwICsxLDQzIEBACisvKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLworI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKworCisvKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCisjZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgorCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KKyNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCisjZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKKworLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KKyNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKKworCisvKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLworI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworCisjaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCisKKworLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCisvKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLworCisvKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLworI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjFwMC0wMGJldDAiCisKKy8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLworI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQVJNIEFyY2hpdGVjdHVyZSBWNyB3aXRoIE5FT04iCisKKy8qIFRoZSBBUk0gVG9vbGNoYWluIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLworI2RlZmluZSBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiAgICAiQVJNIFJWQ1QgMy4xIgorCisKKyNlbmRpZiAvKiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5NTZiZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fcy5oCkBAIC0wLDAgKzEsMTE1NyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtQ09NTV9zLmgKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIGNvbW1vbiBoZWFkZXIgZmlsZQorOy8vCisKKzsvLyBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uCisgSUYgOkxOT1Q6OkRFRjpBUk1DT01NX1NfSAorIEdCTEwgQVJNQ09NTV9TX0gKKworICAgICAgICBSRVFVSVJFOCAgICAgICAgICAgIDsvLyBSZXF1aXJlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50CisgICAgICAgIFBSRVNFUlZFOCAgICAgICAgICAgOy8vIFByZXNlcnZlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50CisgICAgICAgIAorICAgICAgICBHQkxMICAgIEFSTV9FUlJPUkNIRUNLCitBUk1fRVJST1JDSEVDSyAgU0VUTCB7RkFMU0V9CisKKzsvLyBHbG9iYWxzCisKKyAgICAgICAgR0JMUyAgICBfUlJlZ0xpc3QgICA7Ly8gUiBzYXZlZCByZWdpc3RlciBsaXN0CisgICAgICAgIEdCTFMgICAgX0RSZWdMaXN0ICAgOy8vIEQgc2F2ZWQgcmVnaXN0ZXIgbGlzdAorICAgICAgICBHQkxTICAgIF9WYXJpYW50ICAgIDsvLyBTZWxlY3RlZCBwcm9jZXNzb3IgdmFyaWFudAorICAgICAgICBHQkxTICAgIF9DUFUgICAgICAgIDsvLyBDUFUgbmFtZQorICAgICAgICBHQkxTICAgIF9TdHJ1Y3QgICAgIDsvLyBTdHJ1Y3R1cmUgbmFtZQorICAgICAgICAKKyAgICAgICAgR0JMTCAgICBfSW5GdW5jICAgICA7Ly8gSW5zaWRlIGZ1bmN0aW9uIGFzc2VtYmx5IGZsYWcKKyAgICAgICAgR0JMTCAgICBfU3dMb25nICAgICA7Ly8gTG9uZyBzd2l0Y2ggZmxhZworICAgICAgICAKKyAgICAgICAgR0JMQSAgICBfUkJ5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHJlZ2lzdGVyIGJ5dGVzIG9uIHN0YWNrCisgICAgICAgIEdCTEEgICAgX1NCeXRlcyAgICAgOy8vIE51bWJlciBvZiBzY3JhdGNoIGJ5dGVzIG9uIHN0YWNrIAorICAgICAgICBHQkxBICAgIF9BQnl0ZXMgICAgIDsvLyBTdGFjayBvZmZzZXQgb2YgbmV4dCBhcmd1bWVudAorICAgICAgICBHQkxBICAgIF9Xb3Jrc3BhY2UgIDsvLyBTdGFjayBvZmZzZXQgb2Ygc2NyYXRjaCB3b3Jrc3BhY2UKKyAgICAgICAgR0JMQSAgICBfRiAgICAgICAgICA7Ly8gRnVuY3Rpb24gbnVtYmVyCisgICAgICAgIEdCTEEgICAgX1N0T2ZmICAgICAgOy8vIFN0cnVjdCBvZmZzZXQKKyAgICAgICAgR0JMQSAgICBfU3dOdW0gICAgICA7Ly8gU3dpdGNoIG51bWJlcgorICAgICAgICBHQkxTICAgIF8zMiAgICAgICAgIDsvLyBTdWZmaXggZm9yIDMyIGJ5dGUgYWxpZ25tbmV0CisgICAgICAgIEdCTFMgICAgXzE2ICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMTYgYnl0ZSBhbGlnbm1uZXQKKyAgICAgICAgCitfSW5GdW5jICAgICAgICAgU0VUTCAgICB7RkFMU0V9CitfU0J5dGVzICAgICAgICAgU0VUQSAgICAwCitfRiAgICAgICAgICAgICAgU0VUQSAgICAwCitfU3dOdW0gICAgICAgICAgU0VUQSAgICAwCitfMzIgICAgICAgICAgICAgU0VUUyAgICAiQUxJR04zMiIKK18xNiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjE2IgorCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gT3ZlcnJpZGUgdGhlIHRvb2xzIHNldHRpbmdzIG9mIHRoZSBDUFUgaWYgdGhlICNkZWZpbmUKKzsvLyBVU0VDUFUgaXMgc2V0LCBvdGhlcndpc2UgdXNlIHRoZSBDUFUgZGVmaW5lZCBieSB0aGUKKzsvLyBhc3NlbWJsZXIgc2V0dGluZ3MuCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICBJRiA6REVGOiBPVkVSUklERUNQVQorX0NQVSAgICAgICBTRVRTICBPVkVSUklERUNQVQorICAgICAgIEVMU0UKK19DUFUgICAgICAgU0VUUyAgICB7Q1BVfSAgICAgICAKKyAgICAgICBFTkRJRgorCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFdvcmsgb3V0IHdoaWNoIGNvZGUgdG8gYnVpbGQKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBJRiA6REVGOkFSTTExMzZKUzpMT1I6OkRFRjpDb3J0ZXhBODpMT1I6OkRFRjpBUk1fR0VORVJJQworICAgICAgICAgICAgSU5GTyAxLCJQbGVhc2Ugc3dpdGNoIHRvIHVzaW5nIE1fVkFSSUFOVFMiCisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIERlZmluZSBhbmQgcmVzZXQgYWxsIG9mZmljaWFsbHkgcmVjb25nbmlzZWQgdmFyaWFudHMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTkyNkVKUworICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlMKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNMTEzNkpTX1UKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQ29ydGV4QTgKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNN1RETUkKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREVGX1ZBUklBTlQgJHZhcgorICAgICAgICBHQkxMICR2YXIKKyAgICAgICAgR0JMTCBfb2skdmFyCiskdmFyICAgIFNFVEwge0ZBTFNFfQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisKKyAgICAgICAgOy8vIFZhcmlhbnQgZGVjbGFyYXRpb24KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWZpbmUgYSBsaXN0IG9mIGNvZGUgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgICAgOy8vIHNvdXJjZSBmaWxlLiBUaGlzIG1hY3JvIHRoZW4gY2hvb3NlcyB0aGUgbW9zdAorICAgICAgICA7Ly8gYXBwcm9wcmlhdGUgdmFyaWFudCB0byBidWlsZCBmb3IgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkCisgICAgICAgIDsvLyBjb3JlLgorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX1ZBUklBTlRTICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHRvIFRSVUUgdmFyaWFudHMgdGhhdCBhcmUgc3VwcG9ydGVkCisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBfTV9WQVJJQU5UICR2MAorICAgICAgICBfTV9WQVJJQU5UICR2MQorICAgICAgICBfTV9WQVJJQU5UICR2MgorICAgICAgICBfTV9WQVJJQU5UICR2MworICAgICAgICBfTV9WQVJJQU5UICR2NAorICAgICAgICBfTV9WQVJJQU5UICR2NQorICAgICAgICBfTV9WQVJJQU5UICR2NgorICAgICAgICBfTV9WQVJJQU5UICR2NworICAgICAgICAKKyAgICAgICAgOy8vIExvb2sgZm9yIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IHRvIG1hdGNoIGEgQ1BVCisgICAgICAgIDsvLyBfTV9UUlkgY3B1LCB2YXJpYW50IGZhbGwgYmFjayBsaXN0CitfVmFyaWFudCBTRVRTICIiICAgICAgICAgICAgICAgIAorICAgICAgICBfTV9UUlkgQVJNOTI2RUotUywgICBBUk05MjZFSlMKKyAgICAgICAgX01fVFJZIEFSTTExNzZKWi1TLCAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTc2SlpGLVMsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTE1NlQyLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExNTZUMkYtUywgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTM2Si1TLCAgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTEzNkpGLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIE1QQ29yZSwgICAgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBmYWxjb24tdmZwLCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIGZhbGNvbi1mdWxsLW5lb24sIENvcnRleEE4CisgICAgICAgIF9NX1RSWSBDb3J0ZXgtQThOb05lb24sIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQ29ydGV4LUE4LCAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBDb3J0ZXgtUjQsICAgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNN1RETUkKKyAgICAgICAgCisgICAgICAgIDsvLyBTZWxlY3QgdGhlIGNvcnJlY3QgdmFyaWFudAorICAgICAgICBfTV9ERUZfVkFSSUFOVFMKKyAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKKyAgICAgICAgICAgIElORk8gMSwgIk5vIG1hdGNoIGZvdW5kIGZvciBDUFUgJyRfQ1BVJyIKKyAgICAgICAgRUxTRQorJF9WYXJpYW50ICAgU0VUTCB7VFJVRX0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFJlZ2lzdGVyIGEgdmFyaWFudCBhcyBhdmFpbGFibGUKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fVkFSSUFOVCAkdmFyCisgICAgICAgIElGICIkdmFyIj0iIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgOkxOT1Q6OkRFRjpfb2skdmFyCisgICAgICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgdmFyaWFudCAnJHZhciciCisgICAgICAgIEVORElGCiskdmFyICAgIFNFVEwge1RSVUV9CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBGb3IgYSBnaXZlbiBDUFUsIHNlZSBpZiBhbnkgb2YgdGhlIHZhcmlhbnRzIHN1cHBvcnRpbmcKKyAgICAgICAgOy8vIHRoaXMgQ1BVIGFyZSBhdmFpbGFibGUuIFRoZSBmaXJzdCBhdmFpbGFibGUgdmFyaWFudCBpcworICAgICAgICA7Ly8gY2hvc2VuCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1RSWSAkY3B1LCAkdjAsJHYxLCR2MiwkdjMsJHY0LCR2NSwkdjYsJHY3CisgICAgICAgIElGICIkY3B1Ijw+X0NQVQorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgX01fVFJZMSAkdjAKKyAgICAgICAgX01fVFJZMSAkdjEKKyAgICAgICAgX01fVFJZMSAkdjIKKyAgICAgICAgX01fVFJZMSAkdjMKKyAgICAgICAgX01fVFJZMSAkdjQKKyAgICAgICAgX01fVFJZMSAkdjUKKyAgICAgICAgX01fVFJZMSAkdjYKKyAgICAgICAgX01fVFJZMSAkdjcKKyAgICAgICAgOy8vIENoZWNrIGEgbWF0Y2ggd2FzIGZvdW5kCisgICAgICAgIElGIF9WYXJpYW50PSIiCisgICAgICAgICAgICBJTkZPIDEsICJObyB2YXJpYW50IG1hdGNoIGZvdW5kIGZvciBDUFUgJyRfQ1BVJyIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fVFJZMSAkdmFyCisgICAgICAgIElGICIkdmFyIj0iIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgKF9WYXJpYW50PSIiKTpMQU5EOiR2YXIKK19WYXJpYW50IFNFVFMgIiR2YXIiCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIERlY2xhcmUgYSBzdHJ1Y3R1cmUgb2YgZ2l2ZW4gbmFtZQorICAgICAgICBNQUNSTworICAgICAgICBNX1NUUlVDVCAkc25hbWUKK19TdHJ1Y3QgU0VUUyAiJHNuYW1lIgorX1N0T2ZmICBTRVRBIDAKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIERlY2xhcmUgYSBzdHJ1Y3R1cmUgZmllbGQKKyAgICAgICAgOy8vIFRoZSBmaWVsZCBpcyBjYWxsZWQgJHNuYW1lXyRmbmFtZQorICAgICAgICA7Ly8gJHNpemUgICA9IHRoZSBzaXplIG9mIGVhY2ggZW50cnksIG11c3QgYmUgcG93ZXIgb2YgMiAKKyAgICAgICAgOy8vICRudW1iZXIgPSAoaWYgcHJvdmlkZWQpIHRoZSBudW1iZXIgb2YgZW50cmllcyBmb3IgYW4gYXJyYXkKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9GSUVMRCAkZm5hbWUsICRzaXplLCAkbnVtYmVyCisgICAgICAgIElGIChfU3RPZmY6QU5EOigkc2l6ZS0xKSkhPTAKK19TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgKCRzaXplIC0gKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSkKKyAgICAgICAgRU5ESUYKKyRfU3RydWN0Ll8kZm5hbWUgRVFVIF9TdE9mZgorICAgICAgICBJRiAiJG51bWJlciI8PiIiCitfU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplKiRudW1iZXIKKyAgICAgICAgRUxTRQorX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAkc2l6ZQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9FTkRTVFJVQ1QKK3NpemVvZl8kX1N0cnVjdCBFUVUgX1N0T2ZmCitfU3RydWN0IFNFVFMgIiIKKyAgICAgICAgTUVORAorCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFN3aXRjaCBhbmQgdGFibGUgbWFjcm9zCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBTdGFydCBhIHJlbGF0aXZlIHN3aXRjaCB0YWJsZSB3aXRoIHJlZ2lzdGVyIHRvIHN3aXRjaCBvbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICR2ID0gdGhlIHJlZ2lzdGVyIHRvIHN3aXRjaCBvbgorICAgICAgICA7Ly8gJHMgPSBpZiBzcGVjaWZpZWQgbXVzdCBiZSAiTCIgdG8gaW5kaWNhdGUgbG9uZworICAgICAgICA7Ly8gICAgICB0aGlzIGFsbG93cyBhIGdyZWF0ZXIgcmFuZ2UgdG8gdGhlIGNhc2UgY29kZQorICAgICAgICBNQUNSTworICAgICAgICBNX1NXSVRDSCAkdiwgJHMKKyAgICAgICAgQVNTRVJUICIkcyI9IiI6TE9SOiIkcyI9IkwiCitfU3dMb25nIFNFVEwge0ZBTFNFfQorICAgICAgICBJRiAiJHMiPSJMIgorX1N3TG9uZyAgICAgU0VUTCB7VFJVRX0KKyAgICAgICAgRU5ESUYKK19Td051bSAgU0VUQSBfU3dOdW0rMSAgICAgICAgCisgICAgICAgIElGIHtDT05GSUd9PTE2CisgICAgICAgICAgICA7Ly8gVGh1bWIKKyAgICAgICAgICAgIElGIF9Td0xvbmcKKyAgICAgICAgICAgICAgICBUQkggW3BjLCAkdiwgTFNMIzFdCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgVEJCIFtwYywgJHZdCisgICAgICAgICAgICBFTkRJRgorX1N3aXRjaCRfU3dOdW0KKyAgICAgICAgRUxTRQorICAgICAgICAgICAgOy8vIEFSTQorICAgICAgICAgICAgQUREIHBjLCBwYywgJHYsIExTTCAjMgorICAgICAgICAgICAgTk9QCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBBZGQgYSBjYXNlIHRvIHRoZSBzd2l0Y2ggc3RhdGVtZW50CisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQ0FTRSAgJGxhYmVsCisgICAgICAgIElGIHtDT05GSUd9PTE2CisgICAgICAgICAgICA7Ly8gVGh1bWIKKyAgICAgICAgICAgIElGIF9Td0xvbmcKKyAgICAgICAgICAgICAgICBEQ1cgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgRENCICgkbGFiZWwgLSBfU3dpdGNoJF9Td051bSkvMgorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgOy8vIEFSTQorICAgICAgICAgICAgQiAgICRsYWJlbAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gRW5kIG9mIHN3aXRjaCBzdGF0ZW1lbnQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9FTkRTV0lUQ0gKKyAgICAgICAgQUxJR04gMgorICAgICAgICBNRU5EICAgICAgIAorCisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIERhdGEgYXJlYSBhbGxvY2F0aW9uCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gQ29uc3RhbnQgdGFibGUgYWxsb2NhdG9yIG1hY3JvCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ3JlYXRlcyBhIG5ldyBzZWN0aW9uIGZvciBlYWNoIGNvbnN0YW50IHRhYmxlCisgICAgICAgIDsvLyAkbmFtZSBpcyBzeW1ib2wgdGhyb3VnaCB3aGljaCB0aGUgdGFibGUgY2FuIGJlIGFjY2Vzc2VkLgorICAgICAgICA7Ly8gJGFsaWduIGlzIHRoZSBvcHRpb25hbCBhbGlnbm1lbnQgb2YgdGhlIHRhYmxlLCBsb2cyIG9mIAorICAgICAgICA7Ly8gIHRoZSBieXRlIGFsaWdubWVudCAtICRhbGlnbj00IGlzIDE2IGJ5dGUgYWxpZ25lZAorICAgICAgICBNQUNSTworICAgICAgICBNX1RBQkxFICAkbmFtZSwgJGFsaWduCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGICIkYWxpZ24iPSIiCisgICAgICAgICAgICBBUkVBIHwuY29uc3RkYXRhfCwgUkVBRE9OTFksIERBVEEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgOy8vIEFSRUFzIGluaGVyaXQgdGhlIGFsaWdubWVudCBvZiB0aGUgZmlyc3QgZGVjbGFyYXRpb24uCisgICAgICAgICAgICA7Ly8gVGhlcmVmb3JlIGZvciBlYWNoIGFsaWdubWVudCBzaXplIHdlIG11c3QgaGF2ZSBhbiBhcmVhCisgICAgICAgICAgICA7Ly8gb2YgYSBkaWZmZXJlbnQgbmFtZS4KKyAgICAgICAgICAgIEFSRUEgY29uc3RkYXRhX2EkYWxpZ24sIFJFQURPTkxZLCBEQVRBLCBBTElHTj0kYWxpZ24KKyAgICAgICAgICAgIAorICAgICAgICAgICAgOy8vIFdlIGFsc28gZm9yY2UgYWxpZ25tZW50IGluY2FzZSB3ZSBhcmUgdGFnZ2luZyBvbnRvCisgICAgICAgICAgICA7Ly8gYW4gYWxyZWFkeSBzdGFydGVkIGFyZWEuCisgICAgICAgICAgICBBTElHTiAoMTw8JGFsaWduKQorICAgICAgICBFTkRJRgorJG5hbWUKKyAgICAgICAgTUVORAorICAgICAgICAKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIE1hY3JvcyB0byBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sKKzsvLworOy8vIFRoZXNlIGFsbCBhc3N1bWUgdGhhdCB0aGUgc3RhY2sgaXMgOC1ieXRlIGFsaWduZWQKKzsvLyBhdCBlbnRyeSB0byB0aGUgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIAorOy8vIDMyLWJ5dGUgYWxpZ25tZW50IG1hY3JvIG5lZWRzIHRvIHdvcmsgaW4gYQorOy8vIGJpdCBtb3JlIG9mIGEgc3BlY2lhbCB3YXkuLi4KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIAorCisKKyAgICAgICAgOy8vIEFsbG9jYXRlIDEtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzEgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgMi1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMiAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDoxKSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDIgLSAoX1NCeXRlczpBTkQ6MSkpCisgICAgICAgIEVORElGCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORAorICAgICAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA0LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0M0ICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjMpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoNCAtIChfU0J5dGVzOkFORDozKSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5ECisgICAgICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzggICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICgkc2l6ZSsxNikgYnl0ZXMuCisgICAgICAgIDsvLyBUaGUgZXh0cmEgMTYgYnl0ZXMgYXJlIGxhdGVyIHVzZWQgdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gMTYgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MxNiAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiRfMTYgICBFUVUgKF9TQnl0ZXMgKyA4KQorX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpICsgOAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzMyKSBieXRlcy4KKyAgICAgICAgOy8vIFRoZSBleHRyYSAzMiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAzMiBieXRlcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzMyICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GJF8zMiAgIEVRVSAoX1NCeXRlcyArIDI0KQorX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpICsgMjQKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQXJndW1lbnQgRGVjbGFyYXRpb24gTWFjcm8KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBBbGxvY2F0ZSBhbiBhcmd1bWVudCBuYW1lICRuYW1lCisgICAgICAgIDsvLyBzaXplICRzaXplIGJ5dGVzCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQVJHICAgICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIF9JbkZ1bmMKKyRuYW1lJF9GICAgIEVRVSBfQUJ5dGVzCitfQUJ5dGVzIFNFVEEgX0FCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gTWFjcm9zIHRvIGFjY2VzcyBzdGFja2VkIHZhcmlhYmxlcworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIE1hY3JvIHRvIHBlcmZvcm0gYSBkYXRhIHByb2Nlc3Npbmcgb3BlcmF0aW9uCisgICAgICAgIDsvLyB3aXRoIGEgY29uc3RhbnQgc2Vjb25kIG9wZXJhbmQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fT1BDICRvcCwkcmQsJHJuLCRjb25zdAorICAgICAgICBMQ0xBICAgIF9zaAorICAgICAgICBMQ0xBICAgIF9jc3QKK19zaCAgICAgU0VUQSAgICAwCitfY3N0ICAgIFNFVEEgICAgJGNvbnN0CisgICAgICAgIElGIF9jc3Q9MAorICAgICAgICAkb3AgJHJkLCAkcm4sICNfY3N0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBXSElMRSAoX2NzdDpBTkQ6Myk9MAorX2NzdCAgICAgICAgU0VUQSBfY3N0Pj4yCitfc2ggICAgICAgICBTRVRBIF9zaCsyCisgICAgICAgIFdFTkQKKyAgICAgICAgJG9wICRyZCwgJHJuLCAjKF9jc3Q6QU5EOjB4MDAwMDAwRkYpPDxfc2gKKyAgICAgICAgSUYgX2NzdD49MjU2CisgICAgICAgICAgICAkb3AgJHJkLCAkcmQsICMoX2NzdDpBTkQ6MHhGRkZGRkYwMCk8PF9zaAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIE1hY3JvIHRvIHBlcmZvcm0gYSBkYXRhIGFjY2VzcyBvcGVyYXRpb24KKyAgICAgICAgOy8vIFN1Y2ggYXMgTERSIG9yIFNUUgorICAgICAgICA7Ly8gVGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBtb2RpZmllZCBzdWNoIHRoYXQKKyAgICAgICAgOy8vIDEuIElmIG5vIGFkZHJlc3MgaXMgZ2l2ZW4gdGhlbiB0aGUgbmFtZSBpcyB0YWtlbgorICAgICAgICA7Ly8gICAgYXMgYSBzdGFjayBvZmZzZXQKKyAgICAgICAgOy8vIDIuIElmIHRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlCisgICAgICAgIDsvLyAgICBzdGF0ZSBiZWluZyBhc3NlbWJsZWQgZm9yIChlZyBUaHVtYikgdGhlbiBhIHN1aXRhYmxlCisgICAgICAgIDsvLyAgICBhZGRyZXNzaW5nIG1vZGUgaXMgc3Vic3RpdHV0ZWQuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT24gRW50cnk6CisgICAgICAgIDsvLyAkaSA9IEluc3RydWN0aW9uIHRvIHBlcmZvcm0gKGVnICJMRFJCIikKKyAgICAgICAgOy8vICRhID0gUmVxdWlyZWQgYnl0ZSBhbGlnbm1lbnQKKyAgICAgICAgOy8vICRyID0gUmVnaXN0ZXIocykgdG8gdHJhbnNmZXIgKGVnICJyMSIpCisgICAgICAgIDsvLyAkYTAsJGExLCRhMi4gQWRkcmVzc2luZyBtb2RlIGFuZCBjb25kaXRpb24uIE9uZSBvZjoKKyAgICAgICAgOy8vICAgICBsYWJlbCB7LGNjfQorICAgICAgICA7Ly8gICAgIFtiYXNlXSAgICAgICAgICAgICAgICAgICAgeywsLGNjfQorICAgICAgICA7Ly8gICAgIFtiYXNlLCBvZmZzZXRdeyF9ICAgICAgICAgeywsY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldCwgc2hpZnRdeyF9ICB7LGNjfQorICAgICAgICA7Ly8gICAgIFtiYXNlXSwgb2Zmc2V0ICAgICAgICAgICAgeywsY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQsIHNoaWZ0ICAgICB7LGNjfQorICAgICAgICBNQUNSTworICAgICAgICBfTV9EQVRBICRpLCRhLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBJRiAiJGEwIjpMRUZUOjE9IlsiCisgICAgICAgICAgICBJRiAiJGExIj0iIgorICAgICAgICAgICAgICAgICRpJGEzICAgJHIsICRhMAorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgIElGICIkYTAiOlJJR0hUOjE9Il0iCisgICAgICAgICAgICAgICAgICAgIElGICIkYTIiPSIiCisgICAgICAgICAgICAgICAgICAgICAgICBfTV9QT1NUSU5EICRpJGEzLCAiJHIiLCAkYTAsICRhMQorICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBfTV9QT1NUSU5EICRpJGEzLCAiJHIiLCAkYTAsICIkYTEsJGEyIgorICAgICAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BSRUlORCAgJGkkYTMsICIkciIsICRhMCwgJGExCisgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BSRUlORCAgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCisgICAgICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExDTEEgICAgX09mZnNldAorX09mZnNldCAgICAgU0VUQSAgICBfV29ya3NwYWNlICsgJGEwJF9GCisgICAgICAgICAgICBBU1NFUlQgIChfT2Zmc2V0OkFORDooJGEtMSkpPTAKKyAgICAgICAgICAgICRpJGExICAgJHIsIFtzcCwgI19PZmZzZXRdCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBIYW5kbGUgcG9zdCBpbmRleGVkIGxvYWQvc3RvcmVzCisgICAgICAgIDsvLyBvcCAgcmVnLCBbYmFzZV0sIG9mZnNldAorICAgICAgICBNQUNSTworICAgICAgICBfTV9QT1NUSU5EICRpLCRyLCRhMCwkYTEKKyAgICAgICAgTENMUyBfYmFzZQorICAgICAgICBMQ0xTIF9vZmZzZXQKKyAgICAgICAgSUYge0NPTkZJR309MTYgOy8vIFRodW1iCitfYmFzZSAgICAgICBTRVRTICgiJGEwIjpMRUZUOig6TEVOOiIkYTAiLTEpKTpSSUdIVDooOkxFTjoiJGEwIi0yKSAgIDsvLyByZW1vdmUgW10KK19vZmZzZXQgICAgIFNFVFMgIiRhMSIKKyAgICAgICAgICAgIElGIF9vZmZzZXQ6TEVGVDoxPSIrIgorX29mZnNldCAgICAgICAgIFNFVFMgX29mZnNldDpSSUdIVDooOkxFTjpfb2Zmc2V0LTEpCisgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgJGkgICRyLCAkYTAKKyAgICAgICAgICAgIElGIF9vZmZzZXQ6TEVGVDoxPSItIgorX29mZnNldCAgICAgICAgIFNFVFMgX29mZnNldDpSSUdIVDooOkxFTjpfb2Zmc2V0LTEpCisgICAgICAgICAgICAgICAgU1VCICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAorICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTFNFIDsvLyBBUk0KKyAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEhhbmRsZSBwcmUgaW5kZXhlZCBsb2FkL3N0b3JlCisgICAgICAgIDsvLyBvcCAgcmVnLCBbYmFzZSwgb2Zmc2V0XXshfQorICAgICAgICBNQUNSTworICAgICAgICBfTV9QUkVJTkQgJGksJHIsJGEwLCRhMQorICAgICAgICBMQ0xTIF9iYXNlCisgICAgICAgIExDTFMgX29mZnNldAorICAgICAgICBJRiAoe0NPTkZJR309MTYpOkxBTkQ6KCgiJGExIjpSSUdIVDoyKT0iXSEiKQorX2Jhc2UgICAgICAgU0VUUyAiJGEwIjpSSUdIVDooOkxFTjooIiRhMCIpLTEpCitfb2Zmc2V0ICAgICBTRVRTICIkYTEiOkxFRlQ6KDpMRU46KCIkYTEiKS0yKQorICAgICAgICAgICAgJGkgJHIsIFskX2Jhc2UsICRfb2Zmc2V0XQorICAgICAgICAgICAgQUREICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAorICAgICAgICBFTFNFCisgICAgICAgICAgICAkaSAgJHIsICRhMCwgJGExCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBieXRlIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJCICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSQiIsMSwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgc2lnbmVkIGJ5dGUgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUlNCICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJTQiIsMSwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIGJ5dGUgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJCICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSQiIsMSwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgdW5zaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJIICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgc2lnbmVkIGhhbGYgd29yZCBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSU0ggJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUlNIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgaGFsZiB3b3JkIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSSCAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUkgiLDIsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTG9hZCB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFIgICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSIiw0LCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgd29yZCB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUiAgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTG9hZCBkb3VibGUgd29yZCBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSRCAgJHIwLCRyMSwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSRCIsOCwiJHIwLCRyMSIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIGRvdWJsZSB3b3JkIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSRCAgJHIwLCRyMSwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSRCIsOCwiJHIwLCRyMSIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BRFIgICAkYSwgJGIsICRjYworICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GKQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uIGFuZCBhbGlnbiB0aGUgYWRkcmVzcyB0byAxNiBieXRlcworICAgICAgICBNQUNSTworICAgICAgICBNX0FEUjE2ICRhLCAkYiwgJGNjCisgICAgICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GJF8xNikKKyAgICAgICAgCisgICAgICAgICAgICA7Ly8gTm93IGFsaWduICRhIHRvIDE2IGJ5dGVzCisgICAgICAgICAgICBCSUMkY2MgICRhLCRhLCMweDBGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDMyIGJ5dGVzCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQURSMzIgJGEsICRiLCAkY2MKKyAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzMyKQorICAgICAgICAKKyAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMzIgYnl0ZXMKKyAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MUYKKyAgICAgICAgTUVORAorCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIEZ1bmN0aW9uIGhlYWRlciBhbmQgZm9vdGVyIG1hY3JvcworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBIZWFkZXIgTWFjcm8gICAgCisgICAgICAgIDsvLyBHZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlCisgICAgICAgIDsvLyBOb3RlIHRoYXQgZnVuY3Rpb25zIHNob3VsZCBhbGwgYmUgInN0YWNrLW1vdmVzLW9uY2UiCisgICAgICAgIDsvLyBUaGUgRk5TVEFSVCBhbmQgRk5FTkQgbWFjcm9zIHNob3VsZCBiZSB0aGUgb25seSBwbGFjZXMKKyAgICAgICAgOy8vIHdoZXJlIHRoZSBzdGFjayBtb3Zlcy4KKyAgICAgICAgOy8vICAgIAorICAgICAgICA7Ly8gJG5hbWUgID0gZnVuY3Rpb24gbmFtZQorICAgICAgICA7Ly8gJHJyZWcgID0gIiIgICBkb24ndCBzdGFjayBhbnkgcmVnaXN0ZXJzCisgICAgICAgIDsvLyAgICAgICAgICAibHIiIHN0YWNrICJsciIgb25seQorICAgICAgICA7Ly8gICAgICAgICAgInJOIiBzdGFjayByZWdpc3RlcnMgInI0LXJOLGxyIgorICAgICAgICA7Ly8gJGRyZWcgID0gIiIgICBkb24ndCBzdGFjayBhbnkgRCByZWdpc3RlcnMKKyAgICAgICAgOy8vICAgICAgICAgICJkTiIgc3RhY2sgcmVnaXN0ZXJzICJkOC1kTiIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBOb3RlOiBBUk0gQXJjaGljdHVyZSBwcm9jZWR1cmUgY2FsbCBzdGFuZGFyZCBBQVBDUworICAgICAgICA7Ly8gc3RhdGVzIHRoYXQgcjQtcjExLCBzcCwgZDgtZDE1IG11c3QgYmUgcHJlc2VydmVkIGJ5CisgICAgICAgIDsvLyBhIGNvbXBsaWFudCBmdW5jdGlvbi4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVEFSVCAkbmFtZSwgJHJyZWcsICRkcmVnCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIEFTU0VSVCAiJG5hbWUiIT0iIgorX0luRnVuYyBTRVRMIHtUUlVFfQorX1JCeXRlcyBTRVRBIDAKK19Xb3Jrc3BhY2UgU0VUQSAwCisKKyAgICAgICAgOy8vIENyZWF0ZSBhbiBhcmVhIGZvciB0aGUgZnVuY3Rpb24gICAgICAgIAorICAgICAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKyAgICAgICAgRVhQT1JUICAkbmFtZQorJG5hbWUgICBGVU5DVElPTgorICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgUiByZWdpc3RlcnMKKyAgICAgICAgX01fR0VUUlJFR0xJU1QgJHJyZWcKKyAgICAgICAgSUYgX1JSZWdMaXN0PD4iIgorICAgICAgICAgICAgU1RNRkQgICBzcCEsIHskX1JSZWdMaXN0LCBscn0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgRCByZWdpc3RlcnMKKyAgICAgICAgX01fR0VURFJFR0xJU1QgICRkcmVnICAgICAgICAKKyAgICAgICAgSUYgX0RSZWdMaXN0PD4iIgorICAgICAgICAgICAgVlNUTUZEICBzcCEsIHskX0RSZWdMaXN0fQorICAgICAgICBFTkRJRiAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gRW5zdXJlIHNpemUgY2xhaW1lZCBvbiBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAorICAgICAgICBJRiAoKF9TQnl0ZXM6QU5EOjcpIT0wKQorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBJRiAoX1NCeXRlcyE9MCkKKyAgICAgICAgICAgIF9NX09QQyBTVUIsIHNwLCBzcCwgX1NCeXRlcworICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgCitfQUJ5dGVzIFNFVEEgX1NCeXRlcyArIF9SQnl0ZXMgLSBfV29ya3NwYWNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUHJpbnQgZnVuY3Rpb24gbmFtZSBpZiBkZWJ1ZyBlbmFibGVkCisgICAgICAgIE1fUFJJTlRGICIkbmFtZVxuIiwKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFdvcmsgb3V0IGEgbGlzdCBvZiBSIHNhdmVkIHJlZ2lzdGVycworICAgICAgICBNQUNSTworICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZworICAgICAgICBJRiAiJHJyZWciPSIiCitfUlJlZ0xpc3QgICBTRVRTICIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIElGICIkcnJlZyI9ImxyIjpMT1I6IiRycmVnIj0icjQiCitfUlJlZ0xpc3QgICBTRVRTICJyNCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys4CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyNSI6TE9SOiIkcnJlZyI9InI2IgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjYiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InI3IjpMT1I6IiRycmVnIj0icjgiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yOCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjkiOkxPUjoiJHJyZWciPSJyMTAiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yMTAiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMzIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InIxMSI6TE9SOiIkcnJlZyI9InIxMiIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXIxMiIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0MAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHNhdmVkIHIgcmVnaXN0ZXIgbGltaXQgJyRycmVnJyIKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIEQgc2F2ZWQgcmVnaXN0ZXJzCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0dFVERSRUdMSVNUICRkcmVnCisgICAgICAgIElGICIkZHJlZyI9IiIKK19EUmVnTGlzdCAgIFNFVFMgIiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgSUYgIiRkcmVnIj0iZDgiCitfRFJlZ0xpc3QgICBTRVRTICJkOCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys4CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkOSIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQ5IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzE2CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTAiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTAiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMjQKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMSIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMSIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDEyIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEyIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTMiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTMiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxNCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxNCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys1NgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDE1IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE1IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzY0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgZCByZWdpc3RlciBsaW1pdCAnJGRyZWcnIgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gUHJvZHVjZSBmdW5jdGlvbiByZXR1cm4gaW5zdHJ1Y3Rpb25zCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1JFVCAkY2MKKyAgICAgICAgSUYgX0RSZWdMaXN0PD4iIgorICAgICAgICAgICAgVlBPUCRjYyB7JF9EUmVnTGlzdH0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgX1JSZWdMaXN0PSIiCisgICAgICAgICAgICBCWCRjYyBscgorICAgICAgICBFTFNFCisgICAgICAgICAgICBMRE0kY2MuRkQgc3AhLCB7JF9SUmVnTGlzdCwgcGN9CisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEVhcmx5IEZ1bmN0aW9uIEV4aXQgTWFjcm8KKyAgICAgICAgOy8vICRjYyA9IGNvbmRpdGlvbiB0byBleGl0IHdpdGgKKyAgICAgICAgOy8vIChFeGFtcGxlOiBNX0VYSVQgRVEpCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fRVhJVCAgJGNjCisgICAgICAgIEFTU0VSVCAgX0luRnVuYworICAgICAgICBJRiAgX1NCeXRlcyE9MAorICAgICAgICAgICAgOy8vIFJlc3RvcmUgc3RhY2sgZnJhbWUgYW5kIGV4aXQKKyAgICAgICAgICAgIEIkY2MgIF9FbmQkX0YKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgOy8vIENhbiByZXR1cm4gZGlyZWN0bHkKKyAgICAgICAgICAgIF9NX1JFVCAkY2MKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBNRU5EICAgICAgICAKKworICAgICAgICA7Ly8gRnVuY3Rpb24gRm9vdGVyIE1hY3JvICAgICAgICAKKyAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXBpbG9ndWUKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9FTkQKKyAgICAgICAgQVNTRVJUIF9JbkZ1bmMKK19JbkZ1bmMgU0VUTCB7RkFMU0V9CitfRW5kJF9GCisKKyAgICAgICAgOy8vIFJlc3RvcmUgdGhlIHN0YWNrIHBvaW50ZXIgdG8gaXRzIG9yaWdpbmFsIHZhbHVlIG9uIGZ1bmN0aW9uIGVudHJ5CisgICAgICAgIElGIF9TQnl0ZXMhPTAKKyAgICAgICAgICAgIF9NX09QQyBBREQsIHNwLCBzcCwgX1NCeXRlcworICAgICAgICBFTkRJRgorICAgICAgICBfTV9SRVQKKyAgICAgICAgRU5ERlVOQworCisgICAgICAgIDsvLyBSZXNldCB0aGUgZ2xvYmFsIHN0YWNrIHRyYWNraW5nIHZhcmlhYmxlcyBiYWNrIHRvIHRoZWlyIAorICAgICAgICA7Ly8gaW5pdGlhbCB2YWx1ZXMsIGFuZCBpbmNyZW1lbnQgdGhlIGZ1bmN0aW9uIGNvdW50CitfU0J5dGVzICAgICAgICBTRVRBIDAKK19GICAgICAgICAgICAgIFNFVEEgX0YrMQorICAgICAgICBNRU5ECisKKyAgICAgICAgICAgICAgICAKKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7Ly8gRGVidWcgTWFjcm9zCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIEdCTEwgICAgREVCVUdfT04KK0RFQlVHX09OIFNFVEwgICB7RkFMU0V9CisgICAgICAgIEdCTEwgICAgREVCVUdfU1RBTExTX09OCitERUJVR19TVEFMTFNfT04gU0VUTCB7RkFMU0V9CisgICAgICAgIAorICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICA7Ly8gRGVidWcgY2FsbCB0byBwcmludGYKKyAgICAgICAgOy8vICBNX1BSSU5URiAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRXhhbXBsZXM6CisgICAgICAgIDsvLyAgTV9QUklOVEYgIng9JTA4eFxuIiwgcjAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIHByZXNlcnZlcyB0aGUgdmFsdWUgb2YgYWxsIHJlZ2lzdGVycyBpbmNsdWRpbmcgdGhlCisgICAgICAgIDsvLyBmbGFncy4KKyAgICAgICAgOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICBNQUNSTworICAgICAgICBNX1BSSU5URiAgJGZvcm1hdCwgJHZhbDAsICR2YWwxLCAkdmFsMgorICAgICAgICBJRiBERUJVR19PTgorICAgICAgICAKKyAgICAgICAgSU1QT1JUICBwcmludGYKKyAgICAgICAgTENMQSAgICBuQXJncworbkFyZ3MJU0VUQSAgICAwCisgICAgICAgIAorICAgICAgICA7Ly8gc2F2ZSByZWdpc3RlcnMgc28gd2UgZG9uJ3QgY29ycnVwdCB0aGVtCisgICAgICAgIFNUTUZEICAgc3AhLCB7cjAtcjEyLCBscn0KKyAgICAgICAgCisgICAgICAgIDsvLyBEcm9wIHN0YWNrIHRvIGdpdmUgdXMgc29tZSB3b3Jrc3BhY2UKKyAgICAgICAgU1VCICAgICBzcCwgc3AsICMxNgorICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHdlIG5lZWQgdG8gcHJpbnQgdG8gdGhlIHN0YWNrCisgICAgICAgIElGICIkdmFsMiIgPD4gIiIKKyAgICAgICAgICAgIEFTU0VSVCAiJHZhbDEiIDw+ICIiCisgICAgICAgICAgICBTVFIgICAgJHZhbDIsIFtzcCwgIzhdCituQXJncyAgICAgICBTRVRBICAgbkFyZ3MrMQorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHZhbDEiIDw+ICIiCisgICAgICAgICAgICBBU1NFUlQgIiR2YWwwIiA8PiAiIgorICAgICAgICAgICAgU1RSICAgICR2YWwxLCBbc3AsICM0XQorbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkdmFsMCI8PiIiCisgICAgICAgICAgICBTVFIgICAgJHZhbDAsIFtzcF0KK25BcmdzCSAgICBTRVRBICAgbkFyZ3MrMQorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgOy8vIE5vdyB3ZSBhcmUgc2FmZSB0byBjb3JydXB0IHJlZ2lzdGVycworICAgICAgICBBRFIgICAgIHIwLCAlRlQwMAorICAgICAgICBJRiBuQXJncz0xCisgICAgICAgICAgTERSICAgcjEsIFtzcF0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgbkFyZ3M9MgorICAgICAgICAgIExETUlBIHNwLCB7cjEscjJ9CisgICAgICAgIEVORElGCisgICAgICAgIElGIG5BcmdzPTMKKyAgICAgICAgICBMRE1JQSBzcCwge3IxLHIyLHIzfQorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgOy8vIHByaW50IHRoZSB2YWx1ZXMKKyAgICAgICAgTVJTICAgICByNCwgY3BzciAgICAgICAgOy8vIHByZXNlcnZlIGZsYWdzCisgICAgICAgIEJMICAgICAgcHJpbnRmCisgICAgICAgIE1TUiAgICAgY3Bzcl9mLCByNCAgICAgIDsvLyByZXN0b3JlIGZsYWdzCisgICAgICAgIEIgICAgICAgJUZUMDEKKzAwICAgICAgOy8vIHN0cmluZyB0byBwcmludAorICAgICAgICBEQ0IgICAgICIkZm9ybWF0IiwgMAorICAgICAgICBBTElHTgorMDEgICAgICA7Ly8gRmluaXNoZWQKKyAgICAgICAgQUREICAgICBzcCwgc3AsICMxNgorICAgICAgICA7Ly8gUmVzdG9yZSByZWdpc3RlcnMKKyAgICAgICAgTERNRkQJc3AhLCB7cjAtcjEyLGxyfQorCisgICAgICAgIEVORElGICAgOy8vIERFQlVHX09OCisgICAgICAgIE1FTkQKKworCisgICAgICAgIDsvLyBTdGFsbCBTaW11bGF0aW9uIE1hY3JvCisgICAgICAgIDsvLyBJbnNlcnRzIGEgZ2l2ZW4gbnVtYmVyIG9mIE5PUHMgZm9yIHRoZSBjdXJyZW50bHkKKyAgICAgICAgOy8vICBkZWZpbmVkIHBsYXRmb3JtCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RBTEwgJHBsYXQxc3RhbGwsICRwbGF0MnN0YWxsLCAkcGxhdDNzdGFsbCwgJHBsYXQ0c3RhbGwsICRwbGF0NXN0YWxsLCAkcGxhdDZzdGFsbAorICAgICAgICBJRiBERUJVR19TVEFMTFNfT04KKyAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDFzdGFsbCAgICAKKyAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDJzdGFsbCAgICAKKyAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDNzdGFsbCAgICAKKyAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDRzdGFsbCAgICAKKyAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDVzdGFsbCAgICAKKyAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDZzdGFsbCAgICAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fU1RBTExfU1VCICRwbGF0c3RhbGwKKyAgICAgICAgSUYgIiRwbGF0c3RhbGwiIT0iIgorICAgICAgICAgICAgTENMQSBfcGxsZW4KKyAgICAgICAgICAgIExDTFMgX3BsCisgICAgICAgICAgICBMQ0xMIF9wbGxvZworX3BsbGVuICAgICAgU0VUQSA6TEVOOiIkcGxhdHN0YWxsIgorX3BsICAgICAgICAgU0VUUyAiJHBsYXRzdGFsbCI6TEVGVDooX3BsbGVuIC0gMikKKyAgICAgICAgICAgIElGIDpERUY6JF9wbAorICAgICAgICAgICAgICAgIElGICRfcGwKKyAgICAgICAgICAgICAgICAgICAgTENMUyBfc3QKKyAgICAgICAgICAgICAgICAgICAgTENMQSBfc3RudW0KK19zdCAgICAgICAgICAgICAgICAgU0VUUyAiJHBsYXRzdGFsbCI6UklHSFQ6MSAgICAgICAgCitfc3RudW0gICAgICAgICAgICAgIFNFVEEgJF9zdAorICAgICAgICAgICAgICAgICAgICBXSElMRSBfc3RudW0+MAorCQkJTU9WIHNwLCBzcAorX3N0bnVtICAgICAgICAgICAgICAgICAgU0VUQSBfc3RudW0gLSAxCisgICAgICAgICAgICAgICAgICAgIFdFTkQKKyAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsvLyBFbmRpYW4gSW52YXJpZW5jZSBNYWNyb3MKKzsvLyAKKzsvLyBUaGUgaWRlYSBiZWhpbmQgdGhlc2UgbWFjcm9zIGlzIHRoYXQgaWYgYW4gYXJyYXkgaXMKKzsvLyBsb2FkZWQgYXMgd29yZHMgdGhlbiB0aGUgU01VTDAwIG1hY3JvIHdpbGwgbXVsdGlwbHkKKzsvLyBhcnJheSBlbGVtZW50cyAwIHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbmVzcyBvZiB0aGUKKzsvLyBzeXN0ZW0uIEZvciBsaXR0bGUgZW5kaWFuIFNNVUwwMD1TTVVMQkIsIGZvciBiaWcKKzsvLyBlbmRpYW4gU01VTDAwPVNNVUxUVCBhbmQgc2ltaWxhcmx5IGZvciBvdGhlciBwYWNrZWQgb3BlcmF0aW9ucy4KKzsvLworOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICBNQUNSTworICAgICAgICBMSUJJNCAgICRjb21saSwgJGNvbWJpLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIElGIHtFTkRJQU59PSJiaWciCisgICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYywgJGQKKyAgICAgICAgRUxTRQorICAgICAgICAkY29tbGkuJGNjICRhLCAkYiwgJGMsICRkCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIExJQkkzICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRjYworICAgICAgICBJRiB7RU5ESUFOfT0iYmlnIgorICAgICAgICAkY29tYmkuJGNjICRhLCAkYiwgJGMKKyAgICAgICAgRUxTRQorICAgICAgICAkY29tbGkuJGNjICRhLCAkYiwgJGMKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFNNTEF4eSBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTBCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMTAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTExICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMVQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUIwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCQiwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFCMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQVQxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUVCwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTTVVMeHkgbWFjcm9zCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMDAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDBCICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMFQgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDExICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMUIgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxVCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUVCwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTEIwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMQjEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxUMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFQxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU01MQVd4LCBTTVVMV3ggbWFjcm9zCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVzAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVdCLCBTTUxBV1QsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQVcxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFXVCwgU01MQVdCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxXMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxXQiwgU01VTFdULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFcxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFdULCBTTVVMV0IsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIFNNTEFMeHkgbWFjcm9zCisKKworICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDAwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDBUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKworICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDExICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMVQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTEIwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxCMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMVDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTFQxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgRU5ESUYgOy8vIEFSTUNPTU1fU19ICisgICAgICAgICAgICAKKyAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1PTVguaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YTY4ZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1PTVguaApAQCAtMCwwICsxLDI3NCBAQAorLyogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIFRoaXMgZmlsZSBhbGxvd3MgYSB2ZXJzaW9uIG9mIHRoZSBPTVggREwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IHdoZXJlIHNvbWUgb3IKKyAqIGFsbCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIGdpdmVuIGEgdXNlciBzcGVjaWZpZWQgc3VmZml4LiAKKyAqCisgKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgaXQgd2hlcmU6CisgKgorICogLSB5b3Ugd2FudCB0byByZW5hbWUgYSBmdW5jdGlvbiAib3V0IG9mIHRoZSB3YXkiIHNvIHRoYXQgeW91IGNvdWxkIHJlcGxhY2UKKyAqICAgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gKHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdvdWxkIHN0aWxsIGJlCisgKiAgIGluIHRoZSBsaWJyYXJ5IGp1c3Qgd2l0aCBhIGRpZmZlcmVudCBuYW1lIC0gc28geW91IGNvdWxkIGRlYnVnIHRoZSBuZXcKKyAqICAgdmVyc2lvbiBieSBjb21wYXJpbmcgaXQgdG8gdGhlIG91dHB1dCBvZiB0aGUgb2xkKQorICoKKyAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGFsbCB0aGUgZnVuY3Rpb25zIHRvIHZlcnNpb25zIHdpdGggYSBzdWZmaXggc28gdGhhdCAKKyAqICAgeW91IGNhbiBpbmNsdWRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBhbmQgY2hvb3NlIGJldHdlZW4gZnVuY3Rpb25zCisgKiAgIGF0IHJ1bnRpbWUuCisgKgorICogICAgIGUuZy4gb214SVBCTV9Db3B5X1U4X0MxUiBjb3VsZCBiZSByZW5hbWVkIG9teElQQk1fQ29weV9VOF9DMVJfQ29ydGV4QTgKKyAqIAorICovCisKKyAgCisjaWZuZGVmIF9hcm1PTVhfSF8KKyNkZWZpbmUgX2FybU9NWF9IXworCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgaW4gb3JkZXIgdG8gZXhwYW5kIGFuZCBjb25jYXRlbmF0ZSB0aGUgbmFtZXMgKi8KKyNkZWZpbmUgT01YQ0FUMkJBUihBLCBCKSBvbXggIyMgQSAjIyBCCisjZGVmaW5lIE9NWENBVEJBUihBLCBCKSBPTVhDQVQyQkFSKEEsIEIpCisKKy8qIERlZmluZSB0aGUgc3VmZml4IHRvIGFkZCB0byBhbGwgZnVuY3Rpb25zIC0gdGhlIGRlZmF1bHQgaXMgbm8gc3VmZml4ICovCisjZGVmaW5lIEJBUkVfU1VGRklYIAorCisKKworLyogRGVmaW5lIHdoYXQgaGFwcGVucyB0byB0aGUgYmFyZSBzdWZmaXgtbGVzcyBmdW5jdGlvbnMsIGRvd24gdG8gdGhlIHN1Yi1kb21haW4gYWNjdXJhY3kgKi8KKyNkZWZpbmUgT01YQUNBQUNfU1VGRklYICAgIEJBUkVfU1VGRklYICAgCisjZGVmaW5lIE9NWEFDTVAzX1NVRkZJWCAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJQ0pQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBCTV9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQQ1NfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUFBQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YU1BfU1VGRklYICAgICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDQ09NTV9TVUZGSVggICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ000UDEwX1NVRkZJWCAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNNNFAyX1NVRkZJWCAgIEJBUkVfU1VGRklYCisKKworCisKKy8qIERlZmluZSB3aGF0IHRoZSBlYWNoIGJhcmUsIHVuLXN1ZmZpeGVkIE9wZW5NQVggQVBJIGZ1bmN0aW9uIG5hbWVzIGlzIHRvIGJlIHJlbmFtZWQgKi8KKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlRGF0U3RyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRGF0U3RyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUZpbGxFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUZpbGxFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZVByZ0NmZ0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVByZ0NmZ0VsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0VuY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0VuY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0kgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEZ3ZF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEZ3ZF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEludl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEludl9TMzJfUzE2LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX05vaXNlbGVzc0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX05vaXNlbGVzc0RlY29kZSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19RdWFudEludl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19RdWFudEludl9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRElGSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRElGSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciwgT01YQUNBQUNfU1VGRklYKQorCisKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZV9TMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZV9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfTURDVEludl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfTURDVEludl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZV9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZV9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2LCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTaWRlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTaWRlSW5mbywgT01YQUNNUDNfU1VGRklYKQorCisjZGVmaW5lIG9teElDSlBfQ29weUV4cGFuZF9VOF9DMyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfQ29weUV4cGFuZF9VOF9DMywgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorCisjZGVmaW5lIG9teElQQk1fQWRkQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQWRkQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fQ29weV9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DM1IsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX01pcnJvcl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX01pcnJvcl9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX011bENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX011bENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCisKKyNkZWZpbmUgb214SVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiAgICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisKKyNkZWZpbmUgb214SVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlckZJUl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlckZJUl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50R2V0U3RhdGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50R2V0U3RhdGVTaXplLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRJbml0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DM1IsIE9NWElQUFBfU1VGRklYKQorCisjZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfQ29weV9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQ29weV9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV84eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaywgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5MTZ4MTYsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5OHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5OHg4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fRXhwYW5kRnJhbWVfSSwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0xpbWl0TVZUb1JlY3QsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9TQURfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQXZlcmFnZV80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrTHVtYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgT01YQ0FUQkFSKFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0dldFZMQ0luZm8sIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FSW5pdCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfMTZ4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzh4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQVREXzR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQVREXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVBhZE1WX1BWT1AsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlTVYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRmluZE1WcHJlZCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0lEQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NQ1JlY29uQmxvY2ssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUluaXQsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLCBPTVhWQ000UDJfU1VGRklYKQorCisKKyNlbmRpZiAvKiBfYXJtT01YX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGIyOTVhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaApAQCAtMCwwICsxLDI1MiBAQAorLyoqCisgKiBGaWxlOiBvbXh0eXBlcy5oCisgKiBCcmllZjogRGVmaW5lcyBiYXNpYyBEYXRhIHR5cGVzIHVzZWQgaW4gT3Blbk1BWCB2MS4wLjIgaGVhZGVyIGZpbGVzLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorICoKKyAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAorICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKKyAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKKyAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCisgKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCisgKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKKyAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAorICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCisgKgorICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCisgKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKKyAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAorICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAorICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCisgKiBtYXRlcmlhbHMuCisgKiAKKyAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqCisgKi8KKyAgCisjaWZuZGVmIF9PTVhUWVBFU19IXworI2RlZmluZSBfT01YVFlQRVNfSF8KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAKKworI2RlZmluZSBPTVhfSU4KKyNkZWZpbmUgT01YX09VVAorI2RlZmluZSBPTVhfSU5PVVQKKworCit0eXBlZGVmIGVudW0geworICAgIAorICAgIC8qIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uICovCisgICAgT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgPSAgMCwgICAgLyogTm8gZXJyb3IsIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgPSAtMiwgICAgLyogVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAqLyAgICAKKyAgICBPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICA9IC0xODIsICAvKiBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAqLyAgICAKKyAgICBPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICA9IC05LCAgICAvKiBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gKi8KKyAgICBPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICA9IC0xNTksICAvKiBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkICovCisgICAgT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgPSAtMTY3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAqLworICAgIE9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgID0gLTE2MywgIC8qIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgKi8gICAgIAorICAgIE9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgID0gLTE2MiwgIC8qIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICovICAgIAorCU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgID0gLTE2MCwgIC8qIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgKi8KKworICAgIC8qIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24qLworICAgIE9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgID0gLTUsICAgIC8qIEJhZCBBcmd1bWVudHMgKi8KKworICAgIE9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgID0gLTE1NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgPSAtMTU2LCAgLyogQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAqLyAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgID0gLTE1NSwgIC8qIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgID0gLTE1NCwgIC8qIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgPSAtMTUzLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgID0gLTE1MiwgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgKi8gIAorCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgPSAtMTgzLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICovCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgPSAtMTgxLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICA9IC0xNywgICAvKiBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gKi8KKworICAgIE9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgID0gLTE4MCwgIC8qIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAqLworCisgICAgT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgPSBJTlRfTUFYICAvKlBsYWNlaG9sZGVyLCBmb3JjZXMgZW51bSBvZiBzaXplIE9NWF9JTlQqLworICAgIAorIH0gT01YUmVzdWx0OyAgICAgICAgICAvKiogUmV0dXJuIHZhbHVlIG9yIGVycm9yIHZhbHVlIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbi4gSWRlbnRpY2FsIHRvIE9NWF9JTlQgKi8KKworIAorLyogT01YX1U4ICovCisjaWYgVUNIQVJfTUFYID09IDB4ZmYKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7CisjZWxpZiBVU0hSVF9NQVggPT0gMHhmZiAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VODsgCisjZWxzZQorI2Vycm9yIE9NWF9VOCB1bmRlZmluZWQKKyNlbmRpZiAKKworIAorLyogT01YX1M4ICovCisjaWYgU0NIQVJfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKKyNlbGlmIFNIUlRfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKKyNlbHNlCisjZXJyb3IgT01YX1M4IHVuZGVmaW5lZAorI2VuZGlmCisgCisgCisvKiBPTVhfVTE2ICovCisjaWYgVVNIUlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKKyNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCisjZWxzZQorI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfUzE2ICovCisjaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7CisjZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKKyNlbHNlCisjZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9VMzIgKi8KKyNpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTMyOworI2VsaWYgTE9OR19NQVggPT0gMHhmZmZmZmZmZgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBPTVhfVTMyOyAKKyNlbHNlCisjZXJyb3IgT01YX1UzMiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9TMzIgKi8KKyNpZiBJTlRfTUFYID09IDB4N2ZmZmZmZmYKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzMyOworI2VsaWYgTE9OR19NQVggPT0gMHg3ZmZmZmZmZgordHlwZWRlZiBsb25nIHNpZ25lZCBpbnQgT01YX1MzMjsgCisjZWxzZQorI2Vycm9yIE9NWF9TMzIgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfVTY0ICYgT01YX1M2NCAqLworI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQorICAgIHR5cGVkZWYgX19pbnQ2NCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQorI2Vsc2UKKyAgICB0eXBlZGVmIGxvbmcgbG9uZyBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKKyAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCisgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKKyNlbmRpZgorCisKKy8qIE9NWF9TQzggKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzE2ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDMzIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0M2NCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9GMzIgKi8KK3R5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KKworCisvKiBPTVhfRjY0ICovCit0eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLworCisKKy8qIE9NWF9JTlQgKi8KK3R5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KKworCisjZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCisjZGVmaW5lIE9NWF9NSU5fVTggIAkJMAorI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQorI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKKyNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKKyNkZWZpbmUgT01YX01JTl9VMzIJCQkwCisKKyNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCisjZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQorI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKKyNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQorI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQorI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQorCit0eXBlZGVmIHZvaWQgT01YVm9pZDsKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkKikwKQorI2VuZGlmCisKKy8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAorICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCisgICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKKyAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KKwlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCisJT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCisJT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLworfU9NWFJlY3Q7CisKKworLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCisgT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCisJCit9IE9NWFBvaW50OworCisKKy8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KK3R5cGVkZWYgc3RydWN0IAoreworIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCisgT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCisJCit9IE9NWFNpemU7CisKKyNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg3MDNkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXNfcy5oCkBAIC0wLDAgKzEsNzcgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teHR5cGVzX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uIAorT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgRVFVICAwICAgIDsvLyBObyBlcnJvciB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAKK09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgIEVRVSAtMiAgICA7Ly8gVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAgICAgCitPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICBFUVUgLTE4MiAgOy8vIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICAgICAKK09NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgIEVRVSAtOSAgICA7Ly8gTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uIAorT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgRVFVIC0xNTkgIDsvLyBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkIAorT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgRVFVIC0xNjcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgIAorT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgRVFVIC0xNjMgIDsvLyBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICAgICAgCitPTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICBFUVUgLTE2MiAgOy8vIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICAgICAKK09NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgIEVRVSAtMTYwICA7Ly8gQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAKKworOy8vIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24KK09NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgIEVRVSAtNSAgICA7Ly8gQmFkIEFyZ3VtZW50cyAKKworT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgRVFVIC0xNTcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAKK09NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgIEVRVSAtMTU2ICA7Ly8gQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAgICAKK09NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgIEVRVSAtMTU1ICA7Ly8gQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgIAorT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgRVFVIC0xNTQgIDsvLyBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAKK09NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgIEVRVSAtMTUzICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAKK09NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgIEVRVSAtMTUyICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAgIAorCitPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICBFUVUgLTE4MyAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAKK09NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgIEVRVSAtMTgxICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgCitPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICBFUVUgLTE3ICAgOy8vIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAKKworT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgRVFVIC0xODAgIDsvLyBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgCisKK09NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgIEVRVSAweDdGRkZGRkZGCisKKworCitPTVhfTUlOX1M4ICAgICAgRVFVIAkgICAJKC0xMjgpCitPTVhfTUlOX1U4ICAJRVFVICAgICAJMAorT01YX01JTl9TMTYJCUVRVSAgICAgIAkoLTMyNzY4KQorT01YX01JTl9VMTYJCUVRVQkgICAgICAgIDAKKworCitPTVhfTUlOX1MzMgkJRVFVCSgtMjE0NzQ4MzY0Ny0xKQorT01YX01JTl9VMzIJCUVRVQkwCisKK09NWF9NQVhfUzgJCUVRVQkoMTI3KQorT01YX01BWF9VOAkJRVFVCSgyNTUpCitPTVhfTUFYX1MxNgkJRVFVCSgzMjc2NykKK09NWF9NQVhfVTE2CQlFUVUJKDB4RkZGRikKK09NWF9NQVhfUzMyCQlFUVUJKDIxNDc0ODM2NDcpCitPTVhfTUFYX1UzMgkJRVFVCSgweEZGRkZGRkZGKQorCitPTVhfVkNfVVBQRVIgICAgRVFVIDB4MSAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKK09NWF9WQ19MRUZUICAgICBFUVUgMHgyICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAKK09NWF9WQ19VUFBFUl9SSUdIVCAgICBFUVUgMHg0MCAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAorCitOVUxMICAgIEVRVSAwCisKKzsvLyBTdHJ1Y3R1cmVzCisKKyAgICBJTkNMVURFICAgICBhcm1DT01NX3MuaAorCisgICAgTV9TVFJVQ1QgICAgT01YUG9pbnQKKyAgICBNX0ZJRUxEICAgICB4LCA0CisgICAgTV9GSUVMRCAgICAgeSwgNAorICAgIE1fRU5EU1RSVUNUCisKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYnVpbGRfdmMucGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYnVpbGRfdmMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQ5ZTc0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbApAQCAtMCwwICsxLDExMyBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIAorIyBGaWxlIE5hbWU6ICBidWlsZF92Yy5wbAorIyBPcGVuTUFYIERMOiB2MS4wLjIKKyMgUmV2aXNpb246ICAgMTIyOTAKKyMgRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisjIAorIyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgCisjIAorIworIyBUaGlzIGZpbGUgYnVpbGRzIHRoZSBPcGVuTUFYIERMIHZjIGRvbWFpbiBsaWJyYXJ5IG9teFZDLm8uCisjCisKK3VzZSBGaWxlOjpTcGVjOwordXNlIHN0cmljdDsKKworbXkgKCRDQywgJENDX09QVFMsICRBUywgJEFTX09QVFMsICRMSUIsICRMSUJfT1BUUywgJExJQl9UWVBFKTsKKworJENDICAgICAgID0gJ2FybWNjJzsKKyRDQ19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQ29ydGV4LUE4IC1jJzsKKyRBUyAgICAgICA9ICdhcm1hc20nOworJEFTX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBDb3J0ZXgtQTgnOworIyAkTElCICAgICAgPSAnYXJtbGluayc7CisjICRMSUJfT1BUUyA9ICctLXBhcnRpYWwgLW8nOworIyAkTElCX1RZUEUgPSAnLm8nOworJExJQiAgICAgID0gJ2FybWFyJzsKKyRMSUJfT1BUUyA9ICctLWNyZWF0ZSAtcic7CiskTElCX1RZUEUgPSAnLmEnOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK215IChAaGVhZGVybGlzdCwgQGZpbGVsaXN0LCAkaGQsICRmaWxlLCAkb2ZpbGUsICRjb21tYW5kLCAkb2JqbGlzdCwgJGxpYmZpbGUsICRoKTsKKworIyBEZWZpbmUgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBpbmNsdWRlZCBoZWFkZXIgZmlsZXMuCitAaGVhZGVybGlzdCA9IHF3KGFwaSB2Yy9hcGkgdmMvbTRwMi9hcGkgdmMvbTRwMTAvYXBpKTsKKworIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCitvcGVuKEZJTEVTLCAnPGZpbGVsaXN0X3ZjLnR4dCcpIG9yIGRpZSgiQ2FuJ3Qgb3BlbiBzb3VyY2UgZmlsZSBsaXN0XG4iKTsKK0BmaWxlbGlzdCA9IDxGSUxFUz47CitjbG9zZShGSUxFUyk7CisKKyMgRml4IHRoZSBmaWxlIHNlcGFyYXRvcnMgaW4gdGhlIGhlYWRlciBwYXRocworZm9yZWFjaCAkaCAoQGhlYWRlcmxpc3QpCit7CisgICAgICAgICRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRoKTsKK30KKworIyBDcmVhdGUgdGhlIGluY2x1ZGUgcGF0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCiskaGQgPSAnLUknIC4gam9pbignIC1JJywgQGhlYWRlcmxpc3QpOworCisjIENyZWF0ZSB0aGUgYnVpbGQgZGlyZWN0b3JpZXMgIi9saWIvIiBhbmQgIi9vYmovIiAoaWYgdGhleSBhcmUgbm90IHRoZXJlIGFscmVhZHkpCitta2RpciAib2JqIiwgMDc3NyBpZiAoISAtZCAib2JqIik7Citta2RpciAibGliIiwgMDc3NyBpZiAoISAtZCAibGliIik7CisKKyRvYmpsaXN0ID0gJyc7CisKKyMgQ29tcGlsZSBlYWNoIGZpbGUKK2ZvcmVhY2ggJGZpbGUgKEBmaWxlbGlzdCkKK3sKKwlteSAkZjsKKwlteSAkYmFzZTsKKwlteSAkZXh0OworCW15ICRvYmpmaWxlOworCisJY2hvbXAoJGZpbGUpOworCSRmaWxlID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRmaWxlKTsKKworCSh1bmRlZiwgdW5kZWYsICRmKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCgkZmlsZSk7CisgICAgJGY9fnMvW1xuXGZccl0vL2c7ICMgUmVtb3ZlIGFueSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzCisKKwlpZigoJGJhc2UsICRleHQpID0gJGYgPX4gLyguKylcLihcdykkLykKKwl7CisJCSRvYmpmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnb2JqJywgJGJhc2UuJy5vJyk7CisKKwkJaWYoJGV4dCBlcSAnYycpCisJCXsKKwkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOworCQkJJGNvbW1hbmQgPSAkQ0MuJyAnLiRDQ19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKKwkJCXByaW50ICIkY29tbWFuZFxuIjsKKwkJCXN5c3RlbSgkY29tbWFuZCk7CisJCX0KKwkJZWxzaWYoJGV4dCBlcSAncycpCisJCXsKKwkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOworCQkJJGNvbW1hbmQgPSAkQVMuJyAnLiRBU19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKKwkJCXByaW50ICIkY29tbWFuZFxuIjsKKwkJCXN5c3RlbSgkY29tbWFuZCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludCAiSWdub3JpbmcgZmlsZTogJGZcbiI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZGllICJObyBmaWxlIGV4dGVuc2lvbiBmb3VuZDogJGZcbiI7CisJfQorfQorCisjIERvIHRoZSBmaW5hbCBsaW5rIHN0YWdlIHRvIGNyZWF0ZSB0aGUgbGlicmFyaWVzLgorJGxpYmZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdsaWInLCAnb214VkMnLiRMSUJfVFlQRSk7CiskY29tbWFuZCA9ICRMSUIuJyAnLiRMSUJfT1BUUy4nICcuJGxpYmZpbGUuJyAnLiRvYmpsaXN0OworcHJpbnQgIiRjb21tYW5kXG4iOworKHN5c3RlbSgkY29tbWFuZCkgPT0gMCkgYW5kIHByaW50ICJCdWlsZCBzdWNjZXNzZnVsXG4iOworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2ZpbGVsaXN0X3ZjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZGI4ZWViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2ZpbGVsaXN0X3ZjLnR4dApAQCAtMCwwICsxLDc1IEBACisuL2FwaS9hcm1DT01NLmgKKy4vYXBpL2FybUNPTU1fQml0RGVjX3MuaAorLi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAorLi9hcGkvYXJtQ09NTV9JRENUX3MuaAorLi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAorLi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAorLi9hcGkvYXJtQ09NTV9zLmgKKy4vYXBpL2FybUNPTU1fVmVyc2lvbi5oCisuL2FwaS9hcm1PTVhfUmVsZWFzZVZlcnNpb24uaAorLi9hcGkvb214dHlwZXMuaAorLi9hcGkvb214dHlwZXNfcy5oCisuL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCisuL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCisuL3ZjL2FwaS9hcm1WQy5oCisuL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCisuL3ZjL2FwaS9vbXhWQy5oCisuL3ZjL2FwaS9vbXhWQ19zLmgKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucworLi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCisuL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCisuL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1NzJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYwpAQCAtMCwwICsxLDkzNiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU0uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVmaW5lcyBDb21tb24gQVBJcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogTWlzY2VsbGFuZW91cyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgVmFsdWUgKz0gMC41OworICAgICAgICAKKyAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MxNilPTVhfTUFYX1MxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAwLjU7CisKKyAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MxNilPTVhfTUlOX1MxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICBWYWx1ZSArPSAwLjU7CisgICAgICAgIAorICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzMyKU9NWF9NQVhfUzMyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NQVhfUzMyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZhbHVlIC09IDAuNTsKKworICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzMyKU9NWF9NSU5fUzMyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NSU5fUzMyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgVmFsdWUgKz0gMC41OworICAgIAorICAgIGlmKFZhbHVlID4gKE9NWF9VMTYpT01YX01BWF9VMTYgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTE2KU9NWF9NQVhfVTE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMTYpVmFsdWU7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgVmFsdWUgKz0gMC41OworICAgIAorICAgIGlmKFZhbHVlID4gKE9NWF9VMzIpT01YX01BWF9VMzIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTMyKU9NWF9NQVhfVTMyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMzIpVmFsdWU7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TNjQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgNjQgYml0IGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TNjQgZm9ybWF0CisgKgorICovCisKK09NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKKyAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqLyAKKworT01YX0lOVCBhcm1TaWduQ2hlY2sgKAorICAgIE9NWF9TMTYgdmFyCispCisKK3sKKyAgICBPTVhfSU5UIFNpZ247CisgICAgCisgICAgaWYgKHZhciA8IDApCisgICAgeworICAgICAgICBTaWduID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKCB2YXIgPiAwKQorICAgIHsKKyAgICAgICAgU2lnbiA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNpZ24gPSAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gU2lnbjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgT01YX0lOVCBtaW4sCisgICAgT01YX0lOVCBtYXgsIAorICAgIE9NWF9TMzIgc3JjIAorKQorIAoreworICAgIGlmIChzcmMgPiBtYXgpCisgICAgeworICAgICAgICBzcmMgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKKyAgICB7CisgICAgICAgIHNyYyA9IG1pbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfRjMyIGFybUNsaXBfRjMyICgKKyAgICBPTVhfRjMyIG1pbiwKKyAgICBPTVhfRjMyIG1heCwgCisgICAgT01YX0YzMiBzcmMgCispCisgCit7CisgICAgaWYgKHNyYyA+IG1heCkKKyAgICB7CisgICAgICAgIHNyYyA9IG1heDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjIDwgbWluKQorICAgIHsKKyAgICAgICAgc3JjID0gbWluOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3JjOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAorICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KKyAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAorICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCisgKiB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCisgKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgorICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQorICovIAorIAorT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoT01YX0YzMiB2LCBPTVhfSU5UIHNoaWZ0LCBPTVhfSU5UIHNhdEJpdHMpIAoreworICAgIE9NWF9VMzIgYWxsT25lcyA9IChPTVhfVTMyKSgtMSk7CisgICAgT01YX1UzMiBtYXhWID0gYWxsT25lcyA+PiAoMzItc2F0Qml0cyk7CisgICAgT01YX0YzMiB2U2hpZnRlZCwgdlJvdW5kZWQsIHNoaWZ0RGl2ID0gKE9NWF9GMzIpKDEgPDwgc2hpZnQpOworICAgIE9NWF9VMzIgdkludDsKKyAgICBPTVhfVTMyIHZJbnRTYXQ7CisgICAgCisgICAgaWYodiA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICB2U2hpZnRlZCA9IHYgLyBzaGlmdERpdjsKKyAgICB2Um91bmRlZCA9IChPTVhfRjMyKSh2U2hpZnRlZCArIDAuNSk7CisgICAgdkludCA9IChPTVhfVTMyKXZSb3VuZGVkOworICAgIHZJbnRTYXQgPSB2SW50OworICAgIGlmKHZJbnRTYXQgPiBtYXhWKSAKKyAgICAgICAgdkludFNhdCA9IG1heFY7CisgICAgcmV0dXJuIHZJbnRTYXQ7Cit9CisKKy8qKgorICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhlc2UgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbSgKKyAgICAgICAgT01YX1U4ICpwQnVmMSwKKyAgICAgICAgT01YX1U4ICpwQnVmMiwKKyAgICAgICAgT01YX0lOVCBlbGVtU2l6ZQorICAgICAgICkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgT01YX1U4IHRlbXA7CisgICAgYXJtUmV0QXJnRXJySWYoIXBCdWYxIHx8ICFwQnVmMiwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGZvcihpID0gMDsgaSA8IGVsZW1TaXplOyBpKyspCisgICAgeworICAgICAgICB0ZW1wID0gKihwQnVmMSArIGkpOworICAgICAgICAqKHBCdWYxICsgaSkgPSAqKHBCdWYyICsgaSk7CisgICAgICAgICoocEJ1ZjIgKyBpKSA9IHRlbXA7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKykKK3sKKyAgICBPTVhfUzMyIGEsIGIsIGM7CisgICAgCisgICAgYSA9IGFybU1pbiAoZkVudHJ5LCBzRW50cnkpOworICAgIGIgPSBhcm1NYXggKGZFbnRyeSwgc0VudHJ5KTsKKyAgICBjID0gYXJtTWluIChiLCB0RW50cnkpOworICAgIHJldHVybiAoYXJtTWF4IChhLCBjKSk7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUxvZ1NpemUKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQorICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1U4IC0tICAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgcG9zaXRpdmUgdmFsdWUuIAorICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzbWFsbGVzdCBrPj0wIHN1Y2ggdGhhdCB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiAoMTw8aykuCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKykKK3sKKyAgICBPTVhfVTggaTsgICAgCisgICAgZm9yICggaSA9IDA7IHZhbHVlID4gMDsgdmFsdWUgPSB2YWx1ZSA+PiAxKSAKKyAgICB7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdEFkZF9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQorICAgIHsKKyAgICAgICAgLypTYW1lIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRBZGRfUzY0KE9NWF9TNjQgVmFsdWUxLE9NWF9TNjQgVmFsdWUyKQoreworICAgIE9NWF9TNjQgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKKyAgICB7CisgICAgICAgIC8qU2FtZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICBSZXN1bHQgPSBPTVhfTUFYX1M2NDsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzY0OworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxIC0gVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA8IDApCisgICAgeworICAgICAgICAvKk9wcG9zaXRlIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKKyAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiovCisKK09NWF9TMzIgYXJtU2F0TWFjX1MzMihPTVhfUzMyIE1hYyxPTVhfUzE2IFZhbHVlMSxPTVhfUzE2IFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSAoT01YX1MzMikoVmFsdWUxKlZhbHVlMik7CisgICAgUmVzdWx0ID0gYXJtU2F0QWRkX1MzMiggTWFjICwgUmVzdWx0ICk7CisKKyAgICByZXR1cm4gUmVzdWx0OyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCisgKgorICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCisgKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKKyAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKE9NWF9TMzIgbWFjLCBPTVhfUzMyIGRlbGF5RWxlbSwgT01YX1MxNiBmaWxUYXAgKQoreworICAgIAorICAgIE9NWF9TMzIgcmVzdWx0OworCisgICAgcmVzdWx0ID0gYXJtU2F0TXVsUzE2UzMyX1MzMihmaWxUYXAsZGVsYXlFbGVtKTsgCisKKyAgICBpZiAoIHJlc3VsdCA+IE9NWF9NQVhfUzE2ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IE9NWF9NQVhfUzMyOworICAgIH0KKyAgICBlbHNlIGlmKCByZXN1bHQgPCBPTVhfTUlOX1MxNiApCisgICAgeworICAgICAgICByZXN1bHQgPSBPTVhfTUlOX1MzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gZGVsYXlFbGVtICogZmlsVGFwOworICAgIH0KKworICAgIG1hYyA9IGFybVNhdEFkZF9TMzIobWFjLHJlc3VsdCk7CisgICAgCisgICAgcmV0dXJuIG1hYzsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgorICoKKyAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0L0xlZnRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNoaWZ0ICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNoaWZ0IFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoT01YX1MzMiBpbnB1dCwgT01YX0lOVCBzaGlmdCkKK3sKKyAgICBpbnB1dCA9IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihpbnB1dCwtc2hpZnQpOworCisgICAgaWYgKCBpbnB1dCA+IE9NWF9NQVhfUzE2ICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5wdXQgPCBPTVhfTUlOX1MxNikKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICByZXR1cm4gKE9NWF9TMTYpaW5wdXQ7CisgICAgfQorCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKiAgICAgCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIFNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoT01YX1MzMiBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgaWYgKFNoaWZ0IDwgMCkKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OworICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsICgxIDw8IChTaGlmdCAtIDEpKSk7CisgICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsIFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NChPTVhfUzY0IFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQoreworICAgIE9NWF9JTlQgaTsKKyAgICAKKyAgICBpZiAoU2hpZnQgPCAwKQorICAgIHsKKyAgICAgICAgU2hpZnQgPSAtU2hpZnQ7CisgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgKChPTVhfUzY0KTEgPDwgKFNoaWZ0IC0gMSkpKTsKKyAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWYWx1ZTsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMihPTVhfUzE2IGlucHV0MSxPTVhfUzMyIGlucHV0MikKK3sKKyAgICBPTVhfUzE2IGhpMixsbzE7CisgICAgT01YX1UxNiBsbzI7CisgICAgCisgICAgT01YX1MzMiB0ZW1wMSx0ZW1wMjsKKyAgICBPTVhfUzMyIHJlc3VsdDsKKyAgICAKKyAgICBsbzEgID0gaW5wdXQxOworCisgICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOworICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKKyAgICAKKyAgICB0ZW1wMSA9IGhpMiAqIGxvMTsKKyAgICB0ZW1wMiA9ICggbG8yKiBsbzEgKSA+PiAxNjsKKworICAgIHJlc3VsdCA9ICBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKE9NWF9TMzIgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQoreworICAgIE9NWF9TMTYgaGkxLGhpMjsKKyAgICBPTVhfVTE2IGxvMSxsbzI7CisgICAgCisgICAgT01YX1MzMiB0ZW1wMSx0ZW1wMix0ZW1wMzsKKyAgICBPTVhfUzMyIHJlc3VsdDsKKworICAgIGhpMSAgPSAoIGlucHV0MSA+PiAgMTYgKTsKKyAgICBsbzEgID0gKCAoT01YX1UzMikoIGlucHV0MSA8PCAxNiApID4+IDE2ICk7CisKKyAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7CisgICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOworICAgIAorICAgIHRlbXAxID0gICBoaTEgKiBoaTI7CisgICAgdGVtcDIgPSAoIGhpMSogbG8yICkgPj4gMTY7CisgICAgdGVtcDMgPSAoIGhpMiogbG8xICkgPj4gMTY7CisKKyAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKKyAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHJlc3VsdCx0ZW1wMyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQorICoKKyAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAorICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCisgKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCisgKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pCit7CisgICAgT01YX0Y2NCByZXN1bHQ7CisgICAgCisgICAgcmVzdWx0ID0gKChPTVhfRjY0KU51bSkvKChPTVhfRjY0KURlbm8pOworICAgIAorICAgIGlmIChyZXN1bHQgPj0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCArPSAwLjU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCAtPSAwLjU7CisgICAgfQorCisgICAgcmV0dXJuIChPTVhfUzMyKShyZXN1bHQpOworfQorCisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWVmOTMxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpAQCAtMCwwICsxLDMyOSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlZmluZXMgYml0c3RyZWFtIGVuY29kZSBhbmQgZGVjb2RlIGZ1bmN0aW9ucyBjb21tb24gdG8gYWxsIGNvZGVjcworICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKipwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uLjMyCisgKgorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKK3sKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBSZXR1cm4gTiBiaXRzICovCisgICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorICogICAgCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4zMgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworCitPTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKK3sKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgIAorICAgIGlmKE4gPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisgICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCisgICAgT2Zmc2V0ICs9IE47CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKKworICAgIC8qIFJldHVybiBOIGJpdHMgKi8KKyAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisgCitPTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KQoreworICAgIGlmKCpwT2Zmc2V0ID4gMCkKKyAgICB7CisgICAgICAgICpwcEJpdFN0cmVhbSArPSAxOworICAgICAgICAqcE9mZnNldCA9IDA7CisgICAgfSAgICAKK30KKworLyoqIAorICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKworCitPTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKQoreworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgCisgICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KKyAgICBPZmZzZXQgKz0gTjsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgcENvZGVCb29rCisgKiAKKyAqIFtvdXRdICAgICpwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAorICogICAgICAgICA6IEFSTV9OT19DT0RFQk9PS19JTkRFWCA9IC0xIGlmIHNlYXJjaCBmYWlscy4KKyAqKi8KKyNpZm5kZWYgQ19PUFRJTUlaRURfSU1QTEVNRU5UQVRJT04gCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKQoreyAgICAKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgIE9NWF9JTlQgSW5kZXg7CisgICAgICAgIAorICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBTZWFyY2ggdGhyb3VnaCB0aGUgY29kZWJvb2sgKi8gICAgCisgICAgZm9yIChJbmRleD0wOyBwQ29kZUJvb2stPmNvZGVMZW4gIT0gMDsgSW5kZXgrKykKKyAgICB7CisgICAgICAgIGlmIChwQ29kZUJvb2stPmNvZGVXb3JkID09IChWYWx1ZSA+PiAoMzIgLSBwQ29kZUJvb2stPmNvZGVMZW4pKSkKKyAgICAgICAgeworICAgICAgICAgICAgT2Zmc2V0ICAgICAgID0gT2Zmc2V0ICsgcENvZGVCb29rLT5jb2RlTGVuOworICAgICAgICAgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQgPj4gMykgOworICAgICAgICAgICAgKnBPZmZzZXQgICAgID0gT2Zmc2V0ICYgNzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIEluZGV4OworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcENvZGVCb29rKys7CisgICAgfQorCisgICAgLyogTm8gY29kZSBtYXRjaCBmb3VuZCAqLworICAgIHJldHVybiBBUk1fTk9fQ09ERUJPT0tfSU5ERVg7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXSBwT2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXSBjb2RlV29yZCAgICAgICAgQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqIFtpbl0gY29kZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tCaXRzICgKKyAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgT01YX1UzMiBjb2RlV29yZCwgCisgICAgT01YX0lOVCBjb2RlTGVuZ3RoIAorKQoreworICAgIE9NWF9VOCAgKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgICAgICAKKyAgICAvKiBjaGVja2luZyBhcmd1bWVudCB2YWxpZGl0eSAqLworICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPiA3LCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA8IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoID4gMzIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIFByZXBhcmUgdGhlIGZpcnN0IGJ5dGUgKi8KKyAgICBjb2RlV29yZCA9IGNvZGVXb3JkIDw8ICgzMi1jb2RlTGVuZ3RoKTsKKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdID4+ICg4LU9mZnNldCkpIDw8ICg4LU9mZnNldCk7CisgICAgVmFsdWUgPSBWYWx1ZSB8IChjb2RlV29yZCA+PiAoMjQrT2Zmc2V0KSk7CisKKyAgICAvKiBXcml0ZSBvdXQgd2hvbGUgYnl0ZXMgKi8KKyAgICB3aGlsZSAoOC1PZmZzZXQgPD0gY29kZUxlbmd0aCkKKyAgICB7CisgICAgICAgICpwQml0U3RyZWFtKysgPSAoT01YX1U4KVZhbHVlOworICAgICAgICBjb2RlV29yZCAgID0gY29kZVdvcmQgIDw8ICg4LU9mZnNldCk7CisgICAgICAgIGNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoIC0gKDgtT2Zmc2V0KTsKKyAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgVmFsdWUgPSBjb2RlV29yZCA+PiAyNDsKKyAgICB9CisKKyAgICAvKiBXcml0ZSBvdXQgZmluYWwgcGFydGlhbCBieXRlICovCisgICAgKnBCaXRTdHJlYW0gID0gKE9NWF9VOClWYWx1ZTsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICsgY29kZUxlbmd0aDsKKyAgICAKKyAgICByZXR1cm4gIE9NWF9TdHNfTm9FcnI7Cit9CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIEFSTV9WTEMzMiBjb2RlIAorKQoreworICAgIHJldHVybiAoYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGNvZGUuY29kZVdvcmQsIGNvZGUuY29kZUxlbikpOworfQorCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZjVlMjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogICAKKyAqIEZpbGU6IGFybUNPTU1fSURDVFRhYmxlLmMKKyAqIEJyaWVmOiBEZWZpbmVzIFRhYmxlcyB1c2VkIGluIElEQ1QgY29tcHV0YXRpb24KKyAqCisgKi8KKworI2luY2x1ZGUgImFybUNPTU1fSURDVFRhYmxlLmgiCisKKyAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQorICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKKyAgICAgICogIHMoNik9Mi4wCisgICAgICAqICBzKDcpPTQuMAorICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQorICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCisJICAqLworCSAgCitfX2FsaWduKDQpIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XSA9Cit7CisgICAgMHg0MDAwLCAweDU4YzUsIDB4NTM5ZiwgMHg0YjQyLCAweDQwMDAsIDB4MzI0OSwgMHg0NTQ2LCAweDQ2YTEsCisgICAgMHg1OGM1LCAweDdiMjEsIDB4NzNmYywgMHg2ODYyLCAweDU4YzUsIDB4NDViZiwgMHg2MDE2LCAweDYxZjgsCisgICAgMHg1MzlmLCAweDczZmMsIDB4NmQ0MSwgMHg2MjU0LCAweDUzOWYsIDB4NDFiMywgMHg1YTgyLCAweDVjNDgsCisgICAgMHg0YjQyLCAweDY4NjIsIDB4NjI1NCwgMHg1ODdlLCAweDRiNDIsIDB4M2IyMSwgMHg1MTc1LCAweDUzMGQsCisgICAgMHg0MDAwLCAweDU4YzUsIDB4NTM5ZiwgMHg0YjQyLCAweDQwMDAsIDB4MzI0OSwgMHg0NTQ2LCAweDQ2YTEsCisgICAgMHgzMjQ5LCAweDQ1YmYsIDB4NDFiMywgMHgzYjIxLCAweDMyNDksIDB4Mjc4MiwgMHgzNjZkLCAweDM3N2UsCisgICAgMHgyMmEzLCAweDMwMGIsIDB4MmQ0MSwgMHgyOGJhLCAweDIyYTMsIDB4MWIzNywgMHgyNTdlLCAweDI2M2EsCisgICAgMHgxMWE4LCAweDE4N2UsIDB4MTcxMiwgMHgxNGMzLCAweDExYTgsIDB4MGRlMCwgMHgxMzFkLCAweDEzN2QgICAgCit9OworICAgIC8qIEFib3ZlIGFycmF5IGFybUNPTU1fSURDVFByZVNjYWxlLCAgaW4gUTIzIGZvcm1hdCAqLworY29uc3QgT01YX1UzMiBhcm1DT01NX0lEQ1RQcmVTY2FsZVUzMiBbNjRdID0KK3sKKyAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCisgICAgMHg1OGM1NDMsIDB4N2IyMGQ4LCAweDczZmJmYywgMHg2ODYyMTQsIDB4NThjNTQzLCAweDQ1YmYxZiwgMHg2MDE1YTUsIDB4NjFmNzhiLAorICAgIDB4NTM5ZWJhLCAweDczZmJmYywgMHg2ZDQxM2QsIDB4NjI1M2E2LCAweDUzOWViYSwgMHg0MWIzMjgsIDB4NWE4MjdhLCAweDVjNDg2OSwKKyAgICAweDRiNDE4YywgMHg2ODYyMTQsIDB4NjI1M2E2LCAweDU4N2RlMywgMHg0YjQxOGMsIDB4M2IyMGQ4LCAweDUxNzRlMCwgMHg1MzBkNjksCisgICAgMHg0MDAwMDAsIDB4NThjNTQzLCAweDUzOWViYSwgMHg0YjQxOGMsIDB4NDAwMDAwLCAweDMyNDhkNCwgMHg0NTQ1ZWEsIDB4NDZhMTU3LAorICAgIDB4MzI0OGQ0LCAweDQ1YmYxZiwgMHg0MWIzMjgsIDB4M2IyMGQ4LCAweDMyNDhkNCwgMHgyNzgyMWQsIDB4MzY2ZDcyLCAweDM3N2U2YiwKKyAgICAweDIyYTJmNSwgMHgzMDBhZDMsIDB4MmQ0MTNkLCAweDI4YmE3MCwgMHgyMmEyZjUsIDB4MWIzNmI5LCAweDI1N2Q4NiwgMHgyNjM5OGQsCisgICAgMHgxMWE4NTYsIDB4MTg3ZGUzLCAweDE3MTIxYSwgMHgxNGMzNWEsIDB4MTFhODU2LCAweDBkZGY5YiwgMHgxMzFjYzcsIDB4MTM3Y2EyCit9OworICAgCitjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdID0KK3sKKyAgICAweDVhODIsIC8qIEludlNxcnQyICovCisgICAgMHgzMGZjLCAvKiBTaW5QSUJ5OCAqLworICAgIDB4NzY0MiwgLyogQ29zUElCeTggKi8KKyAgICAweDAwMDAgICAgCit9OworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5Zjg4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKQEAgLTAsMCArMSw0NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9NYXNrVGFibGUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBNYXNrIFRhYmxlIHRvIG1hc2sgdGhlIGVuZCBvZiBhcnJheS4KKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCisKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9xTWFza1RhYmxlMTZbTWFza1RhYmxlU2l6ZV0gPSAKK3sKKyAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGICAgIAorfTsKKworY29uc3QgT01YX1U4IGFybUNPTU1fcU1hc2tUYWJsZThbTWFza1RhYmxlU2l6ZV0gPSAKK3sKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsICAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgICAgCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1YjUxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmgKQEAgLTAsMCArMSwxMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiBhcm1WaWRlby5oCisgKiBCcmllZjogRGVjbGFyZXMgQVBJJ3MvQmFzaWMgRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1BWCBWaWRlbyBkb21haW4KKyAqCisgKi8KKworCisjaWZuZGVmIF9hcm1WaWRlb19IXworI2RlZmluZSBfYXJtVmlkZW9fSF8KKworI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyoqCisgKiBBUk0gc3BlY2lmaWMgc3RhdGUgc3RydWN0dXJlIHRvIGhvbGQgTW90aW9uIEVzdGltYXRpb24gaW5mb3JtYXRpb24uCisgKi8KKyAKK3N0cnVjdCBtNHAyX01FU3BlYworeworICAgIE9NWFZDTTRQMk1FUGFyYW1zIE1FUGFyYW1zOworICAgIE9NWFZDTTRQMk1FTW9kZSAgIE1FTW9kZTsKK307CisKK3N0cnVjdCBtNHAxMF9NRVNwZWMKK3sKKyAgICBPTVhWQ000UDEwTUVQYXJhbXMgTUVQYXJhbXM7CisgICAgT01YVkNNNFAxME1FTW9kZSAgIE1FTW9kZTsKK307CisKK3R5cGVkZWYgc3RydWN0IG00cDJfTUVTcGVjICBBUk1WQ000UDJfTUVTcGVjOwordHlwZWRlZiBzdHJ1Y3QgbTRwMTBfTUVTcGVjIEFSTVZDTTRQMTBfTUVTcGVjOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ29tcGFyZU1WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIHRoZQorICogYmVzdCBNViBhbmQgU0FECisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgbXZYICAgICB4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBtdlkgICAgIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGNhbmRTQUQgQ2FuZGlkYXRlIFNBRAorICogW2luXSAgICAgYmVzdE1WWCB4IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgYmVzdE1WWSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgYmVzdFNBRCBiZXN0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHNhZCBpcyB0aGUgYmVzdAorICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAorICovCisKK09NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCisgICAgT01YX1MxNiBtdlgsCisgICAgT01YX1MxNiBtdlksCisgICAgT01YX0lOVCBjYW5kU0FELAorICAgIE9NWF9TMTYgYmVzdE1WWCwKKyAgICBPTVhfUzE2IGJlc3RNVlksCisgICAgT01YX0lOVCBiZXN0U0FEKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0FDRENQcmVkaWN0CisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCisgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jaworICogW2luXSBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtpbl0gY3VyUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2suCisgKiBbaW5dIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworICogW2luXSBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKiBbaW5dIEFDUHJlZEZsYWcgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00CisgKiBbaW5dIHZpZGVvQ29tcCAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiBbaW5dIGZsYWcgICAgICAgIFRoaXMgZmxhZyBkZWZpbmVzIHRoZSBpZiBvbmUgd2FudHMgdG8gdXNlIHRoaXMgZnVuY3Rpb25zIHRvCisgKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQUUYgKHNldCAxLCBwcmVkaWN0aW9uKSBvciBRRiAoc2V0IDAsIHJlY29uc3RydWN0aW9uKQorICogW291dF0gICAgcFByZUFDUHJlZGljdCAgIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxlZCBPTkxZIGlmIGl0IGlzIG5vdCBOVUxMCisgKiBbb3V0XSAgICBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sKKyAqIFtvdXRdICAgIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW291dF0gICAgcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbb3V0XSAgICBwU3VtRXJyICAgICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIHN1bSBvZiB0aGUgZGlmZmVyZW5jZQorICogICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIHVucHJlZGljdGVkIGNvZWZmaWNpZW50cworICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBOVUxMLCBkbyBub3QgdXBkYXRlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCisgICAgIE9NWF9TMTYgKiBwU3JjRHN0LAorICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCisgICAgIE9NWF9JTlQgY3VyUVAsCisgICAgIE9NWF9JTlQgcHJlZFFQLAorICAgICBPTVhfSU5UIHByZWREaXIsCisgICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgIHZpZGVvQ29tcCwKKyAgICAgT01YX1U4IGZsYWcsCisgICAgIE9NWF9JTlQgKnBTdW1FcnIKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCisgKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKKyAqIFtvdXRdICAgIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworICogW291dF0gICAgcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1NldFByZWREaXIoCisgICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfSU5UICpwcmVkRGlyLAorICAgICBPTVhfSU5UICpwcmVkUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludHJhIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LgorICogW2luXSBwUURjdEJsa0NvZWYgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBUaGlzIHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgICAgICAgICAgQUMgcHJlZGljdGlvbiBub3QgdXNlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHBhdHRlcm4gICAgICAgICBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBibG9jayBpcyBlbmNvZGVkCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YX1U4IHN0YXJ0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSB2aWRlb0NvbXAgICAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLCAKKyAgICAgT01YX1U4ICBzdGFydAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKKyAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4CisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCisgKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKKyAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAorICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCisgKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4CisgKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcworICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKyAgICBPTVhfVTMyIHN0b3JlUnVuLAorICAgIE9NWF9TMTYgKiBwRHN0LAorICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKKyAgICBPTVhfVTggIHNpZ24sCisgICAgT01YX1U4ICBsYXN0LAorICAgIE9NWF9VOCAgKiBpbmRleCwKKyAgICBjb25zdCBPTVhfVTggKiBwWmlnemFnVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9HZXRWTENCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCisgKiBbaW4vb3V0XSBwTGFzdCAgICAgICBwb2ludGVyIHRvIGxhc3Qgc3RhdHVzIGZsYWcKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAwCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMQorICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwwICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBWbGNUYWJsZUwwICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMSAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSBwVmxjVGFibGVMMSAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBMTUFYVGFibGVMMCAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcExNQVhUYWJsZUwxICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSBwUk1BWFRhYmxlTDAgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUk1BWFRhYmxlTDEgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW291dF1wRHN0CQkJICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKgkJCQkJCQlibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfR2V0VkxDQml0cyAoCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKwkJCSAgT01YX1MxNiAqIHBEc3QsCisJCQkgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKwkJCSAgT01YX1U4ICAgIHN0YXJ0LAkJCSAgCisJCQkgIE9NWF9VOCAgKiBwTGFzdCwKKwkJCSAgT01YX1U4ICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwLAorCQkJICBPTVhfVTggICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisJCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKKwkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAorICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispOworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNhbGN1bGF0aW5nIHRoZSBWTEMgYml0cyBkZXBlbmRpbmcgb24gdGhlIGVzY2FwZSB0eXBlIGFuZCBpbnNlcnQgCisgKiB0aGUgc2FtZSBpbiB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSAgcnVuICAgICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSAgbGV2ZWwgICAgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAorICogW2luXSAgcnVuUGx1cyAgICAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAorICogW2luXSAgbGV2ZWxQbHVzICAgICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQorICogW2luXSAgZk1vZGUgICAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgZXNjYXBlIG1vZGVzCisgKiBbaW5dICBsYXN0ICAgICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlICAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAorICogW2luXSAgcFZsY1RhYmxlICAgICAgICAgIFZMQyB0YWJsZSBkZWZpbmVkIGluIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAorICogW291dF0gcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCisgICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgT01YX1UzMiBydW4sCisgICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWwsIAorCQkJICBPTVhfVTMyIHJ1blBsdXMsCisgICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLCAKKyAgICAgICAgICAgICAgT01YX1U4ICBmTW9kZSwKKwkJCSAgT01YX1U4ICBsYXN0LAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywgCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAorICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQorICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKgorICogICAgICAgICAgICAgICAgICAgICAgCisgKiBSZXR1cm4gVmFsdWU6CisgKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMworICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCisgKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKKyAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KKyAqCisgKi8KKworT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCisgICAgIE9NWF9VMzIgcnVuLAorICAgICBPTVhfVTMyIHJ1blBsdXMsCisgICAgIE9NWF9TMTYgbGV2ZWwsCisgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAorICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAorICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQorKTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICAKKyAqIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCAKKyAqIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSAKKyAqIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgCisgKiBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdCAKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4gCisgKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsIAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIgCisgKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00CisgKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgCisgKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zCXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCQkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgorICogW2luXSBwU3JjUHJlU0FECQlwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpCisgKiBbaW5dIHNlYXJjaFJhbmdlCQlzZWFyY2ggcmFuZ2UgZm9yIDE2WDE2IGludGVnZXIgYmxvY2ssdGhlIHVuaXRzIG9mIGl0IGlzIGZ1bGwgcGl4ZWwsdGhlIHNlYXJjaCByYW5nZSAKKyAqICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBpbiBhbGwgZGlyZWN0aW9ucy5JdCBpcyBpbiBpbmNsdXNpdmUgb2YgdGhlIGJvdW5kYXJ5IGFuZCBzcGVjaWZpZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cy4KKyAqIFtpbl0gcE1FU3BlYwkJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCisgKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyAKKyAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XQlwRHN0TVYJCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF0JcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yLgorICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cworICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICAgdm9pZCAqcE1FU3BlYywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRCwKKyAgICAgT01YX1U4IEJsb2NrU2l6ZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIGVzdGltYXRlZCAKKyAqIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCAKKyAqIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCAKKyAqIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCAKKyAqIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIAorICogc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gIAorICogVGhlIGZ1bmN0aW9uIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAorICogICAgICAgICAgICAgICAgICAgIHRoZQljdXJyZW50IHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlCisgKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgCisgKiAgICAgICAgICAgICAgICAgICAgKGxpbmVhciBhcnJheSwgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqIFtpbl0JcFNlYXJjaFBvaW50UmVmUG9zCXBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCBzZWFyY2ggKHNwZWNpZmllZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXQlybmRWYWwJCQkgIHJvdW5kaW5nIGNvbnRyb2wgYml0IGZvciBoYWxmIHBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAwPXJvdW5kaW5nIGNvbnRyb2wgZGlzYWJsZWQ7IDE9cm91bmRpbmcgY29udHJvbCBlbmFibGVkCisgKiBbaW5dCXBTcmNEc3RNVgkJcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCBkdXJpbmcgYSBwcmlvciAKKyAqICAgICAgICAgICAgICAgICAgMTZYMTYgaW50ZWdlciBzZWFyY2ggYW5kIGl0cyB1bml0IGlzIGhhbGYgcGl4ZWwuCisgKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgorICogW291dF1wU3JjRHN0TVYJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cworICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRCwKKyAgICAgT01YX1U4IEJsb2NrU2l6ZQorKTsKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9QYWRNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwYWRkaW5nIGZvciBhIG1hY3JvYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrCisgKiBbaW5dIHBUcmFuc3AgICAgICAgICBwb2ludGVyIHRvIHRyYW5zcGFyZW50IHN0YXR1cyBidWZmZXIgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jaworICogW291dF0gICAgcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgaW4gd2hpY2ggdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIGhhdmUgYmVlbiBwYWRkZWQKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1BhZE1WKAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNEc3RNViwKKyAgICAgT01YX1U4ICogcFRyYW5zcAorKTsKKworLyogCisgKiBILjI2NCBTcGVjaWZpYyBEZWNsYXJhdGlvbnMgCisgKi8KKy8qIERlZmluZXMgKi8KKyNkZWZpbmUgQVJNX000UDEwX1FfT0ZGU0VUICAgICAgICAoMTUpCisKKworLyogRGVxdWFudCB0YWJsZXMgKi8KKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFsxNl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sMngyWzRdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ZNYXRyaXhbNl1bM107CitleHRlcm4gY29uc3QgT01YX1UzMiBhcm1WQ000UDEwX01GTWF0cml4WzZdWzNdOworCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB0aGUgd29yayByZXF1aXJlZCBieSB0aGUgT3Blbk1BWAorICogRGVjb2RlQ29lZmZzVG9QYWlyIGZ1bmN0aW9uIGFuZCBEZWNvZGVDaHJvbWFEQ0NvZWZmc1RvUGFpci4KKyAqIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29tbW9uIHdlIHNoYXJlIGl0IGhlcmUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAorICoJCQkJCQkJCWJsb2NrICg0LDE1IG9yIDE2KQorICogW2luXQluVGFibGUgICAgICAgICAgVGFibGUgbnVtYmVyICgwIHRvIDQpIGFjY29yZGluZyB0byB0aGUgZml2ZSBjb2x1bW5zCisgKiAgICAgICAgICAgICAgICAgICAgICBvZiBUYWJsZSA5LTUgaW4gdGhlIEguMjY0IHNwZWMKKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKworICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBuVGFibGUsCisgICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKKyApOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGF2ZXJhZ2luZyB1cHBlciBhbmQgbGVmdCBibG9jaworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKKyAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKKyAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKKyAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKKyAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgNHg0IGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDJ4MiBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBEZWJsb2NrIG9uZSBib3VuZGFyeSBwaXhlbAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBRMCAgICAgICAgIFBvaW50ZXIgdG8gcGl4ZWwgcTAKKyAqIFtpbl0gU3RlcCAgICAgICAgU3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEKKyAqIFtpbl0gdEMwICAgICAgICAgRWRnZSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYWxwaGEgICAgICAgYWxwaGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJldGEgICAgICAgIGJldGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJTICAgICAgICAgIGRlYmxvY2tpbmcgc3RyZW5ndGgKKyAqIFtpbl0gQ2hyb21hRmxhZyAgVHJ1ZSBmb3IgY2hyb21hIGJsb2NrcworICogW291dF0gcFEwICAgICAgICBEZWJsb2NrZWQgcGl4ZWxzCisgKiAKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAorICAgIE9NWF9VOCAqcFEwLCAgICAvKiBwb2ludGVyIHRvIHRoZSBwaXhlbCBxMCAqLworICAgIGludCBTdGVwLCAgICAgICAvKiBzdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMSAqLworICAgIGludCB0QzAsICAgICAgICAvKiBlZGdlIHRocmVzaG9sZCB2YWx1ZSAqLworICAgIGludCBhbHBoYSwgICAgICAvKiBhbHBoYSAqLworICAgIGludCBiZXRhLCAgICAgICAvKiBiZXRhICovCisgICAgaW50IGJTLCAgICAgICAgIC8qIGRlYmxvY2tpbmcgc3RyZW5ndGggKi8KKyAgICBpbnQgQ2hyb21hRmxhZworKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorIAkJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbb3V0XQlwRHN0CSAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAorICAgICAgICBjb25zdCBPTVhfVTgqCQlwU3JjLCAKKwkJT01YX1UzMiAJaVNyY1N0ZXAsIAorCQlPTVhfVTgqIAlwRHN0LCAKKwkJT01YX1UzMiAJaURzdFN0ZXAsIAorCQlPTVhfVTMyIAlpV2lkdGgsIAorCQlPTVhfVTMyIAlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW291dF0JcERzdCAgICAJUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKAkKKwkgY29uc3QgT01YX1U4KiAJcFNyYywgCisJIE9NWF9VMzIgCWlTcmNTdGVwLCAKKyAJIE9NWF9VOCogCXBEc3QsCisgCSBPTVhfVTMyIAlpRHN0U3RlcCwgCisgCSBPTVhfVTMyIAlpV2lkdGgsIAorIAkgT01YX1UzMiAJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yICgxLzIsIDEvMikgIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlICgxLzIsMS8yKS1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYSggIAorICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIEZvcndhcmQgVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKKworT01YX0lOVCBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCisgICAgT01YX1MxNiAgbXZYLAorICAgIE9NWF9TMTYgIG12WSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIAorICAgIE9NWF9JTlQgY2FuZFNBRCwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKmJlc3RNViwgCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0KTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX1NBRAorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIFNBRCBmb3IgTnhNIGJsb2Nrcy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFtpbl0JCXBTcmNPcmcJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlpU3RlcE9yZwlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKKyAqIFtpbl0JCXBTcmNSZWYJCVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jaworICogW2luXQkJaVN0ZXBSZWYJU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQlXaWR0aCBvZiB0aGUgYmxvY2sKKyAqIFtvdXRdCXBEc3RTQUQJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ0NPTU1fU0FEKAkKKwljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAorCU9NWF9VMzIgCWlTdGVwT3JnLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJT01YX1UzMiAJaVN0ZXBSZWYsCisJT01YX1MzMioJcERzdFNBRCwKKwlPTVhfVTMyCQlpSGVpZ2h0LAorCU9NWF9VMzIJCWlXaWR0aCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9BdmVyYWdlCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQuCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBQcmVkMAkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMAorICoJW2luXQlwUHJlZDEJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaVByZWRTdGVwMAkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMAorICoJW2luXQlpUHJlZFN0ZXAxCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlEc3RTdGVwIAkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKglbaW5dCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9ja3MKKyAqCVtpbl0JaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2tzCisgKglbb3V0XQlwRHN0UHJlZAkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ0NPTU1fQXZlcmFnZSAoCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQorCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAorCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAorCSBPTVhfVTgqCQlwRHN0UHJlZCwKKwkgT01YX1UzMgkJaURzdFN0ZXAsIAorCSBPTVhfVTMyCQlpV2lkdGgsCisJIE9NWF9VMzIJCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfU0FEUXVhcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgCisgKiBhdmVyYWdlIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFtpbl0JCXBTcmMJCQkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKKyAqIFtpbl0JCXBTcmNSZWYwCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwCisgKiBbaW5dCQlwU3JjUmVmMQkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMQorICogW2luXQkJaVNyY1N0ZXAgCQlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKKyAqIFtpbl0JCWlSZWZTdGVwMAkJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqIFtpbl0JCWlSZWZTdGVwMSAJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqIFtpbl0JCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrCisgKiBbaW5dCQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2sKKyAqIFtvdXRdCXBEc3RTQUQJCQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9TQURRdWFyKAorCWNvbnN0IE9NWF9VOCogCXBTcmMsCisgICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQorICAgIE9NWF9VMzIgCWlTcmNTdGVwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCisgICAgT01YX1UzMioJcERzdFNBRCwKKyAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAorICAgIE9NWF9VMzIgICAgIGlXaWR0aAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCisgICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKKyAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgICAgIE9NWF9VMzIgICAgIGR4LAorICAgICAgICBPTVhfVTMyICAgICBkeQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCisgICAgIGNvbnN0IE9NWF9VOCAgICAgKnBTcmMsCisgICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsCisgICAgIE9NWF9VOCAgICAgKnBEc3QsCisgICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsCisgICAgIE9NWF9VMzIgICAgaVdpZHRoLAorICAgICBPTVhfVTMyICAgIGlIZWlnaHQsCisgICAgIE9NWF9VMzIgICAgZHgsCisgICAgIE9NWF9VMzIgICAgZHkKKyk7CisKKy8qKgorICogRnVuY3Rpb246IG9teFZDSDI2NF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4CisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsCisgKiBwZXJmb3JtIGRlcXVhbnRpc2F0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZgorICogcmVzaWR1YWxzIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwkJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24KKyAqCQkJCQkJCXBhaXIgYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW2luXQlwREMJCQlQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMCisgKgkJCQkJCQlpZiBpdCBkb2Vzbid0IGV4aXN0CisgKiBbaW5dCVFQCQkJUXVhbnRpemF0aW9uIHBhcmFtZXRlcgorICogW2luXSBBQyAgICAgICAgICBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIGNvZWZmaWNpZW50IGV4aXN0cworICogW291dF0JcERzdAkJcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgoCisgICAgIE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2ICpwRHN0LAorICAgICBPTVhfSU5UIFFQLAorICAgICBPTVhfUzE2KiBwREMsCisgICAgIGludCBBQworKTsKKworI2VuZGlmICAvKl9hcm1WaWRlb19IXyovCisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDQ09NTV9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDQ09NTV9zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzJhMDE2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaApAQCAtMCwwICsxLDcyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIEFSTSBvcHRpbWl6ZWQgT3Blbk1BWCBBQyBoZWFkZXIgZmlsZQorOy8vIAorOy8vIEZvcm11bGEgdXNlZDoKKzsvLyBNQUNSTyBmb3IgY2FsY3VsYXRpbmcgbWVkaWFuIGZvciB0aHJlZSB2YWx1ZXMuCisKKworCisgICAgSUYgOkxOT1Q6OkRFRjpBUk1WQ0NPTU1fU19ICisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICBNX1ZBUklBTlRTICAgICAgQ29ydGV4QTgsIEFSTTExMzZKUworICAgIAorICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOCAKKyAgICAgCisgICAgIDsvLy8qCisgICAgIDsvLyAqIE1hY3JvOiBNX01FRElBTjMKKyAgICAgOy8vICoKKyAgICAgOy8vICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycworICAgICA7Ly8gKiAKKyAgICAgOy8vICogUmVtYXJrczoKKyAgICAgOy8vICoKKyAgICAgOy8vICogUGFyYW1ldGVyczoKKyAgICAgOy8vICogW2luXSB4ICAgICBGaXJzdCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogW2luXSB5ICAgICBTZWNvbmQgZW50cnkgZm9yIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCisgICAgIDsvLyAqICAgICAgICAgICAgSW5wdXQgdmFsdWUgbWF5IGJlIGNvcnJ1cHRlZCBhdCB0aGUgZW5kIG9mCisgICAgIDsvLyAqICAgICAgICAgICAgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1hY3JvLgorICAgICA7Ly8gKiBbaW5dIHogICAgIFRoaXJkIGVudHJ5IG9mIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCisgICAgIDsvLyAqICAgICAgICAgICAgSW5wdXQgdmFsdWUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YgdGhlIAorICAgICA7Ly8gKiAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGlzIG1hY3JvLgorICAgICA7Ly8gKiBbaW5dIHQgICAgIFRlbXBvcmFyeSBzY3JhdGNoICByZWdpc3Rlci4KKyAgICAgOy8vICogW291dF16ICAgICBNZWRpYW4gb2YgdGhlIHRocmVlIG51bWJlcnMuICAgICAgIAorICAgICA7Ly8gKi8KKyAgICAgCisgICAgIE1BQ1JPCisKKyAgICAgTV9NRURJQU4zICR4LCAkeSwgJHosICR0IAorICAgICAKKyAgICAgU1VCUyAgJHQsICR5LCAkejsgLy8gaWYgKHkgPCB6KQorICAgICBBRERMVCAkeiwgJHosICR0OyAvLyAgc3dhcCB5IGFuZCB6CisgICAgIFNVQkxUICR5LCAkeSwgJHQ7CisKKyAgICAgOy8vIE5vdyB6JyA8PSB5Jywgc28gdGhlcmUgYXJlIHRocmVlIGNhc2VzIGZvciB0aGUKKyAgICAgOy8vIG1lZGlhbiB2YWx1ZSwgZGVwZW5kaW5nIG9uIHguCisKKyAgICAgOy8vIDEpIHggPD0geicgICAgICA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHonCisgICAgIDsvLyAyKSAgICAgIHonIDw9IHggPD0geScgICAgICA6IG1lZGlhbiB2YWx1ZSBpcyB4CisgICAgIDsvLyAzKSAgICAgIHonICAgICAgPD0geScgPD0geCA6IG1lZGlhbiB2YWx1ZSBpcyB5JworCisgICAgIENNUCAgICR6LCAkeDsgICAgIC8vIGlmICggeCA+IG1pbih5LHopICkKKyAgICAgTU9WTFQgJHosICR4OyAgICAgLy8gYW5zID0geCAKKworICAgICBDTVAgICAkeCwgJHk7ICAgICAvLyBpZiAoIHggPiBtYXgoeSx6KSApCisgICAgIE1PVkdUICR6LCAkeTsgICAgIC8vIGFucyA9IG1heCh5LHopCisgICAgIAorICAgICBNRU5ECisgICAgRU5ESUYgICAgICAKKyAgICAKKyAgICAKKyAgICAgICAgCisgICAgRU5ESUYgOy8vIEFSTUFDQ09NTV9TX0gKKworIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjNjYzcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oCkBAIC0wLDAgKzEsNDM4MSBAQAorLyoqCisgKiBGaWxlOiBvbXhWQy5oCisgKiBCcmllZjogT3Blbk1BWCBETCB2MS4wLjIgLSBWaWRlbyBDb2RpbmcgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorICoKKyAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAorICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKKyAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKKyAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCisgKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCisgKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKKyAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAorICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCisgKgorICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCisgKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKKyAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAorICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAorICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCisgKiBtYXRlcmlhbHMuCisgKiAKKyAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqCisgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX09NWFZDX0hfCisjZGVmaW5lIF9PTVhWQ19IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIDYuMS4xLjEgTW90aW9uIFZlY3RvcnMgICovCisvKiBJbiBvbXhWQywgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MxNiBkeDsKKyAgICBPTVhfUzE2IGR5OworfSBPTVhWQ01vdGlvblZlY3RvcjsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKKyAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCisgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAorICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCisgKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV84eCAoCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAwLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKKyAgICBPTVhfVTggKnBEc3RQcmVkLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICg2LjEuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAorICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKKyAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgOCBvciAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAoNi4xLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbi1wbGFjZS4gIFRoZSB1bmV4cGFuZGVkIAorICogc291cmNlIGZyYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwbGFuZSBidWZmZXIgd2l0aCBzdWZmaWNpZW50IHNwYWNlIAorICogcHJlLWFsbG9jYXRlZCBmb3IgZWRnZSBleHBhbnNpb24sIGFuZCB0aGUgaW5wdXQgZnJhbWUgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gCisgKiB0aGUgcGxhbmUgYnVmZmVyIGNlbnRlci4gIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIHBpeGVsIGV4cGFuc2lvbiBieSAKKyAqIHJlcGxpY2F0aW5nIHNvdXJjZSBmcmFtZSBlZGdlIHBpeGVsIGludGVuc2l0aWVzIGluIHRoZSBlbXB0eSBwaXhlbCAKKyAqIGxvY2F0aW9ucyAoZXhwYW5zaW9uIHJlZ2lvbikgYmV0d2VlbiB0aGUgc291cmNlIGZyYW1lIGVkZ2UgYW5kIHRoZSBwbGFuZSAKKyAqIGJ1ZmZlciBlZGdlLiAgVGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgZXhwYW5zaW9uIHJlZ2lvbnMgb24gdGhlIAorICogaG9yaXpvbnRhbC92ZXJ0aWNhbCBlZGdlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgaUV4cGFuZFBlbHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RQbGFuZSAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgdG8gYmUgCisgKiAgICAgICAgICAgIGV4cGFuZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgaUZyYW1lV2lkdGggLSBmcmFtZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpRnJhbWVIZWlnaHQgLWZyYW1lIGhlaWdodDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpRXhwYW5kUGVscyAtIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIGhvcml6b250YWwgYW5kIAorICogICAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb25zOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlQbGFuZVN0ZXAgLSBkaXN0YW5jZSwgaW4gYnl0ZXMsIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIAorICogICAgICAgICAgICBpbiB0aGUgcGxhbmUgYnVmZmVyOyBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIAorICogICAgICAgICAgICAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC1Qb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIChOT1QgdGhlIAorICogICAgICAgICAgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBsYW5lKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBpcyBlaXRoZXIgZXF1YWwgdG8gemVybyBvciBpcyBhIAorICogICAgICAgICAgICAgIG5vbi1tdWx0aXBsZSBvZiA4OiBpRnJhbWVIZWlnaHQsIGlGcmFtZVdpZHRoLCBpUGxhbmVTdGVwLCBvciAKKyAqICAgICAgICAgICAgICBpRXhwYW5kUGVscy4gCisgKiAgICAtICAgIGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0UGxhbmUsCisgICAgT01YX1UzMiBpRnJhbWVXaWR0aCwKKyAgICBPTVhfVTMyIGlGcmFtZUhlaWdodCwKKyAgICBPTVhfVTMyIGlFeHBhbmRQZWxzLAorICAgIE9NWF9VMzIgaVBsYW5lU3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCisgKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBzdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKKyAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKKyAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKKyAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKKyAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKKyAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKKyAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCisgKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCisgKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKKyAqICAgICAgICAgICAgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAorICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCisgKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVYsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVjdFZPUFJlZiwKKyAgICBPTVhfSU5UIFhjb29yZCwKKyAgICBPTVhfSU5UIFljb29yZCwKKyAgICBPTVhfSU5UIHNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF8xNnggICAoNi4xLjQuMS40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDE2eDE2IGFuZCAxNng4IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYgCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX1NBRF8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9TMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfOHggICAoNi4xLjQuMS41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCisgKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDQsIDggb3IgMTYgCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX1NBRF84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMipwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qIDYuMi4xLjEgRGlyZWN0aW9uICAqLworLyogVGhlIGRpcmVjdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIEFDL0RDIHByZWRpY3Rpb24gYW5kIHppZy16YWcgc2Nhbi4gICovCisKK2VudW0geworICAgIE9NWF9WQ19OT05FICAgICAgID0gMCwKKyAgICBPTVhfVkNfSE9SSVpPTlRBTCA9IDEsCisgICAgT01YX1ZDX1ZFUlRJQ0FMICAgPSAyIAorfTsKKworCisKKy8qIDYuMi4xLjIgQmlsaW5lYXIgSW50ZXJwb2xhdGlvbiAgKi8KKy8qIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIG1vdGlvbiBlc3RpbWF0aW9uLCBtb3Rpb24gY29tcGVuc2F0aW9uLCBhbmQgcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX0lOVEVHRVJfUElYRUwgPSAwLCAvKiBjYXNlIGEgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YICA9IDEsIC8qIGNhc2UgYiAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1kgID0gMiwgLyogY2FzZSBjICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWFkgPSAzICAvKiBjYXNlIGQgKi8gCit9OworCisKKworLyogNi4yLjEuMyBOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSAgKi8KKy8qIE5laWdoYm9yaW5nIG1hY3JvYmxvY2sgYXZhaWxhYmlsaXR5IGlzIGluZGljYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZsYWdzOiAgICovCisKK2VudW0geworICAgIE9NWF9WQ19VUFBFUiA9IDEsICAgICAgICAvKiogYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfTEVGVCA9IDIsICAgICAgICAgLyoqIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfQ0VOVEVSID0gNCwKKyAgICBPTVhfVkNfUklHSFQgPSA4LAorICAgIE9NWF9WQ19MT1dFUiA9IDE2LAorICAgIE9NWF9WQ19VUFBFUl9MRUZUID0gMzIsICAvKiogYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19VUFBFUl9SSUdIVCA9IDY0LCAvKiogYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfTE9XRVJfTEVGVCA9IDEyOCwKKyAgICBPTVhfVkNfTE9XRVJfUklHSFQgPSAyNTYgCit9OworCisKKworLyogNi4yLjEuNCBWaWRlbyBDb21wb25lbnRzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIHZpZGVvIGNvbXBvbmVudHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfTFVNSU5BTkNFLCAgICAvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLworICAgIE9NWF9WQ19DSFJPTUlOQU5DRSAgIC8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8gCit9IE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50OworCisKKworLyogNi4yLjEuNSBNYWNyb2Jsb2NrVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19JTlRFUiAgICAgPSAwLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVEVSX1EgICA9IDEsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0ViAgID0gMiwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQSAgICAgPSAzLCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5UUkFfUSAgID0gNCwgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCisgICAgT01YX1ZDX0lOVEVSNFZfUSA9IDUgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCit9IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOworCisKKworLyogNi4yLjEuNiBDb29yZGluYXRlcyAgKi8KKy8qIENvb3JkaW5hdGVzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9JTlQgeDsKKyAgICBPTVhfSU5UIHk7Cit9IE9NWFZDTTRQMkNvb3JkaW5hdGU7CisKKworCisvKiA2LjIuMS43IE1vdGlvbiBFc3RpbWF0aW9uIEFsZ29yaXRobXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbW90aW9uIGVzdGltYXRpb24gc2VhcmNoIG1ldGhvZHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfTTRQMl9GQVNUX1NFQVJDSCA9IDAsICAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCisgICAgT01YX1ZDX000UDJfRlVMTF9TRUFSQ0ggPSAxICAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKK30gT01YVkNNNFAyTUVNb2RlOworCisKKworLyogNi4yLjEuOCBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9JTlQgc2VhcmNoRW5hYmxlOHg4OyAgICAgLyoqIGVuYWJsZXMgOHg4IHNlYXJjaCAqLworICAgIE9NWF9JTlQgaGFsZlBlbFNlYXJjaEVuYWJsZTsgLyoqIGVuYWJsZXMgaGFsZi1wZWwgcmVzb2x1dGlvbiAqLworICAgIE9NWF9JTlQgc2VhcmNoUmFuZ2U7ICAgICAgICAgLyoqIHNlYXJjaCByYW5nZSAqLworICAgIE9NWF9JTlQgcm5kVmFsOyAgICAgICAgICAgICAgLyoqIHJvdW5kaW5nIGNvbnRyb2w7IDAtZGlzYWJsZWQsIDEtZW5hYmxlZCovCit9IE9NWFZDTTRQMk1FUGFyYW1zOworCisKKworLyogNi4yLjEuOSBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAgKi8KKy8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgZm9yIAorICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KKyAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAvKiBNQiB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgT01YX1ZDX0lOVEVSNCAqLworICAgIE9NWF9TMzIgcXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbMl1bMl07ICAgIC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9MH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzJdWzJdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9IDB+MSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1U4IHBQcmVkRGlyWzJdWzJdOyAgICAgICAgICAgLyogQUMgcHJlZGljdGlvbiBkaXJlY3Rpb246IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgT01YX1ZDX05PTkUsIE9NWF9WQ19WRVJUSUNBTCwgT01YX1ZDX0hPUklaT05UQUwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IE9NWFZDTTRQMk1CSW5mbywgKk9NWFZDTTRQMk1CSW5mb1B0cjsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICg2LjIuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IGJsb2NrIHVzaW5nIHRoZSBwcm9jZWR1cmUgCisgKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuICBUaGUgcmVzdWx0aW5nIHByZWRpY3RlZCBNViBpcyAKKyAqIHJldHVybmVkIGluIHBEc3RNVlByZWQuIElmIHRoZSBwYXJhbWV0ZXIgcERzdE1WUHJlZE1FIGlmIGlzIG5vdCBOVUxMIHRoZW4gCisgKiB0aGUgc2V0IG9mIHRocmVlIE1WIGNhbmRpZGF0ZXMgdXNlZCBmb3IgcHJlZGljdGlvbiBpcyBhbHNvIHJldHVybmVkLCAKKyAqIG90aGVyd2lzZSBwRHN0TVZQcmVkTUVpcyBOVUxMIHVwb24gcmV0dXJuLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgWSAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jazsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNDYW5kTVYxIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIAorICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBNQiB0byB0aGUgbGVmdC4gCisgKiAgIHBTcmNDYW5kTVYyIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIGlmIHRoZXJlIAorICogICAgICAgICAgICBpcyBubyBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcFNyY0NhbmRNVjMgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgcmlnaHQgYW5kIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlcmUgaXMgbm8gTUIgbG9jYXRlZCB0byB0aGUgYWJvdmUtcmlnaHQuIAorICogICBpQmxrIC0gdGhlIGluZGV4IG9mIGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgIHBEc3RNVlByZWRNRSAtIE1WIGNhbmRpZGF0ZSByZXR1cm4gYnVmZmVyOyAgaWYgc2V0IHRvIE5VTEwgdGhlbiAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiBjYW5kaWRhdGUgTVZzIGFyZSBub3QgcmV0dXJuZWQgYW5kIHBEc3RNVlByZWRNRSB3aWxsIAorICogICAgICAgICAgICBiZSBOVUxMIHVwb24gZnVuY3Rpb24gcmV0dXJuOyBpZiBwRHN0TVZQcmVkTUUgaXMgbm9uLU5VTEwgdGhlbiBpdCAKKyAqICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRocmVlIAorICogICAgICAgICAgICByZXR1cm4gTVZzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WUHJlZCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yIAorICogICBwRHN0TVZQcmVkTUUgLSBpZiBub24tTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FICBwb2ludHMgdXBvbiAKKyAqICAgICAgICAgICAgcmV0dXJuIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHRocmVlIG1vdGlvbiB2ZWN0b3IgY2FuZGlkYXRlcyAKKyAqICAgICAgICAgICAgdXNlZCBmb3IgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCisgKiAgICAgICAgICAgIDcuNi41LCBvdGhlcndpc2UgaWYgTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FIGlzIE5VTEwgCisgKiAgICAgICAgICAgIHVwb24gb3V0cHV0LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHRoZSBwb2ludGVyIHBEc3RNVlByZWQgaXMgTlVMTCAKKyAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBpQmxrIGRvZXMgbm90IGZhbGwgaW50byB0aGUgcmFuZ2UgMCA8PSBpQmxrPD0zIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9GaW5kTVZwcmVkICgKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYxLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjMsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWRNRSwKKyAgICBPTVhfSU5UIGlCbGsKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAoNi4yLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgYSAyRCBpbnZlcnNlIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAorICogW0lTTzE0NDk2LTJdLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1QgaW5wdXQgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIEFjY29yZGluZyB0byAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCB0aGUgaW5wdXQgY29lZmZpY2llbnQgdmFsdWVzIHNob3VsZCBsaWUgd2l0aGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBvdXRwdXQgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9JRENUOHg4YmxrICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICg2LjIuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKKyAqIHN0cnVjdHVyZSBmb3IgdGhlIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6IAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gCisgKiAgICAgICAgICAgIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9NRUluaXQgKAorICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMqcE1FUGFyYW1zLAorICAgIHZvaWQgKnBNRVNwZWMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCisgKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAorICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAorICogICAgICAgICAgICAtNC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNQcmVNViwKKyAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAoNi4yLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIAorICogdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAorICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKKyAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCisgKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNiBieXRlcy4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKKyAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAorICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKKyAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAorICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAorICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICg2LjIuNC4yLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uIFJldHVybnMgdGhlIAorICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAorICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKKyAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKKyAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKKyAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKKyAqIDh4OCBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl84eDguIFRoZSBmdW5jdGlvbiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDggbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAorICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgOHg4IGludGVnZXIgc2VhcmNoLCBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKKyAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAorICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCisgKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAorICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCisgKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKKyAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKKyAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKKyAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCisgKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKKyAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCisgKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKKyAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAorICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKKyAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKKyAqICAgICAgICAgICAgaWdub3JlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAorICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAorICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKKyAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKKyAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKKyAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKKyAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCisgKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKKyAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKKyAqICAgICAgICAgICAgZWFjaCBNQi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIE9NWF9TMzIgc3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9TMzIgc3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhSZWN0KnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDJNQkluZm9QdHIgKnBNQkluZm8sCisgICAgT01YVkNNNFAyTUJJbmZvICpwU3JjRHN0TUJDdXJyLAorICAgIE9NWF9VMTYgKnBEc3RTQUQsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAoNi4yLjQuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgYSAyRCBmb3J3YXJkIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAorICogW0lTTzE0NDk2LTJdLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIGlucHV0IGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBJbnB1dCB2YWx1ZXMgKHBpeGVsIAorICogICAgICAgICAgICBpbnRlbnNpdGllcykgYXJlIHZhbGlkIGluIHRoZSByYW5nZSBbLTI1NSwyNTVdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBvdXRwdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIHJldHVybmVkIGlmOgorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRENUOHg4YmxrICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNi4xLjMuOC4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAoNi4yLjQuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGFuIGludGVyIGNvZWZmaWNpZW50IGJsb2NrOyBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRlciBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCisgKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCisgKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAorICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAorICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKKyAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAorICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCisgKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAorICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKKyAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKKyAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKKyAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKKyAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKKyAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAorICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKKyAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCisgKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAorICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKKyAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCisgKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCisgKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKKyAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAorICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKKyAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKKyAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCisgKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKKyAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAorICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCisgKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKKyAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCisgKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAorICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCisgKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCisgKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAorICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAorICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAorICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKKyAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgIHBTcmMsIHBSZWMuICAKKyAqCisgKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCisgKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCAqcFJlYywKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKKyAgICBPTVhfUzE2ICpwUHJlQUNQcmVkaWN0LAorICAgIE9NWF9JTlQgKnBTdW1FcnIsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9VOCBjdXJRcCwKKyAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZiwKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAoNi4yLjQuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW1wbGVtZW50cyBEQ1QsIGFuZCBxdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMgb2YgdGhlIGludGVyIGJsb2NrIAorICogd2hpbGUgcmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgcmVzaWR1YWwuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciAKKyAqIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtcG9pbnRlciB0byB0aGUgcmVzaWR1YWxzIHRvIGJlIGVuY29kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlci4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmUgcmVzaWR1YWxzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIGVpdGhlciBOVUxMIG9yIAorICogICAgICAgICBub3QgMTYtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgICAgLSBwU3JjIAorICogICAgICAgICAgICAtIHBEc3QKKyAqICAgICAgICAgICAgLSBwUmVjCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9TMTYgKnBSZWMsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX1U4IHBhdHRlcm4sCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCisgKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgT01YX1U4IHBhdHRlcm4sCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVNViAgICg2LjIuNC41LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIGVuY29kZXMgdGhlIAorICogZGlmZmVyZW5jZSwgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvIHRoZSBzdHJlYW0gYnVmZmVyLiBUaGUgaW5wdXQgTVZzIAorICogcE1WQ3VyTUIsIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiBzaG91bGQgbGllIAorICogd2l0aGluIHRoZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgZmNvZGVGb3J3YXJkLCBhcyAKKyAqIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSAKKyAqIHN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDJfRmluZE1WcHJlZC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgKG5leHQgYXZhaWxhYmxlKSBiaXQgaW4gdGhlIHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA3LiAKKyAqICAgcE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSB2YWx1ZSBvZiAKKyAqICAgICAgICAgICAgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZMZWZ0TUIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgbGVmdCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mICBOVUxMaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciByaWdodCBNQiBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIGZjb2RlRm9yd2FyZCAtIGFuIGludGVnZXIgd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDc7IHVzZWQgaW4gZW5jb2RpbmcgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIHJlbGF0ZWQgdG8gc2VhcmNoIHJhbmdlLCBhcyBkZXNjcmliZWQgaW4gCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAKKyAqICAgTUJUeXBlIC0gbWFjcm8gYmxvY2sgdHlwZSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSB1cGRhdGVkIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gdXBkYXRlZCBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYml0IHBvc2l0aW9uIGluIHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwTVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIGZjb2RlRm9yd2FyZCA8PSAwLCBvciBmY29kZUZvcndhcmQgPiA3LCBvciBNQlR5cGUgPCAwLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkN1ck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVkxlZnRNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKKyAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKKyAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCisgKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCisgKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAorICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKKyAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAorICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKKyAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAorICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAorICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAorICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBzeW50YXggCisgKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCisgKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KKyAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCisgKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WTGVmdE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVlVwcGVyTUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVZDdXJNQiwKKyAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiAKKyAqICAgICAgICAgICAgQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgICAgICBMZWFzdHwgCisgKiAgICAgICAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIHByZURpciBleGNlZWRzIFswLDJdCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgLSBpZjoKKyAqICAgIC0gICAgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIG1hcmsgYml0cyBlcXVhbHMgemVybyAKKyAqICAgIC0gICAgSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIAorICogICAgLSAgICBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIEZMQyB0YWJsZS4gCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKKyAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKKyAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAorICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCisgKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAorICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAorICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKKyAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAorICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAorICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCisgKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKKyAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi41LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyLWNvZGVkIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIGN1cnJlbnQgc3RyZWFtIAorICogICAgICAgICAgICBieXRlIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLiBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIAorICogICAgICAgICAgICB2YWxpZCB3aXRoaW4gdGhlIHJhbmdlIFswLTddLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBkZWNvZGluZyBzdWNoIHRoYXQgaXQgcG9pbnRzIAorICogICAgICAgICAgICB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBzdHJlYW0gYnl0ZSByZWZlcmVuY2VkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZAorICogICAgLSAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8gCisgKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlIAorICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgKDYuMi41LjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKKyAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAorICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCisgKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCisgKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAorICogICAgICAgICAgICAgIHRydWU6IAorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKKyAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgKDYuMi41LjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKKyAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAorICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCisgKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCisgKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAorICogICAgICAgICAgICAgIHRydWU6IAorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKKyAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9JTlQgUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICg2LjIuNS40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgCisgKiB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIAorICogcGVyZm9ybWVkIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IAorICogZnJhbWUvcGxhbmUgb24gYSBwaXhlbCBiYXNpcy4gIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIG9ubHkgd2hlbiAKKyAqIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBvZiBjdXJyZW50IGJsb2NrIGV4aXN0cyBpbiB0aGUgYml0IAorICogc3RyZWFtLiBUaGUgREMgb25seSBjb25kaXRpb24gd2lsbCBiZSBoYW5kbGVkIGluIGFub3RoZXIgZnVuY3Rpb24uIAorICoKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAorICogICBzdGVwIC0gd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lIAorICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaCB0aGUgY3VycmVudCBibG9jayAKKyAqICAgICAgICAgICAgYmVsb25ncyB0byAKKyAqICAgcFFQQnVmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIgCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24gYXMgCisgKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOCwgRmlndXJlIDYtNS4gCisgKiAgIGludHJhRENWTEMgLSBhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4gVGhpcyBhbGxvd3MgYSAKKyAqICAgICAgICAgICAgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMgZm9yIGNvZGluZyBvZiBJbnRyYSBEQyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGFzIHBlciBbSVNPMTQ0OTYtMl0sIFRhYmxlIDYtMjEuIAorICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nIGlmIAorICogICAgICAgICAgICB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uIGFyZSAKKyAqICAgICAgICAgICAgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkIG1hY3JvYmxvY2suIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4gCisgKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKKyAqICAgICAgICAgICAgVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCisgKiAgICAgICAgICAgIHVwZGF0ZSBwcm9jZWR1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4yLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIAorICogICAgICAgICBwUVBCdWYsIHBEc3QuIAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddIAorICogICAgLSAgICBjdXJRUCBleGNlZWRzICgxLCAzMSkKKyAqICAgIC0gICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDVdCisgKiAgICAtICAgIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4CisgKiAgICAtICAgIGEgcG9pbnRlciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgd2FzIHZpb2xhdGVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50cmEuICAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAsCisgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgT01YX1U4IGN1clFQLAorICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIGludHJhRENWTEMsCisgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgKDYuMi41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIAorICogcXVhbnRpemF0aW9uLCBpbnZlcnNlIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QgKHdpdGggYXBwcm9wcmlhdGUgCisgKiBjbGlwcGluZyBvbiBlYWNoIHN0ZXApIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSAKKyAqIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCAKKyAqIGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvciBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IAorICogICAgICAgICAgICBlbGVtZW50cyBvZiBPTVhfUzE2IGRhdGEgdHlwZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdCAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBRUCA8PSAwLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRlciAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgKDYuMi41LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiAgUHJpb3IgCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMy4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgICAgICAgICAgIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLiAKKyAqICAgcHJlZFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICBwcmVkRGlyIC0gaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfSE9SSVpPTlRBTCAtIHByZWRpY3QgaG9yaXpvbnRhbGx5IAorICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgLSBwcmVkaWN0IHZlcnRpY2FsbHkgCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIEl0IAorICogICAgICAgICAgICBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdCBzdHJlYW0gc3ludGF4IG9mIE1QRUctNCAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBCdWZmZXIgdXBkYXRlOiBVcGRhdGUgdGhlIEFDIHByZWRpY3Rpb24gYnVmZmVyIChib3RoIHJvdyBhbmQgCisgKiAgICAgICAgICAgIGNvbHVtbiBidWZmZXIpLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAgICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4gCisgKiAgICAgICAgLSAgICBjdXJRUCA8PSAwLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA8PSAwLCAKKyAqICAgICAgICAtICAgIGN1clFQID4zMSwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPiAzMSwgCisgKiAgICAgICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMSwyXQorICogICAgICAgIC0gICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKKyAgICBPTVhfSU5UIGN1clFQLAorICAgIE9NWF9JTlQgcHJlZFFQLAorICAgIE9NWF9JTlQgcHJlZERpciwKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAorICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCisgKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCisgKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCisgKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCisgKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCisgKiAgICAgICAgICAgIDYuMi4xLjIuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKKyAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCisgKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jayAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWF9JTlQgcHJlZGljdFR5cGUsCisgICAgT01YX0lOVCBybmRWYWwKKyk7CisKKworCisvKiA2LjMuMS4xIEludHJhIDE2eDE2IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfMTZ4MTYgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDXzE2WDE2X1ZFUlQgPSAwLCAgLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzE2WDE2X0hPUiA9IDEsICAgLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfREMgPSAyLCAgICAvKiogSW50cmFfMTZ4MTZfREMgKi8KKyAgICBPTVhfVkNfMTZYMTZfUExBTkUgPSAzICAvKiogSW50cmFfMTZ4MTZfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGU7CisKKworCisvKiA2LjMuMS4yIEludHJhIDR4NCBQcmVkaWN0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzR4NCBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfNFg0X1ZFUlQgPSAwLCAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAqLworICAgIE9NWF9WQ180WDRfSE9SID0gMSwgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWwgKi8KKyAgICBPTVhfVkNfNFg0X0RDID0gMiwgICAgICAgLyoqIEludHJhXzR4NF9EQyAqLworICAgIE9NWF9WQ180WDRfRElBR19ETCA9IDMsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLworICAgIE9NWF9WQ180WDRfRElBR19EUiA9IDQsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKi8KKyAgICBPTVhfVkNfNFg0X1ZSID0gNSwgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAqLworICAgIE9NWF9WQ180WDRfSEQgPSA2LCAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAqLworICAgIE9NWF9WQ180WDRfVkwgPSA3LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KKyAgICBPTVhfVkNfNFg0X0hVID0gOCAgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwICovIAorfSBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjMgQ2hyb21hIFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfQ0hST01BX0RDID0gMCwgICAgLyoqIEludHJhX0Nocm9tYV9EQyAqLworICAgIE9NWF9WQ19DSFJPTUFfSE9SID0gMSwgICAvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KKyAgICBPTVhfVkNfQ0hST01BX1ZFUlQgPSAyLCAgLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfUExBTkUgPSAzICAvKiogSW50cmFfQ2hyb21hX1BsYW5lICovIAorfSBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjQgTW90aW9uIEVzdGltYXRpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbW90aW9uIGVzdGltYXRpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0ggPSAwLCAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCisgICAgT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIID0gMSAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKK30gT01YVkNNNFAxME1FTW9kZTsKKworCisKKy8qIDYuMy4xLjUgTWFjcm9ibG9jayBUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX1BfMTZ4MTYgID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1BfMTZ4OCAgPSAxLAorICAgIE9NWF9WQ19QXzh4MTYgID0gMiwKKyAgICBPTVhfVkNfUF84eDggID0gMywKKyAgICBPTVhfVkNfUFJFRjBfOHg4ICA9IDQsCisgICAgT01YX1ZDX0lOVEVSX1NLSVAgID0gNSwKKyAgICBPTVhfVkNfSU5UUkFfNHg0ICA9IDgsCisgICAgT01YX1ZDX0lOVFJBXzE2eDE2ICA9IDksCisgICAgT01YX1ZDX0lOVFJBX1BDTSA9IDEwIAorfSBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjMuMS42IFN1Yi1NYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IHN1Yi1tYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX1NVQl9QXzh4OCA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLworICAgIE9NWF9WQ19TVUJfUF84eDQgPSAxLAorICAgIE9NWF9WQ19TVUJfUF80eDggPSAyLAorICAgIE9NWF9WQ19TVUJfUF80eDQgPSAzIAorfSBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjMuMS43IFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKFZMQykgSW5mb3JtYXRpb24gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZXM7ICAgICAgLyogVHJhaWxpbmcgb25lczsgMyBhdCBtb3N0ICovCisgICAgT01YX1U4IHVUcmFpbGluZ19PbmVfU2lnbnM7IC8qIFRyYWlsaW5nIG9uZXMgc2lnbmFsICovCisgICAgT01YX1U4IHVOdW1Db2VmZnM7ICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBub24temVybyBjb2VmcywgaW5jbHVkaW5nIHRyYWlsaW5nIG9uZXMgKi8KKyAgICBPTVhfVTggdVRvdGFsWmVyb3M7ICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHplcm8gY29lZnMgKi8KKyAgICBPTVhfUzE2IGlMZXZlbHNbMTZdOyAgICAgICAgLyogTGV2ZWxzIG9mIG5vbi16ZXJvIGNvZWZzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KKyAgICBPTVhfVTggdVJ1bnNbMTZdOyAgICAgICAgICAgLyogUnVucyBmb3IgbGV2ZWxzIGFuZCB0cmFpbGluZyBvbmVzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KK30gT01YVkNNNFAxMFZMQ0luZm87CisKKworCisvKiA2LjMuMS44IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KKyAgICBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgICAgICAgICAvKiBNQiB0eXBlICovCisgICAgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlIHN1Yk1CVHlwZVs0XTsgLyogc3ViLWJsb2NrIHR5cGUgKi8KKyAgICBPTVhfUzMyIHFweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgbHVtYSAqLworICAgIE9NWF9TMzIgcXBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBjaHJvbWEgKi8KKyAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLworICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPTB+MykgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIFJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9IDB+MykgKi8KKyAgICBPTVhfVTggcFJlZkwwSWR4WzRdOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWZlcmVuY2UgcGljdHVyZSBpbmRpY2VzICovCisgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBJbnRyYTE2eDE2UHJlZE1vZGU7IC8qIGJlc3QgaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlICovCisgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbMTZdOyAvKiBiZXN0IGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2ssIHBNVjAgaW5kZXhlZCBhcyBhYm92ZSAqLworfSBPTVhWQ000UDEwTUJJbmZvLCAqT01YVkNNNFAxME1CSW5mb1B0cjsKKworCisKKy8qIDYuMy4xLjkgTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTh4ODsgLyogZW5hYmxlcyAxNng4LCA4eDE2LCA4eDggKi8KKyAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU0eDQ7IC8qIGVuYWJsZSBzcGxpdHRpbmcgb2YgOHg0LCA0eDgsIDR4NCBibG9ja3MgKi8KKyAgICBPTVhfUzMyIGhhbGZTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBxdWFydGVyU2VhcmNoRW5hYmxlOworICAgIE9NWF9TMzIgaW50cmFFbmFibGU0eDQ7ICAgICAgLyogMT1lbmFibGUsIDA9ZGlzYWJsZSAqLworICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2UxNngxNjsgICAgLyogaW50ZWdlciBwaXhlbCB1bml0cyAqLworICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U4eDg7CisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTR4NDsKK30gT01YVkNNNFAxME1FUGFyYW1zOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKKyAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKKyAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCisgKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCisgKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKKyAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAorICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKKyAqICAgICAgICAgICAgMC4uMTUpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCisgKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAorICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqIE5vdGU6IAorICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCisgKiAgICAgICAgICAgIDAuLjcpLiAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAorICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKKyAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiAgTm90ZTogcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlciBpZiAKKyAqICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICoKKyAqICBOb3RlOiBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmEgY2hyb21hIHByZWRpY3Rpb24uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAorICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCisgKiAgIHNyY1N0ZXAgLSByZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCisgKiAgIGRzdFN0ZXAgLSBkZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGggCisgKiAgIGR4IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS80IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCisgKiAgIGR5IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCisgKiAgIHJvaSAtIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOiAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCisgKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAorICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aC4gCisgKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAorICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6CisgKiAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX1MzMiBkc3RTdGVwLAorICAgIE9NWF9TMzIgZHgsCisgICAgT01YX1MzMiBkeSwKKyAgICBPTVhTaXplIHJvaQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAorICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCisgKiAgICAgICAgICAgICAgaXMgTlVMTC4gCisgKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKKyAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAorICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKKyAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDh4OCkuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCisgKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKKyAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCisgKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCUyBwYXJhbWV0ZXIgcGFzc2VkIGludG8gRmlsdGVyRGVibG9ja0x1bWFfVmVyRWRnZTsgCisgKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIAorICogICAgICAgICAgICBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNCBieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCisgKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKKyAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKKyAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKKyAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCisgKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgKDYuMy4zLjMuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIAorICogdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIGltYWdlIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAorICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAorICogICAgICAgICAgICB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge3ZhbHVlcyBmb3IgdGhlIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgCisgKiAgICAgICAgICAgIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyfTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAorICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAorICogICAgICAgICAgICA0LiBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcyBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDI1NV0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICg2LjMuMy4zLjYpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgQmV0YSBUaHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHsgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIAorICogICAgICAgICAgICBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMThdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAorICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAorICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCisgKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCisgKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAorICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCisgKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCisgKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKKyAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKKyAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX1MzMipwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCisgKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCisgKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAorICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCisgKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCisgKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKKyAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCisgKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCisgKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKKyAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKKyAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCisgKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCisgKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKKyAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCisgKgorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX1MzMiAqcE9mZnNldCwKKyAgICBPTVhfVTggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTggKipwcFBvc0NvZWZidWYsCisgICAgT01YX0lOVCBzVkxDU2VsZWN0LAorICAgIE9NWF9JTlQgc01heE51bUNvZWZmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAorICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKKyAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAorICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICgKKyAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICg2LjMuNC4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAorICogcGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YgCisgKiByZXNpZHVhbHMgd2l0aCBwcmV2aW91cyBpbnRyYSBwcmVkaWN0aW9uIG9yIG1vdGlvbiBjb21wZW5zYXRpb24gZGF0YSwgYW5kIAorICogdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLiBJZiBwREMgPT0gTlVMTCwgCisgKiB0aGVyZSByZSAxNiBub24temVybyBBQyBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2VkIGJ1ZmZlciBzdGFydGluZyAKKyAqIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIDA7IElmIHBEQyAhPSBOVUxMLCB0aGVyZSByZSAxNSBub24temVybyBBQyAKKyAqIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZXQgYnVmZmVyIHN0YXJ0aW5nIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIAorICogMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBwUHJlZCAtIFBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCA0eDQgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIHByZWRTdGVwIC0gUHJlZGljdGVkIGZyYW1lIHN0ZXAgc2l6ZSBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIGRzdFN0ZXAgLSBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcERDIC0gUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTCBpZiBpdCBkb2Vzbid0IAorICogICAgICAgICAgICBleGlzdCAKKyAqICAgUVAgLSBRUCBRdWFudGl6YXRpb24gcGFyYW1ldGVyLiAgSXQgc2hvdWxkIGJlIFFwQyBpbiBjaHJvbWEgNHg0IGJsb2NrIAorICogICAgICAgICAgICBkZWNvZGluZywgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBRcFkuIAorICogICBBQyAtIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgZXhpc3RzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCisgKiAgICAgICAgICAgIDQtYnl0ZSBib3VuZGFyeSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHByZWRTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICAtICAgIEFDICE9MCBhbmQgUXAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0gb3IgcHBTcmMgPT0gTlVMTC4gCisgKiAgICAtICAgIEFDID09MCAmJiBwREMgPT1OVUxMLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBwcmVkU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhfSU5UIEFDCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAorICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCisgKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICBPTVhfVTMyICpwU2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCisgKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCisgKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKKyAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCisgKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKKyAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCisgKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCisgKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCisgKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKKyAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCisgKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAorICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIHZvaWQgKnBNRVNwZWMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jazoKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6IAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCisgKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCisgKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBOVUxMOgorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAorICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0LAorICAgIHZvaWQgKnBNRVNwZWMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCisgKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAorICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCisgKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAorICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6ICAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAorICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaCwgCisgKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBoYWxmLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCBpbiAKKyAqICAgICAgICAgICAgdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjT3JnWSwgcFNyY1JlZlksIAorICogICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAoNi4zLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSBxdWFydGVyLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBoYWxmLXBlbCAKKyAqIHNlYXJjaC4gIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIAorICogdGhlIHF1YXJ0ZXItcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uIAorICogbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIAorICogaW5pdGlhbCBoYWxmLXBlbCBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmIG1heSBiZSB1c2VkIGZvciBoYWxmLXBlbCBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCisgKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKKyAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4zLjUuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiAKKyAqIHN0cmF0ZWd5IGZyb20gdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ3VyckJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICBwU3JjUmVmQnVmTGlzdCAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgd2l0aCAxNiBlbnRyaWVzLiAgRWFjaCBlbnRyeSBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gYSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBpY3R1cmUuICBUaGUgYXJyYXkgaXMgZmlsbGVkIGZyb20gbG93LXRvLWhpZ2ggd2l0aCB2YWxpZCAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIGZyYW1lIHBvaW50ZXJzOyB0aGUgdW51c2VkIGhpZ2ggZW50cmllcyBzaG91bGQgYmUgc2V0IAorICogICAgICAgICAgICB0byBOVUxMLiAgT3JkZXJpbmcgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXMgc2hvdWxkIGZvbGxvdyAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBzdWJjbGF1c2UgOC4yLjQgIERlY29kaW5nIFByb2Nlc3MgZm9yIFJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgUGljdHVyZSBMaXN0cy4gICBUaGUgZW50cmllcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHBTcmNSZWNCdWYgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIHBpY3R1cmU7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgU3JjQ3VyclN0ZXAgLSBXaWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlZlN0ZXAgLSBXaWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBTcmNSZWNTdGVwIC0gV2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBSZWZSZWN0IC0gUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIAorICogICAgICAgICAgICBpbWFnZSBvcmlnaW4uIAorICogICBwQ3VyclBvaW50UG9zIC0gUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIExhbWJkYSAtIExhZ3JhbmdlIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBjb3N0IGZ1bmN0aW9uIAorICogICBwTUVTcGVjIC0gUG9pbnRlciB0byB0aGUgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgCisgKiAgICAgICAgICAgIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyAKKyAqICAgICAgICAgICAgZnVuY3Rpb24uIAorICogICBwTUJJbnRlciAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgCisgKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAorICogICAgICAgICAgICBJTlRFUi4gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRlclsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCisgKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVFJBLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCisgKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKKyAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAorICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAorICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogCisgKiAgICAgICAgICAgIC0gIE1iVHlwZSAKKyAqICAgICAgICAgICAgLSAgc3ViTUJUeXBlWzRdIAorICogICAgICAgICAgICAtICBwTVYwWzRdWzRdIAorICogICAgICAgICAgICAtICBwTVZQcmVkWzRdWzRdIAorICogICAgICAgICAgICAtICBwUmVmTDBJZHhbNF0gCisgKiAgICAgICAgICAgIC0gIEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgICAgICAgICAgLSAgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAorICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCisgKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0WzE1XSwKKyAgICBPTVhfUzMyIFNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLAorICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIE9NWF9VMzIgTGFtYmRhLAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCisgICAgT01YVkNNNFAxME1CSW5mb1B0ciBwU3JjRHN0TUJDdXJyLAorICAgIE9NWF9JTlQgKnBEc3RDb3N0LAorICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9TMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICg2LjMuNS40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgNHg4IG9yIDR4NCBibG9ja3MuICBSb3VuZGluZyAKKyAqIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1UzMiBpUmVmU3RlcDAsCisgICAgT01YX1UzMiBpUmVmU3RlcDEsCisgICAgT01YX1UzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgKDYuMy41LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA4eDE2LCA4eDgsIG9yIDh4NCBibG9ja3MuICAKKyAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfOHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCisgKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCisgKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9VMzIgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAorICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCisgKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgtMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCisgKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0TGVmdCwKKyAgICBPTVhfVTggKnBEc3RSaWdodCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCisgKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdFVwLAorICAgIE9NWF9VOCAqcERzdERvd24sCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlXaWR0aCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKKyAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAorICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAwLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKKyAgICBPTVhfVTggKnBEc3RQcmVkLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjRHN0IAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VMzIgaVFQLAorICAgIE9NWF9VOCBiSW50cmEKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAoNi4zLjUuNi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0IAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1UzMiBpUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKKyAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKKyAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIG1hdHJpeC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKKyAgICBjb25zdCBPTVhfUzE2ICpwRGVxdWFudENvZWZmLAorICAgIE9NWF9VOCAqcERzdFJlY29uLAorICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAorICAgIE9NWF9VMzIgaURzdFJlY29uU3RlcCwKKyAgICBPTVhfVTggYkFDCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKKyAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKKyAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKKyAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCisgKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKKyAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgNC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAorICogICAgICAgICAgICBvZiA0LiAKKyAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAorICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKKyAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAorICogICAgICAgICAgICAwLUlOVEVSIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAorICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAorICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKKyAgICBPTVhfVTMyIGlTcmNPcmdTdGVwLAorICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAorICAgIE9NWF9TMTYgKnBEc3RRdWFudENvZWZmLAorICAgIE9NWF9TMTYgKnBEc3REZVF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERDQ29lZmYsCisgICAgT01YX1M4ICpwTnVtQ29lZmYsCisgICAgT01YX1UzMiBuVGhyZXNoU0FELAorICAgIE9NWF9VMzIgaVFQLAorICAgIE9NWF9VOCBiSW50cmEKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKKyAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKKyAqIHN0cnVjdHVyZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKKyAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKKyAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKKyAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKKyAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKKyAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCisgKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCisgKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKKyAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNDb2VmZiwKKyAgICBjb25zdCBPTVhfVTggKnBTY2FuTWF0cml4LAorICAgIE9NWF9VOCBiQUMsCisgICAgT01YX1UzMiBNYXhOdW1Db2VmLAorICAgIE9NWFZDTTRQMTBWTENJbmZvKnBEc3RWTENJbmZvCispOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qKiBlbmQgb2YgI2RlZmluZSBfT01YVkNfSF8gKi8KKworLyoqIEVPRiAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg5ZjMwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDX3MuaApAQCAtMCwwICsxLDEyOSBAQAorOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCis7LyoqID09PT09PT09PT09PT09PSBTdHJ1Y3R1cmUgRGVmaW5pdGlvbiBmb3IgU2FtcGxlIEdlbmVyYXRpb24gPT09PT09PT09PT09PT0gKi8KKzsvKiogdHJhbnNwYXJlbnQgc3RhdHVzICovCisKKztlbnVtIHsKK09NWF9WSURFT19UUkFOU1BBUkVOVAlFUVUgMDsJLyoqIFdob2xseSB0cmFuc3BhcmVudCAqLworT01YX1ZJREVPX1BBUlRJQUwJCUVRVSAxOwkvKiogUGFydGlhbGx5IHRyYW5zcGFyZW50ICovCitPTVhfVklERU9fT1BBUVVFCQlFUVUgMjsJLyoqIE9wYXF1ZSAqLworO30KKworOy8qKiBkaXJlY3Rpb24gKi8KKztlbnVtIHsKK09NWF9WSURFT19OT05FCQkJRVFVIDA7CitPTVhfVklERU9fSE9SSVpPTlRBTAlFUVUgMTsKK09NWF9WSURFT19WRVJUSUNBTAkJRVFVIDI7Cis7fQorCis7LyoqIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSAqLworO2VudW0geworT01YX1ZJREVPX0lOVEVHRVJfUElYRUwgRVFVIDA7CS8qKiBjYXNlIGEgKi8KK09NWF9WSURFT19IQUxGX1BJWEVMX1ggIEVRVSAxOwkvKiogY2FzZSBiICovCitPTVhfVklERU9fSEFMRl9QSVhFTF9ZICBFUVUgMjsJLyoqIGNhc2UgYyAqLworT01YX1ZJREVPX0hBTEZfUElYRUxfWFkgRVFVIDM7CS8qKiBjYXNlIGQgKi8KKzt9CisKKztlbnVtIHsKK09NWF9VUFBFUiAgCQkJCUVRVSAxOwkJLyoqIHNldCBpZiB0aGUgYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9MRUZUICAgCQkJCUVRVSAyOwkJLyoqIHNldCBpZiB0aGUgbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworT01YX0NFTlRFUiAJCQkJRVFVIDQ7CitPTVhfUklHSFQJCQkJRVFVIDg7CitPTVhfTE9XRVIgIAkJCQlFUVUJMTY7CitPTVhfVVBQRVJfTEVGVCAgCQlFUVUgMzI7CQkvKiogc2V0IGlmIHRoZSBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfVVBQRVJfUklHSFQgCQlFUVUgNjQ7CQkvKiogc2V0IGlmIHRoZSBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworT01YX0xPV0VSX0xFRlQgIAkJRVFVIDEyODsKK09NWF9MT1dFUl9SSUdIVCAJCUVRVSAyNTYKKzt9CisKKztlbnVtIHsKK09NWF9WSURFT19MVU1JTkFOQ0UgIAlFUVUgMDsJLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KK09NWF9WSURFT19DSFJPTUlOQU5DRSAgCUVRVSAxOwkvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovCitPTVhfVklERU9fQUxQSEEgIAkJRVFVIDI7CS8qKiBBbHBoYSBjb21wb25lbnQgKi8KKzt9CisKKztlbnVtIHsKK09NWF9WSURFT19JTlRFUgkJCUVRVSAwOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVklERU9fSU5URVJfUQkJRVFVIDE7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WSURFT19JTlRFUjRWCQlFUVUgMjsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZJREVPX0lOVFJBCQkJRVFVIDM7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLworT01YX1ZJREVPX0lOVFJBX1EJCUVRVSA0OwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KK09NWF9WSURFT19JTlRFUjRWX1EJCUVRVSA1OwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLworT01YX1ZJREVPX0RJUkVDVAkJRVFVIDY7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKE1QRUctNCBvbmx5KSAqLworT01YX1ZJREVPX0lOVEVSUE9MQVRFCUVRVSA3OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCitPTVhfVklERU9fQkFDS1dBUkQJCUVRVSA4OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCitPTVhfVklERU9fRk9SV0FSRAkJRVFVIDk7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KK09NWF9WSURFT19OT1RDT0RFRAkJRVFVIDEwOwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCis7fQorCis7ZW51bSB7CitPTVhfMTZYMTZfVkVSVCAJCQlFUVUgMDsJCS8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzE2WDE2X0hPUiAJCQlFUVUgMTsJCS8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfMTZYMTZfREMgCQkJRVFVIDI7CQkvKiogSW50cmFfMTZ4MTZfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF8xNlgxNl9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfMTZ4MTZfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KKzt9CisKKztlbnVtIHsKK09NWF80eDRfVkVSVCAJCQlFUVUgMDsJCS8qKiBJbnRyYV80eDRfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfSE9SICAJCQlFUVUgMTsJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9EQyAgIAkJCUVRVSAyOwkJLyoqIEludHJhXzR4NF9EQyAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9ESUFHX0RMIAkJRVFVIDM7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0IChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0RJQUdfRFIgCQlFUVUgNDsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0IChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X1ZSIAkJCQlFUVUgNTsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0IChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0hEIAkJCQlFUVUgNjsJCQkvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9WTCAJCQkJRVFVIDc7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0IChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0hVIAkJCQlFUVUgODsJCQkvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKHByZWRpY3Rpb24gbW9kZSkgKi8KKzt9CisKKztlbnVtIHsKK09NWF9DSFJPTUFfREMgCQkJRVFVIDA7CQkvKiogSW50cmFfQ2hyb21hX0RDIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfQ0hST01BX0hPUiAJCQlFUVUgMTsJCS8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YX0NIUk9NQV9WRVJUIAkJRVFVIDI7CS8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF9DSFJPTUFfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhX0Nocm9tYV9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLworO30KKworO3R5cGVkZWYJc3RydWN0IHsJCit4CUVRVQkwOworeQlFUVUJNDsKKzt9T01YQ29vcmRpbmF0ZTsKKworO3R5cGVkZWYgc3RydWN0IHsKK2R4CUVRVQkwOworZHkJRVFVCTI7Cis7fU9NWE1vdGlvblZlY3RvcjsKKworO3R5cGVkZWYgc3RydWN0IHsKK3h4CQlFUVUJMDsKK3l5CQlFUVUJNDsKK3dpZHRoCUVRVQk4OworaGVpZ2h0CUVRVQkxMjsKKzt9T01YaVJlY3Q7CisKKzt0eXBlZGVmIGVudW0geworT01YX1ZDX0lOVEVSICAgICAgICAgRVFVIDA7ICAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVkNfSU5URVJfUSAgICAgICBFUVUgMTsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZDX0lOVEVSNFYgICAgICAgRVFVIDI7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WQ19JTlRSQSAgICAgICAgIEVRVSAzOyAgICAgICAgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCitPTVhfVkNfSU5UUkFfUSAgICAgICBFUVUgNDsgICAgICAgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCitPTVhfVkNfSU5URVI0Vl9RICAgICBFUVUgNTsgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KKzt9IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOworCis7ZW51bSB7CitPTVhfVkNfTk9ORSAgICAgICAgICBFUVUgMAorT01YX1ZDX0hPUklaT05UQUwgICAgRVFVIDEKK09NWF9WQ19WRVJUSUNBTCAgICAgIEVRVSAyIAorO307CisKKworCUVORAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjk2ZDU5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwpAQCAtMCwwICsxLDk1IEBACisgOy8qKgorIDsgKiBGdW5jdGlvbjogb214VkNDT01NX0NvcHkxNngxNgorIDsgKgorIDsgKiBEZXNjcmlwdGlvbjoKKyA7ICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgOyAqIFBhcmFtZXRlcnM6CisgOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgorIDsgKiBbaW5dIHN0ZXAgICAgICAgICAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIGZyYW1lLCBpbiBieXRlczsKKyA7ICogICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gMTYuCisgOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFJldHVybiBWYWx1ZToKKyA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgorIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeTogIHBTcmMsIHBEc3QKKyA7ICogICAgICAgICAgICAgICAgICAgLSBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAgCisgOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgCisgICAgIAorICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgIAorICAgICBJRiBDb3J0ZXhBOAorICAgICAKKyAgICAgCisgOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjICAgIFJOIDAgICAgICAgIAorcERzdCAgICBSTiAxICAgICAgICAKK3N0ZXAgICAgUk4gMgorCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK1JldHVybiAgUk4gMAorOy8vIE5lb24gUmVnaXN0ZXJzCisKK1gwICAgICAgRE4gRDAuUzggCitYMSAgICAgIEROIEQxLlM4IAorWDIgICAgICBETiBEMi5TOAorWDMgICAgICBETiBEMy5TOAorWDQgICAgICBETiBENC5TOAorWDUgICAgICBETiBENS5TOAorWDYgICAgICBETiBENi5TOAorWDcgICAgICBETiBENy5TOCAKKyAKKyAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTE2eDE2CisgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwICAgICAgIDsvLyBMb2FkIDE2IGJ5dGVzIGZyb20gMTYgYnl0ZSBhbGlnbmVkIHBTcmMgYW5kIHBTcmM9cFNyYyArIHN0ZXAgYWZ0ZXIgbG9hZGluZworICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdISAgICAgOy8vIFN0b3JlIDMyIGJ5dGVzIHRvIDE2IGJ5dGUgYWxpZ25lZCBwRHN0ICAgCisgICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gyLFgzfSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1g0LFg1fSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1g2LFg3fSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgIHtYMCxYMSxYMixYM30sW3BEc3RAMTI4XSEKKyAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdIQorICAgICAgICAgCisgICAgICAKKyAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gyLFgzfSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1g0LFg1fSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1g2LFg3fSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgIHtYMCxYMSxYMixYM30sW3BEc3RAMTI4XSEgICAgICAgICAgICAgIAorICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdIQorICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hCisKKyAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorCisgICAgIAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKworCisKKyAgICAgICAgCisgICAgICAgIEVORAorICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiOWU1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCkBAIC0wLDAgKzEsNzAgQEAKKyA7LyoqCisgOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTh4OAorIDsgKgorIDsgKiBEZXNjcmlwdGlvbjoKKyA7ICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgorIDsgKiBQYXJhbWV0ZXJzOgorIDsgKiBbaW5dIHBTcmMgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorIDsgKiBbaW5dIHN0ZXAgICAgICAgICAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIGZyYW1lLCBpbiBieXRlczsKKyA7ICogICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byA4LgorIDsgKiBbb3V0XSBwRHN0ICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorIDsgKiBSZXR1cm4gVmFsdWU6CisgOyAqIE9NWF9TdHNfTm9FcnIgICAgIC0gbm8gZXJyb3IKKyA7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogIHBTcmMsIHBEc3QKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeTogIHBTcmMsIHBEc3QKKyA7ICogICAgICAgICAgICAgICAgICAgLSBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gIAorIDsgKi8KKworICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgIAorICAgICAKKyAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAKKyAgICAgSUYgQ29ydGV4QTgKKyAgICAgCisgICAgIAorIDsvL0lucHV0IEFyZ3VtZW50cworcFNyYyAgICBSTiAwICAgICAgICAKK3BEc3QgICAgUk4gMSAgICAgICAgCitzdGVwICAgIFJOIDIKKworOy8vTG9jYWwgVmFyaWFibGVzCitDb3VudCAgIFJOIDMKK1JldHVybiAgUk4gMAorOy8vIE5lb24gUmVnaXN0ZXJzCisKK1gwICAgICAgRE4gRDAuUzggCitYMSAgICAgIEROIEQxLlM4CitYMiAgICAgIEROIEQyLlM4CitYMyAgICAgIEROIEQzLlM4CisgICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHk4eDgKKyAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZMRDEgIHtYMH0sW3BTcmNdLHN0ZXAgICAgICAgICAgICA7Ly8gTG9hZCA4IGJ5dGVzIGZyb20gOCBieXRlIGFsaWduZWQgcFNyYywgcFNyYz1wU3JjK3N0ZXAgYWZ0ZXIgbG9hZAorICAgICAgICBWTEQxICB7WDF9LFtwU3JjXSxzdGVwCisgICAgICAgIFZMRDEgIHtYMn0sW3BTcmNdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gzfSxbcFNyY10sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxfSxbcERzdF0hICAgICAgICAgICAgOy8vIFN0b3JlIDE2IGJ5dGVzIHRvIDggYnl0ZSBhbGlnbmVkIHBEc3QgIAorICAgICAgICBWU1QxICB7WDIsWDN9LFtwRHN0XSEgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkxEMSAge1gwfSxbcFNyY10sc3RlcAorICAgICAgICBWTEQxICB7WDF9LFtwU3JjXSxzdGVwCisgICAgICAgIFZMRDEgIHtYMn0sW3BTcmNdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gzfSxbcFNyY10sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxfSxbcERzdF0hICAgICAgICAgICAgICAKKyAgICAgICAgVlNUMSAge1gyLFgzfSxbcERzdF0hICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKworCisKKyAgICAgICAgCisgICAgICAgIEVORAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YzViN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwpAQCAtMCwwICsxLDIzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBFeHBhbmQgRnJhbWUgYm91bmRhcnkgcGl4ZWxzIGludG8gUGxhbmUKKzsvLyAKKzsvLyAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKKzsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQorICAgIAorICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCisKKyAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JLHIxMQorCis7Ly9JbnB1dCByZWdpc3RlcnMKKworcFNyY0RzdFBsYW5lICAgIFJOICAwCitpRnJhbWVXaWR0aCAgICAgUk4gIDEKK2lGcmFtZUhlaWdodCAgICBSTiAgMiAgICAKK2lFeHBhbmRQZWxzICAgICBSTiAgMworaVBsYW5lU3RlcCAgICAgIFJOICA0CitwVG9wICAgICAgICAgICAgUk4gIDUKK3BCb3QgICAgICAgICAgICBSTiAgNgorcERzdFRvcCAgICAgICAgIFJOICA3CitwRHN0Qm90ICAgICAgICAgUk4gIDgKK3BMZWZ0ICAgICAgICAgICBSTiAgNQorcFJpZ2h0ICAgICAgICAgIFJOICA2CitwRHN0TGVmdCAgICAgICAgUk4gIDkKK3BEc3RSaWdodCAgICAgICBSTiAgMTAKK09mZnNldCAgICAgICAgICBSTiAgMTEKK1RlbXAgICAgICAgICAgICBSTiAgMTQKK0NvdW50ZXIgICAgICAgICBSTiAgMTIKK1RtcCAgICAgICAgICAgICBSTiAgNworOy8vT3V0cHV0IHJlZ2lzdGVycworCityZXN1bHQgICAgICAgICAgUk4gIDAKKzsvLyBOZW9uIHJlZ2lzdGVycworcURhdGEwICAgICAgICAgIFFOICAwLlU4CitxRGF0YTEgICAgICAgICAgUU4gIDEuVTgKK2REYXRhMCAgICAgICAgICBETiAgMC5VOAorZERhdGExICAgICAgICAgIEROICAxLlU4CitkRGF0YTIgICAgICAgICAgRE4gIDIuVTgKK2REYXRhMyAgICAgICAgICBETiAgMy5VOAorCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgICAgIHBQbGFuZVN0ZXAsIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSICAgICAgIGlQbGFuZVN0ZXAsIHBQbGFuZVN0ZXAKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBUb3AsIHBTcmNEc3RQbGFuZSwgIzAgICAgICAgICAgICAgIDsvLyBUb3Agcm93IHBvaW50ZXIgb2YgdGhlIGZyYW1lCisgICAgICAgIE1VTCAgICAgICAgIE9mZnNldCwgaUV4cGFuZFBlbHMsIGlQbGFuZVN0ZXAgICAgIDsvLyBFKlN0ZXAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBUZW1wLCBpRnJhbWVIZWlnaHQsICMxICAgICAgICAgICAgICA7Ly8gSC0xCisgICAgICAgIE1VTCAgICAgICAgIFRlbXAsIGlQbGFuZVN0ZXAsIFRlbXAgICAgICAgICAgICAgIDsvLyAoSC0xKSpTdGVwCisgICAgICAgIEFERCAgICAgICAgIHBCb3QsIFRlbXAsIHBTcmNEc3RQbGFuZSAgICAgICAgICAgIDsvLyBCUHRyID0gVFB0ciArIChILTEpKlN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgVGVtcCwgaUZyYW1lV2lkdGggICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIGxvb3AgY291bnRlcgorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIGlmIHBTcmNEc3RQbGFuZSBhbmQgaVBsYW5lU3RlcCBhcmUgMTYgYnl0ZSBhbGlnbmVkCisgICAgICAgIFRTVCAgICAgICAgIHBTcmNEc3RQbGFuZSwgIzB4ZgorICAgICAgICBUU1RFUSAgICAgICBpUGxhbmVTdGVwLCAjMHhmICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgSG9yOExvb3AwMAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDb3B5IHRvcCBhbmQgYm90dG9tIHJlZ2lvbiBvZiB0aGUgcGxhbmUgYXMgZm9sbG93cworICAgICAgICA7Ly8gdG9wIHJlZ2lvbiA9IHRvcCByb3cgZWxlbWVudHMgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vIGJvdHRvbSByZWdpb24gPSBsYXN0IHJvdyBlbGVtZW50cyBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8KKworICAgICAgICA7Ly8gQ2FzZSBmb3IgMTYgYnl0ZSBhbGlnbm1lbnQKK0hvcjE2TG9vcDAwCisgICAgICAgIFNVQiAgICAgICAgIHBEc3RUb3AsIHBUb3AsIE9mZnNldAorICAgICAgICBWTEQxICAgICAgICBxRGF0YTAsIFtwVG9wIEAxMjhdIQorICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscyAgICAgICAgICAgICAgICA7Ly8gSW5uZXIgbG9vcCBjb3VudGVyCisgICAgICAgIEFERCAgICAgICAgIHBEc3RCb3QsIHBCb3QsIGlQbGFuZVN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgcURhdGExLCBbcEJvdCBAMTI4XSEKK1ZlcjE2TG9vcDAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4CisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcCAgICAgICAgCisgICAgICAgIEJHVCAgICAgICAgIFZlcjE2TG9vcDAKKworICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMTYKKyAgICAgICAgQkdUICAgICAgICAgSG9yMTZMb29wMDAKKyAgICAgICAgQiAgICAgICAgICAgRW5kQWxpZ25lZExvb3AKKyAgICAgICAgCisgICAgICAgIDsvLyBDYXNlIGZvciA4IGJ5dGUgYWxpZ25tZW50CitIb3I4TG9vcDAwCisgICAgICAgIFNVQiAgICAgICAgIHBEc3RUb3AsIHBUb3AsIE9mZnNldAorICAgICAgICBWTEQxICAgICAgICBxRGF0YTAsIFtwVG9wIEA2NF0hCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgIDsvLyBJbm5lciBsb29wIGNvdW50ZXIKKyAgICAgICAgQUREICAgICAgICAgcERzdEJvdCwgcEJvdCwgaVBsYW5lU3RlcAorICAgICAgICBWTEQxICAgICAgICBxRGF0YTEsIFtwQm90IEA2NF0hCitWZXI4TG9vcDAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgVmVyOExvb3AwCisKKyAgICAgICAgU1VCUyAgICAgICAgVGVtcCwgVGVtcCwgIzE2CisgICAgICAgIEJHVCAgICAgICAgIEhvcjhMb29wMDAKKworRW5kQWxpZ25lZExvb3AKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcFNyY0RzdFBsYW5lLCBpRnJhbWVXaWR0aAorICAgICAgICBTVUIgICAgICAgICBwRHN0UmlnaHQsIFRlbXAsIE9mZnNldAorICAgICAgICBTVUIgICAgICAgICBwUmlnaHQsIFRlbXAsICMxCisgICAgICAgIFNVQiAgICAgICAgIHBEc3RMZWZ0LCBwU3JjRHN0UGxhbmUsIE9mZnNldCAgICAKKyAgICAgICAgU1VCICAgICAgICAgcERzdExlZnQsIHBEc3RMZWZ0LCBpRXhwYW5kUGVscyAgICAKKyAgICAgICAgQUREICAgICAgICAgcExlZnQsIHBTcmNEc3RQbGFuZSwgIzAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTAgW119LCBbcExlZnRdLCBpUGxhbmVTdGVwICAgICAgICA7Ly8gVG9wLUxlZnQgY29ybmVyIHBpeGVsIGZyb20gZnJhbWUgZHVwbGljYXRlZCBpbiBkRGF0YTAKKyAgICAgICAgU1VCICAgICAgICAgT2Zmc2V0LCBpUGxhbmVTdGVwLCBpRXhwYW5kUGVscworICAgICAgICBWTEQxICAgICAgICB7ZERhdGExIFtdfSwgW3BSaWdodF0sIGlQbGFuZVN0ZXAgICAgICAgOy8vIFRvcC1SaWdodCBjb3JuZXIgcGl4ZWwgZnJvbSBmcmFtZSBkdXBsaWNhdGVkIGluIGREYXRhMQorICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRXhwYW5kUGVscworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ29weSB0b3AtbGVmdCBhbmQgdG9wLXJpZ2h0IHJlZ2lvbiBvZiB0aGUgcGxhbmUgYXMgZm9sbG93cworICAgICAgICA7Ly8gdG9wLWxlZnQgcmVnaW9uID0gdG9wLWxlZnQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLyB0b3AtcmlnaHQgcmVnaW9uID0gdG9wLXJpZ2h0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8KK0hvckxvb3AxMQorICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscworVmVyTG9vcDEKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGEwLCBbcERzdExlZnRdLCAjOAorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAorICAgICAgICBWU1QxICAgICAgICBkRGF0YTEsIFtwRHN0UmlnaHRdLCAjOCAgICAgICAgCisgICAgICAgIEJHVCAgICAgICAgIFZlckxvb3AxCisKKyAgICAgICAgU1VCUyAgICAgICAgVGVtcCwgVGVtcCwgIzEKKyAgICAgICAgQUREICAgICAgICAgcERzdExlZnQsIHBEc3RMZWZ0LCBPZmZzZXQKKyAgICAgICAgQUREICAgICAgICAgcERzdFJpZ2h0LCBwRHN0UmlnaHQsIE9mZnNldAorICAgICAgICBCUEwgICAgICAgICBIb3JMb29wMTEKKworICAgICAgICBTVUIgICAgICAgICBpRnJhbWVIZWlnaHQsIGlGcmFtZUhlaWdodCwgIzEKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDb3B5IGxlZnQgYW5kIHJpZ2h0IHJlZ2lvbiBvZiB0aGUgcGxhbmUgYXMgZm9sbG93cworICAgICAgICA7Ly8gTGVmdCByZWdpb24gPSBjb3B5IHRoZSByb3cgd2l0aCBsZWZ0IHN0YXJ0IHBpeGVsIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLyBSaWdodCByZWdpb24gPSBjb3B5IHRoZSByb3cgd2l0aCByaWdodCBlbmQgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vCitIb3JMb29wMjIKKyAgICAgICAgVkxEMSAgICAgICAge2REYXRhMCBbXX0sIFtwTGVmdF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMKKyAgICAgICAgVkxEMSAgICAgICAge2REYXRhMSBbXX0sIFtwUmlnaHRdLCBpUGxhbmVTdGVwCitWZXJMb29wMgorICAgICAgICBWU1QxICAgICAgICBkRGF0YTAsIFtwRHN0TGVmdF0sICM4CisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4CisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMSwgW3BEc3RSaWdodF0sICM4ICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgVmVyTG9vcDIKKworICAgICAgICBTVUJTICAgICAgICBpRnJhbWVIZWlnaHQsIGlGcmFtZUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICAgICAgcERzdExlZnQsIHBEc3RMZWZ0LCBPZmZzZXQKKyAgICAgICAgQUREICAgICAgICAgcERzdFJpZ2h0LCBwRHN0UmlnaHQsIE9mZnNldAorICAgICAgICBCR1QgICAgICAgICBIb3JMb29wMjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgVGVtcCwgaUV4cGFuZFBlbHMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDb3B5IGJvdHRvbS1sZWZ0IGFuZCBib3R0b20tcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyBib3R0b20tbGVmdCByZWdpb24gPSBib3R0b20tbGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vIGJvdHRvbS1yaWdodCByZWdpb24gPSBib3R0b20tcmlnaHQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLworSG9yTG9vcDMzCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzCitWZXJMb29wMworICAgICAgICBWU1QxICAgICAgICBkRGF0YTAsIFtwRHN0TGVmdF0sICM4CisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4CisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMSwgW3BEc3RSaWdodF0sICM4ICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgVmVyTG9vcDMKKworICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMQorICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAorICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0CisgICAgICAgIEJHVCAgICAgICAgIEhvckxvb3AzMworRW5kCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgTV9FTkQgICAgCisgICAgCisgICAgRU5ESUYKKworCisKKyAgICAgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgCisgICAgICAgICAgICAKKyAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU0N2EyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApAQCAtMCwwICsxLDMwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBIZWFkZXIgZmlsZSBmb3Igb3B0aW1pemVkIEguMjY0IENBTFZDIHRhYmxlcworICogCisgKi8KKyAKKyNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisjZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAorICAKKy8qIENBVkxDIHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF07CitleHRlcm4gY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZjA4OTJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIyMiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworOy8vIEZ1bmN0aW9uczoKKzsvLyAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjxBTElHTk1FTlQ+X3Vuc2FmZSAgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIEF2ZXJhZ2Ugb2YgNHg0IHdpdGggZXF1YXRpb24gYyA9IChhK2IrMSk+PjEuCis7Ly8gRmlyc3Qgb3BlcmFuZCB3aWxsIGJlIGF0IG9mZnNldCBBTElHTk1FTlQgZnJvbSBhbGlnbmVkIGFkZHJlc3MKKzsvLyBTZWNvbmQgb3BlcmFuZCB3aWxsIGJlIGF0IGFsaWduZWQgbG9jYXRpb24gYW5kIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQuCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIyIGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHIzIHN0ZXAgc2l6ZQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjQscjUscjYscjgscjkscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMiAtIHBvaW50ZXIgdG8gdGhlIGFsaWduZWQgbG9jYXRpb24KKzsvLyByMyAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BQcmVkMCAgICAgICAgICBSTiAwCitpUHJlZFN0ZXAwICAgICAgUk4gMQorcFByZWQxICAgICAgICAgIFJOIDIKK2lQcmVkU3RlcDEgICAgICBSTiAzCitwRHN0UHJlZCAgICAgICAgUk4gMgoraURzdFN0ZXAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworaVByZWRBMCAgICAgICAgIFJOIDEwCitpUHJlZEExICAgICAgICAgUk4gMTEKK2lQcmVkQjAgICAgICAgICBSTiAxMgoraVByZWRCMSAgICAgICAgIFJOIDE0CitUZW1wMSAgICAgICAgICAgUk4gNAorVGVtcDIgICAgICAgICAgIFJOIDUKK1Jlc3VsdEEgICAgICAgICBSTiA1CitSZXN1bHRCICAgICAgICAgUk4gNAorcjB4ODA4MDgwODAgICAgIFJOIDcKKworICAgIElGIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKKyAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDAgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKKworICAgICAgICA7Ly8gMXN0IGxvYWQKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorCisgICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyAybmQgbG9hZAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCitFbmQwCisgICAgICAgIE1fRU5ECisKKyAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKKyAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDIgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKKworICAgICAgICA7Ly8gMXN0IGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKKworICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4CisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyAybmQgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2CisKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKK0VuZDIKKyAgICAgICAgTV9FTkQKKworCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAzIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4CisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyAybmQgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKKworICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAorRW5kMworICAgICAgICBNX0VORAorCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzNzQ5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpAQCAtMCwwICsxLDMyNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBPcHRpbWl6ZWQgQ0FWTEMgdGFibGVzIGZvciBILjI2NAorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgorCisvKiA0eDQgRGVaaWdaYWcgdGFibGUgKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl0gPQoreworICAgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKK307CisKKy8qIDJ4MiBEZVppZ1phZyB0YWJsZSAqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfMngyWzRdID0KK3sKKyAgICAwLCAxLCAyLCAzCit9OworCisKKy8qCisgKiBTdWZmaXggVG8gTGV2ZWwgdGFibGUKKyAqIFdlIGluY3JlbWVudCB0aGUgc3VmZml4IGxlbmd0aCBpZiAKKyAqICgoTGV2ZWxDb2RlPj4xKSsxKT4oMzw8KFN1ZmZpeExlbmd0aC0xKSkgJiYgU3VmZml4TGVuZ3RoPDYKKyAqIChMZXZlbENvZGU+PjEpPj0oMzw8KFN1ZmZpeExlbmd0aC0xKSkgICAgJiYgU3VmZml4TGVuZ3RoPDYKKyAqICBMZXZlbENvZGUgICAgPj0gMzw8U3VmZml4TGVuZ3RoICAgICAgICAgJiYgU3VmZml4TGVuZ3RoPDYKKyAqIChMZXZlbENvZGUrMikgPj0gKDM8PFN1ZmZpeExlbmd0aCkrMiAgICAgJiYgU3VmZml4TGVuZ3RoPDYKKyAqLworY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XSA9Cit7CisgICAgKDM8PDEpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0xICovCisgICAgKDM8PDEpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0xICovCisgICAgKDM8PDIpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0yICovCisgICAgKDM8PDMpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0zICovCisgICAgKDM8PDQpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD00ICovCisgICAgKDM8PDUpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD01ICovCisgICAgLTEgICAgICAgICAgICAgIC8qIFN1ZmZpeExlbmd0aD02IC0gbmV2ZXIgaW5jcmVtZW50ICovCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wWzEzMl0gPSB7CisgICAgMHgwMDIwLCAweDAxMDAsIDB4MjAxNSwgMHgyMDE1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCisgICAgMHgwMDI4LCAweDAwZjAsIDB4MDBmOCwgMHgwMDI3LCAweDAwMzAsIDB4MDBkOCwgMHgwMGUwLCAweDAwZTgsCisgICAgMHgwMDM4LCAweDAwYTAsIDB4MDBjOCwgMHgwMGQwLCAweDAwNDAsIDB4MDA2OCwgMHgwMDkwLCAweDAwOTgsCisgICAgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwgMHgwMDYwLCAweDI3ZmYsIDB4MjdmZiwgMHgyMDZiLCAweDIwNmIsCisgICAgMHgwMDgxLCAweDAwODUsIDB4MDA4MywgMHgwMDc5LCAweDAwODcsIDB4MDA3ZCwgMHgwMDdiLCAweDAwNzEsCisgICAgMHgwMDdmLCAweDAwNzUsIDB4MDA3MywgMHgwMDY5LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMDc3LCAweDIwNzcsIDB4MjA2ZCwgMHgyMDZkLCAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsCisgICAgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LCAweDIwNWIsIDB4MjA1YiwgMHgyMDU5LCAweDIwNTksCisgICAgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDUxLCAweDAwNWYsIDB4MDA1NSwgMHgwMDRiLCAweDAwNDksCisgICAgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDIwNDEsIDB4MjA0MSwgMHgyMDRkLCAweDIwNGQsCisgICAgMHgyMDQzLCAweDIwNDMsIDB4MjAzOSwgMHgyMDM5LCAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsCisgICAgMHgyMDNiLCAweDIwM2IsIDB4MjAzMSwgMHgyMDMxLCAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsCisgICAgMHgyMDMzLCAweDIwMzMsIDB4MjAyOSwgMHgyMDI5LCAweDAwNDcsIDB4MDAzNSwgMHgwMDJiLCAweDAwMjEsCisgICAgMHgyMDNmLCAweDIwM2YsIDB4MjAyZCwgMHgyMDJkLCAweDIwMjMsIDB4MjAyMywgMHgyMDE5LCAweDIwMTksCisgICAgMHgwMDM3LCAweDAwMjUsIDB4MDAxYiwgMHgwMDExLCAweDIwMmYsIDB4MjAyZiwgMHgyMDFkLCAweDIwMWQsCisgICAgMHgwMDEzLCAweDAwMDksIDB4MjAxZiwgMHgyMDFmCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xWzEyOF0gPSB7CisgICAgMHgwMDIwLCAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAxZiwgMHgyMDE1LCAweDIwMTUsCisgICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHgwMDI4LCAweDAwZDAsIDB4MDBkOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA5OCwgMHgwMGMwLCAweDAwYzgsCisgICAgMHgwMDM4LCAweDAwNjAsIDB4MDA4OCwgMHgwMDkwLCAweDAwNDAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjA3ZiwgMHgyMDdmLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwODEsCisgICAgMHgwMDdiLCAweDAwNzksIDB4MDA3ZCwgMHgwMDczLCAweDIwNzUsIDB4MjA3NSwgMHgyMDcxLCAweDIwNzEsCisgICAgMHgwMDY4LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsCisgICAgMHgyMDZiLCAweDIwNmIsIDB4MjA2OSwgMHgyMDY5LCAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsCisgICAgMHgyMDYzLCAweDIwNjMsIDB4MjA2MSwgMHgyMDYxLCAweDAwNTksIDB4MDA1ZCwgMHgwMDViLCAweDAwNTEsCisgICAgMHgwMDY3LCAweDAwNTUsIDB4MDA1MywgMHgwMDQ5LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYjgsCisgICAgMHgyMDVmLCAweDIwNWYsIDB4MjA0ZCwgMHgyMDRkLCAweDIwNGIsIDB4MjA0YiwgMHgyMDQxLCAweDIwNDEsCisgICAgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LCAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksCisgICAgMHgyMDRmLCAweDIwNGYsIDB4MjAzZCwgMHgyMDNkLCAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsCisgICAgMHgwMDI5LCAweDAwMzUsIDB4MDAzMywgMHgwMDIxLCAweDIwNDcsIDB4MjA0NywgMHgyMDJkLCAweDIwMmQsCisgICAgMHgyMDJiLCAweDIwMmIsIDB4MjAxOSwgMHgyMDE5LCAweDAwM2YsIDB4MDAyNSwgMHgwMDIzLCAweDAwMTEsCisgICAgMHgwMDM3LCAweDAwMWQsIDB4MDAxYiwgMHgwMDA5LCAweDIwMmYsIDB4MjAyZiwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzJbMTEyXSA9IHsKKyAgICAweDAwMjAsIDB4MDA4OCwgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKKyAgICAweDAwM2YsIDB4MDAzNywgMHgwMDJmLCAweDAwMjcsIDB4MDAxZiwgMHgwMDE1LCAweDAwMGIsIDB4MDAwMSwKKyAgICAweDAwMjgsIDB4MDA1MCwgMHgwMDc4LCAweDAwODAsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsIDB4MDA0OCwKKyAgICAweDA3ZmYsIDB4MDA4MSwgMHgwMDg3LCAweDAwODUsIDB4MDA4MywgMHgwMDc5LCAweDAwN2YsIDB4MDA3ZCwKKyAgICAweDAwN2IsIDB4MDA3MSwgMHgwMDc3LCAweDAwNzUsIDB4MDA3MywgMHgwMDY5LCAweDIwNmIsIDB4MjA2YiwKKyAgICAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LCAweDAwNzAsIDB4MjA2MSwgMHgyMDYxLCAweDIwNmQsIDB4MjA2ZCwKKyAgICAweDIwNjMsIDB4MjA2MywgMHgyMDU5LCAweDIwNTksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKKyAgICAweDIwNWIsIDB4MjA1YiwgMHgyMDUxLCAweDIwNTEsIDB4MDA2NywgMHgwMDVkLCAweDAwNTMsIDB4MDA0OSwKKyAgICAweDAwNWYsIDB4MDA1NSwgMHgwMDRiLCAweDAwNDEsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwKKyAgICAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZCwgMHgyMDRkLCAweDIwMjksIDB4MjAyOSwKKyAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMjEsIDB4MjAyMSwKKyAgICAweDAwMTksIDB4MDAzZCwgMHgwMDNiLCAweDAwMTEsIDB4MDA0ZiwgMHgwMDM1LCAweDAwMzMsIDB4MDAwOSwKKyAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMjUsIDB4MjAyNSwKKyAgICAweDIwMWIsIDB4MjAxYiwgMHgyMDQ3LCAweDIwNDcsIDB4MjAxZCwgMHgyMDFkLCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfM1s4MF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsCisgICAgMHgwMDA5LCAweDAwMGIsIDB4MDdmZiwgMHgwMDAxLCAweDAwMTEsIDB4MDAxMywgMHgwMDE1LCAweDA3ZmYsCisgICAgMHgwMDE5LCAweDAwMWIsIDB4MDAxZCwgMHgwMDFmLCAweDAwMjEsIDB4MDAyMywgMHgwMDI1LCAweDAwMjcsCisgICAgMHgwMDI5LCAweDAwMmIsIDB4MDAyZCwgMHgwMDJmLCAweDAwMzEsIDB4MDAzMywgMHgwMDM1LCAweDAwMzcsCisgICAgMHgwMDM5LCAweDAwM2IsIDB4MDAzZCwgMHgwMDNmLCAweDAwNDEsIDB4MDA0MywgMHgwMDQ1LCAweDAwNDcsCisgICAgMHgwMDQ5LCAweDAwNGIsIDB4MDA0ZCwgMHgwMDRmLCAweDAwNTEsIDB4MDA1MywgMHgwMDU1LCAweDAwNTcsCisgICAgMHgwMDU5LCAweDAwNWIsIDB4MDA1ZCwgMHgwMDVmLCAweDAwNjEsIDB4MDA2MywgMHgwMDY1LCAweDAwNjcsCisgICAgMHgwMDY5LCAweDAwNmIsIDB4MDA2ZCwgMHgwMDZmLCAweDAwNzEsIDB4MDA3MywgMHgwMDc1LCAweDAwNzcsCisgICAgMHgwMDc5LCAweDAwN2IsIDB4MDA3ZCwgMHgwMDdmLCAweDAwODEsIDB4MDA4MywgMHgwMDg1LCAweDAwODcKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzRbMzJdID0geworICAgIDB4MDAyMCwgMHgwMDM4LCAweDIwMTUsIDB4MjAxNSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAorICAgIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLAorICAgIDB4MDAyOCwgMHgwMDMwLCAweDAwMjEsIDB4MDAxOSwgMHgyMDI3LCAweDIwMjcsIDB4MDAyNSwgMHgwMDIzLAorICAgIDB4MjAxZCwgMHgyMDFkLCAweDIwMWIsIDB4MjAxYiwgMHgwMDExLCAweDAwMWYsIDB4MDAxMywgMHgwMDA5Cit9OworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTAgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wLCAvKiBuQz0xICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzEsIC8qIG5DPTMgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz00ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTYgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz03ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTkgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTExICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTIgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE0ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTUgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzQgIC8qIG5DPS0xICovCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzBbNDBdID0geworICAgIDB4MDAyMCwgMHgwMDQ4LCAweDAwMDksIDB4MDAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAorICAgIDB4MDAyOCwgMHgwMDQwLCAweDAwMTEsIDB4MDAwZiwgMHgwMDMwLCAweDAwMzgsIDB4MDAxOSwgMHgwMDE3LAorICAgIDB4MjdmZiwgMHgyN2ZmLCAweDIwMWYsIDB4MjAxZiwgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLAorICAgIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMywgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzFbMjRdID0geworICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTEsIDB4MDAwZiwgMHgwMDBkLCAweDAwMGIsIDB4MjAwOSwgMHgyMDA5LAorICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxLAorICAgIDB4MDAxZCwgMHgwMDFiLCAweDAwMTksIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzJbMjRdID0geworICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTEsIDB4MDAwYiwgMHgwMDA5LCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLAorICAgIDB4MDAxYiwgMHgwMDE3LCAweDIwMTksIDB4MjAxOSwgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzNbMjRdID0geworICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTMsIDB4MDAwZiwgMHgwMDA3LCAweDAwMDUsIDB4MjAxMSwgMHgyMDExLAorICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwMywgMHgyMDAzLAorICAgIDB4MjAxOSwgMHgyMDE5LCAweDIwMTcsIDB4MjAxNywgMHgyMDE1LCAweDIwMTUsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzRbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDE1LCAweDAwMTEsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LAorICAgIDB4MjAxNywgMHgyMDE3LCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAxMSwgMHgyMDEzLCAweDIwMTMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwKKyAgICAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwKKyAgICAweDAwMTUsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNlsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMGYsIDB4MjAxMSwgMHgyMDExLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA5LCAweDIwMDksCisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCisgICAgMHgwMDEzLCAweDAwMDEsIDB4MjAwMywgMHgyMDAzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzdbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDAzLCAweDIwMGYsIDB4MjAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LAorICAgIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LAorICAgIDB4MDAxMSwgMHgwMDAxLCAweDIwMDUsIDB4MjAwNQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwNSwgMHgyMDBiLCAweDIwMGIsIDB4NDAwZCwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKKyAgICAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOVsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMGQsIDB4MjAwNSwgMHgyMDA1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCisgICAgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwWzE2XSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA1LCAweDIwMDUsIDB4MjAwNywgMHgyMDA3LCAweDIwMGIsIDB4MjAwYiwKKyAgICAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMVsxNl0gPSB7CisgICAgMHgwMDAxLCAweDAwMDMsIDB4MjAwOSwgMHgyMDA5LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCisgICAgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTJbMTZdID0geworICAgIDB4MjAwMSwgMHgyMDAxLCAweDIwMDMsIDB4MjAwMywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAorICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzWzE2XSA9IHsKKyAgICAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xNFsxNl0gPSB7CisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCisgICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzAsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzMsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc180LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzYsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc183LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzksCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTIsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMywKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wWzE2XSA9IHsKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMVsxNl0gPSB7CisgICAgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzJbMTZdID0geworICAgIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCit9OworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM10gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzIKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMFs4XSA9IHsKKyAgICAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18xWzhdID0geworICAgIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzJbOF0gPSB7CisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfM1s4XSA9IHsKKyAgICAweDAwMDksIDB4MDAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc180WzhdID0geworICAgIDB4MDAwYiwgMHgwMDA5LCAweDAwMDcsIDB4MDAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzVbOF0gPSB7CisgICAgMHgwMDAzLCAweDAwMDUsIDB4MDAwOSwgMHgwMDA3LCAweDAwMGQsIDB4MDAwYiwgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNlsyNF0gPSB7CisgICAgMHgwMDEwLCAweDAwMGQsIDB4MDAwYiwgMHgwMDA5LCAweDAwMDcsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDEsCisgICAgMHgwMDE4LCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLCAweDAwMjAsIDB4MDAxNSwgMHgyMDEzLCAweDIwMTMsCisgICAgMHgwMDI4LCAweDAwMTksIDB4MjAxNywgMHgyMDE3LCAweDA3ZmYsIDB4MDAxZCwgMHgyMDFiLCAweDIwMWIKK307CisKKy8qIFRhYmxlcyA3IHRvIDE0IGFyZSBkdXBsaWNhdGVzIG9mIHRhYmxlIDYgKi8KKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMCwgIC8qIFplcm9zTGVmdD0xICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18xLAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMiwKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzMsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc180LAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNSwgIC8qIFplcm9zTGVmdD02ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTcgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9OCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD05ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEwICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTExICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEyICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEzICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTE0ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182ICAgLyogWmVyb3NMZWZ0PTE1ICovCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGMzYTc3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwxOTggQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworCisgICAgSUYgIENvcnRleEE4CisgICAgICAgIAorcEFscGhhICAgICAgUk4gMgorcEJldGEgICAgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiA1CitwQlMgICAgICAgICBSTiA0CitiUzMyMTAgICAgICBSTiA2CisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUF8zICAgICAgICBETiBENy5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCitkUV8zICAgICAgICBETiBEMTEuVTggCisKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKK2RCZXRhICAgICAgIEROIEQyLlU4CisKK2RGaWx0ICAgICAgIEROIEQxNi5VOAorZEFxZmxnICAgICAgRE4gRDEyLlU4CitkQXBmbGcgICAgICBETiBEMTcuVTggCisKK2RBcDBxMCAgICAgIEROIEQxMy5VOAorCis7Ly8gYlNMVDQKK2RUQzMyMTAgICAgIEROIEQxOC5VOCAgIAorZFRDcyAgICAgICAgRE4gRDMxLlM4CitkVEMgICAgICAgICBETiBEMzEuVTgKKworZE1hc2tfMCAgICAgRE4gRDE0LlU4CitkTWFza18xICAgICBETiBEMTUuVTggICAgCitkTWFza180ICAgICBETiBEMjYuVTE2CisKK2RUZW1wICAgICAgIEROIEQyOC5VOAorZER1bW15ICAgICAgRE4gRDE3LlU4CisKKzsvLyBDb21wdXRpbmcgUDAsUTAKK3FEcTBwMCAgICAgIFFOIFExMC5TMTYKK3FEcDFxMSAgICAgIFFOIFExMS5TMTYKK3FEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCitkRGVsdGEgICAgICBETiBEMjAuUzgKKworCis7Ly8gQ29tcHV0aW5nIFAxLFExCitxUF8wbiAgICAgICBRTiBRMTQuUzE2CitxUV8wbiAgICAgICBRTiBRMTIuUzE2CisKK2RRXzBuICAgICAgIEROIEQyNC5VOAorZFBfMG4gICAgICAgRE4gRDI5LlU4CisKKzsvLyBiU0dFNAorCitkSFNwMHExICAgICBETiBEMTMuVTgKK2RIU3EwcDEgICAgIEROIEQzMS5VOCAgIAorCitkQlMzMjEwICAgICBETiBEMjguVTE2CisKK2RQXzB0ICAgICAgIEROIEQxMy5VOCAgIDtkSFNwMHExICAgICAgICAKK2RRXzB0ICAgICAgIEROIEQzMS5VOCAgIDtUZW1wMSAgICAgICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgO1RlbXAyICAgICAgICAKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKzsvLworOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQorOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNworOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIHBUaHJlc2hvbGRzOiByNQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDE6IEQyOS1EMzAsIFEwLVExOiBEMjQtRDI1Cis7Ly8gICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zIC0gcFRocmVzaG9sZHM6IHI1CisKKzsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCisKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIAorICAgICAgICA7ZFRDMzIxMCAtMTgKKyAgICAgICAgO2RUZW1wLTI4CisKKyAgICAgICAgVkxEMSAgICAgICAgZDE4LlUzMlswXSwgW3BUaHJlc2hvbGRzXSEgO2hlcmUKKworICAgICAgICA7Ly8gZGVsdGEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpID4+IDM7CisgICAgICAgIDsvLyBkRGVsdGEgPSAocURwMXExID4+IDIgKyBxRHEwcDAgKyAxKT4+IDEKKworICAgICAgICA7Ly8gcURwMXExLTExCisgICAgICAgIDsvLyBxRHEwcDAtMTAKKyAgICAgICAgVlNVQkwgICAgICAgcURwMXExLCBkUF8xLCBkUV8xICAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRUZW1wLCBkVEMzMjEwCisgICAgICAgIFZTVUJMICAgICAgIHFEcTBwMCwgZFFfMCwgZFBfMCAgICAgIAorICAgICAgICBWU0hSICAgICAgICBxRHAxcTEsIHFEcDFxMSwgIzIgICAgICAKKyAgICAgICAgVlpJUC44ICAgICAgZFRDMzIxMCwgZFRlbXAKKyAgICAKKyAgICAgICAgOy8vIHFEZWx0YS1xRHEwcDAtMTAKKworICAgICAgICA7Ly8gZFRDID0gZFRDMDEgKyAoZEFwbGcgJiAxKSArIChkQXFmbGcgJiAxKQorCisgICAgICAgIDsvLyBkVEMzMjEwLTE4CisgICAgICAgIDsvLyBkVGVtcC0yOAorICAgICAgICA7Ly8gZFRDLTMxCisgICAgICAgIFZCSUYgICAgICAgIGRUQzMyMTAsIGRNYXNrXzAsIGRGaWx0CisgICAgICAgIFZSSEFERCAgICAgIHFEZWx0YSwgcURwMXExLCBxRHEwcDAgIAorICAgICAgICBWQUREICAgICAgICBkVEMsIGRUQzMyMTAsIGRNYXNrXzEKKyAgICAgICAgVlFNT1ZOICAgICAgZERlbHRhLCBxRGVsdGEKKyAgICAgICAgOy8vIGREZWx0YS1kMjAKKworICAgICAgICA7Ly8gZERlbHRhID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcTAgLSBkZWx0YSk7CisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCisgICAgICAgIFZNSU4gICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCisgICAgICAgIFZORUcgICAgICAgIGRUQ3MsIGRUQ3MKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCisgICAgICAgIDsxCisgICAgICAgIFZNQVggICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCisKKyAgICAgICAgOy8vIGRQXzBuIC0gMjkKKyAgICAgICAgOy8vIGRRXzBuIC0gMjQKKworICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGRlbHRhKTsKKyAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFFfMCAtIGRlbHRhKTsKKworICAgICAgICA7Ly8gZFBfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKKyAgICAgICAgOy8vIGRRXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7CisgICAgICAgIAorICAgICAgICA7Ly8gcVBfMG4gLSAxNAorICAgICAgICA7Ly8gcVFfMG4gLSAxMgorICAgICAgICAKKyAgICAgICAgVk1PVkwgICAgICAgcVBfMG4sIGRQXzAKKyAgICAgICAgVk1PVkwgICAgICAgcVFfMG4sIGRRXzAKKworICAgICAgICA7MQorICAgICAgICBWQUREVyAgICAgICBxUF8wbiwgcVBfMG4sIGREZWx0YQorICAgICAgICBWU1VCVyAgICAgICBxUV8wbiwgcVFfMG4sIGREZWx0YQorICAgICAgICAKKyAgICAgICAgVlFNT1ZVTiAgICAgZFBfMG4sIHFQXzBuCisgICAgICAgIFZRTU9WVU4gICAgIGRRXzBuLCBxUV8wbgorCisgICAgICAgIE1fRU5ECisKKzsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlKCkKKzsvLworOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQorOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNworOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIGFscGhhOiBEMCwgZE1hc2tfMTogRDE1Cis7Ly8gICAgICAgICAKKzsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMjogRDI5LUQzMSwgUTAtUTI6IEQyNCxEMjUsRDI4CisKKzsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICAKKyAgICAgICAgO2RIU3EwcDEgLSAzMQorICAgICAgICA7ZEhTcDBxMSAtIDEzCisgICAgICAgIFZIQUREICAgICAgIGRIU3AwcTEsIGRQXzAsIGRRXzEgICAgIAorICAgICAgICBWSEFERCAgICAgICBkSFNxMHAxLCBkUV8wLCBkUF8xICAgICAgICAgCisKKyAgICAgICAgOy8vIFByZXBhcmUgdGhlIGJTIG1hc2sKKworICAgICAgICA7Ly8gZEhTcDBxMS0xMworICAgICAgICA7Ly8gZFBfMHQtZEhTcDBxMS0xMworICAgICAgICA7Ly8gZEhTcTBwMS0zMQorICAgICAgICA7Ly8gZFFfMHQtVGVtcDEtMzEKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KKworICAgICAgICBWUkhBREQgICAgICBkUF8wdCwgZEhTcDBxMSwgZFBfMSAgICAKKyAgICAgICAgVlJIQUREICAgICAgZFFfMHQsIGRIU3EwcDEsIGRRXzEKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRiAgCisKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhZmU0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwpAQCAtMCwwICsxLDM5NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworCisgICAgSUYgIENvcnRleEE4CisgICAgICAgIAorcFRocmVzaG9sZHMgUk4gNQorCis7Ly8gUGl4ZWxzCitkUF8wICAgICAgICBETiBENC5VOAorZFBfMSAgICAgICAgRE4gRDUuVTggIAorZFBfMiAgICAgICAgRE4gRDYuVTggIAorZFBfMyAgICAgICAgRE4gRDcuVTggIAorZFFfMCAgICAgICAgRE4gRDguVTggIAorZFFfMSAgICAgICAgRE4gRDkuVTggIAorZFFfMiAgICAgICAgRE4gRDEwLlU4IAorZFFfMyAgICAgICAgRE4gRDExLlU4IAorCisKKzsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KK2RBbHBoYSAgICAgIEROIEQwLlU4CisKK2RGaWx0ICAgICAgIEROIEQxNi5VOAorZEFxZmxnICAgICAgRE4gRDEyLlU4CitkQXBmbGcgICAgICBETiBEMTcuVTggCisKK2RBcDBxMCAgICAgIEROIEQxMy5VOAorCis7Ly8gYlNMVDQKK2RUQzAgICAgICAgIEROIEQxOC5VOCAgIAorZFRDMSAgICAgICAgRE4gRDE5LlU4ICAgCitkVEMwMSAgICAgICBETiBEMTguVTggICAKKworZFRDcyAgICAgICAgRE4gRDMxLlM4CitkVEMgICAgICAgICBETiBEMzEuVTgKKworZE1hc2tfMCAgICAgRE4gRDE0LlU4CitkTWFza18xICAgICBETiBEMTUuVTggICAgCisKK2RUZW1wICAgICAgIEROIEQxOS5VOAorCis7Ly8gQ29tcHV0aW5nIFAwLFEwCitxRHEwcDAgICAgICBRTiBRMTAuUzE2CitxRHAxcTEgICAgICBRTiBRMTEuUzE2CitxRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAorZERlbHRhICAgICAgRE4gRDIwLlM4CisKKworOy8vIENvbXB1dGluZyBQMSxRMQorZFJwMHEwICAgICAgRE4gRDI0LlU4CisKK2RNYXhQICAgICAgIEROIEQyMy5VOAorZE1pblAgICAgICAgRE4gRDIyLlU4CisKK2RNYXhRICAgICAgIEROIEQxOS5VOAorZE1pblEgICAgICAgRE4gRDIxLlU4CisKK2REZWx0YVAgICAgIEROIEQyNi5VOAorZERlbHRhUSAgICAgRE4gRDI3LlU4CisKK3FQXzBuICAgICAgIFFOIFExNC5TMTYKK3FRXzBuICAgICAgIFFOIFExMi5TMTYKKworZFFfMG4gICAgICAgRE4gRDI0LlU4CitkUV8xbiAgICAgICBETiBEMjUuVTgKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CisKKzsvLyBiU0dFNAorCitxU3AwcTAgICAgICBRTiBRMTAuVTE2CisKK3FTcDJxMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHAxICAgIFFOIFExMi5VMTYKK3FTcDNwMiAgICAgIFFOIFExMy5VMTYKK2RIU3AwcTEgICAgIEROIEQyOC5VOAorCitxU3EycDEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBxMSAgICBRTiBRMTIuVTE2CitxU3EzcTIgICAgICBRTiBRMTMuVTE2ICA7ISEKK2RIU3EwcDEgICAgIEROIEQyOC5VOCAgIDshIQorCitxVGVtcDEgICAgICBRTiBRMTEuVTE2ICA7ISE7cVNwMnExIAorcVRlbXAyICAgICAgUU4gUTEyLlUxNiAgOyEhO3FTcDBxMHAxICAgICAgICAKKworZFBfMHQgICAgICAgRE4gRDI4LlU4ICAgOyEhO2RIU3AwcTEgICAgICAgIAorZFFfMHQgICAgICAgRE4gRDIyLlU4ICAgOyEhO1RlbXAxICAgICAgICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKK2RQXzJuICAgICAgIEROIEQzMS5VOAorCitkUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCisKKzsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCis7Ly8KKzsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKKzsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKKzsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBwVGhyZXNob2xkczogcjUKKzsvLyAgICAgICAgIAorOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAxOiBEMjktRDMwLCBRMC1RMTogRDI0LUQyNQorOy8vICAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAtIHBUaHJlc2hvbGRzOiByNQorCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQorCisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisKKyAgICAgICAgCisgICAgICAgIDsvLyBxRHEwcDAtMTAKKyAgICAgICAgVlNVQkwgICAgICAgcURwMXExLCBkUF8xLCBkUV8xICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtkVEMwW119LCBbcFRocmVzaG9sZHNdIQorICAgICAgICA7Ly8gcURwMXExLTExCisgICAgICAgIFZTVUJMICAgICAgIHFEcTBwMCwgZFFfMCwgZFBfMCAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7ZFRDMVtdfSwgW3BUaHJlc2hvbGRzXSEKKworICAgICAgICA7Ly8gZFJwMHEwLTI0CisgICAgICAgIFZTSFIgICAgICAgIHFEcDFxMSwgcURwMXExLCAjMiAgICAgIAorICAgIAorICAgICAgICA7Ly8gZFRDMDEgPSAoZFRDMSA8PCA0KSB8IGRUQzAKKyAgICAgICAgOy8vIGRUQzAxLTE4CisgICAgICAgIFZFWFQgICAgICAgIGRUQzAxLCBkVEMwLCBkVEMxLCAjNAorICAgICAgICA7Ly8gZFRlbXAtMTkKKyAgICAgICAgVkFORCAgICAgICAgZFRlbXAsIGRBcGZsZywgZE1hc2tfMQorICAgICAgICAKKyAgICAgICAgVkJJRiAgICAgICAgZFRDMDEsIGRNYXNrXzAsIGRGaWx0CisgICAgCisKKyAgICAgICAgOy8vIGRlbHRhID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KSA+PiAzOworICAgICAgICA7Ly8gZERlbHRhID0gKHFEcDFxMSA+PiAyICsgcURxMHAwICsgMSk+PiAxCisKKyAgICAgICAgOy8vIHFEZWx0YS1xRHEwcDAtMTAKKyAgICAgICAgVlJIQUREICAgICAgcURlbHRhLCBxRHAxcTEsIHFEcTBwMCAgCisgICAgICAgIFZSSEFERCAgICAgIGRScDBxMCwgZFBfMCwgZFFfMCAgICAgIAorICAgICAgICBWQUREICAgICAgICBkVEMsIGRUQzAxLCBkVGVtcAorCisgICAgICAgIDsvLyBkVEMgPSBkVEMwMSArIChkQXBsZyAmIDEpICsgKGRBcWZsZyAmIDEpCisgICAgICAgIAorICAgICAgICBWQU5EICAgICAgICBkVGVtcCwgZEFxZmxnLCBkTWFza18xCisgICAgICAgIFZRQUREICAgICAgIGRNYXhQLCBkUF8xLCBkVEMwMSAgICAgIAorICAgICAgICBWUU1PVk4gICAgICBkRGVsdGEsIHFEZWx0YQorICAgICAgICBWQUREICAgICAgICBkVEMsIGRUQywgZFRlbXAKKworICAgICAgICA7Ly8gZE1heFAgPSBRQUREKGRQXzEsIGRUQzAxKQorICAgICAgICA7Ly8gZE1pblAgPSBRU1VCKGRQXzEsIGRUQzAxKQorIAorICAgICAgICA7Ly8gZE1heFAtZDIzCisgICAgICAgIDsvLyBkTWluUC1kMjIKKyAgICAgICAgVlFTVUIgICAgICAgZE1pblAsIGRQXzEsIGRUQzAxICAgICAgCisKKyAgICAgICAgOy8vIGREZWx0YS1kMjAKKworICAgICAgICA7Ly8gZE1heFEgPSBRQUREKGRRXzEsIGRUQzAxKQorICAgICAgICA7Ly8gZE1pblEgPSBRU1VCKGRRXzEsIGRUQzAxKQorIAorICAgICAgICA7Ly8gZE1heFEtMTkKKyAgICAgICAgOy8vIGRNaW5RLTIxCisgICAgICAgIFZRQUREICAgICAgIGRNYXhRLCBkUV8xLCBkVEMwMQorICAgICAgICBWSEFERCAgICAgICBkRGVsdGFQLCBkUnAwcTAsIGRQXzIgICAKKyAgICAgICAgVk1JTiAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKKworICAgICAgICA7Ly8gZERlbHRhID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcTAgLSBkZWx0YSk7CisgICAgICAgIFZORUcgICAgICAgIGRUQ3MsIGRUQ3MKKyAgICAgICAgCisgICAgICAgIFZRU1VCICAgICAgIGRNaW5RLCBkUV8xLCBkVEMwMQorCisgICAgICAgIDsvLyBkZWx0YSA9IChwMiArICgocDArcTArMSk+PjEpIC0gKHAxPDwxKSk+PjE7CisgICAgICAgIDsvLyBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7CisgICAgICAgIDsvLyBwUTBbLTIqU3RlcF0gPSAoT01YX1U4KShwMSArIGRlbHRhKTsKKworICAgICAgICA7Ly8gZERlbHRhUCA9IChkUF8yICsgZFJwMHEwKT4+MTsKKyAgICAgICAgOy8vIGRQXzFuID0gYXJtQ2xpcChkUF8xIC0gZFRDMDEsIGRQXzEgKyBkVEMwMSwgZERlbHRhUCk7CisgICAgICAgIDsvLyBkUF8xbiA9IGFybUNsaXAoTWluUCwgTWF4UCwgZERlbHRhUCk7CisgICAgICAgIAorICAgICAgICA7Ly8gZGVsdGEgPSAocTIgKyAoKHAwK3EwKzEpPj4xKSAtIChxMTw8MSkpPj4xOworICAgICAgICA7Ly8gZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOworICAgICAgICA7Ly8gcFEwWzEqU3RlcF0gPSAoT01YX1U4KShxMSArIGRlbHRhKTsKKworICAgICAgICA7Ly8gZERlbHRhUSA9IChkUV8yICsgZFJwMHEwKT4+MTsKKyAgICAgICAgOy8vIGRRXzFuID0gYXJtQ2xpcChkUV8xIC0gZFRDMDEsIGRRXzEgKyBkVEMwMSwgZERlbHRhUSk7CisgICAgICAgIDsvLyBkUV8xbiA9IGFybUNsaXAoTWluUSwgTWF4USwgZERlbHRhUSk7CisgICAgICAgIAorICAgICAgICA7Ly8gZERlbHRhUC0yNgorICAgICAgICBWSEFERCAgICAgICBkRGVsdGFRLCBkUnAwcTAsIGRRXzIgICAKKworICAgICAgICA7Ly8gZERlbHRhUS0yNworICAgICAgICAKKyAgICAgICAgOy8vIGRQXzBuIC0gMjkKKyAgICAgICAgOy8vIGRQXzFuIC0gMzAKKyAgICAgICAgOy8vIGRRXzBuIC0gMjQKKyAgICAgICAgOy8vIGRRXzFuIC0gMjUKKyAgICAgICAgCisgICAgICAgIDsvLyBkZWx0YSA9IChxMiArICgocDArcTArMSk+PjEpIC0gKHExPDwxKSk+PjE7CisgICAgICAgIDsvLyBkRGVsdGFRID0gKGRRXzIgKyBkUnAwcTApPj4xOworCisgICAgICAgIFZNQVggICAgICAgIGRQXzFuLCBkRGVsdGFQLCBkTWluUCAgIAorICAgICAgICBWTUFYICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcworCisgICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZGVsdGEpOworICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUV8wIC0gZGVsdGEpOworCisgICAgICAgIDsvLyBkUF8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOworICAgICAgICA7Ly8gZFFfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBxUF8wbiAtIDE0CisgICAgICAgIDsvLyBxUV8wbiAtIDEyCisgICAgICAgIAorICAgICAgICBWTU9WTCAgICAgICBxUF8wbiwgZFBfMAorICAgICAgICBWTU9WTCAgICAgICBxUV8wbiwgZFFfMAorCisgICAgICAgIFZBRERXICAgICAgIHFQXzBuLCBxUF8wbiwgZERlbHRhCisgICAgICAgIFZTVUJXICAgICAgIHFRXzBuLCBxUV8wbiwgZERlbHRhCisgICAgICAgIAorICAgICAgICBWUU1PVlVOICAgICBkUF8wbiwgcVBfMG4KKyAgICAgICAgVlFNT1ZVTiAgICAgZFFfMG4sIHFRXzBuCisgICAgICAgIAorICAgICAgICBWTUFYICAgICAgICBkUV8xbiwgZERlbHRhUSwgZE1pblEKKworICAgICAgICBWTUlOICAgICAgICBkUF8xbiwgZFBfMW4sIGRNYXhQCisgICAgICAgIFZNSU4gICAgICAgIGRRXzFuLCBkUV8xbiwgZE1heFEKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0ICAgICAgCisKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMW4sIGRQXzEsIGRBcGZsZworICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMCwgZEZpbHQgIAorICAgICAgICBWQklGICAgICAgICBkUV8xbiwgZFFfMSwgZEFxZmxnCisKKyAgICAgICAgTV9FTkQKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQorOy8vCis7Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCis7Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Cis7Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gYWxwaGE6IEQwLCBkTWFza18xOiBEMTUKKzsvLyAgICAgICAgIAorOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAyOiBEMjktRDMxLCBRMC1RMjogRDI0LEQyNSxEMjgKKworOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAKKworICAgICAgICA7Ly8gYXA8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpICAgICAgICAKKyAgICAgICAgOy8vIGFxPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSAgICAgICAgCisKKyAgICAgICAgOy8vICggZEFwZmxnICYgZEFwMHEwIDwgKGRBbHBoYSA+PiAyICsgMikgKQorICAgICAgICA7Ly8gKCBkQXFmbGcgJiBkQXAwcTAgPCAoZEFscGhhID4+IDIgKyAyKSApCisKKyAgICAgICAgOy8vICggZEFwZmxnID0gZEFwZmxnICYgZEFwMHEwIDwgKGRUZW1wICsgZE1hc2tfMSArIGRNYXNrXzEpICkKKyAgICAgICAgOy8vICggZEFxZmxnID0gZEFxZmxnICYgZEFwMHEwIDwgKGRUZW1wICsgZE1hc2tfMSArIGRNYXNrXzEpICkKKworICAgICAgICA7Ly8gUCBGaWx0ZXIKKworICAgICAgICBWU0hSICAgICAgICBkVGVtcCwgZEFscGhhLCAjMgorICAgICAgICBWQUREICAgICAgICBkVGVtcCwgZFRlbXAsIGRNYXNrXzEKKworICAgICAgICA7Ly8gcVNwMHEwLTEwCisgICAgICAgIFZBRERMICAgICAgIHFTcDBxMCwgZFFfMCwgZFBfMCAgICAgIAorICAgICAgICBWQUREICAgICAgICBkVGVtcCwgZFRlbXAsIGRNYXNrXzEKKworICAgICAgICA7Ly8gcVNwMnExLTExCisgICAgICAgIDsvLyBxU3AwcTBwMS0xMgorICAgICAgICBWQURETCAgICAgICBxU3AycTEsIGRQXzIsIGRRXzEgICAgICAKKyAgICAgICAgVkFERFcgICAgICAgcVNwMHEwcDEsIHFTcDBxMCwgZFBfMSAgCisKKyAgICAgICAgVkNHVCAgICAgICAgZFRlbXAsIGRUZW1wLCBkQXAwcTAKKyAgICAgICAgVlNIUiAgICAgICAgcVNwMnExLCAjMSAgICAgICAgICAgICAgCisKKyAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpKChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMpOworICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKCAoIChwMCArIHEwICsgcDEpICsgKHAyICsgcTEpPj4xICkgPj4gMSArIDEgKSA+PiAxCisKKyAgICAgICAgOy8vIGRQXzBuID0gKCAoIChxU3AwcTAgKyBkUF8xKSArIHFTcDJxMT4+MSApID4+IDEgKyAxICkgPj4gMQorICAgICAgICA7Ly8gZFBfMG4gPSAoICggcVNwMHEwcDEgKyBxU3AycTE+PjEgKSA+PiAxICsgMSApID4+IDEKKyAgICAgICAgOy8vIGRQXzBuID0gKCBxVGVtcDEgKyAxICkgPj4gMQorICAgICAgICAKKyAgICAgICAgOy8vIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKChwMiArIHAxICsgcDAgKyBxMCArIDIpPj4yKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBkUF8xbiA9IChPTVhfVTgpKChkUF8yICsgcVNwMHEwcDEgKyAyKT4+Mik7CisgICAgICAgIDsvLyBkUF8xbiA9IChPTVhfVTgpKChxVGVtcDIgKyAyKT4+Mik7CisgICAgICAgIAorICAgICAgICA7Ly8gcFEwWy0zKlN0ZXBdID0gKE9NWF9VOCkoKDIqcDMgKyAzKnAyICsgcDEgKyBwMCArIHEwICsgNCk+PjMpOworICAgICAgICA7Ly8gcFEwWy0zKlN0ZXBdID0gKE9NWF9VOCkoKCAocDMgKyBwMikgKyAocDEgKyBwMCArIHEwICsgcDIpID4+IDEgKyAyKT4+Mik7CisKKyAgICAgICAgOy8vIGRQXzJuID0gKE9NWF9VOCkoKCBxU3AzcDIgKyAoZFBfMiArIHFTcDBxMHAxKSA+PiAxICsgMikgPj4gMik7CisgICAgICAgIDsvLyBkUF8ybiA9IChPTVhfVTgpKCggcVNwM3AyICsgcVRlbXAyID4+IDEgKyAyKSA+PiAyKTsKKworICAgICAgICA7Ly8gcVRlbXAxLXFTcDJxMS0xMQorICAgICAgICA7Ly8gcVRlbXAyLXFTcDBxMHAxLTEyCisgICAgICAgIFZIQUREICAgICAgIHFUZW1wMSwgcVNwMHEwcDEsIHFTcDJxMQorICAgICAgICBWQUREVyAgICAgICBxVGVtcDIsIHFTcDBxMHAxLCBkUF8yICAKKyAgICAgICAgCisgICAgICAgIDsvLyBxU3AzcDItMTMKKyAgICAgICAgVkFEREwgICAgICAgcVNwM3AyLCBkUF8zLCBkUF8yICAgICAgCisKKyAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkQXBmbGcsIGRUZW1wCisgICAgICAgIFZIQUREICAgICAgIGRIU3AwcTEsIGRQXzAsIGRRXzEgICAgIAorICAgICAgICBWU1JBICAgICAgICBxU3AzcDIsIHFUZW1wMiwgIzEgICAgICAKKyAgICAgICAgOy8vIGRIU3AwcTEtMjgKKyAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkQXFmbGcsIGRUZW1wCisKKyAgICAgICAgOy8vIGRQXzBuLTI5CisgICAgICAgIDsvLyBkUF8wdC1kSFNwMHExLTI4CisgICAgICAgIFZRUlNIUk4gICAgIGRQXzBuLCBxVGVtcDEsICMxCisgICAgICAgIFZSSEFERCAgICAgIGRQXzB0LCBkSFNwMHExLCBkUF8xICAgIAorCisgICAgICAgIDsvLyBkUF8xbi0zMAorICAgICAgICBWUVJTSFJOICAgICBkUF8xbiwgcVRlbXAyLCAjMgorICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNxMnAxLCBkUV8yLCBkUF8xICAgICAgICAgIAorICAgICAgICBWQUREVyAgICAgICBxU3AwcTBxMSwgcVNwMHEwLCBkUV8xICAgICAgCisgICAgICAgIAorICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMHQsIGRBcGZsZyAgICAKKworICAgICAgICA7Ly8gUSBGaWx0ZXIKKworICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoT01YX1U4KSgocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zKTsKKyAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKCAoIChwMCArIHEwICsgcTEpICsgKHEyICsgcDEpPj4xICkgPj4gMSArIDEgKSA+PiAxCisKKyAgICAgICAgOy8vIGRRXzBuID0gKCAoIChxU3AwcTAgKyBkUV8xKSArIHFTcTJwMT4+MSApID4+IDEgKyAxICkgPj4gMQorICAgICAgICA7Ly8gZFFfMG4gPSAoICggcVNwMHEwcTEgKyBxU3EycDE+PjEgKSA+PiAxICsgMSApID4+IDEKKyAgICAgICAgOy8vIGRRXzBuID0gKCBxVGVtcDEgKyAxICkgPj4gMQorICAgICAgICAKKyAgICAgICAgOy8vIHBRMFsxKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgcTEgKyBxMCArIHEwICsgMik+PjIpOworICAgICAgICAKKyAgICAgICAgOy8vIGRRXzFuID0gKE9NWF9VOCkoKGRRXzIgKyBxU3AwcTBxMSArIDIpPj4yKTsKKyAgICAgICAgOy8vIGRRXzFuID0gKE9NWF9VOCkoKHFUZW1wMiArIDIpPj4yKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBwUTBbMipTdGVwXSA9IChPTVhfVTgpKCgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zKTsKKyAgICAgICAgOy8vIHBRMFsyKlN0ZXBdID0gKE9NWF9VOCkoKCAocTMgKyBxMikgKyAocTEgKyBwMCArIHEwICsgcTIpID4+IDEgKyAyKT4+Mik7CisKKyAgICAgICAgOy8vIGRRXzJuID0gKE9NWF9VOCkoKCBxU3EzcTIgKyAoZFFfMiArIHFTcDBxMHExKSA+PiAxICsgMikgPj4gMik7CisgICAgICAgIDsvLyBkUV8ybiA9IChPTVhfVTgpKCggcVNxM3EyICsgcVRlbXAyID4+IDEgKyAyKSA+PiAyKTsKKworICAgICAgICA7Ly8gcVRlbXAxLXFTcDJxMS0xMQorICAgICAgICA7Ly8gcVRlbXAyLXFTcDBxMHAxLTEyCisgICAgICAgIDsvLyBxU3EycDEtMTEKKyAgICAgICAgOy8vIHFTcDBxMHExLTEyCisKKworICAgICAgICA7Ly8gcVRlbXAyLXFTcDBxMHAxLTEyCisgICAgICAgIDsvLyBxVGVtcDEtcVNxMnAxLTExCisgICAgICAgIDsvLyBxU3EzcTItMTMKKyAgICAgICAgOy8vIGRQXzJuLTMxCisgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICBkUF8ybiwgcVNwM3AyLCAjMgorICAgICAgICBWQURETCAgICAgICBxU3EzcTIsIGRRXzMsIGRRXzIgICAgICAgICAgCisKKyAgICAgICAgVlNIUiAgICAgICAgcVNxMnAxLCAjMSAgICAgICAgICAgICAgICAgIAorCisgICAgICAgIFZIQUREICAgICAgIHFUZW1wMSwgcVNwMHEwcTEsIHFTcTJwMQorICAgICAgICBWQUREVyAgICAgICBxVGVtcDIsIHFTcDBxMHExLCBkUV8yICAgICAgCisKKyAgICAgICAgOy8vIGRIU3EwcDEtMjgKKyAgICAgICAgVkhBREQgICAgICAgZEhTcTBwMSwgZFFfMCwgZFBfMSAgICAgICAgIAorCisgICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdAorICAgICAgICBWQklGICAgICAgICBkUF8xbiwgZFBfMSwgZEFwZmxnCisKKyAgICAgICAgVlNSQSAgICAgICAgcVNxM3EyLCBxVGVtcDIsICMxICAgICAgICAgIAorCisgICAgICAgIDsvLyBkUV8xLVRlbXAyLTI1CisgICAgICAgIDsvLyBkUV8wLVRlbXAyLTI0CisgICAgICAgIFZRUlNIUk4gICAgIGRRXzFuLCBxVGVtcDIsICMyCisgICAgICAgIFZRUlNIUk4gICAgIGRRXzBuLCBxVGVtcDEsICMxCisKKyAgICAgICAgOy8vIGRRXzB0LVRlbXAxLTIyCisgICAgICAgIFZSSEFERCAgICAgIGRRXzB0LCBkSFNxMHAxLCBkUV8xCisgICAgICAgIFZCSUYgICAgICAgIGRRXzFuLCBkUV8xLCBkQXFmbGcgICAgICAgICAKKworICAgICAgICBWQklGICAgICAgICBkUF8ybiwgZFBfMiwgZEFwZmxnICAgICAgICAKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzB0LCBkQXFmbGcgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICBkUV8ybiwgcVNxM3EyLCAjMgorICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMCwgZEZpbHQKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMm4sIGRRXzIsIGRBcWZsZyAgICAgICAKKworICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiAgCisKKworICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTBhODllOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCkBAIC0wLDAgKzEsMzI1IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorICAgICAgICAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ppZ1phZ180eDQKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzJ4MgorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAgCis7Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQorICAgICAgICAKK0xBU1RfQ09FRkYgICAgICAgICAgICAgICBFUVUgMHgyMCAgICAgICAgOy8vIEVuZCBvZiBibG9jayBmbGFnCitUV09fQllURV9DT0VGRiAgICAgICAgICAgRVFVIDB4MTAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BwQml0U3RyZWFtICAgICBSTiAwCitwT2Zmc2V0ICAgICAgICAgUk4gMQorcE51bUNvZWZmICAgICAgIFJOIDIKK3BwUG9zQ29lZmJ1ZiAgICBSTiAzCituQyAgICAgICAgICAgICAgUk4gNCA7Ly8gbnVtYmVyIG9mIGNvZWZmcyBvciAxNyBmb3IgY2hyb21hCitzTWF4TnVtQ29lZmYgICAgUk4gNQorCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworCis7Ly8gTGV2ZWwgbG9vcAorQ291bnQgICAgICAgICAgIFJOIDAKK1RyYWlsaW5nT25lcyAgICBSTiAxCitwTGV2ZWwgICAgICAgICAgUk4gMgorTGV2ZWxTdWZmaXggICAgIFJOIDMKK1N1ZmZpeExlbmd0aCAgICBSTiA0CitUb3RhbENvZWZmICAgICAgUk4gNQorCitwVkxEVGFibGUgICAgICAgUk4gNgorU3ltYm9sICAgICAgICAgIFJOIDcKK1QxICAgICAgICAgICAgICBSTiA4CitUMiAgICAgICAgICAgICAgUk4gOQorUkJpdFN0cmVhbSAgICAgIFJOIDEwCitSQml0QnVmZmVyICAgICAgUk4gMTEKK1JCaXRDb3VudCAgICAgICBSTiAxMgorbHIgICAgICAgICAgICAgIFJOIDE0CisKKzsvLyBSdW4gbG9vcAorQ291bnQgICAgICAgICAgIFJOIDAKK1plcm9zTGVmdCAgICAgICBSTiAxCitwTGV2ZWwgICAgICAgICAgUk4gMgorcHBSdW5UYWJsZSAgICAgIFJOIDMKK3BSdW4gICAgICAgICAgICBSTiA0CitUb3RhbENvZWZmICAgICAgUk4gNQorCitwVkxEVGFibGUgICAgICAgUk4gNgorU3ltYm9sICAgICAgICAgIFJOIDcKK1QxICAgICAgICAgICAgICBSTiA4CitUMiAgICAgICAgICAgICAgUk4gOQorUkJpdFN0cmVhbSAgICAgIFJOIDEwCitSQml0QnVmZmVyICAgICAgUk4gMTEKK1JCaXRDb3VudCAgICAgICBSTiAxMgorbHIgICAgICAgICAgICAgIFJOIDE0CisKKzsvLyBGaWxsIGluIGNvZWZmaWNpZW50cyBsb29wCitwUG9zQ29lZmJ1ZiAgICAgUk4gMAordGVtcCAgICAgICAgICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitwcFBvc0NvZWZidWYgICAgUk4gMworcFJ1biAgICAgICAgICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CitwWmlnWmFnICAgICAgICAgUk4gNgorCitUMSAgICAgICAgICAgICAgUk4gOAorVDIgICAgICAgICAgICAgIFJOIDkKK1JCaXRTdHJlYW0gICAgICBSTiAxMAorUkJpdEJ1ZmZlciAgICAgIFJOIDExCitSQml0Q291bnQgICAgICAgUk4gMTIKK0NvZWZmTnVtICAgICAgICBSTiAxNAorCisKKworICAgIElGIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgTV9BTExPQzQgcHBwQml0U3RyZWFtLCA0CisgICAgICAgIE1fQUxMT0M0IHBwT2Zmc2V0LCA0CisgICAgICAgIE1fQUxMT0M0IHBwcFBvc0NvZWZidWYsIDQKKyAgICAgICAgTV9BTExPQzQgcHBMZXZlbCwgMTYqMgorICAgICAgICBNX0FMTE9DNCBwcFJ1biwgMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpciwgcjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIHBOQywgNAorICAgICAgICBNX0FSRyAgIHBTTWF4TnVtQ29lZmYsNAorICAgICAgICAKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQwIHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKKyAgICAgICAgTERSICAgICAgICBwVkxEVGFibGUsID1hcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcworICAgICAgICBNX0xEUiAgICAgIG5DLCBwTkMKKyAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDEgVDEsIFQyLCBscgorICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgbkMsIExTTCAjMl0gIDsvLyBGaW5kIFZMRCB0YWJsZSAgICAKKyAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDIgVDEsIFQyLCBscgorCisgICAgICAgIDsvLyBEZWNvZGUgU3ltYm9sID0gVG90YWxDb2VmZio0ICsgVHJhaWxpbmdPbmVzCisgICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCA0LCAyCisgICAgCisgICAgICAgIE1PVlMgICAgVG90YWxDb2VmZiwgU3ltYm9sLCBMU1IgIzIgICAgCisgICAgICAgIFNUUkIgICAgVG90YWxDb2VmZiwgW3BOdW1Db2VmZl0gICAgCisgICAgICAgIE1fUFJJTlRGICJUb3RhbENvZWZmPSVkXG4iLCBUb3RhbENvZWZmCisgICAgICAgIEJFUS5XICAgRW5kTm9FcnJvciAgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hlZCBpZiBubyBjb2VmZmljaWVudHMKKworICAgICAgICBDTVAgICAgIFN5bWJvbCwgIzE3KjQKKyAgICAgICAgQkdFLlcgICBFbmRCYWRTeW1ib2wgICAgICAgICAgICAgICAgOy8vIEVycm9yIGlmIGJhZCBzeW1ib2wKKyAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIGJpdHN0cmVhbSBwb2ludGVycworICAgICAgICBNX1NUUiAgIHBwQml0U3RyZWFtLCAgcHBwQml0U3RyZWFtCisgICAgICAgIE1fU1RSICAgcE9mZnNldCwgICAgICBwcE9mZnNldAorICAgICAgICBNX1NUUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZiAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgVHJhaWxpbmcgT25lcworICAgICAgICBBTkRTICAgIFRyYWlsaW5nT25lcywgU3ltYm9sLCAjMworICAgICAgICBNX0FEUiAgIHBMZXZlbCwgcHBMZXZlbCAgICAgICAgICAgIAorICAgICAgICBNX1BSSU5URiAiVHJhaWxpbmdPbmVzPSVkXG4iLCBUcmFpbGluZ09uZXMKKyAgICAgICAgQkVRICAgICBUcmFpbGluZ09uZXNEb25lICAgIAorICAgICAgICBNT1YgICAgIENvdW50LCBUcmFpbGluZ09uZXMKK1RyYWlsaW5nT25lc0xvb3AgICAgCisgICAgICAgIE1fQkRfUkVBRDggU3ltYm9sLCAxLCBUMQorICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKKyAgICAgICAgTU9WICAgICBUMSwgIzEKKyAgICAgICAgU1VCICAgICBUMSwgVDEsIFN5bWJvbCwgTFNMICMxCisgICAgICAgIE1fUFJJTlRGICJMZXZlbD0lZFxuIiwgVDEKKyAgICAgICAgU1RSSCAgICBUMSwgW3BMZXZlbF0sICMyCisgICAgICAgIEJHVCAgICAgVHJhaWxpbmdPbmVzTG9vcAorVHJhaWxpbmdPbmVzRG9uZSAgICAKKyAgICAKKyAgICAgICAgOy8vIERlY29kZSBsZXZlbCB2YWx1ZXMgICAgCisgICAgICAgIFNVQlMgICAgQ291bnQsIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lcyAgICAgOy8vIE51bWJlciBvZiBsZXZlbHMgdG8gcmVhZAorICAgICAgICBCRVEgICAgIERlY29kZVJ1bnMgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBOb25lIGxlZnQKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgU3VmZml4TGVuZ3RoLCAjMQorICAgICAgICBDTVAgICAgIFRvdGFsQ29lZmYsICMxMAorICAgICAgICBNT1ZMRSAgIFN1ZmZpeExlbmd0aCwgIzAKKyAgICAgICAgQ01QICAgICBUcmFpbGluZ09uZXMsICMzICAgIDsvLyBpZiAoVHJhaWxpbmdPbmVzPDMpCisgICAgICAgIE1PVkxUICAgVHJhaWxpbmdPbmVzLCAjNCAgICA7Ly8gdGhlbiBUcmFpbGluZ09uZXMgPSArNAorICAgICAgICBNT1ZHRSAgIFRyYWlsaW5nT25lcywgIzIgICAgOy8vIGVsc2UgVHJhaWxpbmdPbmVzID0gKzIKKyAgICAgICAgTU9WR0UgICBTdWZmaXhMZW5ndGgsICMwICAgIDsvLyAgICAgIFN1ZmZpeExlbmd0aCA9IDAKKyAgICAgICAgCitMZXZlbExvb3AKKyAgICAgICAgTV9CRF9DTFoxNiBTeW1ib2wsIFQxLCBUMiAgIDsvLyBTeW1ib2w9TGV2ZWxQcmVmaXgKKyAgICAgICAgQ01QICAgICBTeW1ib2wsIzE2CisgICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sCisgICAgICAgIAorICAgICAgICBNT1ZTICAgIGxyLCBTdWZmaXhMZW5ndGggICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAorICAgICAgICBURVFFUSAgIFN5bWJvbCwgIzE0ICAgICAgICAgOy8vICAgYW5kICBMZXZlbFByZWZpeD09MTQKKyAgICAgICAgTU9WRVEgICBsciwgIzQgICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTQKKyAgICAgICAgVEVRICAgICBTeW1ib2wsICMxNSAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTE1CisgICAgICAgIE1PVkVRICAgbHIsICMxMiAgICAgICAgICAgICA7Ly8gICB0aGVuIExldmVsU3VmZml4U2l6ZT0xMgorICAgICAgICAKKyAgICAgICAgVEVRRVEgICBTdWZmaXhMZW5ndGgsIzAKKyAgICAgICAgQURERVEgICBTeW1ib2wsU3ltYm9sLCMxNQorICAgICAgICAKKyAgICAgICAgVEVRICAgICBsciwgIzAgICAgICAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTAKKyAgICAgICAgQkVRICAgICBMZXZlbENvZGVSZWFkICAgICAgIDsvLyBMZXZlbENvZGUgPSBMZXZlbFByZWZpeAorICAgICAgICAKKyAgICAgICAgTV9CRF9WUkVBRDE2IExldmVsU3VmZml4LCBsciwgVDEsIFQyICA7Ly8gUmVhZCBMZXZlbCBTdWZmaXgKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgU3ltYm9sLCBTeW1ib2wsIExTTCBTdWZmaXhMZW5ndGgKKyAgICAgICAgQUREICAgICBTeW1ib2wsIExldmVsU3VmZml4LCBTeW1ib2wKKyAgICAgICAgICAgICAKK0xldmVsQ29kZVJlYWQgICAgICAgIAorICAgICAgICA7Ly8gU3ltYm9sID0gTGV2ZWxDb2RlCisgICAgICAgIEFERCAgICAgU3ltYm9sLCBTeW1ib2wsIFRyYWlsaW5nT25lcyA7Ly8gKzQgaWYgbGV2ZWwgY2Fubm90IGJlICsvLTEsICsyIG8vdworICAgICAgICBNT1YgICAgIFRyYWlsaW5nT25lcywgIzIKKyAgICAgICAgTU9WUyAgICBUMSwgU3ltYm9sLCBMU1IgIzEKKyAgICAgICAgUlNCQ1MgICBUMSwgVDEsICMwICAgICAgICAgICAgICAgICAgOy8vIElmIFN5bWJvbCBvZGQgdGhlbiBuZWdhdGUKKyAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQorICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIgICAgICAgICAgICA7Ly8gU3RvcmUgbGV2ZWwuCisgICAgICAgIAorICAgICAgICBMRFIgICAgIFQyLCA9YXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgICAgIExEUlNCICAgVDEsIFtUMiwgU3VmZml4TGVuZ3RoXSAgICAgIDsvLyBGaW5kIGluY3JlbWVudCBsZXZlbCAgICAgICAgCisgICAgICAgIFRFUSAgICAgU3VmZml4TGVuZ3RoLCAjMAorICAgICAgICBNT1ZFUSAgIFN1ZmZpeExlbmd0aCwgIzEKKyAgICAgICAgQ01QICAgICBTeW1ib2wsIFQxCisgICAgICAgIEFERENTICAgU3VmZml4TGVuZ3RoLCBTdWZmaXhMZW5ndGgsICMxICAgICAgICAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAKKyAgICAgICAgQkdUICAgICBMZXZlbExvb3AKKyAgICAgICAgCitEZWNvZGVSdW5zICAgICAgICAKKyAgICAgICAgOy8vIEZpbmQgbnVtYmVyIG9mIHplcm9zCisgICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKKyAgICAgICAgU1VCICAgICBDb3VudCwgVG90YWxDb2VmZiwgIzEgICAgICAgOy8vIE51bWJlciBvZiBydW5zIGV4Y2x1ZGluZyBsYXN0CisgICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBUMSwgVG90YWxDb2VmZiAgIDsvLyBNYXhpbXVtIG51bWJlciBvZiB6ZXJvcyB0aGVyZSBjb3VsZCBiZQorICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCisgICAgICAgIE1PViAgICAgQ29lZmZOdW0sVG90YWxDb2VmZgorICAgICAgICBTVUIgICAgIENvZWZmTnVtLENvZWZmTnVtLCMxCisgICAgICAgIEJFUSAgICAgTm9aZXJvc0xlZnQKKyAgICAgICAgCisgICAgICAgIDsvLyBVbnBhY2sgbnVtYmVyIG9mIHplcm9zIGZyb20gYml0c3RyZWFtCisgICAgICAgIFRFUSAgICAgVDEsICM0ICAgICAgICAKKyAgICAgICAgTERSRVEgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMtNCkKKyAgICAgICAgTERSTkUgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcy00KQorICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgVG90YWxDb2VmZiwgTFNMICMyXQorICAgICAgICAKKyAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIgOy8vIFN5bWJvbCA9IFplcm9zTGVmdAorICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKKyAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKKworICAgICAgICBMRFIgICAgIHBwUnVuVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcy00KQorICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCisgICAgICAgIE1PVlMgICAgWmVyb3NMZWZ0LCBTeW1ib2wKKworICAgICAgICBBREQgICAgIENvZWZmTnVtLENvZWZmTnVtLFplcm9zTGVmdCAgICAgICAgCisKKyAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAorICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBydW5zIHdoaWxlIHplcm9zIGFyZSBsZWZ0IGFuZCBtb3JlIHRoYW4gb25lIGNvZWZmaWNpZW50CitSdW5Mb29wIAorICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKKyAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwcFJ1blRhYmxlLCBaZXJvc0xlZnQsIExTTCMyXQorICAgICAgICBCTFQgICAgIExhc3RSdW4KKyAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDMsIDIgOy8vIFN5bWJvbCA9IFJ1bgorICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTUgICAgICAgICAKKyAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wgICAgICAgIAorCisgICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBaZXJvc0xlZnQsIFN5bWJvbAorICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBTeW1ib2wKKyAgICAgICAgU1RSQiAgICBTeW1ib2wsIFtwUnVuXSwgIzEKKyAgICAgICAgQkdUICAgICBSdW5Mb29wCisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgbm8gemVyb3MgYXJlIGxlZnQKK05vWmVyb3NMZWZ0IAorICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKKyAgICAgICAgTV9QUklOVEYgIlJ1bj0lZFxuIiwgWmVyb3NMZWZ0CisgICAgICAgIFNUUkdFQiAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxCisgICAgICAgIEJHVCAgICAgTm9aZXJvc0xlZnQKKworTGFzdFJ1biAgICAgICAgCisgICAgICAgIDsvLyBGaW5hbCBydW4gbGVuZ3RoIGlzIHJlbWFpbmluZyB6ZXJvcworICAgICAgICBNX1BSSU5URiAiTGFzdFJ1bj0lZFxuIiwgWmVyb3NMZWZ0CisgICAgICAgIFNUUkIgICAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBjb2VmZmljaWVudHMgdG8gb3V0cHV0IGFycmF5CisgICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKKyAgICAgICAgVEVRICAgICBUMSwgIzE1CisgICAgICAgIEFEREVRICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKKyAgICAgICAgCisKKyAgICAgICAgU1VCICAgICBwUnVuLHBSdW4sVG90YWxDb2VmZgorICAgICAgICBTVUIgICAgIHBMZXZlbCxwTGV2ZWwsVG90YWxDb2VmZiAgCisgICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAgCisKKyAgICAgICAgTV9MRFIgICBwcFBvc0NvZWZidWYsIHBwcFBvc0NvZWZidWYKKyAgICAgICAgTERSICAgICBwUG9zQ29lZmJ1ZiwgW3BwUG9zQ29lZmJ1Zl0KKyAgICAgICAgVEVRICAgICBUMSwgIzQKKyAgICAgICAgTERSRVEgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgICAgIExEUk5FICAgcFppZ1phZywgPWFybVZDTTRQMTBfWmlnWmFnXzR4NAorCisgICAgICAgIAorICAgICAgICAKK091dHB1dExvb3AKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgVDIsIFtwUnVuXSwjMQorICAgICAgICBMRFJCICAgIFQxLCBbcFppZ1phZywgQ29lZmZOdW1dCisgICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCAjMSAgICAgIDsvLyBTa2lwIE5vbiB6ZXJvCisgICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCBUMiAgICAgIDsvLyBTa2lwIFplcm8gcnVuCisgICAgICAgIAorICAgICAgICBMRFJTSCAgIFQyLCBbcExldmVsXSwjMgorICAgICAgICAKKyAgICAgICAgU1VCUyAgICBUb3RhbENvZWZmLCBUb3RhbENvZWZmLCAjMSAgICAgICAKKyAgICAgICAgT1JSRVEgICBUMSwgVDEsICNMQVNUX0NPRUZGCisgICAgICAgIAorICAgICAgICBBREQgICAgIHRlbXAsIFQyLCAjMTI4CisgICAgICAgIENNUCAgICAgdGVtcCwgIzI1NgorICAgICAgICBPUlJDUyAgIFQxLCBUMSwgI1RXT19CWVRFX0NPRUZGCisKKyAgICAgICAgCisgICAgICAgIFRFUSAgICAgVG90YWxDb2VmZiwgIzAgICAgICAgICAgICAgIDsvLyBQcmVzZXJ2ZXMgY2FycnkgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9QUklOVEYgIk91dHB1dD0lMDJ4ICUwNHhcbiIsIFQxLCBUMgorICAgICAgICBTVFJCICAgIFQxLCBbcFBvc0NvZWZidWZdLCAjMQorICAgICAgICBTVFJCICAgIFQyLCBbcFBvc0NvZWZidWZdLCAjMQorICAgICAgICBNT1YgICAgIFQyLCBUMiwgTFNSICM4CisgICAgICAgIFNUUkNTQiAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxICAgICAgICAgICAgICAgIAorICAgICAgICBCTkUgICAgIE91dHB1dExvb3AKKyAgICAgICAgCisgICAgICAgIDsvLyBGaW5pc2hlZAorICAgICAgICBTVFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQorICAgICAgICBNX0xEUiAgIHBwQml0U3RyZWFtLCBwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9MRFIgICBwT2Zmc2V0LCBwcE9mZnNldAorICAgICAgICBCICAgICAgIEVuZE5vRXJyb3IKKyAgICAgICAgICAgIAorRW5kQmFkU3ltYm9sCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX0VycgorICAgICAgICBCICAgICAgIEVuZCAgICAKKyAgICAgICAgCitFbmROb0Vycm9yCisgICAgICAgIDsvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gdGhlIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwT2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VyciAgICAKK0VuZAorICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjc2MTYwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwpAQCAtMCwwICsxLDEyMyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKworICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXggCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAgICAgCisgICAgICAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKworICAgIAorICAgIElGIENvcnRleEE4CisgICAgICAgICAgIAorIAorICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAorICAgICAgICAgRENCICAwLCAyLCAwLCAyCisgICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKKyAgICAgICAgIERDQiAgMCwgMiwgMCwgMgorICAgICAgICAgRENCICAyLCAxLCAyLCAxCisKKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgICAgICAgRENCICAwLCAyCisgICAgICAgICBEQ0IgIDIsIDEKKworCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeAorICAgICAgICAgRENCICAxMCwgMTYsIDEzCisgICAgICAgICBEQ0IgIDExLCAxOCwgMTQKKyAgICAgICAgIERDQiAgMTMsIDIwLCAxNgorICAgICAgICAgRENCICAxNCwgMjMsIDE4CisgICAgICAgICBEQ0IgIDE2LCAyNSwgMjAKKyAgICAgICAgIERDQiAgMTgsIDI5LCAyMworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gWyhJTlQpKFFQLzYpXSwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgICBEQ0IgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorICAgICAgICAgRENCICAxLCAgMSwgIDEsICAxLCAgMSwgIDEKKyAgICAgICAgIERDQiAgMiwgIDIsICAyLCAgMiwgIDIsICAyCisgICAgICAgICBEQ0IgIDMsICAzLCAgMywgIDMsICAzLCAgMworICAgICAgICAgRENCICA0LCAgNCwgIDQsICA0LCAgNCwgIDQKKyAgICAgICAgIERDQiAgNSwgIDUsICA1LCAgNSwgIDUsICA1CisgICAgICAgICBEQ0IgIDYsICA2LCAgNiwgIDYsICA2LCAgNgorICAgICAgICAgRENCICA3LCAgNywgIDcsICA3LCAgNywgIDcKKyAgICAgICAgIERDQiAgOCwgIDgsICA4LCAgOCwgIDgsICA4CisgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBtb2R1bHVzIGV4cHJlc3Npb24gW1FQJTZdKjYsCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBpbnZpZHVhbCBieXRlIHZhbHVlcyBzdG9yZWQgYXMKKzsvLyBoYWxmd29yZHMuIFRoaXMgYXZvaWRzIHVucGFja2luZyBpbnNpZGUgdGhlIGZ1bmN0aW9uCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgIERDVyAxMCwgMTYsIDEzIAorICAgICAgICAgRENXIDExLCAxOCwgMTQKKyAgICAgICAgIERDVyAxMywgMjAsIDE2CisgICAgICAgICBEQ1cgMTQsIDIzLCAxOAorICAgICAgICAgRENXIDE2LCAyNSwgMjAKKyAgICAgICAgIERDVyAxOCwgMjksIDIzIAorICAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgICAgIAorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgICAgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlOTEyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwyMzYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCisgICAgSUYgQVJNMTEzNkpTIAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDgKK2lIZWlnaHQgICAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCit4ICAgICAgICAgICAgICAgUk4gNworeDAgICAgICAgICAgICAgIFJOIDcKK3gxICAgICAgICAgICAgICBSTiAxMAoreDIgICAgICAgICAgICAgIFJOIDExCitTY3JhdGNoICAgICAgICAgUk4gMTIKKworOy8vIEZ1bmN0aW9uOiAKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGEgNCBieXRlIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uLgorOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA5IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gcm93cyB0byBjb3B5Cis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMixyMyxyNCxyNSxyNgorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYworOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZSAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29weSBwRHN0IHRvIHNjcmF0Y2gKKyAgICAgICAgTU9WICAgICBTY3JhdGNoLCBwRHN0CisKK1N0YXJ0QWxpZ25lZFN0YWNrQ29weQorICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMKKyAgICAgICAgCisgICAgICAgIE1fU1dJVENIIHgKKyAgICAgICAgTV9DQVNFICAgQ29weTB0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTF0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTJ0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTN0b0FsaWduZWQKKyAgICAgICAgTV9FTkRTV0lUQ0gKKworQ29weTB0b0FsaWduZWQgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MHRvQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlFbmQgIAorICAgICAgCitDb3B5MXRvQWxpZ25lZCAgICAgICAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMjQKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTF0b0FsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5RW5kICAKKworQ29weTJ0b0FsaWduZWQgICAgICAgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMTYKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkydG9BbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weUVuZCAgCisKK0NvcHkzdG9BbGlnbmVkICAgICAgICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjOAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTN0b0FsaWduZWQKKworQ29weUVuZCAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBTcmMsIFNjcmF0Y2gKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjMTIKKworICAgICAgICBNX0VORAorICAgIAorCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIG9mIHJvd3MgdG8gY29weQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjIscjMscjQscjUscjYKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyOCxyOSxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKKzsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENvcHkgcFNyYyB0byBzdGFjaworU3RhcnRWQWxpZ25lZFN0YWNrQ29weQorICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NXSVRDSCB4CisgICAgICAgIE1fQ0FTRSAgIENvcHkwdG9WQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MXRvVkFsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTJ0b1ZBbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkzdG9WQWxpZ25lZAorICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICAKK0NvcHkwdG9WQWxpZ25lZCAgCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MHRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisgICAgICAKK0NvcHkxdG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICM4CisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTF0b1ZBbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weVZFbmQgIAorCitDb3B5MnRvVkFsaWduZWQgICAgICAgIAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMTYKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MnRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisKK0NvcHkzdG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzI0CisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTN0b1ZBbGlnbmVkCisKK0NvcHlWRW5kICAKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBEc3QsICMyOAorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0CisKKyAgICAgICAgTV9FTkQKKworCisgICAgRU5ESUYKKworICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMjc1ODkxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMTQ5IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIxLHIzLHI0LHI1LHI2LHI3LHIxMCxyMTEscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjAscjIscjgscjkscjEyCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKKyAgICAgICAgCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK3gwICAgICAgICAgICAgICBSTiA0Cit4MSAgICAgICAgICAgICAgUk4gNQoreDIgICAgICAgICAgICAgIFJOIDgKK3gzICAgICAgICAgICAgICBSTiA5CitUZW1wICAgICAgICAgICAgUk4gMTIKKworICAgIElGIEFSTTExMzZKUworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUsIHI2CisKK0NvcHk0eDRTdGFydAorICAgICAgICA7Ly8gRG8gQ29weSBhbmQgYnJhbmNoIHRvIEVuZE9mSW50ZXJwb2xhdGlvbgorICAgICAgICBBTkQgICAgIFRlbXAsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBNX1NXSVRDSCBUZW1wCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMAorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjEKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24yCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMworICAgICAgICBNX0VORFNXSVRDSAorCitDb3B5NHg0QWxpZ24wCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX0xEUiAgIHgxLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgxLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTV9MRFIgICB4MywgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNX1NUUiAgIHgzLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKworQ29weTR4NEFsaWduMQorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKyAgICAgIAorQ29weTR4NEFsaWduMgorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRBbGlnbjMgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKworICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRFbmQKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGU1YTM5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE3OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQorCis7Ly8gRnVuY3Rpb25zOiAKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlIGFuZAorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIHJlLWFycmFuZ2VtZW50IG9mIGRhdGEgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGEgYnVmZmVyIHBvaW50ZWQgYnkgcEJ1Zi4KKzsvLyBUaGlzIHdpbGwgZG8gdGhlIGNvbnZlcnRpb24gb2YgZGF0YSBmcm9tIDE2IGJpdCB0byA4IGJpdCBhbmQgaXQgYWxzbworOy8vIHJlbW92ZSBvZmZzZXQgYW5kIGNoZWNrIGZvciBzYXR1cmF0aW9uLgorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyNyB3aGVyZSByMCBpcyBpbnB1dCBwb2ludGVyIGFuZCByMiBpdHMgc3RlcCBzaXplLCByNyBpcyBvdXRwdXQgcG9pbnRlcgorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjQscjUscjYscjgscjkscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uCis7Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBkZXN0aW5hdGlvbiBsb2NhdGlvbgorCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorICAgICAgICAKK01BU0sgICAgICAgICAgICBFUVUgMHg4MDgwODA4MCAgOy8vIE1hc2sgaXMgdXNlZCB0byBpbXBsZW1lbnQgKGErYisxKS8yCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjMCAgICAgICAgICAgUk4gMAorc3JjU3RlcDAgICAgICAgIFJOIDEKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworVGVtcDEgICAgICAgICAgIFJOIDQKK1RlbXAyICAgICAgICAgICBSTiA1CitUZW1wMyAgICAgICAgICAgUk4gMTAKK1RlbXA0ICAgICAgICAgICBSTiAxMQorcEJ1ZiAgICAgICAgICAgIFJOIDcKK3IweDBmZTAwZmUwICAgICBSTiA2CityMHgwMGZmMDBmZiAgICAgUk4gMTIKK0NvdW50ICAgICAgICAgICBSTiAxNAorVmFsdWVBMCAgICAgICAgIFJOIDEwCitWYWx1ZUExICAgICAgICAgUk4gMTEKKworICAgIElGIEFSTTExMzZKUworCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgCisgICAgICAgIE1PViAgICAgICAgIENvdW50LCAjNCAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAKK0xvb3BTdGFydDEKKyAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0CisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgICAgICAgCisgICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUUkQgICAgICAgIFZhbHVlQTAsIFtwQnVmXSwgIzggCisgICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydDEKK0VuZDEKKyAgICAgICAgU1VCICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyCisgICAgICAgIE1PViAgICAgICAgc3JjU3RlcDAsICM4CisKKyAgICAgICAgTV9FTkQKKworCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUsIHI2CisgICAgICAgIAorICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAorICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYKKyAgICAgICAgTU9WICAgICAgICAgQ291bnQsICMyCisKK0xvb3BTdGFydCAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCisgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0CisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KKworICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKKyAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCisgICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICMtNCAgCisKKyAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCisgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0CisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KKyAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKKyAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCisgICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICM0ICAKKyAgICAgICAgCisgICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydAorRW5kMgorICAgICAgICBTVUIgICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyLTgKKyAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcDAsICM0CisKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxNjg0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwzMTMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgIElGIENvcnRleEE4CisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUsIHIxMQorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCitkQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2CitkQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2CitxQ29lZmY1ICAgICAgICAgUU4gMTQuUzMyCitxQ29lZmYyMCAgICAgICAgUU4gMTUuUzMyCisgICAgICAgIAorcVNyYzAxICAgICAgICAgIFFOIDAuVTgKK2RTcmMwICAgICAgICAgICBETiAwLlU4CitkU3JjMSAgICAgICAgICAgRE4gMS5VOCAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKK2RTcmNiICAgICAgICAgICBETiA0LlU4CitkU3JjYyAgICAgICAgICAgRE4gMi5VOAorZFNyY2QgICAgICAgICAgIEROIDMuVTgKK2RTcmNlICAgICAgICAgICBETiA1LlU4CitkU3JjZiAgICAgICAgICAgRE4gMS5VOAorCitxU3JjYiAgICAgICAgICAgUU4gMi5TMTYKK3FTcmNjICAgICAgICAgICBRTiAxLlMxNgorZFNyY0IgICAgICAgICAgIEROIDQuUzE2CitkU3JjQyAgICAgICAgICAgRE4gMi5TMTYKKworcVJlczAgICAgICAgICAgIFFOIDUuUzE2CitxUmVzMSAgICAgICAgICAgUU4gNi5TMTYKK3FSZXMyICAgICAgICAgICBRTiA3LlMxNgorcVJlczMgICAgICAgICAgIFFOIDguUzE2CitxUmVzNCAgICAgICAgICAgUU4gOS5TMTYKK3FSZXM1ICAgICAgICAgICBRTiAxMC5TMTYKK3FSZXM2ICAgICAgICAgICBRTiAxMS5TMTYKK3FSZXM3ICAgICAgICAgICBRTiAxMi5TMTYKK3FSZXM4ICAgICAgICAgICBRTiAxMy5TMTYKKyAgICAKK2RSZXMwICAgICAgICAgICBETiAxMC5TMTYKK2RSZXMxICAgICAgICAgICBETiAxMi5TMTYKK2RSZXMyICAgICAgICAgICBETiAxNC5TMTYKK2RSZXMzICAgICAgICAgICBETiAxNi5TMTYKK2RSZXM0ICAgICAgICAgICBETiAxOC5TMTYKK2RSZXM1ICAgICAgICAgICBETiAyMC5TMTYKK2RSZXM2ICAgICAgICAgICBETiAyMi5TMTYKK2RSZXM3ICAgICAgICAgICBETiAyNC5TMTYKK2RSZXM4ICAgICAgICAgICBETiAyNi5TMTYKKyAgICAKK3FBY2MwMSAgICAgICAgICBRTiA1LlMzMgorcUFjYzIzICAgICAgICAgIFFOIDYuUzMyCitxQWNjNDUgICAgICAgICAgUU4gMi5TMzIKK3FBY2M2NyAgICAgICAgICBRTiAzLlMzMgorcVN1bUJFICAgICAgICAgIFFOIDAuUzMyCitxU3VtQ0QgICAgICAgICAgUU4gMS5TMzIKKworZFRlbXBBY2MwICAgICAgIEROIDAuVTE2CitkVGVtcEFjYzEgICAgICAgRE4gMi5VMTYKK2RUZW1wQWNjMiAgICAgICBETiA0LlUxNgorZFRlbXBBY2MzICAgICAgIEROIDYuVTE2CisKK3FUQWNjMCAgICAgICAgICBRTiAwLlUxNgorcVRBY2MxICAgICAgICAgIFFOIDEuVTE2CitxVEFjYzIgICAgICAgICAgUU4gMi5VMTYKK3FUQWNjMyAgICAgICAgICBRTiAzLlUxNgorCitkQWNjMCAgICAgICAgICAgRE4gMC5VOAorZEFjYzEgICAgICAgICAgIEROIDIuVTgKK2RBY2MyICAgICAgICAgICBETiA0LlU4CitkQWNjMyAgICAgICAgICAgRE4gNi5VOAorCitkVG1wMCAgICAgICAgICAgRE4gOC5TMTYKK2RUbXAxICAgICAgICAgICBETiA5LlMxNgorcVRtcDAgICAgICAgICAgIFFOIDQuUzMyCisKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKKworICAgICAgICA7Ly8gUm93MAorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXMwLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKyAgICAgICAgVk1MQSAgICAgICAgZFJlczAsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICAKKyAgICAgICAgOy8vIFJvdzEKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzMSwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBkUmVzMCwgZFJlczAsIGRUbXAwIDsvLyBUZVJpCisgICAgICAgIAorICAgICAgICBWTUxBICAgICAgICBkUmVzMSwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczEsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzMiwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBkUmVzMSwgZFJlczEsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3czCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczMsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMyLCBkUmVzMiwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzMywgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczMsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzNCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczMsIGRSZXMzLCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM0LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzNCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93NQorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXM1LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKworICAgICAgICBWU1VCICAgICAgICBkUmVzNCwgZFJlczQsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczUsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM1LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3c2CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczYsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM1LCBkUmVzNSwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzNiwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczYsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzcKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzNywgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczYsIGRSZXM2LCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM3LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzNywgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93OAorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXM4LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM3LCBkUmVzNywgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzOCwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczgsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgVk1PViAgICAgICAgcUNvZWZmMjAsICMyMAorICAgICAgICBWTU9WICAgICAgICBxQ29lZmY1LCAjNQorCisgICAgICAgIDsvLyBDb2wwCisgICAgICAgIFZBRERMICAgICAgIHFBY2MwMSwgZFJlczAsIGRSZXM1ICAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczIsIGRSZXMzICAgICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczEsIGRSZXM0ICAgICAgICA7Ly8gYitlCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczgsIGRSZXM4LCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIHFBY2MwMSwgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBxQWNjMDEsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisgICAgICAgIFZNVUwgICAgICAgIHFUbXAwLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorCisgICAgICAgIDsvLyBDb2wxCisgICAgICAgIFZBRERMICAgICAgIHFBY2MyMywgZFJlczEsIGRSZXM2ICAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczMsIGRSZXM0ICAgICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczIsIGRSZXM1ICAgICAgICA7Ly8gYitlCisgICAgICAgIFZNTEEgICAgICAgIHFBY2MyMywgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKyAgICAgICAgVlNVQiAgICAgICAgcUFjYzAxLCBxQWNjMDEsIHFUbXAwCisKKzsgICAgICAgIFZNTFMgICAgICAgIHFBY2MyMywgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKyAgICAgICAgVk1VTCAgICAgICAgcVRtcDAsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisKKyAgICAgICAgOy8vIENvbDIKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzQ1LCBkUmVzMiwgZFJlczcgICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzNCwgZFJlczUgICAgICAgIDsvLyBjK2QKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzMywgZFJlczYgICAgICAgIDsvLyBiK2UKKyAgICAgICAgVk1MQSAgICAgICAgcUFjYzQ1LCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKworICAgICAgICBWU1VCICAgICAgICBxQWNjMjMsIHFBY2MyMywgcVRtcDAKKworOyAgICAgICAgVk1MUyAgICAgICAgcUFjYzQ1LCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorICAgICAgICBWTVVMICAgICAgICBxVG1wMCwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb2wzCisgICAgICAgIFZBRERMICAgICAgIHFBY2M2NywgZFJlczMsIGRSZXM4ICAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczUsIGRSZXM2ICAgICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczQsIGRSZXM3ICAgICAgICA7Ly8gYitlCisgICAgICAgIFZNTEEgICAgICAgIHFBY2M2NywgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKyAgICAgICAgVlNVQiAgICAgICAgcUFjYzQ1LCBxQWNjNDUsIHFUbXAwCisKKyAgICAgICAgVk1MUyAgICAgICAgcUFjYzY3LCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMCwgcUFjYzAxLCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MxLCBxQWNjMjMsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzIsIHFBY2M0NSwgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMywgcUFjYzY3LCAjMTAKKyAgICAgICAgCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MwLCBxVEFjYzAKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzEsIHFUQWNjMQorICAgICAgICBWUU1PVk4gICAgICBkQWNjMiwgcVRBY2MyCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MzLCBxVEFjYzMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorCisKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YmMwOTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjY2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUsIHIxMQorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCitkVENvZWZmNSAgICAgICAgRE4gMzAuVTgKK2RUQ29lZmYyMCAgICAgICBETiAzMS5VOAorZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgorZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgorCitxU3JjQTAxICAgICAgICAgUU4gMC5VOAorcVNyY0IyMyAgICAgICAgIFFOIDEuVTgKK3FTcmNDNDUgICAgICAgICBRTiAyLlU4CitxU3JjRDY3ICAgICAgICAgUU4gMy5VOAorcVNyY0U4OSAgICAgICAgIFFOIDQuVTgKK3FTcmNGMTAxMSAgICAgICBRTiA1LlU4CitxU3JjRzEyMTMgICAgICAgUU4gNi5VOAorcVNyY0gxNDE1ICAgICAgIFFOIDcuVTgKK3FTcmNJMTYxNyAgICAgICBRTiA4LlU4CisKK2RTcmNBMCAgICAgICAgICBETiAwLlU4CitkU3JjQjIgICAgICAgICAgRE4gMi5VOAorZFNyY0M0ICAgICAgICAgIEROIDQuVTgKK2RTcmNENiAgICAgICAgICBETiA2LlU4CitkU3JjRTggICAgICAgICAgRE4gOC5VOAorZFNyY0YxMCAgICAgICAgIEROIDEwLlU4CitkU3JjRzEyICAgICAgICAgRE4gMTIuVTgKK2RTcmNIMTQgICAgICAgICBETiAxNC5VOAorZFNyY0kxNiAgICAgICAgIEROIDE2LlU4CisKK2RTcmNBMSAgICAgICAgICBETiAxLlU4CitkU3JjQjMgICAgICAgICAgRE4gMy5VOAorZFNyY0M1ICAgICAgICAgIEROIDUuVTgKK2RTcmNENyAgICAgICAgICBETiA3LlU4CitkU3JjRTkgICAgICAgICAgRE4gOS5VOAorZFNyY0YxMSAgICAgICAgIEROIDExLlU4CitkU3JjRzEzICAgICAgICAgRE4gMTMuVTgKK2RTcmNIMTUgICAgICAgICBETiAxNS5VOAorZFNyY0kxNyAgICAgICAgIEROIDE3LlU4CisKK3FUZW1wUDAxICAgICAgICBRTiA5LlMxNgorcVRlbXBRMDEgICAgICAgIFFOIDEwLlMxNgorcVRlbXBSMDEgICAgICAgIFFOIDExLlMxNgorcVRlbXBTMDEgICAgICAgIFFOIDEyLlMxNgorCitxVGVtcFAyMyAgICAgICAgUU4gMC5TMTYKK3FUZW1wUTIzICAgICAgICBRTiAxLlMxNgorcVRlbXBSMjMgICAgICAgIFFOIDIuUzE2CitxVGVtcFMyMyAgICAgICAgUU4gMy5TMTYKKworZFRlbXBQMCAgICAgICAgIEROIDE4LlMxNgorZFRlbXBQMSAgICAgICAgIEROIDE5LlMxNgorZFRlbXBQMiAgICAgICAgIEROIDAuUzE2CisKK2RUZW1wUTAgICAgICAgICBETiAyMC5TMTYKK2RUZW1wUTEgICAgICAgICBETiAyMS5TMTYKK2RUZW1wUTIgICAgICAgICBETiAyLlMxNgorCitkVGVtcFIwICAgICAgICAgRE4gMjIuUzE2CitkVGVtcFIxICAgICAgICAgRE4gMjMuUzE2CitkVGVtcFIyICAgICAgICAgRE4gNC5TMTYKKworZFRlbXBTMCAgICAgICAgIEROIDI0LlMxNgorZFRlbXBTMSAgICAgICAgIEROIDI1LlMxNgorZFRlbXBTMiAgICAgICAgIEROIDYuUzE2CisgCitkVGVtcEIwICAgICAgICAgRE4gMjYuUzE2CitkVGVtcEMwICAgICAgICAgRE4gMjcuUzE2CitkVGVtcEQwICAgICAgICAgRE4gMjguUzE2CitkVGVtcEYwICAgICAgICAgRE4gMjkuUzE2CisKK2RUZW1wQWNjMCAgICAgICBETiAwLlUxNgorZFRlbXBBY2MxICAgICAgIEROIDIuVTE2CitkVGVtcEFjYzIgICAgICAgRE4gNC5VMTYKK2RUZW1wQWNjMyAgICAgICBETiA2LlUxNgorCitkQWNjMCAgICAgICAgICAgRE4gMC5VOAorZEFjYzEgICAgICAgICAgIEROIDIuVTgKK2RBY2MyICAgICAgICAgICBETiA0LlU4CitkQWNjMyAgICAgICAgICAgRE4gNi5VOAorCitxQWNjMCAgICAgICAgICAgUU4gMC5TMzIKK3FBY2MxICAgICAgICAgICBRTiAxLlMzMgorcUFjYzIgICAgICAgICAgIFFOIDIuUzMyCitxQWNjMyAgICAgICAgICAgUU4gMy5TMzIKKworcVRBY2MwICAgICAgICAgIFFOIDAuVTE2CitxVEFjYzEgICAgICAgICAgUU4gMS5VMTYKK3FUQWNjMiAgICAgICAgICBRTiAyLlUxNgorcVRBY2MzICAgICAgICAgIFFOIDMuVTE2ICAgICAgICAgICAgICAgIAorCitxVG1wICAgICAgICAgICAgUU4gNC5TMTYKK2RUbXAgICAgICAgICAgICBETiA4LlMxNgorCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNBMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFthMCBhMSBhMiBhMyAuLiBhMTVdICAgCisgICAgICAgIEFERCAgICAgICAgIHIxMiwgcFNyYywgc3JjU3RlcCwgTFNMICMyCisgICAgICAgIFZNT1YgICAgICAgIGRUQ29lZmY1LCAjNQorICAgICAgICBWTU9WICAgICAgICBkVENvZWZmMjAsICMyMAorICAgICAgICBWTEQxICAgICAgICBxU3JjRjEwMTEsIFtyMTJdLCBzcmNTdGVwCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNCMjMsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLiBiMTVdCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjRzEyMTMsIFtyMTJdLCBzcmNTdGVwCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUDAxLCBkU3JjQTAsIGRTcmNGMTAgICAgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjQzQ1LCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbYzAgYzEgYzIgYzMgLi4gYzE1XQorICAgICAgICBWQURETCAgICAgICBxVGVtcFAyMywgZFNyY0ExLCBkU3JjRjExICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNENjcsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBWQURETCAgICAgICBxVGVtcFEwMSwgZFNyY0IyLCBkU3JjRzEyICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjRTg5LCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvL3QwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDAxLCBkU3JjQzQsIGRUQ29lZmYyMAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0gxNDE1LCBbcjEyXSwgc3JjU3RlcAorCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDIzLCBkU3JjQzUsIGRUQ29lZmYyMAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0kxNjE3LCBbcjEyXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFtpMCBpMSBpMiBpMyAuLiBdCisgICAgICAgIAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAwMSwgZFNyY0Q2LCBkVENvZWZmMjAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMDEsIGRTcmNENiwgZFRDb2VmZjIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDIzLCBkU3JjQjMsIGRUQ29lZmY1CisgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxVGVtcFIwMSwgZFNyY0M0LCBkU3JjSDE0ICAgCisgICAgICAgIAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAwMSwgZFNyY0IyLCBkVENvZWZmNQorCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUTIzLCBkU3JjQjMsIGRTcmNHMTMgICAKKworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAyMywgZFNyY0Q3LCBkVENvZWZmMjAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMDEsIGRTcmNFOCwgZFRDb2VmZjIwCisKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMDEsIGRTcmNFOCwgZFRDb2VmZjUKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMjMsIGRTcmNENywgZFRDb2VmZjIwCisKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMjMsIGRTcmNFOSwgZFRDb2VmZjUKKworICAgICAgICA7Ly90MQorCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjAxLCBkU3JjRTgsIGRUQ29lZmYyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEwMSwgZFNyY0M0LCBkVENvZWZmNQorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEyMywgZFNyY0M1LCBkVENvZWZmNQorICAgICAgICBWQURETCAgICAgICBxVGVtcFIyMywgZFNyY0M1LCBkU3JjSDE1ICAgCisKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMDEsIGRTcmNGMTAsIGRUQ29lZmYyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEwMSwgZFNyY0YxMCwgZFRDb2VmZjUKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMjMsIGRTcmNFOSwgZFRDb2VmZjIwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjIzLCBkU3JjRTksIGRUQ29lZmYyMAorICAgICAgICBWQURETCAgICAgICBxVGVtcFMwMSwgZFNyY0Q2LCBkU3JjSTE2ICAgCisKKworICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIwMSwgZFNyY0Q2LCBkVENvZWZmNQorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEyMywgZFNyY0YxMSwgZFRDb2VmZjUKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMjMsIGRTcmNENywgZFRDb2VmZjUKKworICAgICAgICA7Ly90MgorICAgICAgICBWQURETCAgICAgICBxVGVtcFMyMywgZFNyY0Q3LCBkU3JjSTE3ICAgCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzAxLCBkU3JjRjEwLCBkVENvZWZmMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMDEsIGRTcmNHMTIsIGRUQ29lZmY1CisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjIzLCBkU3JjRzEzLCBkVENvZWZmNQorCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzIzLCBkU3JjRjExLCBkVENvZWZmMjAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMDEsIGRTcmNHMTIsIGRUQ29lZmYyMAorICAgICAgICBWRVhUICAgICAgICBkVGVtcEIwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMQorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIyMywgZFNyY0YxMSwgZFRDb2VmZjIwCisKKworICAgICAgICA7Ly90MworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMyMywgZFNyY0cxMywgZFRDb2VmZjIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzAxLCBkU3JjRTgsIGRUQ29lZmY1CisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUDAsIGRUZW1wUDEsICMyCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMjMsIGRTcmNFOSwgZFRDb2VmZjUKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMDEsIGRTcmNIMTQsIGRUQ29lZmY1CisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUDEsIGRUZW1wUDIsICMxCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUDAsIGRUZW1wUDEsICMzCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzIzLCBkU3JjSDE1LCBkVENvZWZmNQorICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzAsIGRUZW1wUDAsIGRUZW1wRjAKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAorICAgICAgICA7Ly9oIAorICAgICAgICBWTU9WICAgICAgICBkQ29lZmY1LCAjNQorICAgICAgICAKKyAgICAgICAgOy8vIHJlczAKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRlbXBCMCwgZFRlbXBQMQorICAgICAgICBWTUxBTCAgICAgICBxQWNjMCwgZFRlbXBDMCwgZENvZWZmMjAKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBRMSwgZFRlbXBRMiwgIzEKKyAgICAgICAgVk1MU0wgICAgICAgcUFjYzAsIGRUZW1wQjAsIGRDb2VmZjUKKworICAgICAgICA7Ly8gcmVzMQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEIwLCBkVGVtcFEwLCBkVGVtcFExLCAjMQorICAgICAgICBWQURETCAgICAgICBxQWNjMSwgZFRlbXBRMCwgZFRlbXBGMAorICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUZW1wQjAsIGRUZW1wUTEKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzMKKyAgICAgICAgVk1MQUwgICAgICAgcUFjYzEsIGRUZW1wQzAsIGRDb2VmZjIwCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUjEsIGRUZW1wUjIsICMxCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUjAsIGRUZW1wUjEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUbXAsIGRUZW1wUjAsIGRUZW1wUjEsICMxCisgICAgICAgIFZBRERMICAgICAgIHFBY2MyLCBkVGVtcFIwLCBkVGVtcEYwCisgICAgICAgIFZNTFNMICAgICAgIHFBY2MxLCBkVGVtcEIwLCBkQ29lZmY1Cis7ICAgICAgICBWRVhUICAgICAgICBkVGVtcEIwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMQorICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCisgICAgICAgIAorICAgICAgICA7Ly8gcmVzMgorICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVG1wLCBkVGVtcFIxCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUzAsIGRUZW1wUzEsICMzCisgICAgICAgIFZNTEFMICAgICAgIHFBY2MyLCBkVGVtcEMwLCBkQ29lZmYyMAorOyAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRlbXBCMCwgZFRlbXBSMQorICAgICAgICAKKyAgICAgICAgOy8vIHJlczMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBTMSwgZFRlbXBTMiwgIzEKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAorICAgICAgICBWRVhUICAgICAgICBkVG1wLCBkVGVtcFMwLCBkVGVtcFMxLCAjMQorICAgICAgICBWQURETCAgICAgICBxQWNjMywgZFRlbXBTMCwgZFRlbXBGMAorICAgICAgICBWTUxTTCAgICAgICBxQWNjMiwgZFRlbXBCMCwgZENvZWZmNQorICAgICAgICBWTUxBTCAgICAgICBxQWNjMywgZFRlbXBDMCwgZENvZWZmMjAKKyAgICAgICAgVkFERCAgICAgICAgZFRtcCwgZFRtcCwgZFRlbXBTMQorICAgICAgICBWTUxTTCAgICAgICBxQWNjMywgZFRtcCwgZENvZWZmNQorICAgICAgICAgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzAsIHFBY2MwLCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MxLCBxQWNjMSwgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMiwgcUFjYzIsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzMsIHFBY2MzLCAjMTAKKworICAgICAgICBWUU1PVk4gICAgICBkQWNjMCwgcVRBY2MwCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MxLCBxVEFjYzEKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzIsIHFUQWNjMgorICAgICAgICBWUU1PVk4gICAgICBkQWNjMywgcVRBY2MzCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgCisgICAgCisKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmFiZThhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjI4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworICAgIElGIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlLCByMTEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycworZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgorZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgorCitxU3JjQTAxICAgICAgICAgUU4gMTEuVTgKK3FTcmNCMDEgICAgICAgICBRTiAxMi5VOAorcVNyY0MwMSAgICAgICAgIFFOIDEzLlU4CitxU3JjRDAxICAgICAgICAgUU4gMTQuVTgKKworZFNyY0EwICAgICAgICAgIEROIDIyLlU4CitkU3JjQTEgICAgICAgICAgRE4gMjMuVTgKK2RTcmNCMCAgICAgICAgICBETiAyNC5VOAorZFNyY0IxICAgICAgICAgIEROIDI1LlU4CitkU3JjQzAgICAgICAgICAgRE4gMjYuVTgKK2RTcmNDMSAgICAgICAgICBETiAyNy5VOAorZFNyY0QwICAgICAgICAgIEROIDI4LlU4CitkU3JjRDEgICAgICAgICAgRE4gMjkuVTgKKworZFNyY2IgICAgICAgICAgIEROIDEyLlU4CitkU3JjZSAgICAgICAgICAgRE4gMTMuVTgKK2RTcmNmICAgICAgICAgICBETiAxMC5VOAorCitkU3JjMGMgICAgICAgICAgRE4gMTQuVTgKK2RTcmMxYyAgICAgICAgICBETiAxNi5VOAorZFNyYzJjICAgICAgICAgIEROIDE4LlU4CitkU3JjM2MgICAgICAgICAgRE4gMjAuVTgKKyAgICAgICAgICAgICAgICAgICAKK2RTcmMwZCAgICAgICAgICBETiAxNS5VOAorZFNyYzFkICAgICAgICAgIEROIDE3LlU4CitkU3JjMmQgICAgICAgICAgRE4gMTkuVTgKK2RTcmMzZCAgICAgICAgICBETiAyMS5VOAorCitxVGVtcDAxICAgICAgICAgUU4gNC5TMTYKK3FUZW1wMjMgICAgICAgICBRTiA2LlMxNgorZFRlbXAwICAgICAgICAgIEROIDguUzE2CitkVGVtcDIgICAgICAgICAgRE4gMTIuUzE2CisKK3FSZXMwMSAgICAgICAgICBRTiAxMS5TMTYKK3FSZXMyMyAgICAgICAgICBRTiAxMi5TMTYKK3FSZXM0NSAgICAgICAgICBRTiAxMy5TMTYKK3FSZXM2NyAgICAgICAgICBRTiAxNC5TMTYKKworZFJlczAgICAgICAgICAgIEROIDIyLlMxNgorZFJlczIgICAgICAgICAgIEROIDI0LlMxNgorZFJlczQgICAgICAgICAgIEROIDI2LlMxNgorZFJlczYgICAgICAgICAgIEROIDI4LlMxNgorCitkQWNjMCAgICAgICAgICAgRE4gMjIuVTgKK2RBY2MyICAgICAgICAgICBETiAyNC5VOAorZEFjYzQgICAgICAgICAgIEROIDI2LlU4CitkQWNjNiAgICAgICAgICAgRE4gMjguVTgKKworZFJlc3VsdDAgICAgICAgIEROIDIyLlUzMgorZFJlc3VsdDIgICAgICAgIEROIDI0LlUzMgorZFJlc3VsdDQgICAgICAgIEROIDI2LlUzMgorZFJlc3VsdDYgICAgICAgIEROIDI4LlUzMgorCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNBMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBBIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0KKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0EwLCBkU3JjQTEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNBMCwgZFNyY0ExLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCis7ICAgICAgICBWTEQxICAgICAgICBxU3JjQjAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQiByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMwYywgZFNyY0EwLCBkU3JjQTEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMwZCwgZFNyY0EwLCBkU3JjQTEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQTAsIGRTcmNBMSwgIzQKKyAgICAgICAgVkFEREwgICAgICAgcVJlczAxLCBkU3JjQTAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMwYywgZFNyYzBkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0IwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEIgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXQorOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0MwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEMgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgICAgICAgICAgCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUZW1wMCwgZFRlbXAyLCBkQ29lZmY1IDsvLyBUZVJpCisgICAgICAgIAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0IwLCBkU3JjQjEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNCMCwgZFNyY0IxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMxYywgZFNyY0IwLCBkU3JjQjEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMxZCwgZFNyY0IwLCBkU3JjQjEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQjAsIGRTcmNCMSwgIzQKKyAgICAgICAgVkFEREwgICAgICAgcVJlczIzLCBkU3JjQjAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczAsIGRSZXMwLCBkVGVtcDAgICAgOy8vIFRlUmkKKworICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjMWMsIGRTcmMxZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNDMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBDIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gICAgICAgICAgIAorOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0QwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEQgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgCisgICAgICAgIAorICAgICAgICBWTUxBICAgICAgICBkUmVzMiwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczIsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVGVtcDAsIGRUZW1wMiwgZENvZWZmNSA7Ly8gVGVSaQorCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjQzAsIGRTcmNDMSwgIzUgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyY0MwLCBkU3JjQzEsICMxICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzJjLCBkU3JjQzAsIGRTcmNDMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzJkLCBkU3JjQzAsIGRTcmNDMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmNDMCwgZFNyY0MxLCAjNAorICAgICAgICBWQURETCAgICAgICBxUmVzNDUsIGRTcmNDMCwgZFNyY2YgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMyLCBkUmVzMiwgZFRlbXAwICA7Ly8gVGVSaQorICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzJjLCBkU3JjMmQgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCisKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0QwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEQgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczQsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM0LCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRlbXAwLCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkgVGVSaQorICAgICAgICAKKworICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0QwLCBkU3JjRDEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNEMCwgZFNyY0QxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMzYywgZFNyY0QwLCBkU3JjRDEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMzZCwgZFNyY0QwLCBkU3JjRDEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjRDAsIGRTcmNEMSwgIzQKKyAgICAgICAgVkFEREwgICAgICAgcVJlczY3LCBkU3JjRDAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczQsIGRSZXM0LCBkVGVtcDAgOy8vIFRlUmkKKworICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjM2MsIGRTcmMzZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczYsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczYsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MwLCBxUmVzMDEsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MyLCBxUmVzMjMsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2M0LCBxUmVzNDUsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2M2LCBxUmVzNjcsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisKKworICAgIEVORAorICAgIAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg5YzkwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDEzNCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKworICAgIElGIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlLCByMTEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCitUZW1wICAgICAgICAgICAgUk4gMTIKKworOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKK2RDb2VmZjUgICAgICAgICBETiAzMC5TMTYKK2RDb2VmZjIwICAgICAgICBETiAzMS5TMTYKKworZFNyYzAgICAgICAgICAgIEROIDcuVTgKK2RTcmMxICAgICAgICAgICBETiA4LlU4CitkU3JjMiAgICAgICAgICAgRE4gOS5VOAorZFNyYzMgICAgICAgICAgIEROIDEwLlU4CitkU3JjNCAgICAgICAgICAgRE4gMTEuVTgKK2RTcmM1ICAgICAgICAgICBETiAxMi5VOAorZFNyYzYgICAgICAgICAgIEROIDEzLlU4CitkU3JjNyAgICAgICAgICAgRE4gMTQuVTgKK2RTcmM4ICAgICAgICAgICBETiAxNS5VOAorCitxU3VtQkUwMSAgICAgICAgUU4gOC5TMTYKK3FTdW1DRDAxICAgICAgICBRTiA5LlMxNgorZFN1bUJFMCAgICAgICAgIEROIDE2LlMxNgorZFN1bUNEMCAgICAgICAgIEROIDE4LlMxNgorCitxQWNjMDEgICAgICAgICAgUU4gMC5TMTYKK3FBY2MyMyAgICAgICAgICBRTiAxLlMxNgorcUFjYzQ1ICAgICAgICAgIFFOIDIuUzE2CitxQWNjNjcgICAgICAgICAgUU4gMy5TMTYKKworZFJlczAgICAgICAgICAgIEROIDAuUzE2CitkUmVzMSAgICAgICAgICAgRE4gMi5TMTYKK2RSZXMyICAgICAgICAgICBETiA0LlMxNgorZFJlczMgICAgICAgICAgIEROIDYuUzE2CisKK2RBY2MwICAgICAgICAgICBETiAwLlU4CitkQWNjMSAgICAgICAgICAgRE4gMi5VOAorZEFjYzIgICAgICAgICAgIEROIDQuVTgKK2RBY2MzICAgICAgICAgICBETiA2LlU4ICAgICAgICAKKyAgICAgICAgCisKK2RUbXAwICAgICAgICAgICBETiAyMC5TMTYKK2RUbXAxICAgICAgICAgICBETiAyMS5TMTYKK2RUbXAyICAgICAgICAgICBETiAyMi5TMTYKK2RUbXAzICAgICAgICAgICBETiAyMy5TMTYKKworCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMwLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi4gXSAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcFNyYywgc3JjU3RlcCwgTFNMICMyCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi4gXQorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisgICAgICAgIFZMRDEgICAgICAgIGRTcmM1LCBbVGVtcF0sIHNyY1N0ZXAgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMyLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYzAgYzEgYzIgYzMgLi4gXQorICAgICAgICBWQURETCAgICAgICBxQWNjMDEsIGRTcmMwLCBkU3JjNSAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMzLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBWTEQxICAgICAgICBkU3JjNiwgW1RlbXBdLCBzcmNTdGVwIDsvLyBUZVJpCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBkU3JjNCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRTcmM3LCBbVGVtcF0sIHNyY1N0ZXAgOy8vIFRlUmkKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMxLCBkU3JjNCAgICAgOy8vIGIrZQorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzIsIGRTcmMzICAgICA7Ly8gYytkICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzgsIFtUZW1wXSwgc3JjU3RlcCA7Ly8gVGVSaQorICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKzsgICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorICAgICAgICAKKzsgICAgICAgIFZMRDEgICAgICAgIGRTcmM2LCBbVGVtcF0sIHNyY1N0ZXAKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMyLCBkU3JjNSAgICAgOy8vIGIrZQorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzMsIGRTcmM0ICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFBY2MyMywgZFNyYzEsIGRTcmM2ICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczEsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKQorOyAgICAgICAgVk1MQSAgICAgICAgZFJlczEsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMSwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKzsgICAgICAgIFZMRDEgICAgICAgIGRTcmM3LCBbVGVtcF0sIHNyY1N0ZXAKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMzLCBkU3JjNiAgICAgOy8vIGIrZQorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzQsIGRTcmM1ICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFBY2M0NSwgZFNyYzIsIGRTcmM3ICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczIsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCis7ICAgICAgICBWTUxBICAgICAgICBkUmVzMiwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAyLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKworOyAgICAgICAgVkxEMSAgICAgICAgZFNyYzgsIFtUZW1wXSwgc3JjU3RlcCAgICAgOy8vIFtpMCBpMSBpMiBpMyAuLiBdICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmM0LCBkU3JjNyAgICAgOy8vIGIrZQorICAgICAgICBWQURETCAgICAgICBxQWNjNjcsIGRTcmMzLCBkU3JjOCAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjNSwgZFNyYzYgICAgIDsvLyBjK2QKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczMsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRtcDAKKyAgICAgICAgVkFERCAgICAgICAgZFJlczEsIGRSZXMxLCBkVG1wMQorICAgICAgICBWQUREICAgICAgICBkUmVzMiwgZFJlczIsIGRUbXAyCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMzLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNVUwgICAgICAgIGRUbXAzLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZBREQgICAgICAgIGRSZXMzLCBkUmVzMywgZFRtcDMKKworICAgICAgICBWUVJTSFJVTiAgICBkQWNjMCwgcUFjYzAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MxLCBxQWNjMjMsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzIsIHFBY2M0NSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkQWNjMywgcUFjYzY3LCAjNSAgICAgICAgCisKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorCisgICAgCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMGVjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpAQCAtMCwwICsxLDMxOCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAgCisKKyAgICBJRiBDb3J0ZXhBOAorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybyAgICAgIAorICAgIAorICAgIERDRCAgIFdpZHRoSXMyTVZJc05vdFplcm8sIFdpZHRoSXMyTVZJc05vdFplcm8KKyAgICBEQ0QgICBXaWR0aElzNE1WSXNOb3RaZXJvLCBXaWR0aElzNE1WSXNOb3RaZXJvCisgICAgRENEICAgV2lkdGhJczhNVklzTm90WmVybworICAgIAorICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm8gICAgICAKKyAgICAKKyAgICBEQ0QgICBXaWR0aElzMk1WSXNaZXJvLCBXaWR0aElzMk1WSXNaZXJvCisgICAgRENEICAgV2lkdGhJczRNVklzWmVybywgV2lkdGhJczRNVklzWmVybworICAgIERDRCAgIFdpZHRoSXM4TVZJc1plcm8KKyAgICAKKyAgICAKKzsvLyBpbnB1dCByZWdpc3RlcnMKKworcFNyYyAgICAgICAgICAgICAgICAgUk4gMAoraVNyY1N0ZXAgICAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgoraURzdFN0ZXAgICAgICAgICAgICAgUk4gMworaVdpZHRoICAgICAgICAgICAgICAgUk4gNAoraUhlaWdodCAgICAgICAgICAgICAgUk4gNQorZHggICAgICAgICAgICAgICAgICAgUk4gNgorZHkgICAgICAgICAgICAgICAgICAgUk4gNworCis7Ly8gbG9jYWwgdmFyaWFibGUgcmVnaXN0ZXJzCitwYyAgICAgICAgICAgICAgICAgICBSTiAxNQorcmV0dXJuICAgICAgICAgICAgICAgUk4gMAorRWlnaHRNaW51c2R4ICAgICAgICAgUk4gOCAKK0VpZ2h0TWludXNkeSAgICAgICAgIFJOIDkKKworQUNvZWZmICAgICAgICAgICAgICAgUk4gMTIKK0JDb2VmZiAgICAgICAgICAgICAgIFJOIDkKK0NDb2VmZiAgICAgICAgICAgICAgIFJOIDgKK0RDb2VmZiAgICAgICAgICAgICAgIFJOIDYKKworcFRhYmxlICAgICAgICAgICAgICAgUk4gMTEKKworU3RlcDEgICAgICAgICAgICAgICAgUk4gMTAKK1NyY1N0ZXBNaW51czEgICAgICAgIFJOIDE0CisKK2RBQ29lZmYgICAgICAgICAgICAgIEROIEQxMi5VOAorZEJDb2VmZiAgICAgICAgICAgICAgRE4gRDEzLlU4CitkQ0NvZWZmICAgICAgICAgICAgICBETiBEMTQuVTgKK2REQ29lZmYgICAgICAgICAgICAgIEROIEQxNS5VOAorCitkUm93MGEgICAgICAgICAgICAgICBETiBEMC5VOAorZFJvdzBiICAgICAgICAgICAgICAgRE4gRDEuVTgKK2RSb3cxYSAgICAgICAgICAgICAgIEROIEQyLlU4CitkUm93MWIgICAgICAgICAgICAgICBETiBEMy5VOAorCitxUm93MGEgICAgICAgICAgICAgICBRTiBRMi5TMTYKK3FSb3cwYiAgICAgICAgICAgICAgIFFOIFEzLlMxNgorCis7Ly9kSW5kZXggICAgICAgICAgICAgICBETiAgICBEMTYuVTggICAgICAgICAgICAgICAgIAorcVJvdzFhICAgICAgICAgICAgICAgUU4gUTExLlMxNgorcVJvdzFiICAgICAgICAgICAgICAgUU4gUTEyLlMxNgorCitkUm93MmEgICAgICAgICAgICAgICBETiBEMTYuVTgKK2RSb3cyYiAgICAgICAgICAgICAgIEROIEQxNy5VOAorZFJvdzNhICAgICAgICAgICAgICAgRE4gRDE4LlU4CitkUm93M2IgICAgICAgICAgICAgICBETiBEMTkuVTgKKworcU91dFJvdzIgICAgICAgICAgICAgUU4gUTExLlUxNgorcU91dFJvdzMgICAgICAgICAgICAgUU4gUTEyLlUxNgorZE91dFJvdzIgICAgICAgICAgICAgRE4gRDIwLlU4CitkT3V0Um93MyAgICAgICAgICAgICBETiBEMjEuVTgKK2RPdXRSb3cyVTY0ICAgICAgICAgIEROIEQyMC5VNjQKK2RPdXRSb3czVTY0ICAgICAgICAgIEROIEQyMS5VNjQKKworcU91dFJvdzAgICAgICAgICAgICAgUU4gUTIuVTE2CitxT3V0Um93MSAgICAgICAgICAgICBRTiBRMy5VMTYKK2RPdXRSb3cwICAgICAgICAgICAgIEROIEQ4LlU4CitkT3V0Um93MSAgICAgICAgICAgICBETiBEOS5VOAorCitkT3V0Um93MFU2NCAgICAgICAgICBETiBEOC5VNjQKK2RPdXRSb3cxVTY0ICAgICAgICAgIEROIEQ5LlU2NAorCitkT3V0Um93MFUzMiAgICAgICAgICBETiBEOC5VMzIKK2RPdXRSb3cxVTMyICAgICAgICAgIEROIEQ5LlUzMgorCitkT3V0Um93MFUxNiAgICAgICAgICBETiBEOC5VMTYKK2RPdXRSb3cxVTE2ICAgICAgICAgIEROIEQ5LlUxNgorCisKK2RPdXQwVTY0ICAgICAgICAgICAgIEROIEQwLlU2NAorZE91dDFVNjQgICAgICAgICAgICAgRE4gRDEuVTY0CisKK2RPdXQwMFUzMiAgICAgICAgICAgIEROIEQwLlUzMgorZE91dDAxVTMyICAgICAgICAgICAgRE4gRDEuVTMyCitkT3V0MTBVMzIgICAgICAgICAgICBETiBEMi5VMzIKK2RPdXQxMVUzMiAgICAgICAgICAgIEROIEQzLlUzMgorCitkT3V0MFUxNiAgICAgICAgICAgICBETiBEMC5VMTYKK2RPdXQxVTE2ICAgICAgICAgICAgIEROIEQxLlUxNgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEsIHIxMSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIFdpZHRoLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICBIZWlnaHQsICAgICA0CisgICAgICAgIE1fQVJHICAgRHgsICAgICAgICAgNAorICAgICAgICBNX0FSRyAgIER5LCAgICAgICAgIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBNX0xEUkQgICBkeCwgZHksIER4CisgICAgICAgIE1fTERSRCAgIGlXaWR0aCwgaUhlaWdodCwgV2lkdGgKKyAgICAgICAgCisgICAgICAgIDsvLyBFaWdodE1pbnVzZHggPSA4IC0gZHgKKyAgICAgICAgOy8vIEVpZ2h0TWludXNkeSA9IDggLSBkeQorICAgICAgICAKKyAgICAgICAgOy8vIEFDb2VmZiA9IEVpZ2h0TWludXNkeCAqIEVpZ2h0TWludXNkeQorICAgICAgICA7Ly8gQkNvZWZmID0gZHggKiBFaWdodE1pbnVzZHkKKyAgICAgICAgOy8vIENDb2VmZiA9IEVpZ2h0TWludXNkeCAqIGR5CisgICAgICAgIDsvLyBEQ29lZmYgPSBkeCAqIGR5CisgICAgICAgIAorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeCwgZHgsICM4IAorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeSwgZHksICM4CisgICAgICAgIENNTiAgICAgZHgsZHkKKyAgICAgICAgTU9WICAgICBTdGVwMSwgIzEKKyAgICAgICAgTERSRVEgICBwVGFibGUsID1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybworICAgICAgICBTVUIgICAgIFNyY1N0ZXBNaW51czEsIGlTcmNTdGVwLCBTdGVwMQorICAgICAgICBMRFJORSAgIHBUYWJsZSwgPWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvCisgICAgICAgIAorICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgICAgICAgICA7Ly8gMGEKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgQUNvZWZmLCBFaWdodE1pbnVzZHgsIEVpZ2h0TWludXNkeQorICAgICAgICBTTVVMQkIgIEJDb2VmZiwgZHgsIEVpZ2h0TWludXNkeQorICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgICAgICAgICA7Ly8gMGIKKyAgICAgICAgU01VTEJCICBDQ29lZmYsIEVpZ2h0TWludXNkeCwgZHkKKyAgICAgICAgU01VTEJCICBEQ29lZmYsIGR4LCBkeQorICAgICAgICAKKyAgICAgICAgVkRVUCAgICBkQUNvZWZmLCBBQ29lZmYKKyAgICAgICAgVkRVUCAgICBkQkNvZWZmLCBCQ29lZmYKKyAgICAgICAgVkRVUCAgICBkQ0NvZWZmLCBDQ29lZmYKKyAgICAgICAgVkRVUCAgICBkRENvZWZmLCBEQ29lZmYKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcGMsIFtwVGFibGUsIGlXaWR0aCwgTFNMICMxXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gaVdpZHRoCisgICAgICAgIAorOy8vIFBpeGVsIGxheW91dDoKKzsvLworOy8vICAgeDAwIHgwMSB4MDIKKzsvLyAgIHgxMCB4MTEgeDEyCis7Ly8gICB4MjAgeDIxIHgyMgorCis7Ly8gSWYgZnJhY3Rpb25sIG12IGlzIG5vdCAoMCwgMCkKK1dpZHRoSXM4TVZJc05vdFplcm8KKworICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gMWEKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBhLCBkUm93MGEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDFiCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYiwgZFJvdzFhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cyYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAyYQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cwYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MmIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gMmIKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzFhLCBkUm93MmEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MWIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzNhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDNhCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYSwgZFJvdzJiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cxYiwgZFJvdzNhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3czYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAzYgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cyYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gMGEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFiLCBkUm93M2IsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFhLCBkUm93M2EsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWIsIGREQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDBiCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYiwgZFJvdzBhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzJiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYSwgZFJvdzNiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU1VCUyAgIGlIZWlnaHQsIGlIZWlnaHQsICM0CisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYiwgZFJvdzBiLCBkRENvZWZmCisKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cwLCBxT3V0Um93MCwgIzYKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cxLCBxT3V0Um93MSwgIzYKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cyLCBxT3V0Um93MiwgIzYKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzBVNjQsIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3czLCBxT3V0Um93MywgIzYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzFVNjQsIFtwRHN0XSwgaURzdFN0ZXAgIAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MlU2NCwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93M1U2NCwgW3BEc3RdLCBpRHN0U3RlcCAgCisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM4TVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisKK1dpZHRoSXM0TVZJc05vdFplcm8KKworICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWEsIFtwU3JjXSwgU3RlcDEKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBhLCBkUm93MGEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBiLCBkUm93MWEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MGIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MWIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCisgICAgICAgICAgICAgICAgU1VCUyAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MSwgcU91dFJvdzEsICM2CisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MCwgcU91dFJvdzAsICM2CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cwVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cxVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM0TVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisKK1dpZHRoSXMyTVZJc05vdFplcm8KKworICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWEsIFtwU3JjXSwgU3RlcDEKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBhLCBkUm93MGEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBiLCBkUm93MWEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MGIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MWIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCisgICAgICAgICAgICAgICAgU1VCUyAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MSwgcU91dFJvdzEsICM2CisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MCwgcU91dFJvdzAsICM2CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cwVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cxVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwICAKKworICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczJNVklzTm90WmVybyAKKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorOy8vIElmIGZyYWN0aW9ubCBtdiBpcyAoMCwgMCkKK1dpZHRoSXM4TVZJc1plcm8KKyAgICAgICAgICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVwCisKK1dpZHRoSXM4TG9vcE1WSXNaZXJvCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwVTY0LCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MVU2NCwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczhMb29wTVZJc1plcm8KKworICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAgICBNX0VYSVQKKworV2lkdGhJczRNVklzWmVybyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBpU3JjU3RlcAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwMFUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MDFVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM0TVZJc1plcm8gCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgICAgIE1fRVhJVAorICAgICAgICAgICAgICAgIAorV2lkdGhJczJNVklzWmVybyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBpU3JjU3RlcAorICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQxVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzMk1WSXNaZXJvIAorICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE1fRU5ECisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIEVORAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZTI2NDJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpAQCAtMCwwICsxLDc0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVGhpcyBmaWxlIGNvbnRhaW5zIHF1YW50aXphdGlvbiB0YWJsZXMKKzsvLyAKKzsvLyAKKworICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgCisgICAgICAgICAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZSAgCisgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KSB2YWx1ZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUKKyAgICAgICAgIERDQiAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2CisgICAgICAgICBEQ0IgMTcsIDE3LCAxNywgMTcsIDE3LCAxNworICAgICAgICAgRENCIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKKyAgICAgICAgIERDQiAxOSwgMTksIDE5LCAxOSwgMTksIDE5CisgICAgICAgICBEQ0IgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAorICAgICAgICAgRENCIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKKyAgICAgICAgIERDQiAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCisgICAgICAgICBEQ0IgMjMsIDIzLCAyMywgMjMsIDIzLCAyMworICAgICAgICAgRENCIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMyBWYWx1ZXMgKEludHJhIGNhc2UpICwKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlLCAyCisgICAgICAgICBEQ0QgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQorICAgICAgICAgRENEIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKKyAgICAgICAgIERDRCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCisgICAgICAgICBEQ0QgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgorICAgICAgICAgRENEIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKKyAgICAgICAgIERDRCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCisgICAgICAgICBEQ0QgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQorICAgICAgICAgRENEIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKKyAgICAgICAgIERDRCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1ICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIEVORAorICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWU5YzMzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKQEAgLTAsMCArMSwxODYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCis7Ly8gCis7Ly8gCisKKyAgICAgICAgCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgCisgICAgCisKKworCisKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBDb3J0ZXhBOAorCis7Ly8gQVJNIFJlZ2lzdGVycworICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwRHN0ICAgICAgICAgICAgICAgIFJOICAwCitwU3JjICAgICAgICAgICAgICAgIFJOICAxCisKKworOy8vIE5lb24gUmVnaXN0ZXJzCisgICAgICAKKzsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCitkSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYgICAgICAgCitkSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYgICAgICAgCitkSW4yICAgICAgICAgICAgICAgIEROICBEMi5TMTYgICAgICAgCitkSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgICAgICAgCitkWmVybyAgICAgICAgICAgICAgIEROICBENC5TMTYKK2RlMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgorZGUxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2CitkZTIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RlMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZEluMVJTICAgICAgICAgICAgICBETiAgRDcuUzE2CitkSW4zUlMgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RmMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZGYxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkZjIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RmMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorcWYwMSAgICAgICAgICAgICAgICBRTiAgUTAuMzIKK3FmMjMgICAgICAgICAgICAgICAgUU4gIFExLjMyCitkZzAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK2RnMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgorZGcyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZzMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RmMVJTICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGYzUlMgICAgICAgICAgICAgICBETiAgRDguUzE2CisKKzsvLyBPdXRwdXQgcGl4ZWxzCitkaDAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RoMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZGgyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkaDMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYKKworICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQsICxkOAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCisgICAgICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA4IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgY29sb3VtbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgIDsvLyBTdG9yZSB0aGUgNHg0IGJsb2NrIGF0IG9uZSBnbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzIGluIHRyYW5zcG9zZWQgZm9ybQorICAgICAgICAKKyAgICAgICAgVkxENCAgICB7ZEluMCxkSW4xLGRJbjIsZEluM30sW3BTcmNdCisgICAgICAgIAorICAgICAgICBWTU9WICAgIGRaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gcmlnaHQgc2hpZnQgYnkgMSAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZGUwLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFZTVUIgICAgICAgIGRlMSxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKKyAgICAgICAgVkhBREQgICAgICAgZEluMVJTLGRJbjEsZFplcm8gICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFZIQUREICAgICAgIGRJbjNSUyxkSW4zLGRaZXJvCisgICAgICAgIFZTVUIgICAgICAgIGRlMixkSW4xUlMsZEluMyAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCisgICAgICAgIFZBREQgICAgICAgIGRlMyxkSW4xLGRJbjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCisgICAgICAgIFZBREQgICAgICAgIGRmMCxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCisgICAgICAgIFZBREQgICAgICAgIGRmMSxkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRmMixkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRmMyxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4CisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlRSTiAgICBkZjAsZGYxCisgICAgICAgIFZUUk4gICAgZGYyLGRmMworICAgICAgICBWVFJOICAgIHFmMDEscWYyMyAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZGcwLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFZTVUIgICAgICAgIGRnMSxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAorICAgICAgICBWSEFERCAgICAgICBkZjFSUyxkZjEsZFplcm8gICAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgVkhBREQgICAgICAgZGYzUlMsZGYzLGRaZXJvCisgICAgICAgIFZTVUIgICAgICAgIGRnMixkZjFSUyxkZjMgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCisgICAgICAgIFZBREQgICAgICAgIGRnMyxkZjEsZGYzUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAorICAgICAgICBWQUREICAgICAgICBkaDAsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMworICAgICAgICBWQUREICAgICAgICBkaDEsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgorICAgICAgICBWU1VCICAgICAgICBkaDIsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgorICAgICAgICBWU1VCICAgICAgICBkaDMsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMworICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gQ2FsY3VsYXRlIGZpbmFsIHZhbHVlIChjb2xPcFtpXVtqXSArIDMyKT4+NgorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWUlNIUiAgICAgICBkaDAsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgxLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMiwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDMsIzYKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWU1QxICAge2RoMCxkaDEsZGgyLGRoM30sW3BEc3RdCisgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIAorRW5kICAgICAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ29ydGV4QTggICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjNTJlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCkBAIC0wLDAgKzEsOTIgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gSW5wdXQgQXJndW1lbnRzIGFuZCB0aGVpciBzY29wZS91c2FnZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BwU3JjICAgICAgICAgICBSTiAwICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCitwRHN0ICAgICAgICAgICAgUk4gMSAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFZhcmlhYmxlcyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjICAgICAgICAgICAgUk4gMiAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZXMKK0ZsYWcgICAgICAgICAgICBSTiAzICAgIAorVmFsdWUgICAgICAgICAgIFJOIDQgICAgCitWYWx1ZTIgICAgICAgICAgUk4gNSAgICAKK3N0ck9mZnNldCAgICAgICBSTiA2ICAgIAorY3N0T2Zmc2V0ICAgICAgIFJOIDcgICAgCisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCwgcjcKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYworICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIFZhbHVlLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKKyAgICAgICAgTU9WICAgICAgVmFsdWUyLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+CisgICAgICAgIAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjOF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0XSAgPSBwRHN0WzVdICA9IHBEc3RbNl0gID0gcERzdFs3XSAgPSAwCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzE2XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbOF0gID0gcERzdFs5XSAgPSBwRHN0WzEwXSA9IHBEc3RbMTFdID0gMAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMyNF0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEyXSA9IHBEc3RbMTNdID0gcERzdFsxNF0gPSBwRHN0WzE1XSA9IDAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFRoZSBsb29wIGJlbG93IHBhcnNlcyBhbmQgdW5wYWNrcyB0aGUgaW5wdXQgc3RyZWFtLiBUaGUgQy1tb2RlbCBoYXMgCisgICAgICAgIDsvLyBhIHNvbWV3aGF0IGNvbXBsaWNhdGVkIGxvZ2ljIGZvciBzaWduIGV4dGVuc2lvbi4gIEJ1dCBpbiB0aGUgdjYgdmVyc2lvbiwKKyAgICAgICAgOy8vIHRoYXQgY2FuIGJlIGVhc2lseSB0YWtlbiBjYXJlIGJ5IGxvYWRpbmcgdGhlIGRhdGEgZnJvbSA8cFNyYz4gc3RyZWFtIGFzIAorICAgICAgICA7Ly8gU0lHTkVEIGJ5dGUvaGFsZndvcmQuIFNvLCBiYXNlZCBvbiB0aGUgZmlyc3QgVFNUIGluc3RydWN0aW9uLCA4LWJpdHMgb3IgCisgICAgICAgIDsvLyAxNi1iaXRzIGFyZSByZWFkLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5leHQsIHRvIGNvbXB1dGUgdGhlIG9mZnNldCwgd2hlcmUgdGhlIHVucGFja2VkIHZhbHVlIG5lZWRzIHRvIGJlIHN0b3JlZCwKKyAgICAgICAgOy8vIHdlIG1vZGlmeSB0aGUgY29tcHV0YXRpb24gdG8gcGVyZm9ybSBbKEZsYWcgJiAxNSkgPCAxXSBhcyBbKEZsYWcgPCAxKSAmIDMxXQorICAgICAgICA7Ly8gVGhpcyByZXN1bHRzIGluIGEgc2F2aW5nIG9mIG9uZSBjeWNsZS4KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKK3VucGFja0xvb3AKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCisgICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzICAgCisgICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOworICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKworICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKworICAgICAgICAKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCisgICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgorICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KKyAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKKyAgICAgICAgCisgICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICAKKyAgICAKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDBkNGQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpAQCAtMCwwICsxLDg4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgbWFjcm9ibG9jayAoMTZ4MTYpLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCisgKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBTdGVwIG9mIHRoZSBhcnJheXMKKyAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCAgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBUaHJlc2hvbGRzCQlBQXJyYXkgb2Ygc2l6ZSAgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluICBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQorICogW2luXQlwQlMJCQkJYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOworICogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMsIG9yIHBCUyBpcyBOVUxMLgorICogICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgorICogICAtIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgorICogICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgorICogICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSgKKwlPTVhfVTgqIHBTcmNEc3QsIAorCU9NWF9TMzIgc3JjZHN0U3RlcCwgCisJY29uc3QgT01YX1U4KiBwQWxwaGEsIAorCWNvbnN0IE9NWF9VOCogcEJldGEsIAorCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKykKK3sKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7CisKKyAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQorICAgIAorICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcys4LCBwQlMrMTYpOworCisgICAgcmV0dXJuIGVycm9yQ29kZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxOTM2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGx1bWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyAKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jaworICooMTZ4MTYpLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCisgKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBpbWFnZSB3aWR0aAorICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIGhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcFRocmVzaG9sZHMJCXBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgdmFsdWVzIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCisgKiBbaW5dCXBCUwkJCQkgcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcyBvciBwQlMgaXMgTlVMTC4KKyAqICAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCisgKiAgICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOAorICogICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KKy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKKwlPTVhfVTgqIHBTcmNEc3QsIAorCU9NWF9TMzIgc3JjZHN0U3RlcCwgCisJY29uc3QgT01YX1U4KiBwQWxwaGEsIAorCWNvbnN0IE9NWF9VOCogcEJldGEsIAorCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAorCWNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7CisKKyAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQorICAgIAorICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGU4NzFiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSw2MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHJhc3RlciBzY2FuIG9yZGVyLCBuYW1lbHkgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0KKyAqCQkJCQkJCQlidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKgkJCQkJCQkJcG9pbnRlZCB0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMKKyAqCQkJCQkJCQlpbiB0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqIHBwUG9zQ29lZmJ1ZiAgICAgICAgCisgKQorCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgMTcsIDQpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyOWU1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCisgKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gCisgKiBJbnZlcnNlIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCAKKyAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgemlnemFnIG9yZGVyIGluc3RlYWQgCisgKiBvZiBwb3NpdGlvbiBvcmRlci4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jaworICogW2luXQlzVkxDU2VsZWN0CQlWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gbnVtYmVyIG9mIG5vbi16ZXJvCisgKgkJCQkJCQkJQUMgY29lZmZpY2llbnRzIG9mIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuIEl0IGlzIAorICoJCQkJCQkJCWVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCAKKyAqCQkJCQkJCQl0YWJsZSA5LTUsIGV4Y2VwdCBpdHMgdmFsdWUgY2Fuoa90IGJlIGxlc3MgdGhhbiB6ZXJvLgorICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgorICoJCQkJCQkJCXRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBzVkxDU2VsZWN0LAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKQoreworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIHNWTENTZWxlY3QsIHNNYXhOdW1Db2VmZik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODVhNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwpAQCAtMCwwICsxLDM5NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorOy8vIAorOy8vIAorCisgICAgICAgIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUgCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorIAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisKKworCisKKworOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCisgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgCisgICAgCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKKyAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAKKworOy8vIEFSTSBSZWdpc3RlcnMKKworOy8vSW5wdXQgUmVnaXN0ZXJzCitwcFNyYyAgICAgICBSTiAgMAorcFByZWQgICAgICAgUk4gIDEKK3BEQyAgICAgICAgIFJOICAyCitwRHN0ICAgICAgICBSTiAgMworICAgCisKKzsvL091dHB1dCBSZWdpc3RlcnMKK3Jlc3VsdCAgICAgIFJOICAwCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCisKKzsvL1JlZ2lzdGVycyB1c2VkIGluIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorcFFQZGl2ICAgICAgUk4gIDEwCitwUVBtb2QgICAgICBSTiAgMTEKK3BWUm93ICAgICAgIFJOICAyCitRUG1vZCAgICAgICBSTiAgMTIKK3NoaWZ0ICAgICAgIFJOICAxNAoraW5kZXgwICAgICAgUk4gIDEgCitpbmRleDEgICAgICBSTiAgMTAgCisKKzsvL1JlZ2lzdGVycyB1c2VkIGluIERlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCitwRGVsdGEgICAgICBSTiAgNAorcERlbHRhVG1wICAgUk4gIDYKK0FDICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjaworcFByZWRUZW1wICAgUk4gIDcKK3BEQ1RlbXAgICAgIFJOICA4CitwRHN0VGVtcCAgICBSTiAgOQorcERlbHRhQXJnMSAgUk4gIDEKK3BEZWx0YUFyZzAgIFJOICAwCitRUCAgICAgICAgICBSTiAgMSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKK0RDdmFsICAgICAgIFJOICAxMCAgCitwcmVkc3RlcCAgICBSTiAgMQorZHN0U3RlcCAgICAgUk4gIDEwCitQcmVkVmFsMSAgICBSTiAgMworUHJlZFZhbDIgICAgUk4gIDUKKworCisKKworOy8vIE5lb24gUmVnaXN0ZXJzCisKKzsvLyBSZWdpc3RlcnMgdXNlZCBpbiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKKworZFZtYXRyaXggICAgICAgICAgICBETiAgRDYuOCAgCitkaW5kZXhSb3cwICAgICAgICAgIEROICBENy4zMiAKK2RpbmRleFJvdzEgICAgICAgICAgRE4gIEQ5LjMyIAorZEJ5dGVJbmRleFJvdzAgICAgICBETiAgRDcuOAorZEJ5dGVJbmRleFJvdzEgICAgICBETiAgRDkuOAorZFZSb3cwICAgICAgICAgICAgICBETiAgRDguOCAgCitkVlJvdzEgICAgICAgICAgICAgIEROICBENC44CitkVlJvdzBVMTYgICAgICAgICAgIEROICBEOC5VMTYKK2RWUm93MVUxNiAgICAgICAgICAgRE4gIEQ0LlUxNgorZFZSb3cyVTE2ICAgICAgICAgICBETiAgRDguVTE2CitkVlJvdzNVMTYgICAgICAgICAgIEROICBENC5VMTYKKworZFNoaWZ0ICAgICAgICAgICAgICBETiAgRDUuVTE2CitkU3JjUm93MCAgICAgICAgICAgIEROICBEMC5JMTYKK2RTcmNSb3cxICAgICAgICAgICAgRE4gIEQxLkkxNgorZFNyY1JvdzIgICAgICAgICAgICBETiAgRDIuSTE2ICAgIAorZFNyY1JvdzMgICAgICAgICAgICBETiAgRDMuSTE2CitkRHFudFJvdzAgICAgICAgICAgIEROICBEMC5JMTYgIAorZERxbnRSb3cxICAgICAgICAgICBETiAgRDEuSTE2IAorZERxbnRSb3cyICAgICAgICAgICBETiAgRDIuSTE2IAorZERxbnRSb3czICAgICAgICAgICBETiAgRDMuSTE2ICAKKworOy8vIFJlZ2lzdGVycyB1c2VkIGluIFRyYW5zZm9ybVJlc2lkdWFsNHg0CisKKzsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCitkSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYgICAgICAgCitkSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYgICAgICAgCitkSW4yICAgICAgICAgICAgICAgIEROICBEMi5TMTYgICAgICAgCitkSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYKK3FJbjAxICAgICAgICAgICAgICAgUU4gIFEwLjMyCitxSW4yMyAgICAgICAgICAgICAgIFFOICBRMS4zMgorCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAgICAgICAKK2RaZXJvICAgICAgICAgICAgICAgRE4gIEQ0LlMxNgorZGUwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2CitkZTEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKK2RlMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGUzICAgICAgICAgICAgICAgICBETiAgRDguUzE2CitkSW4xUlMgICAgICAgICAgICAgIEROICBENy5TMTYKK2RJbjNSUyAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZGYwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkZjEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RmMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZGYzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2CitxZjAxICAgICAgICAgICAgICAgIFFOICBRMC4zMgorcWYyMyAgICAgICAgICAgICAgICBRTiAgUTEuMzIKK2RnMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgorZGcxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2CitkZzIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RnMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZGYxUlMgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZjNSUyAgICAgICAgICAgICAgIEROICBEOC5TMTYKKworOy8vIE91dHB1dCBwaXhlbHMKK2RoMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZGgxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkaDIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RoMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNiAKKworOy8vIFJlZ2lzdGVycyB1c2VkIGluIERlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCisKK2REZWx0YVJvdzAgICAgICAgICAgRE4gIEQwLlMxNgorZERlbHRhUm93MSAgICAgICAgICBETiAgRDEuUzE2CitkRGVsdGFSb3cyICAgICAgICAgIEROICBEMi5TMTYKK2REZWx0YVJvdzMgICAgICAgICAgRE4gIEQzLlMxNgorcURlbHRhUm93MDEgICAgICAgICBRTiAgUTAuUzE2CitxRGVsdGFSb3cyMyAgICAgICAgIFFOICBRMS5TMTYKKworZFByZWRWYWxSb3cwMSAgICAgICBETiAgRDQuVTgKK2RQcmVkVmFsUm93MjMgICAgICAgRE4gIEQ1LlU4CisKK3FTdW1Sb3cwMSAgICAgICAgICAgUU4gIFEzLlMxNgorcVN1bVJvdzIzICAgICAgICAgICBRTiAgUTQuUzE2CitkRHN0Um93MDEgICAgICAgICAgIEROICBEMC5VOAorZERzdFJvdzIzICAgICAgICAgICBETiAgRDEuVTgKK2REc3RSb3cwICAgICAgICAgICAgRE4gIEQwLjMyWzBdCitkRHN0Um93MSAgICAgICAgICAgIEROICBEMC4zMlsxXQorZERzdFJvdzIgICAgICAgICAgICBETiAgRDEuMzJbMF0KK2REc3RSb3czICAgICAgICAgICAgRE4gIEQxLjMyWzFdCisgICAgCisgICAgICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIE1fQUxMT0M4IHBCdWZmZXIsIDMyCisgICAgICAgICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLHIxMSxkOQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwcmVkU3RlcE9uU3RhY2ssIDQKKyAgICAgICAgTV9BUkcgICBkc3RTdGVwT25TdGFjayw0CisgICAgICAgIE1fQVJHICAgUVBPblN0YWNrLCA0CisgICAgICAgIE1fQVJHICAgQUNPblN0YWNrLDQKKyAgCisgICAgICAgIAorICAgICAgICBNX0FEUiAgIHBEZWx0YSxwQnVmZmVyIAorICAgICAgICBNX0xEUiAgIEFDLEFDT25TdGFjayAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHIxLHIyLHIzIGJlZm9yZSBmdW5jdGlvbiBjYWxsICAgIAorICAgICAgICBNT1YgICAgIHBQcmVkVGVtcCxwUHJlZAorICAgICAgICBNT1YgICAgIHBEQ1RlbXAscERDCisgICAgICAgIE1PViAgICAgcERzdFRlbXAscERzdAorICAgICAgICAKKyAgICAgICAgQ01QICAgICBBQywjMAorICAgICAgICBCRVEgICAgIERDY2FzZQorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCA6IHN0YXRpYyBmdW5jdGlvbiBpbmxpbmVkCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly9CTCAgICAgIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorICAgICAgICBNX0xEUiAgIFFQLFFQT25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CisgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAorICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKKyAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgIGluZGV4MSw9MHgwMzAyMDUwNCAKKyAgICAgICAgTERSICAgIGluZGV4MCw9MHgwNTA0MDEwMCAgICAgICAgICAgICAgICAgICA7Ly8gSW5kZXhlcyBpbnRvIGRWbWF0cml4CisgICAgICAgIEFERCAgICBwVlJvdyxwVlJvdyxRUG1vZAorICAgICAgICBWRFVQICAgZGluZGV4Um93MCxpbmRleDAgCisgICAgICAgIFZEVVAgICBkaW5kZXhSb3cxLGluZGV4MQorICAgICAgICBWRFVQICAgZFNoaWZ0LHNoaWZ0IAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYWxsIDR4NCBwVlJvd1tdIHZhbHVlcworICAgICAgICBWTEQxICAgZFZtYXRyaXgsW3BWUm93XSAgICAgICAgICAgICAgICAgICAgIDsvLyBkVm1hdHJpeCA9IFswZHwwY3wwYnwwYV0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWVEJMICAgZFZSb3cwLGRWbWF0cml4LGRCeXRlSW5kZXhSb3cwICAgICAgIDsvLyByb3cwID0gcm93MiA9IFtwVlJvd1syXSB8IHBWUm93WzBdIHwgcFZSb3dbMl0gfCBwVlJvd1swXV0KKyAgICAgICAgVlRCTCAgIGRWUm93MSxkVm1hdHJpeCxkQnl0ZUluZGV4Um93MSAgICAgICA7Ly8gcm93MSA9IHJvdzMgPSBbcFZSb3dbMV0gfCBwVlJvd1syXSB8IHBWUm93WzFdIHwgcFZSb3dbMl1dCisgICAgICAgIENNUCAgICAgcERDVGVtcCwjMAorICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCAnc3JjJyB2YWx1ZXMgIAorICAgICAgICBWTEQxICAgeyBkU3JjUm93MCxkU3JjUm93MSxkU3JjUm93MixkU3JjUm93MyB9LFtwRGVsdGFdIAorICAgICAgICAKKyAgICAgICAgVlNITCAgIGRWUm93MFUxNixkVlJvdzBVMTYsZFNoaWZ0IAorICAgICAgICBWU0hMICAgZFZSb3cxVTE2LGRWUm93MVUxNixkU2hpZnQgCisgICAgICAgIExEUlNITkUgREN2YWwsW3BEQ1RlbXBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE11bHRpcGx5IHNyY1tdIHdpdGggcFZSb3dbXQorICAgICAgICBWTVVMICAgIGREcW50Um93MCxkU3JjUm93MCxkVlJvdzBVMTYKKyAgICAgICAgVk1VTCAgICBkRHFudFJvdzEsZFNyY1JvdzEsZFZSb3cxVTE2CisgICAgICAgIFZNVUwgICAgZERxbnRSb3cyLGRTcmNSb3cyLGRWUm93MlUxNgorICAgICAgICBWTVVMICAgIGREcW50Um93MyxkU3JjUm93MyxkVlJvdzNVMTYKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gVHJhbnNmb3JtUmVzaWR1YWw0eDQgOiBJbmxpbmVkIHRvIGF2b2lkIExvYWQvU3RvcmVzCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly9CTCAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgOy8vU1RSSE5FICBEQ3ZhbCxbcERlbHRhXQorICAgICAgICBWTU9WTkUgICAgZEluMFswXSxEQ3ZhbAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBpbnB1dCBwaXhlbHMgOiBwZXJmb3JtIFJvdyBvcHMgYXMgQ29sIG9wcworICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlRSTiAgICBkSW4wLGRJbjEKKyAgICAgICAgVlRSTiAgICBkSW4yLGRJbjMKKyAgICAgICAgVlRSTiAgICBxSW4wMSxxSW4yMyAKKyAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1PViAgICBkWmVybywjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBkZTAsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKKyAgICAgICAgVlNVQiAgICAgICAgZGUxLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAorICAgICAgICBWSEFERCAgICAgICBkSW4xUlMsZEluMSxkWmVybyAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgVkhBREQgICAgICAgZEluM1JTLGRJbjMsZFplcm8KKyAgICAgICAgVlNVQiAgICAgICAgZGUyLGRJbjFSUyxkSW4zICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKKyAgICAgICAgVkFERCAgICAgICAgZGUzLGRJbjEsZEluM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKKyAgICAgICAgVkFERCAgICAgICAgZGYwLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKKyAgICAgICAgVkFERCAgICAgICAgZGYxLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGYyLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGYzLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlRSTiAgICBkZjAsZGYxCisgICAgICAgIFZUUk4gICAgZGYyLGRmMworICAgICAgICBWVFJOICAgIHFmMDEscWYyMyAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRnMCxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAorICAgICAgICBWU1VCICAgICAgICBkZzEsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKKyAgICAgICAgVkhBREQgICAgICAgZGYxUlMsZGYxLGRaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFZIQUREICAgICAgIGRmM1JTLGRmMyxkWmVybworICAgICAgICBWU1VCICAgICAgICBkZzIsZGYxUlMsZGYzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAorICAgICAgICBWQUREICAgICAgICBkZzMsZGYxLGRmM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKKyAgICAgICAgVkFERCAgICAgICAgZGgwLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKKyAgICAgICAgVkFERCAgICAgICAgZGgxLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGgyLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGgzLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKKyAgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gQ2FsY3VsYXRlIGZpbmFsIHZhbHVlIChjb2xPcFtpXVtqXSArIDMyKT4+NgorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZSU0hSICAgICAgIGRoMCwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDEsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgyLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMywjNgorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICBCICAgICAgIE91dERDY2FzZSAKKyAgICAgICAgCisKK0RDY2FzZQorICAgICAgICA7Ly8gQ2FsY3VsYXRlIHRoZSBUcmFuc2Zvcm1lZCBEQ3ZhbHVlIDogKERDdmFsKzMyKT4+NgorICAgICAgICBMRFJTSCAgIERDdmFsLFtwRENUZW1wXSAKKyAgICAgICAgQUREICAgICBEQ3ZhbCxEQ3ZhbCwjMzIgCisgICAgICAgIEFTUiAgICAgREN2YWwsREN2YWwsIzYKKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgZERlbHRhUm93MCwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbMF0gID0gcERlbHRhWzFdICA9IHBEZWx0YVsyXSAgPSBwRGVsdGFbM10gPSBEQ3ZhbAorICAgICAgICBWRFVQICAgIGREZWx0YVJvdzEsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs0XSAgPSBwRGVsdGFbNV0gID0gcERlbHRhWzZdICA9IHBEZWx0YVs3XSA9IERDdmFsCisgICAgICAgIFZEVVAgICAgZERlbHRhUm93MiwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzhdICA9IHBEZWx0YVs5XSAgPSBwRGVsdGFbMTBdID0gcERlbHRhWzExXSA9IERDdmFsCisgICAgICAgIFZEVVAgICAgZERlbHRhUm93MywgREN2YWwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorT3V0RENjYXNlICAgICAgCisgICAgICAgIE1fTERSICAgcHJlZHN0ZXAscHJlZFN0ZXBPblN0YWNrCisgICAgICAgIE1fTERSICAgZHN0U3RlcCxkc3RTdGVwT25TdGFjaworICAgICAgICAKKyAgICAgICAgTERSICAgICBQcmVkVmFsMSxbcFByZWRUZW1wXSxwcmVkc3RlcAorICAgICAgICBMRFIgICAgIFByZWRWYWwyLFtwUHJlZFRlbXBdLHByZWRzdGVwCisgICAgICAgIFZNT1YgICAgZFByZWRWYWxSb3cwMSxQcmVkVmFsMSxQcmVkVmFsMgorICAgICAgICAKKyAgICAgICAgTERSICAgICBQcmVkVmFsMSxbcFByZWRUZW1wXSxwcmVkc3RlcAorICAgICAgICBMRFIgICAgIFByZWRWYWwyLFtwUHJlZFRlbXBdCisgICAgICAgIFZNT1YgICAgZFByZWRWYWxSb3cyMyxQcmVkVmFsMSxQcmVkVmFsMgorIAorICAgICAgICAKKyAgICAgICAgVkFERFcgICBxU3VtUm93MDEscURlbHRhUm93MDEsZFByZWRWYWxSb3cwMQorICAgICAgICBWQUREVyAgIHFTdW1Sb3cyMyxxRGVsdGFSb3cyMyxkUHJlZFZhbFJvdzIzCisgICAgICAgIFZRTU9WVU4gZERzdFJvdzAxLHFTdW1Sb3cwMQorICAgICAgICBWUU1PVlVOIGREc3RSb3cyMyxxU3VtUm93MjMKKyAgICAgICAgCisgCisgICAgICAgIFZTVDEgICAgZERzdFJvdzAsW3BEc3RUZW1wXSxkc3RTdGVwCisgICAgICAgIFZTVDEgICAgZERzdFJvdzEsW3BEc3RUZW1wXSxkc3RTdGVwCisgICAgICAgIFZTVDEgICAgZERzdFJvdzIsW3BEc3RUZW1wXSxkc3RTdGVwCisgICAgICAgIFZTVDEgICAgZERzdFJvdzMsW3BEc3RUZW1wXQorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCitFbmQgICAgICAgICAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9DT1JURVhBOCAgIAorICAgIAorICAgICAgICAgCisgICAgICAgICAgICAKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDYxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCkBAIC0wLDAgKzEsMjAyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSUYgQ29ydGV4QTgKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgICAgICAKK0xPT1BfQ09VTlQgIEVRVSAweDQwMDAwMDAwCitNQVNLXzMgICAgICBFUVUgMHgwMzAzMDMwMworTUFTS180ICAgICAgRVFVIDB4MDQwNDA0MDQKKworOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMzIxMCAgICAgIFJOIDYKKworOy8vIExvb3AgCisKK1hZICAgICAgICAgIFJOIDcKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKK2RCZXRhICAgICAgIEROIEQyLlU4CisKK2RGaWx0ICAgICAgIEROIEQxNi5VOAorZEFxZmxnICAgICAgRE4gRDEyLlU4CitkQXBmbGcgICAgICBETiBEMTcuVTggCisKK2RBcDBxMCAgICAgIEROIEQxMy5VOAorZEFwMXAwICAgICAgRE4gRDEyLlU4CitkQXExcTAgICAgICBETiBEMTguVTgKK2RBcDJwMCAgICAgIEROIEQxOS5VOAorZEFxMnEwICAgICAgRE4gRDE3LlU4CisKK3FCUzMyMTAgICAgIFFOIFExMy5VMTYKK2RCUzMyMTAgICAgIEROIEQyNgorZE1hc2tfYnMgICAgRE4gRDI3CitkRmlsdF9icyAgICBETiBEMjYuVTE2CisKKzsvLyBiU0xUNAorZE1hc2tfMCAgICAgRE4gRDE0LlU4CitkTWFza18xICAgICBETiBEMTUuVTggICAgCitkTWFza180ICAgICBETiBEMS5VMTYKKworTWFza180ICAgICAgUk4gOAorTWFza18zICAgICAgUk4gOQorCitkVGVtcCAgICAgICBETiBEMTkuVTgKKworOy8vIFJlc3VsdAorZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgCitkUV8wdCAgICAgICBETiBEMzEuVTggICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUV8wbiAgICAgICBETiBEMjQuVTgKKworICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIHI5LCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gZDAtZEFscGhhXzAKKyAgICAgICAgOy8vIGQyLWRCZXRhXzAKKworICAgICAgICA7bG9hZCBhbHBoYTEsYmV0YTEgc29tZXdoZXJlIHRvIGF2b2lkIG1vcmUgbG9hZHMKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0hCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMSA7PworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXSEgCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKKyAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKKworICAgICAgICBMRFIgICAgICAgICBNYXNrXzMsID1NQVNLXzMKKyAgICAgICAgTERSICAgICAgICAgTWFza180LCA9TUFTS180CisKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzQsICM0ICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFhZLCA9TE9PUF9DT1VOVAorCisgICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3CisgICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQorTG9vcFkgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBiUzMyMTAsIFtwQlNdLCAjOAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIDsxCisgICAgICAgIFZMRDEgICAgICAgIGRQXzEsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBDTVAgICAgICAgICBiUzMyMTAsICMwCisgICAgICAgIFZMRDEgICAgICAgIGRQXzAsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICA7MQorICAgICAgICBWTEQxICAgICAgICBkUV8wLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCisgICAgICAgIFZMRDEgICAgICAgIGRRXzEsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRQXzAsIGRRXzAKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCisKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8xLCBkUF8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAorCisgICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAorICAgICAgICBWTU9WLlUzMiAgICBkQlMzMjEwWzBdLCBiUzMyMTAKKyAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAorICAgICAgICBWTU9WTCAgICAgICBxQlMzMjEwLCBkQlMzMjEwLlU4CisgICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAorICAgICAgICBWQ0dUICAgICAgICBkTWFza19icy5TMTYsIGRCUzMyMTAuUzE2LCAjMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMCAKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCisgICAgICAgIAorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZE1hc2tfYnMuVTgKKworICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfMworCisgICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAorCisgICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKKyAgICAgICAgCisgICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCisgICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza180ICAgICAgICAKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgVlRTVCAgICAgICAgZEZpbHRfYnMsIGRGaWx0X2JzLCBkTWFza180CisKKyAgICAgICAgOy8vIGJTID09IDQgRmlsdGVyaW5nCisgICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkJJVCAgICAgICAgZFBfMG4sIGRQXzB0LCBkRmlsdF9icworICAgICAgICBWQklUICAgICAgICBkUV8wbiwgZFFfMHQsIGRGaWx0X2JzCisgICAgICAgIAorICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQgICAgICAKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0ICAKKworICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKworICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKworICAgICAgICBNX0VYSVQKKyAgICAgICAgCitOb0ZpbHRlckJTMAorCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGCisgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU2YzFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpAQCAtMCwwICsxLDI4MiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgICBJRiBDb3J0ZXhBOAorCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisgICAgICAgIAorTE9PUF9DT1VOVCAgRVFVIDB4NDAwMDAwMDAKK01BU0tfMyAgICAgIEVRVSAweDAzMDMwMzAzCitNQVNLXzQgICAgICBFUVUgMHgwNDA0MDQwNAorCis7Ly8gRnVuY3Rpb24gYXJndW1lbnRzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYSAgICAgIFJOIDIKK3BCZXRhICAgICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNQorcEJTICAgICAgICAgUk4gNAorYlMzMjEwICAgICAgUk4gNgorcFNyY0RzdF9QICAgUk4gMTAKK3BTcmNEc3RfUSAgIFJOIDEyCisKK3BUbXAgICAgICAgIFJOIDEwCitwVG1wMiAgICAgICBSTiAxMgorc3RlcCAgICAgICAgUk4gMTQKKworOy8vIExvb3AgCisKK1hZICAgICAgICAgIFJOIDcKKworOy8vIFJvd3MgaW5wdXQKK2RSb3cwICAgICAgIEROIEQ3LlU4CitkUm93MSAgICAgICBETiBEOC5VOCAgCitkUm93MiAgICAgICBETiBENS5VOCAgCitkUm93MyAgICAgICBETiBEMTAuVTggIAorZFJvdzQgICAgICAgRE4gRDYuVTggIAorZFJvdzUgICAgICAgRE4gRDkuVTggIAorZFJvdzYgICAgICAgRE4gRDQuVTggCitkUm93NyAgICAgICBETiBEMTEuVTggCisKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKK2RCZXRhICAgICAgIEROIEQyLlU4CisKK2RGaWx0ICAgICAgIEROIEQxNi5VOAorZEFxZmxnICAgICAgRE4gRDEyLlU4CitkQXBmbGcgICAgICBETiBEMTcuVTggCisKK2RBcDBxMCAgICAgIEROIEQxMy5VOAorZEFwMXAwICAgICAgRE4gRDEyLlU4CitkQXExcTAgICAgICBETiBEMTguVTgKK2RBcDJwMCAgICAgIEROIEQxOS5VOAorZEFxMnEwICAgICAgRE4gRDE3LlU4CisKK3FCUzMyMTAgICAgIFFOIFExMy5VMTYKK2RCUzMyMTAgICAgIEROIEQyNgorZE1hc2tfYnMgICAgRE4gRDI3CitkRmlsdF9icyAgICBETiBEMjYuVTE2CisKKzsvLyBiU0xUNAorZE1hc2tfMCAgICAgRE4gRDE0LlU4CitkTWFza18xICAgICBETiBEMTUuVTggICAgCitkTWFza180ICAgICBETiBEMS5VMTYKKworTWFza180ICAgICAgUk4gOAorTWFza18zICAgICAgUk4gOQorCitkVGVtcCAgICAgICBETiBEMTkuVTgKKworOy8vIFJlc3VsdAorZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgCitkUV8wdCAgICAgICBETiBEMzEuVTggICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUV8wbiAgICAgICBETiBEMjQuVTgKKworICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIHIxMiwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0CisgICAgICAgIE1fQVJHICAgcHBCUywgNAorICAgICAgICAKKyAgICAgICAgOy8vIGQwLWRBbHBoYV8wCisgICAgICAgIDsvLyBkMi1kQmV0YV8wCisKKyAgICAgICAgO2xvYWQgYWxwaGExLGJldGExIHNvbWV3aGVyZSB0byBhdm9pZCBtb3JlIGxvYWRzCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdIQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0hIAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCisKKyAgICAgICAgTERSICAgICAgICAgTWFza180LCA9TUFTS180CisgICAgICAgIExEUiAgICAgICAgIE1hc2tfMywgPU1BU0tfMworCisgICAgICAgIDtkTWFza18wLTE0CisgICAgICAgIDtkTWFza18xLTE1CisgICAgICAgIDtkTWFza180LTE5CisKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzQsICM0ICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFhZLCA9TE9PUF9DT1VOVAorCisgICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3CisgICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQorCisKK0xvb3BZICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgYlMzMjEwLCBbcEJTXSwgIzgKKyAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCisgICAgICAgIAorICAgICAgICA7MQorICAgICAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIDsxCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cxLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93MywgW3BUbXBdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c0LCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c3LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gZFJvdzAgPSBbcTNyMCBxMnIwIHExcjAgcTByMCBwMHIwIHAxcjAgcDJyMCBwM3IwXQorICAgICAgICA7Ly8gZFJvdzEgPSBbcTNyMSBxMnIxIHExcjEgcTByMSBwMHIxIHAxcjEgcDJyMSBwM3IxXQorICAgICAgICA7Ly8gZFJvdzIgPSBbcTNyMiBxMnIyIHExcjIgcTByMiBwMHIyIHAxcjIgcDJyMiBwM3IyXQorICAgICAgICA7Ly8gZFJvdzMgPSBbcTNyMyBxMnIzIHExcjMgcTByMyBwMHIzIHAxcjMgcDJyMyBwM3IzXQorICAgICAgICA7Ly8gZFJvdzQgPSBbcTNyNCBxMnI0IHExcjQgcTByNCBwMHI0IHAxcjQgcDJyNCBwM3I0XQorICAgICAgICA7Ly8gZFJvdzUgPSBbcTNyNSBxMnI1IHExcjUgcTByNSBwMHI1IHAxcjUgcDJyNSBwM3I1XQorICAgICAgICA7Ly8gZFJvdzYgPSBbcTNyNiBxMnI2IHExcjYgcTByNiBwMHI2IHAxcjYgcDJyNiBwM3I2XQorICAgICAgICA7Ly8gZFJvdzcgPSBbcTNyNyBxMnI3IHExcjcgcTByNyBwMHI3IHAxcjcgcDJyNyBwM3I3XQorCisgICAgICAgIDsvLyA4eDggVHJhbnNwb3NlCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3cwLCBkUm93MQorICAgICAgICBWWklQLjggICAgICBkUm93MiwgZFJvdzMKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzQsIGRSb3c1CisgICAgICAgIFZaSVAuOCAgICAgIGRSb3c2LCBkUm93NworCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3cwLCBkUm93MgorICAgICAgICBWWklQLjE2ICAgICBkUm93MSwgZFJvdzMKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzQsIGRSb3c2CisgICAgICAgIFZaSVAuMTYgICAgIGRSb3c1LCBkUm93NworCisgICAgICAgIFZaSVAuMzIgICAgIGRSb3cwLCBkUm93NAorICAgICAgICBWWklQLjMyICAgICBkUm93MiwgZFJvdzYKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzMsIGRSb3c3CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3cxLCBkUm93NQorCisKKyAgICAgICAgO1JlYWxpZ24gdGhlIHBvaW50ZXJzCisKKyAgICAgICAgQ01QICAgICAgICAgYlMzMjEwLCAjMAorICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUF8wLCBkUV8wCisgICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCisKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8xLCBkUF8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAorCisgICAgICAgIFZNT1YuVTMyICAgIGRCUzMyMTBbMF0sIGJTMzIxMAorICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKKyAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAorICAgICAgICBWTU9WTCAgICAgICBxQlMzMjEwLCBkQlMzMjEwLlU4CisgICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAorICAgICAgICBWQ0dUICAgICAgICBkTWFza19icy5TMTYsIGRCUzMyMTAuUzE2LCAjMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMAorICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRNYXNrX2JzLlU4CisKKyAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzMKKworICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKKworICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCisKKyAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKKyAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisKKyAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzQgICAgICAgIAorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBWVFNUICAgICAgICBkRmlsdF9icywgZEZpbHRfYnMsIGRNYXNrXzQKKworICAgICAgICA7Ly8gYlMgPT0gNCBGaWx0ZXJpbmcKKyAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisKKyAgICAgICAgVkJJVCAgICAgICAgZFBfMG4sIGRQXzB0LCBkRmlsdF9icworICAgICAgICBWQklUICAgICAgICBkUV8wbiwgZFFfMHQsIGRGaWx0X2JzCisKKyAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3RfUCwgcFNyY0RzdCwgIzMKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0ICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwVG1wMiwgcFNyY0RzdF9QLCBzcmNkc3RTdGVwCisgICAgICAgIEFERCAgICAgICAgIHN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0ICAKKworICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMF19LCBbcFNyY0RzdF9QXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMV19LCBbcFRtcDJdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wblsyXX0sIFtwU3JjRHN0X1BdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wblszXX0sIFtwVG1wMl0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzRdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzVdfSwgW3BUbXAyXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bNl19LCBbcFNyY0RzdF9QXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bN119LCBbcFRtcDJdLCBzdGVwCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0X1EsIHBTcmNEc3QsICM0CisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3RfUSwgc3JjZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzBdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzFdfSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wblsyXX0sIFtwU3JjRHN0X1FdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wblszXX0sIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bNF19LCBbcFNyY0RzdF9RXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bNV19LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzZdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzddfSwgW3BUbXBdLCBzdGVwCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorCisgICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorTm9GaWx0ZXJCUzAKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAorCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRgorCisKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGMzZjRmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCkBAIC0wLDAgKzEsMjg4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisKKyAgICAgICAgSUYgQ29ydGV4QTgKKworTE9PUF9DT1VOVCAgRVFVIDB4NTUwMDAwMDAKKworCis7Ly8gRnVuY3Rpb24gYXJndW1lbnRzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYSAgICAgIFJOIDIKK3BCZXRhICAgICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNQorcEJTICAgICAgICAgUk4gNAorYlMxMCAgICAgICAgUk4gMTIKKworcEFscGhhXzAgICAgUk4gMgorcEJldGFfMCAgICAgUk4gMworCitwQWxwaGFfMSAgICBSTiA3CitwQmV0YV8xICAgICBSTiA4CisKKworCis7Ly8gTG9vcCAKKworWFkgICAgICAgICAgUk4gOQorCitwVG1wICAgICAgICBSTiA2CitzdGVwICAgICAgICBSTiAxMAorCis7Ly8gUGl4ZWxzCitkUF8wICAgICAgICBETiBENC5VOAorZFBfMSAgICAgICAgRE4gRDUuVTggIAorZFBfMiAgICAgICAgRE4gRDYuVTggIAorZFBfMyAgICAgICAgRE4gRDcuVTggIAorZFFfMCAgICAgICAgRE4gRDguVTggIAorZFFfMSAgICAgICAgRE4gRDkuVTggIAorZFFfMiAgICAgICAgRE4gRDEwLlU4IAorZFFfMyAgICAgICAgRE4gRDExLlU4IAorCisKKzsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KK2RBbHBoYSAgICAgIEROIEQwLlU4CitkQmV0YSAgICAgICBETiBEMi5VOAorCitkRmlsdCAgICAgICBETiBEMTYuVTgKK2RBcWZsZyAgICAgIEROIEQxMi5VOAorZEFwZmxnICAgICAgRE4gRDE3LlU4IAorCitkQXAwcTAgICAgICBETiBEMTMuVTgKK2RBcDFwMCAgICAgIEROIEQxMi5VOAorZEFxMXEwICAgICAgRE4gRDE4LlU4CitkQXAycDAgICAgICBETiBEMTkuVTgKK2RBcTJxMCAgICAgIEROIEQxNy5VOAorCis7Ly8gYlNMVDQKK2RUQzAgICAgICAgIEROIEQxOC5VOCAgIAorZFRDMSAgICAgICAgRE4gRDE5LlU4ICAgCitkVEMwMSAgICAgICBETiBEMTguVTggICAKKworZFRDcyAgICAgICAgRE4gRDMxLlM4CitkVEMgICAgICAgICBETiBEMzEuVTgKKworZE1hc2tfMCAgICAgRE4gRDE0LlU4CitkTWFza18xICAgICBETiBEMTUuVTggICAgCisKK01hc2tfMCAgICAgIFJOIDExCisKK2RUZW1wICAgICAgIEROIEQxOS5VOAorCis7Ly8gQ29tcHV0aW5nIFAwLFEwCitxRHEwcDAgICAgICBRTiBRMTAuUzE2CitxRHAxcTEgICAgICBRTiBRMTEuUzE2CitxRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAorZERlbHRhICAgICAgRE4gRDIwLlM4CisKKworOy8vIENvbXB1dGluZyBQMSxRMQorZFJwMHEwICAgICAgRE4gRDI0LlU4CisKK2RNYXhQICAgICAgIEROIEQyMy5VOAorZE1pblAgICAgICAgRE4gRDIyLlU4CisKK2RNYXhRICAgICAgIEROIEQxOS5VOAorZE1pblEgICAgICAgRE4gRDIxLlU4CisKK2REZWx0YVAgICAgIEROIEQyNi5VOAorZERlbHRhUSAgICAgRE4gRDI3LlU4CisKK3FQXzBuICAgICAgIFFOIFExNC5TMTYKK3FRXzBuICAgICAgIFFOIFExMi5TMTYKKworZFFfMG4gICAgICAgRE4gRDI0LlU4CitkUV8xbiAgICAgICBETiBEMjUuVTgKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CisKKzsvLyBiU0dFNAorCitxU3AwcTAgICAgICBRTiBRMTAuVTE2CisKK3FTcDJxMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHAxICAgIFFOIFExMi5VMTYKK3FTcDNwMiAgICAgIFFOIFExMy5VMTYKK2RIU3AwcTEgICAgIEROIEQyOC5VOAorCitxU3EycDEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBxMSAgICBRTiBRMTIuVTE2CitxU3EzcTIgICAgICBRTiBRMTMuVTE2ICA7ISEKK2RIU3EwcDEgICAgIEROIEQyOC5VOCAgIDshIQorCitxVGVtcDEgICAgICBRTiBRMTEuVTE2ICA7ISE7cVNwMnExIAorcVRlbXAyICAgICAgUU4gUTEyLlUxNiAgOyEhO3FTcDBxMHAxICAgICAgICAKKworZFBfMHQgICAgICAgRE4gRDI4LlU4ICAgOyEhO2RIU3AwcTEgICAgICAgIAorZFFfMHQgICAgICAgRE4gRDIyLlU4ICAgOyEhO1RlbXAxICAgICAgICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKK2RQXzJuICAgICAgIEROIEQzMS5VOAorCitkUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgcjExLCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gZDAtZEFscGhhXzAKKyAgICAgICAgOy8vIGQyLWRCZXRhXzAKKworICAgICAgICBBREQgICAgICAgICBwQWxwaGFfMSwgcEFscGhhXzAsICMxCisgICAgICAgIEFERCAgICAgICAgIHBCZXRhXzEsIHBCZXRhXzAsICMxCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXSAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAorCisgICAgICAgIE1PViAgICAgICAgIE1hc2tfMCwjMAorCisgICAgICAgIDtkTWFza18wLTE0CisgICAgICAgIDtkTWFza18xLTE1CisKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCisKKyAgICAgICAgTERSICAgICAgICAgWFksPUxPT1BfQ09VTlQKKworICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNworICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKK0xvb3BZICAgICAgICAKK0xvb3BYICAgICAgICAKKyAgICAgICAgTERSSCAgICAgICAgYlMxMCwgW3BCU10sICMyCisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgQ01QICAgICAgICAgYlMxMCwgIzAKKyAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKKworICAgICAgICBWTEQxICAgICAgICBkUF8zLCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMiwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRQXzEsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUF8wLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMCwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMCwgZFBfMQorICAgICAgICBWTEQxICAgICAgICBkUV8xLCBbcFRtcF0KKyAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUV8wLCBkUF8wCisgICAgICAgIFZMRDEgICAgICAgIGRRXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAorICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKKworICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZgorICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCisgICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAorCisgICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzBdLCBNYXNrXzAKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYwMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAorICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKKworICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFsxXSwgTWFza18wCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCisgICAgICAgIFZMRDEgICAgICAgIGRRXzMsIFtwU3JjRHN0XQorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAorICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjNCAKKworICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCisgICAgCisgICAgICAgIEJORSAgICAgICAgIGJTR0U0ICAgICAgICAKK2JTTFQ0CisgICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwCisKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQorICAgICAgICBWU1QxICAgICAgICBkUF8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgU1VCICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWU1QxICAgICAgICBkUV8xbiwgW3BTcmNEc3RdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBUbXAsICM4CisKKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKKworTm9GaWx0ZXJCUzAKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzgKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCitiU0dFNCAgICAgICAgCisgICAgICAgIDsvLyBiUyA+PSA0IEZpbHRlcmluZworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKworICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMm4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUF8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgU1VCICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksWFksWFkKKyAgICAgICAgVlNUMSAgICAgICAgZFFfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCisgICAgICAgIFZTVDEgICAgICAgIGRRXzJuLCBbcFNyY0RzdF0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBUbXAsICM4CisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisKK0V4aXRMb29wWSAgICAgICAgCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzE2CisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyIAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQorICAgICAgICBCTkUgICAgICAgICBMb29wWQorCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGCisgICAgCisKKyAgICAgICAgCisKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTZmYmIzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCkBAIC0wLDAgKzEsNDM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgICAgIAorICAgICAgICBJRiBDb3J0ZXhBOAorCitMT09QX0NPVU5UICBFUVUgMHgxMTAwMDAwMAorCisKKzsvLyBGdW5jdGlvbiBhcmd1bWVudHMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhICAgICAgUk4gMgorcEJldGEgICAgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiA1CitwQlMgICAgICAgICBSTiA0CitiUzEwICAgICAgICBSTiAxMgorCitwQWxwaGFfMCAgICBSTiAyCitwQmV0YV8wICAgICBSTiAzCisKK3BBbHBoYV8xICAgIFJOIDcKK3BCZXRhXzEgICAgIFJOIDgKKworcFRtcCAgICAgICAgUk4gMTAKK3BUbXBTdGVwICAgIFJOIDExCisKKzsvLyBMb29wIAorCitYWSAgICAgICAgICBSTiA5CisKKzsvLyBSb3dzIGlucHV0CitkUm93MCAgICAgICBETiBENy5VOAorZFJvdzEgICAgICAgRE4gRDguVTggIAorZFJvdzIgICAgICAgRE4gRDUuVTggIAorZFJvdzMgICAgICAgRE4gRDEwLlU4ICAKK2RSb3c0ICAgICAgIEROIEQ2LlU4ICAKK2RSb3c1ICAgICAgIEROIEQ5LlU4ICAKK2RSb3c2ICAgICAgIEROIEQ0LlU4IAorZFJvdzcgICAgICAgRE4gRDExLlU4IAorCis7Ly8gZFJvdzAgLSBkUF8zLCBkUm93MSAtIGRRXzAsIGRSb3cyIC0gZFBfMSwgZFJvdzMgLSBkUV8yCis7Ly8gZFJvdzQgLSBkUF8yLCBkUm93NSAtIGRRXzEsIGRSb3c2IC0gZFBfMCwgZFJvdzcgLSBkUV8zCisKKzsvLyBSb3dzIG91dHB1dAorZFJvd24wICAgICAgRE4gRDcuVTgKK2RSb3duMSAgICAgIEROIEQyNC5VOAorZFJvd24yICAgICAgRE4gRDMwLlU4CitkUm93bjMgICAgICBETiBEMTAuVTgKK2RSb3duNCAgICAgIEROIEQ2LlU4CitkUm93bjUgICAgICBETiBEMjUuVTgKK2RSb3duNiAgICAgIEROIEQyOS5VOAorZFJvd243ICAgICAgRE4gRDExLlU4CisKKzsvLyBkUF8wbiAgICAgICBETiBEMjkuVTgKKzsvLyBkUF8xbiAgICAgICBETiBEMzAuVTgKKzsvLyBkUF8ybiAgICAgICBETiBEMzEuVTgKKzsvLyAKKzsvLyBkUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAorOy8vIGRRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCis7Ly8gZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKKzsvLyAKKzsvLyBkUm93bjAgLSBkUF8zLCAgZFJvd24xIC0gZFFfMG4KKzsvLyBkUm93bjIgLSBkUF8xbiwgZFJvd24zIC0gZFFfMgorOy8vIGRSb3duNCAtIGRQXzIsICBkUm93bjUgLSBkUV8xbgorOy8vIGRSb3duNiAtIGRQXzBuLCBkUm93bjcgLSBkUV8zCisKK2RSb3cwbiAgICAgIEROIEQ3LlU4CitkUm93MW4gICAgICBETiBEMjQuVTgKK2RSb3cybiAgICAgIEROIEQzMC5VOAorZFJvdzNuICAgICAgRE4gRDI4LlU4CitkUm93NG4gICAgICBETiBEMzEuVTgKK2RSb3c1biAgICAgIEROIEQyNS5VOAorZFJvdzZuICAgICAgRE4gRDI5LlU4CitkUm93N24gICAgICBETiBEMTEuVTgKKworOy8vIGRSb3cwbiAtIGRQXzMsIGRSb3cxbiAtIGRRXzBuLCBkUm93Mm4gLSBkUF8xbiwgZFJvdzNuIC0gZFFfMm4KKzsvLyBkUm93NG4gLSBkUF8yLCBkUm93NW4gLSBkUV8xbiwgZFJvdzZuIC0gZFBfMG4sIGRSb3c3biAtIGRRXzMKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RQXzMgICAgICAgIEROIEQ3LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKK2RRXzMgICAgICAgIEROIEQxMS5VOCAKKworCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorZEJldGEgICAgICAgRE4gRDIuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CitkQXAxcDAgICAgICBETiBEMTIuVTgKK2RBcTFxMCAgICAgIEROIEQxOC5VOAorZEFwMnAwICAgICAgRE4gRDE5LlU4CitkQXEycTAgICAgICBETiBEMTcuVTgKKworOy8vIGJTTFQ0CitkVEMwICAgICAgICBETiBEMTguVTggICAKK2RUQzEgICAgICAgIEROIEQxOS5VOCAgIAorZFRDMDEgICAgICAgRE4gRDE4LlU4ICAgCisKK2RUQ3MgICAgICAgIEROIEQzMS5TOAorZFRDICAgICAgICAgRE4gRDMxLlU4CisKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorCitNYXNrXzAgICAgICBSTiA2CisKK2RUZW1wICAgICAgIEROIEQxOS5VOAorCis7Ly8gQ29tcHV0aW5nIFAwLFEwCitxRHEwcDAgICAgICBRTiBRMTAuUzE2CitxRHAxcTEgICAgICBRTiBRMTEuUzE2CitxRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAorZERlbHRhICAgICAgRE4gRDIwLlM4CisKKworOy8vIENvbXB1dGluZyBQMSxRMQorZFJwMHEwICAgICAgRE4gRDI0LlU4CisKK2RNYXhQICAgICAgIEROIEQyMy5VOAorZE1pblAgICAgICAgRE4gRDIyLlU4CisKK2RNYXhRICAgICAgIEROIEQxOS5VOAorZE1pblEgICAgICAgRE4gRDIxLlU4CisKK2REZWx0YVAgICAgIEROIEQyNi5VOAorZERlbHRhUSAgICAgRE4gRDI3LlU4CisKK3FQXzBuICAgICAgIFFOIFExNC5TMTYKK3FRXzBuICAgICAgIFFOIFExMi5TMTYKKworZFFfMG4gICAgICAgRE4gRDI0LlU4CitkUV8xbiAgICAgICBETiBEMjUuVTgKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CisKKzsvLyBiU0dFNAorCitxU3AwcTAgICAgICBRTiBRMTAuVTE2CisKK3FTcDJxMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHAxICAgIFFOIFExMi5VMTYKK3FTcDNwMiAgICAgIFFOIFExMy5VMTYKK2RIU3AwcTEgICAgIEROIEQyOC5VOAorCitxU3EycDEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBxMSAgICBRTiBRMTIuVTE2CitxU3EzcTIgICAgICBRTiBRMTMuVTE2ICA7ISEKK2RIU3EwcDEgICAgIEROIEQyOC5VOCAgIDshIQorCitxVGVtcDEgICAgICBRTiBRMTEuVTE2ICA7ISE7cVNwMnExIAorcVRlbXAyICAgICAgUU4gUTEyLlUxNiAgOyEhO3FTcDBxMHAxICAgICAgICAKKworZFBfMHQgICAgICAgRE4gRDI4LlU4ICAgOyEhO2RIU3AwcTEgICAgICAgIAorZFFfMHQgICAgICAgRE4gRDIyLlU4ICAgOyEhO1RlbXAxICAgICAgICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKK2RQXzJuICAgICAgIEROIEQzMS5VOAorCitkUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgcjExLCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gZDAtZEFscGhhXzAKKyAgICAgICAgOy8vIGQyLWRCZXRhXzAKKworICAgICAgICBBREQgICAgICAgICBwQWxwaGFfMSwgcEFscGhhXzAsICMxCisgICAgICAgIEFERCAgICAgICAgIHBCZXRhXzEsIHBCZXRhXzAsICMxCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzBdIAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCisKKyAgICAgICAgTU9WICAgICAgICAgTWFza18wLCMwCisKKyAgICAgICAgO2RNYXNrXzAtMTQKKyAgICAgICAgO2RNYXNrXzEtMTUKKworICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKKworICAgICAgICBMRFIgICAgICAgICBYWSw9TE9PUF9DT1VOVAorICAgIAorICAgICAgICBBREQgICAgICAgICBwVG1wU3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAorCisgICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3CisgICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQorTG9vcFkgICAgICAgIAorTG9vcFggICAgICAgIAorICAgICAgICBMRFJIICAgICAgICBiUzEwLCBbcEJTXSwgIzQKKworICAgICAgICBDTVAgICAgICAgICBiUzEwLCAjMAorICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAorCisgICAgICAgIDsvLyBMb2FkIDggcm93cyBvZiBkYXRhCisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzAsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzEsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzAsIGRSb3cxCisgICAgICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c0LCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3cyLCBkUm93MworICAgICAgICBWTEQxICAgICAgICBkUm93NSwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NywgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWWklQLjggICAgICBkUm93NCwgZFJvdzUKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzEsIGRSb3czCisgICAgCisKKyAgICAgICAgOy8vIGRSb3cwID0gW3EzcjAgcTJyMCBxMXIwIHEwcjAgcDByMCBwMXIwIHAycjAgcDNyMF0KKyAgICAgICAgOy8vIGRSb3cxID0gW3EzcjEgcTJyMSBxMXIxIHEwcjEgcDByMSBwMXIxIHAycjEgcDNyMV0KKyAgICAgICAgOy8vIGRSb3cyID0gW3EzcjIgcTJyMiBxMXIyIHEwcjIgcDByMiBwMXIyIHAycjIgcDNyMl0KKyAgICAgICAgOy8vIGRSb3czID0gW3EzcjMgcTJyMyBxMXIzIHEwcjMgcDByMyBwMXIzIHAycjMgcDNyM10KKyAgICAgICAgOy8vIGRSb3c0ID0gW3EzcjQgcTJyNCBxMXI0IHEwcjQgcDByNCBwMXI0IHAycjQgcDNyNF0KKyAgICAgICAgOy8vIGRSb3c1ID0gW3EzcjUgcTJyNSBxMXI1IHEwcjUgcDByNSBwMXI1IHAycjUgcDNyNV0KKyAgICAgICAgOy8vIGRSb3c2ID0gW3EzcjYgcTJyNiBxMXI2IHEwcjYgcDByNiBwMXI2IHAycjYgcDNyNl0KKyAgICAgICAgOy8vIGRSb3c3ID0gW3EzcjcgcTJyNyBxMXI3IHEwcjcgcDByNyBwMXI3IHAycjcgcDNyN10KKworICAgICAgICA7Ly8gOHg4IFRyYW5zcG9zZQorCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3c2LCBkUm93NworCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBWWklQLjE2ICAgICBkUm93MCwgZFJvdzIKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzUsIGRSb3c3CisgICAgICAgIAorCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3c0LCBkUm93NgorICAgICAgICBWWklQLjMyICAgICBkUm93MSwgZFJvdzUKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzIsIGRSb3c2CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3czLCBkUm93NworICAgICAgICBWWklQLjMyICAgICBkUm93MCwgZFJvdzQKKyAgICAgICAgCisKKyAgICAgICAgOy8vIGRSb3cwIC0gZFBfMywgZFJvdzEgLSBkUV8wLCBkUm93MiAtIGRQXzEsIGRSb3czIC0gZFFfMgorICAgICAgICA7Ly8gZFJvdzQgLSBkUF8yLCBkUm93NSAtIGRRXzEsIGRSb3c2IC0gZFBfMCwgZFJvdzcgLSBkUV8zCisKKyAgICAgICAgOy8vIGRRXzAgPSBbcTByNyBxMHI2IHEwcjUgcTByNCBxMHIzIHEwcjIgcTByMSBxMHIwXQorICAgICAgICA7Ly8gZFFfMSA9IFtxMXI3IHExcjYgcTFyNSBxMXI0IHExcjMgcTFyMiBxMXIxIHExcjBdCisgICAgICAgIDsvLyBkUV8yID0gW3EycjcgcTJyNiBxMnI1IHEycjQgcTJyMyBxMnIyIHEycjEgcTJyMF0KKyAgICAgICAgOy8vIGRRXzMgPSBbcTNyNyBxM3I2IHEzcjUgcTNyNCBxM3IzIHEzcjIgcTNyMSBxM3IwXQorCisgICAgICAgIDsvLyBkUF8wID0gW3AwcjcgcDByNiBwMHI1IHAwcjQgcDByMyBwMHIyIHAwcjEgcDByMF0KKyAgICAgICAgOy8vIGRQXzEgPSBbcDFyNyBwMXI2IHAxcjUgcDFyNCBwMXIzIHAxcjIgcDFyMSBwMXIwXQorICAgICAgICA7Ly8gZFBfMiA9IFtwMnI3IHAycjYgcDJyNSBwMnI0IHAycjMgcDJyMiBwMnIxIHAycjBdCisgICAgICAgIDsvLyBkUF8zID0gW3AzcjcgcDNyNiBwM3I1IHAzcjQgcDNyMyBwM3IyIHAzcjEgcDNyMF0KKworICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRQXzAsIGRRXzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8xLCBkUF8wCisKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAorICAgICAgICAKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYKKyAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCisKKyAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAorICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKKworICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFswXSwgTWFza18wCisgICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmMDAKKworICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwCisKKyAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMV0sIE1hc2tfMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAorICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjNCAKKworICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCisgICAgCisgICAgICAgIEJORSAgICAgICAgIGJTR0U0ICAgICAgICAKK2JTTFQ0CisgICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCisKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIDsvLyBUcmFuc3Bvc2UKKworICAgICAgICBWWklQLjggICAgICBkUF8zLCAgZFBfMiAgCisgICAgICAgIFZaSVAuOCAgICAgIGRQXzFuLCBkUF8wbgorICAgICAgICBWWklQLjggICAgICBkUV8wbiwgZFFfMW4KKyAgICAgICAgVlpJUC44ICAgICAgZFFfMiwgIGRRXzMKKworICAgICAgICAKKyAgICAgICAgVlpJUC4xNiAgICAgZFBfMywgIGRQXzFuCisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgVlpJUC4xNiAgICAgZFFfMG4sIGRRXzIKKyAgICAgICAgVlpJUC4xNiAgICAgZFFfMW4sIGRRXzMKKyAgICAgICAgVlpJUC4xNiAgICAgZFBfMiwgIGRQXzBuCisKKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMywgIGRRXzBuCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzFuLCBkUV8yCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzIsICBkUV8xbgorICAgICAgICBWWklQLjMyICAgICBkUF8wbiwgZFFfMworCisgICAgICAgIDsvLyBkUm93bjAgLSBkUF8zLCAgZFJvd24xIC0gZFFfMG4KKyAgICAgICAgOy8vIGRSb3duMiAtIGRQXzFuLCBkUm93bjMgLSBkUV8yCisgICAgICAgIDsvLyBkUm93bjQgLSBkUF8yLCAgZFJvd241IC0gZFFfMW4KKyAgICAgICAgOy8vIGRSb3duNiAtIGRQXzBuLCBkUm93bjcgLSBkUV8zCisKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd24wLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duMSwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93bjIsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd24zLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIDsxCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duNCwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93bjUsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWU1QxICAgICAgICBkUm93bjYsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgorICAgICAgICBWU1QxICAgICAgICBkUm93bjcsIFtwVG1wXSwgc3JjZHN0U3RlcAorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCisKKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKKworTm9GaWx0ZXJCUzAKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKK2JTR0U0ICAgICAgICAKKyAgICAgICAgOy8vIGJTID49IDQgRmlsdGVyaW5nCisgICAgICAgIAorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisKKyAgICAgICAgOy8vIFRyYW5zcG9zZQorCisgICAgICAgIFZaSVAuOCAgICAgIGRQXzMsICBkUF8ybiAgIAorICAgICAgICBWWklQLjggICAgICBkUF8xbiwgZFBfMG4KKyAgICAgICAgVlpJUC44ICAgICAgZFFfMG4sIGRRXzFuCisgICAgICAgIFZaSVAuOCAgICAgIGRRXzJuLCBkUV8zCisKKyAgICAgICAgVlpJUC4xNiAgICAgZFBfMywgIGRQXzFuCisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgVlpJUC4xNiAgICAgZFFfMG4sIGRRXzJuCisgICAgICAgIFZaSVAuMTYgICAgIGRRXzFuLCBkUV8zCisgICAgICAgIFZaSVAuMTYgICAgIGRQXzJuLCBkUF8wbgorCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzMsICBkUV8wbgorICAgICAgICBWWklQLjMyICAgICBkUF8xbiwgZFFfMm4KKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMm4sIGRRXzFuCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzBuLCBkUV8zCisKKyAgICAgICAgOy8vIGRSb3cwbiAtIGRQXzMsIGRSb3cxbiAtIGRRXzBuLCBkUm93Mm4gLSBkUF8xbiwgZFJvdzNuIC0gZFFfMm4KKyAgICAgICAgOy8vIGRSb3c0biAtIGRQXzIsIGRSb3c1biAtIGRRXzFuLCBkUm93Nm4gLSBkUF8wbiwgZFJvdzduIC0gZFFfMworICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzBuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3cxbiwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93Mm4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzNuLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3c0biwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93NW4sIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksWFksWFkKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzZuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzduLCBbcFRtcF0sIHBUbXBTdGVwCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KKworICAgICAgICBCQ0MgICAgICAgICBMb29wWAorCitFeGl0TG9vcFkgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwQlMsIHBCUywgIzE0CisgICAgICAgIFNVQiAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzE0CisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICMxNgorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMyAKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMF0KKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkKKworICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKworICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRgorICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2NlNDFiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgMS84IFBpeGVsIGludGVycG9sYXRpb24gZm9yIENocm9tYSBCbG9jaworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyYwlQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlcgorICogW2luXQlzcmNTdGVwIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKKyAqIFtpbl0JZHN0U3RlcCBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoLgorICogW2luXQlkeAkJRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQKKyAqCQkJCQkJaW4gMS84IHBpeGVsIHVuaXQ7dmFsaWQgaW4gdGhlIHJhbmdlIFswLDddCisgKiBbaW5dCWR5CQlGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQKKyAqCQkJCQkJaW4gMS84IHBpeGVsIHVuaXQ7dmFsaWQgaW4gdGhlIHJhbmdlIFswLDddCisgKiBbaW5dCXJvaQkJRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAorICogICAgICAgICAgICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKyAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKyAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuCisgKiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE9NWF9TdHNfQmFkQXJnRXJyOgorICoJcFNyYyBvciBwRHN0IGlzIE5VTEwuCisgKglzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LgorICoJZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLgorICoJcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuCisgKglzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAorICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCisgICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgZHgsCisgICAgIE9NWF9TMzIgZHksCisgICAgIE9NWFNpemUgcm9pCisgKQoreworICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSAKKyAgICAgICAgKChPTVhfVTgqKXBTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXAsIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgZHgsIGR5KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDJlYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKQEAgLTAsMCArMSw1NTMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorOy8vCis7Ly8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hIGluIHY2IGFzc2VtYmx5LgorOy8vIFBlcmZvcm1zIHF1YXJ0ZXIgcGVsIGludGVycG9sYXRpb24gb2YgaW50ZXIgbHVtYSBNQi4KKzsvLyBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCis7Ly8gUGFyYW1ldGVyczoKKzsvLyBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCis7Ly8gW2luXSAgICBzcmNTdGVwICAgICBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCis7Ly8gW2luXSAgICBkc3RTdGVwICAgICBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoCis7Ly8gW2luXSAgICBkeCAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIGR5ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIHJvaSAgICAgICAgIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuCis7Ly8gW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vCis7Ly8gUmV0dXJuIFZhbHVlOgorOy8vIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KKzsvLyBJdCBpcyBhc3N1ZWQgdGhhdCBmb2xsb3dpbmcgY2FzZXMgYXJlIHNhdGlzZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgorOy8vICBwU3JjIG9yIHBEc3QgaXMgbm90IE5VTEwuCis7Ly8gIHNyY1N0ZXAgb3IgZHN0U3RlcCA+PSByb2kud2lkdGguCis7Ly8gICAgIGR4IG9yIGR5IGlzIGluIHRoZSByYW5nZSBbMC0zXS4KKzsvLyAgICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgbm90IG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgRHN0IGlzIDQgYnl0ZSBhbGlnbmVkLgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgcERzdCBpcyA4IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDE2LCBwRHN0IGlzIDE2IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgc3JjU3RlcCBhbmQgZHN0U3RlcCBpcyBtdWx0aXBsZSBvZiA4LgorOy8vCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgRVhQT1JUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCisgICAgICAgIAorCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICBFTkRJRgorICAgIAorICAgIAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCitpSGVpZ2h0ICAgICAgICAgUk4gNAoraVdpZHRoICAgICAgICAgIFJOIDUKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworaWR4ICAgICAgICAgICAgIFJOIDYKK2lkeSAgICAgICAgICAgICBSTiA3CitpbmRleCAgICAgICAgICAgUk4gNgorVGVtcCAgICAgICAgICAgIFJOIDEyCitwQXJncyAgICAgICAgICAgUk4gMTEKKworCisgICAgSUYgQ29ydGV4QTgKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEludGVycG9sYXRpb24gb2YgbHVtYSBpcyBpbXBsZW1lbnRlZCBieSBwcm9jZXNzaW5nIGJsb2NrIG9mIHBpeGVscywgc2l6ZSA0eDQgYXQgYSB0aW1lLgorICAgICAgICA7Ly8KKyAgICAgICAgTV9BTExPQzQgICAgcHBBcmdzLCAxNgorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCByMTEsIGQxNQorCitwU3JjQksgICAgICAgICAgUk4gOAorCis7Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycworZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgorZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgorCis7Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBIb3Jpem9udGFsIGludGVycG9sYXRpb24KK2RTcmMwYyAgICAgICAgICBETiAxNC5VOAorZFNyYzFjICAgICAgICAgIEROIDE2LlU4CitkU3JjMmMgICAgICAgICAgRE4gMTguVTgKK2RTcmMzYyAgICAgICAgICBETiAyMC5VOCAgICAgICAgICAgICAgICAgICAKK2RTcmMwZCAgICAgICAgICBETiAxNS5VOAorZFNyYzFkICAgICAgICAgIEROIDE3LlU4CitkU3JjMmQgICAgICAgICAgRE4gMTkuVTgKK2RTcmMzZCAgICAgICAgICBETiAyMS5VOAorZEFjY0gwICAgICAgICAgIEROIDIyLlU4CitkQWNjSDEgICAgICAgICAgRE4gMjQuVTgKK2RBY2NIMiAgICAgICAgICBETiAyNi5VOAorZEFjY0gzICAgICAgICAgIEROIDI4LlU4CitkUmVzdWx0SDAgICAgICAgRE4gMjIuVTMyCitkUmVzdWx0SDEgICAgICAgRE4gMjQuVTMyCitkUmVzdWx0SDIgICAgICAgRE4gMjYuVTMyCitkUmVzdWx0SDMgICAgICAgRE4gMjguVTMyCisKKzsvLyBSZWdpc3RlcnMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIFZlcnRpY2FsIGludGVycG9sYXRpb24KK2RTcmMwICAgICAgICAgICBETiA5LlU4CitkU3JjMSAgICAgICAgICAgRE4gMTAuVTgKK2RTcmMyICAgICAgICAgICBETiAxMS5VOAorZFNyYzMgICAgICAgICAgIEROIDEyLlU4CitkU3JjNCAgICAgICAgICAgRE4gMTMuVTgKK2RBY2NWMCAgICAgICAgICBETiAwLlU4CitkQWNjVjEgICAgICAgICAgRE4gMi5VOAorZEFjY1YyICAgICAgICAgIEROIDQuVTgKK2RBY2NWMyAgICAgICAgICBETiA2LlU4CitkUmVzdWx0VjAgICAgICAgRE4gMC5VMzIKK2RSZXN1bHRWMSAgICAgICBETiAyLlUzMgorZFJlc3VsdFYyICAgICAgIEROIDQuVTMyCitkUmVzdWx0VjMgICAgICAgRE4gNi5VMzIKKyAgICAgICAgCis7Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBEaWFnb25hbCBpbnRlcnBvbGF0aW9uCitkVEFjYzAgICAgICAgICAgRE4gMC5VOAorZFRBY2MxICAgICAgICAgIEROIDIuVTgKK2RUQWNjMiAgICAgICAgICBETiA0LlU4CitkVEFjYzMgICAgICAgICAgRE4gNi5VOAorZFRSZXMwICAgICAgICAgIEROIDAuMzIKK2RUUmVzMSAgICAgICAgICBETiAyLjMyCitkVFJlczIgICAgICAgICAgRE4gNC4zMgorZFRSZXMzICAgICAgICAgIEROIDYuMzIKK2RUUmVzdWx0MCAgICAgICBETiAxNC5VOAorZFRSZXN1bHQxICAgICAgIEROIDE2LlU4CitkVFJlc3VsdDIgICAgICAgRE4gMTguVTgKK2RUUmVzdWx0MyAgICAgICBETiAyMC5VOAorZFRlbXBQMCAgICAgICAgIEROIDE4LlMxNgorZFRlbXBQMSAgICAgICAgIEROIDE5LlMxNgorZFRlbXBRMCAgICAgICAgIEROIDIwLlMxNgorZFRlbXBRMSAgICAgICAgIEROIDIxLlMxNgorZFRlbXBSMCAgICAgICAgIEROIDIyLlMxNgorZFRlbXBSMSAgICAgICAgIEROIDIzLlMxNgorZFRlbXBTMCAgICAgICAgIEROIDI0LlMxNgorZFRlbXBTMSAgICAgICAgIEROIDI1LlMxNgorcVRlbXBQMDEgICAgICAgIFFOIDkuUzE2CitxVGVtcFEwMSAgICAgICAgUU4gMTAuUzE2CitxVGVtcFIwMSAgICAgICAgUU4gMTEuUzE2CitxVGVtcFMwMSAgICAgICAgUU4gMTIuUzE2CisKKzsvLyBJbnRlcm1lZGlhdGUgdmFsdWVzIGZvciBhdmVyYWdpbmcKK3FSZXMyICAgICAgICAgICBRTiA3LlMxNgorcVJlczMgICAgICAgICAgIFFOIDguUzE2CitxUmVzNCAgICAgICAgICAgUU4gOS5TMTYKK3FSZXM1ICAgICAgICAgICBRTiAxMC5TMTYKK3FSZXM2ICAgICAgICAgICBRTiAxMS5TMTYKKyAgICAgICAKKzsvLyBGb3IgaW1wbGVtZW50aW5nIGNvcHkKK2REc3QwICAgICAgICAgICAgRE4gOS4zMgorZERzdDEgICAgICAgICAgICBETiAxMC4zMgorZERzdDIgICAgICAgICAgICBETiAxMS4zMgorZERzdDMgICAgICAgICAgICBETiAxMi4zMgorCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgICAgIHB0cmlkeCwgNAorICAgICAgICBNX0FSRyAgICAgICBwdHJpZHksIDQgICAgICAgIAorICAgICAgICBNX0FSRyAgICAgICBwdHJXaWR0aCwgNAorICAgICAgICBNX0FSRyAgICAgICBwdHJIZWlnaHQsIDQgICAgICAgIAorCisgICAgICAgIDsvLyBMb2FkIHN0cnVjdHVyZSBlbGVtZW50cyBvZiByb2kgCisgICAgICAgIE1fTERSICAgICAgIGlkeCwgcHRyaWR4CisgICAgICAgIE1fTERSICAgICAgIGlkeSwgcHRyaWR5CisgICAgICAgIE1fTERSICAgICAgIGlXaWR0aCwgcHRyV2lkdGgKKyAgICAgICAgTV9MRFIgICAgICAgaUhlaWdodCwgcHRySGVpZ2h0CisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBpbmRleCwgaWR4LCBpZHksIExTTCAjMiAgICAgICAgICAgICAgICAgOy8vICBbaW5kZXhdID0gW2lkeV1baWR4XQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTW92ZSBjb2VmZmljaWVudHMgTmVvbiByZWdpc3RlcnMKKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmMjAsICMyMAorICAgICAgICBWTU9WICAgICAgICBkQ29lZmY1LCAjNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorQmxvY2s0eDRXaWR0aExvb3AKK0Jsb2NrNHg0SGVpZ2h0TG9vcAorCisgICAgICAgIFNUTSAgICAgICAgIHBBcmdzLCB7cFNyYyxzcmNTdGVwLHBEc3QsZHN0U3RlcH0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHN3aXRjaCB0YWJsZSB1c2luZyBtb3Rpb24gdmVjdG9yIGFzIGluZGV4CisgICAgICAgIEFERCAgICAgICAgIHBjLCBwYywgaW5kZXgsIExTTCAjMgorICAgICAgICBCICAgICAgICAgICBDYXNlX2YKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV8wICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV8xICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV8yICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV8zICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV80ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV81ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV82ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV83ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV84ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV85ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9hICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9iICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9jICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9kCisgICAgICAgIEIgICAgICAgICAgIENhc2VfZSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfZgorICAgICAgICAgICAgICAgICAgICAKK0Nhc2VfMCAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIENhc2UgRworICAgICAgICBNX1BSSU5URiAiQ2FzZSAwIFxuIgorICAgICAgICAKKyAgICAgICAgOy8vIExvYWRzIGEgNHg0IGJsb2NrIG9mIC44IGFuZCBzdG9yZXMgYXMgLjMyCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMSAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBWTEQxICAgICAgICBkU3JjMiwgW1RlbXBdLCBzcmNTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMxLCBbcFNyY10KKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzMsIFtUZW1wXQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkRHN0MFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGREc3QyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZERzdDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkRHN0M1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzEKKyAgICAgICAgOy8vIENhc2UgYQorICAgICAgICBNX1BSSU5URiAiQ2FzZSAxIFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRTcmMwYworICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZFNyYzJjCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkU3JjMWMKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRTcmMzYworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfMgorICAgICAgICA7Ly8gQ2FzZSBiCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDIgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIgICAgICAgIAorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfMworICAgICAgICA7Ly8gQ2FzZSBjCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDMgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZFNyYzBkCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkU3JjMmQKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRTcmMxZAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZFNyYzNkCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV80CisgICAgICAgIDsvLyBDYXNlIGQKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNCBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjVjAsIGRBY2NWMCwgZFNyYzAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YyLCBkQWNjVjIsIGRTcmMyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMSwgZEFjY1YxLCBkU3JjMQorICAgICAgICBWUkhBREQgICAgICBkQWNjVjMsIGRBY2NWMywgZFNyYzMKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzUKKyAgICAgICAgOy8vIENhc2UgZQorICAgICAgICBNX1BSSU5URiAiQ2FzZSA1IFxuIgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmNCSywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICAKKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzYKKyAgICAgICAgOy8vIENhc2UgZgorICAgICAgICBNX1BSSU5URiAiQ2FzZSA2IFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxUmVzMiwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFSZXMzLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVJlczQsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxUmVzNSwgIzUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQorICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KKyAgICAgICAgCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV83CisgICAgICAgIDsvLyBDYXNlIGcKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNyBcbiIKKyAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmNCSywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICAKKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV84CisgICAgICAgIDsvLyBDYXNlIGgKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgOCBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzkKKyAgICAgICAgOy8vIENhc2UgaQorICAgICAgICBNX1BSSU5URiAiQ2FzZSA5IFxuIgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUDAsIGRUZW1wUDAsIGRUZW1wUDEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUTAsIGRUZW1wUTAsIGRUZW1wUTEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUjAsIGRUZW1wUjAsIGRUZW1wUjEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUzAsIGRUZW1wUzAsIGRUZW1wUzEsICMyCisgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFUZW1wUDAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVRlbXBRMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxVGVtcFIwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFUZW1wUzAxLCAjNSAgICAgICAgCisKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYQorICAgICAgICA7Ly8gQ2FzZSBqCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGEgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYgorICAgICAgICA7Ly8gQ2FzZSBrCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGIgXG4iCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBQMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBRMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBSMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBTMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzMKKyAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVRlbXBQMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxVGVtcFEwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFUZW1wUjAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVRlbXBTMDEsICM1ICAgICAgICAKKworICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQorICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9jCisgICAgICAgIDsvLyBDYXNlIG4KKyAgICAgICAgTV9QUklOVEYgIkNhc2UgYyBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjVjAsIGRBY2NWMCwgZFNyYzEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YyLCBkQWNjVjIsIGRTcmMzCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMSwgZEFjY1YxLCBkU3JjMgorICAgICAgICBWUkhBREQgICAgICBkQWNjVjMsIGRBY2NWMywgZFNyYzQKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9kCisgICAgICAgIDsvLyBDYXNlIHAKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZCBcbiIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjQkssIHNyY1N0ZXAKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2UKKyAgICAgICAgOy8vIENhc2UgcQorICAgICAgICBNX1BSSU5URiAiQ2FzZSBlIFxuIgorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFSZXMzLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVJlczQsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxUmVzNSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFSZXM2LCAjNSAgICAgICAgCisKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZgorICAgICAgICA7Ly8gQ2FzZSByCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGYgXG4iCisgICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYworICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjQkssIHNyY1N0ZXAKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisKKworQmxvY2s0eDRMb29wRW5kCisKKyAgICAgICAgOy8vIFdpZHRoIExvb3AKKyAgICAgICAgOy8vTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9ICA7Ly8gTG9hZCBhcmd1bWVudHMKKyAgICAgICAgU1VCUyAgICAgICAgaVdpZHRoLCBpV2lkdGgsICM0CisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICM0ICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsICM0CisgICAgICAgIEJHVCAgICAgICAgIEJsb2NrNHg0V2lkdGhMb29wCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSGVpZ2h0IExvb3AKKyAgICAgICAgU1VCUyAgICAgICAgaUhlaWdodCwgaUhlaWdodCwgIzQKKyAgICAgICAgTV9MRFIgICAgICAgaVdpZHRoLCBwdHJXaWR0aAorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgIAorICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgaVdpZHRoCisgICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGlXaWR0aAorICAgICAgICBCR1QgICAgICAgICBCbG9jazR4NEhlaWdodExvb3AKKworRW5kT2ZJbnRlcnBvbGF0aW9uCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjMAorICAgICAgICBNX0VORCAgICAgICAKKworICAgIEVORElGICAKKyAgICAgICAgOy8vIEVuZCBvZiBDb3J0ZXhBOAorICAgICAgICAgICAgICAgICAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYTYwNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCkBAIC0wLDAgKzEsNDM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgCisgICAgIEFSRUEgdGFibGUsIERBVEEgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4CisgICAgRENEICBPTVhfVkNfQ0hST01BX0RDLCAgICAgT01YX1ZDX0NIUk9NQV9IT1IgCisgICAgRENEICBPTVhfVkNfQ0hST01BX1ZFUlQsICAgT01YX1ZDX0NIUk9NQV9QTEFORSAgCisgICAgCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OCwxCisgICAgRENXICAgMywgMiwgMSw0IAorICAgIERDVyAgLTMsLTIsLTEsMAorICAgIERDVyAgIDEsIDIsIDMsNAorICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgSUYgQ29ydGV4QTgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIAorcGMgICAgICAgICAgICAgIFJOIDE1ICAgCityZXR1cm4gICAgICAgICAgUk4gMCAgCitwVGFibGUgICAgICAgICAgUk4gOCAKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIElucHV0IEFyZ3VtZW50cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwTXVsdGlwbGllclRhYmxlICAgIFJOICAyICAgICAKKworcFRtcCAgICAgICAgICAgIFJOIDkKK3N0ZXAgICAgICAgICAgICBSTiAxMAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBOZW9uIFJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsvLyBPTVhfVkNfQ0hST01BX0hPUgorCitkTGVmdFZhbDAgICAgICAgRE4gIEQwLjgKK2RMZWZ0VmFsMSAgICAgICBETiAgRDEuOAorZExlZnRWYWwyICAgICAgIEROICBEMi44CitkTGVmdFZhbDMgICAgICAgRE4gIEQzLjgKK2RMZWZ0VmFsNCAgICAgICBETiAgRDQuOAorZExlZnRWYWw1ICAgICAgIEROICBENS44CitkTGVmdFZhbDYgICAgICAgRE4gIEQ2LjgKK2RMZWZ0VmFsNyAgICAgICBETiAgRDcuOAorCis7Ly8gT01YX1ZDX0NIUk9NQV9WRVJUCisKK2RBYm92ZVZhbCAgICAgICBETiAgRDAuVTgKKworOy8vIE9NWF9WQ19DSFJPTUFfREMKKworZExlZnRWYWwgICAgICAgIEROICBEMS5VOAorZFN1bUFib3ZlVmFsVTE2IEROICBEMi5VMTYKK2RTdW1BYm92ZVZhbFUzMiBETiAgRDMuVTMyCitkU3VtQWJvdmVWYWxVOCAgRE4gIEQzLlU4CitkU3VtTGVmdFZhbFUxNiAgRE4gIEQyLlUxNgorZFN1bUxlZnRWYWxVMzIgIEROICBEMS5VMzIKK2RTdW1MZWZ0VmFsVTggICBETiAgRDEuVTgKK2RTdW1BYm92ZUxlZnQgICBETiAgRDIuVTMyCitkU3VtQWJvdmVMZWZ0VTggRE4gIEQyLlU4CitkSW5kZXhSb3cwVTggICAgRE4gIEQ1LlU4CitkSW5kZXhSb3cwICAgICAgRE4gIEQ1LlU2NAorZEluZGV4Um93NFU4ICAgIEROICBENi5VOAorZEluZGV4Um93NCAgICAgIEROICBENi5VNjQKK2REc3RSb3cwICAgICAgICBETiAgRDAuVTgKK2REc3RSb3c0ICAgICAgICBETiAgRDQuVTgKK2RDb25zdDEyOFU4ICAgICBETiAgRDAuVTgKKworOy8vIE9NWF9WQ19DSFJPTUFfUExBTkUKKworZFJldkFib3ZlVmFsICAgIEROICBEMy5VOCAgCitkUmV2QWJvdmVWYWxVNjQgRE4gIEQzLlU2NCAgCitkQWJvdmVMZWZ0VmFsICAgRE4gIEQyLlU4CitxQWJvdmU3bWludXMwICAgUU4gIFEzLlMxNiAKK3FBYm92ZURpZmYgICAgICBRTiAgUTIuUzE2IAorZEluZGV4ICAgICAgICAgIEROICBEOC5VOCAgCitkRGlmZkFib3ZlVTggICAgRE4gIEQ5LlU4ICAKK2REaWZmQWJvdmVTMTYgICBETiAgRDkuUzE2IAorZEFib3ZlRGlmZjBVOCAgIEROICBENC5VOCAgCitkQWJvdmVEaWZmMFU2NCAgRE4gIEQ0LlU2NAorZEFib3ZlN21pbnVzMFU4IEROICBENi5VOCAgCitkTXVsdGlwbGllciAgICAgRE4gIEQxMC5TMTYgCitkSG9yUHJlZCAgICAgICAgRE4gIEQxMS5TMTYgCitkUmV2TGVmdFZhbCAgICAgRE4gIEQzLlU4CitkUmV2TGVmdFZhbFU2NCAgRE4gIEQzLlU2NAorcUxlZnQ3bWludXMwICAgIFFOICBRNy5TMTYKK3FMZWZ0RGlmZiAgICAgICBRTiAgUTYuUzE2CitkRGlmZkxlZnRVOCAgICAgRE4gIEQxNi5VOAorZERpZmZMZWZ0UzE2ICAgIEROICBEMTYuUzE2CitkTGVmdERpZmYwVTggICAgRE4gIEQxMi5VOAorZExlZnREaWZmMFU2NCAgIEROICBEMTIuVTY0CitkTGVmdDdtaW51czBVOCAgRE4gIEQxNC5VOAorZFZlclByZWQgICAgICAgIEROICBEMy5TMTYgCitkSFZWYWxTMTYgICAgICAgRE4gIEQzLlMxNgorZEhWVmFsUzMyICAgICAgIEROICBEMy5TMzIKK2RIVlRlbXBTMzIgICAgICBETiAgRDIuUzMyCitxQSAgICAgICAgICAgICAgUU4gIFEwLlMxNgorcUIgICAgICAgICAgICAgIFFOICBRMi5TMTYKK3FDICAgICAgICAgICAgICBRTiAgUTMuUzE2CitxTXVsdGlwbGllciAgICAgUU4gIFE1LlMxNgorZE11bHRpcGxpZXIwICAgIEROICBEMTAuUzE2CitkTXVsdGlwbGllcjEgICAgRE4gIEQxMS5TMTYKK3FDMCAgICAgICAgICAgICBRTiAgUTAuUzE2CitxQzEgICAgICAgICAgICAgUU4gIFExLlMxNgorcUMyICAgICAgICAgICAgIFFOICBRNC5TMTYKK3FDMyAgICAgICAgICAgICBRTiAgUTUuUzE2CitxQzQgICAgICAgICAgICAgUU4gIFE2LlMxNgorcUM1ICAgICAgICAgICAgIFFOICBRNy5TMTYKK3FDNiAgICAgICAgICAgICBRTiAgUTguUzE2CitxQzcgICAgICAgICAgICAgUU4gIFE5LlMxNgorcVN1bTAgICAgICAgICAgIFFOICBRMC5TMTYKK3FTdW0xICAgICAgICAgICBRTiAgUTEuUzE2CitxU3VtMiAgICAgICAgICAgUU4gIFE0LlMxNgorcVN1bTMgICAgICAgICAgIFFOICBRNS5TMTYKK3FTdW00ICAgICAgICAgICBRTiAgUTYuUzE2CitxU3VtNSAgICAgICAgICAgUU4gIFE3LlMxNgorcVN1bTYgICAgICAgICAgIFFOICBROC5TMTYKK3FTdW03ICAgICAgICAgICBRTiAgUTkuUzE2CitkU3VtMCAgICAgICAgICAgRE4gIEQwLlU4CitkU3VtMSAgICAgICAgICAgRE4gIEQxLlU4CitkU3VtMiAgICAgICAgICAgRE4gIEQyLlU4CitkU3VtMyAgICAgICAgICAgRE4gIEQzLlU4CitkU3VtNCAgICAgICAgICAgRE4gIEQ0LlU4CitkU3VtNSAgICAgICAgICAgRE4gIEQ1LlU4CitkU3VtNiAgICAgICAgICAgRE4gIEQ2LlU4CitkU3VtNyAgICAgICAgICAgRE4gIEQ3LlU4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIHIxMCwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OCAgIDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKworT01YX1ZDX0NIUk9NQV9EQworICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAorICAgICAgICBCRVEgICAgIERDQ2hyb21hOHg4TGVmdE5vdEF2YWlsYWJsZQorCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisKKyAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzBdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsyXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzNdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs1XX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzZdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbN119LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXSAgICAgIAorICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKKyAgICAgICAgQkVRICAgICBEQ0Nocm9tYTh4OExlZnRPbmx5QXZhaWxhYmxlCisKKyAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSBhbHNvCisgICAgICAgIFZMRDEgICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gN10gIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA0KzUrNis3IHwgIDArMSsyKzMgXSAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDQrNSs2KzcgfCAgMCsxKzIrMyBdICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICAgZFN1bUFib3ZlTGVmdCxkU3VtQWJvdmVWYWxVMzIsZFN1bUxlZnRWYWxVMzIKKyAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlTGVmdCxkU3VtQWJvdmVMZWZ0LCMzICAgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgNCkgPj4gMworICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVWYWxVMzIsZFN1bUFib3ZlVmFsVTMyLCMyICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIFZSU0hSICAgIGRTdW1MZWZ0VmFsVTMyLGRTdW1MZWZ0VmFsVTMyLCMyICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgCisgICAgICAgIFZNT1YgICAgIGRJbmRleFJvdzBVOCwjMHgwYyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVk1PViAgICAgZEluZGV4Um93NFU4LCMweDA0CisgICAgICAgIFZTSEwgICAgIGRJbmRleFJvdzAsZEluZGV4Um93MCwjMzIgICAgICAgICAgICAgICAgICA7Ly8gaW5kZXgwID0gMHgwYzBjMGMwYzAwMDAwMDAwIAorICAgICAgICBWU0hSICAgICBkSW5kZXhSb3c0LGRJbmRleFJvdzQsIzMyICAgICAgICAgICAgICAgICAgOy8vIGluZGV4NCA9IDB4MDAwMDAwMDAwNDA0MDQwNAorICAgICAgICBWQUREICAgICBkSW5kZXhSb3c0VTgsZEluZGV4Um93NFU4LGRJbmRleFJvdzBVOCAgICAgOy8vIGluZGV4NCA9IDB4MGMwYzBjMGMwNDA0MDQwNAorICAgICAgICBWVEJMICAgICBkRHN0Um93MCx7ZFN1bUFib3ZlTGVmdFU4LGRTdW1BYm92ZVZhbFU4fSxkSW5kZXhSb3cwVTgKKyAgICAgICAgVlRCTCAgICAgZERzdFJvdzQse2RTdW1MZWZ0VmFsVTgsZFN1bUFib3ZlTGVmdFU4fSxkSW5kZXhSb3c0VTgKKyAKK0RDQ2hyb21hOHg4TGVmdFN0b3JlICAgICAgIAorICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzUqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs3KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKworICAgICAgICBNX0VYSVQKKyAgICAgICAgCisKK0RDQ2hyb21hOHg4TGVmdE9ubHlBdmFpbGFibGUKKworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMzIsIGRTdW1MZWZ0VmFsVTE2ICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNCs1KzYrNyB8ICAwKzErMiszIF0gICAKKyAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgorICAgICAgICAKKyAgICAgICAgVkRVUCAgICAgZERzdFJvdzAsZFN1bUxlZnRWYWxVOFswXQorICAgICAgICBWRFVQICAgICBkRHN0Um93NCxkU3VtTGVmdFZhbFU4WzRdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OExlZnRTdG9yZSAgCisgICAgICAgIAorCitEQ0Nocm9tYTh4OExlZnROb3RBdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCisgICAgICAgIEJFUSAgICAgRENDaHJvbWE4eDhOb25lQXZhaWxhYmxlCisKKyAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSAKKyAgICAgICAgVkxEMSAgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byA3XSAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTE2LCBkQWJvdmVWYWwgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMzIsIGRTdW1BYm92ZVZhbFUxNiAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNCs1KzYrNyB8ICAwKzErMiszIF0gCisgICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgVk1PViAgICAgZEluZGV4Um93MFU4LCMweDA0CisgICAgICAgIFZTSEwgICAgIGRJbmRleFJvdzAsZEluZGV4Um93MCwjMzIgICAgICAgICAgICAgICAgICA7Ly8gaW5kZXggPSAweDA0MDQwNDA0MDAwMDAwMDAKKyAgICAgICAgVlRCTCAgICAgZERzdFJvdzAse2RTdW1BYm92ZVZhbFU4fSxkSW5kZXhSb3cwVTggCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OFVwcGVyU3RvcmUKKyAgICAgICAgCisKK0RDQ2hyb21hOHg4Tm9uZUF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTU9WICAgICBkQ29uc3QxMjhVOCwjMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDB4ODA4MDgwODA4MDgwODA4MCBpZihjb3VudCA9PSAwKQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKKworRENDaHJvbWE4eDhVcHBlclN0b3JlICAgICAgICAKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzQqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs2KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzcqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICAKKyAgICAgICAgTV9FWElUCisKKworT01YX1ZDX0NIUk9NQV9WRVJUCisgICAgICAgIAorICAgICAgICBWTEQxICAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVt4XSAgICAgIDowPD0geCA8PSA3ICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4VXBwZXJTdG9yZQorICAgICAgICAKKworT01YX1ZDX0NIUk9NQV9IT1IKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDBbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwxW119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMltdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDNbXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw0W119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsNVtdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDZbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw3W119LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OFBsYW5lU3RvcmUKKyAgICAgICAgCisgICAgICAgIAorT01YX1ZDX0NIUk9NQV9QTEFORQorICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZUxlZnRWYWxbMF0sW3BTcmNBYm92ZUxlZnRdCisgICAgICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFswXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzFdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFszXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs2XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzddfSxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlJFVjY0ICBkUmV2QWJvdmVWYWwsZEFib3ZlVmFsICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXZlcnNlIG9yZGVyIG9mIGJ5dGVzID0gcFNyY0Fib3ZlWzA6MToyOjM6NDo1OjY6N10KKyAgICAgICAgVlNVQkwgICBxQWJvdmU3bWludXMwLGRSZXZBYm92ZVZhbCxkQWJvdmVMZWZ0VmFsICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0Fib3ZlWzddIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBWU0hSICAgIGRSZXZBYm92ZVZhbFU2NCxkUmV2QWJvdmVWYWxVNjQsIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVtYOjA6MToyOjM6NDo1OjZdCisgICAgICAgIFZTVUJMICAgcUFib3ZlRGlmZixkUmV2QWJvdmVWYWwsZEFib3ZlVmFsICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzVdIC0gcFNyY0Fib3ZlWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzRdIC0gcFNyY0Fib3ZlWzJdCisgICAgICAgIAorICAgICAgICBWUkVWNjQgIGRSZXZMZWZ0VmFsLGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJldmVyc2Ugb3JkZXIgb2YgYnl0ZXMgPSBwU3JjTGVmdFswOjE6MjozOjQ6NTo2OjddCisgICAgICAgIFZTVUJMICAgcUxlZnQ3bWludXMwLGRSZXZMZWZ0VmFsLGRBYm92ZUxlZnRWYWwgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNMZWZ0WzddIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBWU0hSICAgIGRSZXZMZWZ0VmFsVTY0LGRSZXZMZWZ0VmFsVTY0LCM4ICAgICAgICAgICAgOy8vIHBTcmNMZWZ0W1g6MDoxOjI6Mzo0OjU6Nl0KKyAgICAgICAgVlNVQkwgICBxTGVmdERpZmYsZFJldkxlZnRWYWwsZExlZnRWYWwgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2XSAtIHBTcmNMZWZ0WzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNV0gLSBwU3JjTGVmdFsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzRdIC0gcFNyY0xlZnRbMl0KKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcE11bHRpcGxpZXJUYWJsZSw9YXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDggICA7Ly8gVXNlZCB0byBjYWxjdWxhdGUgSHZhbCAmIFZ2YWwgIAorICAgICAgICBWU0hMICAgIGRBYm92ZURpZmYwVTY0LGRBYm92ZURpZmYwVTY0LCMxNiAgCisgICAgICAgIFZFWFQgICAgZERpZmZBYm92ZVU4LGRBYm92ZURpZmYwVTgsZEFib3ZlN21pbnVzMFU4LCMyICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA3LTAgfCA0LTIgfCA1LTEgfCA2LTAgXQorICAgICAgICBWTEQxICAgIGRNdWx0aXBsaWVyLFtwTXVsdGlwbGllclRhYmxlXSEgCisgICAgICAgIFZTSEwgICAgZExlZnREaWZmMFU2NCxkTGVmdERpZmYwVTY0LCMxNiAgCisgICAgICAgIFZFWFQgICAgZERpZmZMZWZ0VTgsZExlZnREaWZmMFU4LGRMZWZ0N21pbnVzMFU4LCMyICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDctMCB8IDQtMiB8IDUtMSB8IDYtMCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1VTCAgICBkSG9yUHJlZCxkRGlmZkFib3ZlUzE2LGRNdWx0aXBsaWVyICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDQqKDctMCkgfCAxKig0LTIpIHwgMiooNS0xKSB8IDMqKDYtMCkgXQorICAgICAgICBWTVVMICAgIGRWZXJQcmVkLGREaWZmTGVmdFMxNixkTXVsdGlwbGllcgorICAgICAgICBWUEFERCAgIGRIVlZhbFMxNixkSG9yUHJlZCxkVmVyUHJlZAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgZEhWVmFsUzMyLGRIVlZhbFMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1Z8SF0gaW4gMzIgYml0cyBlYWNoCisgICAgICAgIFZTSEwgICAgZEhWVGVtcFMzMixkSFZWYWxTMzIsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTcqSCA9IDE2KkggKyBIID0gKEg8PDQpK0gKKyAgICAgICAgVkFERCAgICBkSFZWYWxTMzIsZEhWVmFsUzMyLGRIVlRlbXBTMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbIDE3KlYgIHwgMTcqSCBdaW4gMzIgYml0cyBlYWNoCisgICAgICAgIFZMRDEgICAge2RNdWx0aXBsaWVyMCxkTXVsdGlwbGllcjF9LFtwTXVsdGlwbGllclRhYmxlXSAgICAgICAgICA7Ly8gcU11bHRpcGxpZXIgPSBbIDR8M3wyfDF8MHwtMXwtMnwtMyBdICAKKyAgICAgICAgVlJTSFIgICBkSFZWYWxTMzIsZEhWVmFsUzMyLCM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbY3xiXSBpbiAxNmJpdHMgZWFjaAorICAgICAgICBWQURETCAgIHFBLGRBYm92ZVZhbCxkTGVmdFZhbAorICAgICAgICBWRFVQICAgIHFBLHFBWzddCisgICAgICAgIFZTSEwgICAgcUEscUEsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2F8YXxhfGF8YXxhfGF8YV0KKyAgICAgICAgVkRVUCAgICBxQixkSFZWYWxTMTZbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbYnxifGJ8YnxifGJ8YnxiXQorICAgICAgICBWRFVQICAgIHFDLGRIVlZhbFMxNlsyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtjfGN8Y3xjfGN8Y3xjfGNdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1VTCAgICBxQixxQixxTXVsdGlwbGllcgorICAgICAgICBWTVVMICAgIHFDLHFDLHFNdWx0aXBsaWVyCisgICAgICAgIFZBREQgICAgcUIscUIscUEgCisgICAgICAgIAorICAgICAgICBWRFVQICAgIHFDMCxxQ1swXQorICAgICAgICBWRFVQICAgIHFDMSxxQ1sxXQorICAgICAgICBWRFVQICAgIHFDMixxQ1syXQorICAgICAgICBWRFVQICAgIHFDMyxxQ1szXQorICAgICAgICBWRFVQICAgIHFDNCxxQ1s0XQorICAgICAgICBWRFVQICAgIHFDNSxxQ1s1XQorICAgICAgICBWRFVQICAgIHFDNixxQ1s2XQorICAgICAgICBWRFVQICAgIHFDNyxxQ1s3XQorICAgICAgICAKKyAgICAgICAgVkFERCAgICBxU3VtMCxxQixxQzAKKyAgICAgICAgVkFERCAgICBxU3VtMSxxQixxQzEKKyAgICAgICAgVkFERCAgICBxU3VtMixxQixxQzIKKyAgICAgICAgVkFERCAgICBxU3VtMyxxQixxQzMKKyAgICAgICAgVkFERCAgICBxU3VtNCxxQixxQzQKKyAgICAgICAgVkFERCAgICBxU3VtNSxxQixxQzUKKyAgICAgICAgVkFERCAgICBxU3VtNixxQixxQzYKKyAgICAgICAgVkFERCAgICBxU3VtNyxxQixxQzcKKyAgICAgICAgCisgICAgICAgIFZRUlNIUlVOIGRTdW0wLHFTdW0wLCM1ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAoT01YX1U4KWFybUNsaXAoMCwyNTUsKFN1bSsxNik+PjUpCisgICAgICAgIFZRUlNIUlVOIGRTdW0xLHFTdW0xLCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW0yLHFTdW0yLCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW0zLHFTdW0zLCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW00LHFTdW00LCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW01LHFTdW01LCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW02LHFTdW02LCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW03LHFTdW03LCM1ICAgICAgCisKK0RDQ2hyb21hOHg4UGxhbmVTdG9yZSAgICAgICAgCisgICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFN1bTAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW0xLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtMixbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTMsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW00LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtNSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTYsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzYqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW03LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs3KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOWMwZWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKQEAgLTAsMCArMSw0MjQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgIAorICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKKzsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNgorICAgIERDRCAgT01YX1ZDXzE2WDE2X1ZFUlQsIE9NWF9WQ18xNlgxNl9IT1IgCisgICAgRENEICBPTVhfVkNfMTZYMTZfREMsICAgT01YX1ZDXzE2WDE2X1BMQU5FCisgICAgCisKKyAgICBJRiBDb3J0ZXhBOAorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2LDEKKyAgICBEQ1cgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgOCAKKyAgICBEQ1cgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNworICAgIERDVyAgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1CisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBDb25zdGFudHMgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitCTEtfU0laRSAgICAgICAgRVFVIDB4MTAKK01VTF9DT05TVDAgICAgICBFUVUgMHgwMTAxMDEwMQorTVVMX0NPTlNUMSAgICAgIEVRVSAweDAwMDYwMDA0CitNVUxfQ09OU1QyICAgICAgRVFVIDB4MDAwNzAwMDUKK01VTF9DT05TVDMgICAgICBFUVUgMHgwMDAzMDAwMQorTUFTS19DT05TVCAgICAgIEVRVSAweDAwRkYwMEZGCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3kgICAgICAgICAgICAgICBSTiAxMiAgIAorcGMgICAgICAgICAgICAgIFJOIDE1ICAgCisKK3JldHVybiAgICAgICAgICBSTiAwICAgIAorcFRhYmxlICAgICAgICAgIFJOIDkgICAgCitjb3VudCAgICAgICAgICAgUk4gMTEgICAKK3BNdWx0VGFibGUgICAgICBSTiA5Cis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTmVvbiByZWdpc3RlcnMKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcUFib3ZlICAgICAgICAgIFFOIFEwLlU4CitxTGVmdCAgICAgICAgICAgUU4gUTEuVTgKK3FTdW04ICAgICAgICAgICBRTiBRMC5VMTYKK2RTdW04MCAgICAgICAgICBETiBEMC5VMTYKK2RTdW04MSAgICAgICAgICBETiBEMS5VMTYKK2RTdW00ICAgICAgICAgICBETiBEMC5VMTYKK2RTdW0yICAgICAgICAgICBETiBEMC5VMzIKK2RTdW0xICAgICAgICAgICBETiBEMC5VNjQKK3FPdXQgICAgICAgICAgICBRTiBRMy5VOAorZFN1bUxlZnQgICAgICAgIEROIEQ2LlU2NAorZFN1bUFib3ZlICAgICAgIEROIEQ3LlU2NAorZFN1bSAgICAgICAgICAgIEROIEQ4LlU2NAorZFN1bTAgICAgICAgICAgIEROIEQ4LlU4WzBdCisKK3FIICAgICAgICAgICAgICBRTiBRMTEuUzMyCitxViAgICAgICAgICAgICAgUU4gUTEyLlMzMgorcUEgICAgICAgICAgICAgIFFOIFExMS5TMTYKK3FCICAgICAgICAgICAgICBRTiBRNi5TMTYKK3FDICAgICAgICAgICAgICBRTiBRNy5TMTYKKworcUIwICAgICAgICAgICAgIFFOIFE1LlMxNgorcUIxICAgICAgICAgICAgIFFOIFE2LlMxNgorZEExICAgICAgICAgICAgIEROIEQyMy5TMTYKKworZEgwICAgICAgICAgICAgIEROIEQyMi5TMzIKK2RIMSAgICAgICAgICAgICBETiBEMjMuUzMyCitkVjAgICAgICAgICAgICAgRE4gRDI0LlMzMgorZFYxICAgICAgICAgICAgIEROIEQyNS5TMzIKKworcUhWICAgICAgICAgICAgIFFOIFExMS5TNjQKK3FIVjAgICAgICAgICAgICBRTiBRMTEuUzMyCitxSFYxICAgICAgICAgICAgUU4gUTEyLlM2NAorCitkSFYwMCAgICAgICAgICAgRE4gRDIyLlMzMgorZEhWMDEgICAgICAgICAgIEROIEQyMy5TMzIKKworZEhWMCAgICAgICAgICAgIEROIEQyMi5TMTZbMF0KK2RIVjEgICAgICAgICAgICBETiBEMjMuUzE2WzBdCitkSFYxMCAgICAgICAgICAgRE4gRDI0LlM2NAorZEhWMTEgICAgICAgICAgIEROIEQyNS5TNjQKKworcVN1bTAgICAgICAgICAgIFFOIFEwLlMxNgorcVN1bTEgICAgICAgICAgIFFOIFExLlMxNgorCitkT3V0MCAgICAgICAgICAgRE4gRDYuVTgKK2RPdXQxICAgICAgICAgICBETiBENy5VOAorCitkTGVmdDAgICAgICAgICAgRE4gRDIuVTgKK2RMZWZ0MSAgICAgICAgICBETiBEMy5VOAorcUNvbnN0ICAgICAgICAgIFFOIFExMy5TMTYKKworZEFib3ZlMCAgICAgICAgIEROIEQwLlU4CitkQWJvdmUxICAgICAgICAgRE4gRDEuVTgKKworZFJldkxlZnQ2NCAgICAgIEROIEQxMi5VNjQKK2RSZXZMZWZ0ICAgICAgICBETiBEMTIuVTgKK2RSZXZBYm92ZTY0ICAgICBETiBENS5VNjQKK2RSZXZBYm92ZSAgICAgICBETiBENS5VOAorcUxlZnREaWZmICAgICAgIFFOIFE4LlMxNgorZExlZnREaWZmMSAgICAgIEROIEQxNy5TMTYKK2RMZWZ0RGlmZjY0ICAgICBETiBEMTcuUzY0CitxRGlmZkxlZnQgICAgICAgUU4gUTguUzE2CitxRGlmZkFib3ZlICAgICAgUU4gUTQuUzE2CitkQWJvdmVEaWZmMSAgICAgRE4gRDkuUzE2CitkQWJvdmVEaWZmNjQgICAgRE4gRDkuUzY0CitxQWJvdmVEaWZmICAgICAgUU4gUTQuUzE2CisKK2RBYm92ZUxlZnQgICAgICBETiBENC5VOAorCitkRGlmZkxlZnQwICAgICAgRE4gRDE2LlMxNgorZERpZmZMZWZ0MSAgICAgIEROIEQxNy5TMTYKK2REaWZmQWJvdmUwICAgICBETiBEOC5TMTYKK2REaWZmQWJvdmUxICAgICBETiBEOS5TMTYKKworcUxlZnQxNW1pbnVzMCAgIFFOIFE3LlMxNgorZExlZnQxNW1pbnVzMCAgIEROIEQxNC5TMTYKK3FBYm92ZTE1bWludXMwICBRTiBRMy5TMTYKK2RBYm92ZTE1bWludXMwICBETiBENi5TMTYKKworcU11bHRpcGxpZXIgICAgIFFOIFExMC5TMTYKK3FNdWx0aXBsaWVyMCAgICBRTiBRMTAuUzE2CitxTXVsdGlwbGllcjEgICAgUU4gUTEyLlMxNgorZE11bHRpcGxpZXIwICAgIEROIEQyMC5TMTYKK2RNdWx0aXBsaWVyMSAgICBETiBEMjEuUzE2CisKK2RCUGx1c0NNdWx0NyAgICBETiBEMS5TNjQKK2RCUGx1c0NNdWx0N1MxNiBETiBEMS5TMTYKKworcVRtcCAgICAgICAgICAgIFFOIFEwLlU4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCitwRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKK2xlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2F2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorCitwVG1wICAgICAgICAgICAgUk4gOAorc3RlcCAgICAgICAgICAgIFJOIDEwCitwVG1wMiAgICAgICAgICAgUk4gMTEKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIHIxMSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNiA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAorICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50CisgICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQorICAgICAgICAKK09NWF9WQ18xNlgxNl9WRVJUCisgICAgICAgIFZMRDEgICAgcUFib3ZlLCAgW3BTcmNBYm92ZV0KKyAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XQorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdCisgICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK09NWF9WQ18xNlgxNl9IT1IKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBsZWZ0U3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgcFRtcDIsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RTdGVwLCBkc3RTdGVwLCBkc3RTdGVwCitMb29wSG9yIAorICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzgKKyAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCisgICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKKyAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAorICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBCTkUgICAgICBMb29wSG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciAxNiB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK09NWF9WQ18xNlgxNl9EQworICAgICAgICBNT1YgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY291bnQgPSAwCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJFUSAgICAgIFVwcGVyT3JOb25lQXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBsZWZ0CisKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKworICAgICAgICBWTEQxICAgIHtxTGVmdFswXX0sIFtwU3JjTGVmdF0sc3RlcCAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMV19LCBbcFRtcF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsyXX0sIFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFszXX0sIFtwVG1wXSxzdGVwCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzRdfSwgW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzVdfSwgW3BUbXBdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNl19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzddfSwgW3BUbXBdLHN0ZXAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbOF19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzldfSwgW3BUbXBdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTBdfSxbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTFdfSxbcFRtcF0sc3RlcCAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTJdfSxbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTNdfSxbcFRtcF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxNF19LFtwU3JjTGVmdF0sc3RlcCAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTVdfSxbcFRtcF0gCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBxU3VtOCwgcUxlZnQKKyAgICAgICAgQUREICAgICBjb3VudCwgY291bnQsICMxICAgIAorICAgICAgICBWUEFERCAgICBkU3VtNCwgZFN1bTgwLCBkU3VtODEKKyAgICAgICAgVlBBRERMICAgZFN1bTIsIGRTdW00CisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0LCBkU3VtMgorICAgICAgICBWUlNIUiAgICBkU3VtLCBkU3VtTGVmdCwgIzQKKyAgICAgICAgCitVcHBlck9yTm9uZUF2YWlsYWJsZQorICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICAjT01YX1ZDX1VQUEVSICAgICAgICAgICAgICA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgI09NWF9WQ19VUFBFUikKKyAgICAgICAgQkVRICAgICAgQm90aE9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKKyAgICAgICAgVkxEMSAgICAgcUFib3ZlLCBbcFNyY0Fib3ZlXQorICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgdXBwZXIgaW5jIGNvdW50IGJ5IDEKKyAgICAgICAgVlBBRERMICAgcVN1bTgsIHFBYm92ZQorICAgICAgICBWUEFERCAgICBkU3VtNCwgZFN1bTgwLCBkU3VtODEKKyAgICAgICAgVlBBRERMICAgZFN1bTIsIGRTdW00CisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZSwgZFN1bTIKKyAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bUFib3ZlLCAjNAorICAgICAgICAKK0JvdGhPck5vbmVBdmFpbGFibGUKKyAgICAgICAgQ01QICAgICAgY291bnQsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBib3RoIGF2YWlsYWJsZQorICAgICAgICBCTkUgICAgICBOb25lQXZhaWxhYmxlCisgICAgICAgIFZBREQgICAgIGRTdW0sIGRTdW1BYm92ZSwgZFN1bUxlZnQKKyAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bSwgIzUKKyAgICAgICAgCisKK05vbmVBdmFpbGFibGUKKyAgICAgICAgVkRVUCAgICAgcU91dCwgZFN1bTAgICAgICAgIAorICAgICAgICBDTVAgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIG5vbmUgYXZhaWxhYmxlCisgICAgICAgIEFERCAgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBCTkUgICAgICBMb29wREMKKyAgICAgICAgVk1PViAgICAgcU91dCwgIzEyOAorTG9vcERDICAgICAgICAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgTU9WICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorCitPTVhfVkNfMTZYMTZfUExBTkUKKyAgICAgICAgTERSICAgICBwTXVsdFRhYmxlLCA9YXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNgorICAgICAgICBWTEQxICAgIHFBYm92ZSwgW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVt4XSAgICAgIDowPD0geCA8PSA3ICAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZUxlZnRbMF0sW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMF19LCAgW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzFdfSwgIFtwVG1wXSxzdGVwICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzJdfSwgIFtwU3JjTGVmdF0sc3RlcCAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzNdfSwgIFtwVG1wXSxzdGVwICAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs0XX0sICBbcFNyY0xlZnRdLHN0ZXAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs1XX0sICBbcFRtcF0sc3RlcCAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs2XX0sICBbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbN119LCAgW3BUbXBdLHN0ZXAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbOF19LCAgW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzldfSwgIFtwVG1wXSxzdGVwICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEwXX0sIFtwU3JjTGVmdF0sc3RlcCAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzExXX0sIFtwVG1wXSxzdGVwICAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxMl19LCBbcFNyY0xlZnRdLHN0ZXAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxM119LCBbcFRtcF0sc3RlcCAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxNF19LCBbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTVdfSwgW3BUbXBdICAgCisKKyAgICAgICAgVlJFVjY0ICBkUmV2QWJvdmUsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTU6MTQ6MTM6MTI6MTE6MTA6OTo4XSAKKyAgICAgICAgVlNVQkwgICBxQWJvdmUxNW1pbnVzMCwgZFJldkFib3ZlLCBkQWJvdmVMZWZ0ICAgICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0Fib3ZlWzE1XSAtIHBTcmNBYm92ZUxlZnRbMF0gCisgICAgICAgIFZTSFIgICAgZFJldkFib3ZlNjQsIGRSZXZBYm92ZTY0LCAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzE0OjEzOjEyOjExOjEwOjk6ODpYXSAKKyAgICAgICAgVlNVQkwgICBxQWJvdmVEaWZmLCBkUmV2QWJvdmUsIGRBYm92ZTAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNITCAgICBkQWJvdmVEaWZmNjQsIGRBYm92ZURpZmY2NCwgIzE2IAorICAgICAgICBWRVhUICAgIGREaWZmQWJvdmUxLCBkQWJvdmVEaWZmMSwgZEFib3ZlMTVtaW51czAsICMxICAKKworICAgICAgICBWUkVWNjQgIGRSZXZMZWZ0LGRMZWZ0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzE1OjE0OjEzOjEyOjExOjEwOjk6OF0gCisgICAgICAgIFZTVUJMICAgcUxlZnQxNW1pbnVzMCxkUmV2TGVmdCwgZEFib3ZlTGVmdCAgICAgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNMZWZ0WzddIC0gcFNyY0Fib3ZlTGVmdFswXSAKKyAgICAgICAgVlNIUiAgICBkUmV2TGVmdDY0LCBkUmV2TGVmdDY0LCAjOCAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxNDoxMzoxMjoxMToxMDo5Ojg6WF0gCisgICAgICAgIFZTVUJMICAgcUxlZnREaWZmLGRSZXZMZWZ0LCBkTGVmdDAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBNdWx0aXBsaWVyID0gWzh8MXwyfC4uLnw2fDddCisgICAgICAgIFZMRDEgICAgcU11bHRpcGxpZXIsIFtwTXVsdFRhYmxlXSEgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTSEwgICAgZExlZnREaWZmNjQsIGRMZWZ0RGlmZjY0LCAjMTYKKyAgICAgICAgVkVYVCAgICBkRGlmZkxlZnQxLCBkTGVmdERpZmYxLCBkTGVmdDE1bWludXMwLCAjMSAgICAgCisgICAgICAgIAorICAgICAgICBWTVVMTCAgIHFILGREaWZmQWJvdmUwLCBkTXVsdGlwbGllcjAgICAgICAgICAgICAgICAgCisgICAgICAgIFZNVUxMICAgcVYsZERpZmZMZWZ0MCwgIGRNdWx0aXBsaWVyMCAgICAgICAgICAgICAgICAKKyAgICAgICAgVk1MQUwgICBxSCxkRGlmZkFib3ZlMSwgZE11bHRpcGxpZXIxIAorICAgICAgICBWTUxBTCAgIHFWLGREaWZmTGVmdDEsICBkTXVsdGlwbGllcjEKKyAgICAgICAgCisgICAgICAgIFZQQUREICAgZEhWMDAsZEgxLGRIMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWUEFERCAgIGRIVjAxLGRWMSxkVjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICBxSFYsIHFIVjAKKyAgICAgICAgVlNITCAgICBxSFYxLHFIViwjMgorICAgICAgICBWQUREICAgIHFIVixxSFYscUhWMSAKKyAgICAgICAgCisgICAgICAgIDsvLyBIViA9IFtjID0gKCg1KlYrMzIpPj42KSB8IGIgPSAoKDUqSCszMik+PjYpXQorICAgICAgICBWUlNIUiAgIHFIVixxSFYsIzYKKyAgICAgICAgCisgICAgICAgIDsvLyBIVjEgPSBbYyo3fGIqN10KKyAgICAgICAgVlNITCAgICBxSFYxLHFIViwjMworICAgICAgICBWU1VCICAgIHFIVjEscUhWMSxxSFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE11bHRpcGxpZXIxID0gWzB8MXwyfC4uLnw3XQorICAgICAgICBWTEQxICAgIHFNdWx0aXBsaWVyMCwgW3BNdWx0VGFibGVdISAgICAKKyAgICAgICAgVkRVUCAgICBxQiwgZEhWMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkRVUCAgICBxQywgZEhWMSAKKyAgICAgICAgCisgICAgICAgIFZBRERMICAgcUEsZEFib3ZlMSxkTGVmdDEKKyAgICAgICAgVlNITCAgICBxQSxxQSwgIzQKKyAgICAgICAgVkRVUCAgICBxQSxkQTFbM10gIAorICAgICAgICBWQUREICAgIGRCUGx1c0NNdWx0NywgZEhWMTAsIGRIVjExCisgICAgICAgIAorICAgICAgICA7Ly8gTXVsdGlwbGllcjEgPSBbOHw5fDEwfC4uLnwxNV0KKyAgICAgICAgVkxEMSAgICBxTXVsdGlwbGllcjEsIFtwTXVsdFRhYmxlXQorICAgICAgICA7Ly8gQ29uc3QgPSBhIC0gNyooYitjKQorICAgICAgICBWRFVQICAgIHFDb25zdCwgZEJQbHVzQ011bHQ3UzE2WzBdCisgICAgICAgIFZTVUIgICAgcUNvbnN0LCBxQSwgcUNvbnN0CisgICAgICAgIAorICAgICAgICA7Ly8gQjAgPSBbMCpifDEqYnwyKmJ8MypifC4uLi4uLnw3KmJdCisgICAgICAgIFZNVUwgICAgcUIwLHFCLHFNdWx0aXBsaWVyMAorICAgICAgICAKKyAgICAgICAgOy8vIEIwID0gWzgqYnw5KmJ8MTAqYnwxMSpifC4uLi58MTUqYl0KKyAgICAgICAgVk1VTCAgICBxQjEscUIscU11bHRpcGxpZXIxCisgICAgICAgIAorICAgICAgICBWQUREICAgIHFTdW0wLCBxQjAsIHFDb25zdAorICAgICAgICBWQUREICAgIHFTdW0xLCBxQjEsIHFDb25zdCAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9vcHMgZm9yIDE2IHRpbWVzCitMb29wUGxhbmUgICAgICAgCisgICAgICAgIDsvLyAoYip4ICsgYyp5ICsgQyk+PjUKKyAgICAgICAgVlFSU0hSVU4gZE91dDAsIHFTdW0wLCM1CisgICAgICAgIFZRUlNIUlVOIGRPdXQxLCBxU3VtMSwjNSAgICAgIAorICAgICAgICBTVUJTICAgICB5LCB5LCAjMQorICAgICAgICBWU1QxICAgICBxT3V0LFtwRHN0XSxkc3RTdGVwCisgICAgICAgIFZBREQgICAgIHFTdW0wLHFTdW0wLHFDIAorICAgICAgICBWQUREICAgICBxU3VtMSxxU3VtMSxxQyAKKyAgICAgICAgQk5FICAgICAgTG9vcFBsYW5lCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgICAgICAgICAgCisgICAgICAgIEVORAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IGVuZHMKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5ZWI4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKQEAgLTAsMCArMSw1MzEgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQorICAgICAgICAgCisgICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKKyAgICBEQ0QgIE9NWF9WQ180eDRfVkVSVCwgICAgIE9NWF9WQ180eDRfSE9SIAorICAgIERDRCAgT01YX1ZDXzR4NF9EQywgICAgICAgT01YX1ZDXzR4NF9ESUFHX0RMCisgICAgRENEICBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCisgICAgRENEICBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCisgICAgRENEICBPTVhfVkNfNHg0X0hVICAgCisgICAgCisgICAgICAgIAorICAgICAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JldHVybiAgICAgICAgICBSTiAwCitwVGFibGUgICAgICAgICAgUk4gOAorcGMgICAgICAgICAgICAgIFJOIDE1CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCitwRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKK2xlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2F2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcERzdDEgICAgICAgICAgIFJOIDEgCitwRHN0MiAgICAgICAgICAgUk4gNCAKK3BEc3QzICAgICAgICAgICBSTiA2IAorCitwU3JjVG1wICAgICAgICAgUk4gOQorc3JjU3RlcCAgICAgICAgIFJOIDEwCitwRHN0VG1wICAgICAgICAgUk4gMTEKK2RzdGVwICAgICAgICAgICBSTiAxMgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gTmVvbiByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy8vIE9NWF9WQ19DSFJPTUFfVkVSVAorZEFib3ZlVTMyICAgICAgIEROICBEMC5VMzIKKworOy8vIE9NWF9WQ19DSFJPTUFfSE9SCitkTGVmdFZhbDAgICAgICAgRE4gIEQwLjgKK2RMZWZ0VmFsMSAgICAgICBETiAgRDEuOAorZExlZnRWYWwyICAgICAgIEROICBEMi44CitkTGVmdFZhbDMgICAgICAgRE4gIEQzLjgKK2RMZWZ0VmFsMFUzMiAgICBETiAgRDAuVTMyCitkTGVmdFZhbDFVMzIgICAgRE4gIEQxLlUzMgorZExlZnRWYWwyVTMyICAgIEROICBEMi5VMzIKK2RMZWZ0VmFsM1UzMiAgICBETiAgRDMuVTMyCisKKzsvLyBPTVhfVkNfNHg0X0RDCitkTGVmdFZhbCAgICAgICAgRE4gIEQwLlU4CitkTGVmdFZhbFUzMiAgICAgRE4gIEQwLlUzMgorZFN1bUFib3ZlTGVmdFUxNiAgRE4gIEQxLlUxNgorZFN1bUFib3ZlTGVmdFUzMiAgRE4gIEQxLlUzMgorZFN1bUFib3ZlTGVmdFU2NCAgRE4gIEQxLlU2NAorZFN1bUFib3ZlTGVmdFU4IEROICBEMS5VOAorZFN1bSAgICAgICAgICAgIEROICBEMC5VOAorCitkU3VtTGVmdFZhbFUxNiAgRE4gIEQxLlUxNgorZFN1bUxlZnRWYWxVMzIgIEROICBEMS5VMzIKK2RTdW1MZWZ0VmFsVTY0ICBETiAgRDEuVTY0CitkU3VtTGVmdFZhbFU4ICAgRE4gIEQxLlU4CisKK2RBYm92ZVZhbCAgICAgICBETiAgRDAuVTgKK2RTdW1BYm92ZVZhbFUxNiAgRE4gIEQxLlUxNgorZFN1bUFib3ZlVmFsVTMyICBETiAgRDEuVTMyCitkU3VtQWJvdmVWYWxVNjQgIEROICBEMS5VNjQKK2RTdW1BYm92ZVZhbFU4ICAgRE4gIEQxLlU4CitkQ29uc3QxMjhVOCAgICAgRE4gIEQwLlU4CisKKworOy8vT01YX1ZDXzR4NF9ESUFHX0RMCisKK2RBYm92ZSAgICAgICAgICBETiAgRDAuVTgKK2RVNyAgICAgICAgICAgICBETiAgRDIuVTgKK2RVMyAgICAgICAgICAgICBETiAgRDIuVTgKK2RBYm92ZTAgICAgICAgICBETiAgRDMuVTgKK2RBYm92ZTEgICAgICAgICBETiAgRDQuVTgKK2RBYm92ZTIgICAgICAgICBETiAgRDUuVTgKK2RUbXAgICAgICAgICAgICBETiAgRDYuVTgKK2RUbXAwICAgICAgICAgICBETiAgRDcuVTgKK2RUbXAxICAgICAgICAgICBETiAgRDguVTgKK2RUbXAyICAgICAgICAgICAgRE4gIEQ5LlU4CitkVG1wMyAgICAgICAgICAgIEROICBEMTAuVTgKK2RUbXBVMzIgICAgICAgICBETiAgRDYuVTMyCisKKworOy8vT01YX1ZDXzR4NF9ESUFHX0RSCitkTGVmdCAgICAgICAgICAgRE4gIEQxLlU4CitkVUwgICAgICAgICAgICAgRE4gIEQyLlU4CisKKzsvL09NWF9WQ180eDRfVlIKK2RMZWZ0MCAgICAgICAgICBETiAgRDEuVTgKK2RMZWZ0MSAgICAgICAgICBETiAgRDIuVTgKK2RFdmVuMCAgICAgICAgICBETiAgRDMuVTgKK2RFdmVuMSAgICAgICAgICBETiAgRDQuVTgKK2RFdmVuMiAgICAgICAgICBETiAgRDUuVTgKK2RPZGQwICAgICAgICAgICBETiAgRDYuVTgKK2RPZGQxICAgICAgICAgICBETiAgRDExLlU4CitkT2RkMiAgICAgICAgICAgRE4gIEQxMi5VOAorZFRtcDNVMzIgICAgICAgIEROICBEMTAuVTMyICAgIAorZFRtcDJVMzIgICAgICAgIEROICBEOS5VMzIKKworCis7Ly9PTVhfVkNfNHg0X0hECitkVG1wMVU2NCAgICAgICAgRE4gIEQ4LlU2NAorZFRtcDBVNjQgICAgICAgIEROICBENy5VNjQKK2RUbXBVNjQgICAgICAgICBETiAgRDYuVTY0CitkVG1wVTMyICAgICAgICAgRE4gIEQ2LlUzMgorZFRtcDFVMzIgICAgICAgIEROICBEOC5VMzIKKworOy8vT01YX1ZDXzR4NF9IVQorZEwzICAgICAgICAgICAgIEROICBEMi5VOAorZExlZnRIVTAgICAgICAgIEROICBEMy5VOAorZExlZnRIVTEgICAgICAgIEROICBENC5VOAorZExlZnRIVTIgICAgICAgIEROICBENS5VOAorZFRtcDBVMzIgICAgICAgIEROICBENy5VMzIKKworCisKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgcjEyLGQxMgorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0ICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSRCAgIHByZWRNb2RlLGF2YWlsYWJpbGl0eSxQcmVkTW9kZSAgICAgOy8vIEFyZyBwcmVkTW9kZSAmIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSRCAgIGxlZnRTdGVwLGRzdFN0ZXAsTGVmdFN0ZXAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCAmIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQorCisKK09NWF9WQ180eDRfSE9SCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwwW119LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMVtdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDJbXX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwzW119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkTGVmdFZhbDBVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRMZWZ0VmFsMVUzMlswXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZExlZnRWYWwyVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkTGVmdFZhbDNVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisgICAgICAgIAorT01YX1ZDXzR4NF9WRVJUCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlCisgICAgICAgIFZMRDEgICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXQorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICAKK0RDUHJlZGljdDR4NFZlcnRTdG9yZSAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0XSxkc3RlcAorICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RUbXBdLGRzdGVwCisgICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdF0KKyAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0VG1wXQorCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorCitPTVhfVkNfNHg0X0RDCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAorICAgICAgICBCRVEgICAgIERDUHJlZGljdDR4NExlZnROb3RBdmFpbGFibGUKKworICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKKyAgICAgICAgQkVRICAgICBEQ1ByZWRpY3Q0eDRMZWZ0T25seUF2YWlsYWJsZQorCisgICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgYWxzbworICAgICAgICBWTEQxICAgICBkTGVmdFZhbFUzMlsxXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDNdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMgfCAwKzFdIHwgcFNyY0xlZnRbMiszIHwgMCsxXV0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVMzIsIGRTdW1BYm92ZUxlZnRVMTYgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMrMCsxXSB8IHBTcmNMZWZ0WzIrMyswKzFdXSAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlTGVmdFU2NCwgZFN1bUFib3ZlTGVmdFUzMiAgICAgICAgIDsvLyBbcFNyY0Fib3ZlWzIrMyswKzFdICsgcFNyY0xlZnRbMiszKzArMV1dICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlTGVmdFU2NCxkU3VtQWJvdmVMZWZ0VTY0LCMzICAgICAgIDsvLyBTdW0gPSAoU3VtICsgNCkgPj4gMworICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1BYm92ZUxlZnRVOFswXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAKKyAgICAgICAgCitEQ1ByZWRpY3Q0eDRMZWZ0T25seUF2YWlsYWJsZQorCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBbIFhYIHwgcFNyY0xlZnRbMiszIHwgMCsxXV0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gWyBYWFhYIHwgcFNyY0xlZnRbMiszKzArMV1dIAorICAgICAgICAKKyAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1MZWZ0VmFsVThbMF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgIAorICAgICAgICAKK0RDUHJlZGljdDR4NExlZnROb3RBdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCisgICAgICAgIEJFUSAgICAgRENQcmVkaWN0NHg0Tm9uZUF2YWlsYWJsZQorCisgICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgCisgICAgICAgIFZMRDEgICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gM10gIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIFsgWFggfCBwU3JjQWJvdmVbMiszIHwgMCsxXV0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gWyBYWFhYIHwgcFNyY0Fib3ZlWzIrMyswKzFdXSAKKyAgICAgICAgCisgICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtQWJvdmVWYWxVOFswXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAgCisgICAgICAgIAorRENQcmVkaWN0NHg0Tm9uZUF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTU9WICAgICBkQ29uc3QxMjhVOCwjMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDB4ODA4MDgwODA4MDgwODA4MCBpZihjb3VudCA9PSAwKQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKK09NWF9WQ180eDRfRElBR19ETAorICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKKyAgICAgICAgQkVRICAgICBEaWFnRExVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCisgICAgICAgCisgICAgICAgIFZMRDEgICAgZEFib3ZlMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTd8VTZ8VTV8VTR8VTN8VTJ8VTF8VTBdIAorICAgICAgICBWRFVQICAgIGRVNywgZEFib3ZlMFs3XSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU3fFU3fFU3fFU3fFU3fFU3XQorICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZTAsIGRVNywgIzEgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU2fFU1fFU0fFUzfFUyfFUxXQorICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZTAsIGRVNywgIzIgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU3fFU2fFU1fFU0fFUzfFUyXSAKKyAgICAgICAgQiAgICAgICBEaWFnRExQcmVkaWN0NHg0U3RvcmUgICAgICAgICAKKyAgICAgICAKK0RpYWdETFVwcGVyUmlnaHROb3RBdmFpbGFibGUKKyAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgOy8vIFtVM3xVMnxVMXxVMHwtfC18LXwtXSAKKyAgICAgICAgVkRVUCAgICBkVTMsIGRBYm92ZVs3XSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVM10KKworICAgICAgICBWRVhUICAgIGRBYm92ZTAsIGRBYm92ZSwgZFUzLCAjNCAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUyIFUxIFUwXQorICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZSwgZFUzLCAjNSAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUyIFUxXQorICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZSwgZFUzLCAjNiAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUyXQorICAgICAgIAorRGlhZ0RMUHJlZGljdDR4NFN0b3JlICAKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcCwgZEFib3ZlMCwgZEFib3ZlMgorICAgICAgICBWUkhBREQgIGRUbXAsIGRUbXAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKKyAgICAgICAgCisKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKyAgICAgICAgCisKK09NWF9WQ180eDRfRElBR19EUgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFUwLFUxLFUyLFUzCisgICAgICAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICA7Ly8gW1h8WHxYfFh8VTN8VTJ8VTF8VTBdCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFVMLEwwLEwxLEwyLEwzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdCA9IFtVTHxMMHxMMXxMMnxMM3xYfFh8WF0gICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHBEc3QxLHBEc3QsZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUwLGRMZWZ0LGRBYm92ZSwjMyAgICAgICAgICAgICAgICAgOy8vIFtVMnxVMXxVMHxVTHxMMHxMMXxMMnxMM10gICAKKyAgICAgICAgQUREICAgICBwRHN0MixwRHN0MSxkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZEFib3ZlMSxkTGVmdCxkQWJvdmUsIzQgICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8VUx8TDB8TDF8TDJdICAgCisgICAgICAgIEFERCAgICAgcERzdDMscERzdDIsZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRBYm92ZTIsZExlZnQsZEFib3ZlLCM1ICAgICAgICAgICAgICAgICA7Ly8gWyBYfFUzfFUyfFUxfFUwfFVMfEwwfEwxXSAgIAorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wLCBkQWJvdmUwLCBkQWJvdmUyCisgICAgICAgIFZSSEFERCAgZFRtcCwgZFRtcCwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdDNdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzBdLFsxXSxbMl0sWzNdIEAgcERzdDMKKyAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3QyXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFsxXSxbMl0sWzNdLFs0XSBAIHBEc3QyCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0MV0gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMl0sWzNdLFs0XSxbNV0gQCBwRHN0MQorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzNdLFs0XSxbNV0sWzZdIEAgcERzdAorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKworT01YX1ZDXzR4NF9WUgorCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVTCxVMCxVMSxVMixVMworICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXQorICAgICAgICBWTEQxICAgIGRBYm92ZVs3XSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgICA7Ly8gW1VMfFh8WHxYfFUzfFUyfFUxfFUwXQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgTDAsTDEsTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0MCA9IFtMMHxMMnxYfFh8WHxYfFh8WF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0MSA9IFtMMXwgWHxYfFh8WHxYfFh8WF0gICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0MFs3XX0sW3BTcmNMZWZ0XSxsZWZ0U3RlcCAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdDFbN119LFtwU3JjTGVmdF0sbGVmdFN0ZXAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnQwWzZdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkT2RkMixkQWJvdmUsZEFib3ZlLCM3ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgVUwgXQorICAgICAgICBWRVhUICAgIGRFdmVuMCxkTGVmdDAsZE9kZDIsIzYgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMSBVMCBVTCBMMCBMMiBdCisgICAgICAgIFZFWFQgICAgZEV2ZW4xLGRMZWZ0MSxkT2RkMiwjNyAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUyIFUxIFUwIFVMIEwxIF0KKyAgICAgICAgVkVYVCAgICBkRXZlbjIsZExlZnQwLGRBYm92ZSwjNyAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgTDAgXQorICAgICAgICBWRVhUICAgIGRPZGQwLGRMZWZ0MSxkQWJvdmUsIzcgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMyBVMiBVMSBVMCBMMSBdCisgICAgICAgIFZFWFQgICAgZE9kZDEsZExlZnQwLGRPZGQyLCM3ICAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUyIFUxIFUwIFVMIEwwIF0KKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcDEsIGRPZGQwLCBkT2RkMgorICAgICAgICBWUkhBREQgIGRUbXAxLCBkVG1wMSwgZE9kZDEgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCA5IDcgNSAzIDEgXQorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wMCwgZEV2ZW4wLCBkRXZlbjIKKyAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRFdmVuMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggOCA2IDQgMiAwIF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWRVhUICAgIGRUbXAzLGRUbXAxLGRUbXAxLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCB4IDkgNyA1IDMgXSAKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkVG1wMixkVG1wMCxkVG1wMCwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggeCA4IDYgNCAyIF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXAzVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzldLFs3XSxbNV0sWzNdCisgICAgICAgIFZTVDEgICAgZFRtcDJVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBUbXBbOF0sWzZdLFs0XSxbMl0KKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs3XSxbNV0sWzNdLFsxXQorICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzZdLFs0XSxbMl0sWzBdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorICAgICAgICAKK09NWF9WQ180eDRfSEQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVMCxVMSxVMixVMworICAgICAgICBWTEQxICAgIGRBYm92ZSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly9kQWJvdmVMZWZ0VmFsID0gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVUwsTDAsTDEsTDIsTDMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0ID0gW1VMfEwwfEwxfEwyfEwzfFh8WHxYXSAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRbN119LFtwU3JjQWJvdmVMZWZ0XSAgIAorICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICBWRVhUICAgIGRBYm92ZTAsZExlZnQsZEFib3ZlLCMzICAgICAgICAgICAgICAgICA7Ly8gWyBVMnxVMXxVMHxVTHxMMHxMMXxMMnxMMyBdICAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRMZWZ0LGRBYm92ZSwjMiAgICAgICAgICAgICAgICAgOy8vIFsgVTF8VTB8VUx8TDB8TDF8TDJ8TDN8WCBdICAgCisgICAgICAgIFZFWFQgICAgZEFib3ZlMixkTGVmdCxkQWJvdmUsIzEgICAgICAgICAgICAgICAgIDsvLyBbIFUwfFVMfEwwfEwxfEwyfEwzfFh8WCBdICAgICAKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcDAsIGRBYm92ZTAsIGRBYm92ZTIKKyAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgMCB8IDEgfCAyIHwgNCB8IDYgfCA4IHwgWCB8IFggXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZSSEFERCAgZFRtcDEsIGRBYm92ZTEsIGRBYm92ZTAgICAgICAgICAgICAgICAgIDsvLyAoYStiKzEpPj4xCisgICAgICAgIFZTSEwgICAgZFRtcDFVNjQsZFRtcDFVNjQsIzI0ICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDN8NXwgNyB8OSB8IFggfCBYIHwgWCB8IFggXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTSEwgICAgZFRtcFU2NCxkVG1wMFU2NCwjMTYgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDJ8NHw2fDh8IFggfCBYIHwgWCB8IFggXQorICAgICAgICBWWklQICAgIGRUbXAxLGRUbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcCA9IFsgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgOCB8IDkgXQorICAgICAgICBWRVhUICAgIGRUbXAwLGRUbXAwLGRUbXAwLCM2ICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAgWHwgWHwgWHwgWHwgWHwgWHwgMCB8IDEgXQorICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAsZFRtcDAsIzIgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHw3IF0KKyAgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMV0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzB8MXwyfDNdCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlsxXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzJ8M3w0fDVdCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzR8NXw2fDddCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzZ8N3w4fDldCisgICAgICAgIAorICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorICAgICAgICAKK09NWF9WQ180eDRfVkwKKworICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKKyAgICAgICAgQkVRICAgICBEaWFnVkxVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCisgICAgICAgCisgICAgICAgIFZMRDEgICAgZEFib3ZlMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXSAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRBYm92ZTAsZEFib3ZlMCwjMSAgICAgICAgICAgICAgIDsvLyBbIFh8VTd8VTZ8VTV8VTR8VTN8VTJ8VTFdCisgICAgICAgIFZFWFQgICAgZEFib3ZlMixkQWJvdmUxLGRBYm92ZTEsIzEgICAgICAgICAgICAgICA7Ly8gWyBYfCBYfFU3fFU2fFU1fFU0fFUzfFUyXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICBEaWFnVkxQcmVkaWN0NHg0U3RvcmUgICAgICAgICAKKyAgICAgICAKK0RpYWdWTFVwcGVyUmlnaHROb3RBdmFpbGFibGUKKyAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8LXwtfC18LV0gCisgICAgICAgIFZEVVAgICAgZFUzLCBkQWJvdmVbN10gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUzXQorCisgICAgICAgIFZFWFQgICAgZEFib3ZlMCwgZEFib3ZlLCBkVTMsICM0ICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUyIFUxIFUwXQorICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZSwgZFUzLCAjNSAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMiBVMV0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUsIGRVMywgIzYgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTJdCisgICAgICAgCitEaWFnVkxQcmVkaWN0NHg0U3RvcmUgIAorICAgICAgICAKKyAgICAgICAgVlJIQUREICBkVG1wMCwgZEFib3ZlMSwgZEFib3ZlMCAgICAgICAgICAgICAgICAgOy8vIChhK2IrMSk+PjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgOHwgNnwgNHwgMnwgMCBdCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAzLCBkQWJvdmUwLCBkQWJvdmUyCisgICAgICAgIFZSSEFERCAgZFRtcDMsIGRUbXAzLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCA5fCA3fCA1fCAzfCAxIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAwLGRUbXAwLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCBYfCA4fCA2fCA0fCAyIF0KKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkVG1wMixkVG1wMyxkVG1wMSwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgWHwgOXwgN3wgNXwgMyBdCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzZdLFs0XSxbMl0sWzBdCisgICAgICAgIFZTVDEgICAgZFRtcDNVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBUbXBbN10sWzVdLFszXSxbMV0KKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFs4XSxbNl0sWzRdLFsyXQorICAgICAgICBWU1QxICAgIGRUbXAyVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzldLFs3XSxbNV0sWzNdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorICAgICAgICAKK09NWF9WQ180eDRfSFUKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKworICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwyfEwxfEwwfFh8WHxYfFhdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzRdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgVkRVUCAgICBkTDMsZExlZnRbN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMM10KKyAgICAgICAgCisgICAgICAgIFZFWFQgICAgZExlZnRIVTAsZExlZnQsZEwzLCM0ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDJ8TDF8TDBdCisgICAgICAgIFZFWFQgICAgZExlZnRIVTEsZExlZnQsZEwzLCM1ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDJ8TDFdCisgICAgICAgIFZFWFQgICAgZExlZnRIVTIsZExlZnQsZEwzLCM2ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDJdCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAwLCBkTGVmdEhVMCwgZExlZnRIVTIKKyAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRMZWZ0SFUxICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgTDMgfCBMMyB8IEwzIHwgTDMgfCBMMyB8IDUgfCAzIHwgMSBdCisgICAgICAgIAorICAgICAgICBWUkhBREQgIGRUbXAxLCBkTGVmdEhVMSwgZExlZnRIVTAgICAgICAgICAgICAgICA7Ly8gKGErYisxKT4+MSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBUbXBbIEwzIHwgTDMgfCBMMyB8IEwzIHwgTDMgfCA0IHwgMiB8IDAgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZaSVAgICAgZFRtcDEsZFRtcDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wMSA9IFRtcFs3fCA2fCA1fCA0fCAzfCAyfCAxfCAwXSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wMCA9IFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMM10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdFN0ZXAgICAgICAgICAgICAgIDsvLyBbM3wyfDF8MF0gCisgICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcDEsZFRtcDEsIzIKKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0U3RlcCAgICAgICAgICAgICAgOy8vIFs1fDR8M3wyXSAKKyAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wMSxkVG1wMSwjMgorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RTdGVwICAgICAgICAgICAgICA7Ly8gWzd8Nnw1fDRdICAKKyAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFs5fDh8N3w2XSAKKyAgICAgICAgCisgICAgICAgIAorRXhpdFByZWRpY3Q0eDQKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisKKyAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBFTkQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IGVuZHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMzk0MzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpAQCAtMCwwICsxLDE0MCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgCisKKyAgICAKKyAgICAKKyAgICBJRiBDb3J0ZXhBOAorCis7Ly8gQVJNIFJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BwU3JjICAgICAgIFJOIDAKK3BEc3QgICAgICAgIFJOIDEKK1FQICAgICAgICAgIFJOIDIKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlIGZvciBVbnBhY2syeDIgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyYyAgICAgICAgUk4gOQorVmFsdWUgICAgICAgUk4gNAorVmFsdWUyICAgICAgUk4gNQorRmxhZyAgICAgICAgUk4gNgorc3RyT2Zmc2V0ICAgUk4gNworY3N0T2Zmc2V0ICAgUk4gOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityMHcwICAgICAgICBSTiAgMworcjB3MSAgICAgICAgUk4gIDQKKworYzB3MCAgICAgICAgUk4gIDUKK2MxdzAgICAgICAgIFJOICA2CisKK3JldHVybiAgICAgIFJOICAwCitwUVBEaXZUYWJsZSBSTiAgNQorcFFQTW9kVGFibGUgICAgUk4gIDYKK1NoaWZ0ICAgICAgICBSTiAgOQorU2NhbGUgICAgICAgIFJOICAyCisKKworCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworZFplcm8gICAgICAgRE4gIEQwLlUxNgorZEludlRyQ29lZmYgRE4gIEQwLlMxNgorZFNjYWxlICAgICAgRE4gIEQxLlMxNgorcURxbnRDb2VmZiAgUU4gIFExLlMzMgorZERxbnRDb2VmZiAgRE4gIEQyLlMxNgorCisKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIHI5CisgICAgICAgIAorICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCisgICAgICAgIFZNT1YgICAgZFplcm8sICMwCisgICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkWmVybyxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMCAgIAorICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgorCisKK3VucGFja0xvb3AKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCisgICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MKKyAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKKyAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKKyAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQorICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+CisgICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly9JbnZUcmFuc2Zvcm1EQzJ4MjogSW5saW5lZCAoSW1wbGVtZW50ZWQgaW4gQVJNIFY2KQorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcERzdCwge3IwdzAsIHIwdzF9ICAgICAgICAgICAgICAgICAgOy8vIHIwdzAgPSB8YzF8YzB8ICYgcjB3MSA9IHxjM3xjMnwKKworICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgOy8vIFFQIERpdmlzaW9uIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIExEUiAgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIAorICAgICAgICBTQUREU1VCWCByMHcwLCByMHcwLCAgcjB3MCAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMDArYzAxLCBjMDAtYzAxIF0KKyAgICAgICAgU0FERFNVQlggcjB3MSwgcjB3MSwgIHIwdzEgICAgICAgICAgICAgICAgICAgOy8vIFsgYzEwK2MxMSwgYzEwLWMxMSBdCisgICAgICAgIAorICAgICAgICBMRFJTQiAgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KKyAgICAgICAgTERSU0IgICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNjYWxlID0gcFFQTW9kVGFibGVbUVBdCisgICAgICAgIAorICAgICAgICBTQUREMTYgICBjMHcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDArZDEwLCBkMDErZDExIF0KKyAgICAgICAgU1NVQjE2ICAgYzF3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwLWQxMCwgZDAxLWQxMSBdCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvL0RlcXVhbnRDaHJvbWFEQzJ4MjogSW5saW5lZCAoTmVvbiBJbXBsZW1lbnRhdGlvbikKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgTFNMICAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKKyAgICAgICAgVk1PViAgICAgZEludlRyQ29lZmYsIGMwdzAsIGMxdzAgIAorICAgICAgICBWUkVWMzIgICBkSW52VHJDb2VmZixkSW52VHJDb2VmZiAgCisgICAgICAgIFZEVVAgICAgIGRTY2FsZSxTY2FsZSAKKyAgICAgICAgCisgICAgICAgIFZNVUxMICAgIHFEcW50Q29lZmYsZEludlRyQ29lZmYsZFNjYWxlCisgICAgICAgIFZTSFJOICAgIGREcW50Q29lZmYscURxbnRDb2VmZiwjMQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgIGREcW50Q29lZmYsW3BEc3RdICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yaW5nIGFsbCB0aGUgY29lZmZpY2llbnRzIGF0IG9uY2UKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgOy8vIENvcnRleEE4CisgICAgCisgICAgCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI1Mjk5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpAQCAtMCwwICsxLDI2NCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKzsvLyAKKzsvLyAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gSW1wb3J0L0V4cG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20vdG8gb3RoZXIgZmlsZXMKKzsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQorICAgICAgICAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIAorCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBDb3J0ZXhBOAorICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwRGF0YSAgICAgICAgICAgICAgIFJOICAwCitRUCAgICAgICAgICAgICAgICAgIFJOICAxICAgIAorCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCisKKzsvLyBBUk0gUmVnaXN0ZXJzCisKK3BRUERpdlRhYmxlICAgICAgICAgUk4gIDIKK3BRUE1vZFRhYmxlICAgICAgICAgUk4gIDMKK1NoaWZ0ICAgICAgICAgICAgICAgUk4gIDQKK1NjYWxlICAgICAgICAgICAgICAgUk4gIDUKKworOy8vIE5FT04gUmVnaXN0ZXJzCisKKzsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCitkSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RJbjEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZEluMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYgICAKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2RSb3dTdW0xICAgICAgICAgICAgRE4gIEQ0LlMxNgorZFJvd1N1bTIgICAgICAgICAgICBETiAgRDUuUzE2CitkUm93RGlmZjEgICAgICAgICAgIEROICBENi5TMTYKK2RSb3dEaWZmMiAgICAgICAgICAgRE4gIEQ3LlMxNgorCis7Ly8gUm93IG9wZXJhdGVkIHBpeGVscworZFJvd09wMCAgICAgICAgICAgICBETiAgRDAuUzE2CitkUm93T3AxICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RSb3dPcDIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZFJvd09wMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2CitxUm93T3AwMSAgICAgICAgICAgIFFOICBRMC4zMgorcVJvd09wMjMgICAgICAgICAgICBRTiAgUTEuMzIKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2RDb2xTdW0xICAgICAgICAgICAgRE4gIEQ0LlMxNgorZENvbFN1bTIgICAgICAgICAgICBETiAgRDUuUzE2CitkQ29sRGlmZjEgICAgICAgICAgIEROICBENi5TMTYKK2RDb2xEaWZmMiAgICAgICAgICAgRE4gIEQ3LlMxNgorCis7Ly8gQ29sb3VtbiBvcGVyYXRlZCBwaXhlbHMKK2RDb2xPcDAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZENvbE9wMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkQ29sT3AyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RDb2xPcDMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorCis7Ly8gVGVtcG9yYXJ5IHNjcmF0Y2ggdmFyYWlibGVzCisKK2RTY2FsZSAgICAgICAgICAgICAgRE4gIEQ1LlMxNgorcVJvdW5kMCAgICAgICAgICAgICBRTiAgUTMuUzMyCitxUm91bmQxICAgICAgICAgICAgIFFOICBRNC5TMzIKK3FSb3VuZDIgICAgICAgICAgICAgUU4gIFE1LlMzMgorcVJvdW5kMyAgICAgICAgICAgICBRTiAgUTYuUzMyCisKKzsvLyBJbnZUcmFuc2Zvcm1lZCBhbmQgRGVxdWFudGl6ZWQgcGl4ZWxzCitkT3V0MCAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RPdXQxICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RPdXQyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RPdXQzICAgICAgICAgICAgICAgIEROICBEMy5TMTYKKworICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0LHI1LGQxMworICAgIAorICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCisgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDQgRC1yZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCisgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMgaW4gVHJhbnNwb3NlZCBmb3JtCisgICAgICAgIAorICAgICAgICBWTEQ0ICAgIHtkSW4wLGRJbjEsZEluMixkSW4zfSxbcERhdGFdCisgICAgICAgIExEUiAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICBMRFIgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBTY2FsZSBmYWN0b3IgY2FsY3VsYXRpb24gaXMgZG9uZSB1c2luZyBBUk0gaW5zdHJ1Y3Rpb25zCisgICAgICAgIDsvLyBJbnRlcmxlYXZlZCB3aXRoIE5FT04gaW5zdHJ1Y3Rpb25zIGlub3JkZXIgdG8gRHVhbCBpc3N1ZQorICAgICAgICAKKyAgICAgICAgVkFERCAgICBkUm93U3VtMSxkSW4wLGRJbjEKKyAgICAgICAgVkFERCAgICBkUm93U3VtMixkSW4yLGRJbjMKKyAgICAgICAgVlNVQiAgICBkUm93RGlmZjEsZEluMCxkSW4xCisgICAgICAgIExEUlNCICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQorICAgICAgICBWU1VCICAgIGRSb3dEaWZmMixkSW4yLGRJbjMKKyAgICAgICAgTERSU0IgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gQVJNIENPREU6IFNjYWxlID0gcFFQTW9kVGFibGVbUVBdIAorICAgICAgICBWQUREICAgIGRSb3dPcDAsZFJvd1N1bTEsZFJvd1N1bTIKKyAgICAgICAgVlNVQiAgICBkUm93T3AxLGRSb3dTdW0xLGRSb3dTdW0yCisgICAgICAgIFZTVUIgICAgZFJvd09wMixkUm93RGlmZjEsZFJvd0RpZmYyCisgICAgICAgIExTTCAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0CisgICAgICAgIFZBREQgICAgZFJvd09wMyxkUm93RGlmZjEsZFJvd0RpZmYyCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4CisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWVFJOICAgIGRSb3dPcDAsZFJvd09wMQorICAgICAgICBWVFJOICAgIGRSb3dPcDIsZFJvd09wMworICAgICAgICBWVFJOICAgIHFSb3dPcDAxLHFSb3dPcDIzIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICBkQ29sU3VtMSxkUm93T3AwLGRSb3dPcDEKKyAgICAgICAgVkFERCAgICBkQ29sU3VtMixkUm93T3AyLGRSb3dPcDMKKyAgICAgICAgVlNVQiAgICBkQ29sRGlmZjEsZFJvd09wMCxkUm93T3AxCisgICAgICAgIFZTVUIgICAgZENvbERpZmYyLGRSb3dPcDIsZFJvd09wMworICAgICAgICBWQUREICAgIGRDb2xPcDAsZENvbFN1bTEsZENvbFN1bTIKKyAgICAgICAgVlNVQiAgICBkQ29sT3AxLGRDb2xTdW0xLGRDb2xTdW0yCisgICAgICAgIFZTVUIgICAgZENvbE9wMixkQ29sRGlmZjEsZENvbERpZmYyCisgICAgICAgIFZBREQgICAgZENvbE9wMyxkQ29sRGlmZjEsZENvbERpZmYyCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLworICAgICAgICA7Ly8gPERlcXVhbnRpemU+IGltcHJvdmVzIG9uIHRoZSBjLXJlZmVyZW5jZSBjb2RlCisgICAgICAgIDsvLyBCb3RoIHRoZSAgY2FzZXMgaS5lLiwgU2hpZnQ+PTAgYW5kIFNoaWZ0PDAgY2FzZXMgYXJlIGNvdmVyZWQgdG9nZXRoZXIKKyAgICAgICAgOy8vIFdlIGRvIG5vdCBzdWJ0cmFjdCAyIGZyb20gU2hpZnQgYXMgaW4gQyByZWZlcmVuY2UsIGluc3RlYWQgcGVyZm9ybSBhCisgICAgICAgIDsvLyBTY2FsZSA8PCBTaGlmdCBvbmNlIGluIHRoZSBiZWdpbm5pbmcgYW5kIGRvIGEgcmlnaHQgc2hpZnQgYnkgYSAKKyAgICAgICAgOy8vIGNvbnN0YW50IDIgYWZ0ZXIgdGhlIE11bHRpcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgUm91bmQgd291bGQgYmUgMiAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gQnkgZG9pbmcgdGhpcyB3ZSBhdmlvZCB0aGUgQnJhbmNoZXMgcmVxdWlyZWQgYW5kIGFsc28gCisgICAgICAgIDsvLyByZWR1Y2UgdGhlIGNvZGUgc2l6ZSBzdWJzdGFudGlhbGx5CisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgZFNjYWxlLCBTY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQVJNIC0+IE5FT04gIGNvcHkgJ3NjYWxlJyB0byB2ZWN0b3IKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBWTU9WICAgIHFSb3VuZDAsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB0aGUgUm91bmQgVmFsdWUgCisgICAgICAgIFZNT1YgICAgcVJvdW5kMSwjMgorICAgICAgICBWTU9WICAgIHFSb3VuZDIsIzIKKyAgICAgICAgVk1PViAgICBxUm91bmQzLCMyCisgICAgICAgIAorICAgICAgICBWTUxBTCAgIHFSb3VuZDAsZENvbE9wMCxkU2NhbGUgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbaV0gKiBTY2FsZSArIFJvdW5kIAorICAgICAgICBWTUxBTCAgIHFSb3VuZDEsZENvbE9wMSxkU2NhbGUKKyAgICAgICAgVk1MQUwgICBxUm91bmQyLGRDb2xPcDIsZFNjYWxlCisgICAgICAgIFZNTEFMICAgcVJvdW5kMyxkQ29sT3AzLGRTY2FsZQorICAgICAgICAKKyAgICAgICAgVlNIUk4gICBkT3V0MCxxUm91bmQwLCMyICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmlnaHQgc2hpZnQgYnkgMiAmIChPTVhfUzE2KVZhbHVlCisgICAgICAgIFZTSFJOICAgZE91dDEscVJvdW5kMSwjMgorICAgICAgICBWU0hSTiAgIGRPdXQyLHFSb3VuZDIsIzIKKyAgICAgICAgVlNIUk4gICBkT3V0MyxxUm91bmQzLCMyCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBTdG9yZSBhbGwgdGhlIDR4NCBwaXhlbHMKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlNUMSAge2RPdXQwLGRPdXQxLGRPdXQyLGRPdXQzfSwgW3BEYXRhXQorCisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQgICAgICAgIAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ09SVEVYQTggICAKKyAgICAgICAgCisKKworOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgorICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwcFNyYyAgICAgICAgICAgICAgIFJOICAwCitwRHN0ICAgICAgICAgICAgICAgIFJOICAxCitRUFIyICAgICAgICAgICAgICAgIFJOICAyCisKKzsvL091dHB1dCBSZWdpc3RlcnMKK3Jlc3VsdCAgICAgICAgICAgICAgUk4gIDAKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3BEc3RSNCAgICAgICAgICAgICAgUk4gIDQKK3BEc3RSMCAgICAgICAgICAgICAgUk4gIDAKK1FQUjEgICAgICAgICAgICAgICAgUk4gIDEKK1FQUjUgICAgICAgICAgICAgICAgUk4gIDUKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGIENvcnRleEE4CisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIscjUKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcERzdFI0LHBEc3QgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMQorICAgICAgICBNT1YgICAgIFFQUjUsUVBSMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjIKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBEc3RSMCxwRHN0UjQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIwCisgICAgICAgIE1PViAgICAgUVBSMSxRUFI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjEKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgIAorICAgIAorCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2EyZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCithcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIExEUiAgICAgIHI3LCA9MHg4MDgwODA4MAorICAgIExEUiAgICAgIHIxMixbcjIsIzBdCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBNVk4gICAgICByMTIscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTERSICAgICAgbHIsW3IyLHIzXQorICAgIE1WTiAgICAgIHIxMixyMTIKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKK2FybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgTERSICAgICAgcjcsID0weDgwODA4MDgwCisgICAgTERSICAgICAgcjQsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgTFNSICAgICAgcjEwLHIxMCwjMTYKKyAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjMTYKKyAgICBMU1IgICAgICByMTEscjExLCMxNgorICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICMxNgorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMRFIgICAgICByNCxbcjAsIzRdCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBNVk4gICAgICByMTIscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBMU1IgICAgICByMTAscjEwLCMxNgorICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICMxNgorICAgIExTUiAgICAgIHIxMSxyMTEsIzE2CisgICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzE2CisgICAgVUhTVUI4ICAgcjUscjEwLHIxMgorICAgIFVIU1VCOCAgIHI0LHIxMSxscgorICAgIEVPUiAgICAgIHI1LHI1LHI3CisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIEVPUiAgICAgIHI0LHI0LHI3CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBMRFIgICAgICByNywgPTB4ODA4MDgwODAKKyAgICBMRFIgICAgICByNCxbcjAsIzRdCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBNVk4gICAgICByMTIscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBMU1IgICAgICByMTAscjEwLCMyNAorICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICM4CisgICAgTFNSICAgICAgcjExLHIxMSwjMjQKKyAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjOAorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMRFIgICAgICByNCxbcjAsIzRdCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBNVk4gICAgICByMTIscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBMU1IgICAgICByMTAscjEwLCMyNAorICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICM4CisgICAgTFNSICAgICAgcjExLHIxMSwjMjQKKyAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjOAorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWVlMjIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKK2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZToKKyAgICBWTEQxLjMyICB7ZDE4WzBdfSxbcjVdIQorICAgIFZTVUJMLlU4IHExMSxkNSxkOQorICAgIFZNT1YgICAgIGQyOCxkMTgKKyAgICBWU1VCTC5VOCBxMTAsZDgsZDQKKyAgICBWU0hSLlMxNiBxMTEscTExLCMyCisgICAgVlpJUC44ICAgZDE4LGQyOAorICAgIFZCSUYgICAgIGQxOCxkMTQsZDE2CisgICAgVlJIQURELlMxNiBxMTAscTExLHExMAorICAgIFZBREQuSTggIGQzMSxkMTgsZDE1CisgICAgVlFNT1ZOLlMxNiBkMjAscTEwCisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBWTUlOLlM4ICBkMjAsZDIwLGQzMQorICAgIFZORUcuUzggIGQzMSxkMzEKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIFZNQVguUzggIGQyMCxkMjAsZDMxCisgICAgVk1PVkwuVTggcTE0LGQ0CisgICAgVk1PVkwuVTggcTEyLGQ4CisgICAgVkFERFcuUzggcTE0LHExNCxkMjAKKyAgICBWU1VCVy5TOCBxMTIscTEyLGQyMAorICAgIFZRTU9WVU4uUzE2IGQyOSxxMTQKKyAgICBWUU1PVlVOLlMxNiBkMjQscTEyCisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlOgorICAgIFZIQURELlU4IGQxMyxkNCxkOQorICAgIFZIQURELlU4IGQzMSxkOCxkNQorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgQUREICAgICAgcjUscjUsIzQKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIFZSSEFERC5VOCBkMTMsZDEzLGQ1CisgICAgVlJIQURELlU4IGQzMSxkMzEsZDkKKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2YzZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCithcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlOgorICAgIFZTVUJMLlU4IHExMSxkNSxkOQorICAgIFZMRDEuOCAgIHtkMThbXX0sW3I1XSEKKyAgICBWU1VCTC5VOCBxMTAsZDgsZDQKKyAgICBWTEQxLjggICB7ZDE5W119LFtyNV0hCisgICAgVlNIUi5TMTYgcTExLHExMSwjMgorICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM0CisgICAgVkFORCAgICAgZDE5LGQxNyxkMTUKKyAgICBWQklGICAgICBkMTgsZDE0LGQxNgorICAgIFZSSEFERC5TMTYgcTEwLHExMSxxMTAKKyAgICBWUkhBREQuVTggZDI0LGQ0LGQ4CisgICAgVkFERC5JOCAgZDMxLGQxOCxkMTkKKyAgICBWQU5EICAgICBkMTksZDEyLGQxNQorICAgIFZRQURELlU4IGQyMyxkNSxkMTgKKyAgICBWUU1PVk4uUzE2IGQyMCxxMTAKKyAgICBWQURELkk4ICBkMzEsZDMxLGQxOQorICAgIFZRU1VCLlU4IGQyMixkNSxkMTgKKyAgICBWUUFERC5VOCBkMTksZDksZDE4CisgICAgVkhBREQuVTggZDI2LGQyNCxkNgorICAgIFZNSU4uUzggIGQyMCxkMjAsZDMxCisgICAgVk5FRy5TOCAgZDMxLGQzMQorICAgIFZRU1VCLlU4IGQyMSxkOSxkMTgKKyAgICBWSEFERC5VOCBkMjcsZDI0LGQxMAorICAgIFZNQVguVTggIGQzMCxkMjYsZDIyCisgICAgVk1BWC5TOCAgZDIwLGQyMCxkMzEKKyAgICBWTU9WTC5VOCBxMTQsZDQKKyAgICBWTU9WTC5VOCBxMTIsZDgKKyAgICBWQUREVy5TOCBxMTQscTE0LGQyMAorICAgIFZTVUJXLlM4IHExMixxMTIsZDIwCisgICAgVlFNT1ZVTi5TMTYgZDI5LHExNAorICAgIFZRTU9WVU4uUzE2IGQyNCxxMTIKKyAgICBWTUFYLlU4ICBkMjUsZDI3LGQyMQorICAgIFZNSU4uVTggIGQzMCxkMzAsZDIzCisgICAgVk1JTi5VOCAgZDI1LGQyNSxkMTkKKyAgICBWQklGICAgICBkMjksZDQsZDE2CisgICAgVkJJRiAgICAgZDMwLGQ1LGQxNworICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKKyAgICBWQklGICAgICBkMjUsZDksZDEyCisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCithcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlOgorICAgIFZTSFIuVTggIGQxOSxkMCwjMgorICAgIFZBREQuSTggIGQxOSxkMTksZDE1CisgICAgVkFEREwuVTggcTEwLGQ4LGQ0CisgICAgVkFERC5JOCAgZDE5LGQxOSxkMTUKKyAgICBWQURETC5VOCBxMTEsZDYsZDkKKyAgICBWQUREVy5VOCBxMTIscTEwLGQ1CisgICAgVkNHVC5VOCAgZDE5LGQxOSxkMTMKKyAgICBWU0hSLlUxNiBxMTEscTExLCMxCisgICAgVkhBREQuVTE2IHExMSxxMTIscTExCisgICAgVkFERFcuVTggcTEyLHExMixkNgorICAgIFZBRERMLlU4IHExMyxkNyxkNgorICAgIFZBTkQgICAgIGQxNyxkMTcsZDE5CisgICAgVkhBREQuVTggZDI4LGQ0LGQ5CisgICAgVlNSQS5VMTYgcTEzLHExMiwjMQorICAgIFZBTkQgICAgIGQxMixkMTIsZDE5CisgICAgVlFSU0hSTi5VMTYgZDI5LHExMSwjMQorICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ1CisgICAgVlFSU0hSTi5VMTYgZDMwLHExMiwjMgorICAgIFZBRERMLlU4IHExMSxkMTAsZDUKKyAgICBWQUREVy5VOCBxMTIscTEwLGQ5CisgICAgVkJJRiAgICAgZDI5LGQyOCxkMTcKKyAgICBWUVJTSFJOLlUxNiBkMzEscTEzLCMyCisgICAgVkFEREwuVTggcTEzLGQxMSxkMTAKKyAgICBWU0hSLlUxNiBxMTEscTExLCMxCisgICAgVkhBREQuVTE2IHExMSxxMTIscTExCisgICAgVkFERFcuVTggcTEyLHExMixkMTAKKyAgICBWSEFERC5VOCBkMjgsZDgsZDUKKyAgICBWQklGICAgICBkMjksZDQsZDE2CisgICAgVkJJRiAgICAgZDMwLGQ1LGQxNworICAgIFZTUkEuVTE2IHExMyxxMTIsIzEKKyAgICBWUVJTSFJOLlUxNiBkMjUscTEyLCMyCisgICAgVlFSU0hSTi5VMTYgZDI0LHExMSwjMQorICAgIFZSSEFERC5VOCBkMjIsZDI4LGQ5CisgICAgVkJJRiAgICAgZDI1LGQ5LGQxMgorICAgIFZCSUYgICAgIGQzMSxkNixkMTcKKyAgICBWQklGICAgICBkMjQsZDIyLGQxMgorICAgIFZRUlNIUk4uVTE2IGQyOCxxMTMsIzIKKyAgICBWQklGICAgICBkMjQsZDgsZDE2CisgICAgVkJJRiAgICAgZDI4LGQxMCxkMTIKKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhiZDhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcgorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIKK2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgU1VCICAgICAgc3Asc3AsIzB4NDAKKyAgICBMRFIgICAgICByMTAsW3IwLCMwXQorICAgIExEUiAgICAgIHIxMixbcjEsIzBdCisgICAgTERSICAgICAgcjYsID1hcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcworICAgIExEUiAgICAgIHI0LFtzcCwjMHg2OF0KKyAgICBMRFJCICAgICByOSxbcjEwLCMyXQorICAgIExEUkIgICAgIHI4LFtyMTAsIzFdCisgICAgTERSQiAgICAgcjExLFtyMTBdLCMzCisgICAgQUREICAgICAgcjEyLHIxMiwjOAorICAgIExEUiAgICAgIHI2LFtyNixyNCxMU0wgIzJdCisgICAgT1JSICAgICAgcjkscjkscjgsTFNMICM4CisgICAgT1JSICAgICAgcjExLHI5LHIxMSxMU0wgIzE2CisgICAgTFNMUyAgICAgcjgscjExLHIxMgorICAgIE1PVlMgICAgIHI3LCMweDFlCisgICAgQU5EICAgICAgcjcscjcscjgsTFNSICMyNworICAgIFNVQlMgICAgIHIxMixyMTIsIzgKK0wweDQ0OgorICAgIEJDQyAgICAgIEwxCisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0wxOgorICAgIExEUkggICAgIHI3LFtyNixyN10KKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgQUREICAgICAgcjEyLHIxMiwjNAorICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgTFNSUyAgICAgcjgscjcsIzEKKyAgICBCQ1MgICAgICBMMHg3NAorICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBTVUJTICAgICByMTIscjEyLCMweGEKKyAgICBBREQgICAgICByNyxyNyxyOCxMU1IgIzI5CisgICAgQklDICAgICAgcjcscjcsIzEKKyAgICBCICAgICAgICBMMHg0NAorTDB4NzQ6CisgICAgU1VCICAgICAgcjEyLHIxMixyNyxMU1IgIzEzCisgICAgQklDICAgICAgcjcscjgsIzB4ZjAwMAorICAgIExTUlMgICAgIHI1LHI3LCMyCisgICAgU1RSQiAgICAgcjUsW3IyLCMwXQorICAgIEJFUSAgICAgIEwweDM0NAorICAgIENNUCAgICAgIHI3LCMweDQ0CisgICAgQkdFICAgICAgTDB4MzNjCisgICAgU1RSICAgICAgcjAsW3NwLCMwXQorICAgIFNUUiAgICAgIHIxLFtzcCwjNF0KKyAgICBTVFIgICAgICByMyxbc3AsIzhdCisgICAgQU5EUyAgICAgcjEscjcsIzMKKyAgICBBREQgICAgICByMixzcCwjMHhjCisgICAgQkVRICAgICAgTDB4ZDgKKyAgICBNT1YgICAgICByMCxyMQorTDB4YWM6CisgICAgTFNMUyAgICAgcjcscjExLHIxMgorICAgIFNVQlMgICAgIHIxMixyMTIsIzcKKyAgICBCQ0MgICAgICBMMgorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMMjoKKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgTFNSICAgICAgcjcscjcsIzMxCisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBTVUJTICAgICByMCxyMCwjMQorICAgIE1PViAgICAgIHI4LCMxCisgICAgU1VCICAgICAgcjgscjgscjcsTFNMICMxCisgICAgU1RSSCAgICAgcjgsW3IyXSwjMgorICAgIEJHVCAgICAgIEwweGFjCitMMHhkODoKKyAgICBTVUJTICAgICByMCxyNSxyMQorICAgIEJFUSAgICAgIEwweDFiOAorICAgIE1PViAgICAgIHI0LCMxCisgICAgQ01QICAgICAgcjUsIzB4YQorICAgIE1PVkxFICAgIHI0LCMwCisgICAgQ01QICAgICAgcjEsIzMKKyAgICBNT1ZMVCAgICByMSwjNAorICAgIE1PVkdFICAgIHIxLCMyCisgICAgTU9WR0UgICAgcjQsIzAKK0wweGZjOgorICAgIExTTFMgICAgIHI3LHIxMSxyMTIKKyAgICBDTFogICAgICByNyxyNworICAgIEFERCAgICAgIHIxMixyMTIscjcKKyAgICBTVUJTICAgICByMTIscjEyLCM3CisgICAgQkNDICAgICAgTDMKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorICAgIE9SUiAgICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorICAgIEJDQyAgICAgIEwzCisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0wzOgorICAgIEFERENDICAgIHIxMixyMTIsIzgKKyAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAorICAgIENNUCAgICAgIHI3LCMweDEwCisgICAgQkdFICAgICAgTDB4MzNjCisgICAgTU9WUyAgICAgbHIscjQKKyAgICBURVFFUSAgICByNywjMHhlCisgICAgTU9WRVEgICAgbHIsIzQKKyAgICBURVEgICAgICByNywjMHhmCisgICAgTU9WRVEgICAgbHIsIzB4YworICAgIFRFUUVRICAgIHI0LCMwCisgICAgQURERVEgICAgcjcscjcsIzB4ZgorICAgIFRFUSAgICAgIGxyLCMwCisgICAgQkVRICAgICAgTDB4MTg0CisgICAgTFNMICAgICAgcjMscjExLHIxMgorICAgIEFERCAgICAgIHIxMixyMTIsbHIKKyAgICBTVUJTICAgICByMTIscjEyLCM4CisgICAgUlNCICAgICAgcjksbHIsIzB4MjAKKyAgICBCQ0MgICAgICBMNAorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCisgICAgT1JSICAgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBTVUJTICAgICByMTIscjEyLCM4CisgICAgQkNDICAgICAgTDQKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorTDQ6CisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIExTUiAgICAgIHIzLHIzLHI5CisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBMU0wgICAgICByNyxyNyxyNAorICAgIEFERCAgICAgIHI3LHIzLHI3CitMMHgxODQ6CisgICAgQUREICAgICAgcjcscjcscjEKKyAgICBNT1YgICAgICByMSwjMgorICAgIExTUlMgICAgIHI4LHI3LCMxCisgICAgUlNCQ1MgICAgcjgscjgsIzAKKyAgICBTVFJIICAgICByOCxbcjJdLCMyCisgICAgTERSICAgICAgcjksID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICBMRFJTQiAgICByOCxbcjkscjRdCisgICAgVEVRICAgICAgcjQsIzAKKyAgICBNT1ZFUSAgICByNCwjMQorICAgIENNUCAgICAgIHI3LHI4CisgICAgQUREQ1MgICAgcjQscjQsIzEKKyAgICBTVUJTICAgICByMCxyMCwjMQorICAgIEJHVCAgICAgIEwweGZjCitMMHgxYjg6CisgICAgTERSICAgICAgcjgsW3NwLCMweDZjXQorICAgIFNVQiAgICAgIHIwLHI1LCMxCisgICAgU1VCUyAgICAgcjEscjgscjUKKyAgICBBREQgICAgICByNCxzcCwjMHgyYworICAgIE1PViAgICAgIGxyLHI1CisgICAgU1VCICAgICAgbHIsbHIsIzEKKyAgICBCRVEgICAgICBMMHgyYjAKKyAgICBURVEgICAgICByOCwjNAorICAgIExEUkVRICAgIHI2LCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzIC0gNCkKKyAgICBMRFJORSAgICByNiwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzIC0gNCkKKyAgICBMRFIgICAgICByNixbcjYscjUsTFNMICMyXQorICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBNT1ZTICAgICByNywjMHgxZQorICAgIEFORCAgICAgIHI3LHI3LHI4LExTUiAjMjcKKyAgICBTVUJTICAgICByMTIscjEyLCM4CitMMHgxZjQ6CisgICAgQkNDICAgICAgTDUKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorTDU6CisgICAgTERSSCAgICAgcjcsW3I2LHI3XQorICAgIEFERENDICAgIHIxMixyMTIsIzgKKyAgICBBREQgICAgICByMTIscjEyLCM0CisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBMU1JTICAgICByOCxyNywjMQorICAgIEJDUyAgICAgIEwweDIyNAorICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBTVUJTICAgICByMTIscjEyLCMweGEKKyAgICBBREQgICAgICByNyxyNyxyOCxMU1IgIzI5CisgICAgQklDICAgICAgcjcscjcsIzEKKyAgICBCICAgICAgICBMMHgxZjQKK0wweDIyNDoKKyAgICBTVUIgICAgICByMTIscjEyLHI3LExTUiAjMTMKKyAgICBCSUMgICAgICByNyxyOCwjMHhmMDAwCisgICAgQ01QICAgICAgcjcsIzB4MTAKKyAgICBCR0UgICAgICBMMHgzM2MKKyAgICBMRFIgICAgICByMywgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzIC0gNCkKKyAgICBBREQgICAgICByNCxzcCwjMHgyYworICAgIE1PVlMgICAgIHIxLHI3CisgICAgQUREICAgICAgbHIsbHIscjEKKyAgICBCRVEgICAgICBMMHgyYjAKK0wweDI0ODoKKyAgICBTVUJTICAgICByMCxyMCwjMQorICAgIExEUiAgICAgIHI2LFtyMyxyMSxMU0wgIzJdCisgICAgQkxUICAgICAgTDB4MmJjCisgICAgTFNMUyAgICAgcjgscjExLHIxMgorICAgIE1PVlMgICAgIHI3LCMweGUKKyAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI4CisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorTDB4MjY0OgorICAgIEJDQyAgICAgIEw2CisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0w2OgorICAgIExEUkggICAgIHI3LFtyNixyN10KKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgQUREICAgICAgcjEyLHIxMiwjMworICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgTFNSUyAgICAgcjgscjcsIzEKKyAgICBCQ1MgICAgICBMMHgyOTQKKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgU1VCUyAgICAgcjEyLHIxMiwjOQorICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKKyAgICBCSUMgICAgICByNyxyNywjMQorICAgIEIgICAgICAgIEwweDI2NAorTDB4Mjk0OgorICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMworICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKKyAgICBDTVAgICAgICByNywjMHhmCisgICAgQkdFICAgICAgTDB4MzNjCisgICAgU1VCUyAgICAgcjEscjEscjcKKyAgICBTVFJCICAgICByNyxbcjRdLCMxCisgICAgQkdUICAgICAgTDB4MjQ4CitMMHgyYjA6CisgICAgU1VCUyAgICAgcjAscjAsIzEKKyAgICBCTFQgICAgICBMNworICAgIFNUUkIgICAgIHIxLFtyNF0sIzEKK0w3OgorICAgIEJHVCAgICAgIEwweDJiMAorTDB4MmJjOgorICAgIFNUUkIgICAgIHIxLFtyNF0sIzEKKyAgICBMRFIgICAgICByOCxbc3AsIzB4NmNdCisgICAgVEVRICAgICAgcjgsIzB4ZgorICAgIEFEREVRICAgIGxyLGxyLCMxCisgICAgU1VCICAgICAgcjQscjQscjUKKyAgICBTVUIgICAgICByMixyMixyNQorICAgIFNVQiAgICAgIHIyLHIyLHI1CisgICAgTERSICAgICAgcjMsW3NwLCM4XQorICAgIExEUiAgICAgIHIwLFtyMywjMF0KKyAgICBURVEgICAgICByOCwjNAorICAgIExEUkVRICAgIHI2LCA9YXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgTERSTkUgICAgcjYsID1hcm1WQ000UDEwX1ppZ1phZ180eDQKK0wweDJlYzoKKyAgICBMRFJCICAgICByOSxbcjRdLCMxCisgICAgTERSQiAgICAgcjgsW3I2LGxyXQorICAgIFNVQiAgICAgIGxyLGxyLCMxCisgICAgU1VCICAgICAgbHIsbHIscjkKKyAgICBMRFJTSCAgICByOSxbcjJdLCMyCisgICAgU1VCUyAgICAgcjUscjUsIzEKKyAgICBPUlJFUSAgICByOCxyOCwjMHgyMAorICAgIEFERCAgICAgIHIxLHI5LCMweDgwCisgICAgQ01QICAgICAgcjEsIzB4MTAwCisgICAgT1JSQ1MgICAgcjgscjgsIzB4MTAKKyAgICBURVEgICAgICByNSwjMAorICAgIFNUUkIgICAgIHI4LFtyMF0sIzEKKyAgICBTVFJCICAgICByOSxbcjBdLCMxCisgICAgTFNSICAgICAgcjkscjksIzgKKyAgICBCQ0MgICAgICBMOAorICAgIFNUUkIgICAgIHI5LFtyMF0sIzEKK0w4OgorICAgIEJORSAgICAgIEwweDJlYworICAgIFNUUiAgICAgIHIwLFtyMywjMF0KKyAgICBMRFIgICAgICByMCxbc3AsIzBdCisgICAgTERSICAgICAgcjEsW3NwLCM0XQorICAgIEIgICAgICAgIEwweDM0NAorTDB4MzNjOgorICAgIE1WTiAgICAgIHIwLCMxCisgICAgQiAgICAgICAgTDB4MzVjCitMMHgzNDQ6CisgICAgQUREICAgICAgcjEwLHIxMCxyMTIsTFNSICMzCisgICAgQU5EICAgICAgcjEyLHIxMiwjNworICAgIFNVQiAgICAgIHIxMCxyMTAsIzQKKyAgICBTVFIgICAgICByMTIsW3IxLCMwXQorICAgIFNUUiAgICAgIHIxMCxbcjAsIzBdCisgICAgTU9WICAgICAgcjAsIzAKK0wweDM1YzoKKyAgICBBREQgICAgICBzcCxzcCwjMHg0MAorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYjQyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXgKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisKK2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0OgorICAgIC5ieXRlICAwLCAyLCAwLCAyCisgICAgLmJ5dGUgIDIsIDEsIDIsIDEKKyAgICAuYnl0ZSAgMCwgMiwgMCwgMgorICAgIC5ieXRlICAyLCAxLCAyLCAxCisKK2FybVZDTTRQMTBfUG9zVG9WQ29sMngyOgorICAgIC5ieXRlICAwLCAyCisgICAgLmJ5dGUgIDIsIDEKKworYXJtVkNNNFAxMF9WTWF0cml4OgorICAgIC5ieXRlICAxMCwgMTYsIDEzCisgICAgLmJ5dGUgIDExLCAxOCwgMTQKKyAgICAuYnl0ZSAgMTMsIDIwLCAxNgorICAgIC5ieXRlICAxNCwgMjMsIDE4CisgICAgLmJ5dGUgIDE2LCAyNSwgMjAKKyAgICAuYnl0ZSAgMTgsIDI5LCAyMworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gWyhJTlQpKFFQLzYpXSwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9RUERpdlRhYmxlOgorICAgIC5ieXRlICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKKyAgICAuYnl0ZSAgMSwgIDEsICAxLCAgMSwgIDEsICAxCisgICAgLmJ5dGUgIDIsICAyLCAgMiwgIDIsICAyLCAgMgorICAgIC5ieXRlICAzLCAgMywgIDMsICAzLCAgMywgIDMKKyAgICAuYnl0ZSAgNCwgIDQsICA0LCAgNCwgIDQsICA0CisgICAgLmJ5dGUgIDUsICA1LCAgNSwgIDUsICA1LCAgNQorICAgIC5ieXRlICA2LCAgNiwgIDYsICA2LCAgNiwgIDYKKyAgICAuYnl0ZSAgNywgIDcsICA3LCAgNywgIDcsICA3CisgICAgLmJ5dGUgIDgsICA4LCAgOCwgIDgsICA4LCAgOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZToKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBtb2R1bHVzIGV4cHJlc3Npb24gW1FQJTZdKjYsCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfUVBNb2R1bG9UYWJsZToKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcworOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9WTWF0cml4VTE2OgorICAgIC5od29yZCAxMCwgMTYsIDEzCisgICAgLmh3b3JkIDExLCAxOCwgMTQKKyAgICAuaHdvcmQgMTMsIDIwLCAxNgorICAgIC5od29yZCAxNCwgMjMsIDE4CisgICAgLmh3b3JkIDE2LCAyNSwgMjAKKyAgICAuaHdvcmQgMTgsIDI5LCAyMworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JjNjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MuUwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZToKKyAgICBNT1YgICAgICByMTIscjgKKyAgICBBTkQgICAgICByNyxyMCwjMworICAgIEJJQyAgICAgIHIwLHIwLCMzCisgICAgQUREICAgICAgcGMscGMscjcsTFNMICMyCisgICAgTk9QCisgICAgQiAgICAgICAgQ29weTB0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5MXRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkydG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weTN0b0FsaWduZWQKK0NvcHkwdG9BbGlnbmVkOgorICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgQUREICAgICAgcjAscjAscjEKKyAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9CisgICAgQkdUICAgICAgQ29weTB0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5RW5kCitDb3B5MXRvQWxpZ25lZDoKKyAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIEFERCAgICAgIHIwLHIwLHIxCisgICAgTFNSICAgICAgcjcscjcsIzgKKyAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICMyNAorICAgIExTUiAgICAgIHIxMCxyMTAsIzgKKyAgICBPUlIgICAgICByMTAscjEwLHIxMSxMU0wgIzI0CisgICAgTFNSICAgICAgcjExLHIxMSwjOAorICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KKyAgICBCR1QgICAgICBDb3B5MXRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlFbmQKK0NvcHkydG9BbGlnbmVkOgorICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgQUREICAgICAgcjAscjAscjEKKyAgICBMU1IgICAgICByNyxyNywjMTYKKyAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICMxNgorICAgIExTUiAgICAgIHIxMCxyMTAsIzE2CisgICAgT1JSICAgICAgcjEwLHIxMCxyMTEsTFNMICMxNgorICAgIExTUiAgICAgIHIxMSxyMTEsIzE2CisgICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQorICAgIEJHVCAgICAgIENvcHkydG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weUVuZAorQ29weTN0b0FsaWduZWQ6CisgICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9CisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBBREQgICAgICByMCxyMCxyMQorICAgIExTUiAgICAgIHI3LHI3LCMyNAorICAgIE9SUiAgICAgIHI3LHI3LHIxMCxMU0wgIzgKKyAgICBMU1IgICAgICByMTAscjEwLCMyNAorICAgIE9SUiAgICAgIHIxMCxyMTAscjExLExTTCAjOAorICAgIExTUiAgICAgIHIxMSxyMTEsIzI0CisgICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQorICAgIEJHVCAgICAgIENvcHkzdG9BbGlnbmVkCitDb3B5RW5kOgorICAgIE1PViAgICAgIHIwLHIxMgorICAgIE1PViAgICAgIHIxLCMweGMKKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmU6CisgICAgQU5EICAgICAgcjcscjAsIzMKKyAgICBCSUMgICAgICByMCxyMCwjMworICAgIEFERCAgICAgIHBjLHBjLHI3LExTTCAjMgorICAgIE5PUAorICAgIEIgICAgICAgIENvcHkwdG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkxdG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkydG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkzdG9WQWxpZ25lZAorQ29weTB0b1ZBbGlnbmVkOgorICAgIExEUiAgICAgIHI3LFtyMF0scjEKKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKKyAgICBCR1QgICAgICBDb3B5MHRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5VkVuZAorQ29weTF0b1ZBbGlnbmVkOgorICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCisgICAgTERSICAgICAgcjcsW3IwXSxyMQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgTFNMICAgICAgcjEwLHIxMCwjMjQKKyAgICBPUlIgICAgICByNyxyMTAscjcsTFNSICM4CisgICAgU1RSICAgICAgcjcsW3I4XSwjNAorICAgIEJHVCAgICAgIENvcHkxdG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlWRW5kCitDb3B5MnRvVkFsaWduZWQ6CisgICAgTERSICAgICAgcjEwLFtyMCwjNF0KKyAgICBMRFIgICAgICByNyxbcjBdLHIxCisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBMU0wgICAgICByMTAscjEwLCMxNgorICAgIE9SUiAgICAgIHI3LHIxMCxyNyxMU1IgIzE2CisgICAgU1RSICAgICAgcjcsW3I4XSwjNAorICAgIEJHVCAgICAgIENvcHkydG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlWRW5kCitDb3B5M3RvVkFsaWduZWQ6CisgICAgTERSICAgICAgcjEwLFtyMCwjNF0KKyAgICBMRFIgICAgICByNyxbcjBdLHIxCisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBMU0wgICAgICByMTAscjEwLCM4CisgICAgT1JSICAgICAgcjcscjEwLHI3LExTUiAjMjQKKyAgICBTVFIgICAgICByNyxbcjhdLCM0CisgICAgQkdUICAgICAgQ29weTN0b1ZBbGlnbmVkCitDb3B5VkVuZDoKKyAgICBTVUIgICAgICByMCxyOCwjMHgxYworICAgIE1PViAgICAgIHIxLCM0CisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5MjIwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgQU5EICAgICAgcjEyLHIwLCMzCisgICAgQklDICAgICAgcjAscjAsIzMKKyAgICBBREQgICAgICBwYyxwYyxyMTIsTFNMICMyCisgICAgTk9QCisgICAgQiAgICAgICAgQ29weTR4NEFsaWduMAorICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjEKKyAgICBCICAgICAgICBDb3B5NHg0QWxpZ24yCisgICAgQiAgICAgICAgQ29weTR4NEFsaWduMworQ29weTR4NEFsaWduMDoKKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgTERSICAgICAgcjUsW3IwXSxyMQorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIExEUiAgICAgIHI5LFtyMF0scjEKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgU1RSICAgICAgcjksW3IyXSxyMworICAgIEIgICAgICAgIENvcHk0eDRFbmQKK0NvcHk0eDRBbGlnbjE6CisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCM4CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICMyNAorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjOAorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMjQKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCM4CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICMyNAorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjOAorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMjQKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgQiAgICAgICAgQ29weTR4NEVuZAorQ29weTR4NEFsaWduMjoKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzE2CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICMxNgorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjMTYKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzE2CisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgTERSICAgICAgcjksW3IwLCM0XQorICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBMU1IgICAgICByNCxyNCwjMTYKKyAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzE2CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExTUiAgICAgIHI4LHI4LCMxNgorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMTYKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgQiAgICAgICAgQ29weTR4NEVuZAorQ29weTR4NEFsaWduMzoKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzI0CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICM4CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExTUiAgICAgIHI4LHI4LCMyNAorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjOAorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzI0CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICM4CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExTUiAgICAgIHI4LHI4LCMyNAorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjOAorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKK0NvcHk0eDRFbmQ6CisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGFiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBNT1YgICAgICBsciwjNAorICAgIExEUiAgICAgIHI2LCA9MHhmZTAwZmUwCisgICAgTERSICAgICAgcjEyLCA9MHhmZjAwZmYKK0xvb3BTdGFydDE6CisgICAgTERSICAgICAgcjExLFtyMCwjMHhjXQorICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBVUVNVQjE2ICByMTEscjExLHI2CisgICAgVVFTVUIxNiAgcjEwLHIxMCxyNgorICAgIFVRU1VCMTYgIHI1LHI1LHI2CisgICAgVVFTVUIxNiAgcjQscjQscjYKKyAgICBVU0FUMTYgICByMTEsIzEzLHIxMQorICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCisgICAgVVNBVDE2ICAgcjUsIzEzLHI1CisgICAgVVNBVDE2ICAgcjQsIzEzLHI0CisgICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1CisgICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1CisgICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQorICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKKyAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKKyAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4CisgICAgU1VCUyAgICAgbHIsbHIsIzEKKyAgICBTVFJEICAgICByMTAscjExLFtyN10sIzgKKyAgICBCR1QgICAgICBMb29wU3RhcnQxCisgICAgU1VCICAgICAgcjAscjcsIzB4MjAKKyAgICBNT1YgICAgICByMSwjOAorICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBMRFIgICAgICByNiwgPTB4ZmUwMGZlMAorICAgIExEUiAgICAgIHIxMiwgPTB4ZmYwMGZmCisgICAgTU9WICAgICAgbHIsIzIKK0xvb3BTdGFydDoKKyAgICBMRFIgICAgICByMTEsW3IwLCMweGNdCisgICAgTERSICAgICAgcjEwLFtyMCwjOF0KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIFVRU1VCMTYgIHIxMSxyMTEscjYKKyAgICBVUVNVQjE2ICByMTAscjEwLHI2CisgICAgVVFTVUIxNiAgcjUscjUscjYKKyAgICBVUVNVQjE2ICByNCxyNCxyNgorICAgIFVTQVQxNiAgIHIxMSwjMTMscjExCisgICAgVVNBVDE2ICAgcjEwLCMxMyxyMTAKKyAgICBVU0FUMTYgICByNSwjMTMscjUKKyAgICBVU0FUMTYgICByNCwjMTMscjQKKyAgICBBTkQgICAgICByMTEscjEyLHIxMSxMU1IgIzUKKyAgICBBTkQgICAgICByMTAscjEyLHIxMCxMU1IgIzUKKyAgICBBTkQgICAgICByNSxyMTIscjUsTFNSICM1CisgICAgQU5EICAgICAgcjQscjEyLHI0LExTUiAjNQorICAgIE9SUiAgICAgIHIxMSxyMTAscjExLExTTCAjOAorICAgIE9SUiAgICAgIHIxMCxyNCxyNSxMU0wgIzgKKyAgICBQS0hCVCAgICByNCxyMTAscjExLExTTCAjMTYKKyAgICBTVFIgICAgICByNCxbcjddLCM4CisgICAgUEtIVEIgICAgcjUscjExLHIxMCxBU1IgIzE2CisgICAgU1RSICAgICAgcjUsW3I3XSwjLTQKKyAgICBMRFIgICAgICByMTEsW3IwLCMweGNdCisgICAgTERSICAgICAgcjEwLFtyMCwjOF0KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIFVRU1VCMTYgIHIxMSxyMTEscjYKKyAgICBVUVNVQjE2ICByMTAscjEwLHI2CisgICAgVVFTVUIxNiAgcjUscjUscjYKKyAgICBVUVNVQjE2ICByNCxyNCxyNgorICAgIFVTQVQxNiAgIHIxMSwjMTMscjExCisgICAgVVNBVDE2ICAgcjEwLCMxMyxyMTAKKyAgICBVU0FUMTYgICByNSwjMTMscjUKKyAgICBVU0FUMTYgICByNCwjMTMscjQKKyAgICBBTkQgICAgICByMTEscjEyLHIxMSxMU1IgIzUKKyAgICBBTkQgICAgICByMTAscjEyLHIxMCxMU1IgIzUKKyAgICBBTkQgICAgICByNSxyMTIscjUsTFNSICM1CisgICAgQU5EICAgICAgcjQscjEyLHI0LExTUiAjNQorICAgIE9SUiAgICAgIHIxMSxyMTAscjExLExTTCAjOAorICAgIE9SUiAgICAgIHIxMCxyNCxyNSxMU0wgIzgKKyAgICBQS0hCVCAgICByNCxyMTAscjExLExTTCAjMTYKKyAgICBTVUJTICAgICBscixsciwjMQorICAgIFNUUiAgICAgIHI0LFtyN10sIzgKKyAgICBQS0hUQiAgICByNSxyMTEscjEwLEFTUiAjMTYKKyAgICBTVFIgICAgICByNSxbcjddLCM0CisgICAgQkdUICAgICAgTG9vcFN0YXJ0CisgICAgU1VCICAgICAgcjAscjcsIzB4MTgKKyAgICBNT1YgICAgICByMSwjNAorICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzMwOTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZNT1YuSTE2IGQzMSwjMHgxNAorICAgIFZNT1YuSTE2IGQzMCwjMHg1CisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxNSxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZNTEEuSTE2IGQxMCxkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHE2LGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDEwLGQxMCxkOAorICAgIFZNTEEuSTE2IGQxMixkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHE3LGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDEyLGQxMixkOAorICAgIFZNTEEuSTE2IGQxNCxkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHE4LGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDE0LGQxNCxkOAorICAgIFZNTEEuSTE2IGQxNixkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHE5LGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDE2LGQxNixkOAorICAgIFZNTEEuSTE2IGQxOCxkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHExMCxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxOCxkMTgsZDgKKyAgICBWTUxBLkkxNiBkMjAsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxMTEsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWU1VCLkkxNiBkMjAsZDIwLGQ4CisgICAgVk1MQS5JMTYgZDIyLGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTEyLGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDIyLGQyMixkOAorICAgIFZNTEEuSTE2IGQyNCxkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHExMyxkMCxkMQorICAgIFZTVUIuSTE2IGQyNCxkMjQsZDgKKyAgICBWTUxBLkkxNiBkMjYsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVk1PVi5JMzIgcTE1LCMweDE0CisgICAgVk1PVi5JMzIgcTE0LCMweDUKKyAgICBWQURETC5TMTYgcTUsZDEwLGQyMAorICAgIFZBRERMLlMxNiBxMSxkMTQsZDE2CisgICAgVkFEREwuUzE2IHEwLGQxMixkMTgKKyAgICBWU1VCLkkxNiBkMjYsZDI2LGQ4CisgICAgVk1MQS5JMzIgcTUscTEscTE1CisgICAgVk1VTC5JMzIgcTQscTAscTE0CisgICAgVkFEREwuUzE2IHE2LGQxMixkMjIKKyAgICBWQURETC5TMTYgcTEsZDE2LGQxOAorICAgIFZBRERMLlMxNiBxMCxkMTQsZDIwCisgICAgVk1MQS5JMzIgcTYscTEscTE1CisgICAgVlNVQi5JMzIgcTUscTUscTQKKyAgICBWTVVMLkkzMiBxNCxxMCxxMTQKKyAgICBWQURETC5TMTYgcTIsZDE0LGQyNAorICAgIFZBRERMLlMxNiBxMSxkMTgsZDIwCisgICAgVkFEREwuUzE2IHEwLGQxNixkMjIKKyAgICBWTUxBLkkzMiBxMixxMSxxMTUKKyAgICBWU1VCLkkzMiBxNixxNixxNAorICAgIFZNVUwuSTMyIHE0LHEwLHExNAorICAgIFZBRERMLlMxNiBxMyxkMTYsZDI2CisgICAgVkFEREwuUzE2IHExLGQyMCxkMjIKKyAgICBWQURETC5TMTYgcTAsZDE4LGQyNAorICAgIFZNTEEuSTMyIHEzLHExLHExNQorICAgIFZTVUIuSTMyIHEyLHEyLHE0CisgICAgVk1MUy5JMzIgcTMscTAscTE0CisgICAgVlFSU0hSVU4uUzMyIGQwLHE1LCMxMAorICAgIFZRUlNIUlVOLlMzMiBkMixxNiwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDQscTIsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQ2LHEzLCMxMAorICAgIFZRTU9WTi5VMTYgZDAscTAKKyAgICBWUU1PVk4uVTE2IGQyLHExCisgICAgVlFNT1ZOLlUxNiBkNCxxMgorICAgIFZRTU9WTi5VMTYgZDYscTMKKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MWMzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgQUREICAgICAgcjEyLHIwLHIxLExTTCAjMgorICAgIFZNT1YuSTggIGQzMCwjMHg1CisgICAgVk1PVi5JOCAgZDMxLCMweDE0CisgICAgVkxEMS44ICAge2QxMCxkMTF9LFtyMTJdLHIxCisgICAgVkxEMS44ICAge2QyLGQzfSxbcjBdLHIxCisgICAgVkxEMS44ICAge2QxMixkMTN9LFtyMTJdLHIxCisgICAgVkFEREwuVTggcTksZDAsZDEwCisgICAgVkxEMS44ICAge2Q0LGQ1fSxbcjBdLHIxCisgICAgVkFEREwuVTggcTAsZDEsZDExCisgICAgVkxEMS44ICAge2Q2LGQ3fSxbcjBdLHIxCisgICAgVkFEREwuVTggcTEwLGQyLGQxMgorICAgIFZMRDEuOCAgIHtkOCxkOX0sW3IwXSxyMQorICAgIFZNTEFMLlU4IHE5LGQ0LGQzMQorICAgIFZMRDEuOCAgIHtkMTQsZDE1fSxbcjEyXSxyMQorICAgIFZNTEFMLlU4IHEwLGQ1LGQzMQorICAgIFZMRDEuOCAgIHtkMTYsZDE3fSxbcjEyXSxyMQorICAgIFZNTEFMLlU4IHE5LGQ2LGQzMQorICAgIFZNTEFMLlU4IHExMCxkNixkMzEKKyAgICBWTUxTTC5VOCBxMCxkMyxkMzAKKyAgICBWQURETC5VOCBxMTEsZDQsZDE0CisgICAgVk1MU0wuVTggcTksZDIsZDMwCisgICAgVkFEREwuVTggcTEsZDMsZDEzCisgICAgVk1MQUwuVTggcTAsZDcsZDMxCisgICAgVk1MQUwuVTggcTEwLGQ4LGQzMQorICAgIFZNTFNMLlU4IHE5LGQ4LGQzMAorICAgIFZNTEFMLlU4IHExLGQ3LGQzMQorICAgIFZNTFNMLlU4IHEwLGQ5LGQzMAorICAgIFZNTEFMLlU4IHExMSxkOCxkMzEKKyAgICBWTUxTTC5VOCBxMTAsZDQsZDMwCisgICAgVk1MU0wuVTggcTEsZDUsZDMwCisgICAgVkFEREwuVTggcTIsZDUsZDE1CisgICAgVk1MQUwuVTggcTExLGQxMCxkMzEKKyAgICBWTUxTTC5VOCBxMTAsZDEwLGQzMAorICAgIFZNTEFMLlU4IHExLGQ5LGQzMQorICAgIFZNTEFMLlU4IHEyLGQ5LGQzMQorICAgIFZBRERMLlU4IHExMixkNixkMTYKKyAgICBWTUxTTC5VOCBxMTEsZDYsZDMwCisgICAgVk1MU0wuVTggcTEsZDExLGQzMAorICAgIFZNTFNMLlU4IHEyLGQ3LGQzMAorICAgIFZBRERMLlU4IHEzLGQ3LGQxNworICAgIFZNTEFMLlU4IHExMixkMTAsZDMxCisgICAgVk1MU0wuVTggcTExLGQxMixkMzAKKyAgICBWTUxTTC5VOCBxMixkMTMsZDMwCisgICAgVk1MQUwuVTggcTMsZDExLGQzMQorICAgIFZNTEFMLlU4IHExMixkMTIsZDMxCisgICAgVkVYVC44ICAgZDI2LGQxOCxkMTksIzIKKyAgICBWTUxBTC5VOCBxMixkMTEsZDMxCisgICAgVk1MQUwuVTggcTMsZDEzLGQzMQorICAgIFZNTFNMLlU4IHExMixkOCxkMzAKKyAgICBWRVhULjggICBkMjcsZDE4LGQxOSwjNAorICAgIFZNT1YuSTE2IGQzMSwjMHgxNAorICAgIFZNTFNMLlU4IHEzLGQ5LGQzMAorICAgIFZNTFNMLlU4IHExMixkMTQsZDMwCisgICAgVkVYVC44ICAgZDI5LGQxOSxkMCwjMgorICAgIFZFWFQuOCAgIGQyOCxkMTgsZDE5LCM2CisgICAgVk1MU0wuVTggcTMsZDE1LGQzMAorICAgIFZBRERMLlMxNiBxMCxkMTgsZDI5CisgICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKKyAgICBWTU9WLkkxNiBkMzAsIzB4NQorICAgIFZBREQuSTE2IGQyNixkMjYsZDE5CisgICAgVk1MQUwuUzE2IHEwLGQyNyxkMzEKKyAgICBWRVhULjggICBkMjcsZDIwLGQyMSwjNAorICAgIFZFWFQuOCAgIGQyOCxkMjAsZDIxLCM2CisgICAgVkVYVC44ICAgZDI5LGQyMSxkMiwjMgorICAgIFZNTFNMLlMxNiBxMCxkMjYsZDMwCisgICAgVkVYVC44ICAgZDI2LGQyMCxkMjEsIzIKKyAgICBWQURETC5TMTYgcTEsZDIwLGQyOQorICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4CisgICAgVkFERC5JMTYgZDI2LGQyNixkMjEKKyAgICBWRVhULjggICBkMjgsZDIyLGQyMywjNgorICAgIFZNTEFMLlMxNiBxMSxkMjcsZDMxCisgICAgVkVYVC44ICAgZDI5LGQyMyxkNCwjMgorICAgIFZFWFQuOCAgIGQyNyxkMjIsZDIzLCM0CisgICAgVkVYVC44ICAgZDgsZDIyLGQyMywjMgorICAgIFZBRERMLlMxNiBxMixkMjIsZDI5CisgICAgVk1MU0wuUzE2IHExLGQyNixkMzAKKyAgICBWQURELkkxNiBkMjcsZDI3LGQyOAorICAgIFZBREQuSTE2IGQyNixkOCxkMjMKKyAgICBWRVhULjggICBkMjgsZDI0LGQyNSwjNgorICAgIFZNTEFMLlMxNiBxMixkMjcsZDMxCisgICAgVkVYVC44ICAgZDI3LGQyNCxkMjUsIzQKKyAgICBWRVhULjggICBkMjksZDI1LGQ2LCMyCisgICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKKyAgICBWRVhULjggICBkOCxkMjQsZDI1LCMyCisgICAgVkFEREwuUzE2IHEzLGQyNCxkMjkKKyAgICBWTUxTTC5TMTYgcTIsZDI2LGQzMAorICAgIFZNTEFMLlMxNiBxMyxkMjcsZDMxCisgICAgVkFERC5JMTYgZDgsZDgsZDI1CisgICAgVk1MU0wuUzE2IHEzLGQ4LGQzMAorICAgIFZRUlNIUlVOLlMzMiBkMCxxMCwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDIscTEsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQ0LHEyLCMxMAorICAgIFZRUlNIUlVOLlMzMiBkNixxMywjMTAKKyAgICBWUU1PVk4uVTE2IGQwLHEwCisgICAgVlFNT1ZOLlUxNiBkMixxMQorICAgIFZRTU9WTi5VMTYgZDQscTIKKyAgICBWUU1PVk4uVTE2IGQ2LHEzCisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlMTQxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDcyIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVkxEMS44ICAge2QyMixkMjN9LFtyMF0scjEKKyAgICBWRVhULjggICBkMTAsZDIyLGQyMywjNQorICAgIFZFWFQuOCAgIGQxMixkMjIsZDIzLCMxCisgICAgVkVYVC44ICAgZDE0LGQyMixkMjMsIzIKKyAgICBWRVhULjggICBkMTUsZDIyLGQyMywjMworICAgIFZFWFQuOCAgIGQxMyxkMjIsZDIzLCM0CisgICAgVkFEREwuVTggcTExLGQyMixkMTAKKyAgICBWQURETC5VOCBxNCxkMTQsZDE1CisgICAgVkFEREwuVTggcTYsZDEyLGQxMworICAgIFZMRDEuOCAgIHtkMjQsZDI1fSxbcjBdLHIxCisgICAgVk1MQS5JMTYgZDIyLGQ4LGQzMQorICAgIFZNVUwuSTE2IGQ4LGQxMixkMzAKKyAgICBWRVhULjggICBkMTAsZDI0LGQyNSwjNQorICAgIFZFWFQuOCAgIGQxMixkMjQsZDI1LCMxCisgICAgVkVYVC44ICAgZDE2LGQyNCxkMjUsIzIKKyAgICBWRVhULjggICBkMTcsZDI0LGQyNSwjMworICAgIFZFWFQuOCAgIGQxMyxkMjQsZDI1LCM0CisgICAgVkFEREwuVTggcTEyLGQyNCxkMTAKKyAgICBWU1VCLkkxNiBkMjIsZDIyLGQ4CisgICAgVkFEREwuVTggcTQsZDE2LGQxNworICAgIFZBRERMLlU4IHE2LGQxMixkMTMKKyAgICBWTEQxLjggICB7ZDI2LGQyN30sW3IwXSxyMQorICAgIFZNTEEuSTE2IGQyNCxkOCxkMzEKKyAgICBWTVVMLkkxNiBkOCxkMTIsZDMwCisgICAgVkVYVC44ICAgZDEwLGQyNixkMjcsIzUKKyAgICBWRVhULjggICBkMTIsZDI2LGQyNywjMQorICAgIFZFWFQuOCAgIGQxOCxkMjYsZDI3LCMyCisgICAgVkVYVC44ICAgZDE5LGQyNixkMjcsIzMKKyAgICBWRVhULjggICBkMTMsZDI2LGQyNywjNAorICAgIFZBRERMLlU4IHExMyxkMjYsZDEwCisgICAgVlNVQi5JMTYgZDI0LGQyNCxkOAorICAgIFZBRERMLlU4IHE0LGQxOCxkMTkKKyAgICBWQURETC5VOCBxNixkMTIsZDEzCisgICAgVkxEMS44ICAge2QyOCxkMjl9LFtyMF0scjEKKyAgICBWTUxBLkkxNiBkMjYsZDgsZDMxCisgICAgVk1VTC5JMTYgZDgsZDEyLGQzMAorICAgIFZFWFQuOCAgIGQxMCxkMjgsZDI5LCM1CisgICAgVkVYVC44ICAgZDEyLGQyOCxkMjksIzEKKyAgICBWRVhULjggICBkMjAsZDI4LGQyOSwjMgorICAgIFZFWFQuOCAgIGQyMSxkMjgsZDI5LCMzCisgICAgVkVYVC44ICAgZDEzLGQyOCxkMjksIzQKKyAgICBWQURETC5VOCBxMTQsZDI4LGQxMAorICAgIFZTVUIuSTE2IGQyNixkMjYsZDgKKyAgICBWQURETC5VOCBxNCxkMjAsZDIxCisgICAgVkFEREwuVTggcTYsZDEyLGQxMworICAgIFZNTEEuSTE2IGQyOCxkOCxkMzEKKyAgICBWTUxTLkkxNiBkMjgsZDEyLGQzMAorICAgIFZRUlNIUlVOLlMxNiBkMjIscTExLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyNCxxMTIsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDI2LHExMywjNQorICAgIFZRUlNIUlVOLlMxNiBkMjgscTE0LCM1CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1ODQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDU4IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxCisgICAgQUREICAgICAgcjEyLHIwLHIxLExTTCAjMgorICAgIFZMRDEuOCAgIHtkOH0sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkMTJ9LFtyMTJdLHIxCisgICAgVkxEMS44ICAge2Q5fSxbcjBdLHIxCisgICAgVkFEREwuVTggcTAsZDcsZDEyCisgICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkMTN9LFtyMTJdLHIxCisgICAgVkxEMS44ICAge2QxMX0sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkMTR9LFtyMTJdLHIxCisgICAgVkFEREwuVTggcTgsZDgsZDExCisgICAgVkFEREwuVTggcTksZDksZDEwCisgICAgVkxEMS44ICAge2QxNX0sW3IxMl0scjEKKyAgICBWTUxTLkkxNiBkMCxkMTYsZDMwCisgICAgVk1VTC5JMTYgZDIwLGQxOCxkMzEKKyAgICBWQURETC5VOCBxOCxkOSxkMTIKKyAgICBWQURETC5VOCBxOSxkMTAsZDExCisgICAgVkFEREwuVTggcTEsZDgsZDEzCisgICAgVk1MUy5JMTYgZDIsZDE2LGQzMAorICAgIFZNVUwuSTE2IGQyMSxkMTgsZDMxCisgICAgVkFEREwuVTggcTgsZDEwLGQxMworICAgIFZBRERMLlU4IHE5LGQxMSxkMTIKKyAgICBWQURETC5VOCBxMixkOSxkMTQKKyAgICBWTUxTLkkxNiBkNCxkMTYsZDMwCisgICAgVk1VTC5JMTYgZDIyLGQxOCxkMzEKKyAgICBWQURETC5VOCBxOCxkMTEsZDE0CisgICAgVkFEREwuVTggcTMsZDEwLGQxNQorICAgIFZBRERMLlU4IHE5LGQxMixkMTMKKyAgICBWTUxTLkkxNiBkNixkMTYsZDMwCisgICAgVkFERC5JMTYgZDAsZDAsZDIwCisgICAgVkFERC5JMTYgZDIsZDIsZDIxCisgICAgVkFERC5JMTYgZDQsZDQsZDIyCisgICAgVk1MQS5JMTYgZDYsZDE4LGQzMQorICAgIFZRUlNIUlVOLlMxNiBkMCxxMCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMixxMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkNCxxMiwjNQorICAgIFZRUlNIUlVOLlMxNiBkNixxMywjNQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTIwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorCisgICAgLnNlY3Rpb24gLnJvZGF0YQorICAgIC5hbGlnbiA0CisKK2FybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvOgorICAgIC53b3JkICAgV2lkdGhJczJNVklzTm90WmVybywgV2lkdGhJczJNVklzTm90WmVybworICAgIC53b3JkICAgV2lkdGhJczRNVklzTm90WmVybywgV2lkdGhJczRNVklzTm90WmVybworICAgIC53b3JkICAgV2lkdGhJczhNVklzTm90WmVybworCithcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybzoKKyAgICAud29yZCAgIFdpZHRoSXMyTVZJc1plcm8sIFdpZHRoSXMyTVZJc1plcm8KKyAgICAud29yZCAgIFdpZHRoSXM0TVZJc1plcm8sIFdpZHRoSXM0TVZJc1plcm8KKyAgICAud29yZCAgIFdpZHRoSXM4TVZJc1plcm8KKworICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWE6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIExEUkQgICAgIHI2LHI3LFtzcCwjMHg3MF0KKyAgICBMRFJEICAgICByNCxyNSxbc3AsIzB4NjhdCisgICAgUlNCICAgICAgcjgscjYsIzgKKyAgICBSU0IgICAgICByOSxyNywjOAorICAgIENNTiAgICAgIHI2LHI3CisgICAgTU9WICAgICAgcjEwLCMxCisgICAgTERSRVEgICAgcjExLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm8KKyAgICBTVUIgICAgICBscixyMSxyMTAKKyAgICBMRFJORSAgICByMTEsID1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKKyAgICBTTVVMQkIgICByMTIscjgscjkKKyAgICBTTVVMQkIgICByOSxyNixyOQorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgorICAgIFNNVUxCQiAgIHI4LHI4LHI3CisgICAgU01VTEJCICAgcjYscjYscjcKKyAgICBWRFVQLjggICBkMTIscjEyCisgICAgVkRVUC44ICAgZDEzLHI5CisgICAgVkRVUC44ICAgZDE0LHI4CisgICAgVkRVUC44ICAgZDE1LHI2CisgICAgTERSICAgICAgcGMsW3IxMSxyNCxMU0wgIzFdCisKK1dpZHRoSXM4TVZJc05vdFplcm86CisgICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAorICAgIFZNVUxMLlU4IHEyLGQwLGQxMgorICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgorICAgIFZNVUxMLlU4IHEzLGQyLGQxMgorICAgIFZMRDEuOCAgIHtkMTZ9LFtyMF0scjEwCisgICAgVk1MQUwuVTggcTIsZDEsZDEzCisgICAgVkxEMS44ICAge2QxN30sW3IwXSxscgorICAgIFZNVUxMLlU4IHExMSxkMTYsZDEyCisgICAgVk1MQUwuVTggcTMsZDMsZDEzCisgICAgVkxEMS44ICAge2QxOH0sW3IwXSxyMTAKKyAgICBWTUxBTC5VOCBxMixkMixkMTQKKyAgICBWTUxBTC5VOCBxMTEsZDE3LGQxMworICAgIFZNVUxMLlU4IHExMixkMTgsZDEyCisgICAgVkxEMS44ICAge2QxOX0sW3IwXSxscgorICAgIFZNTEFMLlU4IHEzLGQxNixkMTQKKyAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCisgICAgVk1MQUwuVTggcTEyLGQxOSxkMTMKKyAgICBWTUxBTC5VOCBxMTEsZDE4LGQxNAorICAgIFZNTEFMLlU4IHEyLGQzLGQxNQorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgorICAgIFZNTEFMLlU4IHExMixkMCxkMTQKKyAgICBWTUxBTC5VOCBxMyxkMTcsZDE1CisgICAgVk1MQUwuVTggcTExLGQxOSxkMTUKKyAgICBTVUJTICAgICByNSxyNSwjNAorICAgIFZNTEFMLlU4IHExMixkMSxkMTUKKyAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgorICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2CisgICAgVlFSU0hSTi5VMTYgZDIwLHExMSwjNgorICAgIFZTVDEuNjQgIHtkOH0sW3IyXSxyMworICAgIFZRUlNIUk4uVTE2IGQyMSxxMTIsIzYKKyAgICBWU1QxLjY0ICB7ZDl9LFtyMl0scjMKKyAgICBWU1QxLjY0ICB7ZDIwfSxbcjJdLHIzCisgICAgVlNUMS42NCAge2QyMX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXM4TVZJc05vdFplcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczRNVklzTm90WmVybzoKKyAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCisgICAgVk1VTEwuVTggcTIsZDAsZDEyCisgICAgVk1VTEwuVTggcTMsZDIsZDEyCisgICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCisgICAgVk1MQUwuVTggcTIsZDEsZDEzCisgICAgVk1MQUwuVTggcTMsZDMsZDEzCisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAorICAgIFZNTEFMLlU4IHEyLGQyLGQxNAorICAgIFZNTEFMLlU4IHEzLGQwLGQxNAorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVk1MQUwuVTggcTMsZDEsZDE1CisgICAgVk1MQUwuVTggcTIsZDMsZDE1CisgICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKKyAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkOVswXX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXM0TVZJc05vdFplcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczJNVklzTm90WmVybzoKKyAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCisgICAgVk1VTEwuVTggcTIsZDAsZDEyCisgICAgVk1VTEwuVTggcTMsZDIsZDEyCisgICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCisgICAgVk1MQUwuVTggcTIsZDEsZDEzCisgICAgVk1MQUwuVTggcTMsZDMsZDEzCisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAorICAgIFZNTEFMLlU4IHEyLGQyLGQxNAorICAgIFZNTEFMLlU4IHEzLGQwLGQxNAorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVk1MQUwuVTggcTMsZDEsZDE1CisgICAgVk1MQUwuVTggcTIsZDMsZDE1CisgICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKKyAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgorICAgIFZTVDEuMTYgIHtkOFswXX0sW3IyXSxyMworICAgIFZTVDEuMTYgIHtkOVswXX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXMyTVZJc05vdFplcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczhNVklzWmVybzoKKyAgICBTVUIgICAgICByMCxyMCxyMQorV2lkdGhJczhMb29wTVZJc1plcm86CisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCisgICAgU1VCUyAgICAgcjUscjUsIzIKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKKyAgICBWU1QxLjY0ICB7ZDB9LFtyMl0scjMKKyAgICBWU1QxLjY0ICB7ZDF9LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzOExvb3BNVklzWmVybworICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorCitXaWR0aElzNE1WSXNaZXJvOgorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCisgICAgVlNUMS4zMiAge2QxWzBdfSxbcjJdLHIzCisgICAgQkdUICAgICAgV2lkdGhJczRNVklzWmVybworICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorCitXaWR0aElzMk1WSXNaZXJvOgorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVlNUMS4xNiAge2QwWzBdfSxbcjJdLHIzCisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCisgICAgVlNUMS4xNiAge2QxWzBdfSxbcjJdLHIzCisgICAgQkdUICAgICAgV2lkdGhJczJNVklzWmVybworICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkNmQxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMyBWYWx1ZXMgKEludHJhIGNhc2UpICwKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCithcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZToKKyAgICAud29yZCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1CisgICAgLndvcmQgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MAorICAgIC53b3JkIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEKKyAgICAud29yZCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyCisgICAgLndvcmQgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNQorICAgIC53b3JkIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAKKyAgICAud29yZCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxCisgICAgLndvcmQgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMgorCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlOgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlOgorICAgIC5ieXRlIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKKyAgICAuYnl0ZSAxNywgMTcsIDE3LCAxNywgMTcsIDE3CisgICAgLmJ5dGUgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOAorICAgIC5ieXRlIDE5LCAxOSwgMTksIDE5LCAxOSwgMTkKKyAgICAuYnl0ZSAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwCisgICAgLmJ5dGUgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMQorICAgIC5ieXRlIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIKKyAgICAuYnl0ZSAyMywgMjMsIDIzLCAyMywgMjMsIDIzCisgICAgLmJ5dGUgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNAorCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGQ3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUwpAQCAtMCwwICsxLDUyIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgLmZ1bmMgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Cithcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0OgorICAgIFZQVVNIICAgIHtkOH0KKyAgICBWTEQ0LjE2ICB7ZDAsZDEsZDIsZDN9LFtyMV0KKyAgICBWTU9WLkkxNiBkNCwjMAorICAgIFZBREQuSTE2IGQ1LGQwLGQyCisgICAgVlNVQi5JMTYgZDYsZDAsZDIKKyAgICBWSEFERC5TMTYgZDcsZDEsZDQKKyAgICBWSEFERC5TMTYgZDgsZDMsZDQKKyAgICBWU1VCLkkxNiBkNyxkNyxkMworICAgIFZBREQuSTE2IGQ4LGQxLGQ4CisgICAgVkFERC5JMTYgZDAsZDUsZDgKKyAgICBWQURELkkxNiBkMSxkNixkNworICAgIFZTVUIuSTE2IGQyLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDMsZDUsZDgKKyAgICBWVFJOLjE2ICBkMCxkMQorICAgIFZUUk4uMTYgIGQyLGQzCisgICAgVlRSTi4zMiAgcTAscTEKKyAgICBWQURELkkxNiBkNSxkMCxkMgorICAgIFZTVUIuSTE2IGQ2LGQwLGQyCisgICAgVkhBREQuUzE2IGQ3LGQxLGQ0CisgICAgVkhBREQuUzE2IGQ4LGQzLGQ0CisgICAgVlNVQi5JMTYgZDcsZDcsZDMKKyAgICBWQURELkkxNiBkOCxkMSxkOAorICAgIFZBREQuSTE2IGQwLGQ1LGQ4CisgICAgVkFERC5JMTYgZDEsZDYsZDcKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZTVUIuSTE2IGQzLGQ1LGQ4CisgICAgVlJTSFIuUzE2IGQwLGQwLCM2CisgICAgVlJTSFIuUzE2IGQxLGQxLCM2CisgICAgVlJTSFIuUzE2IGQyLGQyLCM2CisgICAgVlJTSFIuUzE2IGQzLGQzLCM2CisgICAgVlNUMS4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCisgICAgVlBPUCAgICAge2Q4fQorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTUyZjhkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NDoKKyAgICBQVVNIICAgICB7cjQtcjgsbHJ9CisgICAgTERSICAgICAgcjIsW3IwLCMwXQorICAgIE1PViAgICAgIHI3LCMweDFmCisgICAgTU9WICAgICAgcjQsIzAKKyAgICBNT1YgICAgICByNSwjMAorICAgIExEUkIgICAgIHIzLFtyMl0sIzEKKyAgICBTVFJEICAgICByNCxyNSxbcjEsIzBdCisgICAgU1RSRCAgICAgcjQscjUsW3IxLCM4XQorICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjMHgxMF0KKyAgICBTVFJEICAgICByNCxyNSxbcjEsIzB4MThdCit1bnBhY2tMb29wOgorICAgIFRTVCAgICAgIHIzLCMweDEwCisgICAgTERSTkVTQiAgcjUsW3IyLCMxXQorICAgIExEUk5FQiAgIHI0LFtyMl0sIzIKKyAgICBBTkQgICAgICByNixyNyxyMyxMU0wgIzEKKyAgICBMRFJFUVNCICByNCxbcjJdLCMxCisgICAgT1JSTkUgICAgcjQscjQscjUsTFNMICM4CisgICAgVFNUICAgICAgcjMsIzB4MjAKKyAgICBMRFJFUUIgICByMyxbcjJdLCMxCisgICAgU1RSSCAgICAgcjQsW3IxLHI2XQorICAgIEJFUSAgICAgIHVucGFja0xvb3AKKyAgICBTVFIgICAgICByMixbcjAsIzBdCisgICAgUE9QICAgICAge3I0LXI4LHBjfQorICAgIC5lbmRmdW5jCisgICAgLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTYxMDU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKK29teFZDTTRQMTBfRGVibG9ja0x1bWFfSToKKyAgICBQVVNIICAgICB7cjQtcjksbHJ9CisgICAgTU9WUyAgICAgcjYscjAKKyAgICBTVUIgICAgICBzcCxzcCwjMHhjCisgICAgTU9WICAgICAgcjkscjEKKyAgICBNT1YgICAgICByNyxyMgorICAgIE1PViAgICAgIHI4LHIzCisgICAgTERSICAgICAgcjQsW3NwLCMweDI4XQorICAgIExEUiAgICAgIHI1LFtzcCwjMHgyY10KKyAgICBCRVEgICAgICBMMHg1OAorICAgIFRTVCAgICAgIHI2LCM3CisgICAgVFNURVEgICAgcjksIzcKKyAgICBCTkUgICAgICBMMHg1OAorICAgIENNUCAgICAgIHI3LCMwCisgICAgQ01QTkUgICAgcjgsIzAKKyAgICBDTVBORSAgICByNCwjMAorICAgIEJFUSAgICAgIEwweDU4CisgICAgVFNUICAgICAgcjQsIzMKKyAgICBCTkUgICAgICBMMHg1OAorICAgIENNUCAgICAgIHI1LCMwCisgICAgQkVRICAgICAgTDB4NTgKKyAgICBUU1QgICAgICByNSwjMworICAgIEJFUSAgICAgIEwweDY0CitMMHg1ODoKKyAgICBNVk4gICAgICByMCwjNAorTDB4NWM6CisgICAgQUREICAgICAgc3Asc3AsIzB4YworICAgIFBPUCAgICAgIHtyNC1yOSxwY30KK0wweDY0OgorICAgIFNUUiAgICAgIHI0LFtzcCwjMF0KKyAgICBNT1YgICAgICByMyxyOAorICAgIFNUUiAgICAgIHI1LFtzcCwjNF0KKyAgICBNT1YgICAgICByMixyNworICAgIE1PViAgICAgIHIxLHI5CisgICAgTU9WICAgICAgcjAscjYKKyAgICBCTCAgICAgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSQorICAgIENNUCAgICAgIHIwLCMwCisgICAgQk5FICAgICAgTDB4NWMKKyAgICBBREQgICAgICByMyxyNSwjMHgxMAorICAgIEFERCAgICAgIHIyLHI0LCMweDEwCisgICAgU1RSICAgICAgcjMsW3NwLCM0XQorICAgIFNUUiAgICAgIHIyLFtzcCwjMF0KKyAgICBBREQgICAgICByMyxyOCwjMgorICAgIEFERCAgICAgIHIyLHI3LCMyCisgICAgTU9WICAgICAgcjEscjkKKyAgICBNT1YgICAgICByMCxyNgorICAgIEJMICAgICAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JCisgICAgQUREICAgICAgc3Asc3AsIzB4YworICAgIFBPUCAgICAgIHtyNC1yOSxwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjFlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAorICAgIC5mdW5jICAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAorb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZDoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kOX0KKyAgICBTVUIgICAgICBzcCxzcCwjMHgyMAorICAgIEFERCAgICAgIHI0LHNwLCMwCisgICAgTERSICAgICAgcjUsW3NwLCMweDY0XQorICAgIE1PViAgICAgIHI3LHIxCisgICAgTU9WICAgICAgcjgscjIKKyAgICBNT1YgICAgICByOSxyMworICAgIENNUCAgICAgIHI1LCMwCisgICAgQkVRICAgICAgTDB4MTE0CisgICAgTU9WICAgICAgcjEscjQKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0ICA7Ly8KKyAgICBMRFIgICAgICByMSxbc3AsIzB4NjBdCisgICAgTERSICAgICAgcjExLCA9YXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgTERSICAgICAgcjEwLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgTERSICAgICAgcjIsICA9YXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgTERSU0IgICAgcjEyLFtyMTEscjFdCisgICAgTERSU0IgICAgbHIsW3IxMCxyMV0KKyAgICBMRFIgICAgICByMTAsID0weDMwMjA1MDQKKyAgICBMRFIgICAgICByMSwgPTB4NTA0MDEwMAorICAgIEFERCAgICAgIHIyLHIyLHIxMgorICAgIFZEVVAuMzIgIGQ3LHIxCisgICAgVkRVUC4zMiAgZDkscjEwCisgICAgVkRVUC4xNiAgZDUsbHIKKyAgICBWTEQxLjggICB7ZDZ9LFtyMl0KKyAgICBWVEJMLjggICBkOCx7ZDZ9LGQ3CisgICAgVlRCTC44ICAgZDQse2Q2fSxkOQorICAgIENNUCAgICAgIHI4LCMwCisgICAgVkxEMS4xNiAge2QwLGQxLGQyLGQzfSxbcjRdCisgICAgVlNITC5VMTYgZDgsZDgsZDUKKyAgICBWU0hMLlUxNiBkNCxkNCxkNQorICAgIEJFUSAgICAgIEwxCisgICAgTERSU0ggICAgcjEwLFtyOCwjMF0KK0wxOgorICAgIFZNVUwuSTE2IGQwLGQwLGQ4CisgICAgVk1VTC5JMTYgZDEsZDEsZDQKKyAgICBWTVVMLkkxNiBkMixkMixkOAorICAgIFZNVUwuSTE2IGQzLGQzLGQ0CisgICAgVk1PVk5FLjE2IGQwWzBdLHIxMAorICAgIFZUUk4uMTYgIGQwLGQxCisgICAgVlRSTi4xNiAgZDIsZDMKKyAgICBWVFJOLjMyICBxMCxxMQorICAgIFZNT1YuSTE2IGQ0LCMwCisgICAgVkFERC5JMTYgZDUsZDAsZDIKKyAgICBWU1VCLkkxNiBkNixkMCxkMgorICAgIFZIQURELlMxNiBkNyxkMSxkNAorICAgIFZIQURELlMxNiBkOCxkMyxkNAorICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCisgICAgVkFERC5JMTYgZDgsZDEsZDgKKyAgICBWQURELkkxNiBkMCxkNSxkOAorICAgIFZBREQuSTE2IGQxLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBWU1VCLkkxNiBkMyxkNSxkOAorICAgIFZUUk4uMTYgIGQwLGQxCisgICAgVlRSTi4xNiAgZDIsZDMKKyAgICBWVFJOLjMyICBxMCxxMQorICAgIFZBREQuSTE2IGQ1LGQwLGQyCisgICAgVlNVQi5JMTYgZDYsZDAsZDIKKyAgICBWSEFERC5TMTYgZDcsZDEsZDQKKyAgICBWSEFERC5TMTYgZDgsZDMsZDQKKyAgICBWU1VCLkkxNiBkNyxkNyxkMworICAgIFZBREQuSTE2IGQ4LGQxLGQ4CisgICAgVkFERC5JMTYgZDAsZDUsZDgKKyAgICBWQURELkkxNiBkMSxkNixkNworICAgIFZTVUIuSTE2IGQyLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDMsZDUsZDgKKyAgICBWUlNIUi5TMTYgZDAsZDAsIzYKKyAgICBWUlNIUi5TMTYgZDEsZDEsIzYKKyAgICBWUlNIUi5TMTYgZDIsZDIsIzYKKyAgICBWUlNIUi5TMTYgZDMsZDMsIzYKKyAgICBCICAgICAgICBMMHgxMzAKK0wweDExNDoKKyAgICBMRFJTSCAgICByMTAsW3I4LCMwXQorICAgIEFERCAgICAgIHIxMCxyMTAsIzB4MjAKKyAgICBBU1IgICAgICByMTAscjEwLCM2CisgICAgVkRVUC4xNiAgZDAscjEwCisgICAgVkRVUC4xNiAgZDEscjEwCisgICAgVkRVUC4xNiAgZDIscjEwCisgICAgVkRVUC4xNiAgZDMscjEwCitMMHgxMzA6CisgICAgTERSICAgICAgcjEsW3NwLCMweDU4XQorICAgIExEUiAgICAgIHIxMCxbc3AsIzB4NWNdCisgICAgTERSICAgICAgcjMsW3I3XSxyMQorICAgIExEUiAgICAgIHI1LFtyN10scjEKKyAgICBWTU9WICAgICBkNCxyMyxyNQorICAgIExEUiAgICAgIHIzLFtyN10scjEKKyAgICBMRFIgICAgICByNSxbcjcsIzBdCisgICAgVk1PViAgICAgZDUscjMscjUKKyAgICBWQUREVy5VOCBxMyxxMCxkNAorICAgIFZBRERXLlU4IHE0LHExLGQ1CisgICAgVlFNT1ZVTi5TMTYgZDAscTMKKyAgICBWUU1PVlVOLlMxNiBkMSxxNAorICAgIFZTVDEuMzIgIHtkMFswXX0sW3I5XSxyMTAKKyAgICBWU1QxLjMyICB7ZDBbMV19LFtyOV0scjEwCisgICAgVlNUMS4zMiAge2QxWzBdfSxbcjldLHIxMAorICAgIFZTVDEuMzIgIHtkMVsxXX0sW3I5XQorICAgIE1PViAgICAgIHIwLCMwCisgICAgQUREICAgICAgc3Asc3AsIzB4MjAKKyAgICBWUE9QICAgICB7ZDgtZDl9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YmE1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUwpAQCAtMCwwICsxLDg3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JCitvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JOgorICAgIFBVU0ggICAgIHtyNC1yMTAsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXSEKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCxyMQorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdIQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2NF0KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NjBdCisgICAgTERSICAgICAgcjksID0weDMwMzAzMDMKKyAgICBMRFIgICAgICByOCwgPTB4NDA0MDQwNAorICAgIFZNT1YuSTggIGQxNCwjMAorICAgIFZNT1YuSTggIGQxNSwjMHgxCisgICAgVk1PVi5JMTYgZDEsIzB4NAorICAgIE1PViAgICAgIHI3LCMweDQwMDAwMDAwCitMMHgzODoKKyAgICBMRFIgICAgICByNixbcjRdLCM4CisgICAgVkxEMS44ICAge2Q2fSxbcjBdLHIxCisgICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxCisgICAgQ01QICAgICAgcjYsIzAKKyAgICBWTEQxLjggICB7ZDR9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEKKyAgICBWQUJELlU4ICBkMTksZDYsZDQKKyAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKKyAgICBWQUJELlU4ICBkMTMsZDQsZDgKKyAgICBWTEQxLjggICB7ZDEwfSxbcjBdLHIxCisgICAgQkVRICAgICAgTDB4ZTQKKyAgICBWQUJELlU4ICBkMTIsZDUsZDQKKyAgICBWQUJELlU4ICBkMTgsZDksZDgKKyAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCisgICAgVk1PVi4zMiAgZDI2WzBdLHI2CisgICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKKyAgICBWTU9WTC5VOCBxMTMsZDI2CisgICAgVkFCRC5VOCAgZDE3LGQxMCxkOAorICAgIFZDR1QuUzE2IGQyNyxkMjYsIzAKKyAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCisgICAgVkNHVC5VOCAgZDE5LGQyLGQxOQorICAgIFZBTkQgICAgIGQxNixkMTYsZDI3CisgICAgVFNUICAgICAgcjYscjkKKyAgICBWQ0dULlU4ICBkMTcsZDIsZDE3CisgICAgVkFORCAgICAgZDE2LGQxNixkMTIKKyAgICBWQU5EICAgICBkMTIsZDE2LGQxNworICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5CisgICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisgICAgVFNUICAgICAgcjYscjgKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKKyAgICBWVFNULjE2ICBkMjYsZDI2LGQxCisgICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgVkJJVCAgICAgZDI5LGQxMyxkMjYKKyAgICBWQklUICAgICBkMjQsZDMxLGQyNgorICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKKyAgICBWQklGICAgICBkMjQsZDgsZDE2CisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQorICAgIEFERFMgICAgIHI3LHI3LHI3CisgICAgVlNUMS44ICAge2QyNH0sW3IwXSxyMQorICAgIEJORSAgICAgIEwweDM4CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTAscGN9CitMMHhlNDoKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEFERFMgICAgIHI3LHI3LHI3CisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBBREQgICAgICByNSxyNSwjNAorICAgIEJORSAgICAgIEwweDM4CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTAscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RkZGJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kKK29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0k6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdIQorICAgIFNVQiAgICAgIHIwLHIwLCM0CisgICAgVkxEMS44ICAge2QyW119LFtyM10hCisgICAgTERSICAgICAgcjQsW3NwLCMweDZjXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KKyAgICBMRFIgICAgICByOCwgPTB4NDA0MDQwNAorICAgIExEUiAgICAgIHI5LCA9MHgzMDMwMzAzCisgICAgVk1PVi5JOCAgZDE0LCMwCisgICAgVk1PVi5JOCAgZDE1LCMweDEKKyAgICBWTU9WLkkxNiBkMSwjMHg0CisgICAgTU9WICAgICAgcjcsIzB4NDAwMDAwMDAKK0wweDM0OgorICAgIExEUiAgICAgIHI2LFtyNF0sIzgKKyAgICBBREQgICAgICByMTAscjAscjEKKyAgICBBREQgICAgICBscixyMSxyMQorICAgIFZMRDEuOCAgIHtkN30sW3IwXSxscgorICAgIFZMRDEuOCAgIHtkOH0sW3IxMF0sbHIKKyAgICBWTEQxLjggICB7ZDV9LFtyMF0sbHIKKyAgICBWTEQxLjggICB7ZDEwfSxbcjEwXSxscgorICAgIFZMRDEuOCAgIHtkNn0sW3IwXSxscgorICAgIFZMRDEuOCAgIHtkOX0sW3IxMF0sbHIKKyAgICBWTEQxLjggICB7ZDR9LFtyMF0sbHIKKyAgICBWTEQxLjggICB7ZDExfSxbcjEwXSxscgorICAgIFZaSVAuOCAgIGQ3LGQ4CisgICAgVlpJUC44ICAgZDUsZDEwCisgICAgVlpJUC44ICAgZDYsZDkKKyAgICBWWklQLjggICBkNCxkMTEKKyAgICBWWklQLjE2ICBkNyxkNQorICAgIFZaSVAuMTYgIGQ4LGQxMAorICAgIFZaSVAuMTYgIGQ2LGQ0CisgICAgVlpJUC4xNiAgZDksZDExCisgICAgVlRSTi4zMiAgZDcsZDYKKyAgICBWVFJOLjMyICBkNSxkNAorICAgIFZUUk4uMzIgIGQxMCxkMTEKKyAgICBWVFJOLjMyICBkOCxkOQorICAgIENNUCAgICAgIHI2LCMwCisgICAgVkFCRC5VOCAgZDE5LGQ2LGQ0CisgICAgVkFCRC5VOCAgZDEzLGQ0LGQ4CisgICAgQkVRICAgICAgTDB4MTcwCisgICAgVkFCRC5VOCAgZDEyLGQ1LGQ0CisgICAgVkFCRC5VOCAgZDE4LGQ5LGQ4CisgICAgVk1PVi4zMiAgZDI2WzBdLHI2CisgICAgVkNHVC5VOCAgZDE2LGQwLGQxMworICAgIFZNQVguVTggIGQxMixkMTgsZDEyCisgICAgVk1PVkwuVTggcTEzLGQyNgorICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKKyAgICBWQ0dULlMxNiBkMjcsZDI2LCMwCisgICAgVkNHVC5VOCAgZDEyLGQyLGQxMgorICAgIFZDR1QuVTggIGQxOSxkMixkMTkKKyAgICBWQU5EICAgICBkMTYsZDE2LGQyNworICAgIFRTVCAgICAgIHI2LHI5CisgICAgVkNHVC5VOCAgZDE3LGQyLGQxNworICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCisgICAgVkFORCAgICAgZDEyLGQxNixkMTcKKyAgICBWQU5EICAgICBkMTcsZDE2LGQxOQorICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgIFRTVCAgICAgIHI2LHI4CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVlRTVC4xNiAgZDI2LGQyNixkMQorICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgIFZCSVQgICAgIGQyOSxkMTMsZDI2CisgICAgVkJJVCAgICAgZDI0LGQzMSxkMjYKKyAgICBBREQgICAgICByMTAscjAsIzMKKyAgICBWQklGICAgICBkMjksZDQsZDE2CisgICAgQUREICAgICAgcjEyLHIxMCxyMQorICAgIEFERCAgICAgIGxyLHIxLHIxCisgICAgVkJJRiAgICAgZDI0LGQ4LGQxNgorICAgIEFERFMgICAgIHI3LHI3LHI3CisgICAgVlNUMS44ICAge2QyOVswXX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzFdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjlbMl19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyOVszXX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzRdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjlbNV19LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyOVs2XX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzddfSxbcjEyXSxscgorICAgIEFERCAgICAgIHIxMixyMCwjNAorICAgIEFERCAgICAgIHIxMCxyMTIscjEKKyAgICBWU1QxLjggICB7ZDI0WzBdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjRbMV19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyNFsyXX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzNdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjRbNF19LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyNFs1XX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzZdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjRbN119LFtyMTBdLGxyCisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBCTkUgICAgICBMMHgzNAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorTDB4MTcwOgorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKKyAgICBBRERTICAgICByNyxyNyxyNworICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgQUREICAgICAgcjUscjUsIzQKKyAgICBCTkUgICAgICBMMHgzNAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzU1ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kKK29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBBREQgICAgICByNyxyMiwjMQorICAgIEFERCAgICAgIHI4LHIzLCMxCisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NjhdCisgICAgTU9WICAgICAgcjExLCMwCisgICAgVk1PVi5JOCAgZDE0LCMwCisgICAgVk1PVi5JOCAgZDE1LCMweDEKKyAgICBBREQgICAgICByMTAscjEscjEKKyAgICBNT1YgICAgICByOSwjMHg1NTAwMDAwMAorTDB4Mzg6CisgICAgTERSSCAgICAgcjEyLFtyNF0sIzIKKyAgICBBREQgICAgICByNixyMCxyMQorICAgIENNUCAgICAgIHIxMiwjMAorICAgIEJFUSAgICAgIEwweGU0CisgICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkNn0sW3I2XSxyMTAKKyAgICBWTEQxLjggICB7ZDV9LFtyMF0scjEwCisgICAgVkxEMS44ICAge2Q0fSxbcjZdLHIxMAorICAgIFZMRDEuOCAgIHtkOH0sW3IwXSxyMTAKKyAgICBWQUJELlU4ICBkMTIsZDQsZDUKKyAgICBWTEQxLjggICB7ZDl9LFtyNl0KKyAgICBWQUJELlU4ICBkMTMsZDgsZDQKKyAgICBWTEQxLjggICB7ZDEwfSxbcjBdLHIxCisgICAgVkFCRC5VOCAgZDE4LGQ5LGQ4CisgICAgVkFCRC5VOCAgZDE5LGQ2LGQ0CisgICAgVkNHVC5VOCAgZDE2LGQwLGQxMworICAgIFRTVCAgICAgIHIxMiwjMHhmZgorICAgIFZNQVguVTggIGQxMixkMTgsZDEyCisgICAgVkFCRC5VOCAgZDE3LGQxMCxkOAorICAgIFZNT1ZFUS4zMiBkMTZbMF0scjExCisgICAgVFNUICAgICAgcjEyLCMweGZmMDAKKyAgICBWQ0dULlU4ICBkMTksZDIsZDE5CisgICAgVkNHVC5VOCAgZDEyLGQyLGQxMgorICAgIFZNT1ZFUS4zMiBkMTZbMV0scjExCisgICAgVkNHVC5VOCAgZDE3LGQyLGQxNworICAgIFZMRDEuOCAgIHtkMTF9LFtyMF0KKyAgICBWQU5EICAgICBkMTYsZDE2LGQxMgorICAgIFRTVCAgICAgIHIxMiwjNAorICAgIFZBTkQgICAgIGQxMixkMTYsZDE3CisgICAgVkFORCAgICAgZDE3LGQxNixkMTkKKyAgICBCTkUgICAgICBMMHhmOAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgorICAgIFNVQiAgICAgIHIwLHIwLHIxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjEKKyAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxCisgICAgU1VCICAgICAgcjYscjAscjEsTFNMICMyCisgICAgVlNUMS44ICAge2QyNH0sW3IwXSxyMQorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVlNUMS44ICAge2QyNX0sW3IwXQorICAgIEFERCAgICAgIHIwLHI2LCM4CisgICAgQkNDICAgICAgTDB4MzgKKyAgICBCICAgICAgICBMMHgxMzAKK0wweGU0OgorICAgIEFERCAgICAgIHIwLHIwLCM4CisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBBREQgICAgICByNSxyNSwjMgorICAgIEJDQyAgICAgIEwweDM4CisgICAgQiAgICAgICAgTDB4MTMwCitMMHhmODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgVlNUMS44ICAge2QzMX0sW3IwXSxyMQorICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjEKKyAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxCisgICAgU1VCICAgICAgcjYscjAscjEsTFNMICMyCisgICAgVlNUMS44ICAge2QyNH0sW3IwXSxyMQorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVlNUMS44ICAge2QyNX0sW3IwXSxyMQorICAgIEFERCAgICAgIHI1LHI1LCMyCisgICAgVlNUMS44ICAge2QyOH0sW3IwXQorICAgIEFERCAgICAgIHIwLHI2LCM4CisgICAgQkNDICAgICAgTDB4MzgKK0wweDEzMDoKKyAgICBTVUIgICAgICByMCxyMCwjMHgxMAorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCisgICAgQUREICAgICAgcjAscjAscjEsTFNMICMyCisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCTkUgICAgICBMMHgzOAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNjMzJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKK29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBBREQgICAgICByNyxyMiwjMQorICAgIEFERCAgICAgIHI4LHIzLCMxCisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBTVUIgICAgICByMCxyMCwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgTERSICAgICAgcjQsW3NwLCMweDZjXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KKyAgICBNT1YgICAgICByNiwjMAorICAgIFZNT1YuSTggIGQxNCwjMAorICAgIFZNT1YuSTggIGQxNSwjMHgxCisgICAgTU9WICAgICAgcjksIzB4MTEwMDAwMDAKKyAgICBBREQgICAgICByMTEscjEscjEKK0wweDM4OgorICAgIExEUkggICAgIHIxMixbcjRdLCM0CisgICAgQ01QICAgICAgcjEyLCMwCisgICAgQkVRICAgICAgTDB4MTYwCisgICAgQUREICAgICAgcjEwLHIwLHIxCisgICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxMQorICAgIFZMRDEuOCAgIHtkOH0sW3IxMF0scjExCisgICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxMQorICAgIFZaSVAuOCAgIGQ3LGQ4CisgICAgVkxEMS44ICAge2QxMH0sW3IxMF0scjExCisgICAgVkxEMS44ICAge2Q2fSxbcjBdLHIxMQorICAgIFZaSVAuOCAgIGQ1LGQxMAorICAgIFZMRDEuOCAgIHtkOX0sW3IxMF0scjExCisgICAgVkxEMS44ICAge2Q0fSxbcjBdLHIxMQorICAgIFZMRDEuOCAgIHtkMTF9LFtyMTBdLHIxMQorICAgIFZaSVAuOCAgIGQ2LGQ5CisgICAgVlpJUC4xNiAgZDgsZDEwCisgICAgVlpJUC44ICAgZDQsZDExCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVlpJUC4xNiAgZDcsZDUKKyAgICBWWklQLjE2ICBkOSxkMTEKKyAgICBWWklQLjE2ICBkNixkNAorICAgIFZUUk4uMzIgIGQ4LGQ5CisgICAgVlRSTi4zMiAgZDUsZDQKKyAgICBWVFJOLjMyICBkMTAsZDExCisgICAgVlRSTi4zMiAgZDcsZDYKKyAgICBWQUJELlU4ICBkMTMsZDQsZDgKKyAgICBWQUJELlU4ICBkMTIsZDUsZDQKKyAgICBWQUJELlU4ICBkMTgsZDksZDgKKyAgICBWQUJELlU4ICBkMTksZDYsZDQKKyAgICBUU1QgICAgICByMTIsIzB4ZmYKKyAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCisgICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKKyAgICBWQUJELlU4ICBkMTcsZDEwLGQ4CisgICAgVk1PVkVRLjMyIGQxNlswXSxyNgorICAgIFRTVCAgICAgIHIxMiwjMHhmZjAwCisgICAgVkNHVC5VOCAgZDE5LGQyLGQxOQorICAgIFZDR1QuVTggIGQxMixkMixkMTIKKyAgICBWTU9WRVEuMzIgZDE2WzFdLHI2CisgICAgVkNHVC5VOCAgZDE3LGQyLGQxNworICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCisgICAgVFNUICAgICAgcjEyLCM0CisgICAgVkFORCAgICAgZDEyLGQxNixkMTcKKyAgICBWQU5EICAgICBkMTcsZDE2LGQxOQorICAgIEJORSAgICAgIEwweDE3YworICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICBWWklQLjggICBkNyxkNgorICAgIFZaSVAuOCAgIGQzMCxkMjkKKyAgICBWWklQLjggICBkMjQsZDI1CisgICAgVlpJUC44ICAgZDEwLGQxMQorICAgIFZaSVAuMTYgIGQ3LGQzMAorICAgIEFERCAgICAgIHIxMCxyMCxyMQorICAgIFZaSVAuMTYgIGQyNCxkMTAKKyAgICBWWklQLjE2ICBkMjUsZDExCisgICAgVlpJUC4xNiAgZDYsZDI5CisgICAgVlRSTi4zMiAgZDcsZDI0CisgICAgVlRSTi4zMiAgZDMwLGQxMAorICAgIFZUUk4uMzIgIGQ2LGQyNQorICAgIFZUUk4uMzIgIGQyOSxkMTEKKyAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKKyAgICBWU1QxLjggICB7ZDEwfSxbcjEwXSxyMTEKKyAgICBWU1QxLjggICB7ZDZ9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyNX0sW3IxMF0scjExCisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxMQorICAgIEFERCAgICAgIHI1LHI1LCMyCisgICAgVlNUMS44ICAge2QxMX0sW3IxMF0scjEKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCQ0MgICAgICBMMHgzOAorICAgIEIgICAgICAgIEwweDFmMAorTDB4MTYwOgorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHI1LHI1LCM0CisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCQ0MgICAgICBMMHgzOAorICAgIEIgICAgICAgIEwweDFmMAorTDB4MTdjOgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICBWWklQLjggICBkNyxkMzEKKyAgICBWWklQLjggICBkMzAsZDI5CisgICAgVlpJUC44ICAgZDI0LGQyNQorICAgIFZaSVAuOCAgIGQyOCxkMTEKKyAgICBWWklQLjE2ICBkNyxkMzAKKyAgICBBREQgICAgICByMTAscjAscjEKKyAgICBWWklQLjE2ICBkMjQsZDI4CisgICAgVlpJUC4xNiAgZDI1LGQxMQorICAgIFZaSVAuMTYgIGQzMSxkMjkKKyAgICBWVFJOLjMyICBkNyxkMjQKKyAgICBWVFJOLjMyICBkMzAsZDI4CisgICAgVlRSTi4zMiAgZDMxLGQyNQorICAgIFZUUk4uMzIgIGQyOSxkMTEKKyAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKKyAgICBWU1QxLjggICB7ZDI4fSxbcjEwXSxyMTEKKyAgICBWU1QxLjggICB7ZDMxfSxbcjBdLHIxMQorICAgIFZTVDEuOCAgIHtkMjV9LFtyMTBdLHIxMQorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMTEKKyAgICBBREQgICAgICByNSxyNSwjNAorICAgIFZTVDEuOCAgIHtkMTF9LFtyMTBdLHIxMQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBWTEQxLjggICB7ZDJbXX0sW3I4XQorICAgIEJDQyAgICAgIEwweDM4CitMMHgxZjA6CisgICAgU1VCICAgICAgcjQscjQsIzB4ZQorICAgIFNVQiAgICAgIHI1LHI1LCMweGUKKyAgICBTVUIgICAgICByMCxyMCwjMHgxMAorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgQUREICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBCTkUgICAgICBMMHgzOAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmMzZDdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorICAgIC5mdW5jICAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKK29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBTVUIgICAgICBzcCxzcCwjMHgxMAorICAgIExEUiAgICAgIHI2LFtzcCwjMHg3OF0KKyAgICBMRFIgICAgICByNyxbc3AsIzB4N2NdCisgICAgTERSICAgICAgcjUsW3NwLCMweDgwXQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg4NF0KKyAgICBBREQgICAgICByNixyNixyNyxMU0wgIzIKKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBWTU9WLkkxNiBkMzEsIzB4MTQKKyAgICBWTU9WLkkxNiBkMzAsIzB4NQorTDB4MmM6CisgICAgU1RNICAgICAgcjExLHtyMC1yM30KKyAgICBBREQgICAgICBwYyxwYyxyNixMU0wgIzIKKyAgICBCICAgICAgICBMMHgzZjAKKyAgICBCICAgICAgICBMMHg3OAorICAgIEIgICAgICAgIEwweGE4CisgICAgQiAgICAgICAgTDB4ZGMKKyAgICBCICAgICAgICBMMHgxMDAKKyAgICBCICAgICAgICBMMHgxMzQKKyAgICBCICAgICAgICBMMHgxNjgKKyAgICBCICAgICAgICBMMHgxYTgKKyAgICBCICAgICAgICBMMHgxZjAKKyAgICBCICAgICAgICBMMHgyMzQKKyAgICBCICAgICAgICBMMHgyNTgKKyAgICBCICAgICAgICBMMHgyYjAKKyAgICBCICAgICAgICBMMHgyZDgKKyAgICBCICAgICAgICBMMHgzMzAKKyAgICBCICAgICAgICBMMHgzNjQKKyAgICBCICAgICAgICBMMHgzYTgKKyAgICBCICAgICAgICBMMHgzZjAKK0wweDc4OgorICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzEKKyAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDExfSxbcjEyXSxyMQorICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0KKyAgICBWTEQxLjggICB7ZDEyfSxbcjEyXQorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDExWzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDEyWzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4YTg6CisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQxNAorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQxOAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQxNgorICAgIFZSSEFERC5VOCBkMjgsZDI4LGQyMAorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweGRjOgorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxMDA6CisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQxNQorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQxOQorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQxNworICAgIFZSSEFERC5VOCBkMjgsZDI4LGQyMQorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDEzNDoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMCxkMCxkOQorICAgIFZSSEFERC5VOCBkNCxkNCxkMTEKKyAgICBWUkhBREQuVTggZDIsZDIsZDEwCisgICAgVlJIQURELlU4IGQ2LGQ2LGQxMgorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MTY4OgorICAgIE1PViAgICAgIHI4LHIwCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBTVUIgICAgICByMCxyOCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxYTg6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICBWUVJTSFJVTi5TMTYgZDE0LHE3LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxNixxOCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTgscTksIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMCwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDFmMDoKKyAgICBNT1YgICAgICByOCxyMAorICAgIEFERCAgICAgIHIwLHIwLCMxCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBTVUIgICAgICByMCxyOCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgyMzQ6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDI1ODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM0CisgICAgVkVYVC44ICAgZDIwLGQyMCxkMjEsIzQKKyAgICBWRVhULjggICBkMjIsZDIyLGQyMywjNAorICAgIFZFWFQuOCAgIGQyNCxkMjQsZDI1LCM0CisgICAgVlFSU0hSVU4uUzE2IGQxNCxxOSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTYscTEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQxOCxxMTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMiwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDJiMDoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MmQ4OgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgVkVYVC44ICAgZDE4LGQxOCxkMTksIzYKKyAgICBWRVhULjggICBkMjAsZDIwLGQyMSwjNgorICAgIFZFWFQuOCAgIGQyMixkMjIsZDIzLCM2CisgICAgVkVYVC44ICAgZDI0LGQyNCxkMjUsIzYKKyAgICBWUVJTSFJVTi5TMTYgZDE0LHE5LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxNixxMTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE4LHExMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMjAscTEyLCM1CisgICAgVlJIQURELlU4IGQwLGQwLGQxNAorICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKKyAgICBWUkhBREQuVTggZDIsZDIsZDE2CisgICAgVlJIQURELlU4IGQ2LGQ2LGQyMAorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MzMwOgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQwLGQwLGQxMAorICAgIFZSSEFERC5VOCBkNCxkNCxkMTIKKyAgICBWUkhBREQuVTggZDIsZDIsZDExCisgICAgVlJIQURELlU4IGQ2LGQ2LGQxMworICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MzY0OgorICAgIE1PViAgICAgIHI4LHIwCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMCxyOCxyMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMAorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0CisgICAgVlJIQURELlU4IGQyNCxkMjQsZDIKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkNgorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDNhODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIFZRUlNIUlVOLlMxNiBkMTQscTgsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE2LHE5LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxOCxxMTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMSwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDNmMDoKKyAgICBNT1YgICAgICByOCxyMAorICAgIEFERCAgICAgIHIwLHIwLCMxCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMCxyOCxyMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMAorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0CisgICAgVlJIQURELlU4IGQyNCxkMjQsZDIKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkNgorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKK0wweDQzNDoKKyAgICBMRE0gICAgICByMTEse3IwLXIzfQorICAgIFNVQlMgICAgIHI1LHI1LCM0CisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBBREQgICAgICByMixyMiwjNAorICAgIEJHVCAgICAgIEwweDJjCisgICAgU1VCUyAgICAgcjQscjQsIzQKKyAgICBMRFIgICAgICByNSxbc3AsIzB4ODBdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQUREICAgICAgcjAscjAscjEsTFNMICMyCisgICAgQUREICAgICAgcjIscjIscjMsTFNMICMyCisgICAgU1VCICAgICAgcjAscjAscjUKKyAgICBTVUIgICAgICByMixyMixyNQorICAgIEJHVCAgICAgIEwweDJjCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBBREQgICAgICBzcCxzcCwjMHgxMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ5ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnNlY3Rpb24gLnJvZGF0YQorICAgIC5hbGlnbiA0CisKK2FybVZDTTRQMTBfcEluZGV4VGFibGU4eDg6CisgICAgLndvcmQgIE9NWF9WQ19DSFJPTUFfREMsICAgICBPTVhfVkNfQ0hST01BX0hPUgorICAgIC53b3JkICBPTVhfVkNfQ0hST01BX1ZFUlQsICAgT01YX1ZDX0NIUk9NQV9QTEFORQorCithcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4ODoKKyAgICAuaHdvcmQgICAzLCAyLCAxLDQKKyAgICAuaHdvcmQgIC0zLC0yLC0xLDAKKyAgICAuaHdvcmQgICAxLCAyLCAzLDQKKworCisgICAgLnRleHQKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OAorICAgIC5mdW5jICAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4CitvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDg6CisgICAgUFVTSCAgICAge3I0LXIxMCxscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIExEUiAgICAgIHI4LCA9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgIExEUiAgICAgIHI2LFtzcCwjMHg2OF0KKyAgICBMRFIgICAgICByNCxbc3AsIzB4NjBdCisgICAgTERSICAgICAgcjUsW3NwLCMweDY0XQorICAgIExEUiAgICAgIHI3LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICBwYyxbcjgscjYsTFNMICMyXQorT01YX1ZDX0NIUk9NQV9EQzoKKyAgICBUU1QgICAgICByNywjMgorICAgIEJFUSAgICAgIEwweGU4CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDFbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzFdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVsyXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzddfSxbcjldCisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHhjYworICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQyLGQwCisgICAgVlBBRERMLlUxNiBkMyxkMgorICAgIFZQQURETC5VOCBkMixkMQorICAgIFZQQURETC5VMTYgZDEsZDIKKyAgICBWQURELkkzMiBkMixkMyxkMQorICAgIFZSU0hSLlUzMiBkMixkMiwjMworICAgIFZSU0hSLlUzMiBkMyxkMywjMgorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIFZNT1YuSTggIGQ1LCMweGMKKyAgICBWTU9WLkk4ICBkNiwjMHg0CisgICAgVlNITC5JNjQgZDUsZDUsIzMyCisgICAgVlNIUi5VNjQgZDYsZDYsIzMyCisgICAgVkFERC5JOCAgZDYsZDYsZDUKKyAgICBWVEJMLjggICBkMCx7ZDItZDN9LGQ1CisgICAgVlRCTC44ICAgZDQse2QxLWQyfSxkNgorTDB4OWM6CisgICAgQUREICAgICAgcjkscjMscjUKKyAgICBBREQgICAgICByMTAscjUscjUKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2Q0fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q0fSxbcjldCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorTDB4Y2M6CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUEFEREwuVTggZDIsZDEKKyAgICBWUEFEREwuVTE2IGQxLGQyCisgICAgVlJTSFIuVTMyIGQxLGQxLCMyCisgICAgVkRVUC44ICAgZDAsZDFbMF0KKyAgICBWRFVQLjggICBkNCxkMVs0XQorICAgIEIgICAgICAgIEwweDljCitMMHhlODoKKyAgICBUU1QgICAgICByNywjMQorICAgIEJFUSAgICAgIEwweDExNAorICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQyLGQwCisgICAgVlBBRERMLlUxNiBkMyxkMgorICAgIFZSU0hSLlUzMiBkMyxkMywjMgorICAgIFZNT1YuSTggIGQ1LCMweDQKKyAgICBWU0hMLkk2NCBkNSxkNSwjMzIKKyAgICBWVEJMLjggICBkMCx7ZDN9LGQ1CisgICAgQiAgICAgICAgTDB4MTFjCitMMHgxMTQ6CisgICAgVk1PVi5JOCAgZDAsIzB4ODAKKyAgICBNT1YgICAgICByMCwjMAorTDB4MTFjOgorICAgIEFERCAgICAgIHI5LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XQorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMCxwY30KK09NWF9WQ19DSFJPTUFfVkVSVDoKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIEIgICAgICAgIEwweDExYworT01YX1ZDX0NIUk9NQV9IT1I6CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDRbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDVbXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDZbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDdbXX0sW3I5XQorICAgIEIgICAgICAgIEwweDI4YworT01YX1ZDX0NIUk9NQV9QTEFORToKKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIFZMRDEuOCAgIHtkMlswXX0sW3IyXQorICAgIFZMRDEuOCAgIHtkMVswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbMV19LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KKyAgICBWUkVWNjQuOCBkMyxkMAorICAgIFZTVUJMLlU4IHEzLGQzLGQyCisgICAgVlNIUi5VNjQgZDMsZDMsIzgKKyAgICBWU1VCTC5VOCBxMixkMyxkMAorICAgIFZSRVY2NC44IGQzLGQxCisgICAgVlNVQkwuVTggcTcsZDMsZDIKKyAgICBWU0hSLlU2NCBkMyxkMywjOAorICAgIFZTVUJMLlU4IHE2LGQzLGQxCisgICAgTERSICAgICAgcjIsID1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OAorICAgIFZTSEwuSTY0IGQ0LGQ0LCMxNgorICAgIFZFWFQuOCAgIGQ5LGQ0LGQ2LCMyCisgICAgVkxEMS4xNiAge2QxMH0sW3IyXSEKKyAgICBWU0hMLkk2NCBkMTIsZDEyLCMxNgorICAgIFZFWFQuOCAgIGQxNixkMTIsZDE0LCMyCisgICAgVk1VTC5JMTYgZDExLGQ5LGQxMAorICAgIFZNVUwuSTE2IGQzLGQxNixkMTAKKyAgICBWUEFERC5JMTYgZDMsZDExLGQzCisgICAgVlBBRERMLlMxNiBkMyxkMworICAgIFZTSEwuSTMyIGQyLGQzLCM0CisgICAgVkFERC5JMzIgZDMsZDMsZDIKKyAgICBWTEQxLjE2ICB7ZDEwLGQxMX0sW3IyXQorICAgIFZSU0hSLlMzMiBkMyxkMywjNQorICAgIFZBRERMLlU4IHEwLGQwLGQxCisgICAgVkRVUC4xNiAgcTAsZDFbM10KKyAgICBWU0hMLkkxNiBxMCxxMCwjNAorICAgIFZEVVAuMTYgIHEyLGQzWzBdCisgICAgVkRVUC4xNiAgcTMsZDNbMl0KKyAgICBWTVVMLkkxNiBxMixxMixxNQorICAgIFZNVUwuSTE2IHEzLHEzLHE1CisgICAgVkFERC5JMTYgcTIscTIscTAKKyAgICBWRFVQLjE2ICBxMCxkNlswXQorICAgIFZEVVAuMTYgIHExLGQ2WzFdCisgICAgVkRVUC4xNiAgcTQsZDZbMl0KKyAgICBWRFVQLjE2ICBxNSxkNlszXQorICAgIFZEVVAuMTYgIHE2LGQ3WzBdCisgICAgVkRVUC4xNiAgcTcsZDdbMV0KKyAgICBWRFVQLjE2ICBxOCxkN1syXQorICAgIFZEVVAuMTYgIHE5LGQ3WzNdCisgICAgVkFERC5JMTYgcTAscTIscTAKKyAgICBWQURELkkxNiBxMSxxMixxMQorICAgIFZBREQuSTE2IHE0LHEyLHE0CisgICAgVkFERC5JMTYgcTUscTIscTUKKyAgICBWQURELkkxNiBxNixxMixxNgorICAgIFZBREQuSTE2IHE3LHEyLHE3CisgICAgVkFERC5JMTYgcTgscTIscTgKKyAgICBWQURELkkxNiBxOSxxMixxOQorICAgIFZRUlNIUlVOLlMxNiBkMCxxMCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMSxxMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMixxNCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMyxxNSwjNQorICAgIFZRUlNIUlVOLlMxNiBkNCxxNiwjNQorICAgIFZRUlNIUlVOLlMxNiBkNSxxNywjNQorICAgIFZRUlNIUlVOLlMxNiBkNixxOCwjNQorICAgIFZRUlNIUlVOLlMxNiBkNyxxOSwjNQorTDB4MjhjOgorICAgIEFERCAgICAgIHI5LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMX0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDJ9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QzfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDV9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2Q2fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkN30sW3I5XQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI2OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKworICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2OgorICAgIC53b3JkICBPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUgorICAgIC53b3JkICBPTVhfVkNfMTZYMTZfREMsICAgT01YX1ZDXzE2WDE2X1BMQU5FCisKKworCithcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2OgorICAgIC5od29yZCAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsICA4CisgICAgLmh3b3JkICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKKyAgICAuaHdvcmQgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2CitvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNjoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgTERSICAgICAgcjksID1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKKyAgICBMRFIgICAgICByNixbc3AsIzB4NzBdCisgICAgTERSICAgICAgcjQsW3NwLCMweDY4XQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICByNyxbc3AsIzB4NzRdCisgICAgTU9WICAgICAgcjEyLCMweDEwCisgICAgTERSICAgICAgcGMsW3I5LHI2LExTTCAjMl0KK09NWF9WQ18xNlgxNl9WRVJUOgorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IxXQorICAgIEFERCAgICAgIHI4LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10KKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK09NWF9WQ18xNlgxNl9IT1I6CisgICAgQUREICAgICAgcjgscjAscjQKKyAgICBBREQgICAgICByNCxyNCxyNAorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHI1LHI1LHI1CitMMHg4YzoKKyAgICBWTEQxLjggICB7ZDJbXSxkM1tdfSxbcjBdLHI0CisgICAgVkxEMS44ICAge2QwW10sZDFbXX0sW3I4XSxyNAorICAgIFNVQlMgICAgIHIxMixyMTIsIzgKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgQk5FICAgICAgTDB4OGMKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK09NWF9WQ18xNlgxNl9EQzoKKyAgICBNT1YgICAgICByMTEsIzAKKyAgICBUU1QgICAgICByNywjMgorICAgIEJFUSAgICAgIEwweDE0YworICAgIEFERCAgICAgIHI4LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QyWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMlsxXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzNdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMls0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMls3XX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzFdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1syXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbM119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s1XX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzddfSxbcjhdCisgICAgVlBBRERMLlU4IHEwLHExCisgICAgQUREICAgICAgcjExLHIxMSwjMQorICAgIFZQQURELkkxNiBkMCxkMCxkMQorICAgIFZQQURETC5VMTYgZDAsZDAKKyAgICBWUEFEREwuVTMyIGQ2LGQwCisgICAgVlJTSFIuVTY0IGQ4LGQ2LCM0CitMMHgxNGM6CisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHgxNzAKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KKyAgICBBREQgICAgICByMTEscjExLCMxCisgICAgVlBBRERMLlU4IHEwLHEwCisgICAgVlBBREQuSTE2IGQwLGQwLGQxCisgICAgVlBBRERMLlUxNiBkMCxkMAorICAgIFZQQURETC5VMzIgZDcsZDAKKyAgICBWUlNIUi5VNjQgZDgsZDcsIzQKK0wweDE3MDoKKyAgICBDTVAgICAgICByMTEsIzIKKyAgICBCTkUgICAgICBMMHgxODAKKyAgICBWQURELkk2NCBkOCxkNyxkNgorICAgIFZSU0hSLlU2NCBkOCxkOCwjNQorTDB4MTgwOgorICAgIFZEVVAuOCAgIHEzLGQ4WzBdCisgICAgQ01QICAgICAgcjExLCMwCisgICAgQUREICAgICAgcjgscjMscjUKKyAgICBBREQgICAgICByMTAscjUscjUKKyAgICBCTkUgICAgICBMMHgxOTgKKyAgICBWTU9WLkk4ICBxMywjMHg4MAorTDB4MTk4OgorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK09NWF9WQ18xNlgxNl9QTEFORToKKyAgICBMRFIgICAgICByOSwgPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KKyAgICBWTEQxLjggICB7ZDRbMF19LFtyMl0KKyAgICBBREQgICAgICByOCxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMlswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbMV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMlszXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzVdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMls2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbN119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1sxXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzNdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s3XX0sW3I4XQorICAgIFZSRVY2NC44IGQ1LGQxCisgICAgVlNVQkwuVTggcTMsZDUsZDQKKyAgICBWU0hSLlU2NCBkNSxkNSwjOAorICAgIFZTVUJMLlU4IHE0LGQ1LGQwCisgICAgVlNITC5JNjQgZDksZDksIzE2CisgICAgVkVYVC44ICAgZDksZDksZDYsIzIKKyAgICBWUkVWNjQuOCBkMTIsZDMKKyAgICBWU1VCTC5VOCBxNyxkMTIsZDQKKyAgICBWU0hSLlU2NCBkMTIsZDEyLCM4CisgICAgVlNVQkwuVTggcTgsZDEyLGQyCisgICAgVkxEMS4xNiAge2QyMCxkMjF9LFtyOV0hCisgICAgVlNITC5JNjQgZDE3LGQxNywjMTYKKyAgICBWRVhULjggICBkMTcsZDE3LGQxNCwjMgorICAgIFZNVUxMLlMxNiBxMTEsZDgsZDIwCisgICAgVk1VTEwuUzE2IHExMixkMTYsZDIwCisgICAgVk1MQUwuUzE2IHExMSxkOSxkMjEKKyAgICBWTUxBTC5TMTYgcTEyLGQxNyxkMjEKKyAgICBWUEFERC5JMzIgZDIyLGQyMyxkMjIKKyAgICBWUEFERC5JMzIgZDIzLGQyNSxkMjQKKyAgICBWUEFEREwuUzMyIHExMSxxMTEKKyAgICBWU0hMLkk2NCBxMTIscTExLCMyCisgICAgVkFERC5JNjQgcTExLHExMSxxMTIKKyAgICBWUlNIUi5TNjQgcTExLHExMSwjNgorICAgIFZTSEwuSTY0IHExMixxMTEsIzMKKyAgICBWU1VCLkk2NCBxMTIscTEyLHExMQorICAgIFZMRDEuMTYgIHtkMjAsZDIxfSxbcjldIQorICAgIFZEVVAuMTYgIHE2LGQyMlswXQorICAgIFZEVVAuMTYgIHE3LGQyM1swXQorICAgIFZBRERMLlU4IHExMSxkMSxkMworICAgIFZTSEwuSTE2IHExMSxxMTEsIzQKKyAgICBWRFVQLjE2ICBxMTEsZDIzWzNdCisgICAgVkFERC5JNjQgZDEsZDI0LGQyNQorICAgIFZMRDEuMTYgIHtkMjQsZDI1fSxbcjldCisgICAgVkRVUC4xNiAgcTEzLGQxWzBdCisgICAgVlNVQi5JMTYgcTEzLHExMSxxMTMKKyAgICBWTVVMLkkxNiBxNSxxNixxMTAKKyAgICBWTVVMLkkxNiBxNixxNixxMTIKKyAgICBWQURELkkxNiBxMCxxNSxxMTMKKyAgICBWQURELkkxNiBxMSxxNixxMTMKK0wweDJkNDoKKyAgICBWUVJTSFJVTi5TMTYgZDYscTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDcscTEsIzUKKyAgICBTVUJTICAgICByMTIscjEyLCMxCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHI1CisgICAgVkFERC5JMTYgcTAscTAscTcKKyAgICBWQURELkkxNiBxMSxxMSxxNworICAgIEJORSAgICAgIEwweDJkNAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmQ3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKworICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCithcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NDoKKyAgICAud29yZCBPTVhfVkNfNHg0X1ZFUlQsICAgICBPTVhfVkNfNHg0X0hPUgorICAgIC53b3JkIE9NWF9WQ180eDRfREMsICAgICAgIE9NWF9WQ180eDRfRElBR19ETAorICAgIC53b3JkIE9NWF9WQ180eDRfRElBR19EUiwgIE9NWF9WQ180eDRfVlIKKyAgICAud29yZCBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCisgICAgLndvcmQgT01YX1ZDXzR4NF9IVQorCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0CisgICAgLmZ1bmMgICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQKK29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NDoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTJ9CisgICAgTERSICAgICAgcjgsID1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NAorICAgIExEUkQgICAgIHI2LHI3LFtzcCwjMHg1OF0KKyAgICBMRFJEICAgICByNCxyNSxbc3AsIzB4NTBdCisgICAgTERSICAgICAgcGMsW3I4LHI2LExTTCAjMl0KK09NWF9WQ180eDRfSE9SOgorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QwW119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxW119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QyW119LFtyMF0KKyAgICBWTEQxLjggICB7ZDNbXX0sW3I5XQorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDFbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkMlswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkM1swXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfVkVSVDoKKyAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKK0wweDU4OgorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfREM6CisgICAgVFNUICAgICAgcjcsIzIKKyAgICBCRVEgICAgICBMMHhkYworICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QwWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMFsxXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDBbMl19LFtyMF0KKyAgICBWTEQxLjggICB7ZDBbM119LFtyOV0KKyAgICBUU1QgICAgICByNywjMQorICAgIEJFUSAgICAgIEwweGJjCisgICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUEFEREwuVTggZDEsZDAKKyAgICBWUEFEREwuVTE2IGQxLGQxCisgICAgVlBBRERMLlUzMiBkMSxkMQorICAgIFZSU0hSLlU2NCBkMSxkMSwjMworICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgQiAgICAgICAgTDB4NTgKK0wweGJjOgorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQxLGQwCisgICAgVlBBRERMLlUxNiBkMSxkMQorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgQiAgICAgICAgTDB4NTgKK0wweGRjOgorICAgIFRTVCAgICAgIHI3LCMxCisgICAgQkVRICAgICAgTDB4MTA4CisgICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUEFEREwuVTggZDEsZDAKKyAgICBWUEFEREwuVTE2IGQxLGQxCisgICAgVlJTSFIuVTMyIGQxLGQxLCMyCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CisgICAgVkRVUC44ICAgZDAsZDFbMF0KKyAgICBCICAgICAgICBMMHg1OAorTDB4MTA4OgorICAgIFZNT1YuSTggIGQwLCMweDgwCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBCICAgICAgICBMMHg1OAorT01YX1ZDXzR4NF9ESUFHX0RMOgorICAgIFRTVCAgICAgIHI3LCMweDQwCisgICAgQkVRICAgICAgTDB4MTM4CisgICAgVkxEMS44ICAge2QzfSxbcjFdCisgICAgVkRVUC44ICAgZDIsZDNbN10KKyAgICBWRVhULjggICBkNCxkMyxkMiwjMQorICAgIFZFWFQuOCAgIGQ1LGQzLGQyLCMyCisgICAgQiAgICAgICAgTDB4MTRjCitMMHgxMzg6CisgICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCisgICAgVkRVUC44ICAgZDIsZDBbN10KKyAgICBWRVhULjggICBkMyxkMCxkMiwjNAorICAgIFZFWFQuOCAgIGQ0LGQwLGQyLCM1CisgICAgVkVYVC44ICAgZDUsZDAsZDIsIzYKK0wweDE0YzoKKyAgICBWSEFERC5VOCBkNixkMyxkNQorICAgIFZSSEFERC5VOCBkNixkNixkNAorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdLHI1CisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10scjUKKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXQorICAgIEIgICAgICAgIEwweDM0OAorT01YX1ZDXzR4NF9ESUFHX0RSOgorICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3IyXQorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgQUREICAgICAgcjEscjMscjUKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXQorICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XQorICAgIFZFWFQuOCAgIGQzLGQxLGQwLCMzCisgICAgQUREICAgICAgcjQscjEscjUKKyAgICBWRVhULjggICBkNCxkMSxkMCwjNAorICAgIEFERCAgICAgIHI2LHI0LHI1CisgICAgVkVYVC44ICAgZDUsZDEsZDAsIzUKKyAgICBWSEFERC5VOCBkNixkMyxkNQorICAgIFZSSEFERC5VOCBkNixkNixkNAorICAgIFZTVDEuMzIgIHtkNlswXX0sW3I2XQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjRdCisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMV0KKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXQorICAgIEIgICAgICAgIEwweDM0OAorT01YX1ZDXzR4NF9WUjoKKyAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KKyAgICBWTEQxLjggICB7ZDBbN119LFtyMl0KKyAgICBWTEQxLjggICB7ZDFbN119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDJbN119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0KKyAgICBWRVhULjggICBkMTIsZDAsZDAsIzcKKyAgICBWRVhULjggICBkMyxkMSxkMTIsIzYKKyAgICBWRVhULjggICBkNCxkMixkMTIsIzcKKyAgICBWRVhULjggICBkNSxkMSxkMCwjNworICAgIFZFWFQuOCAgIGQ2LGQyLGQwLCM3CisgICAgVkVYVC44ICAgZDExLGQxLGQxMiwjNworICAgIFZIQURELlU4IGQ4LGQ2LGQxMgorICAgIFZSSEFERC5VOCBkOCxkOCxkMTEKKyAgICBWSEFERC5VOCBkNyxkMyxkNQorICAgIFZSSEFERC5VOCBkNyxkNyxkNAorICAgIFZFWFQuOCAgIGQxMCxkOCxkOCwjMQorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZFWFQuOCAgIGQ5LGQ3LGQ3LCMxCisgICAgVlNUMS4zMiAge2QxMFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDdbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X0hEOgorICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3IyXQorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0KKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0KKyAgICBWRVhULjggICBkMyxkMSxkMCwjMworICAgIFZFWFQuOCAgIGQ0LGQxLGQwLCMyCisgICAgVkVYVC44ICAgZDUsZDEsZDAsIzEKKyAgICBWSEFERC5VOCBkNyxkMyxkNQorICAgIFZSSEFERC5VOCBkNyxkNyxkNAorICAgIFZSSEFERC5VOCBkOCxkNCxkMworICAgIFZTSEwuSTY0IGQ4LGQ4LCMyNAorICAgIFZTSEwuSTY0IGQ2LGQ3LCMxNgorICAgIFZaSVAuOCAgIGQ4LGQ2CisgICAgVkVYVC44ICAgZDcsZDcsZDcsIzYKKyAgICBWRVhULjggICBkOCxkNixkNywjMgorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZTVDEuMzIgIHtkOFsxXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDZbMV19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfVkw6CisgICAgVFNUICAgICAgcjcsIzB4NDAKKyAgICBCRVEgICAgICBMMHgyYjQKKyAgICBWTEQxLjggICB7ZDN9LFtyMV0KKyAgICBWRVhULjggICBkNCxkMyxkMywjMQorICAgIFZFWFQuOCAgIGQ1LGQ0LGQ0LCMxCisgICAgQiAgICAgICAgTDB4MmM4CitMMHgyYjQ6CisgICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCisgICAgVkRVUC44ICAgZDIsZDBbN10KKyAgICBWRVhULjggICBkMyxkMCxkMiwjNAorICAgIFZFWFQuOCAgIGQ0LGQwLGQyLCM1CisgICAgVkVYVC44ICAgZDUsZDAsZDIsIzYKK0wweDJjODoKKyAgICBWUkhBREQuVTggZDcsZDQsZDMKKyAgICBWSEFERC5VOCBkMTAsZDMsZDUKKyAgICBWUkhBREQuVTggZDEwLGQxMCxkNAorICAgIFZFWFQuOCAgIGQ4LGQ3LGQ3LCMxCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CisgICAgVkVYVC44ICAgZDksZDEwLGQ4LCMxCisgICAgVlNUMS4zMiAge2Q3WzBdfSxbcjNdLHIxMgorICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkOVswXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfSFU6CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXQorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3I5XQorICAgIFZEVVAuOCAgIGQyLGQxWzddCisgICAgVkVYVC44ICAgZDMsZDEsZDIsIzQKKyAgICBWRVhULjggICBkNCxkMSxkMiwjNQorICAgIFZFWFQuOCAgIGQ1LGQxLGQyLCM2CisgICAgVkhBREQuVTggZDcsZDMsZDUKKyAgICBWUkhBREQuVTggZDcsZDcsZDQKKyAgICBWUkhBREQuVTggZDgsZDQsZDMKKyAgICBWWklQLjggICBkOCxkNworICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ4LGQ4LGQ4LCMyCisgICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHI1CisgICAgVkVYVC44ICAgZDgsZDgsZDgsIzIKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjUKKyAgICBWU1QxLjMyICB7ZDdbMF19LFtyM10KK0wweDM0ODoKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTJ9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTg5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUwpAQCAtMCwwICsxLDU0IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyCitvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyOgorICAgIHB1c2ggICAge3I0LXIxMCwgbHJ9CisgICAgbGRyICAgICByOSwgW3IwLCMwXQorICAgIHZtb3YuaTE2ICAgIGQwLCAjMAorICAgIG1vdiAgICAgcjgsICMweDFmCisgICAgdnN0MS4xNiAgICB7ZDB9LCBbcjFdCisgICAgbGRyYiAgICByNiwgW3I5XSwgIzEKK3VucGFja0xvb3A6CisgICAgdHN0ICAgICByNiwgIzB4MTAKKyAgICBsZHJuZXNiIHI1LCBbcjksICMxXQorICAgIGxkcm5lYiAgcjQsIFtyOV0sICMyCisgICAgYW5kICAgICByNywgcjgsIHI2LCBsc2wgIzEKKyAgICBsZHJlcXNiIHI0LCBbcjldLCAjMQorICAgIG9ycm5lICAgcjQsIHI0LCByNSwgbHNsICM4CisgICAgdHN0ICAgICByNiwgIzB4MjAKKyAgICBsZHJlcWIgIHI2LCBbcjldLCAjMQorICAgIHN0cmggICAgcjQsIFtyMSwgcjddCisgICAgYmVxICAgICB1bnBhY2tMb29wCisgICAgbGRtaWEgICByMSwge3IzLCByNH0KKyAgICBzdHIgICAgIHI5LCBbcjAsICMwXQorICAgIGxkciAgICAgcjUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICBsZHIgICAgIHI2LCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgIHNhZGRzdWJ4ICAgICAgICByMywgcjMsIHIzCisgICAgc2FkZHN1YnggICAgICAgIHI0LCByNCwgcjQKKyAgICBsZHJzYiAgIHI5LCBbcjUsIHIyXQorICAgIGxkcnNiICAgcjIsIFtyNiwgcjJdCisgICAgc2FkZDE2ICByNSwgcjMsIHI0CisgICAgc3N1YjE2ICByNiwgcjMsIHI0CisgICAgbHNsICAgICByMiwgcjIsIHI5CisgICAgdm1vdiAgICBkMCwgcjUsIHI2CisgICAgdnJldjMyLjE2ICBkMCwgZDAKKyAgICB2ZHVwLjE2ICAgIGQxLCByMgorICAgIHZtdWxsLnMxNiAgIHExLCBkMCwgZDEKKyAgICB2c2hybi5pMzIgICBkMiwgcTEsICMxCisgICAgdnN0MS4xNiAgICB7ZDJ9LCBbcjFdCisgICAgbW92ICAgICByMCwgIzAKKyAgICBwb3AgICAgIHtyNC1yMTAsIHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhMDcxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUwpAQCAtMCwwICsxLDc2IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0OgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDEzfQorICAgIFZMRDQuMTYgIHtkMCxkMSxkMixkM30sW3IwXQorICAgIExEUiAgICAgIHIyLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgTERSICAgICAgcjMsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgVkFERC5JMTYgZDQsZDAsZDEKKyAgICBWQURELkkxNiBkNSxkMixkMworICAgIFZTVUIuSTE2IGQ2LGQwLGQxCisgICAgTERSU0IgICAgcjQsW3IyLHIxXQorICAgIFZTVUIuSTE2IGQ3LGQyLGQzCisgICAgTERSU0IgICAgcjUsW3IzLHIxXQorICAgIFZBREQuSTE2IGQwLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDEsZDQsZDUKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIExTTCAgICAgIHI1LHI1LHI0CisgICAgVkFERC5JMTYgZDMsZDYsZDcKKyAgICBWVFJOLjE2ICBkMCxkMQorICAgIFZUUk4uMTYgIGQyLGQzCisgICAgVlRSTi4zMiAgcTAscTEKKyAgICBWQURELkkxNiBkNCxkMCxkMQorICAgIFZBREQuSTE2IGQ1LGQyLGQzCisgICAgVlNVQi5JMTYgZDYsZDAsZDEKKyAgICBWU1VCLkkxNiBkNyxkMixkMworICAgIFZBREQuSTE2IGQwLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDEsZDQsZDUKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZBREQuSTE2IGQzLGQ2LGQ3CisgICAgVkRVUC4xNiAgZDUscjUKKyAgICBWTU9WLkkzMiBxMywjMHgyCisgICAgVk1PVi5JMzIgcTQsIzB4MgorICAgIFZNT1YuSTMyIHE1LCMweDIKKyAgICBWTU9WLkkzMiBxNiwjMHgyCisgICAgVk1MQUwuUzE2IHEzLGQwLGQ1CisgICAgVk1MQUwuUzE2IHE0LGQxLGQ1CisgICAgVk1MQUwuUzE2IHE1LGQyLGQ1CisgICAgVk1MQUwuUzE2IHE2LGQzLGQ1CisgICAgVlNIUk4uSTMyIGQwLHEzLCMyCisgICAgVlNIUk4uSTMyIGQxLHE0LCMyCisgICAgVlNIUk4uSTMyIGQyLHE1LCMyCisgICAgVlNIUk4uSTMyIGQzLHE2LCMyCisgICAgVlNUMS4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCisgICAgVlBPUCAgICAge2Q4LWQxM30KKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworLmdsb2JhbCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgorLmZ1bmMgICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgorb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXI6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIE1PViAgICAgIHI0LHIxCisgICAgTU9WICAgICAgcjUscjIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgTU9WICAgICAgcjAscjQKKyAgICBNT1YgICAgICByMSxyNQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorICAgIE1PViAgICAgIHIwLCMwCisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0YjU1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAorICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YSFVGRlRBQl9IXworI2RlZmluZSBfT01YSFVGRlRBQl9IXworCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXTsKKworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF07CisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzMyXTsKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF07CisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdCisKKyNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOTUyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YWklHWkFHVEFCX0gKKyNkZWZpbmUgX09NWFpJR1pBR1RBQl9ICisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdOworLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOworCisjZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NWZlNmQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKQEAgLTAsMCArMSw4MiBAQAorOyAvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ2xpcDhfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGUgZm9yIENsaXBwaW5nIDE2IGJpdCB2YWx1ZSB0byBbMCwyNTVdIFJhbmdlCis7ICovIAorCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgCisKKyAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgSUYgQ29ydGV4QTgKKzsvL0lucHV0IEFyZ3VtZW50cworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitwRHN0ICAgICAgICAgICAgICAgICBSTiAxCitzdGVwICAgICAgICAgICAgICAgICBSTiAyCisKKzsvLyBOZW9uIFJlZ2lzdGVycworCitxeDAgICAgICAgICAgICAgICAgICBRTiAgUTAuUzE2ICAgICAgICAgICAgICAgICAgCitkeDAwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkeDAxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitxeDEgICAgICAgICAgICAgICAgICBRTiAgUTEuUzE2CitkeDEwICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkeDExICAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKK3F4MiAgICAgICAgICAgICAgICAgIFFOICBRMi5TMTYgICAgICAgICAgICAgICAgICAKK2R4MjAgICAgICAgICAgICAgICAgIEROICBENC5TMTYKK2R4MjEgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK3F4MyAgICAgICAgICAgICAgICAgIFFOICBRMy5TMTYKK2R4MzAgICAgICAgICAgICAgICAgIEROICBENi5TMTYKK2R4MzEgICAgICAgICAgICAgICAgIEROICBENy5TMTYKKworCitkY2xpcDAgICAgICAgICAgICAgICBETiAgRDAuVTgKK2RjbGlwMSAgICAgICAgICAgICAgIEROICBEMi5VOCAKK2RjbGlwMiAgICAgICAgICAgICAgIEROICBENC5VOAorZGNsaXAzICAgICAgICAgICAgICAgRE4gIEQ2LlU4CisgCisgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfQ2xpcDgKKworICAgICAgIFZMRDEgICAgICAgICAge2R4MDAsZHgwMSxkeDEwLGR4MTF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgMTYgZW50cmllcyBmcm9tIHBTcmMKKyAgICAgICBWTEQxICAgICAgICAgIHtkeDIwLGR4MjEsZHgzMCxkeDMxfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIG5leHQgMTYgZW50cmllcyBmcm9tIHBTcmMgIAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAwLHF4MCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMFtpXT1jbGlwIHF4MFtpXSB0byBbMCwyNTVdCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDEscXgxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAxW2ldPWNsaXAgcXgxW2ldIHRvIFswLDI1NV0KKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDB9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMX0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDIscXgyLCMwCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDMscXgzLCMwCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAyfSxbcERzdF0sc3RlcAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwM30sW3BEc3RdLHN0ZXAKKyAgICAgICAKKyAgICAgICBWTEQxICAgICAgICAgIHtkeDAwLGR4MDEsZHgxMCxkeDExfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIDE2IGVudHJpZXMgZnJvbSBwU3JjCisgICAgICAgVkxEMSAgICAgICAgICB7ZHgyMCxkeDIxLGR4MzAsZHgzMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCBuZXh0IDE2IGVudHJpZXMgZnJvbSBwU3JjICAKKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMCxxeDAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDBbaV09Y2xpcCBxeDBbaV0gdG8gWzAsMjU1XQorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAxLHF4MSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMVtpXT1jbGlwIHF4MVtpXSB0byBbMCwyNTVdCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAwfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDF9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAyLHF4MiwjMAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAzLHF4MywjMAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMn0sW3BEc3RdLHN0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDN9LFtwRHN0XSxzdGVwCisKKworICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0YTdmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCkBAIC0wLDAgKzEsMzk4IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciwgaW50cmEgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gCis7ICoKKzsgKiAKKzsgKgorOyAqIAorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgCisKKworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKKworZnR5cGUgICAgICAgICAgICAgICAgUk4gMAordGVtcDMgICAgICAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgICAgUk4gNQorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRXNjYXBlICAgICAgICAgICAgICAgUk4gNQorCis7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKK3ppZ3phZyAgICAgICAgICAgICAgIFJOIDAKK3N0b3JlTGV2ZWwgICAgICAgICAgIFJOIDEKK3RlbXAyICAgICAgICAgICAgICAgIFJOIDQKK3RlbXAxICAgICAgICAgICAgICAgIFJOIDUKK3NpZ24gICAgICAgICAgICAgICAgIFJOIDUKK0xhc3QgICAgICAgICAgICAgICAgIFJOIDcKK3N0b3JlUnVuICAgICAgICAgICAgIFJOIDE0CisKKworcGFja1JldEluZGV4ICAgICAgICAgUk4gNQorCisKK21hcmtlcmJpdCAgICAgICAgICAgIFJOIDUKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKK1JCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKK1JCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICBSTiAxMgorTFIgICAgICAgICAgICAgICAgICAgUk4gMTQgICAgICAgIAorICAgICAgICAKKworCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBPZmZzZXQsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcExpbmtSZWdpc3Rlciw0ICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCisgICAgICAgIDsvLyBnZXQgdGhlIHRhYmxlIGFkZHJlc3NlcyBmcm9tIHN0YWNrICAgICAgIAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBBTEwgemVyb3MgYXQgcERzdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIENvdW50IHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICAgICAgTGFzdCwjMAorICAgICAgICBNX1NUUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExpbmsgUmVnaXN0ZXIgb24gU3RhY2sKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAyLCMwCisgICAgICAgIE1PViAgICAgICAgICAgICBMUiwjMCAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSBNYWNybyBhbmQgU3RvcmUgYWxsIHplcm9zIHRvIHBEc3QgCisgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcHBCaXRzdHJlYW0gb24gc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwQml0T2Zmc2V0IG9uIHN0YWNrCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgICAgIHBEc3QscERzdCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEc3QKKworICAgICAgICA7Ly8gVGhlIGFybVZDTTRQMl9HZXRWTENCaXRzIGJlZ2lucworCitnZXRWTENiaXRzCisgICAgICAgIAorICAgICAgICBNX0JEX0xPT0s4ICAgICAgRXNjYXBlLDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRXNjYXBlIFZhbHVlCisgICAgICAgIExTUiAgICAgICAgICAgICBFc2NhcGUsRXNjYXBlLCMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBFc2NhcGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgZm9yIGVzY2FwZSBtb2RlCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMAorICAgICAgICBCTkUgICAgICAgICAgICAgbm90RXNjYXBlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCBpZiBub3QgaW4gRXNjYXBlIG1vZGUgMworCisgICAgICAgIE1fQkRfVlNLSVA4ICAgICAjNyxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHNob3J0VmlkZW9IZWFkZXIgZmxhZyB0byBrbm93IHRoZSB0eXBlIG9mIEVzY2FwZSBtb2RlCisgICAgICAgIEJFUSAgICAgICAgICAgICBlbmRGaWxsVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRXNjYXBlIE1vZGUgNAorCisgICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlTGV2ZWwsOCxUMQorCisgICAgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgd2hldGhlciB0aGUgUmVzZXJ2ZWQgdmFsdWVzIGZvciBMZXZlbCBhcmUgdXNlZCBhbmQgRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgaXQgaXMgc28KKworICAgICAgICBURVEgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAorICAgICAgICBURVFORSAgICAgICAgICAgc3RvcmVMZXZlbCwjMTI4ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZXJyb3IgaWYgQ291bnQrc3RvcmVSdW4gPj0gNjQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWRpbmcgdGhlIEFkZHJlc3Mgb2YgWmlnemFnIHRhYmxlCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNYVEIgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBFeHRlbmQgc3RvcmVMZXZlbCB0byAzMiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmd0aAorCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgorICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIExldmVsCisgICAgICAgICAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCisgICAgICAgCisgICAgICAgIAorCitlbmRGaWxsVkxECisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIEZ0eXBlKCBFc2NhcGUgTW9kZSkgdmFsdWUgYmFzZWQgb24gdGhlIHR3byBzdWNjZXNzaXZlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbQorICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgCisgICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMQorICAgICAgICBCRVEgICAgICAgICAgICAgbm90RXNjYXBlbW9kZQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzEKKyAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMzCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICAKKworbm90RXNjYXBlbW9kZQorCisgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIHRhYmxlIHdpdGggbGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBDb21iaW5lZCBWTEMgVGFibGUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBmdHlwZSA+PTMgZ2V0IHBlcmZvcm0gRml4ZWQgTGVuZ3RoIERlY29kaW5nIChFc2NhcGUgTW9kZSAzKQorICAgICAgICBCR0UgICAgICAgICAgICAgRXNjYXBlTW9kZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgY29udGludWUgbm9ybWFsIFZMQyBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgOy8vIFZhcmlhYmxlIGxlbmdoIGRlY29kaW5nLCAiYXJtVW5QYWNrVkxDMzIiIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fQkRfVkxEICAgICAgICBwYWNrUmV0SW5kZXgsVDEsVDIscFZsY1RhYmxlTDBMMSw0LDIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgdGVtcDMsPTB4RkZGCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgcGFja1JldEluZGV4LHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGZvciBpbnZhbGlkIHN5bWJvbAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIGludmFsaWQgc3ltYm9sIG9jY3VycyBleGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZQorICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgICAgIExhc3QscGFja1JldEluZGV4LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgTGFzdCBmcm9tIHBhY2tlZCBJbmRleAorICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAKKworICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVSdW4scGFja1JldEluZGV4LCM3ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBSdW4gVmFsdWUgZnJvbSBQYWNrZWQgaW5kZXgKKyAgICAgICAgQU5EICAgICAgICAgICAgIHN0b3JlTGV2ZWwscGFja1JldEluZGV4LCMweDdjICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZUxldmVsPXBhY2tSZXRJbmRleFsyLTZdLHN0b3JlTGV2ZWxbMC0xXT0wIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCB0YWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMZXZlbCB2YWx1ZQorCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICAgICAgZnR5cGUyCisgICAgICAgIAorICAgICAgICA7Ly8gZnR5cGU9PTE7IEVzY2FwZSBtb2RlID0xCisgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcExNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICA7Ly8gSWYgdGhlIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcworICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHN0b3JlUnVuXQorCisgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZUxldmVsLHRlbXAxLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAKKworZnR5cGUyCisKKyAgICAgICAgOy8vIGZ0eXBlID0yOyBFc2NhcGUgbW9kZSA9MgorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUgCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICBCTkUgICAgICAgICAgICAgRmlsbFZMREwxCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBSTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgIDsvLyBJZiBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAyLHN0b3JlTGV2ZWwsIzEKKyAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSx0ZW1wMl0KKworICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sc3RvcmVSdW4sIzEKKyAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHRlbXAxCisgICAgICAgIAorRmlsbFZMREwxICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc2lnbiwxLFQxCisKKyAgICAgICAgQ01QICAgICAgICAgICAgIHNpZ24sIzEKKyAgICAgICAgUlNCRVEgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMAorIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MworICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5naHQKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKyAKK3N0b3JlTGV2ZWxMMQorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBMZXZlbCB2YWwgaXMgTGFzdCBub24gemVybyB2YWwKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCisgICAgICAgIExTUiAgICAgICAgICAgICBMYXN0LExhc3QsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworIAorCisKKyAgICAgICAgOy8vIEZpeGVkIExlbmdoIERlY29kaW5nIEVzY2FwZSBNb2RlIDMKKworRXNjYXBlTW9kZTMKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICBtYXJrZXJiaXQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgbWFya2VyIGJpdCBpcyB6ZXJvCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKyAgICAgICAgCisgICAgICAgIE1fQkRfUkVBRDE2ICAgICBzdG9yZUxldmVsLDEyLFQxCisKKyAgICAgICAgVFNUICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzB4ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZXN0IGlmIHRoZSBsZXZlbCBpcyBuZWdhdGl2ZQorICAgICAgICBTVUJORSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCM0MDk2CisgICAgICAgIENNUCAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCisgICAgICAgIENNUE5FICAgICAgICAgICBzdG9yZUxldmVsLCMtMjA0OAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIExldmVsPT0wIG9yICAtMjA0OCAKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgICAgIAorCisgICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlciAoIFNpZ24gbm90IHVzZWQgYXMgc3RvcmVMZXZlbCBpcyBwcmVwcm9jZXNzZWQpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIAorCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1biBMZW5ndGgKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKworCisgCitzdG9yZUxldmVsTGFzdAorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQorICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgICAgICBlbmQgCisgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworICAgICAgICAKK2VuZAorCisgICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9SdW4gdGhlIExvb3AgdW50aWxsIENvdW50IHJlYWNoZXMgNjQKKworICAgICAgICBCTFQgICAgICAgICAgICAgZ2V0VkxDYml0cworCisgICAgICAgIAorRXhpdE9rCisgICAgICAgIDsvLyBFeGl0IFdoZW4gVkxDIERlY29kaW5nIGlzIGRvbmUgU3VjY2Vzc2Z1bGx5IAorICAgCisgICAgICAgIDsvLyBMb2FkaW5nIHBwQml0U3RyZWFtIGFuZCBwQml0T2Zmc2V0IGZyb20gc3RhY2sKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCisgICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKKworICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgICAgICAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBNT1ZORSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgorICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgTGluayBSZWdpc3RlciBCYWNrCisgICAgICAgIEIgICAgICAgICAgICAgICBleGl0MgorCitFeGl0RXJyb3IKKyAgICAgICAgOy8vIEV4aXQgV2hlbiBhbiBFcnJvciBvY2N1cnMgCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAorICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIKKyAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKworZXhpdDIKKyAgICAgICAKKworICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOGFmOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpAQCAtMCwwICsxLDIxMSBAQAorIC8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgSHVmZm1hbiB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKworCisKKy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgUGFja2VkIFZMQyB0YWJsZXMgd2l0aCBMYXN0PTAgYW5kIExhc3Q9MQorCisvLyAgICAgICAgICAgICAgb3B0aW1pemVkIFBhY2tlZCBWTEMgdGFibGUgRW50cnkgRm9ybWF0IAorLy8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gCisvLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICB8ICBMZW4gICB8ICAgICAgIFJ1biAgICAgICB8ICAgICBMZXZlbCAgICB8TCB8IDEgfAorLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8CisvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKKy8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICAoMCB0byA3KSAgMyBiaXRzCisvLyAgICBSdW4gICAgPSBSdW5MZW5ndGggb2YgdGhlIFN5bWJvbCAgKDAgdG8gNjMpIDYgYml0cworLy8gICAgTGV2ZWwgID0gTGV2ZWwgb2YgdGhlIFN5bWJvbCAgICAgICgwIHRvIDMxKSA1IGJpdHMKKy8vICAgIEwgICAgICA9IExhc3QgVmFsdWUgb2YgdGhlIFN5bWJvbCAoMCBvciAxKSAgMSBiaXQKKy8vCisvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgorLy8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKKy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKKy8vCisvLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCisvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCisvLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCisKKy8vIFRoZSBWTEMgdGFibGVzIHVzZWQgZm9yIEludHJhIGFuZCBub24gaW50YSBjb2VmZmljaWVudHMgaW4gbm9uIEVzY2FwZSBtb2RlCisvLyBjb250YWlucyBzeW1ib2xzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MS4KKy8vIElmIGEgc3ltYm9sIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUgaXQgd2lsbCBiZSBjb2RlZCBhcyAweEZGRgorIAorCitjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MWIwOSwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjEwOSwgMHgyMTA5LCAweDAyMDksIDB4MDAxMSwKKyAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjExNSwgMHgyMTE1LCAweDIwMWQsIDB4MjAxZCwKKyAgICAweDIwNTksIDB4MjA1OSwgMHgyMDUxLCAweDIwNTEsIDB4MWMwZCwgMHgxYjBkLCAweDFhMGQsIDB4MTkwZCwKKyAgICAweDA5MTEsIDB4MDgxMSwgMHgwNzExLCAweDA2MTEsIDB4MDUxMSwgMHgwMzE5LCAweDAyMTksIDB4MDEyMSwKKyAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwNjEsIDB4MjA2MSwgMHgyMTI5LCAweDIxMjksIDB4MzcwOSwgMHgzNzA5LCAweDM4MDksIDB4MzgwOSwKKyAgICAweDNkMGQsIDB4M2QwZCwgMHgzZTBkLCAweDNlMGQsIDB4M2YwZCwgMHgzZjBkLCAweDIwMGQsIDB4MjAwZCwKKyAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDEzMSwgMHgwMjIxLCAweDA0MTksIDB4MDUxOSwKKyAgICAweDA2MTksIDB4MGExMSwgMHgxOTA5LCAweDFhMDksIDB4MjEwZCwgMHgyMjBkLCAweDIzMGQsIDB4MjQwZCwKKyAgICAweDI1MGQsIDB4MjYwZCwgMHgyNzBkLCAweDI4MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKKyAgICAweDAwNDksIDB4MDA0MSwgMHgzODBkLCAweDM4MGQsIDB4MzcwZCwgMHgzNzBkLCAweDM2MGQsIDB4MzYwZCwKKyAgICAweDM1MGQsIDB4MzUwZCwgMHgzNDBkLCAweDM0MGQsIDB4MzMwZCwgMHgzMzBkLCAweDMyMGQsIDB4MzIwZCwKKyAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MzEwZCwgMHgzMTBkLCAweDIwMTUsIDB4MjAxNSwKKyAgICAweDM2MDksIDB4MzYwOSwgMHgzNTA5LCAweDM1MDksIDB4MzQwOSwgMHgzNDA5LCAweDMzMDksIDB4MzMwOSwKKyAgICAweDMyMDksIDB4MzIwOSwgMHgzMTA5LCAweDMxMDksIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKKyAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDEwMGQsIDB4MzAwOSwgMHgzMDA5LCAweDJmMDksIDB4MmYwOSwKKyAgICAweDI0MTEsIDB4MjQxMSwgMHgyMzExLCAweDIzMTEsIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDBmMGQsIDB4MGUwZCwgMHgwZDBkLCAweDBjMGQsIDB4MGIwZCwgMHgwYTBkLCAweDA5MGQsIDB4MGUwOSwKKyAgICAweDBkMDksIDB4MDIxMSwgMHgwMTE5LCAweDAwMjksIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKKyAgICAweDI4MGQsIDB4MjgwZCwgMHgyNzBkLCAweDI3MGQsIDB4MjYwZCwgMHgyNjBkLCAweDI1MGQsIDB4MjUwZCwKKyAgICAweDJjMDksIDB4MmMwOSwgMHhiNzU5LCAweGI3NTksIDB4MmEwOSwgMHgyYTA5LCAweDIwMjEsIDB4MjAyMSwKKyAgICAweDA0MGQsIDB4MDMwZCwgMHgwYjM1LCAweDAxMGQsIDB4MDkwOSwgMHgwODA5LCAweDA3MDksIDB4MDYwOSwKKyAgICAweDAxMTEsIDB4MDAxOSwgMHgyNTA5LCAweDI1MDksIDB4MjQwOSwgMHgyNDA5LCAweDIzMDksIDB4MjMwOQorfTsKKworCitjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MGYwOSwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjAxMSwgMHgyMDExLCAweDAxMDksIDB4MDAxOSwKKyAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjAzZCwgMHgyMDNkLCAweDIwMzUsIDB4MjAzNSwKKyAgICAweDIwYjEsIDB4MjBiMSwgMHgyMGE5LCAweDIwYTksIDB4MDIxNSwgMHgwMTFkLCAweDAwMmQsIDB4MGQwOSwKKyAgICAweDA1MTksIDB4MDgxMSwgMHgwNDE5LCAweDAzMjEsIDB4MDIyMSwgMHgwMTM5LCAweDAwYTEsIDB4MDA5OSwKKyAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwYjksIDB4MjBiOSwgMHgyMGMxLCAweDIwYzEsIDB4MjE0MSwgMHgyMTQxLCAweDI5MTEsIDB4MjkxMSwKKyAgICAweDIzMTUsIDB4MjMxNSwgMHgyNDE1LCAweDI0MTUsIDB4MmYwZCwgMHgyZjBkLCAweDMwMGQsIDB4MzAwZCwKKyAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBjOSwgMHgwMGQxLCAweDAwZDksIDB4MDE0OSwKKyAgICAweDA2MTksIDB4MDE1MSwgMHgwMjI5LCAweDA3MTksIDB4MGUwOSwgMHgwMDQ1LCAweDA1MTUsIDB4MDYxNSwKKyAgICAweDExMGQsIDB4MTIwZCwgMHgxMzBkLCAweDE0MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKKyAgICAweDAwOTEsIDB4MDA4OSwgMHgyZTBkLCAweDJlMGQsIDB4MmQwZCwgMHgyZDBkLCAweDJjMGQsIDB4MmMwZCwKKyAgICAweDJiMGQsIDB4MmIwZCwgMHgyYTBkLCAweDJhMGQsIDB4MjExNSwgMHgyMTE1LCAweDIwMjUsIDB4MjAyNSwKKyAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MmMwOSwgMHgyYzA5LCAweDJiMDksIDB4MmIwOSwKKyAgICAweDI3MTEsIDB4MjcxMSwgMHgyNjExLCAweDI2MTEsIDB4MjUxMSwgMHgyNTExLCAweDIzMTksIDB4MjMxOSwKKyAgICAweDIyMTksIDB4MjIxOSwgMHgyMTMxLCAweDIxMzEsIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKKyAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDA4MGQsIDB4MjEyOSwgMHgyMTI5LCAweDIwODEsIDB4MjA4MSwKKyAgICAweDI0MTEsIDB4MjQxMSwgMHgyMDc5LCAweDIwNzksIDB4MjA3MSwgMHgyMDcxLCAweDIwNjksIDB4MjA2OSwKKyAgICAweDFiYjUsIDB4MDYwZCwgMHgwMDFkLCAweGQzZjksIDB4MDkwOSwgMHgwODA5LCAweDA5MGQsIDB4MDMxMSwKKyAgICAweDAxMjEsIDB4MDA2MSwgMHgwMDU5LCAweDAwNTEsIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKKyAgICAweDI0MGQsIDB4MjQwZCwgMHgyMzBkLCAweDIzMGQsIDB4MjYwOSwgMHgyNjA5LCAweDI1MGQsIDB4MjUwZCwKKyAgICAweDI3MDksIDB4MjcwOSwgMHgyMjExLCAweDIyMTEsIDB4MjExOSwgMHgyMTE5LCAweDIwNDksIDB4MjA0OSwKKyAgICAweDAwMTUsIDB4MDUwOSwgMHgwMjBkLCAweDAxMGQsIDB4MDQwOSwgMHgwMzA5LCAweDAwNDEsIDB4MDAzOSwKKyAgICAweDAxMTEsIDB4MDAzMSwgMHgyMjA5LCAweDIyMDksIDB4MjAyOSwgMHgyMDI5LCAweDIwMjEsIDB4MjAyMQorfTsKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdID0geworICAgIDB4MDAyMCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwMSwgMHgyMDAxLAorICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4MDAyOCwgMHgwMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgwMDMwLCAweDAwMTMsIDB4MjAxMSwgMHgyMDExLAorICAgIDB4MDAzOCwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgzZmZmLCAweDNmZmYsIDB4MjAxOSwgMHgyMDE5LAorCisJMHgwMDIwLCAweDAwMDksIDB4MjAwNywgMHgyMDA3LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCisgICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHgwMDI4LCAweDAwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDAwMzAsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgwMDM4LCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLCAweDFmZmYsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcKK307CisKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdID0geworICAgIDB4MDAxMCwgMHgwMGYwLCAweDAwNDMsIDB4MDAzZiwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwgMHg0MDQxLAorICAgIDB4MDAxOCwgMHgwMGQ4LCAweDAwNDcsIDB4MDAzYiwgMHgwMDIwLCAweDAwODAsIDB4MDBhOCwgMHgwMGQwLAorICAgIDB4MDAyOCwgMHgwMDQ4LCAweDAwNzAsIDB4MDA3OCwgMHgxZmZmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLAorICAgIDB4MDA4MSwgMHgwMDAxLCAweDAwN2YsIDB4MDAwMywgMHgyMDdkLCAweDIwN2QsIDB4MjAwNSwgMHgyMDA1LAorICAgIDB4MjA3YiwgMHgyMDdiLCAweDIwMDcsIDB4MjAwNywgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LAorICAgIDB4MjA3OSwgMHgyMDc5LCAweDIwMDksIDB4MjAwOSwgMHgyMDc3LCAweDIwNzcsIDB4MjAwYiwgMHgyMDBiLAorICAgIDB4MjA3NSwgMHgyMDc1LCAweDIwMGQsIDB4MjAwZCwgMHgyMDczLCAweDIwNzMsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MDA3MSwgMHgwMDExLCAweDAwNmYsIDB4MDAxMywgMHgwMDZkLCAweDAwMTUsIDB4MDA2YiwgMHgwMDE3LAorICAgIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMDY5LCAweDAwMTksIDB4MDA2NywgMHgwMDFiLAorICAgIDB4MDA2NSwgMHgwMDFkLCAweDAwNjMsIDB4MDAxZiwgMHgwMDYxLCAweDAwMjEsIDB4MDA1ZiwgMHgwMDIzLAorICAgIDB4MDA1ZCwgMHgwMDI1LCAweDAwNWIsIDB4MDAyNywgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LAorICAgIDB4MDA1OSwgMHgwMDI5LCAweDAwNTcsIDB4MDAyYiwgMHgyMDU1LCAweDIwNTUsIDB4MjAyZCwgMHgyMDJkLAorICAgIDB4MjA1MywgMHgyMDUzLCAweDIwMmYsIDB4MjAyZiwgMHgyMDUxLCAweDIwNTEsIDB4MjAzMSwgMHgyMDMxLAorICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwMzMsIDB4MjAzMywgMHgwMGUwLCAweDAwZTgsIDB4MDA0OSwgMHgwMDM5LAorICAgIDB4MjA0ZCwgMHgyMDRkLCAweDIwMzUsIDB4MjAzNSwgMHgyMDRiLCAweDIwNGIsIDB4MjAzNywgMHgyMDM3LAorICAgIDB4MjA0NSwgMHgyMDQ1LCAweDIwM2QsIDB4MjAzZAorfTsKKworLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkCisgICBwYWRkZWQgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbMjctMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5CisKKyovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdID0gCit7CisgICAxMiwgIDYsICA0LCAgMywgIDMsICAzLCAgMywgIDIsIAorICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxCit9OworCisvKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzEyLTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KKworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdID0gCit7CisgICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgNDAsICAxLCAgMAorfTsKKworLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludHJhIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkCisgICBwYWRkZWQgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbMTUtMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5CisKKyovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdID0gCit7CisgICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAorICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKKworCTgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMQorfTsKKworCisvKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KKworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdID0KK3sKKyAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwJMCwJMCwJMCwKKwkKKwkyMCwgIDYsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAKKworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjk0OGY4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCkBAIC0wLDAgKzEsNzUgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgTG9va3VwIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisgICAgLyogKiBUYWJsZSBFbnRyaWVzIGNvbnRhaW4gRGMgU2NhbGVyIHZhbHVlcworICAgICAgICogYXJtVkNNNFAyX0RDU2NhbGVyW2ldPSA4ICAgICAgICAgICBmb3IgaT0xICB0byAgNCBhbmQgaT0zMyB0byAzNgorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmkgICAgICAgICBmb3IgaT01ICB0byAgOAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpKzggICAgICAgICBmb3IgaT05ICB0byAgMjUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippLTE2ICAgICAgZm9yIGk9MjYgdG8gIDMxCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IChpLTMyKzEzKS8yIGZvciBpPTM3IHRvICA1OQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpLTYtMzIgICAgICBmb3IgaT02MCB0byAgNjMKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMjU1ICAgICAgICAgZm9yIGk9MCBhbmQgaT0zMgorICAgICAgICovCisgICAgICAgCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0RDU2NhbGVyWzY0XT17CisJMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHhhLCAgMHhjLCAgMHhlLCAgCisgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgCisgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKKyAgICAweDIwLCAweDIyLCAweDI0LCAweDI2LCAweDI4LCAweDJhLCAweDJjLCAweDJlLAorICAgIDB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4OSwgIDB4OSwgIDB4YSwgIAorICAgIDB4YSwgIDB4YiwgIDB4YiwgIDB4YywgIDB4YywgIDB4ZCwgIDB4ZCwgIDB4ZSwgIAorICAgIDB4ZSwgIDB4ZiwgIDB4ZiwgIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIAorICAgIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCisKK307CisKKyAgICAgICAgICAgICAgCisgICAgIC8qICBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCisgICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbaV09cm91bmQoMzI3NjcvaSkKKyAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNlswXT0gMAorICAgICAgKi8KKworY29uc3QgT01YX1MxNiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbNjRdPXsKKwkweDAwMDAsMHg3ZmZmLDB4NDAwMCwweDJhYWEsMHgyMDAwLDB4MTk5OSwweDE1NTUsMHgxMjQ5LAorICAgIDB4MTAwMCwweDBlMzksMHgwY2NkLDB4MGJhMywweDBhYWIsMHgwOWQ5LDB4MDkyNSwweDA4ODgsCisgICAgMHgwODAwLDB4MDc4NywweDA3MWMsMHgwNmJkLDB4MDY2NiwweDA2MTgsMHgwNWQxLDB4MDU5MSwKKyAgICAweDA1NTUsMHgwNTFmLDB4MDRlYywweDA0YmUsMHgwNDkyLDB4MDQ2YSwweDA0NDQsMHgwNDIxLAorICAgIDB4MDQwMCwweDAzZTEsMHgwM2M0LDB4MDNhOCwweDAzOGUsMHgwMzc2LDB4MDM1ZSwweDAzNDgsCisgICAgMHgwMzMzLDB4MDMxZiwweDAzMGMsMHgwMmZhLDB4MDJlOSwweDAyZDgsMHgwMmM4LDB4MDJiOSwKKyAgICAweDAyYWIsMHgwMjlkLDB4MDI4ZiwweDAyODIsMHgwMjc2LDB4MDI2YSwweDAyNWYsMHgwMjU0LAorICAgIDB4MDI0OSwweDAyM2YsMHgwMjM1LDB4MDIyYiwweDAyMjIsMHgwMjE5LDB4MDIxMSwweDAyMDgKKwkgICAKK307CisgICAgIAorICAgICAgLyogVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MworICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyW2ldPXJvdW5kKDEzMTA3MS9pKQorICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzBdPSAwCisgICAgICAgKi8KKworY29uc3QgT01YX1MzMiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbNjRdPXsKKwkweDAwMDAwMDAwLDB4MDAwMWZmZmYsMHgwMDAxMDAwMCwweDAwMDBhYWFhLCAweDAwMDA4MDAwLCAweDAwMDA2NjY2LCAweDAwMDA1NTU1LCAweDAwMDA0OTI0LAorICAgIDB4MDAwMDQwMDAsMHgwMDAwMzhlMywweDAwMDAzMzMzLDB4MDAwMDJlOGMsIDB4MDAwMDJhYWIsIDB4MDAwMDI3NjIsIDB4MDAwMDI0OTIsIDB4MDAwMDIyMjIsCisgICAgMHgwMDAwMjAwMCwweDAwMDAxZTFlLDB4MDAwMDFjNzIsMHgwMDAwMWFmMiwgMHgwMDAwMTk5YSwgMHgwMDAwMTg2MSwgMHgwMDAwMTc0NiwgMHgwMDAwMTY0MywKKyAgICAweDAwMDAxNTU1LDB4MDAwMDE0N2IsMHgwMDAwMTNiMSwweDAwMDAxMmY2LCAweDAwMDAxMjQ5LCAweDAwMDAxMWE4LCAweDAwMDAxMTExLCAweDAwMDAxMDg0LAorICAgIDB4MDAwMDEwMDAsMHgwMDAwMGY4NCwweDAwMDAwZjBmLDB4MDAwMDBlYTEsIDB4MDAwMDBlMzksIDB4MDAwMDBkZDYsIDB4MDAwMDBkNzksIDB4MDAwMDBkMjEsCisgICAgMHgwMDAwMGNjZCwweDAwMDAwYzdkLDB4MDAwMDBjMzEsMHgwMDAwMGJlOCwgMHgwMDAwMGJhMywgMHgwMDAwMGI2MSwgMHgwMDAwMGIyMSwgMHgwMDAwMGFlNSwKKyAgICAweDAwMDAwYWFiLDB4MDAwMDBhNzMsMHgwMDAwMGEzZCwweDAwMDAwYTBhLCAweDAwMDAwOWQ5LCAweDAwMDAwOWE5LCAweDAwMDAwOTdiLCAweDAwMDAwOTRmLAorICAgIDB4MDAwMDA5MjUsMHgwMDAwMDhmYiwweDAwMDAwOGQ0LDB4MDAwMDA4YWUsIDB4MDAwMDA4ODksIDB4MDAwMDA4NjUsIDB4MDAwMDA4NDIsIDB4MDAwMDA4MjAKKwkKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NGYyNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpAQCAtMCwwICsxLDEwNCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7ICoqCis7ICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCis7ICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCis7ICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorOyAqIFtvdXRdcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCis7ICogW291dF1wcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorOyAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCis7ICoKKzsgKi8KKworICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgIElOQ0xVREUgb214VkNfcy5oCisKKworICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKworICAgICAgIElGIEFSTTExMzZKUworIAorOy8vIElucHV0IEFyZ3VtZW50cworQmxvY2tJbmRleCAgICAgICAgIFJOIDAKK3BDb2VmQnVmUm93ICAgICAgICBSTiAxCitwQ29lZkJ1ZkNvbCAgICAgICAgUk4gMgorcHJlZERpciAgICAgICAgICAgIFJOIDMKK3ByZWRRUCAgICAgICAgICAgICBSTiA0CitwUXBCdWYgICAgICAgICAgICAgUk4gNQorCis7Ly8gTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICBSTiAwCitibG9ja0RDTGVmdCAgICAgICAgUk4gNiAgCitibG9ja0RDVG9wICAgICAgICAgUk4gNworYmxvY2tEQ1RvcExlZnQgICAgIFJOIDgKK3RlbXAxICAgICAgICAgICAgICBSTiA5Cit0ZW1wMiAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgIE1fU1RBUlQgICAgYXJtVkNNNFAyX1NldFByZWREaXIscjkKKworICAgICAgIE1fQVJHICAgICAgIHBwcmVkUVAsNAorICAgICAgIE1fQVJHICAgICAgIHBwUXBCdWYsNAorICAgIAorICAgICAgIExEUkggICAgICAgIGJsb2NrRENUb3BMZWZ0LFtwQ29lZkJ1ZlJvdywjLTE2XQorICAgICAgIExEUkggICAgICAgIGJsb2NrRENMZWZ0LFtwQ29lZkJ1ZkNvbF0KKyAgICAgICAKKyAgICAgICBURVEgICAgICAgICBCbG9ja0luZGV4LCMzCisgICAgICAgTERSRVFIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZDb2wsIy0xNl0KKyAgICAgICBMRFJORUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZlJvd10KKyAgICAgICAgICAgICAKKyAgICAgICBTVUJTICAgICAgICB0ZW1wMSxibG9ja0RDTGVmdCxibG9ja0RDVG9wTGVmdAorICAgICAgIFJTQkxUICAgICAgIHRlbXAxLHRlbXAxLCMwCisgICAgICAgU1VCUyAgICAgICAgdGVtcDIsYmxvY2tEQ1RvcExlZnQsYmxvY2tEQ1RvcAorICAgICAgIFJTQkxUICAgICAgIHRlbXAyLHRlbXAyLCMwCisgICAgICAKKyAgICAgICBNX0xEUiAgICAgICBwUXBCdWYscHBRcEJ1ZgorICAgICAgIE1fTERSICAgICAgIHByZWRRUCxwcHJlZFFQCisgICAgICAgQ01QICAgICAgICAgdGVtcDEsdGVtcDIKKyAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX1ZFUlRJQ0FMCisgICAgICAgTERSTFRCICAgICAgdGVtcDEsW3BRcEJ1ZiwjMV0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMSxbcHJlZFFQXQorICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfSE9SSVpPTlRBTCAgICAgICAgICAgCisgICAgICAgTERSR0VCICAgICAgdGVtcDEsW3BRcEJ1Zl0KKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBNT1YgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMSxbcHJlZFFQXSAKKworICAgICAgICAgCisgICAgCisgICAgICAgTV9FTkQKKyAKKyAgICAgICBFTkRJRgorCisgICAgICAgRU5EICAgIAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMWZhNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKQEAgLTAsMCArMSw2MSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgemlnemFnIHRhYmxlcworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworLyogQ29udGFpbnMgRG91YmxlIHRoZSB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBaaWd6YWcgVGFibGUKKyAqIENvbnRhaW5zIENsYXNzaWNhbCxWZXRpY2FsIGFuZCBIb3Jpem9udGFsIFppZ3phZ3NjYW4gdGFibGVzIGluIG9uZSBhcnJheSAgCisgKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXSA9IAoreworICAgICAwLCAgMiwgIDE2LCAzMiwgIDE4LCAgNCwgIDYsIDIwLAorICAgIDM0LCA0OCwgNjQsIDUwLCAzNiwgMjIsICA4LCAgMTAsCisgICAgMjQsIDM4LCA1MiwgNjYsIDgwLCA5NiwgODIsIDY4LAorICAgIDU0LCA0MCwgMjYsICAxMiwgIDE0LCAyOCwgNDIsIDU2LCAKKyAgICA3MCwgODQsIDk4LCAxMTIsIDExNCwgMTAwLCA4NiwgNzIsCisgICAgNTgsIDQ0LCAzMCwgNDYsIDYwLCA3NCwgODgsIDEwMiwKKyAgICAxMTYsIDExOCwgMTA0LCA5MCwgNzYsIDYyLCA3OCwgOTIsCisgICAgMTA2LCAxMjAsIDEyMiwgMTA0LCA5NCwgMTEwLCAxMjQsIDEyNiwKKworCTAsICAxNiwgMzIsIDQ4LCAgMiwgIDE4LCAgNCwgMjAsCisgICAgMzQsIDUwLCA2NCwgODAsIDk2LCAxMTIsIDExNCwgOTgsCisgICAgODIsIDY2LCA1MiwgMzYsICA2LCAyMiwgIDgsIDI0LAorICAgIDM4LCA1NCwgNjgsIDg0LCAxMDAsIDExNiwgNzAsIDg2LAorICAgIDEwMiwgMTE4LCA0MCwgNTYsICAxMCwgMjYsICAxMiwgMjgsCisgICAgNDIsIDU4LCA3MiwgODgsIDEwNCwgMTIwLCA3NCwgOTAsIAorICAgIDEwNiwgMTIyLCA0NCwgNjAsICAxNCwgMzAsIDQ2LCA2MiwKKyAgICA3NiwgOTIsIDEwOCwgMTI0LCA3OCwgOTQsIDExMCwgMTI2LAorCisgICAgMCwgIDIsICA0LCAgNiwgIDE2LCAgMTgsIDMyLCAzNCwKKyAgICAyMCwgMjIsICA4LCAgMTAsICAxMiwgIDE0LCAzMCwgMjgsCisgICAgMjYsIDI0LCAzOCwgMzYsIDQ4LCA1MCwgNjQsIDY2LAorICAgIDUyLCA1NCwgNDAsIDQyLCA0NCwgNDYsIDU2LCA1OCwKKyAgICA2MCwgNjIsIDY4LCA3MCwgODAsIDgyLCA5NiwgOTgsCisgICAgODQsIDg2LCA3MiwgNzQsIDc2LCA3OCwgODgsIDkwLCAKKyAgICA5MiwgOTQsIDEwMCwgMTAyLCAxMTIsIDExNCwgMTE2LCAxMTgsCisgICAgMTA0LCAxMDYsIDEwOCwgMTEwLCAxMjAsIDEyMiwgMTI0LCAxMjYKKworCit9OworCisKKworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzk2YWQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KKyAqIAorICovCisgCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZworICogcG9zaXRpb25pbmcgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCisgKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheQorICogb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IKKyAqIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQorICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCisgKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqCQkJCQkJCQlbMC03XQorICogW2luXQlRUAkJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIGluZGljYXRlcyB1c2luZyBxdWFudGl6YXRpb24gbWV0aG9kIGRlZmluZWQgaW4gc2hvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gaGVhZGVyIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIGluZGljYXRlcyBub3JtYWlsIHF1YW50aXphdGlvbiBtZXRob2QuCisgKiBbb3V0XSBwcEJpdFN0cmVhbSAJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbQorICogW291dF0gcERzdAkJCXBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZGF0YSB0eXBlKS4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdAorICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZToKKyAqICAgLSAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBRUCA8PSAwOworICoJIC0gcERzdCBub3QgMTYtYnl0ZSBhbGlnbmVkCisgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfSU5UIFFQLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCisgICAgMTUgbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjE7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLworICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYpOworICAgIAorICAgIAorICAgIC8qIFZMRCBhbmQgemlnemFnICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBCdWYxLHNob3J0VmlkZW9IZWFkZXIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIERlcXVhbnRpemF0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKKyAgICAgcFRlbXBCdWYxLAorICAgICBRUCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayhwVGVtcEJ1ZjEsIHBEc3QpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworCSAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMjg2NTdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKiBGdW5jdGlvbiBmb3Igc2F0dXJhdGluZyAxNiBiaXQgdmFsdWVzIHRvIHRoZSBbMCwyNTVdIHJhbmdlIGFuZCAgKi8KKy8qIHdyaXRpbmcgb3V0IGFzIDggYml0IHZhbHVlcy4gIERvZXMgNjQgZW50cmllcyAgICAgICAgICAgICAgICAgICAqLwordm9pZCBhcm1WQ000UDJfQ2xpcDgoT01YX1MxNiAqcFNyYywgT01YX1U4ICpwRHN0LCBPTVhfSU5UIGRzdFN0ZXAgKTsKKworCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKKyAqIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKKyAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGZyYW1lL3BsYW5lIG9uCisgKiBhIHBpeGVsIGJhc2lzLiBGb3IgSU5UUkEgYmxvY2ssIHRoZSBvdXRwdXQgdmFsdWVzIGFyZSBjbGlwcGVkIHRvIFswLCAyNTVdIGFuZAorICogd3JpdHRlbiB0byBjb3JyZXNwb25kaW5nIGJsb2NrIGJ1ZmZlciB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKKyAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKgkJCQkJCQkJWzAtN10uCisgKiBbaW5dCXN0ZXAJCQl3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUKKyAqIFtpbi9vdXRdCXBDb2VmQnVmUm93CQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgcndvIGJ1ZmZlcgorICogW2luL291dF0JcENvZWZCdWZDb2wJCVtpbl0gIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgW291dF0gdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dCWN1clFQCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaAorICoJCQkJCQkJCXRoZSBjdXJyZW50IGJsb2NrIGJlbG9uZ3MgdG8KKyAqIFtpbl0JcFFwQnVmCQkgUG9pbnRlciB0byBhIDItZWxlbWVudCBRUCBhcnJheS4gcFFwQnVmWzBdIGhvbGRzIHRoZSBRUCBvZiB0aGUgOHg4IGJsb2NrIGxlZnQgdG8KKyAqICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrKFFQYSkuIHBRcEJ1ZlsxXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBqdXN0IGFib3ZlIHRoZQorICogICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jayhRUGMpLgorICogICAgICAgICAgICAgICAgICAgTm90ZSwgaW4gY2FzZSB0aGUgY29ycmVzcG9uZGluZyBibG9jayBpcyBvdXQgb2YgVk9QIGJvdW5kLCB0aGUgUVAgdmFsdWUgd2lsbCBoYXZlCisgKiAgICAgICAgICAgICAgICAgICBubyBlZmZlY3QgdG8gdGhlIGludHJhLXByZWRpY3Rpb24gcHJvY2Vzcy4gUmVmZXIgdG8gc3ViY2xhdXNlICAiNy40LjMuMyBBZGFwdGl2ZQorICogICAgICAgICAgICAgICAgICAgYWMgY29lZmZpY2llbnQgcHJlZGljdGlvbiIgb2YgSVNPL0lFQyAxNDQ5Ni0yKE1QRUc0IFBhcnQyKSBmb3IgYWNjdXJhdGUgZGVzY3JpcHRpb24uCisgKiBbaW5dCWJsb2NrSW5kZXgJCWJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICoJCQkJCQkJCXBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsCisgKgkJCQkJCQkJRmlndXJlIDYtNSBvZiBJU08vSUVDIDE0NDk2LTIuIAorICogW2luXQlpbnRyYURDVkxDCQlhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4KKyAqCQkJCQkJCQlUaGlzIGFsbG93cyBhIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDCisgKgkJCQkJCQkJZm9yIGNvZGluZyBvZiBJbnRyYSBEQyBjb2VmZmljaWVudHMgYXMgcGVyIFRhYmxlCisgKgkJCQkJCQkJNi0yMSBvZiBJU08vSUVDIDE0NDk2LTIuIAorICogW2luXQlBQ1ByZWRGbGFnCQlhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcKKyAqCQkJCQkJCQlpZiB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QKKyAqCQkJCQkJCQljb2x1bW4gYXJlIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZAorICoJCQkJCQkJCW1hY3JvYmxvY2suCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCisgKgkJCQkJCQlhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgorICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworICoJCQkJCQkJCWRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqCQkJCQkJCQlpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKyAqIFtvdXRdCXBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkJCSpwcEJpdFN0cmVhbQorICogW291dF0JcERzdAkJCXBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KKyAqCQkJCQkJCQlwRHN0IHNob3VsZCBiZSAxNi1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwQ29lZkJ1ZlJvdwkJcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0JQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUVBCdWYsIHBEc3QuCisgKiAgICAgIG9yCisgKiAgIC0gIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZTogKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgY3VyUVAgZXhjZWVkcyAoMSwgMzEpLAorICogICAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsOV0sIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4LCBpbnRyYURDVkxDIGlzIHplcm8gd2hpbGUKKyAqICAgICAgYmxvY2tJbmRleCBncmVhdGVyIHRoYW4gNS4KKyAqICAgICAgb3IKKyAqICAgLQlwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQKKyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgT01YX0lOVCBzdGVwLAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9VOCBjdXJRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICAgT01YX0lOVCBpbnRyYURDVkxDLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisJIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorICkKK3sKKyAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOworICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMjsKKyAgICBPTVhfSU5UIHByZWREaXIsIHByZWRBQ0RpcjsKKyAgICBPTVhfSU5UICBwcmVkUVA7CisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgCisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMSk7CisgICAgcFRlbXBCdWYyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjIpOworICAgIAorICAgIC8qIFNldHRpbmcgdGhlIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIGFuZCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAqLworICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICAgICBibG9ja0luZGV4LAorICAgICAgICBwQ29lZkJ1ZlJvdywKKyAgICAgICAgcENvZWZCdWZDb2wsCisgICAgICAgICZwcmVkRGlyLAorICAgICAgICAmcHJlZFFQLAorICAgICAgICBwUVBCdWYpOworCisgICAgcHJlZEFDRGlyID0gcHJlZERpcjsKKworICAgIAorICAgIGlmIChBQ1ByZWRGbGFnID09IDApCisgICAgeworICAgICAgICBwcmVkQUNEaXIgPSBPTVhfVkNfTk9ORTsKKyAgICB9CisKKyAgICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KKyAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOworICAgIH0KKyAgICAKKworICAgIC8qIFZMRCBhbmQgemlnemFnICovCisgICAgaWYgKGludHJhRENWTEMgPT0gMSkKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICB2aWRlb0NvbXApOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICAgICAgcHJlZEFDRGlyLAorICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIH0KKworICAgIC8qIEFDIERDIHByZWRpY3Rpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAorICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgIHBDb2VmQnVmUm93LAorICAgICAgICBwQ29lZkJ1ZkNvbCwKKyAgICAgICAgY3VyUVAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgY3VyUVAsCisgICAgIHZpZGVvQ29tcCwKKyAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIFBsYWNpbmcgdGhlIGxpbmVhciBhcnJheSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSBhbmQgY2xpcHBpbmcKKyAgICAgICBpdCB0byAwIHRvIDI1NSAqLworICAgIAorCWFybVZDTTRQMl9DbGlwOChwVGVtcEJ1ZjIscERzdCxzdGVwKTsKKwkKKwkKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYzE2ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwpAQCAtMCwwICsxLDM2NCBAQAorOyAqKioqKioqKioqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKiAKKzsgKioKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIERlY29kZXMgYW5kIHBhZHMgZm91ciBtb3Rpb24gdmVjdG9ycyBvZiB0aGUgbm9uLWludHJhIG1hY3JvYmxvY2sgaW4gUC1WT1AuCis7ICogVGhlIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBwcm9jZXNzIGlzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy42LjEuNiBvZgorOyAqIElTTy9JRUMgMTQ0OTYtMi4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgorOyAqIFtpbl0gICAgcFNyY01WTGVmdE1CICAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCis7ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCis7ICogW2luXSAgICBwU3JjTVZVcHBlck1CICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXIgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCis7ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCis7ICogW2luXSAgICBwU3JjTVZVcHBlclJpZ2h0TUIgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCis7ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCis7ICogW2luXSAgICBmY29kZUZvcndhcmQgICAgICAgYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNAorOyAqICAgICAgICAgICAgICAgICAgICAgYml0IHN0cmVhbSBzeW50YXgKKzsgKiBbaW5dICAgIE1CVHlwZSAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZQorOyAqICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24KKzsgKiAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIGZpbGxlZCB3aXRoIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgc2FtZSBkZWNvZGVkIHZlY3Rvci4KKzsgKiBbb3V0XSAgIHBwQml0U3RyZWFtICAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsCis7ICogICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKzsgKiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorOyAqICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICBwRHN0TVZDdXJNQiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrIHdoaWNoIGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycworOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLW5vIGVycm9yCis7ICogCis7ICogICAgICAgICAgICAgICAgICAgICAKKzsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorOyAqCis7ICoKKyAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKyAgICAgICAgSU5DTFVERSBvbXhWQ19zLmgKKyAgICAgICAgCisgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAKKyAgICAgICAgICAgICAgICAKKworCisgICAgICAgIElGIEFSTTExMzZKUworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgICBSTiAxCitwU3JjTVZMZWZ0TUIgICAgICAgICAgUk4gMgorcFNyY01WVXBwZXJNQiAgICAgICAgIFJOIDMKK3BTcmNNVlVwcGVyUmlnaHRNQiAgICBSTiA0CitwRHN0TVZDdXJNQiAgICAgICAgICAgUk4gNQorZmNvZGVGb3J3YXJkICAgICAgICAgIFJOIDYKK01CVHlwZSAgICAgICAgICAgICAgICBSTiA3CisKKzsvL0xvY2FsIFZhcmlhYmxlcworCit6ZXJvICAgICAgICAgICAgICAgICAgUk4gNAorb25lICAgICAgICAgICAgICAgICAgIFJOIDQKK3NjYWxlRmFjdG9yICAgICAgICAgICBSTiAxCisKKworUmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKKworVmxjTVZEICAgICAgICAgICAgICAgIFJOIDAKK2luZGV4ICAgICAgICAgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICAgUk4gNworCittdkhvckRhdGEgICAgICAgICAgICAgUk4gNAorbXZIb3JSZXNpZHVhbCAgICAgICAgIFJOIDAKKworbXZWZXJEYXRhICAgICAgICAgICAgIFJOIDQgICAgICAgICAgICAgCittdlZlclJlc2lkdWFsICAgICAgICAgUk4gMAorCit0ZW1wICAgICAgICAgICAgICAgICAgUk4gMQorCit0ZW1wMSAgICAgICAgICAgICAgICAgUk4gMworSGlnaCAgICAgICAgICAgICAgICAgIFJOIDQKK0xvdyAgICAgICAgICAgICAgICAgICBSTiAyCitSYW5nZSAgICAgICAgICAgICAgICAgUk4gMQorCitCbGtDb3VudCAgICAgICAgICAgICAgUk4gMTQKKworZGlmZk1WZHggICAgICAgICAgICAgIFJOIDAKK2RpZmZNVmR5ICAgICAgICAgICAgICBSTiAxCisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICAgUk4gOAorUkJpdENvdW50ICAgICAgICAgICAgIFJOIDkKK1JCaXRCdWZmZXIgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICAgUk4gMTEKK1QyICAgICAgICAgICAgICAgICAgICBSTiAxMgorTFIgICAgICAgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FWbGNNVkQKKyAgICAgICBJTVBPUlQgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKKworICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgICAgICAgIAorICAgICAgIAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcERzdE1WQ3VyTUIsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwRHN0TVZQcmVkTUUsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwQmxrQ291bnQsNAorICAgICAgIAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcEJpdE9mZnNldCw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZMZWZ0TUIsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WVXBwZXJNQiw0CisgICAgICAgCisgICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeCw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeSw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBIaWdoLDQKKyAgICAgICAKKyAgICAgICAgICAgICAgCisKKworICAgICAgIE1fU1RBUlQgICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCxyMTEKKyAgICAgICAKKyAgICAgICBNX0FSRyAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1Cb25TdGFjayw0ICAgICAgICAgICA7Ly8gcG9pbnRlciB0byAgcFNyY01WVXBwZXJSaWdodE1CIG9uIHN0YWNrCisgICAgICAgTV9BUkcgICAgICAgICAgIHBEc3RNVkN1ck1Cb25TdGFjayw0ICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gcERzdE1WQ3VyTUIgb24gc3RhY2sKKyAgICAgICBNX0FSRyAgICAgICAgICAgZmNvZGVGb3J3YXJkb25TdGFjayw0ICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBmY29kZUZvcndhcmQgb24gc3RhY2sgCisgICAgICAgTV9BUkcgICAgICAgICAgIE1CVHlwZW9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gTUJUeXBlIG9uIHN0YWNrCisKKyAgICAgIAorICAgICAgIAorICAgICAgIAorICAgICAgIAorICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIEJpdFN0cmVhbSBNYWNybworCisgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKKyAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBNQlR5cGUgZnJvbSBzdGFjaworICAgICAgIE1fTERSICAgICAgICAgICBwRHN0TVZDdXJNQixwRHN0TVZDdXJNQm9uU3RhY2sgICAgICAgIDsvLyBMb2FkIHBEc3RNVkN1ck1CIGZyb20gc3RhY2sKKyAgICAgICBNT1YgICAgICAgICAgICAgemVybywjMAorCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkEKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkFfUSAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQV9RCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CXQorICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBNT1YgICAgICAgICAgICAgQmxrQ291bnQsIzAKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgCisgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRPSworCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFYgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0VgorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWX1EgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFZfUQorICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjNAorCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVIKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUl9RCisgICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCMxCisgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIGZjb2RlRm9yd2FyZCxmY29kZUZvcndhcmRvblN0YWNrICAgICAgOy8vIExvYWQgZmNvZGVGb3J3YXJkICBmcm9tIHN0YWNrCisKKyAgICAgICA7Ly8gU3RvcmluZyB0aGUgdmFsdWVzIHRlbXBvcmFyaWx5IG9uIHN0YWNrCisKKyAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAKKyAgICAgICBNX1NUUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAorICAgICAgICAgICAgCisKKyAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1mY29kZUZvcndhcmQtMQorICAgICAgIE1PViAgICAgICAgICAgICBvbmUsIzEKKyAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKKyAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isb25lLHRlbXAgICAgICAgICAgICAgICAgICA7Ly8gc2NhbGVGYWN0b3I9MTw8KGZjb2RlRm9yd2FyZC0xKQorICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCisgICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLHNjYWxlRmFjdG9yLCM1ICAgICAgICAgICAgCisgICAgICAgTV9TVFIgICAgICAgICAgIHNjYWxlRmFjdG9yLHBIaWdoICAgICAgICAgICAgICAgICAgICAgOy8vIFtwSGlnaF09MzIqc2NhbGVGYWN0b3IKKyAgICAgICAgICAgICAgCisgICAgICAgOy8vIFZMRCBEZWNvZGluZworCisKK0xvb3AKKworICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWQgdGhlIG9wdGltaXplZCBNVkQgVkxDIHRhYmxlCisKKyAgICAgICA7Ly8gSG9yaXpvbnRhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgorCisgICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIHZhcmlhYmxlIGxlbmdodCBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KKyAgICAgIAorICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCisgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIHRoZSBkZWNvZGVkIHN5bWJvbCBpcyBhbiBpbnZhbGllZCBzeW1ib2wgCisgICAgICAgCisgICAgICAgU1VCICAgICAgICAgICAgIG12SG9yRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCwjMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JSZXNpZHVhbD0xCisgICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQorICAgICAgIFRFUU5FICAgICAgICAgICBtdkhvckRhdGEsIzAKKyAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZIb3JEYXRhPTAgZGlmZk1WZHg9bXZIb3JEYXRhICAgICAgICAgCisgICAgICAgQkVRICAgICAgICAgICAgIFZlcnRpY2FsRGF0YQorICAgICAgIAorICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQorICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdkhvclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBnZXQgbXZIb3JSZXNpZHVhbCBmcm9tIGJpdHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbXZIb3JEYXRhIT0wICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgbXZIb3JEYXRhLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIG12SG9yRGF0YSxtdkhvckRhdGEsIzAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1hYnMobXZIb3JEYXRhKQorICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLG12SG9yUmVzaWR1YWwsZmNvZGVGb3J3YXJkCisgICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSxmY29kZUZvcndhcmQsbXZIb3JSZXNpZHVhbCA7Ly8gZGlmZk1WZHg9YWJzKG12SG9yRGF0YSkqZmNvZGVGb3J3YXJkK212SG9yUmVzaWR1YWwtZmNvZGVGb3J3YXJkCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMxCisgICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMwCisgICAgICAgCisgICAgICAgOy8vIFZlcnRpY2FsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCisKK1ZlcnRpY2FsRGF0YQorCisgICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSBkaWZmTVZkeCBvbiBzdGFjaworICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWRpbmcgdGhlIGFkZHJlc3Mgb2Ygb3B0aW1pemVkIFZMQyB0YWJsZXMKKworICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRgorICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyBWTEMgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCisgICAgICAgCisgICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKKyAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgYW4gSW52YWxpZWQgU3ltYm9sIG9jY3VycworICAgICAgIAorICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdlZlckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsIzEgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKKyAgICAgICBURVFORSAgICAgICAgICAgbXZWZXJEYXRhLCMwCisgICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR5ID0gbXZWZXJEYXRhIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12VmVyRGF0YT0wCisgICAgICAgQkVRICAgICAgICAgICAgIEZpbmRNVlByZWQKKworICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQorICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdlZlclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBHZXQgbXZWZXJSZXNpZHVhbCBmcm9tIGJpdCBzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG1uVmVyRGF0YSE9MAorICAgICAgICAgICAgIAorCisgICAgICAgQ01QICAgICAgICAgICAgIG12VmVyRGF0YSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICBtdlZlckRhdGEsbXZWZXJEYXRhLCMwCisgICAgICAgU1VCICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsbXZWZXJSZXNpZHVhbCxmY29kZUZvcndhcmQKKyAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhLGZjb2RlRm9yd2FyZCxtdlZlclJlc2lkdWFsIDsvLyBkaWZmTVZkeT1hYnMobXZWZXJEYXRhKSpmY29kZUZvcndhcmQrbXZWZXJSZXNpZHVhbC1mY29kZUZvcndhcmQKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzEKKyAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzAKKworICAgICAgIDsvL0NhbGxpbmcgdGhlIEZ1bmN0aW9uIG9teFZDTTRQMl9GaW5kTVZwcmVkCisgICAgICAgIAorRmluZE1WUHJlZAorCisgICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR5LHBkaWZmTVZkeQorICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHBEc3RNVkN1ck1CLEJsa0NvdW50LExTTCAjMiAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQorICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBwRHN0TVZDdXJNQiAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wIG9uIHN0YWNrIGZvciBwYXNzaW5nIGFzIGFuIGFyZ3VtZW50IHRvIEZpbmRNVlByZWQKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCwjMAorICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBEc3RNVlByZWRNRSAgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzIHBEc3RNVlByZWRNRT1OVUxMIGFzIGFuIGFyZ3VtZW50ICAgICAgICAgCisgICAgICAgTV9TVFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3NzIEJsa0NvdW50IGFzIEFyZ3VtZW50IHRocm91Z2ggc3RhY2sKKworICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLHBTcmNNVkxlZnRNQiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wIChSTiAxKT1wU3JjTVZMZWZ0TUIKKyAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1CLHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2sKKyAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WTGVmdE1CLHBTcmNNVlVwcGVyTUIgICAgICAgICAgICA7Ly8gcFNyY01WTGVmdE1CICggUk4gMikgPSBwU3JjTVZVcHBlck1CCisgICAgICAgTU9WICAgICAgICAgICAgIHBwQml0U3RyZWFtLHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgOy8vIHBwQml0U3RyZWFtICAoIFJOIDApID0gcERzdE1WQ3VyTUIKKyAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WVXBwZXJNQixwU3JjTVZVcHBlclJpZ2h0TUIgICAgICA7Ly8gcFNyY01WVXBwZXJNQiggUk4gMykgPSBwU3JjTVZVcHBlclJpZ2h0TUIgICAgICAKKyAgICAgICBCTCAgICAgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gc3Vicm91dGluZSBvbXhWQ000UDJfRmluZE1WcHJlZAorCisgICAgICAgOy8vIFN0b3JlIEhvcml6b250YWwgTW90aW9uIFZlY3RvcgorICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBCbGtDb3VudCBmcm9tIHN0YWNrCisgICAgICAgTV9MRFIgICAgICAgICAgIEhpZ2gscEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9MzIqc2NhbGVGYWN0b3IKKyAgICAgICBMU0wgICAgICAgICAgICAgdGVtcDEsQmxrQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1CbGtDb3VudCo0CisgICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHgKKyAgICAgICAKKyAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KKyAgICAgICAKKyAgICAgICAKKyAgICAgICBSU0IgICAgICAgICAgICAgTG93LEhpZ2gsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG93ID0gLTMyKnNjYWxlRmFjdG9yCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4PXBEc3RNVkN1ck1CW0Jsa0NvdW50XStkaWZmTVZkeAorICAgICAgIEFERCAgICAgICAgICAgICBSYW5nZSxIaWdoLEhpZ2ggICAgICAgICAgICAgICAgICAgICAgIDsvLyBSYW5nZT02NCpTY2FsZUZhY3RvcgorICAgICAgIFNVQiAgICAgICAgICAgICBIaWdoLEhpZ2gsIzEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPSAzMipzY2FsZUZhY3Rvci0xCisKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHg8TG93ICAgICAgICAgIAorICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeCs9UmFuZ2UKKyAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4ID4gSGlnaCBkaWZmTVZkeC09UmFuZ2UKKyAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXQorCisgICAgICAgOy8vIFN0b3JlIFZlcnRpY2FsCisKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsdGVtcDEsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9NCpCbGtDb3VudCsyCisgICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeSAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHkKKyAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0uZGlmZk1WZHkKKyAgICAgICBBREQgICAgICAgICAgICAgQmxrQ291bnQsQmxrQ291bnQsIzEgICAgICAgICAgICAgICAgICA7Ly8gQmxrQ291bnQ9QmxrQ291bnQrMQorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cKKyAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHk8TG93ICBkaWZmTVZkeSs9UmFuZ2UgICAgICAgICAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2gKKyAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHkgPiBIaWdoIGRpZmZNVmR5LT1SYW5nZQorICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgIAorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBCbGtDb3VudCxDb3VudAorICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgorICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCisKKyAgICAgICBCTFQgICAgICAgICAgICAgTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgQmxrQ291bnQ8Q291bnQgQ29udGludWUgdGhlIExvb3AKKworCisgICAgICAgOy8vIElmIE1CVHlwZT1PTVhfVkNfSU5URVIgb3IgTUJ0eXBlPU9NWF9WQ19JTlRFUl9RIGNvcHkgcERzdE1WQ3VyTUJbMF0gdG8KKyAgICAgICA7Ly8gcERzdE1WQ3VyTUJbMV0sIHBEc3RNVkN1ck1CWzJdLCBwRHN0TVZDdXJNQlszXSAKKworICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjaworCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgTERSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CXQorICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgCisgICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM4XQorICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjMTJdCisgICAgICAgCisgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKKyAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hpbmcgdGhlIE1hY3JvICAgICAgIAorCisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKKyAKK0V4aXRFcnJvcgorCisgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0CisgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0CisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKworRXhpdE9LICAgICAgICAgICAgIAorCisgICAgICAgTV9FTkQKKyAgICAgICBFTkRJRgorICAgICAgIEVORAorCisKKyAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyMDhjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKQEAgLTAsMCArMSwxMzIgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIHRoZSBWTEMsWmlnemFnLExNQVggYW5kIFJNQVggdGFibGVzCisgICAgIAorICAgICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLHIxMgorCisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgIDsvLyBMb2FkIHppZ3phZyB0YWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrIHRvIHBhc3MgYXMgYXJndW1lbnQgdG8gdW5zYWZlIGZ1bmN0aW9uCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIFZMQyB0YWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcworICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgb3B0aW1pemVkIFZMQyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgTE1BWCBUYWJsZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIFJNQVggVGFibGVzCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzZXQgc3RhcnQ9MAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgUk1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICA7Ly8gY2FsbCBVbnNhZmUgRnVuY3Rpb24gZm9yIFZMQyBaaWd6YWcgRGVjb2RpbmcKKyAgICAgICAgIAorICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWEzN2VjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCkBAIC0wLDAgKzEsMTM2IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK1ByZWREaXIgICAgICAgICAgICAgIFJOIDMKK3Nob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAorICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLHIxMgorCisgICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBJbnB1dCBBcmd1bWVudCBvbiBzdGFjayAgICAgICAgICAgCisKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIExvYWQgQWRkcmVzcyBvZiB0aGUgWmlnemFnIHRhYmxlICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgOy8vIExvYWRpbmcgRGlmZmVyZW50IHR5cGUgb2YgemlnemFnIHRhYmxlcyBiYXNlZCBvbiBQcmVkRGlyCisgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgWmlnemFnIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIHBhY2tlZCBWTEMgVGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBWTEMgVGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCisgICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCBUYWJsZSBhZGRyZXNzIG9uIFN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKKyAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgU3RhcnQ9MCAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFJNQVggVGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICAgICAgICAKKworICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgOy8vIGdldCB0aGUgSW5wdXQgQXJndW1lbnQgZnJvbSBzdGFjaworCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgIDsvLyBDYWxsIFVuc2FmZSBGdW5jdGlvbgorCisKKworICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NzhhYWYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKQEAgLTAsMCArMSwyMjQgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciBibG9jay4KKzsgKgorOyAqCis7ICoKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKzsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCis7ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgorOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKzsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCis7ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKzsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCis7ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKzsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCis7ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKKzsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCis7ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KKzsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCis7ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCis7ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQorOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAorOyAqCis7ICovCisKKworICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisKKworICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgIAorICAgICAgCisKKworICAgICAgSUYgQ29ydGV4QTgKKworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBDTGFzc2ljYWwsIEhvcml6b250YWwsIFZlcnRpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCAgOy8vIENvbnRhaW5zIE9wdGltaXplZCBEQ0x1bWEgYW5kIERDQ2hyb21hIEluZGV4IHRhYmxlIEVudHJpZXMKKyAgICAgICAgCisKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitQcmVkRGlyICAgICAgICAgICAgICBSTiAzCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCit2aWRlb0NvbXAgICAgICAgICAgICBSTiA1Cis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwRENMdW1hQ2hyb21hSW5kZXggICBSTiA0CitwRENDaHJvbWFJbmRleCAgICAgICBSTiA3CitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICBSTiA2CitEQ1ZhbHVlU2l6ZSAgICAgICAgICBSTiA2Citwb3dPZlNpemUgICAgICAgICAgICBSTiA3Cit0ZW1wMSAgICAgICAgICAgICAgICBSTiA1CisKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKK1JCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKK1JCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICBSTiAxMgorRENWYWwgICAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCisgICAgIAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBEQ0NvZWZmLDQKKyAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLHIxMgorCisgICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrICAKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uc3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBvaW50ZXIgdG8gYXJndW1lbnQgb24gc3RhY2sKKworICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBEQyBDb2VmZmljaWVudAorCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcERDTHVtYUNocm9tYUluZGV4LCA9YXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4IDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgZm9yIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UKKworICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRzdHJlYW0gTWFjcm8KKworICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgQUREICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCxwRENMdW1hQ2hyb21hSW5kZXgsdmlkZW9Db21wLCBMU0wgIzYgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCisgICAgCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgICAgICAgRENWYWx1ZVNpemUsVDEsVDIscERDTHVtYUNocm9tYUluZGV4LDQsMiAgICAgICAgICAgICAgICAgICAgOy8vIFZMQyBEZWNvZGUgdXNpbmcgb3B0aW1pemVkIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UgVkxDIFRhYmxlCisKKyAgICAKKyAgICAgICAKKworRGVjb2RlREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCMxMiAgICAgCisgICAgICAgIEJHVCAgICAgICAgICAgICBFeGl0RXJyb3IKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMAorICAgICAgICBNT1ZFUSAgICAgICAgICAgRENWYWwsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIERDVmFsdWVTaXplIGlzIHplcm8gdGhlbiBEQyBjb2VmZiA9MAorICAgICAgICBCRVEgICAgICAgICAgICAgQUNEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBwZXJmb3JtIEFDIENvZWZmIERlY29kaW5nCisgICAgICAgIAorICAgICAgICBNX0JEX1ZSRUFEMTYgICAgRENWYWwsRENWYWx1ZVNpemUsVDEsVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBEQyBWYWx1ZSBGcm9tIEJpdCBzdHJlYW0KKyAgICAgICAgIAorCisgICAgICAgIE1PViAgICAgICAgICAgICBwb3dPZlNpemUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTFNMICAgICAgICAgICAgIHBvd09mU2l6ZSxEQ1ZhbHVlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb3dPZlNpemU9cG93KDIsRENWYWx1ZVNpemUpCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbCxwb3dPZlNpemUsTFNSICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBEQ1ZhbCB3aXRoIHBvd09mU2l6ZS8yIAorICAgICAgICBBRERMVCAgICAgICAgICAgRENWYWwsRENWYWwsIzEKKyAgICAgICAgU1VCTFQgICAgICAgICAgIERDVmFsLERDVmFsLHBvd09mU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBMZXNzdGhhbiBwb3dPZlNpemUvMiBEQ1ZhbD1EQ1ZhbC1wb3dPZlNpemUrMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgRENWYWw9IGZldGNoYml0cyBmcm9tIGJpdCBzdHJlYW0KKworQ2hlY2tEQ1ZhbHVlU2l6ZQorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBncmVhdGVyIHRoYW4gOCBjaGVjayBtYXJrZXIgYml0CisKKyAgICAgICAgQkxFICAgICAgICAgICAgIEFDRGVjb2RlCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKKyAgICAgICAgVEVRICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBNYXJrZXIgYml0IGlzIHplcm8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIAorCisgICAgICAgIDsvLyBEZWNvZGUgQUMgQ29lZmZpY2llbnQKKworQUNEZWNvZGUKKworICAgICAgICBNX1NUUiAgICAgICAgICAgRENWYWwscERDQ29lZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgRGVjb2RlZCBEQyBDb2VmZiBvbiBTdGFjaworICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVybWluYXRpbmcgdGhlIEJpdCBzdHJlYW0gTWFjcm8KKyAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgICAgIDsvLyBMb2FkIFppZ3phZyB0YWxiZSBhZGRyZXNzICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICAgICAgIDsvLyBNb2RpZnkgdGhlIFppZ3phZyB0YWJsZSBhZHJlc3MgYmFzZWQgb24gUHJlZERpciAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgV2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xIEVudHJpZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIE9wdGltaXplZCBWTEMgVGFibGUgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCisgICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQorICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0ID0xICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIG9uIFN0YWNrCisgICAgICAgIAorICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgSW5wdXQgQXJndW1lbnQgRnJvbSBTdGFjaworICAgICAgICAKKyAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICAgICA7Ly8gQ2FsbCB0aGUgVW5zYWZlIEZ1bmN0aW9uCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCB0aGUgRGVjb2RlZCBEQyBWYWx1ZSBGcm9tIFN0YWNrCisgICAgICAgIFNUUkggICAgICAgICAgICBEQ1ZhbCxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgREMgVmFsdWUgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKKyAgICAgICAgCisgICAgICAgICAgICAgIAorCitFeGl0RXJyb3IKKyAKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgU3RyZWFtIE1hY3JvIGluIGNhc2Ugb2YgYW4gRXJyb3IKKyAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIAorRXhpdE9LCisgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2FmNzEyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKQEAgLTAsMCArMSwxOTQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9GaW5kTVZwcmVkX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAorOy8vCisgICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICBJTkNMVURFIGFybVZDQ09NTV9zLmgKKworICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAyX3BCbGtJbmRleFRhYmxlCisgICAgICAgIERDRCAgT01YVkNCbGswLCBPTVhWQ0JsazEKKyAgICAgICAgRENEICBPTVhWQ0JsazIsIE9NWFZDQmxrMworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKK3BTcmNNVkN1ck1CICAgICAgICAgICAgUk4gMAorcFNyY0NhbmRNVjEgICAgICAgICAgICBSTiAxCitwU3JjQ2FuZE1WMiAgICAgICAgICAgIFJOIDIKK3BTcmNDYW5kTVYzICAgICAgICAgICAgUk4gMworcERzdE1WUHJlZCAgICAgICAgICAgICBSTiA0CitwRHN0TVZQcmVkTUUgICAgICAgICAgIFJOIDUKK2lCbGsgICAgICAgICAgICAgICAgICAgUk4gNgorCitwVGFibGUgICAgICAgICAgICAgICAgIFJOIDQKK0NhbmRNViAgICAgICAgICAgICAgICAgUk4gMTIKKworcENhbmRNVjEgICAgICAgICAgICAgICBSTiA3CitwQ2FuZE1WMiAgICAgICAgICAgICAgIFJOIDgKK3BDYW5kTVYzICAgICAgICAgICAgICAgUk4gOQorCitDYW5kTVYxZHggICAgICAgICAgICAgIFJOIDAgCitDYW5kTVYxZHkgICAgICAgICAgICAgIFJOIDEgCitDYW5kTVYyZHggICAgICAgICAgICAgIFJOIDIKK0NhbmRNVjJkeSAgICAgICAgICAgICAgUk4gMworQ2FuZE1WM2R4ICAgICAgICAgICAgICBSTiAxMAorQ2FuZE1WM2R5ICAgICAgICAgICAgICBSTiAxMQorCit0ZW1wICAgICAgICAgICAgICAgICAgIFJOIDE0CisKK3plcm8gICAgICAgICAgICAgICAgICAgUk4gMTQKK3JldHVybiAgICAgICAgICAgICAgICAgUk4gMAorICAgICAgICAKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBNYWluIHJvdXRpbmUKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCisKKyAgICAgICAgTV9BTExPQzQgTVYsIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0ZpbmRNVnByZWQsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZCwgIDQKKyAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZE1FLCA0CisgICAgICAgIE1fQVJHICAgQmxrLCA0CisgICAgICAgIAorICAgICAgICBNX0FEUiBDYW5kTVYsIE1WCisgICAgICAgIE1PViAgIHplcm8sICMwCisgICAgICAgIE1fTERSIGlCbGssIEJsaworICAgICAgICAKKyAgICAgICAgOy8vIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlc2UKKyAgICAgICAgOy8vIHRvIGJlIHVzZWQgaWYgcFNyY0NhbmRNVlsxfDJ8M10gPT0gTlVMTAorICAgICAgICBNT1YgICBwQ2FuZE1WMSwgQ2FuZE1WCisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBDYW5kTVYKKyAgICAgICAgTU9WICAgcENhbmRNVjMsIENhbmRNVgorICAgIAorICAgICAgICBTVFIgICB6ZXJvLCBbQ2FuZE1WXQorCisgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gYmxrIG51bWJlcgorICAgICAgICBNX1NXSVRDSCBpQmxrCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMCAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGsxICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazIgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMyAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9FTkRTV0lUQ0gKKyAgICAgICAgCitPTVhWQ0JsazAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzQKKyAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICM4CisKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKKyAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjEsICMwCisgICAgCisgICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMgorICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYyLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjMKKyAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYzCisgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKKyAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCisgICAgCisgICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQorICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKKyAgICAgICAgCisgICAgICAgIEIgICAgIEJsa0VuZAorICAgIAorT01YVkNCbGsxCisgICAgICAgIE1PViAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQgorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAorICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzEyCisgICAgCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKKyAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCisgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgQmxrRW5kCisKK09NWFZDQmxrMgorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKKyAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCisgICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKKyAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjMTIKKyAgICAgICAgQiAgICAgQmxrRW5kCisKK09NWFZDQmxrMworICAgICAgICBBREQgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIsICM4CisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgorICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0CisgICAgCitCbGtFbmQKKworICAgICAgICA7Ly8gVXNpbmcgdGhlIHRyYW5zcGVyYW5jeSBpbmZvLCB6ZXJvCisgICAgICAgIDsvLyBvdXQgdGhlIGNhbmRpZGF0ZSBNViBpZiBuZWNjZXNhcnkKKyAgICAgICAgTERSU0ggQ2FuZE1WMWR4LCBbcENhbmRNVjFdLCAjMgorICAgICAgICBMRFJTSCBDYW5kTVYyZHgsIFtwQ2FuZE1WMl0sICMyCisgICAgICAgIExEUlNIIENhbmRNVjNkeCwgW3BDYW5kTVYzXSwgIzIKKyAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgcERzdE1WUHJlZE1FLCBwcERzdE1WUHJlZE1FCisKKyAgICAgICAgTERSU0ggQ2FuZE1WMWR5LCBbcENhbmRNVjFdCisgICAgICAgIExEUlNIIENhbmRNVjJkeSwgW3BDYW5kTVYyXQorICAgICAgICBMRFJTSCBDYW5kTVYzZHksIFtwQ2FuZE1WM10KKworICAgICAgICBDTVAgcERzdE1WUHJlZE1FLCAjMCAgICAgICAgCisKKyAgICAgICAgOy8vIFN0b3JlIHRoZSBjYW5kaWRhdGUgTVYncyBpbnRvIHRoZSBwRHN0TVZQcmVkTUUsIAorICAgICAgICA7Ly8gdGhlc2UgY2FuIGJlIHVzZWQgaW4gdGhlIGZhc3QgYWxnb3JpdGhtIGlmIGltcGxlbWVudGVkIAorCisgICAgICAgIFNUUkhORSBDYW5kTVYxZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WMWR5LCBbcERzdE1WUHJlZE1FXSwgIzIgICAgICAgIAorICAgICAgICBTVFJITkUgQ2FuZE1WMmR4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjJkeSwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WM2R5LCBbcERzdE1WUHJlZE1FXQorICAgICAgICAgICAKKyAgICAgICAgOyBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MKKyAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeCwgQ2FuZE1WMmR4LCBDYW5kTVYzZHgsIHRlbXAKKworICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiBwRHN0TVZQcmVkLCBwcERzdE1WUHJlZAorCisgICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHksIENhbmRNVjJkeSwgQ2FuZE1WM2R5LCB0ZW1wCisgICAgCisgICAgICAgIFNUUkggQ2FuZE1WM2R4LCBbcERzdE1WUHJlZF0sICMyCisgICAgICAgIFNUUkggQ2FuZE1WM2R5LCBbcERzdE1WUHJlZF0KKworICAgICAgICBNT1YgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgIAorICAgICAgICBNX0VORAorICAgIEVORElGIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKyAgICAKKyAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNWUzZDBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwpAQCAtMCwwICsxLDczIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfSURDVDh4OGJsa19zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsKKzsvLworICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0lEQ1Rfcy5oICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1DT01NX0lEQ1RQcmVTY2FsZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEZ1bmN0aW9uIHByb3RvdHlwZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICAgICBPTVhSZXN1bHQKKyAgICAgICAgOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsayhjb25zdCBPTVhfUzE2KiBwU3JjLAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2KiBwRHN0KQorICAgICAgICA7Ly8gICAgCisgICAgICAgIAorICAgIElGIENvcnRleEE4CisgICAgICAgIE1fQUxMT0M0ICBwcERlc3QsIDQKKyAgICAgICAgTV9BTExPQzQgIHBTdHJpZGUsIDQKKyAgICAgICAgTV9BTExPQzggIHBCbGssIDIqOCo4CisgICAgRU5ESUYKKyAgICAKKyAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9JRENUOHg4YmxrLCByMTEsIGQxNQorICAgIEVORElGCisgICAgICAgIAorICAgIElGIENvcnRleEE4CisgICAgICAgIAorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorcERzdCAgICAgICAgICAgIFJOIDEKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworUmVzdWx0ICAgICAgICAgIFJOIDAKKworOy8vIFByb3RvdHlwZSBmb3IgbWFjcm8gTV9JRENUCis7Ly8gcFNyYyAgICAgICAgICAgIFJOIDAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKKzsvLyBTdHJpZGUgICAgICAgICAgUk4gMSAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcworOy8vIHBEZXN0ICAgICAgICAgICBSTiAyICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKKzsvLyBwU2NhbGUgICAgICAgICAgUk4gMyAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQorCitwU3JjICAgIFJOIDAgICAgCitTdHJpZGUgIFJOIDEgICAgCitwRGVzdCAgIFJOIDIgICAgCitwU2NhbGUgIFJOIDMgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBEZXN0LCBwRHN0CisgICAgICAgIExEUiAgICAgICAgIHBTY2FsZSwgPWFybUNPTU1fSURDVFByZVNjYWxlICAgICAgICAKKyAgICAgICAgTV9JRENUICAgICAgczksIHMxNiwgMTYgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgUmVzdWx0LCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORCAgICAgICAKKyAgICBFTkRJRiAgCisgICAgICAgIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkMDBkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKQEAgLTAsMCArMSw0NDQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vCis7Ly8KKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworCisgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQVJNMTEzNkpTIGltcGxlbWVudGF0aW9uCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBDb3J0ZXhBOCBpbXBsZW1lbnRhdGlvbgorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIElGICBDb3J0ZXhBOAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIE1BQ1JPIERFRklOSVRJT05TCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJJbnRlZ2VyUGl4ZWwiIHByZWRpY3RUeXBlLiBCb3RoIAorICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZC4gSnVzdCBjb3BpZXMgYSBibG9jayBmcm9tIHBTcmMgdG8gcERzdAorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOiBOb25lCisgICAgOy8vIE91dHB1dHM6IE5vbmUKKworICAgIE1BQ1JPIAorICAgIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAorQ2FzZUludGVnZXJQaXhlbF9SbmQwCitDYXNlSW50ZWdlclBpeGVsX1JuZDEKKworICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93MSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NywgW3BTcmNdLCBzcmNTdGVwCisKKyAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAorCisgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJIYWxmUGl4ZWxYIiBwcmVkaWN0VHlwZS4gVGhlIHR3byAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHBhcmFtZXRlciAiJHJuZFZhbCIuIEF2ZXJhZ2VzIGJldHdlZW4KKyAgICA7Ly8gYSBwaXhlbCBhbmQgcGl4ZWwgcmlnaHQgdG8gaXQsIHJvdW5kaW5nIGl0IGJhc2VkIG9uICRybmRWYWwuIFRoZSAKKyAgICA7Ly8gcm91bmRpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgb3BDb2RlIHN3aXRjaGluZyBiZXR3ZWVuICJWUkhBREQiIGFuZCAKKyAgICA7Ly8gIlZIQUREIiBpbnN0cnVjdGlvbnMuCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAkcm5kVmFsCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6IAorICAgIDsvLyAgICAgJHJuZFZhbDogMCBmb3Igcm91bmRpbmcgYW5kIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vIE91dHB1dHM6IE5vbmUKKworICAgIE1BQ1JPIAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbAorCisgICAgTENMUyBNX1ZIQUREUgorICAgIElGICRybmRWYWwgPSAwCitNX1ZIQUREUiBTRVRTICJWUkhBREQiCisgICAgRUxTRQorTV9WSEFERFIgU0VUUyAiVkhBREQiCisgICAgRU5ESUYKKworQ2FzZUhhbGZQaXhlbFhfUm5kJHJuZFZhbAorCisgICAgVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3cxLCBkUm93MVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MVNoZnQsIGRSb3cxLCBkUm93MVNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3cyLCBkUm93MlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MlNoZnQsIGRSb3cyLCBkUm93MlNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3czLCBkUm93M1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93M1NoZnQsIGRSb3czLCBkUm93M1NoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c0LCBkUm93NFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93NFNoZnQsIGRSb3c0LCBkUm93NFNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c1LCBkUm93NVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93NVNoZnQsIGRSb3c1LCBkUm93NVNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c2LCBkUm93NlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93NlNoZnQsIGRSb3c2LCBkUm93NlNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c3LCBkUm93N1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93N1NoZnQsIGRSb3c3LCBkUm93N1NoZnQsICMxCisgICAgJE1fVkhBRERSICAgZFJvdzAsIGRSb3cwLCBkUm93MFNoZnQKKyAgICAkTV9WSEFERFIgICBkUm93MSwgZFJvdzEsIGRSb3cxU2hmdAorICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93MiwgZFJvdzIsIGRSb3cyU2hmdAorICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93MywgZFJvdzMsIGRSb3czU2hmdAorICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NCwgZFJvdzQsIGRSb3c0U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NSwgZFJvdzUsIGRSb3c1U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3c0LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NiwgZFJvdzYsIGRSb3c2U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NywgZFJvdzcsIGRSb3c3U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgCisgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJIYWxmUGl4ZWxZIiBwcmVkaWN0VHlwZS4gVGhlIHR3byAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHBhcmFtZXRlciAiJHJuZFZhbCIuIEF2ZXJhZ2VzIGJldHdlZW4KKyAgICA7Ly8gYSBwaXhlbCBhbmQgcGl4ZWwgYmVsb3cgaXQsIHJvdW5kaW5nIGl0IGJhc2VkIG9uICRybmRWYWwuIFRoZSAKKyAgICA7Ly8gcm91bmRpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgb3BDb2RlIHN3aXRjaGluZyBiZXR3ZWVuICJWUkhBREQiIGFuZCAKKyAgICA7Ly8gIlZIQUREIiBpbnN0cnVjdGlvbnMuCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAkcm5kVmFsCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6IAorICAgIDsvLyAgICAgJHJuZFZhbDogMCBmb3Igcm91bmRpbmcgYW5kIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vIE91dHB1dHM6IE5vbmUKKworICAgIE1BQ1JPIAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbAorCisgICAgTENMUyBNX1ZIQUREUgorICAgIElGICRybmRWYWwgPSAwCitNX1ZIQUREUiBTRVRTICJWUkhBREQiCisgICAgRUxTRQorTV9WSEFERFIgU0VUUyAiVkhBREQiCisgICAgRU5ESUYKKworQ2FzZUhhbGZQaXhlbFlfUm5kJHJuZFZhbAorICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93MSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NywgW3BTcmNdLCBzcmNTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzAsIGRSb3cwLCBkUm93MQorICAgIFZMRDEgICAgICAgIGRSb3c4LCBbcFNyY10sIHNyY1N0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93MSwgZFJvdzEsIGRSb3cyCisgICAgVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3cyLCBkUm93MiwgZFJvdzMKKyAgICBWU1QxICAgICAgICBkUm93MSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzMsIGRSb3czLCBkUm93NAorICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NCwgZFJvdzQsIGRSb3c1CisgICAgVlNUMSAgICAgICAgZFJvdzMsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3c1LCBkUm93NSwgZFJvdzYKKyAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzYsIGRSb3c2LCBkUm93NworICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NywgZFJvdzcsIGRSb3c4CisgICAgVlNUMSAgICAgICAgZFJvdzYsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c3LCBbcERzdEA2NF0sIGRzdFN0ZXAKKworICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSW50ZWdlclBpeGVsIiBwcmVkaWN0VHlwZS4gQm90aCAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQuIAorICAgIDsvLyBUeXBpY2FsIGNvbXB1dGF0aW9uIGZvciBhIHJvdyBnb2VzIGxpa2UgdGhpcworICAgIDsvLyAgICAgMS4gVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAgOy8vIExvYWQgdGhlIHJvdyBhbmQgbmV4dCA4IGJ5dGVzCisgICAgOy8vICAgICAyLiBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxICAgICA7Ly8gR2VuZXJhdGUgdGhlIHNoaWZ0ZWQgcm93CisgICAgOy8vICAgICAzLiBWQURETCAgICAgICBxU3VtMCwgZFJvdzAsIGRSb3cwU2hmdCAgICAgICAgICAgICA7Ly8gR2VuZXJhdGUgdGhlIHN1bSBvZiByb3cgYW5kIHNoaWZ0ZWQgcm93CisgICAgOy8vICAgICA1LiBWQUREICAgICAgICBxU3VtMCwgcVN1bTAsIHFTdW0xICAgICAgICAgICAgICAgICA7Ly8gQWRkIHRvIHRoZSBzdW0gb2YgbmV4dCByb3cgKG9kZCByb3cgc3VtIGhhcyByb3VuZGluZyB2YWx1ZSBhZGRlZCB0byBpdCkKKyAgICA7Ly8gICAgIDYuIFZTSFJOICAgICAgIGRSb3cwLCBxU3VtMCwgIzIgICAgICAgICAgICAgICAgICAgIDsvLyBEaXZpZGUgYnkgNAorICAgIDsvLyAgICAgNy4gVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcCAgICAgICAgICAgOy8vIFN0b3JlCisgICAgOy8vIE9kZCByb3dzIHVuZGVyZ28gZm9sbG93aW5nIGNvbXB1dGF0aW9uIGFmdGVyIHN0ZXAgMworICAgIDsvLyAgICAgNC4gVkFERCAgICAgICAgcVN1bTEsIHFTdW0xLCBxUm91bmQKKyAgICA7Ly8gVGhpcyBzYXZlcyBmb3IgYWRkaW5nIHJvdW5kaW5nIHZhbHVlIHRvIGVhY2ggZmluYWwgc3VtIChvdmVyYWxsIHNhdmVzIDQgCisgICAgOy8vIGluc3RydWN0aW9ucykuCisgICAgOy8vIFRoZXJlIGlzIHJldXNlIG9mIHJlZ2lzdGVycyBmb3IgcVN1bTYsIHFTdW03ICYgcVN1bTguIE92ZXJhbGwgc2NoZWR1bGluZyB0YWtlcyAKKyAgICA7Ly8gY2FyZSBvZiB0aGlzIGFuZCBhbHNvIG1pbmltaXplcyBzdGFsbHMuIFJvdW5kaW5nIHZhbHVlIHdhcyBtb2RpZmllZCBpbiAKKyAgICA7Ly8gQVJNIHJlZ2lzdGVyIHJuZFZhbCAob3JpZ2luYWxseSB1c2VkIGZvciByb3VuZGluZyBmbGFnKSBiZWZvcmUgdGhlIHN3aXRjaC4KKyAgICA7Ly8gSXQgaXMgdGhlbiBwb3B1bGF0ZWQgaW50byBhbGwgbGFuZXMgaW4gdGhpcyBtYWNyby4gTm8gYnJhbmNoaW5nIG91dCB0byAKKyAgICA7Ly8gbGFiZWwgIlN3aXRjaFByZWRpY3RUeXBlRW5kIiBpcyByZXF1aXJlZCBpbiB0aGUgZW5kIG9mIHRoZSBtYWNybyBhcyB0aGVzZSAKKyAgICA7Ly8gYXJlIHRoZSBsYXN0IG9mIHN3aXRjaCBjYXNlcy4KKyAgICA7Ly8gCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czogTm9uZQorICAgIDsvLyBPdXRwdXRzOiBOb25lCisKKyAgICBNQUNSTyAKKyAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWQorCitDYXNlSGFsZlBpeGVsWFlfUm5kMAorQ2FzZUhhbGZQaXhlbFhZX1JuZDEKKyAgICBWTEQxICAgICAgICB7ZFJvdzAsIGRSb3cwU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZEVVAgICAgICAgIHFSb3VuZCwgcm5kVmFsCisgICAgVkxEMSAgICAgICAge2RSb3cxLCBkUm93MVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3cyLCBkUm93MlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MVNoZnQsIGRSb3cxLCBkUm93MVNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3czLCBkUm93M1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MlNoZnQsIGRSb3cyLCBkUm93MlNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c0LCBkUm93NFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWQURETCAgICAgICBxU3VtMCwgZFJvdzAsIGRSb3cwU2hmdAorICAgIFZMRDEgICAgICAgIHtkUm93NSwgZFJvdzVTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkFEREwgICAgICAgcVN1bTEsIGRSb3cxLCBkUm93MVNoZnQKKyAgICBWTEQxICAgICAgICB7ZFJvdzYsIGRSb3c2U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZFWFQgICAgICAgIGRSb3czU2hmdCwgZFJvdzMsIGRSb3czU2hmdCwgIzEKKyAgICBWTEQxICAgICAgICB7ZFJvdzcsIGRSb3c3U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZFWFQgICAgICAgIGRSb3c0U2hmdCwgZFJvdzQsIGRSb3c0U2hmdCwgIzEKKyAgICBWTEQxICAgICAgICB7ZFJvdzgsIGRSb3c4U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVJvdW5kCisgICAgVkFEREwgICAgICAgcVN1bTIsIGRSb3cyLCBkUm93MlNoZnQKKyAgICBWRVhUICAgICAgICBkUm93NVNoZnQsIGRSb3c1LCBkUm93NVNoZnQsICMxCisgICAgVkFERCAgICAgICAgcVN1bTAsIHFTdW0wLCBxU3VtMQorICAgIFZBRERMICAgICAgIHFTdW0zLCBkUm93MywgZFJvdzNTaGZ0CisgICAgVkVYVCAgICAgICAgZFJvdzZTaGZ0LCBkUm93NiwgZFJvdzZTaGZ0LCAjMQorICAgIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVN1bTIKKyAgICBWU0hSTiAgICAgICBkUm93MCwgcVN1bTAsICMyCisgICAgVkFEREwgICAgICAgcVN1bTQsIGRSb3c0LCBkUm93NFNoZnQKKyAgICBWU0hSTiAgICAgICBkUm93MSwgcVN1bTEsICMyCisgICAgVkFERCAgICAgICAgcVN1bTMsIHFTdW0zLCBxUm91bmQKKyAgICBWQURETCAgICAgICBxU3VtNSwgZFJvdzUsIGRSb3c1U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWRVhUICAgICAgICBkUm93N1NoZnQsIGRSb3c3LCBkUm93N1NoZnQsICMxCisgICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZFWFQgICAgICAgIGRSb3c4U2hmdCwgZFJvdzgsIGRSb3c4U2hmdCwgIzEKKyAgICBWQUREICAgICAgICBxU3VtNSwgcVN1bTUsIHFSb3VuZAorICAgIFZBREQgICAgICAgIHFTdW0yLCBxU3VtMiwgcVN1bTMKKyAgICBWQUREICAgICAgICBxU3VtMywgcVN1bTMsIHFTdW00CisgICAgVkFERCAgICAgICAgcVN1bTQsIHFTdW00LCBxU3VtNQorICAgIFZTSFJOICAgICAgIGRSb3cyLCBxU3VtMiwgIzIKKyAgICBWU0hSTiAgICAgICBkUm93MywgcVN1bTMsICMyCisgICAgVlNIUk4gICAgICAgZFJvdzQsIHFTdW00LCAjMgorICAgIFZBRERMICAgICAgIHFTdW02LCBkUm93NiwgZFJvdzZTaGZ0CisgICAgVkFEREwgICAgICAgcVN1bTcsIGRSb3c3LCBkUm93N1NoZnQKKyAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkFEREwgICAgICAgcVN1bTgsIGRSb3c4LCBkUm93OFNoZnQKKyAgICBWQUREICAgICAgICBxU3VtNywgcVN1bTcsIHFSb3VuZAorICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkFERCAgICAgICAgcVN1bTUsIHFTdW01LCBxU3VtNgorICAgIFZBREQgICAgICAgIHFTdW02LCBxU3VtNiwgcVN1bTcKKyAgICBWQUREICAgICAgICBxU3VtNywgcVN1bTcsIHFTdW04CisgICAgVlNIUk4gICAgICAgZFJvdzUsIHFTdW01LCAjMgorICAgIFZTSFJOICAgICAgIGRSb3c2LCBxU3VtNiwgIzIKKyAgICBWU0hSTiAgICAgICBkUm93NywgcVN1bTcsICMyCisgICAgVlNUMSAgICAgICAgZFJvdzUsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCisKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzsvLyBJbnB1dC9PdXRwdXQgUmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgICAgICAgIFJOIDEKK3BTcmNSZXNpZHVlICAgICAgICAgICBSTiAyCitwRHN0ICAgICAgICAgICAgICAgICAgUk4gMworZHN0U3RlcCAgICAgICAgICAgICAgIFJOIDQKK3ByZWRpY3RUeXBlICAgICAgICAgICBSTiA1CitybmRWYWwgICAgICAgICAgICAgICAgUk4gNgorCis7Ly8gTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3BEc3RDb3B5ICAgICAgICAgICAgICBSTiAwCityZXR1cm4gICAgICAgICAgICAgICAgUk4gMAorCis7Ly8gTmVvbiBSZWdpc3RlcnMKK2RSb3cwICAgICAgICAgICAgICAgICBETiBEMC5VOAorZFJvdzBTaGZ0ICAgICAgICAgICAgIEROIEQxLlU4CitkUm93MSAgICAgICAgICAgICAgICAgRE4gRDIuVTgKK2RSb3cxU2hmdCAgICAgICAgICAgICBETiBEMy5VOAorZFJvdzIgICAgICAgICAgICAgICAgIEROIEQ0LlU4CitkUm93MlNoZnQgICAgICAgICAgICAgRE4gRDUuVTgKK2RSb3czICAgICAgICAgICAgICAgICBETiBENi5VOAorZFJvdzNTaGZ0ICAgICAgICAgICAgIEROIEQ3LlU4CitkUm93NCAgICAgICAgICAgICAgICAgRE4gRDguVTgKK2RSb3c0U2hmdCAgICAgICAgICAgICBETiBEOS5VOAorZFJvdzUgICAgICAgICAgICAgICAgIEROIEQxMC5VOAorZFJvdzVTaGZ0ICAgICAgICAgICAgIEROIEQxMS5VOAorZFJvdzYgICAgICAgICAgICAgICAgIEROIEQxMi5VOAorZFJvdzZTaGZ0ICAgICAgICAgICAgIEROIEQxMy5VOAorZFJvdzcgICAgICAgICAgICAgICAgIEROIEQxNC5VOAorZFJvdzdTaGZ0ICAgICAgICAgICAgIEROIEQxNS5VOAorZFJvdzggICAgICAgICAgICAgICAgIEROIEQxNi5VOAorZFJvdzhTaGZ0ICAgICAgICAgICAgIEROIEQxNy5VOAorCisKK3FTdW0wICAgICAgICAgICAgICAgICBRTiBROS5VMTYKK3FTdW0xICAgICAgICAgICAgICAgICBRTiBRMTAuVTE2CitxU3VtMiAgICAgICAgICAgICAgICAgUU4gUTExLlUxNgorcVN1bTMgICAgICAgICAgICAgICAgIFFOIFExMi5VMTYKK3FTdW00ICAgICAgICAgICAgICAgICBRTiBRMTMuVTE2CitxU3VtNSAgICAgICAgICAgICAgICAgUU4gUTE0LlUxNgorcVN1bTYgICAgICAgICAgICAgICAgIFFOIFEwLlUxNgorcVN1bTcgICAgICAgICAgICAgICAgIFFOIFExLlUxNgorcVN1bTggICAgICAgICAgICAgICAgIFFOIFEyLlUxNgorCitxUm91bmQgICAgICAgICAgICAgICAgUU4gUTE1LlUxNgorCitkRHN0MCAgICAgICAgICAgICAgICAgRE4gRDAuVTgKK2REc3QxICAgICAgICAgICAgICAgICBETiBEMS5VOAorZERzdDIgICAgICAgICAgICAgICAgIEROIEQyLlU4CitkRHN0MyAgICAgICAgICAgICAgICAgRE4gRDMuVTgKK2REc3Q0ICAgICAgICAgICAgICAgICBETiBENC5VOAorZERzdDUgICAgICAgICAgICAgICAgIEROIEQ1LlU4CitkRHN0NiAgICAgICAgICAgICAgICAgRE4gRDYuVTgKK2REc3Q3ICAgICAgICAgICAgICAgICBETiBENy5VOAorCitxUmVzMCAgICAgICAgICAgICAgICAgUU4gUTQuUzE2CitxUmVzMSAgICAgICAgICAgICAgICAgUU4gUTUuUzE2CitxUmVzMiAgICAgICAgICAgICAgICAgUU4gUTYuUzE2CitxUmVzMyAgICAgICAgICAgICAgICAgUU4gUTcuUzE2CitxUmVzNCAgICAgICAgICAgICAgICAgUU4gUTguUzE2CitxUmVzNSAgICAgICAgICAgICAgICAgUU4gUTkuUzE2CitxUmVzNiAgICAgICAgICAgICAgICAgUU4gUTEwLlMxNgorcVJlczcgICAgICAgICAgICAgICAgIFFOIFExMS5TMTYKKworICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICBNX1NUQVJUICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrLCByNiwgZDE1CisgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICBNX0FSRyAgICAgICBBcmdfZHN0U3RlcCwgICAgICAgIDQKKyAgICBNX0FSRyAgICAgICBBcmdfcHJlZGljdFR5cGUsICAgIDQKKyAgICBNX0FSRyAgICAgICBBcmdfcm5kVmFsLCAgICAgICAgIDQKKyAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgIE1fTERSICAgICAgIGRzdFN0ZXAsIEFyZ19kc3RTdGVwCisgICAgTV9MRFIgICAgICAgcHJlZGljdFR5cGUsIEFyZ19wcmVkaWN0VHlwZQorICAgIE1fTERSICAgICAgIHJuZFZhbCwgQXJnX3JuZFZhbAorICAgIEFERCAgICAgICAgIHByZWRpY3RUeXBlLCBybmRWYWwsIHByZWRpY3RUeXBlLCBMU0wgIzEKKyAgICBSU0IgICAgICAgICBybmRWYWwsIHJuZFZhbCwgIzIgICAgICAgICAgICAgIDsvLyBwcmVwYXJpbmcgcm5kVmFsIGZvciBIYWxmUGl4ZWxYWQorICAgIAorICAgIDsvLyBUaGUgZm9sbG93aW5nIGlzIGltcGxlbWVudGF0aW9uIG9mIHN3aXRjaGluZyB0byBkaWZmZXJlbnQgY29kZSBzZWdtZW50cworICAgIDsvLyBiYXNlZCBvbiBkaWZmZXJlbnQgcHJlZGljdFR5cGUgYW5kIHJuZFZhbCBmbGFncy4gVGhlIGNvcnJlc3BvbmRpbmcgCisgICAgOy8vIGxhYmVscyAoZS5nLiBDYXNlSW50ZWdlclBpeGVsX1JuZDApIGFyZSBlbWJlZGRlZCBpbiB0aGUgbWFjcm9zIGZvbGxvd2luZworICAgIDsvLyBNX0VORFNXSVRDSCAoZS5nLiBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwpLiBXaGlsZSAiTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsIiAKKyAgICA7Ly8gYW5kICJNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSIgaGFuZGxlIGZvciBib3RoIHJvdW5kaW5nIGNhc2VzOyAKKyAgICA7Ly8gIk1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFgiIGFuZCAiTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSIgbWFjcm9zIGhhbmRsZSAKKyAgICA7Ly8gdGhlIHR3byByb3VuZGluZyBjYXNlcyBpbiBzZXBhcmF0ZSBjb2RlIGJhc2VzLgorICAgIDsvLyBBbGwgdGhlc2UgdG9nZXRoZXIgaW1wbGVtZW50IHRoZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uYWxpdHkKKyAgICAKKyAgICBNX1NXSVRDSCAgICBwcmVkaWN0VHlwZQorICAgICAgICBNX0NBU0UgICAgICBDYXNlSW50ZWdlclBpeGVsX1JuZDAKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUludGVnZXJQaXhlbF9SbmQxCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYX1JuZDAKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhfUm5kMQorICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWV9SbmQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxZX1JuZDEKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhZX1JuZDAKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhZX1JuZDEKKyAgICBNX0VORFNXSVRDSAorCisgICAgTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAwCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAxCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAwCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAxCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKK1N3aXRjaFByZWRpY3RUeXBlRW5kCisKKyAgICA7Ly8gQWZ0ZXIgaW50ZXJwb2xhdGlvbiBpcyBkb25lLCByZXNpZHVlIG5lZWRzIHRvIGJlIGFkZGVkLiBUaGlzIGlzIGRvbmUgCisgICAgOy8vIG9ubHkgaW4gY2FzZSAicFNyY1Jlc2lkdWUiIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24gaXMgbm90IE5VTEwuCisgICAgOy8vIEZvbGxvd2luZyBpcyBhIGNvbXBsZXRlbHkgdW5yb2xsZWQgY29kZSB0byBkbyBzby4gRWFjaCByb3cgYW5kIAorICAgIDsvLyBjb3JyZXNwb25kaW5nIHJlc2lkdWUgaXMgbG9hZGVkIGFuZCByZXNpZHVlIGlzIGFkZGVkIGFuZCB2YWx1ZSAKKyAgICA7Ly8gc3RvcmVkCisgICAgCisgICAgQ01QICAgICAgICAgcFNyY1Jlc2lkdWUsICMwCisgICAgU1VCTkUgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMzICAgICA7Ly8gUmVzdG9yaW5nIHBEc3QKKyAgICBNT1ZORSAgICAgICBwRHN0Q29weSwgcERzdAorICAgIEJFUSAgICAgICAgIHBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCitwU3JjUmVzaWR1ZU5vdE51bGwgICAgCisgICAgVkxEMSAgICAgICAgZERzdDAsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZMRDEgICAgICAgIHFSZXMwLCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWTEQxICAgICAgICBkRHN0MSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkxEMSAgICAgICAgcVJlczEsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZMRDEgICAgICAgIGREc3QyLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWTEQxICAgICAgICBxUmVzMiwgW3BTcmNSZXNpZHVlQDEyOF0hCisgICAgVkFERFcgICAgICAgcVJlczAsIHFSZXMwLCBkRHN0MAorICAgIFZMRDEgICAgICAgIGREc3QzLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWQUREVyAgICAgICBxUmVzMSwgcVJlczEsIGREc3QxCisgICAgVkxEMSAgICAgICAgcVJlczMsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXMyLCBxUmVzMiwgZERzdDIKKyAgICBWTEQxICAgICAgICBkRHN0NCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDAsIHFSZXMwCisgICAgVkxEMSAgICAgICAgcVJlczQsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXMzLCBxUmVzMywgZERzdDMKKyAgICBWTEQxICAgICAgICBkRHN0NSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDEsIHFSZXMxCisgICAgVkxEMSAgICAgICAgcVJlczUsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXM0LCBxUmVzNCwgZERzdDQKKyAgICBWTEQxICAgICAgICBkRHN0NiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDIsIHFSZXMyCisgICAgVkxEMSAgICAgICAgcVJlczYsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXM1LCBxUmVzNSwgZERzdDUKKyAgICBWTEQxICAgICAgICBkRHN0NywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDMsIHFSZXMzCisgICAgVkxEMSAgICAgICAgcVJlczcsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXM2LCBxUmVzNiwgZERzdDYKKyAgICBWU1QxICAgICAgICBkRHN0MCwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3Q0LCBxUmVzNAorICAgIFZTVDEgICAgICAgIGREc3QxLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVkFERFcgICAgICAgcVJlczcsIHFSZXM3LCBkRHN0NworICAgIFZTVDEgICAgICAgIGREc3QyLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDUsIHFSZXM1CisgICAgVlNUMSAgICAgICAgZERzdDMsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICBWUU1PVlVOICAgICBkRHN0NiwgcVJlczYKKyAgICBWU1QxICAgICAgICBkRHN0NCwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3Q3LCBxUmVzNworICAgIFZTVDEgICAgICAgIGREc3Q1LCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZERzdDYsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkRHN0NywgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIAorcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKKyAgICBNT1YgICAgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisKKyAgICBNX0VORAorICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgIEVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgZW5kcworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3M2Y2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKQEAgLTAsMCArMSwzMjAgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKiAKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBDb250YWlucyBtb2R1bGUgZm9yIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24KKzsgKgorOyAqIAorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKKzsgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorOyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCAKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gVGhlIAorOyAqICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIAorOyAqICAgICAgICAgICAgICAgICAgICBbLTIwNDgsIDIwNDddLgorOyAqIFtpbl0gIHBQcmVkQnVmUm93ICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuCis7ICogW2luXSAgcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgCis7ICogICAgICAgICAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuCis7ICogW2luXSAgY3VyUVAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSAKKzsgKiAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCis7ICogW2luXSAgcHJlZFFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworOyAqIFtpbl0gIHByZWREaXIgICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorOyAqICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKzsgKiBbaW5dICBBQ1ByZWRGbGFnICAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKKzsgKiAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAorOyAqICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorOyAqIFtpbl0gIHZpZGVvQ29tcCAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorOyAqICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKzsgKiBbb3V0XSBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2sKKzsgKiBbb3V0XSBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCis7ICogW291dF0gcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCis7ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4KKzsgKiAtIEF0IGxlYXN0IG9uZSB0aGUgZm9sbG93aW5nIGNhc2VzOiBjdXJRUCA8PSAwLCBwcmVkUVAgPD0gMCwgY3VyUVAgPjMxLCAKKzsgKiAgIHByZWRRUCA+IDMxLCBwcmVEaXIgZXhjZWVkcyBbMSwyXS4KKzsgKiAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCAKKzsgKiAgIDQtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICoqKioqKioqKgorICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgCisgICAgICAgICAgICAgCisKKyAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMgorICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2CisgICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKKyAgICAgICAKKyAgICAgICAgSUYgQ29ydGV4QTgKKzsvLyBJbnB1dCBBcmd1bWVudHMKKworcFNyY0RzdCAgICAgICAgICBSTiAwCitwUHJlZEJ1ZlJvdyAgICAgIFJOIDEKK3BQcmVkQnVmQ29sICAgICAgUk4gMgorY3VyUVAgICAgICAgICAgICBSTiAzCitRUCAgICAgICAgICAgICAgIFJOIDMKK3ByZWRRUCAgICAgICAgICAgUk4gNAorcHJlZERpciAgICAgICAgICBSTiA1CitBQ1ByZWRGbGFnICAgICAgIFJOIDYKK3ZpZGVvQ29tcCAgICAgICAgUk4gNworCis7Ly8gTG9jYWwgVmFyaWFibGVzCisKK3Nob3J0VmlkZW9IZWFkZXIgUk4gNAorZGNTY2FsZXIgICAgICAgICBSTiA0CitpbmRleCAgICAgICAgICAgIFJOIDYKK3ByZWRDb2VmZlRhYmxlICAgUk4gNwordGVtcDEgICAgICAgICAgICBSTiA2Cit0ZW1wMiAgICAgICAgICAgIFJOIDkKK3RlbXAgICAgICAgICAgICAgUk4gMTQKK0NvbnN0ICAgICAgICAgICAgUk4gOAordGVtcHBQcmVkQ29sQnVmICBSTiA4Cit0ZW1wUHJlZCAgICAgICAgIFJOIDkKKworYWJzQ29lZmZEQyAgICAgICBSTiA4CituZWdkY1NjYWxlciAgICAgIFJOIDEwCitSZW0gICAgICAgICAgICAgIFJOIDExCit0ZW1wMyAgICAgICAgICAgIFJOIDEyCisKK2RjUm93YnVmQ29lZmYgICAgUk4gMTAKK2RjQ29sQnVmZkNvZWZmICAgUk4gMTEKK1JldHVybiAgICAgICAgICAgUk4gMAorCis7Ly9ORU9OIFJlZ2lzdGVycworCitxUHJlZFJvd0J1ZiAgICAgICBRTiBRMC5TMTYKK2RQcmVkUm93QnVmMCAgICAgIEROIEQwLlMxNgorZFByZWRSb3dCdWYxICAgICAgRE4gRDEuUzE2CisKKworCisKK3FDb2VmZlRhYiAgICAgICAgIFFOIFExLlMzMgorCitxUHJlZFFQICAgICAgICAgICBRTiBRMi5TMTYKK2RQcmVkUVAwICAgICAgICAgIEROIEQ0LlMxNgorZFByZWRRUDEgICAgICAgICAgRE4gRDUuUzE2CisKKworcXRlbXAxICAgICAgICAgICAgUU4gUTMuUzMyCitxdGVtcCAgICAgICAgICAgICBRTiBRMy5TMTYKKworZHRlbXAwICAgICAgICAgICAgRE4gRDYuUzE2CitkdGVtcDEgICAgICAgICAgICBETiBENy5TMTYKKworZHRlbXAyICAgICAgICAgICAgRE4gRDguUzE2CitkdGVtcDMgICAgICAgICAgICBETiBEOS5TMTYKKworZHRlbXA0ICAgICAgICAgICAgRE4gRDIuUzE2CitkdGVtcDUgICAgICAgICAgICBETiBEMy5TMTYKK2R0ZW1wNiAgICAgICAgICAgIEROIEQ0LlMxNgorZHRlbXA3ICAgICAgICAgICAgRE4gRDUuUzE2CisgCitxdGVtcFByZWQxICAgICAgICBRTiBRNS5TMzIKK3F0ZW1wUHJlZCAgICAgICAgIFFOIFE1LlMxNgorCitkdGVtcFByZWQwICAgICAgICBETiBEMTAuUzE2CitkdGVtcFByZWQxICAgICAgICBETiBEMTEuUzE2CisgCisgIAorCisgICAgICBNX1NUQVJUICAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSxyMTEsZDExCisKKyAgICAgIDsvLyBBc3NpZ25pbmcgcG9pbnRlcnMgdG8gSW5wdXQgYXJndW1lbnRzIG9uIFN0YWNrCisgICAgCisgICAgICBNX0FSRyAgICAgICAgICAgcHJlZFFQb25TdGFjayw0ICAKKyAgICAgIE1fQVJHICAgICAgICAgICBwcmVkRGlyb25TdGFjayw0CisgICAgICBNX0FSRyAgICAgICAgICAgQUNQcmVkRmxhZ29uU3RhY2ssNAorICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uU3RhY2ssNAorICAgICAgCisgICAgICA7Ly8gREMgUHJlZGljdGlvbgorCisgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uU3RhY2sgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2aWRlb0NvbXAgRnJvbSBTdGFjayAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICBNX0xEUiAgICAgICAgICAgcHJlZERpcixwcmVkRGlyb25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBQcmVkaWN0aW9uIGRpcmVjdGlvbgorICAgICAgOy8vIERDIFNjYWxlciBjYWxjdWxhdGlvbiAgIAorICAgICAgTERSICAgICAgICAgICAgIGluZGV4LCA9YXJtVkNNNFAyX0RDU2NhbGVyCisgICAgICBBREQgICAgICAgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQorICAgICAgTERSQiAgICAgICAgICAgIGRjU2NhbGVyLFtpbmRleCxRUF0KKworICAgICAgIAorICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2ICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAzMjc2Ny8oMSB0byA2MykgCisgICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uIGlzIHZlcnRpY2FsCisKKyAgICAgIDsvLyBDYXVsdWNhdGUgdGVtcFByZWQKKyAgICAgICAgICAgIAorICAgICAgTERSRVFTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHZldGljYWwgbG9hZCB0aGUgY29lZmYgZnJvbSBSb3cgUHJlZGljdGlvbiBCdWZmZXIKKyAgICAgIExEUk5FU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBob3Jpem9udGFsIGxvYWQgdGhlIGNvZWZmIGZyb20gY29sdW1uIFByZWRpY3Rpb24gQnVmZmVyCisgICAgICAKKyAgICAgIFJTQiAgICAgICAgICAgICBuZWdkY1NjYWxlcixkY1NjYWxlciwjMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZWdkY1NjYWxlcj0tZGNTY2FsZXIgICAKKyAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBQcmVkaWN0aW9uIGNvZWZmIHRvIHRlbXAgZm9yIGNvbXBhcmlzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZEQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2FsY3VsYXRlIGFic29sdXRlIHZhbCBvZiBwcmVkaWN0aW9uIGNvZWZmCisgICAgICAKKyAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLGRjU2NhbGVyLGRjU2NhbGVyCisgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcHJlZENvZWZmVGFibGUsdGVtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2YWx1ZSBmcm9tIGNvZWZmIHRhYmxlIGZvciBwZXJmb3JtaW5nIGRpdmlzaW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICBTTVVMQkIgICAgICAgICAgdGVtcFByZWQsdGVtcCxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcHBlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdKjMyNzY3L2RjU2NhbGVyCisgICAgICBBREQgICAgICAgICAgICAgdGVtcDMsZGNTY2FsZXIsIzEKKyAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTUgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wcGVkPXBQcmVkQnVmUm93KENvbClbMF0vZGNTY2FsZXIgICAgICAgICAgICAgICAgICAKKyAgICAgIExTUiAgICAgICAgICAgICB0ZW1wMyx0ZW1wMywjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMz1yb3VuZChkY1NjYWxlci8yKSAgICAgICAgICAgCisgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ2RjU2NhbGVyLHRlbXBQcmVkLGFic0NvZWZmREMgICAgICAgICAgICA7Ly8gUmVtYWluZGVyIFJlbT1hYnMocFByZWRCdWZSb3coQ29sKVswXSktdGVtcFByZWQqZGNTY2FsZXIKKyAgICAgIAorICAgICAgTERSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmQ29sXSAgICAgICAgICAgIAorICAgICAgCisgICAgICBDTVAgICAgICAgICAgICAgUmVtLHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBSZW0gd2l0aCAoZGNTY2FsZXIvMikKKyAgICAgIEFEREdFICAgICAgICAgICB0ZW1wUHJlZCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD10ZW1wUHJlZCsxIGlmIFJlbT49KGRjU2NhbGVyLzIpCisgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKKyAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD0tdGVtcFByZWQgaWYgCisgICAgICAgCisgICAgICBTVFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZSb3csIy0xNl0gICAgICAKKyAgICAgICAKKworICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXQorICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXSt0ZW1wUHJlZAorICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KKyAgICAgIFNNVUxCQiAgICAgICAgICBkY0NvbEJ1ZmZDb2VmZix0ZW1wLGRjU2NhbGVyICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1jbGlwcGVkKHBTcmNEc3RbMF0pKmRjU2NhbGVyICAgICAgICAgICAKKyAgICAgIE1fTERSICAgICAgICAgICBBQ1ByZWRGbGFnLEFDUHJlZEZsYWdvblN0YWNrCisgICAgICBTVFJIICAgICAgICAgICAgZGNDb2xCdWZmQ29lZmYsW3BQcmVkQnVmQ29sXSAgICAgIAorICAgICAgCisKKyAgICAgICA7Ly8gQUMgUHJlZGljdGlvbgorICAgICAgCisgICAgICBNX0xEUiAgICAgICAgICAgcHJlZFFQLHByZWRRUG9uU3RhY2sKKyAgICAgIAorICAgICAgQ01QICAgICAgICAgICAgIEFDUHJlZEZsYWcsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBBQyBwcmVkaWN0aW9uIGZsYWcgaXMgc2V0IG9yIG5vdAorICAgICAgQk5FICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIG5vdCBzZXQgRXhpdAorICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBMRFIgICAgICAgICAgICAgcHJlZENvZWZmVGFibGUsID1hcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIgICA7Ly8gTG9hZGluZyB0aGUgdGFibGUgd2l0aCBlbnRyaWVzIDB4MWZmZmYvKDEgdG8gNjMpIAorICAgICAgTU9WICAgICAgICAgICAgIENvbnN0LCM0CisgICAgICBNVUwgICAgICAgICAgICAgY3VyUVAsY3VyUVAsQ29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9NCpjdXJRUAorICAgICAgVkRVUCAgICAgICAgICAgIGRQcmVkUVAwLHByZWRRUAorICAgICAgTERSICAgICAgICAgICAgIHRlbXAyLFtwcmVkQ29lZmZUYWJsZSxjdXJRUF0gICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9MHgxZmZmZi9jdXJRUAorICAgICAgVkRVUCAgICAgICAgICAgIHFDb2VmZlRhYix0ZW1wMgorICAgICAgQk5FICAgICAgICAgICAgIEhvcml6b250YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyBob3Jpem9udGFsIGJyYW5jaCB0byBIb3Jpem9udGFsCisgICAgICAKKyAgICAgCisgICAgICAKKyAgICAgIDsvLyBWZXJ0aWNhbAorICAgICAgOy8vQ2FsY3VsYXRpbmcgdGVtcFByZWQKKworICAgICAgVkxEMSAgICAgICAgICAgIHtkUHJlZFJvd0J1ZjAsZFByZWRSb3dCdWYxfSxbcFByZWRCdWZSb3ddICAgICAgOy8vIExvYWRpbmcgcFByZWRCdWZSb3dbaV06aT0wIHQwIDcKKyAgICAgIAorICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjAsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV06IGk9MCB0MCAzCisgICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9MCB0MCAzCisgICAgICAKKyAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYxLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldIDogaT00IHQwIDcgICAgICAKKworICAgICAgVlJTSFIgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMTcgICAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1yb3VuZChwUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldL2N1clFQKSA6IGk9MCB0MCAzCisgICAgICBWU0hSTiAgICAgICAgICAgZFByZWRRUDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cworICAgICAgCisgICAgICAKKyAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT00IHQwIDcKKyAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXS9jdXJRUCkgIDogaT00IHQwIDcKKyAgICAgIFZMRDEgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMX0sW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvL0xvYWRpbmcgcFNyY0RzdFtpXSA6IGk9MCB0byA3CisgICAgICBWU0hSTiAgICAgICAgICAgZHRlbXBQcmVkMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cworICAgICAgVk1PViAgICAgICAgICAgIGR0ZW1wUHJlZDAsZFByZWRRUDEKKyAgICAgIAorICAgICAgOy8vdXBkYXRpbmcgc291cmNlIGFuZCByb3cgcHJlZGljdGlvbiBidWZmZXIgY29udGVudHMgICAgICAKKyAgICAgIFZBREQgICAgICAgICAgICBxdGVtcCxxdGVtcCxxdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL3BTcmNEc3RbaV09cFNyY0RzdFtpXStxdGVtcFByZWRbaV06IGk9MCB0byA3IAorICAgICAgVlFTSEwgICAgICAgICAgIHF0ZW1wLHF0ZW1wLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ2xpcCB0byBbLTIwNDgsMjA0N10KKyAgICAgIExEUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgIDsvL0xvYWRpbmcgRGMgVmFsdWUgb2YgUm93IFByZWRpY3Rpb24gYnVmZmVyCisgICAgICBWU0hSICAgICAgICAgICAgcXRlbXAscXRlbXAsIzQKKyAgICAgIAorICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxfSxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vc3RvcmluZyBiYWNrIHRoZSB1cGRhdGVkIHZhbHVlcyAKKyAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMX0sW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgIDsvL3N0b3JpbmcgYmFjayB0aGUgdXBkYXRlZCByb3cgcHJlZGljdGlvbiB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBTVFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmluZyB0aGUgdXBkYXRlZCBEQyBSb3cgUHJlZGljdGlvbiBjb2VmZgorICAgICAgCisgICAgICBCICAgICAgICAgICAgICAgRXhpdAorCitIb3Jpem9udGFsCisKKyAgICAgIDsvLyBDYWxjdWxhdGluZyBUZW1wcHJlZAorCisgICAgICAgICAgICAKKworICAgICAgVkxEMSAgICAgICAgICAgIHtkUHJlZFJvd0J1ZjAsZFByZWRSb3dCdWYxfSxbcFByZWRCdWZDb2xdICAgICAgOy8vIExvYWRpbmcgcFByZWRCdWZDb2xbaV06aT0wIHQwIDcKKyAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYwLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldOiBpPTAgdDAgMworICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTAgdDAgMworICAgICAgCisgICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMSxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXSA6IGk9NCB0MCA3ICAgICAgCisKKyAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXS9jdXJRUCkgOiBpPTAgdDAgMworICAgICAgVlNIUk4gICAgICAgICAgIGRQcmVkUVAxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKKyAgICAgIAorICAgICAgCisgICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9NCB0MCA3CisgICAgICAKKyAgICAgIE1PViAgICAgICAgICAgICB0ZW1wcFByZWRDb2xCdWYscFByZWRCdWZDb2wKKyAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXS9jdXJRUCkgIDogaT00IHQwIDcKKyAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbcFNyY0RzdF0gICAgICAgIDsvLyBMb2FkaW5nIGNvZWZmaWNpZW50cyBJbnRlcmxlYXZpbmcgYnkgNAorICAgICAgVlNIUk4gICAgICAgICAgIGR0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKKyAgICAgIFZNT1YgICAgICAgICAgICBkdGVtcFByZWQwLGRQcmVkUVAxCisgICAgICAKKyAgICAgIDsvLyBVcGRhdGluZyBzb3VyY2UgYW5kIGNvbHVtbiBwcmVkaWN0aW9uIGJ1ZmZlciBjb250ZW50cyAgICAgCisgICAgICBBREQgICAgICAgICAgICAgdGVtcDIscFNyY0RzdCwjMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXSAgICAgICAgICA7Ly8gTG9hZGluZyBuZXh0IDE2IGNvZWZmaWNpZW50cyBJbnRlcmxlYXZpbmcgYnkgNAorICAgICAgVlVaUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEludGVybGVhdmluZyBieSA4CisgICAgICBWQUREICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCxkdGVtcFByZWQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQWRkaW5nIHRlbXBQcmVkIHRvIGNvZWZmcworICAgICAgVlFTSEwgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICBWU0hSICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNAorICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDB9LFtwUHJlZEJ1ZkNvbF0hICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0aW5nIFByaWRpY3Rpb24gY29sdW1uIGJ1ZmZlcgorICAgICAgVlpJUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRlaW50ZXJsZWF2aW5nCisgICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3BTcmNEc3RdICAgICAgICA7Ly8gVXBkYXRpbmcgc291cmNlIGNvZWZmcyAgICAgICAgIAorICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0hCisgICAgICAKKyAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSx0ZW1wMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbdGVtcDJdISAgICAgICAgIDsvLyBMb2FkaW5nICBjb2VmZmljaWVudHMgSW50ZXJsZWF2aW5nIGJ5IDQKKyAgICAgIAorICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0KKyAgICAgIFZVWlAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbnRlcmxlYXZpbmcgYnkgOAorICAgICAgVkFERCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsZHRlbXBQcmVkMQorICAgICAgVlFTSEwgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICBWU0hSICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNAorICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDB9LFtwUHJlZEJ1ZkNvbF0hCisgICAgICBWWklQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNAorICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFt0ZW1wMV0KKyAgICAgIFNUUkggICAgICAgICAgICBkY0NvbEJ1ZmZDb2VmZixbdGVtcHBQcmVkQ29sQnVmXSAKKyAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdCisgICAgICAKK0V4aXQKKworICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdCisgICAgICAgICAgCisgCisgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyIAorIAorICAgICAgTV9FTkQKKyAgICAgIEVORElGCisKKworICAgICAgIEVORAorCisKKyAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkMGFkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKQEAgLTAsMCArMSwxNjIgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KKzsgKiAKKzsgKgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBpbnZlcnNlIHF1YW50aXphdGlvbiBvbiBpbnRyYS9pbnRlciBjb2RlZCBibG9jay4KKzsgKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gTWlzbWF0Y2ggY29udHJvbAorOyAqIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IE1QRUctNCBtb2RlIGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2U6IFstMjA0OCwgMjA0N10uCis7ICogTWlzbWF0Y2ggY29udHJvbCBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dIHBTcmNEc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqIFtpbl0gUVAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKKzsgKiBbaW5dIHZpZGVvQ29tcCAgICAgIChJbnRyYSB2ZXJzaW9uIG9ubHkuKSBWaWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0FMUEhBLgorOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKKzsgKiAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCis7ICogW291dF0gICAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiAgTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCis7ICogICAgLSBJZiBwU3JjRHN0IGlzIE5VTEwgb3IgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4KKzsgKiAgICAgIG9yCis7ICogICAgLSBJZiBRUCA8PSAwLgorOyAqICAgICAgb3IKKzsgKiAgICAtIHZpZGVvQ29tcCBpcyBub25lIG9mIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSBhbmQgT01YX1ZDX0FMUEhBLgorOyAqCis7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICBJRiBDb3J0ZXhBOAorICAgICAKKyAgICAgCis7Ly9JbnB1dCBBcmd1bWVudHMKK3BTcmNEc3QgICAgICAgICAgICBSTiAwCitRUCAgICAgICAgICAgICAgICAgUk4gMQorICAgICAKKworOy8vTG9jYWwgVmFyaWFibGVzCitDb3VudCAgICAgICAgICAgICAgUk4gMworZG91YmxlUVAgICAgICAgICAgIFJOIDQKK1JldHVybiAgICAgICAgICAgICBSTiAwCis7Ly8gTmVvbiByZWdpc3RlcnMKKworCitkUVAxMCAgICAgICAgICAgICAgRE4gRDAuUzMyWzBdCitxUVAxICAgICAgICAgICAgICAgUU4gUTAuUzMyCisKK2RRUDEgICAgICAgICAgICAgICBETiBEMC5TMTYKK2RNaW51c1FQMSAgICAgICAgICBETiBEMS5TMTYKKworZENvZWZmMCAgICAgICAgICAgIEROIEQyLlMxNgorZENvZWZmMSAgICAgICAgICAgIEROIEQzLlMxNiAgIAorCitxUmVzdWx0MCAgICAgICAgICAgUU4gUTMuUzMyCitkUmVzdWx0MCAgICAgICAgICAgRE4gRDcuUzE2CitxU2lnbjAgICAgICAgICAgICAgUU4gUTMuUzMyCitkU2lnbjAgICAgICAgICAgICAgRE4gRDYuUzE2CisKK3FSZXN1bHQxICAgICAgICAgICBRTiBRNC5TMzIKK2RSZXN1bHQxICAgICAgICAgICBETiBEOC5TMTYKK3FTaWduMSAgICAgICAgICAgICBRTiBRNC5TMzIKK2RTaWduMSAgICAgICAgICAgICBETiBEOC5TMTYKKworZDJRUDAgICAgICAgICAgICAgIEROIEQxMC5TMzJbMF0KK3EyUVAwICAgICAgICAgICAgICBRTiBRNS5TMzIKK2QyUVAgICAgICAgICAgICAgICBETiBEMTAuUzE2CisKK2RaZXJvMCAgICAgICAgICAgICBETiBEMTEuUzE2CitkWmVybzEgICAgICAgICAgICAgRE4gRDEyLlMxNgorZENvbnN0MCAgICAgICAgICAgIEROIEQxMy5TMTYKKworICAgIAorICAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludGVyX0kscjQsZDEzCisgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIEFERCAgICAgIGRvdWJsZVFQLFFQLFFQICAgICAgICAgICAgICAgICAgIDsvLyBkb3VibGVRUD0gMipRUAorICAgICAgICAgVk1PViAgICAgZDJRUDAsZG91YmxlUVAKKyAgICAgICAgIFZEVVAgICAgIHEyUVAwLGQyUVAwICAgICAgICAgICAgICAgICAgICAgIDsvLyBNb3ZlIGRvdWJsZVFQIGluIHRvIGEgc2NhbGFyCisgICAgICAgICBUU1QgICAgICBRUCwjMSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkIGZpcnN0IDggdmFsdWVzIHRvIENvZWZmMCxDb2VmZjEKKyAgICAgICAgIFNVQkVRICAgIFFQLFFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgVk1PViAgICAgZFFQMTAsUVAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIFFQIGlzIGV2ZW4gdGhlbiBRUDE9UVAtMSBlbHNlIFFQMT1RUCAgICAgCisgICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKKyAgICAgICAgIFZEVVAgICAgIHFRUDEsZFFQMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGUgdGVtcFJlc3VsdCB3aXRoIFFQMQorICAgICAgICAgVlNIUk4gICAgZDJRUCxxMlFQMCwjMAorICAgICAgICAgVkVPUiAgICAgZENvbnN0MCxkQ29uc3QwLGRDb25zdDAKKyAgICAgICAgIFZTSFJOICAgIGRRUDEscVFQMSwjMCAgICAgICAgICAgICAgICAgICAgIDsvLyBRUDEgdHJ1bmNhdGVkIHRvIDE2IGJpdHMKKyAgICAgICAgIFZTVUIgICAgIGRNaW51c1FQMSxkQ29uc3QwLGRRUDEgICAgICAgICAgIDsvLyBkTWludXNRUDE9LVFQMQorCitMb29wICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICA7Ly9QZXJmb3JtaW5nIEludmVyc2UgUXVhbnRpemF0aW9uCisgICAgICAgICAKKyAgICAgICAgIFZDTFQgICAgIGRTaWduMCxkQ29lZmYwLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCAwCisgICAgICAgICBWQ0xUICAgICBkU2lnbjEsZENvZWZmMSwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgMAorICAgICAgICAgVkNFUSAgICAgZFplcm8wLGRDb2VmZjAsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IHplcm8KKyAgICAgICAgIFZCU0wgICAgIGRTaWduMCxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjAgPSAtUVAxIGlmIENvZWZmMDwgMCBlbHNlIFFQMQorICAgICAgICAgVkNFUSAgICAgZFplcm8xLGRDb2VmZjEsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IHplcm8KKyAgICAgICAgIFZCU0wgICAgIGRTaWduMSxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjEgPSAtUVAxIGlmIENvZWZmMTwgMCBlbHNlIFFQMQorICAgICAgICAgVk1PVkwgICAgcVNpZ24wLGRTaWduMCAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gZXh0ZW5kIHFTaWduMCB0byAzMiBiaXRzCisgICAgICAgICBWTU9WTCAgICBxU2lnbjEsZFNpZ24xCisgICAgICAgICBWTUxBTCAgICBxUmVzdWx0MCxkQ29lZmYwLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0rcUNvZWZmMFtpXSooLTIpIGlmIENvZWZmIDwwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCisgICAgICAgICBWTUxBTCAgICBxUmVzdWx0MSxkQ29lZmYxLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0rcUNvZWZmMVtpXSooLTIpIGlmIENvZWZmIDwwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCisgICAgICAgICA7Ly8gQ2xpcCBSZXN1bHQgdG8gWy0yMDQ4LDIwNDddICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQwLHFSZXN1bHQwLCMyMCAgICAgICAgICAgIDsvLyBjbGlwIHRvIFstMjA0OCwyMDQ3XQorICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDEscVJlc3VsdDEsIzIwCisgICAgICAgICAgICAgICAgIAorICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDAscVJlc3VsdDAsIzQgIAorICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDEscVJlc3VsdDEsIzQKKyAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQwLHFSZXN1bHQwLCMxNiAgICAgICAgICAgIDsvLyBOYXJyb3cgdGhlIGNsaXBwZWQgVmFsdWUgdG8gSGFsZndvcmQKKyAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQxLHFSZXN1bHQxLCMxNiAKKyAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQwLGRDb25zdDAsZFplcm8wICAKKyAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQxLGRDb25zdDAsZFplcm8xICAgICAKKyAgICAgICAgIAorICAgICAgICAgVlNUMSAgICAge2RSZXN1bHQwLGRSZXN1bHQxfSxbcFNyY0RzdF0hICAgOy8vIFN0b3JlIHRoZSByZXN1bHQKKyAgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM4CisgICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0KKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBCR1QgICAgICBMb29wCisKKyAgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorCisKKyAgICAgICAgIE1fRU5ECisgICAgICAgICBFTkRJRgorICAgICAgICAgCisKKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMDA1OTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCkBAIC0wLDAgKzEsMjEwIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICAxMjI5MAorOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCis7ICogCis7ICoKKzsgKgorOyAqCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50cmFfSQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCis7ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKKzsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgorOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICogW2luXSAgICBRUCAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKKzsgKiBbaW5dICAgIHZpZGVvQ29tcCAgICAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KKzsgKiBbaW5dICAgIHNob3J0VmlkZW9IZWFkZXIgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKKzsgKiAgICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKzsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgIC0gICAgSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCis7ICogICAgICBvcgorOyAqICAgIC0gSWYgUVAgPD0gMC4KKzsgKiAgICAgIG9yCis7ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KKzsgKgorIAorCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgCisgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAKKyAgIAorICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKKyAKKyAgICAgSUYgQ29ydGV4QTgKKyAgICAgCisgICAgIAorOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjRHN0ICAgICAgICAgICAgUk4gMAorUVAgICAgICAgICAgICAgICAgIFJOIDEKK3ZpZGVvQ29tcCAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgUk4gMworICAgICAKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK2RjU2NhbGVyICAgICAgICAgICBSTiA0Cit0ZW1wICAgICAgICAgICAgICAgUk4gMTQKK2luZGV4ICAgICAgICAgICAgICBSTiA1CisKKworQ291bnQgICAgICAgICAgICAgIFJOIDUKK2RvdWJsZVFQICAgICAgICAgICBSTiA0CitSZXR1cm4gICAgICAgICAgICAgUk4gMAorCisKKzsvLyBOZW9uIHJlZ2lzdGVycworCisKK2RRUDEwICAgICAgICAgICAgICBETiBEMC5TMzJbMF0KK3FRUDEgICAgICAgICAgICAgICBRTiBRMC5TMzIKKworZFFQMSAgICAgICAgICAgICAgIEROIEQwLlMxNgorZE1pbnVzUVAxICAgICAgICAgIEROIEQxLlMxNgorCitkQ29lZmYwICAgICAgICAgICAgRE4gRDIuUzE2CitkQ29lZmYxICAgICAgICAgICAgRE4gRDMuUzE2ICAgCisKK3FSZXN1bHQwICAgICAgICAgICBRTiBRMy5TMzIKK2RSZXN1bHQwICAgICAgICAgICBETiBENy5TMTYKK3FTaWduMCAgICAgICAgICAgICBRTiBRMy5TMzIKK2RTaWduMCAgICAgICAgICAgICBETiBENi5TMTYKKworcVJlc3VsdDEgICAgICAgICAgIFFOIFE0LlMzMgorZFJlc3VsdDEgICAgICAgICAgIEROIEQ4LlMxNgorcVNpZ24xICAgICAgICAgICAgIFFOIFE0LlMzMgorZFNpZ24xICAgICAgICAgICAgIEROIEQ4LlMxNgorCitkMlFQMCAgICAgICAgICAgICAgRE4gRDEwLlMzMlswXQorcTJRUDAgICAgICAgICAgICAgIFFOIFE1LlMzMgorZDJRUCAgICAgICAgICAgICAgIEROIEQxMC5TMTYKKworZFplcm8wICAgICAgICAgICAgIEROIEQxMS5TMTYKK2RaZXJvMSAgICAgICAgICAgICBETiBENC5TMTYKK2RDb25zdDAgICAgICAgICAgICBETiBENS5TMTYKKworCisKKworICAgICAKKyAgICAgCisgICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSxyNSxkMTEKKworCisgICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBEQyBjb2VmZmljaWVudAorCisgICAgICAgIFRFUSAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgOy8vIFRlc3QgaWYgc2hvcnQgVmlkZW8gSGVhZGVyIGZsYWcgPTAgICAgICAgICAgICAgCisgICAgICAgIE1PVk5FICAgICBkY1NjYWxlciwjOCAgICAgICAgICAgICAgOy8vIGlmIHNob3J0VmlkZW9IZWFkZXIgaXMgbm9uIHplcm8gZGNTY2FsZXI9OAorICAgICAgICBCTkUgICAgICAgY2FsRENWYWwKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgorICAgICAgQUREICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKKyAgICAgIExEUkIgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCisKKyAgICAgICAgOy8vTV9DYWxEQ1NjYWxhciAgc2hvcnRWaWRlb0hlYWRlcix2aWRlb0NvbXAsIFFQCisKK2NhbERDVmFsCisKKyAgICAgICAgTERSSCAgICAgdGVtcCxbcFNyY0RzdF0KKyAgICAgICAgU01VTEJCICAgdGVtcCx0ZW1wLGRjU2NhbGVyICAgICAgIDsvLyBkY0NvZWZmID0gZGNTY2FsZXIgKiBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQoZnJvbSBtZW1vcnkpCisgICAgICAgIFNTQVQgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICA7Ly8gU2F0dXJhdGluZyB0byAxMiBiaXRzCisgICAgICAKKworCisgICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBBYyBDb2VmZmljaWVudHMKKyAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgQUREICAgICAgZG91YmxlUVAsUVAsUVAgICAgICAgICAgICAgICAgICAgOy8vIGRvdWJsZVFQPSAyKlFQCisgICAgICAgICBWTU9WICAgICBkMlFQMCxkb3VibGVRUAorICAgICAgICAgVkRVUCAgICAgcTJRUDAsZDJRUDAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1vdmUgZG91YmxlUVAgaW4gdG8gYSBzY2FsYXIKKyAgICAgICAgIFRTVCAgICAgIFFQLCMxICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdICAgICAgOy8vIExvYWQgZmlyc3QgOCB2YWx1ZXMgdG8gQ29lZmYwLENvZWZmMQorICAgICAgICAgU1VCRVEgICAgUVAsUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICBWTU9WICAgICBkUVAxMCxRUCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUVAgaXMgZXZlbiB0aGVuIFFQMT1RUC0xIGVsc2UgUVAxPVFQICAgICAKKyAgICAgICAgIE1PViAgICAgIENvdW50LCM2NAorICAgICAgICAgVkRVUCAgICAgcVFQMSxkUVAxMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIER1cGxpY2F0ZSB0ZW1wUmVzdWx0IHdpdGggUVAxCisgICAgICAgICBWU0hSTiAgICBkMlFQLHEyUVAwLCMwCisgICAgICAgICBWRU9SICAgICBkQ29uc3QwLGRDb25zdDAsZENvbnN0MAorICAgICAgICAgVlNIUk4gICAgZFFQMSxxUVAxLCMwICAgICAgICAgICAgICAgICAgICAgOy8vIFFQMSB0cnVuY2F0ZWQgdG8gMTYgYml0cworICAgICAgICAgVlNVQiAgICAgZE1pbnVzUVAxLGRDb25zdDAsZFFQMSAgICAgICAgICAgOy8vIGRNaW51c1FQMT0tUVAxCisKK0xvb3AgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvL1BlcmZvcm1pbmcgSW52ZXJzZSBRdWFudGl6YXRpb24KKyAgICAgICAgIAorICAgICAgICAgVkNMVCAgICAgZFNpZ24wLGRDb2VmZjAsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IDAKKyAgICAgICAgIFZDTFQgICAgIGRTaWduMSxkQ29lZmYxLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCAwCisgICAgICAgICBWQ0VRICAgICBkWmVybzAsZENvZWZmMCwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgemVybworICAgICAgICAgVkJTTCAgICAgZFNpZ24wLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMCA9IC1RUDEgaWYgQ29lZmYwPCAwIGVsc2UgUVAxCisgICAgICAgICBWQ0VRICAgICBkWmVybzEsZENvZWZmMSwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgemVybworICAgICAgICAgVkJTTCAgICAgZFNpZ24xLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMSA9IC1RUDEgaWYgQ29lZmYxPCAwIGVsc2UgUVAxCisgICAgICAgICBWTU9WTCAgICBxU2lnbjAsZFNpZ24wICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBleHRlbmQgcVNpZ24wIHRvIDMyIGJpdHMKKyAgICAgICAgIFZNT1ZMICAgIHFTaWduMSxkU2lnbjEKKyAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQwLGRDb2VmZjAsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXStxQ29lZmYwW2ldKigtMikgaWYgQ29lZmYgPDAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKKyAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQxLGRDb2VmZjEsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXStxQ29lZmYxW2ldKigtMikgaWYgQ29lZmYgPDAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKKyAgICAgICAgIDsvLyBDbGlwIFJlc3VsdCB0byBbLTIwNDgsMjA0N10gICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDAscVJlc3VsdDAsIzIwICAgICAgICAgICAgOy8vIGNsaXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICAgICBWUVNITCAgICBxUmVzdWx0MSxxUmVzdWx0MSwjMjAKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICBWU0hSICAgICBxUmVzdWx0MCxxUmVzdWx0MCwjNCAgCisgICAgICAgICBWU0hSICAgICBxUmVzdWx0MSxxUmVzdWx0MSwjNAorICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDAscVJlc3VsdDAsIzE2ICAgICAgICAgICAgOy8vIE5hcnJvdyB0aGUgY2xpcHBlZCBWYWx1ZSB0byBIYWxmd29yZAorICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDEscVJlc3VsdDEsIzE2IAorICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDAsZENvbnN0MCxkWmVybzAgIAorICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDEsZENvbnN0MCxkWmVybzEgICAgIAorICAgICAgICAgCisgICAgICAgICBWU1QxICAgICB7ZFJlc3VsdDAsZFJlc3VsdDF9LFtwU3JjRHN0XSEgICA7Ly8gU3RvcmUgdGhlIHJlc3VsdAorICAgICAgICAgU1VCUyAgICAgQ291bnQsQ291bnQsIzgKKyAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XQorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIEJHVCAgICAgIExvb3AKKyAgICAgICAgIAorICAgICAgICAgU1VCICAgICAgcFNyY0RzdCxwU3JjRHN0LCMxMjgKKyAgICAgICAgIAorICAgICAgICAgOy8vIFN0b3JlIHRoZSBJbnZlcnNlIHF1YW50aXplZCBEYyBjb2VmZmljaWVudAorICAgICAgICAgCisgICAgICAgICBTVFJIICAgICB0ZW1wLFtwU3JjRHN0XSwjMgorICAgICAgICAKKyAgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICAgCisKKworICAgICAgICAgTV9FTkQKKyAgICAgICAgIEVORElGCisgICAgICAgICAKKworICAgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDkzNjgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKKworI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCitjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODAxZjNkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVApAQCAtMCwwICsxLDYzIEBACitUaGUgY29udGVudHMgb2YgdGhpcyB0cmFuc2FjdGlvbiB3YXMgY3JlYXRlZCBieSBIZWRsZXkgRnJhbmNpcworb2YgQVJNIG9uIDE5LUZlYi0yMDA4LgorCitJdCBjb250YWlucyB0aGUgQVJNIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGJlbG93LgorCitUaGlzIGRhdGEsIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBpcyBBUk0gUHJvcHJpZXRhcnkgYW5kIGFjY2VzcyB0byBpdAoraXMgc3ViamVjdCB0byB0aGUgYWdyZWVtZW50cyBpbmRpY2F0ZWQgYmVsb3cuCisKK0lmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggdGhpcyBkYXRhLCBwbGVhc2UgY29udGFjdCBBUk0gc3VwcG9ydAorcXVvdGluZyB0cmFuc2FjdGlvbiByZWZlcmVuY2UgPDk3NDEyPi4KKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCistIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxCisgIFZpZGVvIGNvZGVjcyAtIHNhbXBsZSBjb2RlCisgIFNhbXBsZSBjb2RlIHJlbGVhc2UgZm9yIEhhbnRybyAoVmVyIDEuMC4yKQorICBpbnRlcm5hbCBhY2Nlc3MKKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zIGRlbGl2ZXJhYmxlcyB3aGljaCBhcmUgZGVzaWduYXRlZCBhcyBiZWluZyBvZgorYmV0YSByZWxlYXNlIHN0YXR1cyAoQkVUKS4KKworQmV0YSByZWxlYXNlIHN0YXR1cyBoYXMgYSBwYXJ0aWN1bGFyIG1lYW5pbmcgdG8gQVJNIG9mIHdoaWNoIHRoZSByZWNpcGllbnQKK211c3QgYmUgYXdhcmUuIEJldGEgaXMgYSBwcmUtcmVsZWFzZSBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBkZWxpdmVyYWJsZQorc28gZGVzY3JpYmVkIGlzIGJlbGlldmVkIHRvIHJvYnVzdGx5IGRlbW9uc3RyYXRlIHNwZWNpZmllZCBiZWhhdmlvdXIsIHRvIGJlCitjb25zaXN0ZW50IGFjcm9zcyBpdHMgaW5jbHVkZWQgYXNwZWN0cyBhbmQgYmUgcmVhZHkgZm9yIGdlbmVyYWwgZGVwbG95bWVudC4KK0J1dCBCZXRhIGFsc28gaW5kaWNhdGVzIHRoYXQgcHJlLXJlbGVhc2UgcmVsaWFiaWxpdHkgdHJpYWxzIGFyZSBvbmdvaW5nIGFuZAordGhhdCBpdCBpcyBwb3NzaWJsZSByZXNpZHVhbCBkZWZlY3RzIG9yIGVycm9ycyBpbiBvcGVyYXRpb24sIGNvbnNpc3RlbmN5CithbmQgZG9jdW1lbnRhdGlvbiBtYXkgc3RpbGwgYmUgZW5jb3VudGVyZWQuIFRoZSByZWNpcGllbnQgc2hvdWxkIGNvbnNpZGVyCit0aGlzIHBvc2l0aW9uIHdoZW4gdXNpbmcgdGhpcyBCZXRhIG1hdGVyaWFsIHN1cHBsaWVkLiBBUk0gd2lsbCBub3JtYWxseQorYXR0ZW1wdCB0byBwcm92aWRlIGZpeGVzIG9yIGEgd29yay1hcm91bmQgZm9yIGRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUKK3JlY2lwaWVudCwgYnV0IHRoZSBwcm92aXNpb24gb3IgdGltZWxpbmVzcyBvZiB0aGlzIHN1cHBvcnQgY2Fubm90IGJlCitndWFyYW50ZWVkLiBBUk0gc2hhbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvciBkaXJlY3Qgb3IgY29uc2VxdWVudGlhbAorZGFtYWdlcyBhcyBhIHJlc3VsdCBvZiBlbmNvdW50ZXJpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgcmVzaWR1YWwgZGVmZWN0cy4KK0J5IGFjY2VwdGluZyBhIEJldGEgcmVsZWFzZSwgdGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gdGhlc2UgY29uc3RyYWludHMgYW5kCit0byBwcm92aWRpbmcgcmVhc29uYWJsZSBpbmZvcm1hdGlvbiB0byBBUk0gdG8gZW5hYmxlIHRoZSByZXBsaWNhdGlvbiBvZiB0aGUKK2RlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUgcmVjaXBpZW50LiBUaGUgc3BlY2lmaWMgQmV0YSB2ZXJzaW9uIHN1cHBsaWVkCit3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYWZ0ZXIgcmVsZWFzZSBvZiBhIGxhdGVyIG9yIGhpZ2hlciBzdGF0dXMgdmVyc2lvbi4KK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IFN1cHBvcnQgZm9yIHRoZSBCZXRhIHJlbGVhc2Ugb2YgdGhlIGRlbGl2ZXJhYmxlCit3aWxsIG9ubHkgYmUgcHJvdmlkZWQgYnkgQVJNIHRvIGEgcmVjaXBpZW50IHdobyBoYXMgYSBjdXJyZW50IHN1cHBvcnQgYW5kCittYWludGVuYW5jZSBjb250cmFjdCBmb3IgdGhlIGRlbGl2ZXJhYmxlLgorCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworSW4gYWRkaXRpb24gdG8gdGhlIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGFib3ZlLCB0aGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zCit0d28gYWRkaXRpb25hbCBmaWxlcyBhdCB0aGUgdG9wIGxldmVsLgorCitUaGUgZmlyc3QgaXMgdGhpcyBmaWxlLCBBUk1fREVMSVZFUllfOTc0MTIuVFhULCB3aGljaCBpcyB0aGUgZGVsaXZlcnkKK25vdGUuCisKK1RoZSBzZWNvbmQgaXMgQVJNX01BTklGRVNUXzk3NDEyLlRYVCB3aGljaCBjb250YWlucyBhIG1hbmlmZXN0IG9mIGFsbCB0aGUKK2ZpbGVzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIHRvZ2V0aGVyIHdpdGggdGhlaXIgY2hlY2tzdW1zLgorCitUaGUgY2hlY2tzdW1zIHByb3ZpZGVkIGFyZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgorTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobS4KKworVGhlIGNoZWNrc3VtcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGlzIGRhdGEgdXNpbmcgdGhlCisibWQ1c3VtIiB0b29sICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBHTlUgInRleHR1dGlscyIgcGFja2FnZSkgYnkgcnVubmluZzoKKworICAlIG1kNXN1bSAtLWNoZWNrIEFSTV9NQU5JRkVTVF85NzQxMi5UWFQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fTUFOSUZFU1QuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDFiMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9NQU5JRkVTVC5UWFQKQEAgLTAsMCArMSwxNDAgQEAKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxLworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLworODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCitlODhlYzg0ZTEyMjUzNDA5MmI5MGM2Nzg0MTU0OWQ2ZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCis0M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAorZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAorOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCithMDY5ODNhYmIzOWM0NzZiMDgxZTg3ZWEyNzEzNjFhNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKK2MwMWY4YjkzYWI3M2Q4YzAwZGRmMjQ5OWYwMWRhNWZmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KKzI2ZTJmZjNmNjMzNzY0ZWI3MjBkZWIzNDA5NzhkYzJkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYworNzlhYTIzZDk4MTdlZmQxMWQwYzRjMmJlMzZlYzFlNWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NLmMKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCitlNDUyOTc3MDRkNzIzMDJkNGE5NDdkMDc5OGM2NjZmYiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworMjA1ZGZhZmUxZmU3YmIxNjBiZjM2ZDI2MDBlMTEwMGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworYmY5MjY0MWU4NTQ4NTc3Yjc3ZTA0ZTAzZWMwNGMzNTggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCitmNWVlNmY3YmU4MjJkODc0NzFjZWYzYjE4MDFkYmZjMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYworMjgxMTBiM2ExM2NlY2Y0ZjIxNmQxMGJjYzc2MWM0MDEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCis5YTFhMjUyNDVjOTc1ZDY0MWUxYzYzNzg4MzRhZWE0ZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworM2E2NDNlYWFhZWIxMmU4ZDI3NGRjNTlhNzM1N2E1ODYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCis0YzRkZTU5NzNhNmI3NDI1MGNlOTFhYzBiMzE3YTYxNyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYworNGVjZGJlOTE5M2FhYmExZjliYjBlMjRjOTM4YjM0ZjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKKzY2ZTkxMmY4Yzg4ZjYwMTljYmEzZWRlMjcxNTBhNDA3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYworMjY2ZGE0MmY0ZTMwMTVlNjdiMmNiYjU4MTY5ZDQzN2YgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCitkOTA1MjQ3ZWVhYTUyZDRlMmNmNWY2YmMzZjYxYjM0OCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKKzViMjk0NDhkYjA0OTVjZDE3MTdhNGI5MjVmMTMzNzdjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYworZjY0NTFkZjI3ZjZkY2M5OTAzNmI0YjEyNTNjMjNiYjYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKKzg5Mjc4N2Q4NTBlZWYwOWRjMjE0OGQ0NWI0MTZiMDYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCiszM2RhMWMwMWEzMWY0N2MwZjNhZWE5YTdhNWVhYTliZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKK2U5ZmIxMWIwNjY3NzUyODNkY2ZlYWU4ZDEyYTZjOTdhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCithZGQ5N2JlYzA4ZTVlMWE1MzhhYTg2MDcxNjhlNjFiYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCitiNjk1ZWNmYzkxN2IzOTQ3MGQxZjQwNzczYjkyMzk3MiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYworNTFiYzU5NmZkMmZmNjFhZDU0NTBkNzEzODQ2MWY0YTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jCitkYzZiYWEwYTM4OGRjNWVhOGZmNjVjMjRiMTc5ZTY3MCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCithNTQ5OTkwMjk5NjU3NmY2NzEyODQ5ZGIzNGQ1YWQ2NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKKzBjM2I3Njc0NWQ1M2U3NGE4ZTY0ZTgwZGVmMzFmYWJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKKzRmMjc0MmJhNWEzYzIyMDhmNTNiYzBmNmE0NDNiZTE0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKK2I0YWUyZGM5NDhlOGNhNjQ4MzFmZTNiYmZiZDg5NTIzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCitlMTUxMThjYmUzNzJkYjdjYWRiYTIyNWM5NDU2ZjE4OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCis2MjNjZjMzNmNmY2U3ZDAxNzRmNGU1NDA3MjQ1NmYzMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYworODllNDUyYzgwZTMwMzU3Y2FkZmIwNGMwNWI2ZmUwMGMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKzNhNTU1MWNjNTRlODViYmUzNGZjOTY2YzdkYzAwZjFjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYworMTE0MDMwZmEwZDhmMDBhZjZkMzI4OWY0N2E1ZTg1YmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKzllMzczYWIyOTZmYjg1YmI0NTU2NWE2YzM4NGY2ZWQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKKzJkMjAwZjdjYzIzMGYzMDJkYTQ4YzU4OWRhNDJjMDJmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCitlYTNmMWQxZDE1MDdiNTU2MTBiMTM0OWM3YjU5NDZlOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYworYmQyYmYxNzQzYWVmMmE5Mzk2NTQ1ZWQwMjUzNjJiZTIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYworY2E2OGU4MDk1NjdiZjg5MDQ0NjMxYjY3ZDIyOGM3Y2UgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCis3N2NhZjJiNWNiZWU5NmQzNjBhOTE5ZjI3ZTFmMTRmNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYworMjYwODFlMzg0ZWM2MjdmZWRhZDQ3NGEwZTdkYWQ4NzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYworMWM4M2FlOTIwN2E1NDk0NDkzNmY0YTYzYzY2NWJkOTkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCis0YzM2ZTA0ZGIyMDIwMGY0ZWM3MmU1YWJhNTc0NDZmZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYworZjc1YjdjNWE4MGQ4YmYzM2UzMTUzODBlNGVmMGFiOGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKzQ4ODkyNWJiN2FlZWFlMGNjZjkzZWM0NGFmOWZjZTM1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCitjOTFhNTM0NWI1Zjg3N2IzODMxZWQxYWJjYzYwZDU3OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKKzM1NTE1YTExNWEzMmZjYWM4NDc5MDcyYTlhNWIwZGI5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKK2ZkY2Y0NjIyYmM1ZjBhZTc1YmRiMGE1MWRjZDAzMzk3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYworNzRjOTI3ODE3NzQwMGExZjdjYzZkNzk5YThjOGFiMzQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCis1NmFhMmQ1MDZkMGNmZGI0ZWJkMzY2YzA3YWRiMmQ4NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKKzM2YjIxNjVmZDRkMmE3ZjNmM2UxZjhkYWZmNGY5NGU1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCis0YjZiMWI5MzNmYzdiYzhmMTRhMTg0YzAyYzAyODA4NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYworY2YwZmYwOTNhOWIzNzJkZDMyNzFlM2U1YzI4OTg0ZDQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCis5Y2NhZDlmODk0ZmJkMzIxOTRmNWI1M2RhMjE3MDcyYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCis0OTQzYTdhMmRmN2U5ZDcwMDY3NWY4YzFkZWJmNGQ5MCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKKzI5ZTRhN2YzOGY4YzJlODI0NmVkNzU2ZGIwM2MwMTJlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisyN2JjNjRlN2MxOGRhMGFhYjljOTg3YTM4OGY2MTYwOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCis4NTkxODU2MTRiYjlkMDAxMzg2MWU0NTRkN2I5MThmMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLworNjNlM2I2NGI5NmNjNDJhMjM1YzA0ZjNhMGY5OTEzMTYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KKzBhYWU0ZjY4M2Q4OTAzY2JhOTk1NmQzMzAxZWQ5ZmZlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYworOGQ2YzFiNDQ5MTUzMjkxNjVkZjY0MzA4MWNjMTFhOTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYworMDQzNWVjYTkzMGVhY2RhMGYyYTU5ZTg0M2Q0MDVlZmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworOWE4MmRkMGIxZjA1Zjc5ODU2NzQzNmEwMDlkMDI5NjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKK2UxZTI0NjQ2YzRiZDAzZjVkZjc4Mjk1NDUyZGQ0ZWIyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCis3NDZlNmIzMzRlNGEyNmQ0YTliZmFlNmQ3MzU4MjZmNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCis4YjFkODdiNzRkODBmZjEzYTE2MjE1YjYxZDVlNTJiYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYworMzA5MzU4ZDM1N2JhYWZjMzhkMmIzN2JmMWU5NzY4YTkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYworY2M3N2M3MjQyYjUzYzE1M2Y4ZDA5NTI3NTgzZjI3NzEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKKzdjZDhlNzc5NjAxN2UzZGQwMGI0OTRkMzRmNjI5ZjNmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKK2E0OTA1Y2I1ZjhkNGIyNDQ0NTRlZTRmNjBkMTgzNThiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCis1NTk2YjMxZTQzMzIyMmMxZTQ4NjBkZWViZmE5OGVmMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCiszNjVkMDcyYmU2ZWFiMjAxZjZlMDQwMDU4YTNiYWNmYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCis3OGVkMjIxMjU4NWIwY2NhNzU5MTNhNDczYjJlYzQzMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKzUwYjJkOGRhOGYyMGY2YjFkMzliOGQzZGYzOGFmNTVkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYworNGE4NTFhMmFkNmQzNTdjZGMyMzNkOWMwYmY0NzVlMDIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYworMGQ2ZDYzODc4ZjI4MjdlMDBlNWY4NWIxZThlMjYwMTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKzQ4Yjg2NWE5ODNmZTViZjMwNzVlZGRmNjUyOTUwNzIyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKKzVmNDhmYTc5NDE4MzVjNDZhYzc2N2U2M2ZjMjk0MDNiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworYmJhZjQ1NGI2NGIzMmIyYzQyYTc2YTdlYzM5M2Q5NzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYworZWViZmY3NzJmODdhNDE0NDM2YzVjNTI4NmYyY2QyMTMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYworNjVhZTI0MmViOGNiNmQxMDI3Njc3YzhlZjhmNzdjYTAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKKzEyNTY0MmIxZWEwYzEyNTZkNzlhZjFlMGRkZWNhZTkzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKK2NlMjRiYTNkODNkYTRjYjc5MTQ4NWQzMTI4MjY4YmY2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYworMDliYzA5YTJlNmZkOTYyZTcxOTk0NDU4MmUzOGE4ZmQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworNmIwZWU3YTExNjQ3MWE0ZGFkYmU1YmM4ZGJmNDI1YjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKKzIxMzIyZGNhMDI3YzI4MzUzZTNlN2ViOGYzNjIwMDYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKK2VmMzUzZDgzMjQ0Mjg4ZDhjMzdlMGY3MDI0OTE3N2NjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCis1NDFkZTgyNGY4YWViZTRhNWNhYzZmMTVkYTk0M2VmYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYworMGI0MGIxNTRiNTkxYzdmODg0MmNmZmU0MDQyZDE3YzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworMmZmY2VjODhkM2ZjYjM3MjU0M2E4ZjQ1MDhlYTFhYzYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYworZTA2ZDg1Y2EwMDBhZmNiYjUwNTgwZjk4ZjAyMDNhYzggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCithZTgyYjZmY2ZjZjczMWE2MWQ3MGUxYWE0MmU2Mjc3YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCisxZDA0Mzk1ZTIzMWI1OTc1NjIyNTdlOThjZGE2Y2ZiMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCis3MmMwYTM2MzI3YjZiOWI0MzZkM2JjZTdjODk2YzUyMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKKzFiNjVhYTdmMzExMTI0ZWE2ZmI0N2UzODRlYzA2YTUwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKKzcxNDk1NzEwNGE2ZWY3MTM0MWZiZTZhOWVjNjVjMTM2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCis4NjQ5M2YwZWU4NTNmNjUzMzU0YTczODlmMTcyN2Y3MyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKKzVkZThhZmNmYjMwNTI5Njg3OTQ3ODJhN2MzYTBiNDFhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKKzUwYmNjMjI4Y2M2NjBkYmRhMDM3NzI1MzA5ZGUzZjhiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKKzRmNWNmYTFlY2M2Njg5MTNkZGU5NGUzY2FmOTdhMmUxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKK2MyZWM4MDRkZGY2NGVlODQxMTQ2ZTM5YzNhNzgzNDUxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKKzQwODdmNmE4Mjc5MTJlZTViNDVlZDQyMTdmMWE2ZDc3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLworNWM3MTE3MDJkZGRjZWM4NTI5ODAwMzg2MGQ3NjBjZWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaAorMWI5MmM5NGI3ODVjMDNlYzc2ZDRmYWUyZjJiYmRiOGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKK2FkOWM2OTg2ZDJhMzIwMGRkNWUxZjYxMDNhNTRhOTliICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KK2U2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCis3Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKKzEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAorCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLworM2E2ZGYwMDg1NzM2Y2JjYmUyZTNmNDVkMDhhZjQyMjEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKKzBiZjNjYjUyODYzYzgyOWIyOGMwMzUyODM1MTcwMjExICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCis1MzhiNjJmNTEwYjVhOGJkY2VkNGEzOWZhMTJkOWEyMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYworNjY5OTNlZGQ5ZDQ0MWJmM2I1YjZjOTEyZjY0MDBiNmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKKzhlNTI2YTkwMDdlYjBkNDNlYmYzNjJjNDk4YjM3NDE1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCis4N2Y4ZjI2ZTZlOTE3OGRmMGFiNzQxOTMzNGQ1YTNkYiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYworMWE4NTc3NjQ2MTMyYWQ5YjYzYTE0NzdmZGFlYzI0NjQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCis0ODUyOWM0ZjcwYzdlOTU0ZTgzMmVlY2UxYWVlNTdiZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCisyNTI5Nzc3NjRkNGYzODI4MmI2YTU2YzU5Y2NmNGYwOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCitjYzc4Y2ZhZWQ5NTAyYzJlMDI4MmM5MWZiOTVlZWFjNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYworZTQ2ODc1MWMxNWE1ODFlYmQyMmRhMDMxZTIyMTE3ZDEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYworM2Y0NDhkMTkxZWFlYjgyZWNiN2UyN2VmOGJhMjc4NzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYworYjEyOTFjMzA3ODA4NjMxZmE4MzM2ODRhYmI5YzM0Y2UgIEFSTV9ERUxJVkVSWV85NzQxMi5UWFQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQ4NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oCkBAIC0wLDAgKzEsNzg1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqICAgCisgKiBGaWxlOiBhcm1DT01NLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqCisgKi8KKyAKKyAgCisjaWZuZGVmIF9hcm1Db21tb25fSF8KKyNkZWZpbmUgX2FybUNvbW1vbl9IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KK3R5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOworCisKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb21waWxlciBleHRlbnNpb25zICovCisjaWZkZWYgQVJNX0RFQlVHCisvKiBkZWJ1ZyB2ZXJzaW9uICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9CisjZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KKyNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCisjZWxzZSAKKy8qIHJlbGVhc2UgdmVyc2lvbiAqLworI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCisjZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKKyNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKKyNlbmRpZiAvKiBBUk1fREVCVUcgKi8KKworLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCisjZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQorI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKKworLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLworCisjZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQorI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQorI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQorI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQorI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKKworLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLworCisjZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisjZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisKKyNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnQpKFB0cikpICUgTik9PTApCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoKCgoaW50KShQdHIpKSAlIE4pIT0wKQorI2Vsc2UKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQorI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCisjZW5kaWYKKworI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKKyNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCisKKyNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKKyNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKKyNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorIAorT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgICAgIE9NWF9JTlQgbWluLAorICAgICAgICBPTVhfSU5UIG1heCwgCisgICAgICAgIE9NWF9TMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgICAgIE9NWF9GMzIgbWluLAorICAgICAgICBPTVhfRjMyIG1heCwgCisgICAgICAgIE9NWF9GMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKKyAgICAgICAgT01YX0YzMiB2LCAKKyAgICAgICAgT01YX0lOVCBzaGlmdCwgCisgICAgICAgIE9NWF9JTlQgc2F0Qml0cworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKyAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKyAgICApOyAgICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRBZGRfUzMyKAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgorICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOworCisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIERlYnVnZ2luZyBtYWNyb3MKKyAqCisgKi8KKworCisvKgorICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKKyAqLworI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0CisKKy8qCisgKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCisgKiBBZGQgbW9yZSBpZiBuZWVkZWQuCisgKi8KKyNpZmRlZiBERUJVR19PTgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCisjZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCisjZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCisjZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKKyNlbHNlIC8qIERFQlVHX09OICovCisjZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCisjZW5kaWYgLyogREVCVUdfT04gKi8KKworCisvKgorICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCisgKgorICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCisgKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCisgKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KKyAqLworCisjaWZkZWYgREVCVUdfRE9NQUlOX0FDCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4CisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9WQworI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX0lDCisvKiBUbyBiZSBmaWxsZWQgaW4gKi8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1NQCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSVAKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCisKKworI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KKworLypFbmQgb2YgRmlsZSovCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWJjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAorICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgorICoKKyAqLworCisjaWZuZGVmIF9hcm1Db2RlY19IXworI2RlZmluZSBfYXJtQ29kZWNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggICBjb2RlTGVuOworICAgIE9NWF9VMzIJIGNvZGVXb3JkOworfSBBUk1fVkxDMzI7CisKKy8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKipwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisKKyNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispOworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKyk7CisKKyNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWE0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaApAQCAtMCwwICsxLDQzIEBACisvKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLworI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKworCisvKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCisjZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgorCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KKyNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCisjZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKKworLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KKyNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKKworCisvKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLworI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworCisjaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCisKKworLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCisvKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLworCisvKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLworI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjBwMC0wMGJldDEiCisKKy8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLworI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQU5TSSBDIgorCisvKiBUaGUgQVJNIFRvb2xjaGFpbiB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KKyNkZWZpbmUgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gICAgIkFSTSBSVkNUIDMuMSIKKworCisjZW5kaWYgLyogX19BUk1fQ09NTV9WRVJTSU9OX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybU9NWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjlmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaApAQCAtMCwwICsxLDI3NCBAQAorLyogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCisgKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCisgKgorICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgorICoKKyAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCisgKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQorICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3CisgKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKKyAqCisgKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCisgKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucworICogICBhdCBydW50aW1lLgorICoKKyAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4CisgKiAKKyAqLworCisgIAorI2lmbmRlZiBfYXJtT01YX0hfCisjZGVmaW5lIF9hcm1PTVhfSF8KKworCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCisjZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgorI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQorCisvKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLworI2RlZmluZSBCQVJFX1NVRkZJWCAKKworCisKKy8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCisjZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAorI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAorCisKKworCisvKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKKworCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKKworI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQorCisjZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQorCisjZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKKworI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorCisjZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKworCisjZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyOTVhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qKgorICogRmlsZTogb214dHlwZXMuaAorICogQnJpZWY6IERlZmluZXMgYmFzaWMgRGF0YSB0eXBlcyB1c2VkIGluIE9wZW5NQVggdjEuMC4yIGhlYWRlciBmaWxlcy4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKyAqCisgKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKKyAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCisgKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCisgKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAorICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAorICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAorICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCisgKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKKyAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAorICoKKyAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAorICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCisgKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKKyAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKKyAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAorICogbWF0ZXJpYWxzLgorICogCisgKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKgorICovCisgIAorI2lmbmRlZiBfT01YVFlQRVNfSF8KKyNkZWZpbmUgX09NWFRZUEVTX0hfCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gCisKKyNkZWZpbmUgT01YX0lOCisjZGVmaW5lIE9NWF9PVVQKKyNkZWZpbmUgT01YX0lOT1VUCisKKwordHlwZWRlZiBlbnVtIHsKKyAgICAKKyAgICAvKiBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAqLworICAgIE9NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgID0gIDAsICAgIC8qIE5vIGVycm9yLCB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworICAgIE9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgID0gLTIsICAgIC8qIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgKi8gICAgCisgICAgT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgPSAtMTgyLCAgLyogSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgKi8gICAgCisgICAgT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgPSAtOSwgICAgLyogTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uICovCisgICAgT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgPSAtMTU5LCAgLyogQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAqLworICAgIE9NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgID0gLTE2NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgKi8KKyAgICBPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICA9IC0xNjMsICAvKiBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICovICAgICAKKyAgICBPTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICA9IC0xNjIsICAvKiBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAqLyAgICAKKwlPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICA9IC0xNjAsICAvKiBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yICovCisKKyAgICAvKiBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uKi8KKyAgICBPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICA9IC01LCAgICAvKiBCYWQgQXJndW1lbnRzICovCisKKyAgICBPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICA9IC0xNTcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAqLworICAgIE9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgID0gLTE1NiwgIC8qIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgKi8gICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICA9IC0xNTUsICAvKiBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgKi8gICAgICAgICAgICAgICAgICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICA9IC0xNTQsICAvKiBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLworICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgID0gLTE1MywgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8gICAgICAgICAgICAgICAgICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICA9IC0xNTIsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICovICAKKworICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgID0gLTE4MywgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAqLworICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgID0gLTE4MSwgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgPSAtMTcsICAgLyogQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uICovCisKKyAgICBPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICA9IC0xODAsICAvKiBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgKi8KKworICAgIE9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgID0gSU5UX01BWCAgLypQbGFjZWhvbGRlciwgZm9yY2VzIGVudW0gb2Ygc2l6ZSBPTVhfSU5UKi8KKyAgICAKKyB9IE9NWFJlc3VsdDsgICAgICAgICAgLyoqIFJldHVybiB2YWx1ZSBvciBlcnJvciB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24uIElkZW50aWNhbCB0byBPTVhfSU5UICovCisKKyAKKy8qIE9NWF9VOCAqLworI2lmIFVDSEFSX01BWCA9PSAweGZmCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OworI2VsaWYgVVNIUlRfTUFYID09IDB4ZmYgCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTg7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTggdW5kZWZpbmVkCisjZW5kaWYgCisKKyAKKy8qIE9NWF9TOCAqLworI2lmIFNDSEFSX01BWCA9PSAweDdmIAordHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7CisjZWxpZiBTSFJUX01BWCA9PSAweDdmIAordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TODsgCisjZWxzZQorI2Vycm9yIE9NWF9TOCB1bmRlZmluZWQKKyNlbmRpZgorIAorIAorLyogT01YX1UxNiAqLworI2lmIFVTSFJUX01BWCA9PSAweGZmZmYKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VMTY7CisjZWxpZiBVSU5UX01BWCA9PSAweGZmZmYKK3R5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMTY7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTE2IHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1MxNiAqLworI2lmIFNIUlRfTUFYID09IDB4N2ZmZiAKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzE2OworI2VsaWYgSU5UX01BWCA9PSAweDdmZmYgCit0eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MxNjsgCisjZWxzZQorI2Vycm9yIE9NWF9TMTYgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfVTMyICovCisjaWYgVUlOVF9NQVggPT0gMHhmZmZmZmZmZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UzMjsKKyNlbGlmIExPTkdfTUFYID09IDB4ZmZmZmZmZmYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgT01YX1UzMjsgCisjZWxzZQorI2Vycm9yIE9NWF9VMzIgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfUzMyICovCisjaWYgSU5UX01BWCA9PSAweDdmZmZmZmZmCit0eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MzMjsKKyNlbGlmIExPTkdfTUFYID09IDB4N2ZmZmZmZmYKK3R5cGVkZWYgbG9uZyBzaWduZWQgaW50IE9NWF9TMzI7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzMyIHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KKyNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKKyAgICB0eXBlZGVmIF9faW50NjQgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMGk2NCkKKyAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMGk2NCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKKyNlbHNlCisgICAgdHlwZWRlZiBsb25nIGxvbmcgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQorICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCisjZW5kaWYKKworCisvKiBPTVhfU0M4ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzggUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1M4IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzg7IC8qKiBTaWduZWQgOC1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0MxNiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1MxNiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzE2IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzE2OyAvKiogU2lnbmVkIDE2LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzMyICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDMzI7IC8qKiBTaWduZWQgMzItYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDNjQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1M2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfRjMyICovCit0eXBlZGVmIGZsb2F0IE9NWF9GMzI7IC8qKiBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCisKKworLyogT01YX0Y2NCAqLwordHlwZWRlZiBkb3VibGUgT01YX0Y2NDsgLyoqIERvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KKworCisvKiBPTVhfSU5UICovCit0eXBlZGVmIGludCBPTVhfSU5UOyAvKiogc2lnbmVkIGludGVnZXIgY29ycmVzcG9uZGluZyB0byBtYWNoaW5lIHdvcmQgbGVuZ3RoLCBoYXMgbWF4aW11bSBzaWduZWQgdmFsdWUgSU5UX01BWCovCisKKworI2RlZmluZSBPTVhfTUlOX1M4ICAJICAgCSgtMTI4KQorI2RlZmluZSBPTVhfTUlOX1U4ICAJCTAKKyNkZWZpbmUgT01YX01JTl9TMTYJCSAJKC0zMjc2OCkKKyNkZWZpbmUgT01YX01JTl9VMTYJCQkwCisjZGVmaW5lIE9NWF9NSU5fUzMyCQkJKC0yMTQ3NDgzNjQ3LTEpCisjZGVmaW5lIE9NWF9NSU5fVTMyCQkJMAorCisjZGVmaW5lIE9NWF9NQVhfUzgJCQkoMTI3KQorI2RlZmluZSBPTVhfTUFYX1U4CQkJKDI1NSkKKyNkZWZpbmUgT01YX01BWF9TMTYJCQkoMzI3NjcpCisjZGVmaW5lIE9NWF9NQVhfVTE2CQkJKDB4RkZGRikKKyNkZWZpbmUgT01YX01BWF9TMzIJCQkoMjE0NzQ4MzY0NykKKyNkZWZpbmUgT01YX01BWF9VMzIJCQkoMHhGRkZGRkZGRikKKwordHlwZWRlZiB2b2lkIE9NWFZvaWQ7CisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCopMCkKKyNlbmRpZgorCisvKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIGFuZCBzaXplIG9mIGEgcmVjdGFuZ2xlLCAKKyAgKiB3aGVyZSB4LHkgZGVmaW5lcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lcgorICAqIG9mIHRoZSByZWN0YW5nbGUsIHdpdGggZGltZW5zaW9ucyB3aWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24gCisgICogYW5kIGhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlPTVhfSU5UIHg7ICAgICAgLyoqIHgtY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCisJT01YX0lOVCB5OyAgICAgIC8qKiB5LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLworCU9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uLiAqLworCU9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbi4gKi8KK31PTVhSZWN0OworCisKKy8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gb2YgYSBwb2ludCwgKi8KK3R5cGVkZWYgc3RydWN0IAoreworIE9NWF9JTlQgeDsgLyoqIHgtY29vcmRpbmF0ZSAqLworIE9NWF9JTlQgeTsJLyoqIHktY29vcmRpbmF0ZSAqLworCQorfSBPTVhQb2ludDsKKworCisvKiogRGVmaW5lcyB0aGUgZGltZW5zaW9ucyBvZiBhIHJlY3RhbmdsZSwgb3IgcmVnaW9uIG9mIGludGVyZXN0IGluIGFuIGltYWdlICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyBPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB4LWRpcmVjdGlvbiAqLworIE9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB5LWRpcmVjdGlvbiAqLworCQorfSBPTVhTaXplOworCisjZW5kaWYgLyogX09NWFRZUEVTX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9idWlsZF92Yy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMGI0M2UwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYnVpbGRfdmMucGwKQEAgLTAsMCArMSwxMTEgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyAKKyMgRmlsZSBOYW1lOiAgYnVpbGRfdmMucGwKKyMgT3Blbk1BWCBETDogdjEuMC4yCisjIFJldmlzaW9uOiAgIDk2NDEKKyMgRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyMgCisjIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAKKyMgCisjCisjIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KKyMKKwordXNlIEZpbGU6OlNwZWM7Cit1c2Ugc3RyaWN0OworCitteSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOworCiskQ0MgICAgICAgPSAnYXJtY2MnOworJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk03VERNSSAtYyc7CiskQVMgICAgICAgPSAnYXJtYXNtJzsKKyRBU19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQVJNN1RETUknOworIyAkTElCICAgICAgPSAnYXJtbGluayc7CisjICRMSUJfT1BUUyA9ICctLXBhcnRpYWwgLW8nOworIyAkTElCX1RZUEUgPSAnLm8nOworJExJQiAgICAgID0gJ2FybWFyJzsKKyRMSUJfT1BUUyA9ICctLWNyZWF0ZSAtcic7CiskTElCX1RZUEUgPSAnLmEnOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK215IChAaGVhZGVybGlzdCwgQGZpbGVsaXN0LCAkaGQsICRmaWxlLCAkb2ZpbGUsICRjb21tYW5kLCAkb2JqbGlzdCwgJGxpYmZpbGUsICRoKTsKKworIyBEZWZpbmUgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBpbmNsdWRlZCBoZWFkZXIgZmlsZXMuCitAaGVhZGVybGlzdCA9IHF3KGFwaSB2Yy9hcGkgdmMvbTRwMi9hcGkgdmMvbTRwMTAvYXBpKTsKKworIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCitvcGVuKEZJTEVTLCAnPGZpbGVsaXN0X3ZjLnR4dCcpIG9yIGRpZSgiQ2FuJ3Qgb3BlbiBzb3VyY2UgZmlsZSBsaXN0XG4iKTsKK0BmaWxlbGlzdCA9IDxGSUxFUz47CitjbG9zZShGSUxFUyk7CisKKyMgRml4IHRoZSBmaWxlIHNlcGFyYXRvcnMgaW4gdGhlIGhlYWRlciBwYXRocworZm9yZWFjaCAkaCAoQGhlYWRlcmxpc3QpCit7CisgICAgICAgICRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRoKTsKK30KKworIyBDcmVhdGUgdGhlIGluY2x1ZGUgcGF0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCiskaGQgPSAnLUknIC4gam9pbignIC1JJywgQGhlYWRlcmxpc3QpOworCisjIENyZWF0ZSB0aGUgYnVpbGQgZGlyZWN0b3JpZXMgIi9saWIvIiBhbmQgIi9vYmovIiAoaWYgdGhleSBhcmUgbm90IHRoZXJlIGFscmVhZHkpCitta2RpciAib2JqIiwgMDc3NyBpZiAoISAtZCAib2JqIik7Citta2RpciAibGliIiwgMDc3NyBpZiAoISAtZCAibGliIik7CisKKyRvYmpsaXN0ID0gJyc7CisKKyMgQ29tcGlsZSBlYWNoIGZpbGUKK2ZvcmVhY2ggJGZpbGUgKEBmaWxlbGlzdCkKK3sKKwlteSAkZjsKKwlteSAkYmFzZTsKKwlteSAkZXh0OworCW15ICRvYmpmaWxlOworCisJY2hvbXAoJGZpbGUpOworCSRmaWxlID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRmaWxlKTsKKworCSh1bmRlZiwgdW5kZWYsICRmKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCgkZmlsZSk7CisJaWYoKCRiYXNlLCAkZXh0KSA9ICRmID1+IC8oLispXC4oXHcpJC8pCisJeworCQkkb2JqZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ29iaicsICRiYXNlLicubycpOworCisJCWlmKCRleHQgZXEgJ2MnKQorCQl7CisJCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKKwkJCSRjb21tYW5kID0gJENDLicgJy4kQ0NfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7CisJCQlwcmludCAiJGNvbW1hbmRcbiI7CisJCQlzeXN0ZW0oJGNvbW1hbmQpOworCQl9CisJCWVsc2lmKCRleHQgZXEgJ3MnKQorCQl7CisJCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKKwkJCSRjb21tYW5kID0gJEFTLicgJy4kQVNfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7CisJCQlwcmludCAiJGNvbW1hbmRcbiI7CisJCQlzeXN0ZW0oJGNvbW1hbmQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnQgIklnbm9yaW5nIGZpbGU6ICRmXG4iOworCQl9CisJfQorCWVsc2UKKwl7CisJCWRpZSAiTm8gZmlsZSBleHRlbnNpb24gZm91bmQ6ICRmXG4iOworCX0KK30KKworIyBEbyB0aGUgZmluYWwgbGluayBzdGFnZSB0byBjcmVhdGUgdGhlIGxpYnJhcmllcy4KKyRsaWJmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnbGliJywgJ29teFZDJy4kTElCX1RZUEUpOworJGNvbW1hbmQgPSAkTElCLicgJy4kTElCX09QVFMuJyAnLiRsaWJmaWxlLicgJy4kb2JqbGlzdDsKK3ByaW50ICIkY29tbWFuZFxuIjsKKyhzeXN0ZW0oJGNvbW1hbmQpID09IDApIGFuZCBwcmludCAiQnVpbGQgc3VjY2Vzc2Z1bFxuIjsKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2ZpbGVsaXN0X3ZjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmYzNGFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9maWxlbGlzdF92Yy50eHQKQEAgLTAsMCArMSwxMjMgQEAKKy4vYXBpL2FybUNPTU0uaAorLi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAorLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKy4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisuL2FwaS9vbXh0eXBlcy5oCisuL3NyYy9hcm1DT01NLmMKKy4vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKKy4vdmMvYXBpL2FybVZDLmgKKy4vdmMvYXBpL29teFZDLmgKKy4vdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYworLi92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMKKy4vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0dldFZMQ0luZm8uYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCisuL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYworLi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMKQEAgLTAsMCArMSw5MzYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlZmluZXMgQ29tbW9uIEFQSXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncworICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIE1pc2NlbGxhbmVvdXMgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIFZhbHVlICs9IDAuNTsKKyAgICAgICAgCisgICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMTYpT01YX01BWF9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gMC41OworCisgICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMTYpT01YX01JTl9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgVmFsdWUgKz0gMC41OworICAgICAgICAKKyAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MzMilPTVhfTUFYX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUFYX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAwLjU7CisKKyAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MzMilPTVhfTUlOX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUlOX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYgZm9ybWF0CisgKgorICovCisKK09NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTE2KU9NWF9NQVhfVTE2ICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UxNilPTVhfTUFYX1UxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTE2KVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMzIgZm9ybWF0CisgKgorICovCisKK09NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTMyKU9NWF9NQVhfVTMyICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UzMilPTVhfTUFYX1UzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTMyKVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzY0CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIDY0IGJpdCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzY0IGZvcm1hdAorICoKKyAqLworCitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNpZ25DaGVjaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6CisgKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKi8gCisKK09NWF9JTlQgYXJtU2lnbkNoZWNrICgKKyAgICBPTVhfUzE2IHZhcgorKQorCit7CisgICAgT01YX0lOVCBTaWduOworICAgIAorICAgIGlmICh2YXIgPCAwKQorICAgIHsKKyAgICAgICAgU2lnbiA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmICggdmFyID4gMCkKKyAgICB7CisgICAgICAgIFNpZ24gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTaWduID0gMDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFNpZ247Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXAKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybUNsaXAgKAorICAgIE9NWF9JTlQgbWluLAorICAgIE9NWF9JTlQgbWF4LCAKKyAgICBPTVhfUzMyIHNyYyAKKykKKyAKK3sKKyAgICBpZiAoc3JjID4gbWF4KQorICAgIHsKKyAgICAgICAgc3JjID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPCBtaW4pCisgICAgeworICAgICAgICBzcmMgPSBtaW47CisgICAgfQorICAgIAorICAgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgT01YX0YzMiBtaW4sCisgICAgT01YX0YzMiBtYXgsIAorICAgIE9NWF9GMzIgc3JjIAorKQorIAoreworICAgIGlmIChzcmMgPiBtYXgpCisgICAgeworICAgICAgICBzcmMgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKKyAgICB7CisgICAgICAgIHNyYyA9IG1pbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCisgKgorICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKKyAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCisgKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKKyAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAorICogdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgorICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKKyAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKE9NWF9GMzIgdiwgT01YX0lOVCBzaGlmdCwgT01YX0lOVCBzYXRCaXRzKSAKK3sKKyAgICBPTVhfVTMyIGFsbE9uZXMgPSAoT01YX1UzMikoLTEpOworICAgIE9NWF9VMzIgbWF4ViA9IGFsbE9uZXMgPj4gKDMyLXNhdEJpdHMpOworICAgIE9NWF9GMzIgdlNoaWZ0ZWQsIHZSb3VuZGVkLCBzaGlmdERpdiA9IChPTVhfRjMyKSgxIDw8IHNoaWZ0KTsKKyAgICBPTVhfVTMyIHZJbnQ7CisgICAgT01YX1UzMiB2SW50U2F0OworICAgIAorICAgIGlmKHYgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgdlNoaWZ0ZWQgPSB2IC8gc2hpZnREaXY7CisgICAgdlJvdW5kZWQgPSAoT01YX0YzMikodlNoaWZ0ZWQgKyAwLjUpOworICAgIHZJbnQgPSAoT01YX1UzMil2Um91bmRlZDsKKyAgICB2SW50U2F0ID0gdkludDsKKyAgICBpZih2SW50U2F0ID4gbWF4VikgCisgICAgICAgIHZJbnRTYXQgPSBtYXhWOworICAgIHJldHVybiB2SW50U2F0OworfQorCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZXNlIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgorICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgorICovCitPTVhSZXN1bHQgYXJtU3dhcEVsZW0oCisgICAgICAgIE9NWF9VOCAqcEJ1ZjEsCisgICAgICAgIE9NWF9VOCAqcEJ1ZjIsCisgICAgICAgIE9NWF9JTlQgZWxlbVNpemUKKyAgICAgICApCit7CisgICAgT01YX0lOVCBpOworICAgIE9NWF9VOCB0ZW1wOworICAgIGFybVJldEFyZ0VycklmKCFwQnVmMSB8fCAhcEJ1ZjIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBmb3IoaSA9IDA7IGkgPCBlbGVtU2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICoocEJ1ZjEgKyBpKTsKKyAgICAgICAgKihwQnVmMSArIGkpID0gKihwQnVmMiArIGkpOworICAgICAgICAqKHBCdWYyICsgaSkgPSB0ZW1wOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycworICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKKyAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKKyAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtTWVkaWFuT2YzICgKKyAgICBPTVhfUzMyIGZFbnRyeSwKKyAgICBPTVhfUzMyIHNFbnRyeSwgCisgICAgT01YX1MzMiB0RW50cnkgCispCit7CisgICAgT01YX1MzMiBhLCBiLCBjOworICAgIAorICAgIGEgPSBhcm1NaW4gKGZFbnRyeSwgc0VudHJ5KTsKKyAgICBiID0gYXJtTWF4IChmRW50cnksIHNFbnRyeSk7CisgICAgYyA9IGFybU1pbiAoYiwgdEVudHJ5KTsKKyAgICByZXR1cm4gKGFybU1heCAoYSwgYykpOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgICAgUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHBvc2l0aXZlIHZhbHVlLiAKKyAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc21hbGxlc3Qgaz49MCBzdWNoIHRoYXQgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gKDE8PGspLgorICovIAorIAorT01YX1U4IGFybUxvZ1NpemUgKAorICAgIE9NWF9VMTYgdmFsdWUgCispCit7CisgICAgT01YX1U4IGk7ICAgIAorICAgIGZvciAoIGkgPSAwOyB2YWx1ZSA+IDA7IHZhbHVlID0gdmFsdWUgPj4gMSkgCisgICAgeworICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRBZGRfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKKyAgICB7CisgICAgICAgIC8qU2FtZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0QWRkX1M2NChPTVhfUzY0IFZhbHVlMSxPTVhfUzY0IFZhbHVlMikKK3sKKyAgICBPTVhfUzY0IFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCisgICAgeworICAgICAgICAvKlNhbWUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgUmVzdWx0ID0gT01YX01BWF9TNjQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1M2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKKyAqIAorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRTdWJfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPCAwKQorICAgIHsKKyAgICAgICAgLypPcHBvc2l0ZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCisgKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICoqLworCitPTVhfUzMyIGFybVNhdE1hY19TMzIoT01YX1MzMiBNYWMsT01YX1MxNiBWYWx1ZTEsT01YX1MxNiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gKE9NWF9TMzIpKFZhbHVlMSpWYWx1ZTIpOworICAgIFJlc3VsdCA9IGFybVNhdEFkZF9TMzIoIE1hYyAsIFJlc3VsdCApOworCisgICAgcmV0dXJuIFJlc3VsdDsgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMihPTVhfUzMyIG1hYywgT01YX1MzMiBkZWxheUVsZW0sIE9NWF9TMTYgZmlsVGFwICkKK3sKKyAgICAKKyAgICBPTVhfUzMyIHJlc3VsdDsKKworICAgIHJlc3VsdCA9IGFybVNhdE11bFMxNlMzMl9TMzIoZmlsVGFwLGRlbGF5RWxlbSk7IAorCisgICAgaWYgKCByZXN1bHQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXN1bHQgPSBPTVhfTUFYX1MzMjsKKyAgICB9CisgICAgZWxzZSBpZiggcmVzdWx0IDwgT01YX01JTl9TMTYgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gT01YX01JTl9TMzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGRlbGF5RWxlbSAqIGZpbFRhcDsKKyAgICB9CisKKyAgICBtYWMgPSBhcm1TYXRBZGRfUzMyKG1hYyxyZXN1bHQpOworICAgIAorICAgIHJldHVybiBtYWM7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKKyAqCisgKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodC9MZWZ0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzaGlmdCApICkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgorICogW2luXSBzaGlmdCBUaGUgc2hpZnQgbnVtYmVyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KE9NWF9TMzIgaW5wdXQsIE9NWF9JTlQgc2hpZnQpCit7CisgICAgaW5wdXQgPSBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoaW5wdXQsLXNoaWZ0KTsKKworICAgIGlmICggaW5wdXQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgfQorICAgIGVsc2UgaWYgKGlucHV0IDwgT01YX01JTl9TMTYpCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIChPTVhfUzE2KWlucHV0OworICAgIH0KKworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICogICAgIAorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBTaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKE9NWF9TMzIgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCit7CisgICAgT01YX0lOVCBpOworICAgIAorICAgIGlmIChTaGlmdCA8IDApCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDsKKyAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCAoMSA8PCAoU2hpZnQgLSAxKSkpOworICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoT01YX1M2NCBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgaWYgKFNoaWZ0IDwgMCkKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OworICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsICgoT01YX1M2NCkxIDw8IChTaGlmdCAtIDEpKSk7CisgICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsIFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoT01YX1MxNiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCit7CisgICAgT01YX1MxNiBoaTIsbG8xOworICAgIE9NWF9VMTYgbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDI7CisgICAgT01YX1MzMiByZXN1bHQ7CisgICAgCisgICAgbG8xICA9IGlucHV0MTsKKworICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKKyAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7CisgICAgCisgICAgdGVtcDEgPSBoaTIgKiBsbzE7CisgICAgdGVtcDIgPSAoIGxvMiogbG8xICkgPj4gMTY7CisKKyAgICByZXN1bHQgPSAgYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMihPTVhfUzMyIGlucHV0MSxPTVhfUzMyIGlucHV0MikKK3sKKyAgICBPTVhfUzE2IGhpMSxoaTI7CisgICAgT01YX1UxNiBsbzEsbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDIsdGVtcDM7CisgICAgT01YX1MzMiByZXN1bHQ7CisKKyAgICBoaTEgID0gKCBpbnB1dDEgPj4gIDE2ICk7CisgICAgbG8xICA9ICggKE9NWF9VMzIpKCBpbnB1dDEgPDwgMTYgKSA+PiAxNiApOworCisgICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOworICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKKyAgICAKKyAgICB0ZW1wMSA9ICAgaGkxICogaGkyOworICAgIHRlbXAyID0gKCBoaTEqIGxvMiApID4+IDE2OworICAgIHRlbXAzID0gKCBoaTIqIGxvMSApID4+IDE2OworCisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMihyZXN1bHQsdGVtcDMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKKyAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybworICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAorICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKQoreworICAgIE9NWF9GNjQgcmVzdWx0OworICAgIAorICAgIHJlc3VsdCA9ICgoT01YX0Y2NClOdW0pLygoT01YX0Y2NClEZW5vKTsKKyAgICAKKyAgICBpZiAocmVzdWx0ID49IDApCisgICAgeworICAgICAgICByZXN1bHQgKz0gMC41OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgLT0gMC41OworICAgIH0KKworICAgIHJldHVybiAoT01YX1MzMikocmVzdWx0KTsKK30KKworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmOTMxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLi4zMgorICoKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKworICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKyAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogUmV0dXJuIE4gYml0cyAqLworICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKKworT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAKKyAgICBpZihOID09IDApCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLworICAgIE9mZnNldCArPSBOOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7CisKKyAgICAvKiBSZXR1cm4gTiBiaXRzICovCisgICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKK3sKKyAgICBpZigqcE9mZnNldCA+IDApCisgICAgeworICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKKyAgICAgICAgKnBPZmZzZXQgPSAwOworICAgIH0gICAgCit9CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKKworT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKK3sKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgIAorICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCisgICAgT2Zmc2V0ICs9IE47CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCisgKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKKyAqIHBvaW50ZWQgYnkgcENvZGVCb29rCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIHBDb2RlQm9vaworICogCisgKiBbb3V0XSAgICAqcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisjaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAorCitPTVhfVTE2IGFybVVuUGFja1ZMQzMyKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKKykKK3sgICAgCisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICBPTVhfSU5UIEluZGV4OworICAgICAgICAKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAorICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCisgICAgeworICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKKyAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKKyAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBJbmRleDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIHBDb2RlQm9vaysrOworICAgIH0KKworICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KKyAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOworfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrQml0cyAoCisgICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIE9NWF9VMzIgY29kZVdvcmQsIAorICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKKykKK3sKKyAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAgICAgCisgICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCisgICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7CisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOworICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOworCisgICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCisgICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCisgICAgeworICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKKyAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOworICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7CisgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7CisgICAgfQorCisgICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLworICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7CisgICAgCisgICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOworfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKykKK3sKKyAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKK30KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvYXJtVkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmE3NzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvYXJtVkMuaApAQCAtMCwwICsxLDExNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiBhcm1WaWRlby5oCisgKiBCcmllZjogRGVjbGFyZXMgQVBJJ3MvQmFzaWMgRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1BWCBWaWRlbyBkb21haW4KKyAqCisgKi8KKworCisjaWZuZGVmIF9hcm1WaWRlb19IXworI2RlZmluZSBfYXJtVmlkZW9fSF8KKworI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyoqCisgKiBBUk0gc3BlY2lmaWMgc3RhdGUgc3RydWN0dXJlIHRvIGhvbGQgTW90aW9uIEVzdGltYXRpb24gaW5mb3JtYXRpb24uCisgKi8KKyAKK3N0cnVjdCBtNHAyX01FU3BlYworeworICAgIE9NWFZDTTRQMk1FUGFyYW1zIE1FUGFyYW1zOworICAgIE9NWFZDTTRQMk1FTW9kZSAgIE1FTW9kZTsKK307CisKK3N0cnVjdCBtNHAxMF9NRVNwZWMKK3sKKyAgICBPTVhWQ000UDEwTUVQYXJhbXMgTUVQYXJhbXM7CisgICAgT01YVkNNNFAxME1FTW9kZSAgIE1FTW9kZTsKK307CisKK3R5cGVkZWYgc3RydWN0IG00cDJfTUVTcGVjICBBUk1WQ000UDJfTUVTcGVjOwordHlwZWRlZiBzdHJ1Y3QgbTRwMTBfTUVTcGVjIEFSTVZDTTRQMTBfTUVTcGVjOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ29tcGFyZU1WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIHRoZQorICogYmVzdCBNViBhbmQgU0FECisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgbXZYICAgICB4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBtdlkgICAgIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGNhbmRTQUQgQ2FuZGlkYXRlIFNBRAorICogW2luXSAgICAgYmVzdE1WWCB4IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgYmVzdE1WWSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgYmVzdFNBRCBiZXN0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHNhZCBpcyB0aGUgYmVzdAorICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAorICovCisKK09NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCisgICAgT01YX1MxNiBtdlgsCisgICAgT01YX1MxNiBtdlksCisgICAgT01YX0lOVCBjYW5kU0FELAorICAgIE9NWF9TMTYgYmVzdE1WWCwKKyAgICBPTVhfUzE2IGJlc3RNVlksCisgICAgT01YX0lOVCBiZXN0U0FEKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0FDRENQcmVkaWN0CisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCisgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jaworICogW2luXSBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtpbl0gY3VyUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2suCisgKiBbaW5dIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworICogW2luXSBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKiBbaW5dIEFDUHJlZEZsYWcgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00CisgKiBbaW5dIHZpZGVvQ29tcCAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiBbaW5dIGZsYWcgICAgICAgIFRoaXMgZmxhZyBkZWZpbmVzIHRoZSBpZiBvbmUgd2FudHMgdG8gdXNlIHRoaXMgZnVuY3Rpb25zIHRvCisgKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQUUYgKHNldCAxLCBwcmVkaWN0aW9uKSBvciBRRiAoc2V0IDAsIHJlY29uc3RydWN0aW9uKQorICogW291dF0gICAgcFByZUFDUHJlZGljdCAgIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxlZCBPTkxZIGlmIGl0IGlzIG5vdCBOVUxMCisgKiBbb3V0XSAgICBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sKKyAqIFtvdXRdICAgIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW291dF0gICAgcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbb3V0XSAgICBwU3VtRXJyICAgICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIHN1bSBvZiB0aGUgZGlmZmVyZW5jZQorICogICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIHVucHJlZGljdGVkIGNvZWZmaWNpZW50cworICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBOVUxMLCBkbyBub3QgdXBkYXRlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCisgICAgIE9NWF9TMTYgKiBwU3JjRHN0LAorICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCisgICAgIE9NWF9JTlQgY3VyUVAsCisgICAgIE9NWF9JTlQgcHJlZFFQLAorICAgICBPTVhfSU5UIHByZWREaXIsCisgICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgIHZpZGVvQ29tcCwKKyAgICAgT01YX1U4IGZsYWcsCisgICAgIE9NWF9JTlQgKnBTdW1FcnIKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCisgKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKKyAqIFtvdXRdICAgIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworICogW291dF0gICAgcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1NldFByZWREaXIoCisgICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfSU5UICpwcmVkRGlyLAorICAgICBPTVhfSU5UICpwcmVkUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludHJhIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LgorICogW2luXSBwUURjdEJsa0NvZWYgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBUaGlzIHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgICAgICAgICAgQUMgcHJlZGljdGlvbiBub3QgdXNlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHBhdHRlcm4gICAgICAgICBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBibG9jayBpcyBlbmNvZGVkCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YX1U4IHN0YXJ0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSB2aWRlb0NvbXAgICAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLCAKKyAgICAgT01YX1U4ICBzdGFydAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKKyAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4CisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCisgKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKKyAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAorICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCisgKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4CisgKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcworICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKyAgICBPTVhfVTMyIHN0b3JlUnVuLAorICAgIE9NWF9TMTYgKiBwRHN0LAorICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKKyAgICBPTVhfVTggIHNpZ24sCisgICAgT01YX1U4ICBsYXN0LAorICAgIE9NWF9VOCAgKiBpbmRleCwKKyAgICBjb25zdCBPTVhfVTggKiBwWmlnemFnVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9HZXRWTENCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCisgKiBbaW4vb3V0XSBwTGFzdCAgICAgICBwb2ludGVyIHRvIGxhc3Qgc3RhdHVzIGZsYWcKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAwCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMQorICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwwICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBWbGNUYWJsZUwwICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMSAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSBwVmxjVGFibGVMMSAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBMTUFYVGFibGVMMCAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcExNQVhUYWJsZUwxICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSBwUk1BWFRhYmxlTDAgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUk1BWFRhYmxlTDEgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW291dF1wRHN0CQkJICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKgkJCQkJCQlibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfR2V0VkxDQml0cyAoCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKwkJCSAgT01YX1MxNiAqIHBEc3QsCisJCQkgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKwkJCSAgT01YX1U4ICAgIHN0YXJ0LAkJCSAgCisJCQkgIE9NWF9VOCAgKiBwTGFzdCwKKwkJCSAgT01YX1U4ICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwLAorCQkJICBPTVhfVTggICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisJCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKKwkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAorICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispOworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNhbGN1bGF0aW5nIHRoZSBWTEMgYml0cyBkZXBlbmRpbmcgb24gdGhlIGVzY2FwZSB0eXBlIGFuZCBpbnNlcnQgCisgKiB0aGUgc2FtZSBpbiB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSAgcnVuICAgICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSAgbGV2ZWwgICAgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAorICogW2luXSAgcnVuUGx1cyAgICAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAorICogW2luXSAgbGV2ZWxQbHVzICAgICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQorICogW2luXSAgZk1vZGUgICAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgZXNjYXBlIG1vZGVzCisgKiBbaW5dICBsYXN0ICAgICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlICAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAorICogW2luXSAgcFZsY1RhYmxlICAgICAgICAgIFZMQyB0YWJsZSBkZWZpbmVkIGluIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAorICogW291dF0gcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCisgICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgT01YX1UzMiBydW4sCisgICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWwsIAorCQkJICBPTVhfVTMyIHJ1blBsdXMsCisgICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLCAKKyAgICAgICAgICAgICAgT01YX1U4ICBmTW9kZSwKKwkJCSAgT01YX1U4ICBsYXN0LAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywgCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAorICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQorICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKgorICogICAgICAgICAgICAgICAgICAgICAgCisgKiBSZXR1cm4gVmFsdWU6CisgKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMworICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCisgKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKKyAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KKyAqCisgKi8KKworT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCisgICAgIE9NWF9VMzIgcnVuLAorICAgICBPTVhfVTMyIHJ1blBsdXMsCisgICAgIE9NWF9TMTYgbGV2ZWwsCisgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAorICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAorICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQorKTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICAKKyAqIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCAKKyAqIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSAKKyAqIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgCisgKiBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdCAKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4gCisgKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsIAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIgCisgKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00CisgKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgCisgKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zCXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCQkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgorICogW2luXSBwU3JjUHJlU0FECQlwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpCisgKiBbaW5dIHNlYXJjaFJhbmdlCQlzZWFyY2ggcmFuZ2UgZm9yIDE2WDE2IGludGVnZXIgYmxvY2ssdGhlIHVuaXRzIG9mIGl0IGlzIGZ1bGwgcGl4ZWwsdGhlIHNlYXJjaCByYW5nZSAKKyAqICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBpbiBhbGwgZGlyZWN0aW9ucy5JdCBpcyBpbiBpbmNsdXNpdmUgb2YgdGhlIGJvdW5kYXJ5IGFuZCBzcGVjaWZpZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cy4KKyAqIFtpbl0gcE1FU3BlYwkJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCisgKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyAKKyAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XQlwRHN0TVYJCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF0JcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yLgorICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cworICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICAgdm9pZCAqcE1FU3BlYywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRCwKKyAgICAgT01YX1U4IEJsb2NrU2l6ZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIGVzdGltYXRlZCAKKyAqIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCAKKyAqIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCAKKyAqIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCAKKyAqIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIAorICogc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gIAorICogVGhlIGZ1bmN0aW9uIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAorICogICAgICAgICAgICAgICAgICAgIHRoZQljdXJyZW50IHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlCisgKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgCisgKiAgICAgICAgICAgICAgICAgICAgKGxpbmVhciBhcnJheSwgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqIFtpbl0JcFNlYXJjaFBvaW50UmVmUG9zCXBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCBzZWFyY2ggKHNwZWNpZmllZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXQlybmRWYWwJCQkgIHJvdW5kaW5nIGNvbnRyb2wgYml0IGZvciBoYWxmIHBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAwPXJvdW5kaW5nIGNvbnRyb2wgZGlzYWJsZWQ7IDE9cm91bmRpbmcgY29udHJvbCBlbmFibGVkCisgKiBbaW5dCXBTcmNEc3RNVgkJcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCBkdXJpbmcgYSBwcmlvciAKKyAqICAgICAgICAgICAgICAgICAgMTZYMTYgaW50ZWdlciBzZWFyY2ggYW5kIGl0cyB1bml0IGlzIGhhbGYgcGl4ZWwuCisgKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgorICogW291dF1wU3JjRHN0TVYJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cworICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRCwKKyAgICAgT01YX1U4IEJsb2NrU2l6ZQorKTsKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9QYWRNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwYWRkaW5nIGZvciBhIG1hY3JvYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrCisgKiBbaW5dIHBUcmFuc3AgICAgICAgICBwb2ludGVyIHRvIHRyYW5zcGFyZW50IHN0YXR1cyBidWZmZXIgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jaworICogW291dF0gICAgcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgaW4gd2hpY2ggdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIGhhdmUgYmVlbiBwYWRkZWQKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1BhZE1WKAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNEc3RNViwKKyAgICAgT01YX1U4ICogcFRyYW5zcAorKTsKKworLyogCisgKiBILjI2NCBTcGVjaWZpYyBEZWNsYXJhdGlvbnMgCisgKi8KKy8qIERlZmluZXMgKi8KKyNkZWZpbmUgQVJNX000UDEwX1FfT0ZGU0VUICAgICAgICAoMTUpCisKKworLyogRGVxdWFudCB0YWJsZXMgKi8KKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFsxNl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sMngyWzRdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ZNYXRyaXhbNl1bM107CitleHRlcm4gY29uc3QgT01YX1UzMiBhcm1WQ000UDEwX01GTWF0cml4WzZdWzNdOworCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB0aGUgd29yayByZXF1aXJlZCBieSB0aGUgT3Blbk1BWAorICogRGVjb2RlQ29lZmZzVG9QYWlyIGZ1bmN0aW9uIGFuZCBEZWNvZGVDaHJvbWFEQ0NvZWZmc1RvUGFpci4KKyAqIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29tbW9uIHdlIHNoYXJlIGl0IGhlcmUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAorICoJCQkJCQkJCWJsb2NrICg0LDE1IG9yIDE2KQorICogW2luXQluVGFibGUgICAgICAgICAgVGFibGUgbnVtYmVyICgwIHRvIDQpIGFjY29yZGluZyB0byB0aGUgZml2ZSBjb2x1bW5zCisgKiAgICAgICAgICAgICAgICAgICAgICBvZiBUYWJsZSA5LTUgaW4gdGhlIEguMjY0IHNwZWMKKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKworICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBuVGFibGUsCisgICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKKyApOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGF2ZXJhZ2luZyB1cHBlciBhbmQgbGVmdCBibG9jaworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKKyAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKKyAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKKyAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKKyAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgNHg0IGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDJ4MiBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBEZWJsb2NrIG9uZSBib3VuZGFyeSBwaXhlbAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBRMCAgICAgICAgIFBvaW50ZXIgdG8gcGl4ZWwgcTAKKyAqIFtpbl0gU3RlcCAgICAgICAgU3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEKKyAqIFtpbl0gdEMwICAgICAgICAgRWRnZSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYWxwaGEgICAgICAgYWxwaGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJldGEgICAgICAgIGJldGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJTICAgICAgICAgIGRlYmxvY2tpbmcgc3RyZW5ndGgKKyAqIFtpbl0gQ2hyb21hRmxhZyAgVHJ1ZSBmb3IgY2hyb21hIGJsb2NrcworICogW291dF0gcFEwICAgICAgICBEZWJsb2NrZWQgcGl4ZWxzCisgKiAKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAorICAgIE9NWF9VOCAqcFEwLCAgICAvKiBwb2ludGVyIHRvIHRoZSBwaXhlbCBxMCAqLworICAgIGludCBTdGVwLCAgICAgICAvKiBzdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMSAqLworICAgIGludCB0QzAsICAgICAgICAvKiBlZGdlIHRocmVzaG9sZCB2YWx1ZSAqLworICAgIGludCBhbHBoYSwgICAgICAvKiBhbHBoYSAqLworICAgIGludCBiZXRhLCAgICAgICAvKiBiZXRhICovCisgICAgaW50IGJTLCAgICAgICAgIC8qIGRlYmxvY2tpbmcgc3RyZW5ndGggKi8KKyAgICBpbnQgQ2hyb21hRmxhZworKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorIAkJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbb3V0XQlwRHN0CSAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAorICAgICAgICBjb25zdCBPTVhfVTgqCQlwU3JjLCAKKwkJT01YX1UzMiAJaVNyY1N0ZXAsIAorCQlPTVhfVTgqIAlwRHN0LCAKKwkJT01YX1UzMiAJaURzdFN0ZXAsIAorCQlPTVhfVTMyIAlpV2lkdGgsIAorCQlPTVhfVTMyIAlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW291dF0JcERzdCAgICAJUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKAkKKwkgY29uc3QgT01YX1U4KiAJcFNyYywgCisJIE9NWF9VMzIgCWlTcmNTdGVwLCAKKyAJIE9NWF9VOCogCXBEc3QsCisgCSBPTVhfVTMyIAlpRHN0U3RlcCwgCisgCSBPTVhfVTMyIAlpV2lkdGgsIAorIAkgT01YX1UzMiAJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yICgxLzIsIDEvMikgIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlICgxLzIsMS8yKS1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYSggIAorICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIEZvcndhcmQgVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKKworT01YX0lOVCBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCisgICAgT01YX1MxNiAgbXZYLAorICAgIE9NWF9TMTYgIG12WSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIAorICAgIE9NWF9JTlQgY2FuZFNBRCwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKmJlc3RNViwgCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0KTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX1NBRAorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIFNBRCBmb3IgTnhNIGJsb2Nrcy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFtpbl0JCXBTcmNPcmcJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlpU3RlcE9yZwlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKKyAqIFtpbl0JCXBTcmNSZWYJCVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jaworICogW2luXQkJaVN0ZXBSZWYJU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQlXaWR0aCBvZiB0aGUgYmxvY2sKKyAqIFtvdXRdCXBEc3RTQUQJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ0NPTU1fU0FEKAkKKwljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAorCU9NWF9VMzIgCWlTdGVwT3JnLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJT01YX1UzMiAJaVN0ZXBSZWYsCisJT01YX1MzMioJcERzdFNBRCwKKwlPTVhfVTMyCQlpSGVpZ2h0LAorCU9NWF9VMzIJCWlXaWR0aCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9BdmVyYWdlCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQuCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBQcmVkMAkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMAorICoJW2luXQlwUHJlZDEJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaVByZWRTdGVwMAkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMAorICoJW2luXQlpUHJlZFN0ZXAxCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlEc3RTdGVwIAkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKglbaW5dCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9ja3MKKyAqCVtpbl0JaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2tzCisgKglbb3V0XQlwRHN0UHJlZAkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ0NPTU1fQXZlcmFnZSAoCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQorCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAorCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAorCSBPTVhfVTgqCQlwRHN0UHJlZCwKKwkgT01YX1UzMgkJaURzdFN0ZXAsIAorCSBPTVhfVTMyCQlpV2lkdGgsCisJIE9NWF9VMzIJCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfU0FEUXVhcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgCisgKiBhdmVyYWdlIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFtpbl0JCXBTcmMJCQkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKKyAqIFtpbl0JCXBTcmNSZWYwCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwCisgKiBbaW5dCQlwU3JjUmVmMQkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMQorICogW2luXQkJaVNyY1N0ZXAgCQlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKKyAqIFtpbl0JCWlSZWZTdGVwMAkJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqIFtpbl0JCWlSZWZTdGVwMSAJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqIFtpbl0JCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrCisgKiBbaW5dCQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2sKKyAqIFtvdXRdCXBEc3RTQUQJCQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9TQURRdWFyKAorCWNvbnN0IE9NWF9VOCogCXBTcmMsCisgICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQorICAgIE9NWF9VMzIgCWlTcmNTdGVwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCisgICAgT01YX1UzMioJcERzdFNBRCwKKyAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAorICAgIE9NWF9VMzIgICAgIGlXaWR0aAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCisgICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKKyAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgICAgIE9NWF9VMzIgICAgIGR4LAorICAgICAgICBPTVhfVTMyICAgICBkeQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCisgICAgIGNvbnN0IE9NWF9VOCAgICAgKnBTcmMsCisgICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsCisgICAgIE9NWF9VOCAgICAgKnBEc3QsCisgICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsCisgICAgIE9NWF9VMzIgICAgaVdpZHRoLAorICAgICBPTVhfVTMyICAgIGlIZWlnaHQsCisgICAgIE9NWF9VMzIgICAgZHgsCisgICAgIE9NWF9VMzIgICAgZHkKKyk7CisKKy8qKgorICogRnVuY3Rpb246IG9teFZDSDI2NF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4CisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsCisgKiBwZXJmb3JtIGRlcXVhbnRpc2F0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZgorICogcmVzaWR1YWxzIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwkJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24KKyAqCQkJCQkJCXBhaXIgYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW2luXQlwREMJCQlQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMCisgKgkJCQkJCQlpZiBpdCBkb2Vzbid0IGV4aXN0CisgKiBbaW5dCVFQCQkJUXVhbnRpemF0aW9uIHBhcmFtZXRlcgorICogW2luXSBBQyAgICAgICAgICBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIGNvZWZmaWNpZW50IGV4aXN0cworICogW291dF0JcERzdAkJcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgoCisgICAgIE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2ICpwRHN0LAorICAgICBPTVhfSU5UIFFQLAorICAgICBPTVhfUzE2KiBwREMsCisgICAgIGludCBBQworKTsKKworI2VuZGlmICAvKl9hcm1WaWRlb19IXyovCisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvb214VkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNjYzcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvb214VkMuaApAQCAtMCwwICsxLDQzODEgQEAKKy8qKgorICogRmlsZTogb214VkMuaAorICogQnJpZWY6IE9wZW5NQVggREwgdjEuMC4yIC0gVmlkZW8gQ29kaW5nIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKyAqCisgKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKKyAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCisgKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCisgKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAorICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAorICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAorICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCisgKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKKyAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAorICoKKyAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAorICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCisgKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKKyAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKKyAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAorICogbWF0ZXJpYWxzLgorICogCisgKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKgorICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9PTVhWQ19IXworI2RlZmluZSBfT01YVkNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiA2LjEuMS4xIE1vdGlvbiBWZWN0b3JzICAqLworLyogSW4gb214VkMsIG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMTYgZHg7CisgICAgT01YX1MxNiBkeTsKK30gT01YVkNNb3Rpb25WZWN0b3I7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAorICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAorICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKKyAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKKyAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCisgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAorICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAwLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKKyAgICBPTVhfVTggKnBEc3RQcmVkLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKKyAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKKyAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAorICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCisgKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCisgKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCisgKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKKyAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAorICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKKyAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKKyAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKKyAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKKyAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCisgKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAorICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdFBsYW5lLAorICAgIE9NWF9VMzIgaUZyYW1lV2lkdGgsCisgICAgT01YX1UzMiBpRnJhbWVIZWlnaHQsCisgICAgT01YX1UzMiBpRXhwYW5kUGVscywKKyAgICBPTVhfVTMyIGlQbGFuZVN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAorICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5OHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCisgKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5MTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBzdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgKDYuMS40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrOyBhbHNvIHJldHVybnMgU0FELiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZXMgKFNBRCkgdmFsdWUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmLCBwRHN0IGFuZCBwRHN0U0FELiAKKyAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCisgKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCisgKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCisgKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAorICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAorICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCisgKiAgICAgICAgICAgIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKKyAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAorICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICgKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgY29uc3QgT01YUmVjdCAqcFJlY3RWT1BSZWYsCisgICAgT01YX0lOVCBYY29vcmQsCisgICAgT01YX0lOVCBZY29vcmQsCisgICAgT01YX0lOVCBzaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCisgKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9TMzIqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKiA2LjIuMS4xIERpcmVjdGlvbiAgKi8KKy8qIFRoZSBkaXJlY3Rpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBBQy9EQyBwcmVkaWN0aW9uIGFuZCB6aWctemFnIHNjYW4uICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfTk9ORSAgICAgICA9IDAsCisgICAgT01YX1ZDX0hPUklaT05UQUwgPSAxLAorICAgIE9NWF9WQ19WRVJUSUNBTCAgID0gMiAKK307CisKKworCisvKiA2LjIuMS4yIEJpbGluZWFyIEludGVycG9sYXRpb24gICovCisvKiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBtb3Rpb24gZXN0aW1hdGlvbiwgbW90aW9uIGNvbXBlbnNhdGlvbiwgYW5kIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9ucy4gICovCisKK2VudW0geworICAgIE9NWF9WQ19JTlRFR0VSX1BJWEVMID0gMCwgLyogY2FzZSBhICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWCAgPSAxLCAvKiBjYXNlIGIgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9ZICA9IDIsIC8qIGNhc2UgYyAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1hZID0gMyAgLyogY2FzZSBkICovIAorfTsKKworCisKKy8qIDYuMi4xLjMgTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkgICovCisvKiBOZWlnaGJvcmluZyBtYWNyb2Jsb2NrIGF2YWlsYWJpbGl0eSBpcyBpbmRpY2F0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmbGFnczogICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfVVBQRVIgPSAxLCAgICAgICAgLyoqIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX0xFRlQgPSAyLCAgICAgICAgIC8qKiBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX0NFTlRFUiA9IDQsCisgICAgT01YX1ZDX1JJR0hUID0gOCwKKyAgICBPTVhfVkNfTE9XRVIgPSAxNiwKKyAgICBPTVhfVkNfVVBQRVJfTEVGVCA9IDMyLCAgLyoqIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfVVBQRVJfUklHSFQgPSA2NCwgLyoqIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX0xPV0VSX0xFRlQgPSAxMjgsCisgICAgT01YX1ZDX0xPV0VSX1JJR0hUID0gMjU2IAorfTsKKworCisKKy8qIDYuMi4xLjQgVmlkZW8gQ29tcG9uZW50cyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyB2aWRlbyBjb21wb25lbnRzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0xVTUlOQU5DRSwgICAgLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KKyAgICBPTVhfVkNfQ0hST01JTkFOQ0UgICAvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovIAorfSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudDsKKworCisKKy8qIDYuMi4xLjUgTWFjcm9ibG9ja1R5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfSU5URVIgICAgID0gMCwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUl9RICAgPSAxLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVEVSNFYgICA9IDIsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5UUkEgICAgID0gMywgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBX1EgICA9IDQsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWX1EgPSA1ICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLworfSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMi4xLjYgQ29vcmRpbmF0ZXMgICovCisvKiBDb29yZGluYXRlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfSU5UIHg7CisgICAgT01YX0lOVCB5OworfSBPTVhWQ000UDJDb29yZGluYXRlOworCisKKworLyogNi4yLjEuNyBNb3Rpb24gRXN0aW1hdGlvbiBBbGdvcml0aG1zICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1vdGlvbiBlc3RpbWF0aW9uIHNlYXJjaCBtZXRob2RzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX000UDJfRkFTVF9TRUFSQ0ggPSAwLCAgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLworICAgIE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIID0gMSAgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCit9IE9NWFZDTTRQMk1FTW9kZTsKKworCisKKy8qIDYuMi4xLjggTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KKy8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBjb250cm9sIHBhcmFtZXRlcnMgZm9yIAorICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfSU5UIHNlYXJjaEVuYWJsZTh4ODsgICAgIC8qKiBlbmFibGVzIDh4OCBzZWFyY2ggKi8KKyAgICBPTVhfSU5UIGhhbGZQZWxTZWFyY2hFbmFibGU7IC8qKiBlbmFibGVzIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KKyAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOyAgICAgICAgIC8qKiBzZWFyY2ggcmFuZ2UgKi8KKyAgICBPTVhfSU5UIHJuZFZhbDsgICAgICAgICAgICAgIC8qKiByb3VuZGluZyBjb250cm9sOyAwLWRpc2FibGVkLCAxLWVuYWJsZWQqLworfSBPTVhWQ000UDJNRVBhcmFtczsKKworCisKKy8qIDYuMi4xLjkgTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgLyogTUIgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIE9NWF9WQ19JTlRFUjQgKi8KKyAgICBPTVhfUzMyIHFwOyAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gcGFyYW1ldGVyKi8KKyAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLworICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzJdWzJdOyAgICAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPTB+MSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFsyXVsyXTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPSAwfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWF9VOCBwUHJlZERpclsyXVsyXTsgICAgICAgICAgIC8qIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIE9NWF9WQ19OT05FLCBPTVhfVkNfVkVSVElDQUwsIE9NWF9WQ19IT1JJWk9OVEFMIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBPTVhWQ000UDJNQkluZm8sICpPTVhWQ000UDJNQkluZm9QdHI7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAoNi4yLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBibG9jayB1c2luZyB0aGUgcHJvY2VkdXJlIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAgVGhlIHJlc3VsdGluZyBwcmVkaWN0ZWQgTVYgaXMgCisgKiByZXR1cm5lZCBpbiBwRHN0TVZQcmVkLiBJZiB0aGUgcGFyYW1ldGVyIHBEc3RNVlByZWRNRSBpZiBpcyBub3QgTlVMTCB0aGVuIAorICogdGhlIHNldCBvZiB0aHJlZSBNViBjYW5kaWRhdGVzIHVzZWQgZm9yIHByZWRpY3Rpb24gaXMgYWxzbyByZXR1cm5lZCwgCisgKiBvdGhlcndpc2UgcERzdE1WUHJlZE1FaXMgTlVMTCB1cG9uIHJldHVybi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY01WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFkgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjQ2FuZE1WMSAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCAKKyAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gTUIgdG8gdGhlIGxlZnQuIAorICogICBwU3JjQ2FuZE1WMiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCBpZiB0aGVyZSAKKyAqICAgICAgICAgICAgaXMgbm8gTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQi4gCisgKiAgIHBTcmNDYW5kTVYzIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIHJpZ2h0IGFuZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZXJlIGlzIG5vIE1CIGxvY2F0ZWQgdG8gdGhlIGFib3ZlLXJpZ2h0LiAKKyAqICAgaUJsayAtIHRoZSBpbmRleCBvZiBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICBwRHN0TVZQcmVkTUUgLSBNViBjYW5kaWRhdGUgcmV0dXJuIGJ1ZmZlcjsgIGlmIHNldCB0byBOVUxMIHRoZW4gCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gY2FuZGlkYXRlIE1WcyBhcmUgbm90IHJldHVybmVkIGFuZCBwRHN0TVZQcmVkTUUgd2lsbCAKKyAqICAgICAgICAgICAgYmUgTlVMTCB1cG9uIGZ1bmN0aW9uIHJldHVybjsgaWYgcERzdE1WUHJlZE1FIGlzIG5vbi1OVUxMIHRoZW4gaXQgCisgKiAgICAgICAgICAgIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBzdWZmaWNpZW50IHNwYWNlIGZvciB0aHJlZSAKKyAqICAgICAgICAgICAgcmV0dXJuIE1Wcy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNVlByZWQgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvciAKKyAqICAgcERzdE1WUHJlZE1FIC0gaWYgbm9uLU5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSAgcG9pbnRzIHVwb24gCisgKiAgICAgICAgICAgIHJldHVybiB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSB0aHJlZSBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZXMgCisgKiAgICAgICAgICAgIHVzZWQgZm9yIHByZWRpY3Rpb24gYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA3LjYuNSwgb3RoZXJ3aXNlIGlmIE5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSBpcyBOVUxMIAorICogICAgICAgICAgICB1cG9uIG91dHB1dC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICB0aGUgcG9pbnRlciBwRHN0TVZQcmVkIGlzIE5VTEwgCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgaUJsayBkb2VzIG5vdCBmYWxsIGludG8gdGhlIHJhbmdlIDAgPD0gaUJsazw9MyAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkN1ck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYzLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkTUUsCisgICAgT01YX0lOVCBpQmxrCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9JRENUOHg4YmxrICAgKDYuMi4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIGEgMkQgaW52ZXJzZSBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKKyAqIFtJU08xNDQ5Ni0yXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIGlucHV0IGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBBY2NvcmRpbmcgdG8gCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgdGhlIGlucHV0IGNvZWZmaWNpZW50IHZhbHVlcyBzaG91bGQgbGllIHdpdGhpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1Qgb3V0cHV0IGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfSURDVDh4OGJsayAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAoNi4yLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICBPTVhfVTMyICpwU2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVJbml0ICAgKDYuMi40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgCisgKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBGb2xsb3dpbmcgCisgKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKKyAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCisgKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCisgKiBybmRWYWwsIHNlYXJjaFJhbmdlLCBldGMuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgCisgKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDJfTUVHZXRCdWZTaXplLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVJbml0ICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zKnBNRVBhcmFtcywKKyAgICB2b2lkICpwTUVTcGVjCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAoNi4yLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAorICogbWluaW11bSBTQUQuIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIAorICogaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAorICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKKyAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBNQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAorICogICAgICAgICAgICB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKKyAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAorICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKKyAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuICBGb3IgZXhhbXBsZSwgaWYgcGFkZGluZyBleHRlbmRzIDQgcGl4ZWxzIGJleW9uZCAKKyAqICAgICAgICAgICAgZnJhbWUgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhlIGxlZnQgYm9yZGVyIGNvdWxkIGJlIHNldCB0byAKKyAqICAgICAgICAgICAgLTQuIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKKyAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAorICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKKyAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAorICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAorICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKKyAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAorICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKKyAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAoNi4yLjQuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIAorICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAorICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKKyAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKKyAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKKyAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKKyAqIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiBUaGUgZnVuY3Rpb24gCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKKyAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGkuZS4sIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gcG9pbnRlZCB0byBieSB0aGUgCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciAxNlgxNiBpbnRlZ2VyIHNlYXJjaDsgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WLgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvciAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAoNi4yLjQuMi40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiA4eDggaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfOHg4LiBUaGUgZnVuY3Rpb24gCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCisgKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKKyAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDh4OCBpbnRlZ2VyIHNlYXJjaCwgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4yLjQuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIHNlYXJjaCBmb3IgYSAxNngxNiBtYWNyb2Jsb2NrLiAgU2VsZWN0cyBiZXN0IG1vdGlvbiBzZWFyY2ggCisgKiBzdHJhdGVneSBmcm9tIGFtb25nIGludGVyLTFNViwgaW50ZXItNE1WLCBhbmQgaW50cmEgbW9kZXMuICBTdXBwb3J0cyAKKyAqIGludGVnZXIgYW5kIGhhbGYgcGl4ZWwgcmVzb2x1dGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgTUIgaW4gdGhlIAorICogICAgICAgICAgICBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCisgKiAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBleHBlY3Qgc291cmNlIGRhdGEgb3V0c2lkZSB0aGUgcmVnaW9uIAorICogICAgICAgICAgICBib3VuZGVkIGJ5IHRoZSBNQiB0byBiZSBhdmFpbGFibGU7IGZvciBleGFtcGxlIGl0IGlzIG5vdCAKKyAqICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGd1YXJhbnRlZSB0aGUgYXZhaWxhYmlsaXR5IG9mIAorICogICAgICAgICAgICBwU3JjQ3VyckJ1ZlstU3JjQ3VyclN0ZXBdLCBpLmUuLCB0aGUgcm93IG9mIHBpeGVscyBhYm92ZSB0aGUgTUIgCisgKiAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZC4gCisgKiAgIHNyY0N1cnJTdGVwIC0gd2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGxhbmUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjUmVmU3RlcCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlLCBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gCisgKiAgICAgICAgICAgIHRoZSBpbWFnZSBvcmlnaW4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gCisgKiAgICAgICAgICAgIHN0cnVjdHVyZTsgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKKyAqICAgcE1CSW5mbyAtIGFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgbmVhcmJ5IE1CczogCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzBdIC0gcG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1sxXSAtIHBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1syXSAtIHBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzNdIC0gcG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIHRvIE5VTEwgaWYgdGhlIAorICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIE1CIGRvZXNuJ3QgZXhpc3QuICBGb3IgZWFjaCBNQiwgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgCisgKiAgICAgICAgICAgIG1lbWJlcnMgYXJlIHVzZWQ6ICAgIAorICogICAgICAgICAgICAtICAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlLCBlaXRoZXIgT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAorICogICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYgCisgKiAgICAgICAgICAgIC0gICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKKyAqICAgICAgICAgICAgICAgIGluIDEvMiBwaXhlbCB1bml0cyAKKyAqICAgICAgICAgICAgLSAgIHNsaWNlSUQgLSBudW1iZXIgb2YgdGhlIHNsaWNlIHRvIHdoaWNoIHRoZSBNQiBiZWxvbmdzIAorICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gIFRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2JweSBhbmQgY2JwYyBhcmUgCisgKiAgICAgICAgICAgIGlnbm9yZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbjogICAKKyAqICAgICAgICAgICAgICAtICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0Vi4gCisgKiAgICAgICAgICAgICAgLSAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCisgKiAgICAgICAgICAgICAgLSAgcE1WUHJlZFsyXVsyXSAtIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCisgKiAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBjYnB5IGFuZCBjYnBjIGFyZSBub3QgdXBkYXRlZCBieSB0aGUgZnVuY3Rpb24uIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgbWluaW11bSBTQUQgZm9yIElOVEVSMVYsIG9yIHN1bSBvZiBtaW5pbXVtIFNBRHMgCisgKiAgICAgICAgICAgIGZvciBJTlRFUjRWIAorICogICBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFNBRCB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgCisgKiAgICAgICAgICAgIDh4OCBsdW1hIGJsb2NrcyBpbiB0aGUgTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNQkludGVyLCBwTUJJbnRyYSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyciwgb3IgcERzdFNBRC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAorICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfVTE2ICpwRHN0U0FELAorICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRENUOHg4YmxrICAgKDYuMi40LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIGEgMkQgZm9yd2FyZCBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKKyAqIFtJU08xNDQ5Ni0yXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBpbnB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgSW5wdXQgdmFsdWVzIChwaXhlbCAKKyAqICAgICAgICAgICAgaW50ZW5zaXRpZXMpIGFyZSB2YWxpZCBpbiB0aGUgcmFuZ2UgWy0yNTUsMjU1XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgb3V0cHV0IGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCByZXR1cm5lZCBpZjoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCisgKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCisgKiAgICAgICAgICAgIDYuMS4zLjguIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50cmFfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAoNi4yLjQuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzLCBpbXBsZW1lbnRzIGludHJhIGJsb2NrIEFDL0RDIGNvZWZmaWNpZW50IAorICogcHJlZGljdGlvbiwgYW5kIHJlY29uc3RydWN0cyB0aGUgY3VycmVudCBpbnRyYSBibG9jayB0ZXh0dXJlIGZvciBwcmVkaWN0aW9uIAorICogb24gdGhlIG5leHQgZnJhbWUuICBRdWFudGl6ZWQgcm93IGFuZCBjb2x1bW4gY29lZmZpY2llbnRzIGFyZSByZXR1cm5lZCBpbiAKKyAqIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGJ1ZmZlcnMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBwaXhlbHMgb2YgY3VycmVudCBpbnRyYSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgY29udGFpbmluZyAKKyAqICAgICAgICAgICAgKChudW1fbWJfcGVyX3JvdyAqIDIgKyAxKSAqIDgpIGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gCisgKiAgICAgICAgICAgIENvZWZmaWNpZW50cyBhcmUgb3JnYW5pemVkIGludG8gYmxvY2tzIG9mIGVpZ2h0IGFzIGRlc2NyaWJlZCAKKyAqICAgICAgICAgICAgYmVsb3cgKEludGVybmFsIFByZWRpY3Rpb24gQ29lZmZpY2llbnQgVXBkYXRlIFByb2NlZHVyZXMpLiAgVGhlIAorICogICAgICAgICAgICBEQyBjb2VmZmljaWVudCBpcyBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgYnVmZmVyIGxvY2F0aW9ucyAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cy4gRWFjaCBncm91cCBvZiBlaWdodCByb3cgCisgKiAgICAgICAgICAgIGJ1ZmZlciBlbGVtZW50cyBjb21iaW5lZCB3aXRoIG9uZSBlbGVtZW50IGVpZ2h0IGVsZW1lbnRzIGFoZWFkIAorICogICAgICAgICAgICBjb250YWlucyB0aGUgY29lZmZpY2llbnQgcHJlZGljdG9ycyBvZiB0aGUgbmVpZ2hib3JpbmcgYmxvY2sgCisgKiAgICAgICAgICAgIHRoYXQgaXMgc3BhdGlhbGx5IGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgdG8gCisgKiAgICAgICAgICAgIGJlIGRlY29kZWQuIEEgbmVnYXRpdmUtdmFsdWVkIERDIGNvZWZmaWNpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgCisgKiAgICAgICAgICAgIG5laWdoYm9yaW5nIGJsb2NrIGlzIG5vdCBJTlRSQS1jb2RlZCBvciBvdXQgb2YgYm91bmRzLCBhbmQgCisgKiAgICAgICAgICAgIHRoZXJlZm9yZSB0aGUgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgaW52YWxpZC4gIFBvaW50ZXIgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgICAgICAgICAgY29udGFpbmluZyAxNiBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIENvZWZmaWNpZW50cyBhcmUgCisgKiAgICAgICAgICAgIG9yZ2FuaXplZCBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjIuMi41LiAgUG9pbnRlciBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IEFDIHByZWRpY3Rpb24gaXMgCisgKiAgICAgICAgICAgIHJlcXVpcmVkOyBBQyBwcmVkaWN0aW9uIGlzIGVuYWJsZWQgaWYgKnBTdW1FcnIgPj0wLCBidXQgdGhlIAorICogICAgICAgICAgICB2YWx1ZSBpcyBub3QgdXNlZCBmb3IgY29lZmZpY2llbnQgcHJlZGljdGlvbiwgaS5lLiwgdGhlIHN1bSBvZiAKKyAqICAgICAgICAgICAgYWJzb2x1dGUgZGlmZmVyZW5jZXMgc3RhcnRzIGZyb20gMCBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIEFDIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgaWYgKnBTdW1FcnIgPCAwIC4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIGFzIAorICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjguIAorICogICBjdXJRcCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIGJlbG9uZ3MgCisgKiAgIHBRcEJ1ZiAtIHBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXI7IHBRcEJ1ZlswXSAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggCisgKiAgICAgICAgICAgIGJsb2NrIGxlZnQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYSksIGFuZCBwUXBCdWZbMV0gY29udGFpbnMgCisgKiAgICAgICAgICAgIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IGJsb2NrIGFib3ZlIAorICogICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayAoUVBjKS4gIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIAorICogICAgICAgICAgICBibG9jayBpcyBvdXRzaWRlIG9mIHRoZSBWT1AgYm91bmQsIHRoZSBRcCB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgCisgKiAgICAgICAgICAgIHRoZSBpbnRyYSBwcmVkaWN0aW9uIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIAorICogICAgICAgICAgICBzdWItY2xhdXNlIDcuNC4zLjMsICBBZGFwdGl2ZSBBQyBDb2VmZmljaWVudCBQcmVkaWN0aW9uLiAgCisgKiAgIHNyY1N0ZXAgLSB3aWR0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gd2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCBidWZmZXI7IHBEc3RbMF0gY29udGFpbnMgCisgKiAgICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgREMgY29lZmZpY2llbnQ7IHRoZSByZW1haW5pbmcgZW50cmllcyBjb250YWluIHRoZSAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cyAod2l0aG91dCBwcmVkaWN0aW9uKS4gIFRoZSBwb2ludGVyIAorICogICAgICAgICAgICBwRHN0bXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKKyAqICAgICAgICAgICAgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAorICogICBwUHJlQUNQcmVkaWN0IC0gaWYgcHJlZGljdGlvbiBpcyBlbmFibGVkLCB0aGUgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgCisgKiAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgZGlmZmVyZW5jZXMgZm9yIAorICogICAgICAgICAgICBWTEMgZW5jb2RpbmcuIFRoZSBlbnRyeSBwUHJlQUNQcmVkaWN0WzBdaW5kaWNhdGVzIHByZWRpY3Rpb24gCisgKiAgICAgICAgICAgIGRpcmVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICB2YWx1ZXM6IE9NWF9WQ19OT05FIChwcmVkaWN0aW9uIGRpc2FibGVkKSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwuICBUaGUgZW50cmllcyAKKyAqICAgICAgICAgICAgcFByZUFDUHJlZGljdFsxXS1wUHJlQUNQcmVkaWN0WzddY29udGFpbiBwcmVkaWN0ZWQgQUMgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cy4gIElmIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgKCpwU3VtRXJyPDApIHRoZW4gdGhlIAorICogICAgICAgICAgICBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcmUgdW5kZWZpbmVkIHVwb24gcmV0dXJuIGZyb20gdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbiAKKyAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRlZCBBQyBjb2VmZmljaWVudCBlcnJvcnMsIAorICogICAgICAgICAgICBpLmUuLCBzdW0gb2YgdGhlIGFic29sdXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJlZGljdGVkIGFuZCAKKyAqICAgICAgICAgICAgdW5wcmVkaWN0ZWQgQUMgY29lZmZpY2llbnRzIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0LCBwUmVjLCAKKyAqICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUXBCdWYsIHBQcmVBQ1ByZWRpY3QsIHBTdW1FcnIuIAorICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwOyAKKyAqICAgIC0gICAgY3VyUVAgPD0gMCBvciBjdXJRUCA+PSAzMi4gCisgKiAgICAtICAgIHNyY1N0ZXAsIG9yIGRzdFN0ZXAgPD0gMCBvciBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkOiAuIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgOC1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICBwU3JjLCBwUmVjLiAgCisgKgorICogIE5vdGU6IFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAorICogICAgICAgIHVwZGF0ZSBwcm9jZWR1cmVzIGRlZmluZWQgaW4gc2VjdGlvbiBpbiA2LjIuMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTggKnBSZWMsCisgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCisgICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCisgICAgT01YX1MxNiAqcFByZUFDUHJlZGljdCwKKyAgICBPTVhfSU5UICpwU3VtRXJyLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfVTggY3VyUXAsCisgICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgKDYuMi40LjQuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEltcGxlbWVudHMgRENULCBhbmQgcXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzIG9mIHRoZSBpbnRlciBibG9jayAKKyAqIHdoaWxlIHJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIHJlc2lkdWFsLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgCisgKiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLXBvaW50ZXIgdG8gdGhlIHJlc2lkdWFscyB0byBiZSBlbmNvZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlIHJlc2lkdWFsczsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBlaXRoZXIgTlVMTCBvciAKKyAqICAgICAgICAgbm90IDE2LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgICAgIC0gcFNyYyAKKyAqICAgICAgICAgICAgLSBwRHN0CisgKiAgICAgICAgICAgIC0gcFJlYworICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfUzE2ICpwUmVjLAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi40LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAorICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIkludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZyIuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlKSBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAorICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX1U4IHBhdHRlcm4sCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAorICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKKyAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKKyAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKKyAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCisgKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCisgKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCisgKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCisgKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAorICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCisgKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZU1WICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZMZWZ0TUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAoNi4yLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyBhbmQgcGFkcyB0aGUgZm91ciBtb3Rpb24gdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBub24taW50cmEgUC1WT1AgCisgKiBtYWNyb2Jsb2NrLiAgRm9yIG1hY3JvYmxvY2tzIG9mIHR5cGUgT01YX1ZDX0lOVEVSNFYsIHRoZSBvdXRwdXQgTVYgaXMgCisgKiBwYWRkZWQgYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4xLjYuIE90aGVyd2lzZSwgZm9yIAorICogbWFjcm9ibG9ja3Mgb2YgdHlwZXMgb3RoZXIgdGhhbiBPTVhfVkNfSU5URVI0ViwgdGhlIGRlY29kZWQgTVYgaXMgY29waWVkIHRvIAorICogYWxsIGZvdXIgb3V0cHV0IE1WIGJ1ZmZlciBlbnRyaWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKKyAqICAgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlcnMgdG8gdGhlIAorICogICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCwgCisgKiAgICAgICAgICAgIHVwcGVyLCBhbmQgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCAKKyAqICAgICAgICAgICAgcmVzcGVjdGl2ZWx5OyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAgTm90ZTogCisgKiAgICAgICAgICAgIEFueSBuZWlnaGJvcmhvb2QgbWFjcm9ibG9jayBvdXRzaWRlIHRoZSBjdXJyZW50IFZPUCBvciB2aWRlbyAKKyAqICAgICAgICAgICAgcGFja2V0IG9yIG91dHNpZGUgdGhlIGN1cnJlbnQgR09CICh3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAKKyAqICAgICAgICAgICAgIDEgKSBmb3Igd2hpY2ggZ29iX2hlYWRlcl9lbXB0eSBpcyAgMCAgaXMgdHJlYXRlZCBhcyAKKyAqICAgICAgICAgICAgdHJhbnNwYXJlbnQsIGFjY29yZGluZyB0byBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gCisgKiAgIGZjb2RlRm9yd2FyZCAtIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgc3ludGF4IAorICogICBNQlR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUgaXMgbm90IGVxdWFsIHRvIAorICogICAgICAgICAgICBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIAorICogICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgc2FtZSBkZWNvZGVkIHZlY3Rvci4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3RNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIGZjb2RlRm9yd2FyZCBleGNlZWRzICgwLDddCisgKiAgICAtICAgIE1CVHlwZSBsZXNzIHRoYW4gemVybworICogICAgLSAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkxlZnRNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZVcHBlck1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WQ3VyTUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKKyAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKKyAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMC03XS4gCisgKiAgICAgICAgICAgIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0ICAgICAgTGVhc3R8IAorICogICAgICAgICAgICAgICAgICAgICpwQml0T2Zmc2V0ICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCisgKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZDsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb247IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMCwyXQorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWY6CisgKiAgICAtICAgIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiBtYXJrIGJpdHMgZXF1YWxzIHplcm8gCisgKiAgICAtICAgIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSAKKyAqICAgIC0gICAgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyBGTEMgdGFibGUuIAorICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKKyAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKKyAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCisgKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKKyAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKKyAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAorICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCisgKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlci1jb2RlZCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBjdXJyZW50IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnl0ZSByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbS4gVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyAKKyAqICAgICAgICAgICAgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBbMC03XS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZGVjb2Rpbmcgc3VjaCB0aGF0IGl0IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgc3RyZWFtIGJ5dGUgcmVmZXJlbmNlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQKKyAqICAgIC0gICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciwgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZSAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICg2LjIuNS4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCisgKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKKyAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAorICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAorICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKKyAqICAgICAgICAgICAgICB0cnVlOiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCisgKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCisgKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKKyAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAorICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAorICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKKyAqICAgICAgICAgICAgICB0cnVlOiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCisgKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAorICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKKyAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKKyAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCisgKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKKyAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKKyAqCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKKyAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKKyAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCisgKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAorICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAorICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCisgKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKKyAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCisgKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAorICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKKyAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKKyAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCisgKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQorICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAorICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBzdGVwLAorICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgIE9NWF9VOCBjdXJRUCwKKyAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX0lOVCBpbnRyYURDVkxDLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKKyAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAorICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCisgKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCisgKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKKyAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgUVAgPD0gMC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCisgKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCisgKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAorICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCisgKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAorICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKKyAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKKyAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAorICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAorICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAorICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAorICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KKyAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCisgICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCisgICAgT01YX0lOVCBjdXJRUCwKKyAgICBPTVhfSU5UIHByZWRRUCwKKyAgICBPTVhfSU5UIHByZWREaXIsCisgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgKDYuMi41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAorICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgc3JjU3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAorICogICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcFNyY1Jlc2lkdWUgLSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uIAorICogICAgICAgICAgICByZXNpZHVhbHM7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLCB0aGVuIAorICogICAgICAgICAgICBubyBwcmVkaWN0aW9uIGlzIGRvbmUsIG9ubHkgbW90aW9uIGNvbXBlbnNhdGlvbiwgaS5lLiwgdGhlIGJsb2NrIAorICogICAgICAgICAgICBpcyBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uIAorICogICBwcmVkaWN0VHlwZSAtIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIAorICogICAgICAgICAgICA2LjIuMS4yLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAgSWYgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcyBhcmUgCisgKiAgICAgICAgICAgIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwU3JjUmVzaWR1ZSBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIG9yIHBEc3QuIAorICogICAgLSAgICBlaXRoZXIgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBpbnZhbGlkIHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIHByZWRpY3RUeXBlLiAKKyAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBybmRWYWwgaXMgbm90IGVxdWFsIGVpdGhlciB0byAwIG9yIDEuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIHByZWRpY3RUeXBlLAorICAgIE9NWF9JTlQgcm5kVmFsCispOworCisKKworLyogNi4zLjEuMSBJbnRyYSAxNngxNiBQcmVkaWN0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzE2eDE2IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ18xNlgxNl9WRVJUID0gMCwgIC8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLworICAgIE9NWF9WQ18xNlgxNl9IT1IgPSAxLCAgIC8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsICovCisgICAgT01YX1ZDXzE2WDE2X0RDID0gMiwgICAgLyoqIEludHJhXzE2eDE2X0RDICovCisgICAgT01YX1ZDXzE2WDE2X1BMQU5FID0gMyAgLyoqIEludHJhXzE2eDE2X1BsYW5lICovIAorfSBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlOworCisKKworLyogNi4zLjEuMiBJbnRyYSA0eDQgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV80eDQgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDXzRYNF9WRVJUID0gMCwgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfNFg0X0hPUiA9IDEsICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsICovCisgICAgT01YX1ZDXzRYNF9EQyA9IDIsICAgICAgIC8qKiBJbnRyYV80eDRfREMgKi8KKyAgICBPTVhfVkNfNFg0X0RJQUdfREwgPSAzLCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKi8KKyAgICBPTVhfVkNfNFg0X0RJQUdfRFIgPSA0LCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9WUiA9IDUsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKi8KKyAgICBPTVhfVkNfNFg0X0hEID0gNiwgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KKyAgICBPTVhfVkNfNFg0X1ZMID0gNywgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9IVSA9IDggICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLyAKK30gT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGU7CisKKworCisvKiA2LjMuMS4zIENocm9tYSBQcmVkaWN0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0NIUk9NQV9EQyA9IDAsICAgIC8qKiBJbnRyYV9DaHJvbWFfREMgKi8KKyAgICBPTVhfVkNfQ0hST01BX0hPUiA9IDEsICAgLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCisgICAgT01YX1ZDX0NIUk9NQV9WRVJUID0gMiwgIC8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfQ0hST01BX1BMQU5FID0gMyAgLyoqIEludHJhX0Nocm9tYV9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGU7CisKKworCisvKiA2LjMuMS40IE1vdGlvbiBFc3RpbWF0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1vdGlvbiBlc3RpbWF0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIID0gMCwgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLworICAgIE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCA9IDEgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCit9IE9NWFZDTTRQMTBNRU1vZGU7CisKKworCisvKiA2LjMuMS41IE1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19QXzE2eDE2ICA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLworICAgIE9NWF9WQ19QXzE2eDggID0gMSwKKyAgICBPTVhfVkNfUF84eDE2ICA9IDIsCisgICAgT01YX1ZDX1BfOHg4ICA9IDMsCisgICAgT01YX1ZDX1BSRUYwXzh4OCAgPSA0LAorICAgIE9NWF9WQ19JTlRFUl9TS0lQICA9IDUsCisgICAgT01YX1ZDX0lOVFJBXzR4NCAgPSA4LAorICAgIE9NWF9WQ19JTlRSQV8xNngxNiAgPSA5LAorICAgIE9NWF9WQ19JTlRSQV9QQ00gPSAxMCAKK30gT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlOworCisKKworLyogNi4zLjEuNiBTdWItTWFjcm9ibG9jayBUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBzdWItbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19TVUJfUF84eDggPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfU1VCX1BfOHg0ID0gMSwKKyAgICBPTVhfVkNfU1VCX1BfNHg4ID0gMiwKKyAgICBPTVhfVkNfU1VCX1BfNHg0ID0gMyAKK30gT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlOworCisKKworLyogNi4zLjEuNyBWYXJpYWJsZSBMZW5ndGggQ29kaW5nIChWTEMpIEluZm9ybWF0aW9uICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1U4IHVUcmFpbGluZ19PbmVzOyAgICAgIC8qIFRyYWlsaW5nIG9uZXM7IDMgYXQgbW9zdCAqLworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lX1NpZ25zOyAvKiBUcmFpbGluZyBvbmVzIHNpZ25hbCAqLworICAgIE9NWF9VOCB1TnVtQ29lZmZzOyAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2Ygbm9uLXplcm8gY29lZnMsIGluY2x1ZGluZyB0cmFpbGluZyBvbmVzICovCisgICAgT01YX1U4IHVUb3RhbFplcm9zOyAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiB6ZXJvIGNvZWZzICovCisgICAgT01YX1MxNiBpTGV2ZWxzWzE2XTsgICAgICAgIC8qIExldmVscyBvZiBub24temVybyBjb2VmcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCisgICAgT01YX1U4IHVSdW5zWzE2XTsgICAgICAgICAgIC8qIFJ1bnMgZm9yIGxldmVscyBhbmQgdHJhaWxpbmcgb25lcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCit9IE9NWFZDTTRQMTBWTENJbmZvOworCisKKworLyogNi4zLjEuOCBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCisgICAgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgICAgICAgICAgLyogTUIgdHlwZSAqLworICAgIE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZSBzdWJNQlR5cGVbNF07IC8qIHN1Yi1ibG9jayB0eXBlICovCisgICAgT01YX1MzMiBxcHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGx1bWEgKi8KKyAgICBPTVhfUzMyIHFwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgY2hyb21hICovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0wfjMpICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCBSZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPSAwfjMpICovCisgICAgT01YX1U4IHBSZWZMMElkeFs0XTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgaW5kaWNlcyAqLworICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgSW50cmExNngxNlByZWRNb2RlOyAvKiBiZXN0IGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSAqLworICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzE2XTsgLyogYmVzdCBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoIGJsb2NrLCBwTVYwIGluZGV4ZWQgYXMgYWJvdmUgKi8KK30gT01YVkNNNFAxME1CSW5mbywgKk9NWFZDTTRQMTBNQkluZm9QdHI7CisKKworCisvKiA2LjMuMS45IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU4eDg7IC8qIGVuYWJsZXMgMTZ4OCwgOHgxNiwgOHg4ICovCisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlNHg0OyAvKiBlbmFibGUgc3BsaXR0aW5nIG9mIDh4NCwgNHg4LCA0eDQgYmxvY2tzICovCisgICAgT01YX1MzMiBoYWxmU2VhcmNoRW5hYmxlOworICAgIE9NWF9TMzIgcXVhcnRlclNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIGludHJhRW5hYmxlNHg0OyAgICAgIC8qIDE9ZW5hYmxlLCAwPWRpc2FibGUgKi8KKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlMTZ4MTY7ICAgIC8qIGludGVnZXIgcGl4ZWwgdW5pdHMgKi8KKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlOHg4OworICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U0eDQ7Cit9IE9NWFZDTTRQMTBNRVBhcmFtczsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCisgKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCisgKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAorICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAorICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfRFIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IRCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IVSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGFzIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCisgKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKKyAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCisgKiAgICAgICAgICAgIDAuLjE1KSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAorICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKKyAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKiBOb3RlOiAKKyAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgKDYuMy4zLjEuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBzYW1wbGVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHk9IAorICogICAgICAgICAgICAwLi43KS4gCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uNywgeSAKKyAqICAgICAgICAgICAgPSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwcmVkTW9kZSAtIEludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4zLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgY2hyb21hIGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCBwbGVhc2UgcmVmZXIgCisgKiAgICAgICAgICAgIHRvICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgOCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uNyksIG9yIHBbLTEseV0gKHkgPSAwLi43KSwgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogIE5vdGU6IHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCisgKiAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKiAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICg2LjMuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFydGVyLXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGx1bWEgTUIuIEl0IGlzIGFzc3VtZWQgdGhhdCAKKyAqIHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC0gcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAorICogICBkc3RTdGVwIC0gZGVzdGluYXRpb24gZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoIAorICogICBkeCAtIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICBkeSAtIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICByb2kgLSBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAorICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjogCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IHJvaS53aWR0aC4gCisgKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAsM10uIAorICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0IGJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCBvciAxNiwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX1MzMiBkc3RTdGVwLAorICAgIE9NWF9TMzIgZHgsCisgICAgT01YX1MzMiBkeSwKKyAgICBPTVhTaXplIHJvaQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKKyAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGguIAorICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOgorICogICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICBpZiByb2kud2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4gCisgKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uIAorICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLUFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC1BcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC1BcnJheSBvZiBzaXplIDE2IG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKTsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4uICBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCAKKyAqICAgICAgICAgICAgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTIAorICogICAgICAgICAgICAgIGlzIE5VTEwuIAorICogICAgRWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgCisgKiAgICAgICAgICAgICAgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKKyAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCisgKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBTdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgZm9yIAorICogICAgICAgICAgICBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgCisgKiAgICAgICAgICAgIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gQXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2Ugb2YgZWFjaCA0eDIgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzICh2YWx1ZXMgZm9yIGVhY2ggMngyIGNocm9tYSAKKyAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKS4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIAorICogICAgICAgICAgICBzYW1lIGFzIHRoZSBwQlMgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKKyAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAorICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gdGhlIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDh4OCkuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIGFycmF5IHN0ZXA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYWxwaGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCisgKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIGludGVybmFsIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGJldGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCisgKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBpbnRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggMng0IGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIEJTIHBhcmFtZXRlcnMgZm9yIGVhY2ggMngyIGNocm9tYSAKKyAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXI7IHZhbGlkIGluIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgCisgKiAgICAgICAgICAgIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gCisgKiAgICAgICAgICAgIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAorICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuCisgKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAorICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAorICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMThdLiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMzFdaXMgb3V0c2lkZSBvZiAKKyAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAorICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAorICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKKyAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAorICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAorICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDI1NV0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiAKKyAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCAgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKKyAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAorICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAorICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKKyAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAorICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAorICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAorICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCisgKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCisgKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9TMzIqcE9mZnNldCwKKyAgICBPTVhfVTggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTggKipwcFBvc0NvZWZidWYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAorICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKKyAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAorICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAorICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCisgKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAorICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgCisgKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAorICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCisgKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCisgKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAorICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAorICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCisgKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAorICoKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9TMzIgKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmLAorICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKKyAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICg2LjMuNC4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdHMgdGhlIDR4NCBMdW1hREMgYmxvY2sgZnJvbSB0aGUgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciAKKyAqIGJ1ZmZlciwgcGVyZm9ybXMgaW50ZWdlciBpbnZlcnNlLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDR4NCBMdW1hREMgCisgKiBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGVzIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi1lbXB0eSAKKyAqIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcFkgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgTHVtYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICgKKyAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAorICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKKyAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKKyAqIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAorICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKKyAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAorICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCisgKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCisgKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKKyAqIDEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKKyAqICAgICAgICAgICAgZXhpc3QgCisgKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKKyAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKKyAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAorICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZCwKKyAgICBjb25zdCBPTVhfUzE2ICpwREMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgcHJlZFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBBQworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKKyAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKKyAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAorICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAorICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAorICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCisgKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAorICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCisgKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAorICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKKyAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfTUVJbml0ICgKKyAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICB2b2lkICpwTUVTcGVjCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2s6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAorICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAorICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBhcmUgTlVMTDoKKyAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKKyAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdCwKKyAgICB2b2lkICpwTUVTcGVjCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgKDYuMy41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgaGFsZi1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2guIAorICogIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSAKKyAqIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIAorICogdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCAKKyAqIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6CisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAgCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAorICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCisgKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCisgKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKKyAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKKyAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKKyAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAorICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBoYWxmLXBlbCBzZWFyY2gsIAorICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQgcGVsIHVuaXRzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgcXVhcnRlci1wZWwgc2VhcmNoLCBleHByZXNzZWQgCisgKiAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCisgKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAorICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCisgKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKKyAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKKyAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAorICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKKyAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5URVIuIAorICogICAgICAgICAgICAtICBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRlclszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCisgKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAorICogICAgICAgICAgICBJTlRSQS4gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKKyAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uOiAgc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RDb3N0IC0gUG9pbnRlciB0byB0aGUgbWluaW11bSBtb3Rpb24gY29zdCBmb3IgdGhlIGN1cnJlbnQgTUIuIAorICogICBwRHN0QmxvY2tTQUQgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBTQURzIGZvciBlYWNoIG9mIHRoZSBzaXh0ZWVuIGx1bWEgCisgKiAgICAgICAgICAgIDR4NCBibG9ja3MgaW4gZWFjaCBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKKyAqICAgICAgICAgICAgZWFjaCBNQi4gIEZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW5ub3QgY29tcHV0ZSB0aGUgU0FEIHZhbHVlcyAKKyAqICAgICAgICAgICAgaW5kaXZpZHVhbGx5LCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSAoMHhmZmZmKSBpcyByZXR1cm5lZCAKKyAqICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIDE2IGJsb2NrIFNBRCBlbnRyaWVzLiAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uLiAgIFRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgcXVhbnRpZmllcyB0aGUgTUItbGV2ZWwgTUUgc2VhcmNoIHJlc3VsdHM6IAorICogICAgICAgICAgICAtICBNYlR5cGUgCisgKiAgICAgICAgICAgIC0gIHN1Yk1CVHlwZVs0XSAKKyAqICAgICAgICAgICAgLSAgcE1WMFs0XVs0XSAKKyAqICAgICAgICAgICAgLSAgcE1WUHJlZFs0XVs0XSAKKyAqICAgICAgICAgICAgLSAgcFJlZkwwSWR4WzRdIAorICogICAgICAgICAgICAtICBJbnRyYTE2eDE2UHJlZE1vZGUgCisgKiAgICAgICAgICAgIC0gIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCisgKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKKyAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAorICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFsxNV0sCisgICAgT01YX1MzMiBTcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwKKyAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBPTVhfVTMyIExhbWJkYSwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfSU5UICpwRHN0Q29zdCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCisgKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1UzMiBpUmVmU3RlcDAsCisgICAgT01YX1UzMiBpUmVmU3RlcDEsCisgICAgT01YX1UzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKKyAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1UzMiBpUmVmU3RlcDAsCisgICAgT01YX1UzMiBpUmVmU3RlcDEsCisgICAgT01YX1UzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQVREXzR4NCAgICg2LjMuNS40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN1bSBvZiBhYnNvbHV0ZSB0cmFuc2Zvcm0gZGlmZmVyZW5jZXMgKFNBVEQpIAorICogZm9yIGEgNHg0IGJsb2NrIGJ5IGFwcGx5aW5nIGEgSGFkYW1hcmQgdHJhbnNmb3JtIHRvIHRoZSBkaWZmZXJlbmNlIGJsb2NrIAorICogYW5kIHRoZW4gY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhYnNvbHV0ZSBjb2VmZmljaWVudCB2YWx1ZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwU3JjUmVmIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIGVpdGhlciBwU3JjT3JnIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3RlcE9yZyA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBVERfNHg0ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfVTMyICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAorICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAorICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAorICogICAgICAgICAgICAoLTEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAorICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCisgKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCisgKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdExlZnQsCisgICAgT01YX1U4ICpwRHN0UmlnaHQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlXaWR0aCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICg2LjMuNS41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAtIAorICogKDAsIC0xLzIpIGFuZCAoMCwgMS8yKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAorICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VXAgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGFib3ZlIAorICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgLTEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERvd24gLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGJlbG93IAorICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgMS8yKSAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmMsIHBEc3RVcCwgb3IgcERzdERvd24gCisgKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCisgKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RVcCwKKyAgICBPTVhfVTggKnBEc3REb3duLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICg2LjMuNS41LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDR4NCwgNHg4IGJsb2Nrcy4gIFRoZSByZXN1bHQgCisgKiBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMTsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3M7IG11c3QgYmUgZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgIHBQcmVkMCwgcFByZWQxLCBvciBwRHN0UHJlZCAKKyAqICAgIC0gICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLiAxLUlOVFJBLCAwLUlOVEVSIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgcFNyY0RzdCAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUCwKKyAgICBPTVhfVTggYkludHJhCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1UzMiBpUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiB0aGUgMngyIEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDggYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCisgKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCisgKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAorICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBtYXRyaXguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERlcXVhbnRDb2VmZiwKKyAgICBPTVhfVTggKnBEc3RSZWNvbiwKKyAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKKyAgICBPTVhfVTMyIGlEc3RSZWNvblN0ZXAsCisgICAgT01YX1U4IGJBQworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCisgKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCisgKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCisgKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAorICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCisgKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIDQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKKyAqICAgICAgICAgICAgb2YgNC4gCisgKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCisgKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKKyAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCisgKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKKyAqICAgICAgICAgICAgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAKKyAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKKyAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKKyAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCisgICAgT01YX1UzMiBpU3JjT3JnU3RlcCwKKyAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKKyAgICBPTVhfUzE2ICpwRHN0UXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRHN0RGVRdWFudENvZWZmLAorICAgIE9NWF9TMTYgKnBEQ0NvZWZmLAorICAgIE9NWF9TOCAqcE51bUNvZWZmLAorICAgIE9NWF9VMzIgblRocmVzaFNBRCwKKyAgICBPTVhfVTMyIGlRUCwKKyAgICBPTVhfVTggYkludHJhCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCisgKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCisgKiBzdHJ1Y3R1cmUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCisgKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCisgKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCisgKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAorICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCisgKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCisgKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCisgKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAorICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCisgKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAorICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCisgKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjQ29lZmYsCisgICAgY29uc3QgT01YX1U4ICpwU2Nhbk1hdHJpeCwKKyAgICBPTVhfVTggYkFDLAorICAgIE9NWF9VMzIgTWF4TnVtQ29lZiwKKyAgICBPTVhWQ000UDEwVkxDSW5mbypwRHN0VkxDSW5mbworKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiogZW5kIG9mICNkZWZpbmUgX09NWFZDX0hfICovCisKKy8qKiBFT0YgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTEwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDQ09NTV9BdmVyYWdlLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBpZiBzaXplIGlXaWR0aCBYIGlIZWlnaHQKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcworICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKKyAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCisJIE9NWF9VMzIJCWlQcmVkU3RlcDAsCisJIE9NWF9VMzIJCWlQcmVkU3RlcDEsCisJIE9NWF9VOCoJCXBEc3RQcmVkLAorCSBPTVhfVTMyCQlpRHN0U3RlcCwgCisJIE9NWF9VMzIJCWlXaWR0aCwKKwkgT01YX1UzMgkJaUhlaWdodAorKQoreworICAgIE9NWF9VMzIgICAgIHgsIHk7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFByZWQgW3kgKiBpRHN0U3RlcCArIHhdID0gCisgICAgICAgICAgICAgICAgKE9NWF9VOCkoKChPTVhfVTMyKXBQcmVkMCBbeSAqIGlQcmVkU3RlcDAgKyB4XSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVkMSBbeSAqIGlQcmVkU3RlcDEgKyB4XSArIDEpID4+IDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWFjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYwpAQCAtMCwwICsxLDc1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNDT01NX1NBRC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIE54TSBibG9ja3MKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKKyAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKKyAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCitPTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCisJY29uc3QgT01YX1U4KiAJcFNyY09yZywKKwlPTVhfVTMyIAlpU3RlcE9yZywKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAorCU9NWF9VMzIgCWlTdGVwUmVmLAorCU9NWF9TMzIqCXBEc3RTQUQsCisJT01YX1UzMgkJaUhlaWdodCwKKwlPTVhfVTMyCQlpV2lkdGgKKykKK3sKKyAgICBPTVhfSU5UICAgICB4LCB5OworICAgIAorICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIAorICAgICpwRHN0U0FEID0gMDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICAqcERzdFNBRCArPSBhcm1BYnMocFNyY09yZyBbKHkgKiBpU3RlcE9yZykgKyB4XSAtIAorICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVmIFsoeSAqIGlTdGVwUmVmKSArIHhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTQ0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICg2LjEuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAorICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKKyAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgOCBvciAxNi4gCisgKgorICovCisgT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzE2eCAoCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQorCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAorCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAorCSBPTVhfVTgqCQlwRHN0UHJlZCwKKwkgT01YX1UzMgkJaURzdFN0ZXAsIAorCSBPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdFByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMCA9PSAwKSB8fCAoaVByZWRTdGVwMCAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDEgPT0gMCkgfHwgKGlQcmVkU3RlcDEgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpRHN0U3RlcCA9PSAwKSB8fCAoaURzdFN0ZXAgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDQ09NTV9BdmVyYWdlIAorICAgICAgICAocFByZWQwLCBwUHJlZDEsIGlQcmVkU3RlcDAsIGlQcmVkU3RlcDEsIHBEc3RQcmVkLCBpRHN0U3RlcCwgMTYsIGlIZWlnaHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjEzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMKQEAgLTAsMCArMSw4NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9BdmVyYWdlXzh4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIDh4NCBvciA4eDggb3IgOHgxNiBibG9ja3MKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKKyAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAorICoKKyAqLworIE9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV84eCAoCQorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKyAgICAgT01YX1UzMgkJaVByZWRTdGVwMCwKKyAgICAgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisgICAgIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaUhlaWdodAorKQoreworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDAgPT0gMCkgfHwgKGlQcmVkU3RlcDAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDEgPT0gMCkgfHwgKGlQcmVkU3RlcDEgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlEc3RTdGVwID09IDApIHx8IChpRHN0U3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA0KSAmJiAoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0UHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDQ09NTV9BdmVyYWdlIAorICAgICAgICAocFByZWQwLCBwUHJlZDEsIGlQcmVkU3RlcDAsIGlQcmVkU3RlcDEsIHBEc3RQcmVkLCBpRHN0U3RlcCwgOCwgaUhlaWdodCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1OWFkZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCkBAIC0wLDAgKzEsODggQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGNvbXB1dGluZyB0aGUgZXJyb3IgZm9yIGEgTUIgb2Ygc2l6ZSA4eDgKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaygKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICAgT01YX1MxNiAqIHBEc3QKKykKK3sKKworICAgIE9NWF9JTlQgICAgIHgsIHksIGNvdW50OworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHNyY1N0ZXAgPD0gMCkgfHwgKHNyY1N0ZXAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBlcnJvciBibG9jayAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsKKyAgICAgICAgIHkgPCA4OworICAgICAgICAgeSsrLCBwU3JjICs9IHNyY1N0ZXApCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W2NvdW50XSA9IHBTcmNbeF0gLSBwU3JjUmVmW2NvdW50XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3MzFhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKQEAgLTAsMCArMSw5MyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGNvbXB1dGluZyB0aGUgZXJyb3IgZm9yIGEgTUIgb2Ygc2l6ZSA4eDgKKyAqIAorICovCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICAgT01YX0lOVCBzcmNTdGVwLAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisKKyAgICBPTVhfSU5UICAgICB4LCB5LCBjb3VudDsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChzcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgZXJyb3IgYmxvY2sgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsICpwRHN0U0FEID0gMDsKKyAgICAgICAgIHkgPCA4OworICAgICAgICAgeSsrLCBwU3JjICs9IHNyY1N0ZXApCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W2NvdW50XSA9IHBTcmNbeF0gLSBwU3JjUmVmW2NvdW50XTsKKyAgICAgICAgICAgICpwRHN0U0FEICs9IGFybUFicyhwRHN0W2NvdW50XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODU3MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMKQEAgLTAsMCArMSw3OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db3B5MTZ4MTYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIE1QRUc0IDE2eDE2IENvcHkgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKKyAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2KAorCQljb25zdCBPTVhfVTggKnBTcmMsIAorCQlPTVhfVTggKnBEc3QsIAorCQlPTVhfSU5UIHN0ZXApCisgeworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworCisgICAgT01YX0lOVCBjb3VudCxpbmRleCwgeCwgeTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoc3RlcCA8IDE2KSB8fCAoc3RlcCAlIDE2KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICAKKyAgICAvKiBDb3B5aW5nIHRoZSByZWYgMTZ4MTYgYmxrIHRvIHRoZSBjdXJyIGJsayAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwOyB5IDwgMTY7IHkrKywgY291bnQgPSBjb3VudCArIHN0ZXAgLSAxNikKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrLCBjb3VudCsrLCBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W2luZGV4XSA9IHBTcmNbY291bnRdOworICAgICAgICB9ICAgICAgIAorICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKyB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmOWRkZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYwpAQCAtMCwwICsxLDc5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0NvcHk4eDguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIE1QRUc0IDh4OCBDb3B5IG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCisgKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCgKKwkJY29uc3QgT01YX1U4ICpwU3JjLCAKKwkJT01YX1U4ICpwRHN0LCAKKwkJT01YX0lOVCBzdGVwKQorIHsKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKworICAgIE9NWF9JTlQgY291bnQsaW5kZXgsIHgsIHk7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChzdGVwIDwgOCkgfHwgKHN0ZXAgJSA4KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICAKKyAgICAvKiBDb3B5aW5nIHRoZSByZWYgOHg4IGJsayB0byB0aGUgY3VyciBibGsgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDg7IHkrKywgY291bnQgPSBjb3VudCArIHN0ZXAgLSA4KQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKywgaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtpbmRleF0gPSBwU3JjW2NvdW50XTsKKyAgICAgICAgfSAgICAgICAKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzZkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKKyAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKKyAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAorICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCisgKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCisgKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCisgKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKKyAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAorICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKKyAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKKyAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKKyAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKKyAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCisgKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAorICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0koCisJT01YX1U4KglwU3JjRHN0UGxhbmUsIAorCU9NWF9VMzIJaUZyYW1lV2lkdGgsIAorCU9NWF9VMzIJaUZyYW1lSGVpZ2h0LCAKKwlPTVhfVTMyCWlFeHBhbmRQZWxzLCAKKwlPTVhfVTMyCWlQbGFuZVN0ZXAKKykKK3sKKyAgICBPTVhfSU5UICAgICB4LCB5OworICAgIE9NWF9VOCogICAgIHBMZWZ0OworICAgIE9NWF9VOCogICAgIHBSaWdodDsKKyAgICBPTVhfVTgqICAgICBwVG9wOworICAgIE9NWF9VOCogICAgIHBCb3R0b207CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0UGxhbmUgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3RQbGFuZSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlGcmFtZVdpZHRoID09IDAgfHwgaUZyYW1lV2lkdGggJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpRnJhbWVIZWlnaHQ9PSAwIHx8IGlGcmFtZUhlaWdodCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlFeHBhbmRQZWxzID09IDAgfHwgaUV4cGFuZFBlbHMgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpUGxhbmVTdGVwID09IDAgfHwgaVBsYW5lU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLCAKKyAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIFRvcCBhbmQgQm90dG9tICovCisgICAgcFRvcCA9IHBTcmNEc3RQbGFuZSAtIChpRXhwYW5kUGVscyAqIGlQbGFuZVN0ZXApOworICAgIHBCb3R0b20gPSBwU3JjRHN0UGxhbmUgKyAoaUZyYW1lSGVpZ2h0ICogaVBsYW5lU3RlcCk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAoT01YX0lOVClpRnJhbWVXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwVG9wIFt5ICogaVBsYW5lU3RlcCArIHhdID0gCisgICAgICAgICAgICAgICAgcFNyY0RzdFBsYW5lIFt4XTsKKyAgICAgICAgICAgIHBCb3R0b20gW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKKyAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgWyhpRnJhbWVIZWlnaHQgLSAxKSAqIGlQbGFuZVN0ZXAgKyB4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIExlZnQsIFJpZ2h0IGFuZCBDb3JuZXJzICovCisgICAgcExlZnQgPSBwU3JjRHN0UGxhbmUgLSBpRXhwYW5kUGVsczsKKyAgICBwUmlnaHQgPSBwU3JjRHN0UGxhbmUgKyBpRnJhbWVXaWR0aDsKKworICAgIGZvciAoeSA9IC0oT01YX0lOVClpRXhwYW5kUGVsczsgeSA8IChPTVhfSU5UKShpRnJhbWVIZWlnaHQgKyBpRXhwYW5kUGVscyk7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAoT01YX0lOVClpRXhwYW5kUGVsczsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwTGVmdCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAorICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeSAqIGlQbGFuZVN0ZXAgKyAwXTsKKyAgICAgICAgICAgIHBSaWdodCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAorICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeSAqIGlQbGFuZVN0ZXAgKyAoaUZyYW1lV2lkdGggLSAxKV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0NTgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgbGltaXRpbmcgdGhlIE1WCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKKyAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKKyAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKKyAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKKyAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCisgKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCisgKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKKyAqICAgICAgICAgICAgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAorICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCisgKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QoCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBjb25zdCBPTVhSZWN0ICogcFJlY3RWT1BSZWYsCisgICAgIE9NWF9JTlQgWGNvb3JkLAorICAgICBPTVhfSU5UIFljb29yZCwKKyAgICAgT01YX0lOVCBzaXplCispCit7CisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY01WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWN0Vk9QUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc2l6ZSAhPSA4KSAmJiAoc2l6ZSAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigocFJlY3RWT1BSZWYtPndpZHRoIDwgKDIqIHNpemUpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwUmVjdFZPUFJlZi0+aGVpZ2h0IDwgKDIqIHNpemUpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIHBEc3RNVi0+ZHggPSBhcm1NaW4gKGFybU1heCAocFNyY01WLT5keCwgMipwUmVjdFZPUFJlZi0+eCAtIFhjb29yZCksCisgICAgICAgICAgICAgICAgICAgICgyKnBSZWN0Vk9QUmVmLT54ICsgcFJlY3RWT1BSZWYtPndpZHRoIC0gWGNvb3JkIC0gc2l6ZSkpOworICAgIHBEc3RNVi0+ZHkgPSBhcm1NaW4gKGFybU1heCAocFNyY01WLT5keSwgMipwUmVjdFZPUFJlZi0+eSAtIFljb29yZCksCisgICAgICAgICAgICAgICAgICAgICgyKnBSZWN0Vk9QUmVmLT55ICsgcFJlY3RWT1BSZWYtPmhlaWdodCAtIFljb29yZCAtIHNpemUpKTsKKworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwY2VkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYwpAQCAtMCwwICsxLDgwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX1NBRF8xNnguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCisgKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4KAorCQkJY29uc3QgT01YX1U4KiAJcFNyY09yZywKKwkJCU9NWF9VMzIgCWlTdGVwT3JnLAorCQkJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwkJCU9NWF9VMzIgCWlTdGVwUmVmLAorCQkJT01YX1MzMioJcERzdFNBRCwKKwkJCU9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcFJlZiA9PSAwKSB8fCAoaVN0ZXBSZWYgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCisgICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyMWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fU0FEXzh4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHgoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCisgICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMThhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKQEAgLTAsMCArMSwzNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRmlsZTogICAgIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiBIZWFkZXIgZmlsZSBmb3IgQVJNIGltcGxlbWVudGF0aW9uIG9mIE9wZW5NQVggVkNNNFAxMAorICogCisgKi8KKyAKKyNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisjZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAorICAKKy8qIENBVkxDIHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbNjJdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZls2Ml07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1s1XTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4WzE3XTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM107CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzddOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGUzNmFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCkBAIC0wLDAgKzEsNzAzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBDQVZMQyB0YWJsZXMgZm9yIEguMjY0CisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCisKKy8qIFRhYmxlcyBtYXBwaW5nIGEgY29kZSB0byBUcmFpbGluZ09uZXMgYW5kIFRvdGFsQ29lZmYgKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbNjJdID0geworIDAsCisgMCwgMSwKKyAwLCAxLCAyLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMworfTsKKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUb3RhbENvZWZmWzYyXSA9IHsKKyAwLAorIDEsIDEsCisgMiwgMiwgMiwKKyAzLCAzLCAzLCAzLAorIDQsIDQsIDQsIDQsCisgNSwgNSwgNSwgNSwKKyA2LCA2LCA2LCA2LAorIDcsIDcsIDcsIDcsCisgOCwgOCwgOCwgOCwKKyA5LCA5LCA5LCA5LAorIDEwLCAxMCwgMTAsIDEwLAorIDExLCAxMSwgMTEsIDExLAorIDEyLCAxMiwgMTIsIDEyLAorIDEzLCAxMywgMTMsIDEzLAorIDE0LCAxNCwgMTQsIDE0LAorIDE1LCAxNSwgMTUsIDE1LAorIDE2LCAxNiwgMTYsIDE2Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMFs2M10gPSB7CisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDA1IH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgOCwgMHgwMDA3IH0sCisgICAgeyAgNiwgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgOSwgMHgwMDA3IH0sCisgICAgeyAgOCwgMHgwMDA2IH0sCisgICAgeyAgNywgMHgwMDA1IH0sCisgICAgeyAgNSwgMHgwMDAzIH0sCisgICAgeyAxMCwgMHgwMDA3IH0sCisgICAgeyAgOSwgMHgwMDA2IH0sCisgICAgeyAgOCwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAxMSwgMHgwMDA3IH0sCisgICAgeyAxMCwgMHgwMDA2IH0sCisgICAgeyAgOSwgMHgwMDA1IH0sCisgICAgeyAgNywgMHgwMDA0IH0sCisgICAgeyAxMywgMHgwMDBmIH0sCisgICAgeyAxMSwgMHgwMDA2IH0sCisgICAgeyAxMCwgMHgwMDA1IH0sCisgICAgeyAgOCwgMHgwMDA0IH0sCisgICAgeyAxMywgMHgwMDBiIH0sCisgICAgeyAxMywgMHgwMDBlIH0sCisgICAgeyAxMSwgMHgwMDA1IH0sCisgICAgeyAgOSwgMHgwMDA0IH0sCisgICAgeyAxMywgMHgwMDA4IH0sCisgICAgeyAxMywgMHgwMDBhIH0sCisgICAgeyAxMywgMHgwMDBkIH0sCisgICAgeyAxMCwgMHgwMDA0IH0sCisgICAgeyAxNCwgMHgwMDBmIH0sCisgICAgeyAxNCwgMHgwMDBlIH0sCisgICAgeyAxMywgMHgwMDA5IH0sCisgICAgeyAxMSwgMHgwMDA0IH0sCisgICAgeyAxNCwgMHgwMDBiIH0sCisgICAgeyAxNCwgMHgwMDBhIH0sCisgICAgeyAxNCwgMHgwMDBkIH0sCisgICAgeyAxMywgMHgwMDBjIH0sCisgICAgeyAxNSwgMHgwMDBmIH0sCisgICAgeyAxNSwgMHgwMDBlIH0sCisgICAgeyAxNCwgMHgwMDA5IH0sCisgICAgeyAxNCwgMHgwMDBjIH0sCisgICAgeyAxNSwgMHgwMDBiIH0sCisgICAgeyAxNSwgMHgwMDBhIH0sCisgICAgeyAxNSwgMHgwMDBkIH0sCisgICAgeyAxNCwgMHgwMDA4IH0sCisgICAgeyAxNiwgMHgwMDBmIH0sCisgICAgeyAxNSwgMHgwMDAxIH0sCisgICAgeyAxNSwgMHgwMDA5IH0sCisgICAgeyAxNSwgMHgwMDBjIH0sCisgICAgeyAxNiwgMHgwMDBiIH0sCisgICAgeyAxNiwgMHgwMDBlIH0sCisgICAgeyAxNiwgMHgwMDBkIH0sCisgICAgeyAxNSwgMHgwMDA4IH0sCisgICAgeyAxNiwgMHgwMDA3IH0sCisgICAgeyAxNiwgMHgwMDBhIH0sCisgICAgeyAxNiwgMHgwMDA5IH0sCisgICAgeyAxNiwgMHgwMDBjIH0sCisgICAgeyAxNiwgMHgwMDA0IH0sCisgICAgeyAxNiwgMHgwMDA2IH0sCisgICAgeyAxNiwgMHgwMDA1IH0sCisgICAgeyAxNiwgMHgwMDA4IH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4xWzYzXSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICA2LCAweDAwMGIgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDcgfSwKKyAgICB7ICA1LCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICA3LCAweDAwMDcgfSwKKyAgICB7ICA2LCAweDAwMGEgfSwKKyAgICB7ICA2LCAweDAwMDkgfSwKKyAgICB7ICA0LCAweDAwMDUgfSwKKyAgICB7ICA4LCAweDAwMDcgfSwKKyAgICB7ICA2LCAweDAwMDYgfSwKKyAgICB7ICA2LCAweDAwMDUgfSwKKyAgICB7ICA0LCAweDAwMDQgfSwKKyAgICB7ICA4LCAweDAwMDQgfSwKKyAgICB7ICA3LCAweDAwMDYgfSwKKyAgICB7ICA3LCAweDAwMDUgfSwKKyAgICB7ICA1LCAweDAwMDYgfSwKKyAgICB7ICA5LCAweDAwMDcgfSwKKyAgICB7ICA4LCAweDAwMDYgfSwKKyAgICB7ICA4LCAweDAwMDUgfSwKKyAgICB7ICA2LCAweDAwMDggfSwKKyAgICB7IDExLCAweDAwMGYgfSwKKyAgICB7ICA5LCAweDAwMDYgfSwKKyAgICB7ICA5LCAweDAwMDUgfSwKKyAgICB7ICA2LCAweDAwMDQgfSwKKyAgICB7IDExLCAweDAwMGIgfSwKKyAgICB7IDExLCAweDAwMGUgfSwKKyAgICB7IDExLCAweDAwMGQgfSwKKyAgICB7ICA3LCAweDAwMDQgfSwKKyAgICB7IDEyLCAweDAwMGYgfSwKKyAgICB7IDExLCAweDAwMGEgfSwKKyAgICB7IDExLCAweDAwMDkgfSwKKyAgICB7ICA5LCAweDAwMDQgfSwKKyAgICB7IDEyLCAweDAwMGIgfSwKKyAgICB7IDEyLCAweDAwMGUgfSwKKyAgICB7IDEyLCAweDAwMGQgfSwKKyAgICB7IDExLCAweDAwMGMgfSwKKyAgICB7IDEyLCAweDAwMDggfSwKKyAgICB7IDEyLCAweDAwMGEgfSwKKyAgICB7IDEyLCAweDAwMDkgfSwKKyAgICB7IDExLCAweDAwMDggfSwKKyAgICB7IDEzLCAweDAwMGYgfSwKKyAgICB7IDEzLCAweDAwMGUgfSwKKyAgICB7IDEzLCAweDAwMGQgfSwKKyAgICB7IDEyLCAweDAwMGMgfSwKKyAgICB7IDEzLCAweDAwMGIgfSwKKyAgICB7IDEzLCAweDAwMGEgfSwKKyAgICB7IDEzLCAweDAwMDkgfSwKKyAgICB7IDEzLCAweDAwMGMgfSwKKyAgICB7IDEzLCAweDAwMDcgfSwKKyAgICB7IDE0LCAweDAwMGIgfSwKKyAgICB7IDEzLCAweDAwMDYgfSwKKyAgICB7IDEzLCAweDAwMDggfSwKKyAgICB7IDE0LCAweDAwMDkgfSwKKyAgICB7IDE0LCAweDAwMDggfSwKKyAgICB7IDE0LCAweDAwMGEgfSwKKyAgICB7IDEzLCAweDAwMDEgfSwKKyAgICB7IDE0LCAweDAwMDcgfSwKKyAgICB7IDE0LCAweDAwMDYgfSwKKyAgICB7IDE0LCAweDAwMDUgfSwKKyAgICB7IDE0LCAweDAwMDQgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjJbNjNdID0geworICAgIHsgIDQsIDB4MDAwZiB9LAorICAgIHsgIDYsIDB4MDAwZiB9LAorICAgIHsgIDQsIDB4MDAwZSB9LAorICAgIHsgIDYsIDB4MDAwYiB9LAorICAgIHsgIDUsIDB4MDAwZiB9LAorICAgIHsgIDQsIDB4MDAwZCB9LAorICAgIHsgIDYsIDB4MDAwOCB9LAorICAgIHsgIDUsIDB4MDAwYyB9LAorICAgIHsgIDUsIDB4MDAwZSB9LAorICAgIHsgIDQsIDB4MDAwYyB9LAorICAgIHsgIDcsIDB4MDAwZiB9LAorICAgIHsgIDUsIDB4MDAwYSB9LAorICAgIHsgIDUsIDB4MDAwYiB9LAorICAgIHsgIDQsIDB4MDAwYiB9LAorICAgIHsgIDcsIDB4MDAwYiB9LAorICAgIHsgIDUsIDB4MDAwOCB9LAorICAgIHsgIDUsIDB4MDAwOSB9LAorICAgIHsgIDQsIDB4MDAwYSB9LAorICAgIHsgIDcsIDB4MDAwOSB9LAorICAgIHsgIDYsIDB4MDAwZSB9LAorICAgIHsgIDYsIDB4MDAwZCB9LAorICAgIHsgIDQsIDB4MDAwOSB9LAorICAgIHsgIDcsIDB4MDAwOCB9LAorICAgIHsgIDYsIDB4MDAwYSB9LAorICAgIHsgIDYsIDB4MDAwOSB9LAorICAgIHsgIDQsIDB4MDAwOCB9LAorICAgIHsgIDgsIDB4MDAwZiB9LAorICAgIHsgIDcsIDB4MDAwZSB9LAorICAgIHsgIDcsIDB4MDAwZCB9LAorICAgIHsgIDUsIDB4MDAwZCB9LAorICAgIHsgIDgsIDB4MDAwYiB9LAorICAgIHsgIDgsIDB4MDAwZSB9LAorICAgIHsgIDcsIDB4MDAwYSB9LAorICAgIHsgIDYsIDB4MDAwYyB9LAorICAgIHsgIDksIDB4MDAwZiB9LAorICAgIHsgIDgsIDB4MDAwYSB9LAorICAgIHsgIDgsIDB4MDAwZCB9LAorICAgIHsgIDcsIDB4MDAwYyB9LAorICAgIHsgIDksIDB4MDAwYiB9LAorICAgIHsgIDksIDB4MDAwZSB9LAorICAgIHsgIDgsIDB4MDAwOSB9LAorICAgIHsgIDgsIDB4MDAwYyB9LAorICAgIHsgIDksIDB4MDAwOCB9LAorICAgIHsgIDksIDB4MDAwYSB9LAorICAgIHsgIDksIDB4MDAwZCB9LAorICAgIHsgIDgsIDB4MDAwOCB9LAorICAgIHsgMTAsIDB4MDAwZCB9LAorICAgIHsgIDksIDB4MDAwNyB9LAorICAgIHsgIDksIDB4MDAwOSB9LAorICAgIHsgIDksIDB4MDAwYyB9LAorICAgIHsgMTAsIDB4MDAwOSB9LAorICAgIHsgMTAsIDB4MDAwYyB9LAorICAgIHsgMTAsIDB4MDAwYiB9LAorICAgIHsgMTAsIDB4MDAwYSB9LAorICAgIHsgMTAsIDB4MDAwNSB9LAorICAgIHsgMTAsIDB4MDAwOCB9LAorICAgIHsgMTAsIDB4MDAwNyB9LAorICAgIHsgMTAsIDB4MDAwNiB9LAorICAgIHsgMTAsIDB4MDAwMSB9LAorICAgIHsgMTAsIDB4MDAwNCB9LAorICAgIHsgMTAsIDB4MDAwMyB9LAorICAgIHsgMTAsIDB4MDAwMiB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuM1s2M10gPSB7CisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDA0IH0sCisgICAgeyAgNiwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDA2IH0sCisgICAgeyAgNiwgMHgwMDA4IH0sCisgICAgeyAgNiwgMHgwMDA5IH0sCisgICAgeyAgNiwgMHgwMDBhIH0sCisgICAgeyAgNiwgMHgwMDBiIH0sCisgICAgeyAgNiwgMHgwMDBjIH0sCisgICAgeyAgNiwgMHgwMDBkIH0sCisgICAgeyAgNiwgMHgwMDBlIH0sCisgICAgeyAgNiwgMHgwMDBmIH0sCisgICAgeyAgNiwgMHgwMDEwIH0sCisgICAgeyAgNiwgMHgwMDExIH0sCisgICAgeyAgNiwgMHgwMDEyIH0sCisgICAgeyAgNiwgMHgwMDEzIH0sCisgICAgeyAgNiwgMHgwMDE0IH0sCisgICAgeyAgNiwgMHgwMDE1IH0sCisgICAgeyAgNiwgMHgwMDE2IH0sCisgICAgeyAgNiwgMHgwMDE3IH0sCisgICAgeyAgNiwgMHgwMDE4IH0sCisgICAgeyAgNiwgMHgwMDE5IH0sCisgICAgeyAgNiwgMHgwMDFhIH0sCisgICAgeyAgNiwgMHgwMDFiIH0sCisgICAgeyAgNiwgMHgwMDFjIH0sCisgICAgeyAgNiwgMHgwMDFkIH0sCisgICAgeyAgNiwgMHgwMDFlIH0sCisgICAgeyAgNiwgMHgwMDFmIH0sCisgICAgeyAgNiwgMHgwMDIwIH0sCisgICAgeyAgNiwgMHgwMDIxIH0sCisgICAgeyAgNiwgMHgwMDIyIH0sCisgICAgeyAgNiwgMHgwMDIzIH0sCisgICAgeyAgNiwgMHgwMDI0IH0sCisgICAgeyAgNiwgMHgwMDI1IH0sCisgICAgeyAgNiwgMHgwMDI2IH0sCisgICAgeyAgNiwgMHgwMDI3IH0sCisgICAgeyAgNiwgMHgwMDI4IH0sCisgICAgeyAgNiwgMHgwMDI5IH0sCisgICAgeyAgNiwgMHgwMDJhIH0sCisgICAgeyAgNiwgMHgwMDJiIH0sCisgICAgeyAgNiwgMHgwMDJjIH0sCisgICAgeyAgNiwgMHgwMDJkIH0sCisgICAgeyAgNiwgMHgwMDJlIH0sCisgICAgeyAgNiwgMHgwMDJmIH0sCisgICAgeyAgNiwgMHgwMDMwIH0sCisgICAgeyAgNiwgMHgwMDMxIH0sCisgICAgeyAgNiwgMHgwMDMyIH0sCisgICAgeyAgNiwgMHgwMDMzIH0sCisgICAgeyAgNiwgMHgwMDM0IH0sCisgICAgeyAgNiwgMHgwMDM1IH0sCisgICAgeyAgNiwgMHgwMDM2IH0sCisgICAgeyAgNiwgMHgwMDM3IH0sCisgICAgeyAgNiwgMHgwMDM4IH0sCisgICAgeyAgNiwgMHgwMDM5IH0sCisgICAgeyAgNiwgMHgwMDNhIH0sCisgICAgeyAgNiwgMHgwMDNiIH0sCisgICAgeyAgNiwgMHgwMDNjIH0sCisgICAgeyAgNiwgMHgwMDNkIH0sCisgICAgeyAgNiwgMHgwMDNlIH0sCisgICAgeyAgNiwgMHgwMDNmIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW40WzE1XSA9IHsKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDcgfSwKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDQgfSwKKyAgICB7ICA2LCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDMgfSwKKyAgICB7ICA3LCAweDAwMDMgfSwKKyAgICB7ICA3LCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDUgfSwKKyAgICB7ICA2LCAweDAwMDIgfSwKKyAgICB7ICA4LCAweDAwMDMgfSwKKyAgICB7ICA4LCAweDAwMDIgfSwKKyAgICB7ICA3LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworCitjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzVdID0geworICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjAsIAorICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjEsCisgICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMiwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMywgCisgICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuNAorfTsKKworLyogVGFibGUgZm9yIGxldmVsX3ByZWZpeCAqLworCitjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4WzE3XSA9IHsKKyAgICB7ICAxLCAxfSwKKyAgICB7ICAyLCAxfSwKKyAgICB7ICAzLCAxfSwKKyAgICB7ICA0LCAxfSwKKyAgICB7ICA1LCAxfSwKKyAgICB7ICA2LCAxfSwKKyAgICB7ICA3LCAxfSwKKyAgICB7ICA4LCAxfSwKKyAgICB7ICA5LCAxfSwKKyAgICB7IDEwLCAxfSwKKyAgICB7IDExLCAxfSwKKyAgICB7IDEyLCAxfSwKKyAgICB7IDEzLCAxfSwKKyAgICB7IDE0LCAxfSwKKyAgICB7IDE1LCAxfSwKKyAgICB7IDE2LCAxfSwKKyAgICB7ICAwLCAwfQorfTsKKworLyogVGFibGVzIGZvciB0b3RhbF96ZXJvcyAqLworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMVsxN10gPSB7CisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDAyIH0sCisgICAgeyAgNCwgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAzIH0sCisgICAgeyAgNSwgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAgNiwgMHgwMDAyIH0sCisgICAgeyAgNywgMHgwMDAzIH0sCisgICAgeyAgNywgMHgwMDAyIH0sCisgICAgeyAgOCwgMHgwMDAzIH0sCisgICAgeyAgOCwgMHgwMDAyIH0sCisgICAgeyAgOSwgMHgwMDAzIH0sCisgICAgeyAgOSwgMHgwMDAyIH0sCisgICAgeyAgOSwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyWzE2XSA9IHsKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICA0LCAweDAwMDUgfSwKKyAgICB7ICA0LCAweDAwMDQgfSwKKyAgICB7ICA0LCAweDAwMDMgfSwKKyAgICB7ICA0LCAweDAwMDIgfSwKKyAgICB7ICA1LCAweDAwMDMgfSwKKyAgICB7ICA1LCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDMgfSwKKyAgICB7ICA2LCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczNbMTVdID0geworICAgIHsgIDQsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNyB9LAorICAgIHsgIDMsIDB4MDAwNiB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDQsIDB4MDAwNCB9LAorICAgIHsgIDQsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDQsIDB4MDAwMiB9LAorICAgIHsgIDUsIDB4MDAwMyB9LAorICAgIHsgIDUsIDB4MDAwMiB9LAorICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNFsxNF0gPSB7CisgICAgeyAgNSwgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDA3IH0sCisgICAgeyAgNCwgMHgwMDA1IH0sCisgICAgeyAgNCwgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgNCwgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M1WzEzXSA9IHsKKyAgICB7ICA0LCAweDAwMDUgfSwKKyAgICB7ICA0LCAweDAwMDQgfSwKKyAgICB7ICA0LCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICA0LCAweDAwMDIgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczZbMTJdID0geworICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwNyB9LAorICAgIHsgIDMsIDB4MDAwNiB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zN1sxMV0gPSB7CisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDAyIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M4WzEwXSA9IHsKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczlbOV0gPSB7CisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAyIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMFs4XSA9IHsKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDAgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczExWzddID0geworICAgIHsgIDQsIDB4MDAwMCB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTJbNl0gPSB7CisgICAgeyAgNCwgMHgwMDAwIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxM1s1XSA9IHsKKyAgICB7ICAzLCAweDAwMDAgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE0WzRdID0geworICAgIHsgIDIsIDB4MDAwMCB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTVbM10gPSB7CisgICAgeyAgMSwgMHgwMDAwIH0sCisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK2NvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV0gPSB7CisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMiwKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MzLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M0LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M1LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M2LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M3LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M4LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M5LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMCwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTEsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEyLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMywgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTQsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE1IAorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8xWzVdID0geworICAgIHsgIDEsIDEgfSwKKyAgICB7ICAyLCAxIH0sCisgICAgeyAgMywgMSB9LAorICAgIHsgIDMsIDAgfSwKKyAgICB7ICAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMls0XSA9IHsKKyAgICB7ICAxLCAxIH0sCisgICAgeyAgMiwgMSB9LAorICAgIHsgIDIsIDAgfSwKKyAgICB7ICAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfM1szXSA9IHsKKyAgICB7ICAxLCAxIH0sCisgICAgeyAgMSwgMCB9LAorICAgIHsgIDAsIDAgfQorfTsKKworY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzIsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8zCit9OworCisKKy8qIFRhYmxlcyBmb3IgcnVuX2JlZm9yZSAqLworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUxWzNdID0geworICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDEsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUyWzRdID0geworICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUzWzVdID0geworICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMiB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU0WzZdID0geworICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMiB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU1WzddID0geworICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMiB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU2WzhdID0geworICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMCB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU3WzE2XSA9IHsKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA3LCAweDAwMDEgfSwKKyAgICB7ICA4LCAweDAwMDEgfSwKKyAgICB7ICA5LCAweDAwMDEgfSwKKyAgICB7IDEwLCAweDAwMDEgfSwKKyAgICB7IDExLCAweDAwMDEgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzddID0geworICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUyLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTMsIAorICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNCwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU1LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTYsIAorICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YmVkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCkBAIC0wLDAgKzEsMTMzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBjb21wYXJpbmcgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSAKKyAqIHRoZSBiZXN0IE1WIGFuZCBTQUQKKyAqCisgKi8KKyAgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjYWxjdWxhdGluZyBFeHAtR29sb21iIGNvZGUgbGVuZ3RoIGZvciBhIGdpdmVuIHZhbHVlcworICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgICAgICAgdmFsCVNpZ25lZCBudW1iZXIgZm9yIHdoaWNoIEV4cC1Hb2xvbWIgY29kZSBsZW5ndGggaGFzCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxjdWxhdGVkCisgKgorICogUmV0dXJuIFZhbHVlOiAKKyAqICAgICAgICAgICAgIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgRXhwLUdvbG9tYiBjb2RlIGZvciB2YWwKKyAqLworCitzdGF0aWMgT01YX1UxNiBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChPTVhfUzE2IHZhbCkKK3sKKyAgICBPTVhfVTE2IHNpemVDb2RlTnVtLCBjb2RlTnVtOworICAgIAorICAgIC8qIE1hcHBpbmcgdmFsIHRvIGNvZGVOdW0gKi8KKyAgICBjb2RlTnVtID0gYXJtQWJzICh2YWwpOworICAgIGlmICh2YWwgPiAwKQorICAgIHsKKyAgICAgICAgY29kZU51bSA9ICgyICogY29kZU51bSkgLSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb2RlTnVtID0gMiAqIGNvZGVOdW07CisgICAgfQorICAgIAorICAgIC8qIFNpemUgb2YgdGhlIGV4cC1nb2xvbWIgY29kZSAqLworICAgIHNpemVDb2RlTnVtID0gKDIgKiBhcm1Mb2dTaXplIChjb2RlTnVtICsgMSkpIC0gMTsKKyAgICAKKyAgICByZXR1cm4gc2l6ZUNvZGVOdW07Cit9CisgICAgICAgICAgICAgICAgCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgTW90aW9uIGNvc3QgdG8gZGVjaWRlIHRoZSAKKyAqIGJlc3QgTVYgYW5kIGJlc3QgTUMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICAgICAgIG12WAl4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yIGluIDEvNCBwZWwgdW5pdHMKKyAqIFtpbl0JICAgICAgICAgbXZZCXkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IgaW4gMS80IHBlbCB1bml0cworICogW2luXQkgICAgICBkaWZmTVYJZGlmZmVyZW50aWFsIE1WCisgKiBbaW5dCSAgICAgY2FuZFNBRAlDYW5kaWRhdGUgU0FECisgKiBbaW5dCSAgICAgIGJlc3RNVglCZXN0IE1WLCBjb250YWlucyBiZXN0IE1WIHRpbGwgdGhlIHByZXZpb3VzIGludGVyYXRpb24uCisgKiBbaW5dICAgICAgIG5MYW1kYSAgICBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqIFtpbl0gICAqcEJlc3RDb3N0ICAgIENvbnRhaW5zIHRoZSBjdXJyZW50IGJlc3QgbW90aW9uIGNvc3QuCisgKiBbb3V0XSAgKnBCZXN0Q29zdCAgICBwQmVzdENvc3QgTW90aW9uIGNvc3Qgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVYgCisgKiAgICAgICAgICAgICAgICAgICAgICBhZnRlciBqdWRnZW1lbnQ7IAorICogICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgYXMgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViwgaWYgdGhlIGNhbmRDb3N0IGlzIGxlc3MgCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZSBiZXN0IGNvc3QgcGFzc2VkIHRoZW4gdGhlICpwQmVzdENvc3Qgd2lsbCBiZSBlcXVhbCB0byBjYW5kQ29zdAorICogW291dF0JICBiZXN0TVYJRmluYWxseSB3aWxsIGhhdmUgdGhlIGJlc3QgTVYgYWZ0ZXIgdGhlIGp1ZGdlbWVudC4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBtb3Rpb24gY29zdCBpcyB0aGUgYmVzdCAKKyAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBtb3Rpb24gY29zdAorICovCisKK09NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAorICAgIE9NWF9TMTYgIG12WCwKKyAgICBPTVhfUzE2ICBtdlksCisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKKyAgICBPTVhfSU5UIGNhbmRTQUQsIAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKSAKK3sKKyAgICBPTVhfUzMyIGNhbmRDb3N0OworICAgIE9NWF9VMTYgc2l6ZUNvZGVOdW07CisgICAgCisgICAgc2l6ZUNvZGVOdW0gPSBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChkaWZmTVYuZHgpOworICAgIHNpemVDb2RlTnVtICs9IGFybVZDTTRQMTBfRXhwR29sQml0c1VzZWQgKGRpZmZNVi5keSk7CisgICAgCisgICAgLyogTW90aW9uIGNvc3QgPSBTQUQgKyAgbGFtZGEgKiAoKGJpdHN1c2VkKGRpZmZNVngpICsgKGJpdHN1c2VkKGRpZmZNVnkpKSovCisgICAgY2FuZENvc3QgPSBjYW5kU0FEICsgKG5MYW1kYSAqIHNpemVDb2RlTnVtKTsKKyAgICAgICAgCisgICAgLyogQ2FsY3VsYXRlIGNhbmRDb3N0ICovCisgICAgaWYgKGNhbmRDb3N0IDwgKnBCZXN0Q29zdCkKKyAgICB7CisgICAgICAgICpwQmVzdENvc3QgPSBjYW5kQ29zdDsKKyAgICAgICAgYmVzdE1WLT5keCA9IG12WDsKKyAgICAgICAgYmVzdE1WLT5keSA9IG12WTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChjYW5kQ29zdCA+ICpwQmVzdENvc3QpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogc2hvcnRlciBtb3Rpb24gdmVjdG9yICovCisgICAgaWYgKCAobXZYICogbXZYICsgbXZZICogbXZZKSA8ICgoYmVzdE1WLT5keCAqIGJlc3RNVi0+ZHgpICsgKGJlc3RNVi0+ZHkgKiBiZXN0TVYtPmR5KSkgKQorICAgIHsKKyAgICAgICAgKnBCZXN0Q29zdCA9IGNhbmRDb3N0OworICAgICAgICBiZXN0TVYtPmR4ID0gbXZYOworICAgICAgICBiZXN0TVYtPmR5ID0gbXZZOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmYjFkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBILjI2NCBsdW1hIGRlYmxvY2sgbW9kdWxlCisgKiAKKyAqLworCisjaWZkZWYgREVCVUdfQVJNVkNNNFAxMF9ERUJMT0NLUElYRUwKKyN1bmRlZiBERUJVR19PTgorI2RlZmluZSBERUJVR19PTgorI2VuZGlmIC8qIERFQlVHX0FSTVZDTTRQMTBfREVCTE9DS1BJWEVMICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBEZWJsb2NrIG9uZSBib3VuZGFyeSBwaXhlbAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBRMCAgICAgICAgIFBvaW50ZXIgdG8gcGl4ZWwgcTAKKyAqIFtpbl0gU3RlcCAgICAgICAgU3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEKKyAqIFtpbl0gdEMwICAgICAgICAgRWRnZSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYWxwaGEgICAgICAgYWxwaGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJldGEgICAgICAgIGJldGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJTICAgICAgICAgIGRlYmxvY2tpbmcgc3RyZW5ndGgKKyAqIFtpbl0gQ2hyb21hRmxhZyAgVHJ1ZSBmb3IgY2hyb21hIGJsb2NrcworICogW291dF0gcFEwICAgICAgICBEZWJsb2NrZWQgcGl4ZWxzCisgKiAKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAorICAgIE9NWF9VOCAqcFEwLCAgICAvKiBwb2ludGVyIHRvIHRoZSBwaXhlbCBxMCAqLworICAgIGludCBTdGVwLCAgICAgICAvKiBzdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMSAqLworICAgIGludCB0QzAsICAgICAgICAvKiBlZGdlIHRocmVzaG9sZCB2YWx1ZSAqLworICAgIGludCBhbHBoYSwgICAgICAvKiBhbHBoYSAqLworICAgIGludCBiZXRhLCAgICAgICAvKiBiZXRhICovCisgICAgaW50IGJTLCAgICAgICAgIC8qIGRlYmxvY2tpbmcgc3RyZW5ndGggKi8KKyAgICBpbnQgQ2hyb21hRmxhZworKQoreworICAgIGludCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisgICAgaW50IGFwLCBhcSwgZGVsdGE7CisKKyAgICBpZiAoYlM9PTApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcDMgPSBwUTBbLTQqU3RlcF07CisgICAgcDIgPSBwUTBbLTMqU3RlcF07CisgICAgcDEgPSBwUTBbLTIqU3RlcF07CisgICAgcDAgPSBwUTBbLTEqU3RlcF07CisgICAgcTAgPSBwUTBbIDAqU3RlcF07CisgICAgcTEgPSBwUTBbIDEqU3RlcF07CisgICAgcTIgPSBwUTBbIDIqU3RlcF07CisgICAgcTMgPSBwUTBbIDMqU3RlcF07CisKKyAgICBpZiAoYXJtQWJzKHAwLXEwKT49YWxwaGEgfHwgYXJtQWJzKHAxLXAwKT49YmV0YSB8fCBhcm1BYnMocTEtcTApPj1iZXRhKQorICAgIHsKKyAgICAgICAgREVCVUdfUFJJTlRGXzEwKCJEZUJsb2NrUGl4ZWw6ICUwMnggJTAyeCAlMDJ4ICUwMnggfCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGFscGhhPSVkIGJldGE9JWRcbiIsCisgICAgICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGFscGhhLCBiZXRhKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFwID0gYXJtQWJzKHAyIC0gcDApOworICAgIGFxID0gYXJtQWJzKHEyIC0gcTApOworCisgICAgaWYgKGJTIDwgNCkKKyAgICB7CisgICAgICAgIGludCB0QyA9IHRDMDsKKworICAgICAgICBpZiAoQ2hyb21hRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdEMrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcCA8IGJldGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdEMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcSA8IGJldGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdEMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIAorICAgICAgICBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKKyAgICAgICAgZGVsdGEgPSBhcm1DbGlwKC10QywgdEMsIGRlbHRhKTsKKworICAgICAgICBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBwMCArIGRlbHRhKTsKKyAgICAgICAgcFEwWyAwKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcTAgLSBkZWx0YSk7CisKKyAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXA8YmV0YSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOworICAgICAgICAgICAgZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOworICAgICAgICAgICAgcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkocDEgKyBkZWx0YSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcTxiZXRhKQorICAgICAgICB7CisgICAgICAgICAgICBkZWx0YSA9IChxMiArICgocDArcTArMSk+PjEpIC0gKHExPDwxKSk+PjE7CisgICAgICAgICAgICBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7CisgICAgICAgICAgICBwUTBbIDEqU3RlcF0gPSAoT01YX1U4KShxMSArIGRlbHRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGJTPT00ICovCisgICAgeworICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcDxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpKChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMpOworICAgICAgICAgICAgcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgcDEgKyBwMCArIHEwICsgMik+PjIpOworICAgICAgICAgICAgcFEwWy0zKlN0ZXBdID0gKE9NWF9VOCkoKDIqcDMgKyAzKnAyICsgcDEgKyBwMCArIHEwICsgNCk+PjMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFEwWy0xKlN0ZXBdID0gKE9NWF9VOCkoKDIqcDEgKyBwMCArIHExICsgMik+PjIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXE8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpKQorICAgICAgICB7CisgICAgICAgICAgICBwUTBbIDAqU3RlcF0gPSAoT01YX1U4KSgocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zKTsKKyAgICAgICAgICAgIHBRMFsgMSpTdGVwXSA9IChPTVhfVTgpKChxMiArIHExICsgcDAgKyBxMCArIDIpPj4yKTsKKyAgICAgICAgICAgIHBRMFsgMipTdGVwXSA9IChPTVhfVTgpKCgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBRMFsgMCpTdGVwXSA9IChPTVhfVTgpKCgyKnExICsgcTAgKyBwMSArIDIpPj4yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERFQlVHX1BSSU5URl8xMygiRGVCbG9ja1BpeGVsOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IHwgJTAyeCAlMDJ4ICUwMnggJTAyeCBiUz0lZCAtPiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGJTLAorICAgICAgICBwUTBbLTIqU3RlcF0sIHBRMFstMSpTdGVwXSxwUTBbMCpTdGVwXSxwUTBbMSpTdGVwXSk7CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTZhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCkBAIC0wLDAgKzEsMjY3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaWZkZWYgREVCVUdfQVJNVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVIKKyN1bmRlZiBERUJVR19PTgorI2RlZmluZSBERUJVR19PTgorI2VuZGlmCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgorCisvKiA0eDQgRGVaaWdaYWcgdGFibGUgKi8KKworc3RhdGljIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ1sxNl0gPQoreworICAgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKK307CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB0aGUgd29yayByZXF1aXJlZCBieSB0aGUgT3Blbk1BWAorICogRGVjb2RlQ29lZmZzVG9QYWlyIGZ1bmN0aW9uIGFuZCBEZWNvZGVDaHJvbWFEQ0NvZWZmc1RvUGFpci4KKyAqIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29tbW9uIHdlIHNoYXJlIGl0IGhlcmUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAorICoJCQkJCQkJCWJsb2NrICg0LDE1IG9yIDE2KQorICogW2luXQluVGFibGUgICAgICAgICAgVGFibGUgbnVtYmVyICgwIHRvIDQpIGFjY29yZGluZyB0byB0aGUgZml2ZSBjb2x1bW5zCisgKiAgICAgICAgICAgICAgICAgICAgICBvZiBUYWJsZSA5LTUgaW4gdGhlIEguMjY0IHNwZWMKKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKworICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTggICoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIG5UYWJsZSwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICkKK3sKKyAgICBpbnQgQ29lZmZUb2tlbiwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzOworICAgIGludCBMZXZlbCwgTGV2ZWxDb2RlLCBMZXZlbFByZWZpeCwgTGV2ZWxTdWZmaXgsIExldmVsU3VmZml4U2l6ZTsKKyAgICBpbnQgU3VmZml4TGVuZ3RoLCBSdW4sIFplcm9zTGVmdCxDb2VmZk51bTsKKyAgICBpbnQgaSwgRmxhZ3M7CisgICAgT01YX1U4ICpwUG9zQ29lZmJ1ZiA9ICpwcFBvc0NvZWZidWY7CisgICAgT01YX1MxNiBwTGV2ZWxbMTZdOworICAgIE9NWF9VOCAgcFJ1blsxNl07CisKKyAgICBDb2VmZlRva2VuID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzW25UYWJsZV0pOworICAgIGFybVJldERhdGFFcnJJZihDb2VmZlRva2VuID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOworCisgICAgVHJhaWxpbmdPbmVzID0gYXJtVkNNNFAxMF9DQVZMQ1RyYWlsaW5nT25lc1tDb2VmZlRva2VuXTsKKyAgICBUb3RhbENvZWZmICAgPSBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZltDb2VmZlRva2VuXTsKKyAgICAqcE51bUNvZWZmICAgPSAoT01YX1U4KVRvdGFsQ29lZmY7CisKKyAgICBERUJVR19QUklOVEZfMigiVG90YWxDb2VmZiA9ICVkLCBUcmFpbGluZ09uZXMgPSAlZFxuIiwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzKTsKKworICAgIGlmIChUb3RhbENvZWZmID09IDApCisgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgIH0KKworICAgIC8qIERlY29kZSB0cmFpbGluZyBvbmVzICovCisgICAgZm9yIChpPVRvdGFsQ29lZmYtMTsgaT49VG90YWxDb2VmZi1UcmFpbGluZ09uZXM7IGktLSkKKyAgICB7CisgICAgICAgIGlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWwgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExldmVsID0gKzE7CisgICAgICAgIH0KKyAgICAgICAgcExldmVsW2ldID0gKE9NWF9TMTYpTGV2ZWw7CisKKyAgICAgICAgREVCVUdfUFJJTlRGXzIoIkxldmVsWyVkXSA9ICVkXG4iLCBpLCBwTGV2ZWxbaV0pOworICAgIH0KKworICAgIC8qIERlY29kZSAobm9uIHplcm8pIGxldmVsIHZhbHVlcyAqLworICAgIFN1ZmZpeExlbmd0aCA9IDA7CisgICAgaWYgKFRvdGFsQ29lZmY+MTAgJiYgVHJhaWxpbmdPbmVzPDMpCisgICAgeworICAgICAgICBTdWZmaXhMZW5ndGg9MTsKKyAgICB9CisgICAgZm9yICggOyBpPj0wOyBpLS0pCisgICAgeworICAgICAgICBMZXZlbFByZWZpeCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDTGV2ZWxQcmVmaXgpOworICAgICAgICBhcm1SZXREYXRhRXJySWYoTGV2ZWxQcmVmaXggPT0gQVJNX05PX0NPREVCT09LX0lOREVYLCBPTVhfU3RzX0Vycik7CisKKyAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gU3VmZml4TGVuZ3RoOworICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE0ICYmIFN1ZmZpeExlbmd0aD09MCkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE1KQorICAgICAgICB7CisgICAgICAgICAgICBMZXZlbFN1ZmZpeFNpemUgPSAxMjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTGV2ZWxTdWZmaXggPSAwOworICAgICAgICBpZiAoTGV2ZWxTdWZmaXhTaXplID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWxTdWZmaXggPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBMZXZlbFN1ZmZpeFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgTGV2ZWxDb2RlID0gKExldmVsUHJlZml4IDw8IFN1ZmZpeExlbmd0aCkgKyBMZXZlbFN1ZmZpeDsKKworCisgICAgICAgIGlmIChMZXZlbFByZWZpeD09MTUgJiYgU3VmZml4TGVuZ3RoPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBMZXZlbENvZGUgKz0gMTU7CisgICAgICAgIH0KKworICAgICAgICAvKiBMZXZlbENvZGUgPSAyKihtYWduaXR1ZGUtMSkgKyBzaWduICovCisKKyAgICAgICAgaWYgKGk9PVRvdGFsQ29lZmYtMS1UcmFpbGluZ09uZXMgJiYgVHJhaWxpbmdPbmVzPDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIExldmVsIG1hZ25pdHVkZSBjYW4ndCBiZSAxICovCisgICAgICAgICAgICBMZXZlbENvZGUgKz0gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoTGV2ZWxDb2RlICYgMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMmErMSBtYXBzIHRvIC1hLTEgKi8KKyAgICAgICAgICAgIExldmVsID0gKC1MZXZlbENvZGUtMSk+PjE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyYSswIG1hcHMgdG8gK2ErMSAqLworICAgICAgICAgICAgTGV2ZWwgPSAoTGV2ZWxDb2RlKzIpPj4xOworICAgICAgICB9CisgICAgICAgIHBMZXZlbFtpXSA9IChPTVhfUzE2KUxldmVsOworCisgICAgICAgIERFQlVHX1BSSU5URl8yKCJMZXZlbFslZF0gPSAlZFxuIiwgaSwgcExldmVsW2ldKTsKKworICAgICAgICBpZiAoU3VmZml4TGVuZ3RoPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBTdWZmaXhMZW5ndGg9MTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICgoTGV2ZWxDb2RlPj4xKSsxKT4oMzw8KFN1ZmZpeExlbmd0aC0xKSkgJiYgU3VmZml4TGVuZ3RoPDYgKQorICAgICAgICB7CisgICAgICAgICAgICBTdWZmaXhMZW5ndGgrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIERlY29kZSBydW4gdmFsdWVzICovCisgICAgWmVyb3NMZWZ0ID0gMDsKKyAgICBpZiAoVG90YWxDb2VmZiA8IHNNYXhOdW1Db2VmZikKKyAgICB7CisgICAgICAgIC8qIERlY29kZSBUb3RhbFplcm9zIFZMQyAqLworICAgICAgICBpZiAoc01heE51bUNvZWZmPT00KQorICAgICAgICB7CisgICAgICAgICAgICBaZXJvc0xlZnQgPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbVG90YWxDb2VmZi0xXSk7CisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoWmVyb3NMZWZ0ID09QVJNX05PX0NPREVCT09LX0lOREVYICwgT01YX1N0c19FcnIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgWmVyb3NMZWZ0ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbVG90YWxDb2VmZi0xXSk7CisgICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFplcm9zTGVmdCA9PUFSTV9OT19DT0RFQk9PS19JTkRFWCAsIE9NWF9TdHNfRXJyKTsKKwkgICAgfQorICAgIH0KKworICAgIERFQlVHX1BSSU5URl8xKCJUb3RhbFplcm9zID0gJWRcbiIsIFplcm9zTGVmdCk7CisKKwlDb2VmZk51bT1aZXJvc0xlZnQrVG90YWxDb2VmZi0xOworCisgICAgZm9yIChpPVRvdGFsQ29lZmYtMTsgaT4wOyBpLS0pCisgICAgeworICAgICAgICBSdW4gPSAwOworICAgICAgICBpZiAoWmVyb3NMZWZ0ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IFRhYmxlID0gWmVyb3NMZWZ0OworICAgICAgICAgICAgaWYgKFRhYmxlID4gNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUYWJsZSA9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSdW4gPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1tUYWJsZS0xXSk7CisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoUnVuID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOworICAgICAgICB9CisgICAgICAgIHBSdW5baV0gPSAoT01YX1U4KVJ1bjsKKworICAgICAgICBERUJVR19QUklOVEZfMigiUnVuWyVkXSA9ICVkXG4iLCBpLCBwUnVuW2ldKTsKKworICAgICAgICBaZXJvc0xlZnQgLT0gUnVuOworICAgIH0KKyAgICBwUnVuWzBdID0gKE9NWF9VOClaZXJvc0xlZnQ7CisKKyAgICBERUJVR19QUklOVEZfMSgiUnVuWzBdID0gJWRcbiIsIHBSdW5baV0pOworCisKKyAgICAvKiBGaWxsIGluIGNvZWZmaWNpZW50cyAqLworCSAgICAKKyAgICBpZiAoc01heE51bUNvZWZmPT0xNSkKKyAgICB7CisgICAgICAgIENvZWZmTnVtKys7IC8qIFNraXAgdGhlIERDIHBvc2l0aW9uICovCisgICAgfQorCQorCS8qZm9yIChpPTA7aTxUb3RhbENvZWZmO2krKykKKwkJQ29lZmZOdW0gKz0gcFJ1bltpXSsxOyovCisgICAgCisJZm9yIChpPShUb3RhbENvZWZmLTEpOyBpPj0wOyBpLS0pCisgICAgeworICAgICAgICAvKkNvZWZmTnVtICs9IHBSdW5baV0rMTsqLworICAgICAgICBMZXZlbCAgICAgPSBwTGV2ZWxbaV07CisKKyAgICAgICAgREVCVUdfUFJJTlRGXzIoIkNvZWZbJWRdID0gJWRcbiIsIENvZWZmTnVtLCBMZXZlbCk7CisKKyAgICAgICAgRmxhZ3MgPSBDb2VmZk51bTsKKwkJQ29lZmZOdW0gLT0gKHBSdW5baV0rMSk7CisgICAgICAgIGlmIChzTWF4TnVtQ29lZmY+NCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUGVyZm9ybSA0eDQgRGVaaWdaYWcgKi8KKyAgICAgICAgICAgIEZsYWdzID0gYXJtVkNNNFAxMF9aaWdaYWdbRmxhZ3NdOworICAgICAgICB9CisgICAgICAgIGlmIChpPT0wKQorICAgICAgICB7ICAgCisgICAgICAgICAgICAvKiBFbmQgb2YgYmxvY2sgZmxhZyAqLworICAgICAgICAgICAgRmxhZ3MgKz0gMHgyMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoTGV2ZWw8LTEyOCB8fCBMZXZlbD4xMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJmbG93IGZsYWcgKi8KKyAgICAgICAgICAgIEZsYWdzICs9IDB4MTA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICpwUG9zQ29lZmJ1ZisrID0gKE9NWF9VOCkoRmxhZ3MpOworICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKExldmVsICYgMHhGRik7CisgICAgICAgIGlmIChGbGFncyAmIDB4MTApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwUG9zQ29lZmJ1ZisrID0gKE9NWF9VOCkoTGV2ZWw+PjgpOworICAgICAgICB9CisgICAgfQorCisgICAgKnBwUG9zQ29lZmJ1ZiA9IHBQb3NDb2VmYnVmOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzI1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSB0YWJsZXMKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XSA9IAoreworICAgIDAsIDIsIDAsIDIsCisgICAgMiwgMSwgMiwgMSwKKyAgICAwLCAyLCAwLCAyLAorICAgIDIsIDEsIDIsIDEKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XSA9IAoreworICAgIDAsIDIsCisgICAgMiwgMQorfTsKKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXSA9Cit7CisgICAgeyAxMCwgMTYsIDEzIH0sCisgICAgeyAxMSwgMTgsIDE0IH0sCisgICAgeyAxMywgMjAsIDE2IH0sCisgICAgeyAxNCwgMjMsIDE4IH0sCisgICAgeyAxNiwgMjUsIDIwIH0sCisgICAgeyAxOCwgMjksIDIzIH0KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkNTRjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwpAQCAtMCwwICsxLDc4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IHRyYW5zZm9ybSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisgCisvKgorICogRGVzY3JpcHRpb246CisgKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLwordm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBUcmFuc2Zvcm0gcm93cyAqLworICAgIGZvciAoaT0wOyBpPDE2OyBpKz00KQorICAgIHsKKyAgICAgICAgaW50IGQwID0gcFNyY1tpKzBdOworICAgICAgICBpbnQgZDEgPSBwU3JjW2krMV07CisgICAgICAgIGludCBkMiA9IHBTcmNbaSsyXTsKKyAgICAgICAgaW50IGQzID0gcFNyY1tpKzNdOworICAgICAgICBpbnQgZTAgPSBkMCArIGQzOworICAgICAgICBpbnQgZTEgPSBkMCAtIGQzOworICAgICAgICBpbnQgZTIgPSBkMSArIGQyOworICAgICAgICBpbnQgZTMgPSBkMSAtIGQyOworICAgICAgICBpbnQgZjAgPSBlMCArIGUyOworICAgICAgICBpbnQgZjEgPSAoZTEgPDwgMSkgKyBlMzsKKyAgICAgICAgaW50IGYyID0gZTAgLSBlMjsKKyAgICAgICAgaW50IGYzID0gZTEgLSAoZTMgPDwgMSk7CisgICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KWYwOworICAgICAgICBwRHN0W2krMV0gPSAoT01YX1MxNilmMTsKKyAgICAgICAgcERzdFtpKzJdID0gKE9NWF9TMTYpZjI7CisgICAgICAgIHBEc3RbaSszXSA9IChPTVhfUzE2KWYzOworICAgIH0KKworICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGYwID0gcERzdFtpKzBdOworICAgICAgICBpbnQgZjEgPSBwRHN0W2krNF07CisgICAgICAgIGludCBmMiA9IHBEc3RbaSs4XTsKKyAgICAgICAgaW50IGYzID0gcERzdFtpKzEyXTsKKyAgICAgICAgaW50IGcwID0gZjAgKyBmMzsKKyAgICAgICAgaW50IGcxID0gZjAgLSBmMzsKKyAgICAgICAgaW50IGcyID0gZjEgKyBmMjsKKyAgICAgICAgaW50IGczID0gZjEgLSBmMjsKKyAgICAgICAgaW50IGgwID0gZzAgKyBnMjsKKyAgICAgICAgaW50IGgxID0gKGcxIDw8IDEpICsgZzM7CisgICAgICAgIGludCBoMiA9IGcwIC0gZzI7CisgICAgICAgIGludCBoMyA9IGcxIC0gKGczIDw8IDEpOworICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNikgaDA7CisgICAgICAgIHBEc3RbaSs0XSA9IChPTVhfUzE2KSBoMTsKKyAgICAgICAgcERzdFtpKzhdID0gKE9NWF9TMTYpIGgyOworICAgICAgICBwRHN0W2krMTJdID0gKE9NWF9TMTYpIGgzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MzJmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCkBAIC0wLDAgKzEsMTA2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb25zIHdpbGwgaGVscCB0byBjYWxjdWxhdGUgSGFsZiBQZWwgbHVtYSBpbnRlcnBvbGF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yICgxLzIsIDEvMikgIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlICgxLzIsMS8yKS1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYSggIAorICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhfUzMyICAgICBIYWxmQ29lZmYsIHBvczsKKyAgICBPTVhfUzE2ICAgICBCdWYgWzIxICogMTZdOyAgLyogMjEgcm93cyBieSAxNiBwaXhlbHMgcGVyIHJvdyAqLworICAgIE9NWF9VMzIgICAgIHksIHg7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YWx1ZXMgd2lsbCBiZSAxLzIgcGVsIGF0IEhvcml6b250YWwgZGlyZWN0aW9uCisgICAgICogU3RhcnRpbmcgYXQgKDAuNSwgLTIpIGF0IHRvcCBleHRlbmRpbmcgdG8gKDAuNSwgaGVpZ2h0ICsgMykgYXQgYm90dG9tCisgICAgICogQnVmIGNvbnRhaW5zIGEgMkQgYXJyYXkgb2Ygc2l6ZSAoaVdpZHRoKVgoaUhlaWdodCArIDUpCisgICAgICovCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQgKyA1OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcyA9ICh5LTIpICogaVNyY1N0ZXAgKyB4OworICAgICAgICAgICAgSGFsZkNvZWZmID0gCisgICAgICAgICAgICAgICAgcFNyYyBbcG9zIC0gMl0gLSAKKyAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zIC0gMV0gKyAKKyAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3Bvc10gKyAKKyAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3BvcyArIDFdIC0gCisgICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyArIDJdICsgCisgICAgICAgICAgICAgICAgcFNyYyBbcG9zICsgM107CisgICAgICAgICAgICBCdWYgW3kgKiBpV2lkdGggKyB4XSA9IChPTVhfUzE2KUhhbGZDb2VmZjsKKyAgICAgICAgfSAvKiB4ICovCisgICAgfSAvKiB5ICovCisKKyAgICAvKiBWZXJ0aWNhbCBpbnRlcnBvbGF0ZSAqLworICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcyA9IHkgKiBpV2lkdGggKyB4OworICAgICAgICAgICAgSGFsZkNvZWZmID0gCisgICAgICAgICAgICAgICAgQnVmIFtwb3NdIC0gCisgICAgICAgICAgICAgICAgNSAqIEJ1ZiBbcG9zICsgMSAqIGlXaWR0aF0gKyAKKyAgICAgICAgICAgICAgICAyMCAqIEJ1ZiBbcG9zICsgMiAqIGlXaWR0aF0gKyAKKyAgICAgICAgICAgICAgICAyMCAqIEJ1ZiBbcG9zICsgMyAqIGlXaWR0aF0gLSAKKyAgICAgICAgICAgICAgICA1ICogQnVmIFtwb3MgKyA0ICogaVdpZHRoXSArIAorICAgICAgICAgICAgICAgIEJ1ZiBbcG9zICsgNSAqIGlXaWR0aF07CisKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IChIYWxmQ29lZmYgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgSGFsZkNvZWZmID0gYXJtQ2xpcCgwLCAyNTUsIEhhbGZDb2VmZik7CisKKyAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gKE9NWF9VOCkgSGFsZkNvZWZmOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWMwMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCkBAIC0wLDAgKzEsODIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCisgICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCisgICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhfSU5UICAgICB4LCB5OworICAgIE9NWF9TMzIgICAgIEhhbGZDb2VmZiwgcG9zOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcG9zID0geSAqIGlTcmNTdGVwICsgeDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDJdIC0gCisgICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDFdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyXSArIAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDNdOworCisgICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgMTYpID4+IDU7CisgICAgICAgICAgICBIYWxmQ29lZmYgPSBhcm1DbGlwKDAsIDI1NSwgSGFsZkNvZWZmKTsKKworICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSBIYWxmQ29lZmY7CisgICAgICAgIH0gLyogeCAqLworICAgIH0gLyogeSAqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2VjZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgIAorICAgICBjb25zdCBPTVhfVTgqICAgIHBTcmMsIAorICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLCAKKyAgICAgT01YX1U4KiAgICBwRHN0LAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLCAKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsIAorICAgICBPTVhfVTMyICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhfUzMyICAgICBIYWxmQ29lZmYsIHBvczsKKyAgICBPTVhfSU5UICAgICB5LCB4OworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwb3MgPSB5ICogaVNyY1N0ZXAgKyB4OworICAgICAgICAgICAgSGFsZkNvZWZmID0gCisgICAgICAgICAgICAgICAgcFNyYyBbcG9zIC0gMiAqIGlTcmNTdGVwXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgLSAxICogaVNyY1N0ZXBdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxICogaVNyY1N0ZXBdIC0gCisgICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyArIDIgKiBpU3JjU3RlcF0gKyAKKyAgICAgICAgICAgICAgICBwU3JjIFtwb3MgKyAzICogaVNyY1N0ZXBdOworCisgICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgMTYpID4+IDU7CisgICAgICAgICAgICBIYWxmQ29lZmYgPSBhcm1DbGlwKDAsIDI1NSwgSGFsZkNvZWZmKTsKKworICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSAoT01YX1U4KSBIYWxmQ29lZmY7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDdkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKKyAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAorICAgICAgICBPTVhfVTggICAgICAqcERzdCwKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICAgICAgT01YX1UzMiAgICAgZHgsCisgICAgICAgIE9NWF9VMzIgICAgIGR5CispCit7CisgICAgT01YX1UzMiAgICAgRWlnaHRNaW51c2R4ID0gOCAtIGR4OworICAgIE9NWF9VMzIgICAgIEVpZ2h0TWludXNkeSA9IDggLSBkeTsKKyAgICBPTVhfVTMyICAgICBBQ29lZmYsIEJDb2VmZiwgQ0NvZWZmLCBEQ29lZmY7CisgICAgT01YX1UzMiAgICAgeCwgeTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR5ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY1N0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaURzdFN0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVdpZHRoID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlIZWlnaHQgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisgICAgLyogaWYgZnJhY3Rpb25sIG12IGlzIG5vdCAoMCwgMCkgKi8KKyAgICBpZiAoZHggIT0gMCB8fCBkeSAhPSAwKQorICAgIHsKKyAgICAgICAgQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5OworICAgICAgICBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeTsKKyAgICAgICAgQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHk7CisgICAgICAgIERDb2VmZiA9IGR4ICogZHk7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gKAorICAgICAgICAgICAgICAgICAgICBBQ29lZmYgKiBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XSArCisgICAgICAgICAgICAgICAgICAgIEJDb2VmZiAqIHBTcmMgW3kgKiBpU3JjU3RlcCArIHggKyAxXSArCisgICAgICAgICAgICAgICAgICAgIENDb2VmZiAqIHBTcmMgWyh5ICsgMSkgKiBpU3JjU3RlcCArIHhdICsKKyAgICAgICAgICAgICAgICAgICAgRENvZWZmICogcFNyYyBbKHkgKyAxKSAqIGlTcmNTdGVwICsgeCArIDFdICsKKyAgICAgICAgICAgICAgICAgICAgMzIpID4+IDY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gcFNyYyBbeSAqIGlTcmNTdGVwICsgeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5NzhkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCkBAIC0wLDAgKzEsMTk1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NNFAxMF9Db3B5CisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1NNFAxMF9Db3B5KCAgCisgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywKKyAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKKyAgICBPTVhfVTgqICAgICBwRHN0LAorICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLCAKKyAgICBPTVhfVTMyICAgICBpV2lkdGgsCisgICAgT01YX1UzMiAgICAgaUhlaWdodAorKQoreworICAgIE9NWF9VMzIgICAgIHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAorICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAorICAgICBPTVhfVTggICAgICpwRHN0LAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAorICAgICBPTVhfVTMyICAgIGlXaWR0aCwKKyAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAorICAgICBPTVhfVTMyICAgIGR4LAorICAgICBPTVhfVTMyICAgIGR5CispCit7CisgICAgT01YX1U4ICAgICAgcEJ1ZjEgWzE2KjE2XTsKKyAgICBjb25zdCBPTVhfVTggICAgICAqcFNyY0hhbGZIb3IgPSBwU3JjOworICAgIGNvbnN0IE9NWF9VOCAgICAgICpwU3JjSGFsZlZlciA9IHBTcmM7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDMsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyogV29yayBvdXQgcG9zaXRpb25zIGZvciBoYWxmIHBpeGVsIGludGVycG9sYXRpb24gKi8KKyAgICBpZiAoZHggPT0gMykKKyAgICB7CisgICAgICAgIHBTcmNIYWxmVmVyICs9IDE7CisgICAgfQorICAgIGlmIChkeSA9PSAzKQorICAgIHsKKyAgICAgICAgcFNyY0hhbGZIb3IgKz0gaVNyY1N0ZXA7CisgICAgfQorCisgICAgLyogU3dpdGNoIG9uIHR5cGUgb2YgcGl4ZWwKKyAgICAgKiBQaXhlbHMgYXJlIG5hbWVkICdhJyB0byAncycgYXMgaW4gdGhlIEguMjY0IHN0YW5kYXJkCisgICAgICovCisgICAgaWYgKGR4ID09IDAgJiYgZHkgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIEcgKi8KKyAgICAgICAgYXJtTTRQMTBfQ29weShwU3JjLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisgICAgfQorICAgIGVsc2UgaWYgKGR5ID09IDApCisgICAgeworICAgICAgICAvKiBhLCBiLCBjICovCisgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAgICAgICAgICAgIChwU3JjSGFsZkhvciwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOyAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKGR4ID09IDEgfHwgZHggPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgICAgICAgICAgKHBEc3QsIHBTcmNIYWxmVmVyLCBpRHN0U3RlcCwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGR4ID09IDApCisgICAgeworICAgICAgICAvKiBkLCBoLCBuICovCisgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKKyAgICAgICAgICAgIChwU3JjSGFsZlZlciwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworCisgICAgICAgIGlmIChkeSA9PSAxIHx8IGR5ID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAorICAgICAgICAgICAgICAgIChwRHN0LCBwU3JjSGFsZkhvciwgaURzdFN0ZXAsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChkeCA9PSAyIHx8IGR5ID09IDIpCisgICAgeworICAgICAgICAvKiBqICovCisgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCisgICAgICAgICAgICAocFNyYywgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworCisgICAgICAgIGlmIChkeCA9PSAxIHx8IGR4ID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGksIGsgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKKyAgICAgICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwQnVmMSwgaVdpZHRoLCBpV2lkdGgsIGlIZWlnaHQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgICAgICAgICAgKHBEc3QsIHBCdWYxLCBpRHN0U3RlcCwgaVdpZHRoLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHkgPT0gMSB8fCBkeSA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmLHEgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAgICAgICAgICAgICAgICAocFNyY0hhbGZIb3IsIGlTcmNTdGVwLCBwQnVmMSwgaVdpZHRoLCBpV2lkdGgsIGlIZWlnaHQpOworCisgICAgICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgICAgICAgICAocERzdCwgcEJ1ZjEsIGlEc3RTdGVwLCBpV2lkdGgsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogZHg9MSwzIGFuZCBkeT0xLDMgKi8KKyAgICB7CisgICAgICAgIC8qIGUsIGcsIHAsIHIgKi8KKyAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQorICAgICAgICAgICAgKHBTcmNIYWxmSG9yLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgICAgIChwQnVmMSwgcERzdCwgaVdpZHRoLCBpRHN0U3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTMwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMKQEAgLTAsMCArMSw4OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCA0eDQgaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQorICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQorICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgorICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZworICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqLworCit2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKQoreworICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOworCisgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQorICAgIHsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgIH0KKyAgICAgICAgQ291bnQrKzsKKyAgICB9CisgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgfQorICAgICAgICBDb3VudCsrOworICAgIH0KKyAgICBpZiAoQ291bnQ9PTApCisgICAgeworICAgICAgICBTdW0gPSAxMjg7CisgICAgfQorICAgIGVsc2UgaWYgKENvdW50PT0xKQorICAgIHsKKyAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7CisgICAgfQorICAgIGVsc2UgLyogQ291bnQgPSAyICovCisgICAgeworICAgICAgICBTdW0gPSAoU3VtICsgNCkgPj4gMzsKKyAgICB9CisgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpU3VtOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjViYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMKQEAgLTAsMCArMSwzMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIHRhYmxlcworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorCitjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM10gPQoreworICAgIHsxMzEwNywgNTI0MywgODA2Nn0sCisgICAgezExOTE2LCA0NjYwLCA3NDkwfSwKKyAgICB7MTAwODIsIDQxOTQsIDY1NTR9LAorICAgIHsgOTM2MiwgMzY0NywgNTgyNX0sCisgICAgeyA4MTkyLCAzMzU1LCA1MjQzfSwKKyAgICB7IDcyODIsIDI4OTMsIDQ1NTl9Cit9OyAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxZTA0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1NBRFF1YXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAorICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAorICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKKyAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKKwljb25zdCBPTVhfVTgqIAlwU3JjLAorICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKKyAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIqCXBEc3RTQUQsCisgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICBPTVhfVTMyICAgICBpV2lkdGgKKykKK3sKKyAgICBPTVhfSU5UICAgICB4LCB5OworICAgIE9NWF9TMzIgICAgIFNBRCA9IDA7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBTQUQgKz0gYXJtQWJzKHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdIC0gKCgKKyAgICAgICAgICAgICAgICAgICAgcFNyY1JlZjAgW3kgKiBpUmVmU3RlcDAgKyB4XSArIAorICAgICAgICAgICAgICAgICAgICBwU3JjUmVmMSBbeSAqIGlSZWZTdGVwMSArIHhdICsgMSkgPj4gMSkpOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAqcERzdFNBRCA9IFNBRDsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Zjc1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKQEAgLTAsMCArMSw4MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCB0cmFuc2Zvcm0gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorIAorLyoKKyAqIERlc2NyaXB0aW9uOgorICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKQoreworICAgIGludCBpOworCisgICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKKyAgICB7CisgICAgICAgIGludCBkMCA9IHBTcmNbaSswXTsKKyAgICAgICAgaW50IGQxID0gcFNyY1tpKzFdOworICAgICAgICBpbnQgZDIgPSBwU3JjW2krMl07CisgICAgICAgIGludCBkMyA9IHBTcmNbaSszXTsKKyAgICAgICAgaW50IGUwID0gZDAgKyBkMjsKKyAgICAgICAgaW50IGUxID0gZDAgLSBkMjsKKyAgICAgICAgaW50IGUyID0gKGQxPj4xKSAtIGQzOworICAgICAgICBpbnQgZTMgPSBkMSArIChkMz4+MSk7CisgICAgICAgIGludCBmMCA9IGUwICsgZTM7CisgICAgICAgIGludCBmMSA9IGUxICsgZTI7CisgICAgICAgIGludCBmMiA9IGUxIC0gZTI7CisgICAgICAgIGludCBmMyA9IGUwIC0gZTM7CisgICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KWYwOworICAgICAgICBwRHN0W2krMV0gPSAoT01YX1MxNilmMTsKKyAgICAgICAgcERzdFtpKzJdID0gKE9NWF9TMTYpZjI7CisgICAgICAgIHBEc3RbaSszXSA9IChPTVhfUzE2KWYzOworICAgIH0KKworICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGYwID0gcERzdFtpKzBdOworICAgICAgICBpbnQgZjEgPSBwRHN0W2krNF07CisgICAgICAgIGludCBmMiA9IHBEc3RbaSs4XTsKKyAgICAgICAgaW50IGYzID0gcERzdFtpKzEyXTsKKyAgICAgICAgaW50IGcwID0gZjAgKyBmMjsKKyAgICAgICAgaW50IGcxID0gZjAgLSBmMjsKKyAgICAgICAgaW50IGcyID0gKGYxPj4xKSAtIGYzOworICAgICAgICBpbnQgZzMgPSBmMSArIChmMz4+MSk7CisgICAgICAgIGludCBoMCA9IGcwICsgZzM7CisgICAgICAgIGludCBoMSA9IGcxICsgZzI7CisgICAgICAgIGludCBoMiA9IGcxIC0gZzI7CisgICAgICAgIGludCBoMyA9IGcwIC0gZzM7CisgICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KSgoaDArMzIpPj42KTsKKyAgICAgICAgcERzdFtpKzRdID0gKE9NWF9TMTYpKChoMSszMik+PjYpOworICAgICAgICBwRHN0W2krOF0gPSAoT01YX1MxNikoKGgyKzMyKT4+Nik7CisgICAgICAgIHBEc3RbaSsxMl0gPSAoT01YX1MxNikoKGgzKzMyKT4+Nik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhNDlmNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYwpAQCAtMCwwICsxLDc4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gaGVscGVyIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDJ4MiBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKQoreworICAgIGNvbnN0IE9NWF9VOCAqcFNyYyA9ICpwcFNyYzsKKyAgICBpbnQgaTsKKyAgICBpbnQgRmxhZywgVmFsdWU7CisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICBwRHN0W2ldID0gMDsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgICAgRmxhZyAgPSAqcFNyYysrOworICAgICAgICBpZiAoRmxhZyAmIDB4MTApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDE2IGJpdCAqLworICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOworICAgICAgICAgICAgVmFsdWUgPSBWYWx1ZSB8ICgoKnBTcmMrKyk8PDgpOworICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MDAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlIC09IDB4MTAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA4IGJpdCAqLworICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOworICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpID0gRmxhZyAmIDE1OworICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgfQorICAgIHdoaWxlICgoRmxhZyAmIDB4MjApPT0wKTsKKworICAgICpwcFNyYyA9IHBTcmM7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwZGNiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYwpAQCAtMCwwICsxLDc4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBoZWxwZXIgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgNHg0IGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispCit7CisgICAgY29uc3QgT01YX1U4ICpwU3JjID0gKnBwU3JjOworICAgIGludCBpOworICAgIGludCBGbGFnLCBWYWx1ZTsKKworICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCisgICAgeworICAgICAgICBwRHN0W2ldID0gMDsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgICAgRmxhZyAgPSAqcFNyYysrOworICAgICAgICBpZiAoRmxhZyAmIDB4MTApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDE2IGJpdCAqLworICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOworICAgICAgICAgICAgVmFsdWUgPSBWYWx1ZSB8ICgoKnBTcmMrKyk8PDgpOworICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MDAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlIC09IDB4MTAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA4IGJpdCAqLworICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOworICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpID0gRmxhZyAmIDE1OworICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgfQorICAgIHdoaWxlICgoRmxhZyAmIDB4MjApPT0wKTsKKworICAgICpwcFNyYyA9IHBTcmM7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGQ1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIDR4NCBvciA0eDggYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAorICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCisgKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCisgKgorICovCisgT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQorCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAorCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAorCSBPTVhfVTgqCQlwRHN0UHJlZCwKKwkgT01YX1UzMgkJaURzdFN0ZXAsIAorCSBPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA0KSAmJiAoaUhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDAgPT0gMCkgfHwgKGlQcmVkU3RlcDAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDEgPT0gMCkgfHwgKGlQcmVkU3RlcDEgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlEc3RTdGVwID09IDApIHx8IChpRHN0U3RlcCAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDQsIGlIZWlnaHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5MGUxMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGhhbGYgcGVsIEJsb2NrIG1hdGNoaW5nLCAKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKyAgICAKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKKyAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCisgKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKKyAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCisgKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLiBJZiAKKyAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09OCwgIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICBJZiAKKyAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAorICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCisgKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCisgCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYoCisgICAgY29uc3QgT01YX1U4KiBwU3JjT3JnWSwgCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwgCisgICAgY29uc3QgT01YX1U4KiBwU3JjUmVmWSwgCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwgCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLCAKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LCAKKyAgICBPTVhfVTMyIG5MYW1kYSwgCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBNVlByZWQsIAorICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjRHN0QmVzdE1WLCAKKyAgICBPTVhfUzMyKiBwQmVzdENvc3QKKykKK3sKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKyAgICBPTVhfSU5UICAgICBjYW5kU0FEOworICAgIE9NWF9JTlQgICAgIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7CisgICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KKyAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZZLCAqcFRlbXBTcmNPcmdZOworICAgIE9NWF9TMTYgICAgIHgsIHk7CisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCBjYW5kTVYsIGludGVnZXJNVjsKKyAgICBPTVhfVTggICAgICBpbnRlcnBvbFlbMjU2XTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKG5TcmNPcmdTdGVwICUgaUJsb2NrV2lkdGgpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZ1kgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0QmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgCisgICAgICAgICAgICAKKyAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovIAorICAgIGZyb21YID0gMTsKKyAgICB0b1ggICA9IDE7CisgICAgZnJvbVkgPSAxOworICAgIHRvWSAgID0gMTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCisgICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7CisgICAgCisgICAgaW50ZWdlck1WLmR4ID0gcFNyY0RzdEJlc3RNVi0+ZHg7CisgICAgaW50ZWdlck1WLmR5ID0gcFNyY0RzdEJlc3RNVi0+ZHk7CisgICAgCisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogKGludGVnZXJNVi5keS80KSkgKyAoaW50ZWdlck1WLmR4LzQpOworICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSArIHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZICsgKHkgKiBuU3JjUmVmU3RlcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVGVtcFNyY09yZ1kgPSBwU3JjT3JnWTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogUHJlcGFyZSBjYW5kIE1WICovCisgICAgICAgICAgICBjYW5kTVYuZHggPSBpbnRlZ2VyTVYuZHggKyB4ICogMjsKKyAgICAgICAgICAgIGNhbmRNVi5keSA9IGludGVnZXJNVi5keSArIHkgKiAyOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSBoYWxmIHBlbCBmb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24qLworICAgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZLAorICAgICAgICAgICAgICAgICAgICAgICAgblNyY1JlZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgYXJtQWJzKHgpICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFybUFicyh5KSAqIDIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLworICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCisgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY09yZ1ksCisgICAgICAgICAgICAgICAgICAgICAgICBuU3JjT3JnU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCk7CisgCisgICAgICAgICAgICBkaWZmTVYuZHggPSBjYW5kTVYuZHggLSBwTVZQcmVkLT5keDsKKyAgICAgICAgICAgIGRpZmZNVi5keSA9IGNhbmRNVi5keSAtIHBNVlByZWQtPmR5OworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZNViwgCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kU0FELCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIAorICAgICAgICAgICAgICAgICAgICAgICAgbkxhbWRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCZXN0Q29zdCk7CisKKyAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLworICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzY0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCkBAIC0wLDAgKzEsMTk2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jay4gSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTgsICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlLiBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCisgKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCisgKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaXRuZXJzIGFyZSBOVUxMOgorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAorICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KKyAKKyBPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorCSBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKwkgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAorICAgICBPTVhfUzMyICpwQmVzdENvc3QsCisgICAgIHZvaWQgKnBNRVNwZWMKKykKK3sKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKyAgICBPTVhfSU5UIGNhbmRTQUQ7CisgICAgT01YX0lOVCBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOworICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCisgICAgY29uc3QgT01YX1U4ICpwVGVtcFNyY1JlZlksICpwVGVtcFNyY09yZ1k7CisgICAgT01YX1MxNiB4LCB5OworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNVjsKKyAgICBPTVhfUzMyIG5TZWFyY2hSYW5nZTsKKyAgICBBUk1WQ000UDEwX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMTBfTUVTcGVjICopIHBNRVNwZWM7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmdZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1WQ2FuZGlkYXRlID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1JZ25vcmUgKHBNRVNwZWMpOworCisgICAgaWYoaUJsb2NrV2lkdGggPT0gNCkKKyAgICB7CisgICAgICAgIG5TZWFyY2hSYW5nZSA9IGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U0eDQ7CisgICAgfQorICAgIGVsc2UgaWYoaUJsb2NrV2lkdGggPT0gOCkKKyAgICB7CisgICAgICAgIG5TZWFyY2hSYW5nZSA9IGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U4eDg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5TZWFyY2hSYW5nZSA9IGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2UxNngxNjsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLyAKKyAgICBmcm9tWCA9IG5TZWFyY2hSYW5nZTsKKyAgICB0b1ggICA9IG5TZWFyY2hSYW5nZTsKKyAgICBmcm9tWSA9IG5TZWFyY2hSYW5nZTsKKyAgICB0b1kgICA9IG5TZWFyY2hSYW5nZTsKKyAgICAKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggLSBuU2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPngpCisgICAgeworICAgICAgICBmcm9tWCA9ICBwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPng7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT54ICsgaUJsb2NrV2lkdGggKyBuU2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT54ICsgcFJlZlJlY3QtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHRvWCAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eCkgLSBpQmxvY2tXaWR0aDsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgLSBuU2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPnkpCisgICAgeworICAgICAgICBmcm9tWSA9IHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eTsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgKyBpQmxvY2tXaWR0aCArIG5TZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnkgKyBwUmVmUmVjdC0+aGVpZ2h0KSkKKyAgICB7CisgICAgICAgIHRvWSAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eSkgLSBpQmxvY2tXaWR0aDsKKyAgICB9CisgICAgCisgICAgcEJlc3RNVi0+ZHggPSAtZnJvbVggKiA0OworICAgIHBCZXN0TVYtPmR5ID0gLWZyb21ZICogNDsKKyAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCisgICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7CisgICAgCisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogeSkgKyB4OworICAgICAgICAgICAgcFRlbXBTcmNPcmdZID0gcFNyY09yZ1k7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCisgICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKAkKKyAgICAJICAgICAgICBwVGVtcFNyY09yZ1ksCisgICAgCSAgICAgICAgblNyY09yZ1N0ZXAsCisgICAgCSAgICAgICAgcFRlbXBTcmNSZWZZLAorICAgIAkgICAgICAgIG5TcmNSZWZTdGVwLAorICAgIAkgICAgICAgICZjYW5kU0FELAorICAgIAkgICAgICAgIGlCbG9ja0hlaWdodCwKKyAgICAJICAgICAgICBpQmxvY2tXaWR0aCk7CisgICAgCSAgICAKKyAgICAgICAgICAgIGRpZmZNVi5keCA9ICh4ICogNCkgLSBwTVZQcmVkLT5keDsKKyAgICAgICAgICAgIGRpZmZNVi5keSA9ICh5ICogNCkgLSBwTVZQcmVkLT5keTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKCh4ICogNCksICh5ICogNCksIGRpZmZNViwgY2FuZFNBRCwgcEJlc3RNViwgbkxhbWRhLCBwQmVzdENvc3QpOworCisgICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KKyAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTNlZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwpAQCAtMCwwICsxLDE5OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgcXVhdGVyIHBlbCBCbG9jayBtYXRjaGluZywgCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorIAorICAgIAorLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCisgKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKKyAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKKyAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKKyAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLiBJZiAKKyAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09OCwgIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICBJZiAKKyAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAorICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworIAorT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyKAorICAgIGNvbnN0IE9NWF9VOCogcFNyY09yZ1ksIAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsIAorICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlZlksIAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsIAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwgCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwgCisgICAgT01YX1UzMiBuTGFtZGEsIAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwTVZQcmVkLCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0RzdEJlc3RNViwgCisgICAgT01YX1MzMiogcEJlc3RDb3N0CispCit7CisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisgICAgT01YX0lOVCAgICAgY2FuZFNBRDsKKyAgICBPTVhfSU5UICAgICBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOworICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCisgICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmWSwgKnBUZW1wU3JjT3JnWTsKKyAgICBPTVhfUzE2ICAgICB4LCB5OworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgY2FuZE1WLCBpbml0aWFsTVY7CisgICAgT01YX1U4ICAgICAgaW50ZXJwb2xZWzI1Nl07CisgICAgT01YX1MzMiAgICAgcGVsUG9zWCwgcGVsUG9zWTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKG5TcmNPcmdTdGVwICUgaUJsb2NrV2lkdGgpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZ1kgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0QmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgCisgICAgICAgICAgICAKKyAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovIAorICAgIGZyb21YID0gMTsKKyAgICB0b1ggICA9IDE7CisgICAgZnJvbVkgPSAxOworICAgIHRvWSAgID0gMTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCisgICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7CisgICAgCisgICAgaW5pdGlhbE1WLmR4ID0gcFNyY0RzdEJlc3RNVi0+ZHg7CisgICAgaW5pdGlhbE1WLmR5ID0gcFNyY0RzdEJlc3RNVi0+ZHk7CisgICAgCisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogKGluaXRpYWxNVi5keS80KSkgKyAoaW5pdGlhbE1WLmR4LzQpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZnJhY3QgcGVsIHBvc2l0aW9uICovCisgICAgICAgICAgICBwZWxQb3NYID0gKGluaXRpYWxNVi5keCAlIDQpICsgeDsKKyAgICAgICAgICAgIGlmIChwZWxQb3NYIDwgMCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZIC0gMTsKKyAgICAgICAgICAgICAgICBwZWxQb3NYICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZWxQb3NZID0gKGluaXRpYWxNVi5keSAlIDQpICsgeTsKKyAgICAgICAgICAgIGlmIChwZWxQb3NZIDwgMCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZIC0gKDEgKiBuU3JjUmVmU3RlcCk7CisgICAgICAgICAgICAgICAgcGVsUG9zWSArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwVGVtcFNyY09yZ1kgPSBwU3JjT3JnWTsgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFByZXBhcmUgY2FuZCBNViAqLworICAgICAgICAgICAgY2FuZE1WLmR4ID0gaW5pdGlhbE1WLmR4ICsgeDsKKyAgICAgICAgICAgIGNhbmRNVi5keSA9IGluaXRpYWxNVi5keSArIHk7CisgICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSBRdWF0ZXIgcGVsIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiovCisgICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCisgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlksCisgICAgICAgICAgICAgICAgICAgICAgICBuU3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBwZWxQb3NYLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVsUG9zWSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCisgICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKAkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjT3JnWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNPcmdTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAmY2FuZFNBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoKTsKKyAKKyAgICAgICAgICAgIGRpZmZNVi5keCA9IGNhbmRNVi5keCAtIHBNVlByZWQtPmR4OworICAgICAgICAgICAgZGlmZk1WLmR5ID0gY2FuZE1WLmR5IC0gcE1WUHJlZC0+ZHk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keCwgCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHksIAorICAgICAgICAgICAgICAgICAgICAgICAgZGlmZk1WLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgCisgICAgICAgICAgICAgICAgICAgICAgICBuTGFtZGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgcEJlc3RDb3N0KTsKKworICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCisgICAgfSAvKiBFbmQgb2YgeS1heGlzICovCisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3YjFiYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAorICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAorICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKKyAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAorICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAorICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAgICAgICAgICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmM2E2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpAQCAtMCwwICsxLDEwOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGx1bWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyAKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAorICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAorICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgICAgICAgICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKKwlPTVhfVTgqIHBTcmNEc3QsIAorCU9NWF9TMzIgc3JjZHN0U3RlcCwgCisJY29uc3QgT01YX1U4KiBwQWxwaGEsIAorCWNvbnN0IE9NWF9VOCogcEJldGEsIAorCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAorCWNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDE1LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKKworICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCisgICAgCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcysxNiwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMGRkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDg2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAorICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAorICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCisgKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCisgKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAorICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCisgKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCisgKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKKyAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKKyAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKiBwcFBvc0NvZWZidWYgICAgICAgIAorICkKKworeworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtPT1OVUxMICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtPT1OVUxMICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwT2Zmc2V0PT1OVUxMICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PDAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBPZmZzZXQ+NyAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmY9PU5VTEwgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBwUG9zQ29lZmJ1Zj09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwUG9zQ29lZmJ1Zj09TlVMTCAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIDQsIDQpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4M2QxZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDExNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCisgKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCisgKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAorICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCisgKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCisgKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKKyAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCisgKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCisgKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKKyAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKKyAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCisgKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCisgKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKKyAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCisgKgorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKKyApCit7CisgICAgaW50IG5UYWJsZTsKKworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtPT1OVUxMICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtPT1OVUxMICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwT2Zmc2V0PT1OVUxMICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PDAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBPZmZzZXQ+NyAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmY9PU5VTEwgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBwUG9zQ29lZmJ1Zj09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwUG9zQ29lZmJ1Zj09TlVMTCAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzVkxDU2VsZWN0PDAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNNYXhOdW1Db2VmZjwxNSAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc01heE51bUNvZWZmPjE2ICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICAvKiBGaW5kIFZMQyB0YWJsZSBudW1iZXIgKi8KKyAgICBpZiAoc1ZMQ1NlbGVjdDwyKQorICAgIHsKKyAgICAgICAgblRhYmxlID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoc1ZMQ1NlbGVjdDw0KQorICAgIHsKKyAgICAgICAgblRhYmxlID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoc1ZMQ1NlbGVjdDw4KQorICAgIHsKKyAgICAgICAgblRhYmxlID0gMjsKKyAgICB9CisgICAgZWxzZSAvKiBzVkxDU2VsZWN0ID49IDggKi8KKyAgICB7CisgICAgICAgIG5UYWJsZSA9IDM7CisgICAgfQorCisgICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgblRhYmxlLCBzTWF4TnVtQ29lZmYpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNWExNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRGVxdWFudGl6ZSBMdW1hIEFDIGJsb2NrCisgKi8KKworc3RhdGljIHZvaWQgRGVxdWFudEx1bWFBQzR4NCgKKyAgICAgT01YX1MxNiogcFNyY0RzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCispCit7CisgICAgY29uc3QgT01YX1U4ICpwVlJvdyA9ICZhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07CisgICAgaW50IFNoaWZ0ID0gUVAgLyA2OworICAgIGludCBpOworICAgIE9NWF9TMzIgVmFsdWU7CisKKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKworICAgICAgICBWYWx1ZSA9IChwU3JjRHN0W2ldICogcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdDsKKyAgICAgICAgcFNyY0RzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAorICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKKyAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAorICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCisgKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCisgKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKKyAqIDEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKKyAqICAgICAgICAgICAgZXhpc3QgCisgKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKKyAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKKyAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAorICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgY29uc3QgT01YX1U4ICpwUHJlZCwKKyAgICAgY29uc3QgT01YX1MxNiAqcERDLAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgcHJlZFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX0lOVCBBQyAgICAgICAgCispCit7CisgICAgT01YX1MxNiBwQnVmZmVyWzE2KzRdOworICAgIE9NWF9TMTYgKnBEZWx0YTsKKyAgICBpbnQgaSx4LHk7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQgPT0gTlVMTCwgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBQcmVkKSxPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCAgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZFN0ZXAgJiAzLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDMsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgKFFQPDApLCAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgKFFQPjUxKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgcHBTcmM9PU5VTEwsICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgKnBwU3JjPT1OVUxMLCAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUM9PTAgJiYgcERDPT1OVUxMLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgcERlbHRhID0gYXJtQWxpZ25UbzhCeXRlcyhwQnVmZmVyKTsgICAgCisKKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcERlbHRhW2ldID0gMDsKKyAgICB9CisgICAgaWYgKEFDKQorICAgIHsKKyAgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NChwcFNyYywgcERlbHRhKTsKKyAgICAgICAgRGVxdWFudEx1bWFBQzR4NChwRGVsdGEsIFFQKTsKKyAgICB9CisgICAgaWYgKHBEQykKKyAgICB7CisgICAgICAgIHBEZWx0YVswXSA9IHBEQ1swXTsKKyAgICB9CisgICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChwRGVsdGEscERlbHRhKTsKKworICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUscFByZWRbeSpwcmVkU3RlcCt4XSArIHBEZWx0YVs0KnkreF0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlZGVlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBjaHJvbWEgZGVibG9jayBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAorICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAorICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAorICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCisgICAgIE9NWF9VOCogcFNyY0RzdCwKKyAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKKyAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKKyAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAorICkKK3sKKyAgICBpbnQgSSwgWCwgWSwgSW50ZXJuYWw9MDsKKworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZm9yIChZPTA7IFk8ODsgWSs9NCwgSW50ZXJuYWw9MSkKKyAgICB7CisgICAgICAgIGZvciAoWD0wOyBYPDg7IFgrKykKKyAgICAgICAgeworICAgICAgICAgICAgSSA9IChYPj4xKSs0KihZPj4xKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW0ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA+IDMpICYmIChwQlNbSV0gPT0gNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA8IDQpICAgICAgICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAoIChwQlNbSV0gPT0gNCkgJiYgKHBCU1tJXjFdICE9IDQpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCisgICAgICAgICAgICAKKworICAgICAgICAgICAgLyogRmlsdGVyIGhvcml6b250YWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKKyAgICAgICAgICAgICAgICBzcmNkc3RTdGVwLAorICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzWyhYPj4xKSs0KihZPj4yKV0sCisgICAgICAgICAgICAgICAgcEFscGhhW0ludGVybmFsXSwKKyAgICAgICAgICAgICAgICBwQmV0YVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJTW0ldLAorICAgICAgICAgICAgICAgIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiMjU5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBkZWJsb2NraW5nIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKKyAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAorICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKKyAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKKyAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAorICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKKyAgICAgT01YX1U4KiBwU3JjRHN0LAorICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAorICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAorICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCisgKQoreworICAgIGludCBJLCBYLCBZLCBJbnRlcm5hbD0wOworCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGFbMF0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVsxXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZm9yIChYPTA7IFg8ODsgWCs9NCwgSW50ZXJuYWw9MSkKKyAgICB7CisgICAgICAgIGZvciAoWT0wOyBZPDg7IFkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSSA9IChZPj4xKSs0KihYPj4xKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW0ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoICggKHBCU1tJXSA9PSA0KSAmJiAocEJTW0leM10gIT0gNCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkc1tZXSA+IDI1LCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgICAgICAKKworICAgICAgICAgICAgLyogRmlsdGVyIHZlcnRpY2FsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1soWT4+MSkrNCooWD4+MildLAorICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCU1tJXSwKKyAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhMzdkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGx1bWEgZGVibG9jayBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLXMgdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAorICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKKyAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCisgICAgIE9NWF9VOCogcFNyY0RzdCwKKyAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKKyAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKKyAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAorICkKK3sKKyAgICBpbnQgSSwgWCwgWSwgSW50ZXJuYWw9MDsKKworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBmb3IgKFk9MDsgWTwxNjsgWSs9NCwgSW50ZXJuYWw9MSkKKyAgICB7CisgICAgICAgIGZvciAoWD0wOyBYPDE2OyBYKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEkgPSAoWD4+MikrNCooWT4+Mik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPCA0KSAgICAgICAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCAocEJTW0ldID09IDQpICYmIChwQlNbSV4xXSAhPSA0KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBGaWx0ZXIgaG9yaXpvbnRhbCBlZGdlIHdpdGggcTAgYXQgKFgsWSkgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAorICAgICAgICAgICAgICAgIHBTcmNEc3QgKyBZKnNyY2RzdFN0ZXAgKyBYLAorICAgICAgICAgICAgICAgIHNyY2RzdFN0ZXAsCisgICAgICAgICAgICAgICAgcFRocmVzaG9sZHNbSV0sCisgICAgICAgICAgICAgICAgcEFscGhhW0ludGVybmFsXSwKKyAgICAgICAgICAgICAgICBwQmV0YVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJTW0ldLAorICAgICAgICAgICAgICAgIDApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzMzNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwpAQCAtMCwwICsxLDEyOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgbHVtYSBkZWJsb2NrIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCisgKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKKyAqICAgICAgICAgICAgICBpcyBOVUxMLiAKKyAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAorICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAorICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKKyAgICAgT01YX1U4KiBwU3JjRHN0LAorICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAorICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAorICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCisgKQoreworICAgIGludCBYLCBZLCBJLCBJbnRlcm5hbD0wOworCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSxPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDE1LCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzBdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGFbMV0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKworICAgIGZvciAoWD0wOyBYPDE2OyBYKz00LCBJbnRlcm5hbD0xKQorICAgIHsKKyAgICAgICAgZm9yIChZPTA7IFk8MTY7IFkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSSA9IChZPj4yKSs0KihYPj4yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW1ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZigocEJTW1ldID09IDQpICYmIChZID4gMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZigoIChwQlNbWV0gPT0gNCkgJiYgKHBCU1tZXjNdICE9IDQpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHNbWV0gPiAyNSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBGaWx0ZXIgdmVydGljYWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKKyAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzW0ldLAorICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCU1tJXSwKKyAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0dldFZMQ0luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWM1OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0dldFZMQ0luZm8uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIAorICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKKyAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKKyAqIHN0cnVjdHVyZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKKyAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKKyAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKKyAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKKyAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKKyAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCisgKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCisgKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKKyAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAorCWNvbnN0IE9NWF9TMTYqCQkgICAgcFNyY0NvZWZmLAorCWNvbnN0IE9NWF9VOCoJCQkgICAgcFNjYW5NYXRyaXgsCisJT01YX1U4CQkJICAgIGJBQywKKwlPTVhfVTMyCQkJICAgIE1heE51bUNvZWYsCisJT01YVkNNNFAxMFZMQ0luZm8qCXBEc3RWTENJbmZvCispCit7CisgICAgT01YX0lOVCAgICAgaSwgTWluSW5kZXg7CisgICAgT01YX1MzMiAgICAgVmFsdWU7CisgICAgT01YX1UzMiAgICAgTWFzayA9IDQsIFJ1bkJlZm9yZTsKKyAgICBPTVhfUzE2ICAgICAqcExldmVsOworICAgIE9NWF9VOCAgICAgICpwUnVuOworICAgIE9NWF9TMTYgICAgIEJ1ZiBbMTZdOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0NvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjQ29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU2Nhbk1hdHJpeCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0VkxDSW5mbyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihiQUMgPiAxLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihNYXhOdW1Db2VmID4gMTYsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyogSW5pdGlhbGl6ZSBSTEUgSW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMgPSAwOworICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zID0gMDsKKyAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcyA9IDA7CisgICAgcERzdFZMQ0luZm8tPnVUb3RhbFplcm9zID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcERzdFZMQ0luZm8tPmlMZXZlbHMgW2ldID0gMDsKKyAgICAgICAgcERzdFZMQ0luZm8tPnVSdW5zIFtpXSA9IDA7CisgICAgfQorICAgIAorICAgIE1pbkluZGV4ID0gKGJBQyA9PSAwICYmIE1heE51bUNvZWYgPT0gMTUpID8gMSA6IDA7CisgICAgZm9yIChpID0gTWluSW5kZXg7IGkgPCAoTWF4TnVtQ29lZiArIE1pbkluZGV4KTsgaSsrKQorICAgIHsgICAgICAgIAorICAgICAgICAvKiBTY2FuICovCisgICAgICAgIEJ1ZiBbaSAtIE1pbkluZGV4XSA9IHBTcmNDb2VmZiBbcFNjYW5NYXRyaXggW2ldXTsKKyAgICB9CisKKyAgICAvKiBza2lwIHplcm9zIGF0IHRoZSBlbmQgKi8KKyAgICBpID0gTWF4TnVtQ29lZiAtIDE7CisgICAgd2hpbGUgKCFCdWYgW2ldICYmIGkgPj0gMCkKKyAgICB7CisgICAgICAgIGktLTsKKyAgICB9CisgICAgCisgICAgaWYgKGkgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisgICAgfQorCisgICAgLyogRmlsbCBSTEUgSW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICBwTGV2ZWwgPSBwRHN0VkxDSW5mby0+aUxldmVsczsKKyAgICBwUnVuID0gcERzdFZMQ0luZm8tPnVSdW5zOworICAgIFJ1bkJlZm9yZSA9IDA7CisKKyAgICAvKiBIYW5kbGUgZmlyc3Qgbm9uIHplcm8gc2VwYXJhdGUgKi8KKyAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcysrOworICAgIFZhbHVlID0gQnVmIFtpXTsKKyAgICBpZiAoVmFsdWUgPT0gMSB8fCBWYWx1ZSA9PSAtMSkKKyAgICB7CisgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lcysrOworICAgICAgICAKKyAgICAgICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVfU2lnbnMgfD0gCisgICAgICAgICAgICBWYWx1ZSA9PSAtMSA/IE1hc2sgOiAwOworICAgICAgICBNYXNrID4+PSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAoVmFsdWUgPiAwID8gMSA6IC0xKTsKKyAgICAgICAgKnBMZXZlbCsrID0gVmFsdWU7CisgICAgICAgIE1hc2sgPSAwOworICAgIH0KKworICAgIC8qIFJlbWFpbmluZyBub24gemVybyAqLworICAgIHdoaWxlICgtLWkgPj0gMCkKKyAgICB7CisgICAgICAgIFZhbHVlID0gQnVmIFtpXTsKKyAgICAgICAgaWYgKFZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcysrOworCisgICAgICAgICAgICAvKiBNYXNrIGJlY29tZXMgemVybyBhZnRlciBlbnRlcmluZyAqLworICAgICAgICAgICAgaWYgKE1hc2sgJiYKKyAgICAgICAgICAgICAgICAoVmFsdWUgPT0gMSB8fCAKKyAgICAgICAgICAgICAgICAgVmFsdWUgPT0gLTEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lcysrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zIHw9IAorICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PSAtMSA/IE1hc2sgOiAwOworICAgICAgICAgICAgICAgIE1hc2sgPj49IDE7CisgICAgICAgICAgICAgICAgKnBSdW4rKyA9IFJ1bkJlZm9yZTsKKyAgICAgICAgICAgICAgICBSdW5CZWZvcmUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIElmIDMgdHJhaWxpbmcgb25lcyBhcmUgbm90IGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIGlmIChNYXNrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWFzayA9IDA7CisgICAgICAgICAgICAgICAgICAgIFZhbHVlIC09IChWYWx1ZSA+IDAgPyAxIDogLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcExldmVsKysgPSBWYWx1ZTsKKyAgICAgICAgICAgICAgICAqcFJ1bisrID0gUnVuQmVmb3JlOworICAgICAgICAgICAgICAgIFJ1bkJlZm9yZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRvdGFsWmVyb3MrKzsKKyAgICAgICAgICAgIFJ1bkJlZm9yZSsrOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyogVXBkYXRlIGxhc3QgcnVuICovCisgICAgaWYgKFJ1bkJlZm9yZSkKKyAgICB7CisgICAgICAgICpwUnVuKysgPSBSdW5CZWZvcmU7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyNGRlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpAQCAtMCwwICsxLDk5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCisgKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAorICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aC4gCisgKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAorICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAorICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCisgICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgZHgsCisgICAgIE9NWF9TMzIgZHksCisgICAgIE9NWFNpemUgcm9pCisgKQoreworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwIDwgOCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDgsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR4IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR5ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCAhPSAyKSAmJiAocm9pLndpZHRoICE9IDQpICYmIChyb2kud2lkdGggIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kuaGVpZ2h0ICE9IDIpICYmIChyb2kuaGVpZ2h0ICE9IDQpICYmIChyb2kuaGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDIpICYmIGFybU5vdDJCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSA0KSAmJiBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gOCkgJiYgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAorICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwYmVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgSGFsZiBob3Jpem9udGFsIGx1bWEgaW50ZXJwb2xhdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAorICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCisgKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgtMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCisgKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAorICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0TGVmdCwgCisgICAgICAgIE9NWF9VOCogICAgIHBEc3RSaWdodCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAorKQoreworICAgIE9NWFJlc3VsdCAgIFJldFZhbHVlOyAgICAKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdExlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFJpZ2h0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gNCkgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RMZWZ0KSAmJgorICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0UmlnaHQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDgpICYmIAorICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0TGVmdCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFJpZ2h0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSAxNikgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0TGVmdCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RSaWdodCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCWFybVJldEFyZ0VycklmKChpV2lkdGggIT0gMTYpICYmIChpV2lkdGggIT0gOCkmJiAoaVdpZHRoICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCisgICAgICAgIHBTcmMgLSAxLCAgICAgCisgICAgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgcERzdExlZnQsICAgICAKKyAgICAgICAgaURzdFN0ZXAsIAorICAgICAgICBpV2lkdGgsICAgCisgICAgICAgIGlIZWlnaHQpOworCisgICAgaWYgKFJldFZhbHVlICE9IE9NWF9TdHNfTm9FcnIpCisgICAgeworICAgICAgICByZXR1cm4gUmV0VmFsdWU7CisgICAgfQorCisgICAgUmV0VmFsdWUgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKKyAgICAgICAgcFNyYywgICAgIAorICAgICAgICBpU3JjU3RlcCwgCisgICAgICAgIHBEc3RSaWdodCwgICAgIAorICAgICAgICBpRHN0U3RlcCwgCisgICAgICAgIGlXaWR0aCwgICAKKyAgICAgICAgaUhlaWdodCk7CisKKyAgICByZXR1cm4gUmV0VmFsdWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2MGZmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKKyAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCisgT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAKKyAgICAgY29uc3QgT01YX1U4KiAgICBwU3JjLCAKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwgCisgICAgIE9NWF9VOCogICAgcERzdFVwLCAKKyAgICAgT01YX1U4KiAgICBwRHN0RG93biwgCisgICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsIAorICAgICBPTVhfVTMyICAgIGlXaWR0aCwgCisgICAgIE9NWF9VMzIgICAgaUhlaWdodAorKQoreworICAgIE9NWFJlc3VsdCAgIFJldFZhbHVlOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0VXAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdERvd24gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSA0KSAmJiAKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFVwKSAmJgorICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0RG93biksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gOCkgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdERvd24pLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDE2KSAmJiAKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3REb3duKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCisJYXJtUmV0QXJnRXJySWYoKGlXaWR0aCAhPSAxNikgJiYgKGlXaWR0aCAhPSA4KSYmIChpV2lkdGggIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgUmV0VmFsdWUgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgCisgICAgICAgIHBTcmMgLSBpU3JjU3RlcCwgCisgICAgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgcERzdFVwLAorICAgICAgICBpRHN0U3RlcCwgCisgICAgICAgIGlXaWR0aCwgCisgICAgICAgIGlIZWlnaHQpOworICAgIAorICAgIGlmIChSZXRWYWx1ZSAhPSBPTVhfU3RzX05vRXJyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJldFZhbHVlOworICAgIH0KKworICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggIAorICAgICAgICBwU3JjLCAKKyAgICAgICAgaVNyY1N0ZXAsIAorICAgICAgICBwRHN0RG93biwKKyAgICAgICAgaURzdFN0ZXAsIAorICAgICAgICBpV2lkdGgsIAorICAgICAgICBpSGVpZ2h0KTsKKyAgICAKKyAgICByZXR1cm4gUmV0VmFsdWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjMzNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYwpAQCAtMCwwICsxLDk5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIAorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCisgKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC1yZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCisgKiAgIGRzdFN0ZXAgLWRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aCAKKyAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCisgKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlciBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZCBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyYywKKyAgICAgT01YX1MzMiBzcmNTdGVwLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBkeCwKKyAgICAgT01YX1MzMiBkeSwKKyAgICAgT01YU2l6ZSByb2kgICAgICAgIAorICkKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCA8IHJvaS53aWR0aCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IHJvaS53aWR0aCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPCAwLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeCA+IDMsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR5IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHkgPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoICE9IDQpICYmIChyb2kud2lkdGggIT0gOCkgJiYgKHJvaS53aWR0aCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kuaGVpZ2h0ICE9IDQpICYmIChyb2kuaGVpZ2h0ICE9IDgpICYmIChyb2kuaGVpZ2h0ICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSA0KSAmJiBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gOCkgJiYgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDE2KSAmJiBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKSAKKworICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEgCisgICAgICAgIChwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJhMDMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgIAorICogY29lZmZpY2llbnRzIGFuZCBxdWFudGl6YXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMoCisJY29uc3QgT01YX1MxNiogCXBTcmMsCisJT01YX1MxNioJcERzdCwKKwlPTVhfVTMyCQlpUVAKKykKK3sKKyAgICBPTVhfSU5UICAgICBpLCBqOworICAgIE9NWF9TMzIgICAgIG1bMl1bMl07CisgICAgT01YX1MzMiAgICAgUVBlciwgVjAwLCBWYWx1ZTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKiBJbnYgSGFkYW1hcmQgVHJhbnNmb3JtIGZvciAyeDIgYmxvY2sgKi8KKyAgICBtWzBdWzBdID0gcFNyY1swXSArIHBTcmNbMV0gKyAgcFNyY1syXSArIHBTcmNbM107CisgICAgbVswXVsxXSA9IHBTcmNbMF0gLSBwU3JjWzFdICsgIHBTcmNbMl0gLSBwU3JjWzNdOworICAgIG1bMV1bMF0gPSBwU3JjWzBdICsgcFNyY1sxXSAtICBwU3JjWzJdIC0gcFNyY1szXTsKKyAgICBtWzFdWzFdID0gcFNyY1swXSAtIHBTcmNbMV0gLSAgcFNyY1syXSArIHBTcmNbM107CisKKyAgICAvKiBRdWFudGl6YXRpb24gKi8KKyAgICAvKiBTY2FsaW5nICovCisgICAgUVBlciA9IGlRUCAvIDY7CisgICAgVjAwID0gYXJtVkNNNFAxMF9WTWF0cml4IFtpUVAgJSA2XVswXTsKKworICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUVBlciA8IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgPSAobVtqXVtpXSAqIFYwMCkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSA9IChtW2pdW2ldICogVjAwKSA8PCAoUVBlciAtIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwRHN0W2ogKiAyICsgaV0gPSAoT01YX1MxNikgVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2IxMjAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCkBAIC0wLDAgKzEsMTI4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHF1YW50aXphdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMoCQorCWNvbnN0IE9NWF9TMTYqIAlwU3JjLAorCU9NWF9TMTYqCXBEc3QsCisJT01YX1UzMgkJaVFQCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzMyICAgICBtMVs0XVs0XSwgbTJbNF1bNF0sIFZhbHVlOworICAgIE9NWF9TMzIgICAgIFFQZXIsIFY7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyogSW52IEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgREMgTHVtYSA0eDQgYmxvY2sgKi8KKyAgICAvKiBIb3Jpem9udGFsICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGogPSBpICogNDsKKyAgICAgICAgCisgICAgICAgIG0xW2ldWzBdID0gcFNyY1tqICsgMF0gKyBwU3JjW2ogKyAyXTsgLyogYStjICovCisgICAgICAgIG0xW2ldWzFdID0gcFNyY1tqICsgMV0gKyBwU3JjW2ogKyAzXTsgLyogYitkICovCisgICAgICAgIG0xW2ldWzJdID0gcFNyY1tqICsgMF0gLSBwU3JjW2ogKyAyXTsgLyogYS1jICovCisgICAgICAgIG0xW2ldWzNdID0gcFNyY1tqICsgMV0gLSBwU3JjW2ogKyAzXTsgLyogYi1kICovCisKKyAgICAgICAgbTJbaV1bMF0gPSBtMVtpXVswXSArIG0xW2ldWzFdOyAvKiBhK2IrYytkICovCisgICAgICAgIG0yW2ldWzFdID0gbTFbaV1bMl0gKyBtMVtpXVszXTsgLyogYStiLWMtZCAqLworICAgICAgICBtMltpXVsyXSA9IG0xW2ldWzJdIC0gbTFbaV1bM107IC8qIGEtYi1jK2QgKi8KKyAgICAgICAgbTJbaV1bM10gPSBtMVtpXVswXSAtIG0xW2ldWzFdOyAvKiBhLWIrYy1kICovCisKKyAgICB9CisKKyAgICAvKiBWZXJ0aWNhbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBtMVswXVtpXSA9IG0yWzBdW2ldICsgbTJbMl1baV07CisgICAgICAgIG0xWzFdW2ldID0gbTJbMV1baV0gKyBtMlszXVtpXTsKKyAgICAgICAgbTFbMl1baV0gPSBtMlswXVtpXSAtIG0yWzJdW2ldOworICAgICAgICBtMVszXVtpXSA9IG0yWzFdW2ldIC0gbTJbM11baV07CisKKyAgICAgICAgbTJbMF1baV0gPSBtMVswXVtpXSArIG0xWzFdW2ldOworICAgICAgICBtMlsxXVtpXSA9IG0xWzJdW2ldICsgbTFbM11baV07CisgICAgICAgIG0yWzJdW2ldID0gbTFbMl1baV0gLSBtMVszXVtpXTsKKyAgICAgICAgbTJbM11baV0gPSBtMVswXVtpXSAtIG0xWzFdW2ldOworICAgIH0KKworICAgIAorICAgIC8qIFNjYWxpbmcgKi8KKyAgICBRUGVyID0gaVFQIC8gNjsKKyAgICBWID0gYXJtVkNNNFAxMF9WTWF0cml4IFtpUVAgJSA2XVswXTsKKworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUVBlciA8IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgPSAobTJbal1baV0gKiBWICsgKDEgPDwgKDEgLSBRUGVyKSkpID4+ICgyIC0gUVBlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgPSBtMltqXVtpXSAqIFYgKiAoMSA8PCAoUVBlciAtIDIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcERzdFtqICogNCArIGldID0gKE9NWF9TMTYpIFZhbHVlOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwMzk5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnZlcnNlIGludGVnZXIgNHg0IHRyYW5zZm9ybQorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKKyAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKKyAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIG1hdHJpeC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCgKKwljb25zdCBPTVhfVTgqIAlwU3JjUHJlZCwgCisJY29uc3QgT01YX1MxNiogCXBEZXF1YW50Q29lZmYsIAorCU9NWF9VOCogCXBEc3RSZWNvbiwKKwlPTVhfVTMyIAlpU3JjUHJlZFN0ZXAsIAorCU9NWF9VMzIJCWlEc3RSZWNvblN0ZXAsIAorCU9NWF9VOAkJYkFDCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzE2ICAgICBJblsxNl0sIE91dFsxNl07CisgICAgT01YX1MzMiAgICAgVmFsdWU7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY1ByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRGVxdWFudENvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRGVxdWFudENvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFJlY29uID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0UmVjb24pLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihiQUMgPiAxLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpU3JjUHJlZFN0ZXAgPT0gMCB8fCBpU3JjUHJlZFN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpRHN0UmVjb25TdGVwID09IDAgfHwgaURzdFJlY29uU3RlcCAmIDMsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgaWYgKGJBQykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBJbltpXSA9IHBEZXF1YW50Q29lZmYgW2ldOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIENvcHkgREMgKi8KKyAgICAgICAgSW5bMF0gPSBwRGVxdWFudENvZWZmIFswXTsKKyAgICAKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEluW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlc2lkdWFsIFRyYW5zZm9ybSAqLworICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQgKE91dCwgSW4pOyAgICAKKyAgICAKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogQWRkIHByZWRpdGlvbiAqLworICAgICAgICAgICAgVmFsdWUgPSAoT01YX1MzMikgT3V0IFtqICogNCArIGldICsgcFNyY1ByZWQgW2ogKiBpU3JjUHJlZFN0ZXAgKyBpXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogU2F0dXJhdGUgVmFsdWUgdG8gT01YX1U4ICovCisgICAgICAgICAgICBWYWx1ZSA9IGFybUNsaXAgKDAsIDI1NSwgVmFsdWUpOworCisgICAgICAgICAgICBwRHN0UmVjb25baiAqIGlEc3RSZWNvblN0ZXAgKyBpXSA9IChPTVhfVTgpIFZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzNhNWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYwpAQCAtMCwwICsxLDcwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAorICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCisgKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRU1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyAgICApCit7CisgICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFwU2l6ZSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIKSAmJiAKKyAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2IDw9IDApIHx8IAorICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOHg4IDw9IDApIHx8IAorICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlNHg0IDw9IDApLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgICAgICAgICAgICAgCisgICAgKnBTaXplID0gKE9NWF9JTlQpIHNpemVvZihBUk1WQ000UDEwX01FU3BlYyk7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVjYzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYwpAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9NRUluaXQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCisgKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCisgKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKKyAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCisgKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKKyAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCisgKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCisgKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCisgKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKKyAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCisgKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAorICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCgKKyAgICAgICAgT01YVkNNNFAxME1FTW9kZSBNRU1vZGUsCisgICAgICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgICAgICB2b2lkICpwTUVTcGVjCisgICAgICAgKQoreworICAgIEFSTVZDTTRQMTBfTUVTcGVjICphcm1NRVNwZWMgPSAoQVJNVkNNNFAxMF9NRVNwZWMgKikgcE1FU3BlYzsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIXBNRVNwZWMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCkgJiYgCisgICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiA8PSAwKSB8fCAKKyAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTh4OCA8PSAwKSB8fCAKKyAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NCA8PSAwKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuYmxvY2tTcGxpdEVuYWJsZTh4OCA9IHBNRVBhcmFtcy0+YmxvY2tTcGxpdEVuYWJsZTh4ODsKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmJsb2NrU3BsaXRFbmFibGU0eDQgPSBwTUVQYXJhbXMtPmJsb2NrU3BsaXRFbmFibGU0eDQ7CisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5oYWxmU2VhcmNoRW5hYmxlICAgID0gcE1FUGFyYW1zLT5oYWxmU2VhcmNoRW5hYmxlOworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMucXVhcnRlclNlYXJjaEVuYWJsZSA9IHBNRVBhcmFtcy0+cXVhcnRlclNlYXJjaEVuYWJsZTsKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmludHJhRW5hYmxlNHg0ICAgICAgPSBwTUVQYXJhbXMtPmludHJhRW5hYmxlNHg0OyAgICAgCisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTE2eDE2ICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2OyAgIAorICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U4eDggICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U4eDg7CisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTR4NCAgICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NDsKKyAgICBhcm1NRVNwZWMtPk1FTW9kZSAgICAgICAgICAgICAgICAgICAgICAgPSBNRU1vZGU7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2RiZjNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpAQCAtMCwwICsxLDE4OTIgQEAKKy8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4CisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gTUIgbGV2ZWwgbW90aW9uIGVzdGltYXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FUyAgICAgKDE1KQorI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYXzR4NF9TQUQJCSgweGZmZmYpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfTU9ERV9WQUxVRSAgICAgKDB4ZmZmZmZmZmYpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfTU9ERVMgICAgICAgICAgKDE2KQorI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUJfQkxPQ0tfU0laRSAgICAgICgxNikKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01FRElBTihhLGIsYykgICAgICAoYT5iP2E+Yz9iPmM/YjpjOmE6Yj5jP2E+Yz9hOmM6YikKKyNkZWZpbmUgIEFSTV9WQ000UDEwX1NISUZUX1FQICAgICAgICAgICAoMTIpCisKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9NRURJQU4gICAgICAoMCkKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9MICAgICAgICAgICAoMSkKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9VICAgICAgICAgICAoMikKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9VUiAgICAgICAgICAoMykKKworI2RlZmluZSBBUk1fVkNNNFAxMF9NQl9CTE9DS19TSVpFICAgICAgICgxNikKKyNkZWZpbmUgQVJNX1ZDTTRQMTBfQkxPQ0tfU0laRSAgICAgICAgICAoNCkKKyNkZWZpbmUgQVJNX1ZDTTRQMTBfTUFYX0NPU1QgICAgICAgICAgICAoMSA8PCAzMCkKKyNkZWZpbmUgIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgICAgICAoLTIpCisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9DYWxjdWxhdGVCbG9ja1NBRAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgQ2FsY3VsYXRlIFNBRCB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIE1CIGVuY29kaW5nIG1vZGUgYW5kIHVwZGF0ZSAKKyAqIHBEc3RCbG9ja1NBRCBwYXJhbWV0ZXIuIFRoZXNlIFNBRCB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgNHg0IGJsb2NrcyBhdAorICogYSB0aW1lIGFuZCBpbiB0aGUgc2NhbiBvcmRlci4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNNQkluZm8gICAgLSAKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAtIAorICogW2luXSBTcmNDdXJyU3RlcCAgIC0gCisgKiBbaW5dIHBTcmNSZWZCdWZMaXN0LSAKKyAqIFtpbl0gU3JjUmVmU3RlcCAgICAtIAorICogW2luXSBwU3JjUmVjQnVmICAgIC0gCisgKiBbaW5dIFNyY1JlY1N0ZXAgICAgLSAKKyAqIFtpbl0gcFJlZlJlY3QgICAgICAtIAorICogW2luXSBwQ3VyclBvaW50UG9zIC0gCisgKiBbaW5dIExhbWJkYSAgICAgICAgLSAKKyAqIFtpbl0gcE1FU3BlYyAgICAgICAtIAorICogW2luXSBwTUJJbnRlciAgICAgIC0gCisgKiBbaW5dIHBNQkludHJhICAgICAgLSAKKyAqIFtvdXRdIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gMTYgZWxlbWVudCBhcnJheSBmb3IgU0FEIGNvcnJlc3BvbmRpbmcgdG8gNHg0IGJsb2NrcworICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICoKKyAqLworCitzdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfQ2FsY3VsYXRlQmxvY2tTQUQoCisJT01YVkNNNFAxME1CSW5mbyAqcFNyY01CSW5mbywgCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJT01YX1MzMiBTcmNDdXJyU3RlcCwgCisJY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKKwlPTVhfUzMyIFNyY1JlZlN0ZXAsCisJY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLCAKKwlPTVhfUzMyIFNyY1JlY1N0ZXAsCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKwljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwgCisJY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCisJT01YX1UxNiAqcERzdEJsb2NrU0FEKQoreworCU9NWF9JTlQJCUludmFsaWRTQUQgPSAwOworCU9NWF9JTlQJCWk7CisKKwlPTVhfVTgJCUJ1ZmZlciBbMTYqMTYgKyAxNV07CisJT01YX1U4CQkqcFRlbXBEc3RCdWY7CisJT01YX1MzMgkJVGVtcERzdFN0ZXA7CisJT01YX1U4CQkqcFRlbXBSZWZCdWY7CisJT01YX1MzMgkJVGVtcFJlZlN0ZXA7IAorCisJLyogVGVtcG9yYXJ5IGJ1ZmZlciB0byBzdG9yZSB0aGUgcHJlZGljdGVkIG1iIGNvZWZmaWNpZW50cyAqLworCXBUZW1wRHN0QnVmID0gYXJtQWxpZ25UbzE2Qnl0ZXMoQnVmZmVyKTsKKwlUZW1wRHN0U3RlcCA9IDE2OworCisJLyogVXBkYXRlIHBEc3RCbG9ja1NBRCBpZiBNQiBpcyBhIHZhbGlkIHR5cGUgKi8KKwlpZiAocFNyY01CSW5mbykKKwl7CisJICAgIE9NWF9VMzIgICAgIFdpZHRoPTAsIEhlaWdodD0wLCBNYXhYUGFydCwgTWF4WVBhcnQsTWF4U3ViWFBhcnQsTWF4U3ViWVBhcnQ7CisJICAgIAorCQkvKiBEZXBlbmRpbmcgb24gdHlwZSBvZiBNQiwgZG8gcHJlZGljdGlvbiBhbmQgZmlsbCB0ZW1wIGJ1ZmZlciAqLworCQlzd2l0Y2ggKHBTcmNNQkluZm8tPm1iVHlwZSkKKwkJeworCQljYXNlIE9NWF9WQ19QXzE2eDE2OgorCQkJCVdpZHRoID0gMTY7CisJCQkJSGVpZ2h0ID0gMTY7CisJCQkJYnJlYWs7CisJCWNhc2UgT01YX1ZDX1BfMTZ4ODoKKwkJCQlXaWR0aCA9IDE2OworCQkJCUhlaWdodCA9IDg7CisJCQkJYnJlYWs7CisJCWNhc2UgT01YX1ZDX1BfOHgxNjoKKwkJCQlXaWR0aCA9IDg7CisJCQkJSGVpZ2h0ID0gMTY7CisJCQkJYnJlYWs7CisJCWNhc2UgT01YX1ZDX1BfOHg4OgorCQkJCVdpZHRoID0gODsKKwkJCQlIZWlnaHQgPSA4OworCQkJCWJyZWFrOworCQljYXNlIE9NWF9WQ19JTlRSQV80eDQ6CisJCQl7CisJCQkJLyogQ3JlYXRlIHByZWRpY3RlZCBNQiBJbnRyYTR4NCBtb2RlICovCisJCQkJT01YX1MzMiAgICAgUHJlZEludHJhNHg0TW9kZSBbNV1bOV07CisJCQkJT01YX1MzMgkJeCwgeSwgQmxvY2s4eDgsIEJsb2NrNHg0LCBCbG9ja1gsIEJsb2NrWTsKKwkJCQlPTVhfVTggICAgICBwU3JjWUJ1ZmYgWygxNiozKSooMTYqMildOworCQkJCU9NWF9VOAkJKnBTcmNZOworCQkJCU9NWF9TMzIgICAgIFN0ZXBTcmNZOworCQkJCU9NWF9TMzIJCWF2YWlsYWJpbGl0eTsKKworCQkJCWZvciAoeSA9IDA7IHkgPCA1OyB5KyspCisJCQkJeworCQkJCQlmb3IgKHggPSAwOyB4IDwgOTsgeCsrKQorCQkJCQl7CisJCQkJCQkvKiAKKwkJCQkJCSAqIEluaXRpYWxpemUgd2l0aCB2YWx1ZSBvZiBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLLCB0byBtZWFuIHRoaXMgCisJCQkJCQkgKiA0eDQgYmxvY2sgaXMgbm90IGF2YWlsYWJsZSAKKwkJCQkJCSAqLworCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbeV1beF0gPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLOworCQkJCQl9CisJCQkJfQorCisJCQkJLyogUmVwbGFjZSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHZhbHVlIHdpdGggYXZhaWxhYmxlIE1CcyB2YWx1ZXMqLworCQkJCWZvciAoeCA9IDA7IHggPCA0OyB4KyspCisJCQkJeworCQkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgYjAsIGIxLCBiMiwgYjMgKi8KKwkJCQkJaWYgKHBNQkludHJhWzFdICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJCVByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyAxXSA9IAorCQkJCQkJCXBNQkludHJhWzFdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsgICAgICAgICAgICAKKwkJCQkJfQorCQkJICAgICAgICAKKwkJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGQwLCBkMSwgZDIsIGQzICovCisJCQkJCWlmIChwTUJJbnRyYVszXSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgNV0gPSAKKwkJCQkJCQlwTUJJbnRyYVszXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07CisJCQkJCX0KKwkJCQl9CisJCSAgICAKKwkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgYzMgKi8KKwkJCQlpZiAocE1CSW50cmFbMl0gIT0gTlVMTCkKKwkJCQl7CisJCQkJCVByZWRJbnRyYTR4NE1vZGUgWzBdWzBdID0gcE1CSW50cmFbMl0tPnBJbnRyYTR4NFByZWRNb2RlWzE1XTsKKwkJCQl9CisJCSAgICAKKwkJCQlmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQorCQkJCXsKKwkJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGEwLCBhMSwgYTIsIGEzICovCisJCQkJCWlmIChwTUJJbnRyYVswXSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlQcmVkSW50cmE0eDRNb2RlIFt5ICsgMV1bMF0gPSAKKwkJCQkJCQlwTUJJbnRyYVswXS0+cEludHJhNHg0UHJlZE1vZGVbeSo0ICsgM107CisJCQkJCX0KKwkJCQl9CisJCSAgICAgICAgCisJCQkJLyoKKwkJCQkgKiBVcGRhdGUgbmVpZ2hib3VyaW5nIFByZWQgbW9kZSBhcnJheSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yCisJCQkJICogcHJlZGljdGlvbiBvZiBJbnRyYTR4NCBtb2Rlcy4KKwkJCQkgKi8KKwkJCSAgICAKKwkJCQlwU3JjWSA9IHBTcmNZQnVmZjsKKwkJCQlTdGVwU3JjWSA9IDE2ICogMzsKKwkJCQlmb3IgKHkgPSAwOyB5IDwgKDE2ICogMik7IHkrKykKKwkJCQl7CisJCQkJCWZvciAoeCA9IDA7IHggPCAoMTYgKiAzKTsgeCsrKQorCQkJCQl7CisJCQkJCQlwU3JjWSBbU3RlcFNyY1kgKiB5ICsgeF0gPSAKKwkJCQkJCQlwU3JjUmVjQnVmIFtTcmNSZWNTdGVwICogKHkgLSAxNikgKyB4IC0gMTZdOworCQkJCQl9CisJCQkJfQorCisJCSAgICAKKwkJCQkvKiBmb3IgZWFjaCA4eDggYmxvY2sgKi8KKwkJCQlmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQorCQkJCXsKKwkJCQkJLyogZm9yIGVhY2ggNHg0IGJsb2NrIGluc2lkZSA4eDggYmxvY2sgKi8KKwkJCQkJZm9yIChCbG9jazR4NCA9IDA7IEJsb2NrNHg0IDwgNDsgQmxvY2s0eDQrKykKKwkJCQkJeworCQkJCQkJLyogR2V0IGJsb2NrIGNvcmRpbmF0ZXMgZnJvbSA4eDggYmxvY2sgaW5kZXggYW5kIDR4NCBibG9jayBpbmRleCAqLworCQkJCQkJQmxvY2tYID0gKChCbG9jazh4OCAmIDEpIDw8IDEpICsgKEJsb2NrNHg0ICYgMSk7CisJCQkJCQlCbG9ja1kgPSAoKEJsb2NrOHg4ID4+IDEpIDw8IDEpICsgKEJsb2NrNHg0ID4+IDEpOworCQkJCQkgICAgCisJCQkJCQkvKiBBZGQgb2Zmc2V0IHRvIHBvaW50IHRvIHN0YXJ0IG9mIGN1cnJlbnQgTUIgaW4gdGhlIGFycmF5IHBJbnRyYTR4NFByZWRNb2RlICovCisJCQkJCQl4ID0gQmxvY2tYICsgMTsKKwkJCQkJCXkgPSBCbG9ja1kgKyAxOworCisJCQkJCQlhdmFpbGFiaWxpdHkgPSAwOworCisJCQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgQmxvY2sgKi8KKwkJCQkJCWlmIChQcmVkSW50cmE0eDRNb2RlIFt5XVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKwkJCQkJCXsKKwkJCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKKwkJCQkJCX0KKworCQkJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBCbG9jayAqLworCQkJCQkJaWYgKFByZWRJbnRyYTR4NE1vZGUgW3kgLSAxXVt4XSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorCQkJCQkJeworCQkJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKKwkJCQkJCX0KKworCQkJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBMRUZUIEJsb2NrICovCisJCQkJCQlpZiAoUHJlZEludHJhNHg0TW9kZSBbeSAtIDFdW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorCQkJCQkJeworCQkJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAorCQkJCQkJfQorCQkJCQkJCisJCQkJCQlQcmVkSW50cmE0eDRNb2RlIFt5XVt4XSA9IHBTcmNNQkluZm8tPnBJbnRyYTR4NFByZWRNb2RlW0Jsb2NrWSo0K0Jsb2NrWF07CisJCQkJCQl4ID0gQmxvY2tYICogNDsKKwkJCQkJCXkgPSBCbG9ja1kgKiA0OworCisJCQkJCQlwU3JjWSA9IHBTcmNZQnVmZiArIDE2ICogU3RlcFNyY1kgKyAxNiArIHkgKiBTdGVwU3JjWSArIHg7CisKKwkJCQkJCW9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCgKKwkJCQkJCQkgcFNyY1kgLSAxLAorCQkJCQkJCSBwU3JjWSAtIFN0ZXBTcmNZLAorCQkJCQkJCSBwU3JjWSAtIFN0ZXBTcmNZIC0gMSwKKwkJCQkJCQkgcFRlbXBEc3RCdWYgKyB4ICsgeSAqIFRlbXBEc3RTdGVwLAorCQkJCQkJCSBTdGVwU3JjWSwKKwkJCQkJCQkgVGVtcERzdFN0ZXAsCisJCQkJCQkJIHBTcmNNQkluZm8tPnBJbnRyYTR4NFByZWRNb2RlW0Jsb2NrWSo0K0Jsb2NrWF0sCisJCQkJCQkJIGF2YWlsYWJpbGl0eSk7CisKKwkJCQkJCWZvciAoQmxvY2tZPTA7QmxvY2tZPDQ7QmxvY2tZKyspCisJCQkJCQl7CisJCQkJCQkJZm9yKEJsb2NrWD0wO0Jsb2NrWDw0O0Jsb2NrWCsrKQorCQkJCQkJCXsKKwkJCQkJCQkJcFNyY1kgW0Jsb2NrWSAqIFN0ZXBTcmNZICsgQmxvY2tYXSA9IAorCQkJCQkJCQkJKE9NWF9VOCkoKihwVGVtcERzdEJ1ZiArIHggKyB5ICogVGVtcERzdFN0ZXAgKyBCbG9ja1kgKiBUZW1wRHN0U3RlcCArIEJsb2NrWCkpOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQljYXNlIE9NWF9WQ19JTlRSQV8xNngxNjoKKwkJCXsKKwkJCQlPTVhfVTMyICAgICBNQlBvc1ggPSBwQ3VyclBvaW50UG9zLT54ID4+IDQ7ICAgICAgICAKKwkJCQlPTVhfVTMyICAgICBNQlBvc1kgPSBwQ3VyclBvaW50UG9zLT55ID4+IDQ7ICAgICAgICAKKwkJCQlPTVhfVTMyCQlhdmFpbGFiaWxpdHkgPSAwOworCisJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIE1CICovCisJCQkJaWYgKChNQlBvc1ggIT0gMCkgJiYgKHBNQkludHJhIFswXSAhPSAwIHx8IHBNQkludGVyIFswXSAhPSAwKSkKKwkJCQl7CisJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAorCQkJCX0KKworCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAgTUIgKi8KKwkJCQlpZiAoKE1CUG9zWSAhPSAwKSAmJiAocE1CSW50cmEgWzFdICE9IDAgfHwgcE1CSW50ZXIgWzFdICE9IDApKQorCQkJCXsKKwkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAorCQkJCX0KKworCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAtTEVGVCBNQiAqLworCQkJCWlmICgoTUJQb3NYID4gMCkgJiYgKE1CUG9zWSA+IDApICYmIAorCQkJCQkocE1CSW50cmEgWzJdICE9IDAgfHwgcE1CSW50ZXIgWzJdICE9IDApKQorCQkJCXsKKwkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCisJCQkJfQorCisJCQkJb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoCisJCQkJCQlwU3JjUmVjQnVmIC0gMSwgCisJCQkJCQlwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCwgCisJCQkJCQlwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCAtIDEsIAorCQkJCQkJcFRlbXBEc3RCdWYsIAorCQkJCQkJU3JjUmVjU3RlcCwgCisJCQkJCQlUZW1wRHN0U3RlcCwgCisJCQkJCQlwU3JjTUJJbmZvLT5JbnRyYTE2eDE2UHJlZE1vZGUsIAorCQkJCQkJYXZhaWxhYmlsaXR5KTsKKwkJCQkKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIE9NWF9WQ19JTlRFUl9TS0lQOgorCQljYXNlIE9NWF9WQ19QUkVGMF84eDg6CisJCWNhc2UgT01YX1ZDX0lOVFJBX1BDTToKKwkJZGVmYXVsdDoKKwkJCS8qIFRoZXNlIGNhc2VzIHdpbGwgdXBkYXRlIHBEc3RCbG9ja1NBRCB3aXRoIE1BWCB2YWx1ZSAqLworCQkJSW52YWxpZFNBRCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qIElOVEVSIE1CICovCisJCWlmICgocFNyY01CSW5mby0+bWJUeXBlID09IE9NWF9WQ19QXzE2eDE2KSB8fAorCQkJKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF84eDE2KSB8fAorCQkJKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF8xNng4KSB8fAorCQkJKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF84eDgpKQorCQl7CisgICAgICAgIAljb25zdCBPTVhfVTgJCSpwVGVtcFNyY0J1ZjsKKyAgICAgICAgCU9NWF9TMzIJCVRlbXBTcmNTdGVwOworICAgICAgICAJT01YX1MzMgkJbXZ4LG12eTsKKyAgICAgICAgCU9NWF9VMzIJCVBhcnRYLCBQYXJ0WSwgU3ViUGFydFgsIFN1YlBhcnRZOworICAgICAgICAJCisJCQlUZW1wU3JjU3RlcCA9IFNyY1JlZlN0ZXA7CisKKwkJCU1heFhQYXJ0ID0gMTYvV2lkdGg7CisJCQlNYXhZUGFydCA9IDE2L0hlaWdodDsKKworCisJCQlmb3IgKFBhcnRZID0gMDsgUGFydFkgPCBNYXhZUGFydDsgUGFydFkrKykKKwkJCXsKKwkJCQlmb3IgKFBhcnRYID0gMDsgUGFydFggPCBNYXhYUGFydDsgUGFydFgrKykKKwkJCQl7CisKKwkJCQkJcFRlbXBTcmNCdWYgPSBwU3JjUmVmQnVmTGlzdFtwU3JjTUJJbmZvLT5wUmVmTDBJZHhbUGFydFkgKiAyICsgUGFydFhdXTsKKworCQkJCQlpZiAoTWF4WFBhcnQgPT0gMiAmJiBNYXhZUGFydCA9PSAyKQorCQkJCQl7CisgICAgICAgIAkJCQlzd2l0Y2ggKHBTcmNNQkluZm8tPnN1Yk1CVHlwZVtQYXJ0WSoyK1BhcnRYXSkKKyAgICAgICAgCQkJCXsKKyAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF84eDg6CisJCQkJCQkJCVdpZHRoID0gODsKKwkJCQkJCQkJSGVpZ2h0ID0gODsKKyAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfOHg0OgorCQkJCQkJCQlXaWR0aCA9IDg7CisJCQkJCQkJCUhlaWdodCA9IDQ7CisgICAgICAgICAgICAJCQkJICAgIGJyZWFrOworICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzR4ODoKKwkJCQkJCQkJV2lkdGggPSA0OworCQkJCQkJCQlIZWlnaHQgPSA4OworICAgICAgICAgICAgCQkJCSAgICBicmVhazsKKyAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF80eDQ6CisJCQkJCQkJCVdpZHRoID0gNDsKKwkJCQkJCQkJSGVpZ2h0ID0gNDsKKyAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQkgICAgZGVmYXVsdDoKKwkJCQkJCQkJLyogRGVmYXVsdCAqLworCQkJCQkJCQlXaWR0aCA9IDQ7CisJCQkJCQkJCUhlaWdodCA9IDQ7CisgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQl9CisJCQkJCQorICAgIAkJCQkgICAgTWF4U3ViWFBhcnQgPSA4L1dpZHRoOworICAgIAkJCQkgICAgTWF4U3ViWVBhcnQgPSA4L0hlaWdodDsKKworCQkJCQkJZm9yIChTdWJQYXJ0WSA9IDA7IFN1YlBhcnRZIDwgTWF4U3ViWVBhcnQ7IFN1YlBhcnRZKyspCisJCQkJCQl7CisJCQkJCQkJZm9yIChTdWJQYXJ0WCA9IDA7IFN1YlBhcnRYIDwgTWF4U3ViWFBhcnQ7IFN1YlBhcnRYKyspCisJCQkJCQkJeworCQkJCQkJCQltdnggPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZICsgU3ViUGFydFldWzIqUGFydFggKyBTdWJQYXJ0WF0uZHg7CisJCQkJCQkJCW12eSA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFkgKyBTdWJQYXJ0WV1bMipQYXJ0WCArIFN1YlBhcnRYXS5keTsKKwkJCQkJCQkJYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorCQkJCQkJCQkJcFRlbXBTcmNCdWYgKyAoOCpQYXJ0WCArIDQqU3ViUGFydFggKyAobXZ4LzQpKSArICg4KlBhcnRZICsgNCpTdWJQYXJ0WSArIChtdnkvNCkpICogVGVtcFNyY1N0ZXAsCisJCQkJCQkJCQlUZW1wU3JjU3RlcCwKKwkJCQkJCQkJCXBUZW1wRHN0QnVmICsgKDgqUGFydFggKyA0KlN1YlBhcnRYKSArICg4KlBhcnRZICsgNCpTdWJQYXJ0WSkgKiBUZW1wRHN0U3RlcCwKKwkJCQkJCQkJCVRlbXBEc3RTdGVwLAorCQkJCQkJCQkJV2lkdGgsCisJCQkJCQkJCQlIZWlnaHQsCisJCQkJCQkJCQltdnggJiAzLAorCQkJCQkJCQkJbXZ5ICYgMworCQkJCQkJCQkJKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisKKwkJCQkJCW12eCA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFldWzIqUGFydFhdLmR4OworCQkJCQkJbXZ5ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WV1bMipQYXJ0WF0uZHk7CisJCQkJCQlhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCisJCQkJCQkJcFRlbXBTcmNCdWYgKyAoOCpQYXJ0WCArIChtdngvNCkpICsgKDgqUGFydFkgKyAobXZ5LzQpKSAqIFRlbXBTcmNTdGVwLAorCQkJCQkJCVRlbXBTcmNTdGVwLAorCQkJCQkJCXBUZW1wRHN0QnVmICsgKDgqUGFydFgpICsgKDgqUGFydFkpICogVGVtcERzdFN0ZXAsCisJCQkJCQkJVGVtcERzdFN0ZXAsCisJCQkJCQkJV2lkdGgsCisJCQkJCQkJSGVpZ2h0LAorCQkJCQkJCW12eCAmIDMsCisJCQkJCQkJbXZ5ICYgMworCQkJCQkJCSk7CisKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlJbnZhbGlkU0FEID0gMTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgU0FEIGZyb20gcHJlZGljdGVkIGJ1ZmZlciAqLworCWlmICghSW52YWxpZFNBRCkKKwl7CisJICAgIE9NWF9VMzIgICAgIHg4eDgsIHk4eDgsIHg0eDQsIHk0eDQsIEJsb2NrOHg4LCBCbG9jazR4NDsKKwkgICAgT01YX1MzMiAgICAgU0FEOworCSAgICAKKwkJcFRlbXBSZWZCdWYgPSBwVGVtcERzdEJ1ZjsKKwkJVGVtcFJlZlN0ZXAgPSAxNjsKKworCQkvKiBTQUQgZm9yIGVhY2ggNHg0IGJsb2NrIGluIHNjYW4gb3JkZXIgKi8KKwkJZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKKwkJeworCQkJeDh4OCA9IDgqKEJsb2NrOHg4ICYgMSk7CisJCQl5OHg4ID0gOCooQmxvY2s4eDggPj4gMSk7CisJCQlmb3IgKEJsb2NrNHg0ID0gMDsgQmxvY2s0eDQgPCA0OyBCbG9jazR4NCsrKQorCQkJeworCQkJCXg0eDQgPSA0KihCbG9jazR4NCAmIDEpOworCQkJCXk0eDQgPSA0KihCbG9jazR4NCA+PiAxKTsKKworCQkJCWFybVZDQ09NTV9TQUQoCQorCQkJCQlwU3JjQ3VyckJ1ZiArICh4OHg4ICsgeDR4NCkgKyAoeTh4OCArIHk0eDQpICogU3JjQ3VyclN0ZXAsIAorCQkJCQlTcmNDdXJyU3RlcCwKKwkJCQkJcFRlbXBSZWZCdWYgKyAoeDh4OCArIHg0eDQpICsgKHk4eDggKyB5NHg0KSAqIFRlbXBSZWZTdGVwLAorCQkJCQlUZW1wUmVmU3RlcCwKKyAgICAJCQkJJlNBRCwKKyAgICAJCQkJNCwgLyogSGVpZ2h0ICovCisgICAgCQkJCTQpOyAvKiBXaWR0aCAqLworICAgICAgICAgICAgICAgICoocERzdEJsb2NrU0FEICsgNCAqIEJsb2NrOHg4ICsgQmxvY2s0eDQpID0gKFNBRCA8IDB4N2ZmZikgPyAoT01YX1UxNikgU0FEIDogQVJNX1ZDTTRQMTBfTUFYX01PREVfVkFMVUU7ICAgCQkJICAgIAorIAkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQkvKiBGaWxsIFNBRHMgd2l0aCBtYXggdmFsdWVzIGFuZCByZXR1cm4qLworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJcERzdEJsb2NrU0FEIFtpXSA9IEFSTV9WQ000UDEwX01BWF80eDRfU0FEOworCQl9CisJfQorCXJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9Nb2RlNHg0RGVjaXNpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIEludHJhIDR4NCBNb2RlIGRlY2lzaW9uIGJ5IGNhbGN1bGF0aW5nIGNvc3QgZm9yIGFsbCBwb3NzaWJsZSBtb2RlcyBhbmQKKyAqIGNob29zaW5nIHRoZSBiZXN0IG1vZGUKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIG9mIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmCisgKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB0aGUgT01YVkNNNFAxME1CSW5mbyB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgZmllbGQgcEludHJhNHg0UHJlZE1vZGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBbaW5dIEJsb2NrOHg4ICAgIC0gSW5kZXggOHg4IGJsb2NrIGluIHdoaWNoIGN1cnJlbnQgNHg0IGJsb2NrIGJlbG9uZ3MKKyAqIFtpbl0gQmxvY2s0eDQgICAgLSBJbmRleCBvZiBjdXJyZW50IDR4NCBibG9jaworICogW2luL291dF0gcFByZWRJbnRyYTR4NFNyY1kgLSBQb2ludGVyIHRvIGN1cnJlbnQgYmxvY2sgbG9jYXRpb24gaW4gYnVmZmVyIAorICogICAgICAgICAgICAgICAgICAgIHdpdGggcmVjb25zdHJ1Y3RlZCB2YWx1ZXMuIFRoaXMgd2lsbCBiZSBtb2RpZmllZCBieSB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aCBiZXN0IG1vZGUgcHJlZGljdGVkIHZhbHVlcyAKKyAqIFtpbl0gU3RlcFByZWRJbnRyYTR4NFNyY1kgIC0gU3RlcCBzaXplIG9mIHRoZSBwb2ludGVyIHBQcmVkSW50cmE0eDRTcmNZCisgKiBbaW5dIHBJbnRyYTR4NFByZWRNb2RlICAgICAtIEFycmF5IG9mIEludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIHRoZSBNQi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudCBNQiBtb2RlcyBzdGFydHMgYXQgWzEsMV0uCisgKiBbaW5dIHBCZXN0Q29zdCAgIC0gQ29zdCBmb3IgdGhlIEJlc3QgSW50cmEgNHg0IG1vZGUKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqCisgKi8KK3N0YXRpYyBPTVhWb2lkIGFybVZDTTRQMTBfTW9kZTR4NERlY2lzaW9uICgKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisgICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfUzMyIEJsb2NrOHg4LAorICAgIE9NWF9TMzIgQmxvY2s0eDQsCisgICAgT01YX1U4ICAqcFByZWRJbnRyYTR4NFNyY1ksCisgICAgT01YX1MzMiBTdGVwUHJlZEludHJhNHg0U3JjWSwKKyAgICBPTVhfUzMyIHBJbnRyYTR4NFByZWRNb2RlIFtdWzldLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKQoreworICAgIE9NWF9TMzIgICAgIGksIGosIHgsIHksIEJsb2NrWCwgQmxvY2tZLCBtb2RlOworICAgIE9NWF9TMzIgICAgIENvc3QsIEJlc3RDb3N0OworICAgIE9NWF9VOCAgICAgICpwU3JjWTsKKyAgICBPTVhfUzMyICAgICBTdGVwU3JjWTsKKyAgICBPTVhfUzMyICAgICBhdmFpbGFiaWxpdHkgPSAwOworICAgIE9NWF9VOCAgICAgIHBQcmVkQmxvY2sgWzQqNF07CisgICAgT01YUmVzdWx0ICAgUmV0ID0gT01YX1N0c19FcnI7CisKKyAgICAvKiBHZXQgYmxvY2sgY29yZGluYXRlcyBmcm9tIDh4OCBibG9jayBpbmRleCBhbmQgNHg0IGJsb2NrIGluZGV4ICovCisgICAgQmxvY2tYID0gKChCbG9jazh4OCAmIDEpIDw8IDEpICsgKEJsb2NrNHg0ICYgMSk7CisgICAgQmxvY2tZID0gKChCbG9jazh4OCA+PiAxKSA8PCAxKSArIChCbG9jazR4NCA+PiAxKTsKKyAgICAKKyAgICAvKiBBZGQgb2Zmc2V0IHRvIHBvaW50IHRvIHN0YXJ0IG9mIGN1cnJlbnQgTUIgaW4gdGhlIGFycmF5IHBJbnRyYTR4NFByZWRNb2RlICovCisgICAgeCA9IEJsb2NrWCArIDE7CisgICAgeSA9IEJsb2NrWSArIDE7CisKKyAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgQmxvY2sgKi8KKyAgICBpZiAocEludHJhNHg0UHJlZE1vZGUgW3ldW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBCbG9jayAqLworICAgIGlmIChwSW50cmE0eDRQcmVkTW9kZSBbeSAtIDFdW3hdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBMRUZUIEJsb2NrICovCisgICAgaWYgKHBJbnRyYTR4NFByZWRNb2RlIFt5IC0gMV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKKyAgICB9CisKKyAgICBwU3JjWSA9IHBQcmVkSW50cmE0eDRTcmNZICsgCisgICAgICAgICAgICBTdGVwUHJlZEludHJhNHg0U3JjWSAqIChCbG9ja1kgPDwgMikgKyAKKyAgICAgICAgICAgIChCbG9ja1ggPDwgMik7CisgICAgICAgICAgICAKKyAgICBTdGVwU3JjWSA9IFN0ZXBQcmVkSW50cmE0eDRTcmNZOworICAgICAgICAgICAgICAKKyAgICB4ID0gQmxvY2tYICogNDsKKyAgICB5ID0gQmxvY2tZICogNDsKKworICAgIENvc3QgPSBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgIAorICAgIC8qIEdvIHRocm91Z2ggZWFjaCBtb2RlIGZvciBtaW5pbSBjb3N0ICovCisgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IDk7IG1vZGUrKykKKyAgICB7CisgICAgICAgIFJldCA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCgKKyAgICAgICAgICAgICBwU3JjWSAtIDEsCisgICAgICAgICAgICAgcFNyY1kgLSBTdGVwU3JjWSwKKyAgICAgICAgICAgICBwU3JjWSAtIFN0ZXBTcmNZIC0gMSwKKyAgICAgICAgICAgICBwUHJlZEJsb2NrLAorICAgICAgICAgICAgIFN0ZXBTcmNZLAorICAgICAgICAgICAgIDQsCisgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKSBtb2RlLAorICAgICAgICAgICAgIGF2YWlsYWJpbGl0eSk7CisgICAgICAgICAgICAgCisgICAgICAgIGlmIChSZXQgPT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtVkNDT01NX1NBRCggICAgCisgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYgKyAoeSAqIFNyY0N1cnJTdGVwKSArIHgsCisgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgcFByZWRCbG9jaywKKyAgICAgICAgICAgICAgICA0LAorICAgICAgICAgICAgICAgICZDb3N0LAorICAgICAgICAgICAgICAgIDQsCisgICAgICAgICAgICAgICAgNCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChDb3N0IDwgQmVzdENvc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQmVzdENvc3QgPSBDb3N0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBJbnRyYTR4NFByZWRNb2RlIFtCbG9ja1kgKyAxXVtCbG9ja1ggKyAxXSA9IAorICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpIG1vZGU7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBJbnRyYTR4NFByZWRNb2RlIFtCbG9ja1kgKiA0ICsgQmxvY2tYXSA9IAorICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpIG1vZGU7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1kgW1N0ZXBTcmNZICogaiArIGldID0gcFByZWRCbG9jayBbNCAqIGogKyBpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpwQmVzdENvc3QgPSBCZXN0Q29zdDsKKyAgICByZXR1cm47Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgZG8gdGhlIE1WIFByZWRpY3Rpb24gZm9yIEludGVyIE1CcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIEJsb2NrU3RhcnRYIC0gU3RhcnQgWCBpbmRleCBpbiBpbnRlZ2VyIHBlbHMgaW4gY3VycmVudCBCbG9jaworICogW2luXSBCbG9ja1N0YXJ0WSAtIFN0YXJ0IFkgaW5kZXggaW4gaW50ZWdlciBwZWxzIGluIGN1cnJlbnQgQmxvY2sKKyAqIFtpbl0gQmxvY2tTaXplWCAgLSBXaWR0aCBvZiBjdXJyZW50IGJsb2NrCisgKiBbaW5dIEJsb2NrU2l6ZVkgIC0gSGVpZ2h0IG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gUmVmRnJhbWUgICAgLSBJbmRleCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGZvciBwcmVkaWN0aW9uCisgKiBbaW5dIHBSZWZGckFyciAgIC0gUG9pbnRlciB0byBSZWYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCisgKiBbaW5dIHBNVkFyciAgICAgIC0gUG9pbnRlciB0byBNViBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KKyAqIFtvdXRdIHBNVlByZWQgICAgLSBQb2ludGVyIHRvIHByZWRpY3RlZCBNVnMKKyAqIFJlbWFya3M6CisgKgorICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICoKKyAqLworc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAxMF9TZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IoCisgICAgT01YX1UzMiBCbG9ja1N0YXJ0WCwgCisgICAgT01YX1UzMiBCbG9ja1N0YXJ0WSwKKyAgICBPTVhfVTMyIEJsb2NrU2l6ZXgsCisgICAgT01YX1UzMiBCbG9ja1NpemV5LAorICAgIE9NWF9TMzIgUmVmRnJhbWUsCisgICAgT01YX1MzMiBwUmVmRnJBcnJbXVs2XSwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WQXJyW11bMTJdLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkCispCit7CisgICAgT01YX1MzMiAgICAgUkZyYW1lTDsgICAgICAgLyogTGVmdCAqLworICAgIE9NWF9TMzIgICAgIFJGcmFtZVU7ICAgICAgIC8qIFVwICovCisgICAgT01YX1MzMiAgICAgUkZyYW1lVVI7ICAgICAgLyogVXAtUmlnaHQgKi8KKworICAgIE9NWF9TMzIgICAgIEJsb2NrWCwgQmxvY2tZLCBCbG9ja1hGciwgQmxvY2tZRnIsIE1WUHJlZFR5cGU7CisgICAgT01YX1MzMiAgICAgQmxvY2tYUGx1c09mZiwgQmxvY2tYUGx1c09mZkZyLCBCbG9ja1hNaW4xRnIsIEJsb2NrWU1pbjFGcjsKKyAgICAKKyAgICBCbG9ja1ggPSA0ICsgKEJsb2NrU3RhcnRYID4+IDIpOworICAgIEJsb2NrWSA9IDQgKyAoQmxvY2tTdGFydFkgPj4gMik7IAorICAgIEJsb2NrWFBsdXNPZmYgPSBCbG9ja1ggKyAoQmxvY2tTaXpleCA+PiAyKTsKKyAgICAKKyAgICBCbG9ja1hGciA9IEJsb2NrWCA+PiAxOyAgCisgICAgQmxvY2tZRnIgPSBCbG9ja1kgPj4gMTsgIAorICAgIEJsb2NrWE1pbjFGciA9IChCbG9ja1ggLSAxKSA+PiAxOyAgCisgICAgQmxvY2tZTWluMUZyID0gKEJsb2NrWSAtIDEpID4+IDE7ICAKKyAgICBCbG9ja1hQbHVzT2ZmRnIgPSBCbG9ja1hQbHVzT2ZmID4+IDE7CisgICAgCisgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9NRURJQU47CisKKyAgICBSRnJhbWVMID0gcFJlZkZyQXJyIFtCbG9ja1lGcl1bQmxvY2tYTWluMUZyXTsKKyAgICBSRnJhbWVVID0gcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWEZyXTsKKyAgICBSRnJhbWVVUiA9IHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hQbHVzT2ZmRnJdOworCisgICAgaWYgKFJGcmFtZVVSID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisgICAgeworICAgICAgICBSRnJhbWVVUiA9IHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hNaW4xRnJdOworICAgIH0KKworICAgIC8qIAorICAgICAqIFByZWRpY3Rpb24gaWYgb25seSBvbmUgb2YgdGhlIG5laWdoYm9ycyB1c2VzIHRoZSByZWZlcmVuY2UgZnJhbWUKKyAgICAgKiB3ZSBhcmUgY2hlY2tpbmcKKyAgICAgKi8KKyAgCisgICAgaWYgKFJGcmFtZUwgPT0gUmVmRnJhbWUgJiYgUkZyYW1lVSAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVUiAhPSBSZWZGcmFtZSkKKyAgICB7CisgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTDsKKyAgICB9CisgICAgZWxzZSBpZihSRnJhbWVMICE9IFJlZkZyYW1lICYmIFJGcmFtZVUgPT0gUmVmRnJhbWUgJiYgUkZyYW1lVVIgIT0gUmVmRnJhbWUpCisgICAgeworICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1U7CisgICAgfQorICAgIGVsc2UgaWYoUkZyYW1lTCAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVICE9IFJlZkZyYW1lICYmIFJGcmFtZVVSID09IFJlZkZyYW1lKQorICAgIHsKKyAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VUjsKKyAgICB9CisKKyAgICAvKiBEaXJlY3Rpb25hbCBwcmVkaWN0aW9ucyAgKi8KKyAgICBlbHNlIGlmKEJsb2NrU2l6ZXggPT0gOCAmJiBCbG9ja1NpemV5ID09IDE2KQorICAgIHsKKyAgICAgICAgaWYoQmxvY2tTdGFydFggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUkZyYW1lTCA9PSBSZWZGcmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX0w7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUkZyYW1lVVIgPT0gUmVmRnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKEJsb2NrU2l6ZXggPT0gMTYgJiYgQmxvY2tTaXpleSA9PSA4KQorICAgIHsKKyAgICAgICAgaWYoQmxvY2tTdGFydFkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUkZyYW1lVSA9PSBSZWZGcmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihSRnJhbWVMID09IFJlZkZyYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoTVZQcmVkVHlwZSkKKyAgICB7CisgICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfTUVESUFOOgorICAgICAgICBpZiAoIShwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYTWluMUZyXSA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHx8IAorICAgICAgICAgICAgICBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYRnJdID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgfHwgCisgICAgICAgICAgICAgIHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hQbHVzT2ZmRnJdID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spKQorICAgICAgICB7CisgICAgICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keDsKKyAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSAKKyAgICAgICAgICAgICAgICBBUk1fVkNNNFAxMF9NRURJQU4ocE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR4LCAKKyAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHgsIAorICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHgpOworICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSAKKyAgICAgICAgICAgICAgICBBUk1fVkNNNFAxMF9NRURJQU4ocE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR5LCAKKyAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHksIAorICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfTDoKKyAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHg7CisgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9VOgorICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYXS5keDsKKyAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX1VSOgorICAgICAgICBpZiAocFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWFBsdXNPZmZGcl0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKyAgICAgICAgeworICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR4OworICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWCAtIDFdLmR4OworICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWCAtIDFdLmR5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfQmxvY2tNb3Rpb25TZWFyY2gKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIEdldHMgYmVzdCBNViBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKKyAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAorICogW2luXSBwU3JjUmVmWSAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVmZXJlbmNlIE1CCisgKiBbaW5dIG5TcmNSZWZTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVmWSAKKyAqIFtpbl0gcFJlZlJlY3QgICBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLgorICogW2luXSBwQ3VyclBvaW50UG9zICAgUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4KKyAqIFtpbl0gcE1FU3BlYyAgICAgLSBNb3Rpb24gZXN0aW1hdGlvbiBzdHJ1Y3R1cmUKKyAqIFtpbl0gcE1CSW50ZXIgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKKyAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCisgKiBbaW5dIG5MYW1kYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0CisgKiBbb3V0XSBwQmVzdENvc3QgIC0gTWluaW11bSBjb3N0IGZvciBlbmNvZGluZyBjdXJyZW50IGJsb2NrIAorICogW291dF0gcEJlc3RNViAgICAtIE1WIGNvcnJlc3BvbmRpbmcgdG8gYmVzdCBjb3N0CisgKiBbaW5dIEJsb2NrU3RhcnRYIC0gQmxvY2sgc3RhcnQgWCBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKKyAqIFtpbl0gQmxvY2tTdGFydFkgLSBCbG9jayBzdGFydCBZIGluZGV4IGluIGludGVnZXIgcGVscworICogW2luXSBCbG9ja1NpemVYICAtIFdpZHRoIG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gQmxvY2tTaXplWSAgLSBIZWlnaHQgb2YgY3VycmVudCBibG9jaworICogW2luXSBSZWZGcmFtZSAgICAtIEluZGV4IG9mIHRoZSByZWZlcmVuY2UgZnJhbWUgZm9yIHByZWRpY3Rpb24KKyAqIFtpbl0gcFJlZkZyQXJyICAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZSBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIHByZWRpY3Rpb24KKyAqIFtpbl0gcE1WQXJyICAgICAgLSBQb2ludGVyIHRvIE1WIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgorICogW2luXSBwTVZQcmVkICAgICAtIFBvaW50ZXIgdG8gTVYgcHJlZGljdGVkIGZyb20gbmVpZ2hib3VyIE1WcworICogUmVtYXJrczoKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQKKyAqCisgKi8KK3N0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9CbG9ja01vdGlvblNlYXJjaCgKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLCAKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWZZLCAKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLCAKKwljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKwljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIHZvaWQqIHBNRVNwZWMsIAorCisgICAgT01YX1MzMiBuTGFtZGEsCisgICAgT01YX1MzMiogcEJlc3RDb3N0LCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICAKKyAgICBPTVhfVTMyIEJsb2NrU3RhcnRYLCAKKyAgICBPTVhfVTMyIEJsb2NrU3RhcnRZLAorICAgIE9NWF9VMzIgQmxvY2tTaXplWCwKKyAgICBPTVhfVTMyIEJsb2NrU2l6ZVksCisgICAgT01YX1MzMiBSZWZGcmFtZSwKKyAgICBPTVhfUzMyIHBSZWZGckFyciBbXVs2XSwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WQXJyIFtdWzEyXSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZAorICAgKQoreworCisgICAgT01YVkNNb3Rpb25WZWN0b3IgICBNVkNhbGN1bGF0ZWQsIE1WQ2FuZGlkYXRlOworICAgIE9NWF9TMzIgICAgICAgICAgICAgQ29zdDsKKyAgICBPTVhSZXN1bHQgICAgICAgICAgIFJldFZhbHVlOworICAgIE9NWFZDTTRQMTBNRVBhcmFtcyAgKnBNRVBhcmFtczsgICAgCisJT01YVkNNNFAyQ29vcmRpbmF0ZSBDdXJyQmxvY2tQb3M7CisKKyAgICAvKiBHZXQgUHJlZGljdGVkIE1vdGlvbiBWZWN0b3JzICovCisgICAgYXJtVkNNNFAxMF9TZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IgKAorICAgICAgICBCbG9ja1N0YXJ0WCwgCisgICAgICAgIEJsb2NrU3RhcnRZLAorICAgICAgICBCbG9ja1NpemVYLCAKKyAgICAgICAgQmxvY2tTaXplWSwKKyAgICAgICAgUmVmRnJhbWUsCisgICAgICAgIHBSZWZGckFyciwgICAKKyAgICAgICAgcE1WQXJyLCAgICAgIAorICAgICAgICBwTVZQcmVkKTsKKworICAgIC8qIEluaXRpYWxpemUgY2FuZGlkYXRlIE1WICovCisgICAgTVZDYW5kaWRhdGUuZHggPSAwOworICAgIE1WQ2FuZGlkYXRlLmR5ID0gMDsKKyAgICAKKyAgICBDdXJyQmxvY2tQb3MueCA9IHBDdXJyUG9pbnRQb3MtPnggKyBCbG9ja1N0YXJ0WDsKKyAgICBDdXJyQmxvY2tQb3MueSA9IHBDdXJyUG9pbnRQb3MtPnkgKyBCbG9ja1N0YXJ0WTsKKworICAgIC8qIEJsb2NrIE1hdGNoIEludGVnZXIgKi8KKyAgICBSZXRWYWx1ZSA9IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICAgICAgcFNyY0N1cnJCdWYsIAorICAgICAgICBTcmNDdXJyU3RlcCwgCisgICAgICAgIHBTcmNSZWZZLCAKKyAgICAgICAgblNyY1JlZlN0ZXAsIAorICAgICAgICBwUmVmUmVjdCwgCisgICAgICAgICZDdXJyQmxvY2tQb3MsIAorICAgICAgICBCbG9ja1NpemVYLCAKKyAgICAgICAgQmxvY2tTaXplWSwgCisgICAgICAgIG5MYW1kYSwgCisgICAgICAgIHBNVlByZWQsIAorICAgICAgICAmTVZDYW5kaWRhdGUsIAorICAgICAgICAmTVZDYWxjdWxhdGVkLCAKKyAgICAgICAgJkNvc3QsIAorICAgICAgICBwTUVTcGVjKTsKKyAgICAKKyAgICAvKiB1cGRhdGVkIEJlc3RNViovCisgICAgLyoqcEJlc3RDb3N0ID0gQ29zdDsKKyAgICBwQmVzdE1WLT5keCA9IE1WQ2FsY3VsYXRlZC5keDsKKyAgICBwQmVzdE1WLT5keSA9IE1WQ2FsY3VsYXRlZC5keTsqLworCisgICAgcE1FUGFyYW1zID0gKE9NWFZDTTRQMTBNRVBhcmFtcyAqKSBwTUVTcGVjOworICAgIAorICAgIC8qIEJsb2NrIE1hdGNoIEhhbGYgcGVsICovCisgICAgaWYgKHBNRVBhcmFtcy0+aGFsZlNlYXJjaEVuYWJsZSkKKyAgICB7CisgICAgICAgIFJldFZhbHVlID0gb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYoCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgCisgICAgICAgICAgICBTcmNDdXJyU3RlcCwgCisgICAgICAgICAgICBwU3JjUmVmWSwgCisgICAgICAgICAgICBuU3JjUmVmU3RlcCwgCisgICAgICAgICAgICBCbG9ja1NpemVYLCAKKyAgICAgICAgICAgIEJsb2NrU2l6ZVksIAorICAgICAgICAgICAgbkxhbWRhLCAKKyAgICAgICAgICAgIHBNVlByZWQsIAorICAgICAgICAgICAgJk1WQ2FsY3VsYXRlZCwgICAgICAgIC8qIGlucHV0L291dHB1dCovCisgICAgICAgICAgICAmQ29zdCk7CisgICAgfQorCisgICAgLyogQmxvY2sgTWF0Y2ggUXVhcnRlciBwZWwgKi8KKyAgICBpZiAocE1FUGFyYW1zLT5xdWFydGVyU2VhcmNoRW5hYmxlKQorICAgIHsKKyAgICAgICAgUmV0VmFsdWUgPSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlcigKKyAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAKKyAgICAgICAgICAgIFNyY0N1cnJTdGVwLCAKKyAgICAgICAgICAgIHBTcmNSZWZZLCAKKyAgICAgICAgICAgIG5TcmNSZWZTdGVwLCAKKyAgICAgICAgICAgIEJsb2NrU2l6ZVgsIAorICAgICAgICAgICAgQmxvY2tTaXplWSwgCisgICAgICAgICAgICBuTGFtZGEsIAorICAgICAgICAgICAgcE1WUHJlZCwgCisgICAgICAgICAgICAmTVZDYWxjdWxhdGVkLCAKKyAgICAgICAgICAgICZDb3N0KTsKKyAgICB9CisKKyAgICAvKiB1cGRhdGVkIEJlc3QgQ29zdCBhbmQgQmVzdCBNViAqLworICAgICpwQmVzdENvc3QgPSBDb3N0OworICAgIHBCZXN0TVYtPmR4ID0gTVZDYWxjdWxhdGVkLmR4OworICAgIHBCZXN0TVYtPmR5ID0gTVZDYWxjdWxhdGVkLmR5OworCisgICAgLyoKKyAgICAgKiBTa2lwIE1CIGNvc3QgY2FsY3VsYXRpb25zIG9mIDE2eDE2IGludGVyIG1vZGUKKyAgICAgKi8KKyAgICByZXR1cm4gUmV0VmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfUGFydGl0aW9uTUUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIEdldHMgYmVzdCBjb3N0IGZvciB0aGUgY3VycmVudCBwYXJ0aXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKKyAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAorICogW2luXSBwU3JjUmVmQnVmTGlzdCAgICAtIFBvaW50ZXIgdG8gTGlzdCBvZiByZWYgYnVmZmVyIG9mIGNvLWxvY2F0ZWQgcmVmZXJlbmNlIE1CCisgKiBbaW5dIG5TcmNSZWZTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVmWSAKKyAqIFtpbl0gcFJlZlJlY3QgICBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLgorICogW2luXSBwQ3VyclBvaW50UG9zICAgUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4KKyAqIFtpbl0gcE1FU3BlYyAgICAgLSBNb3Rpb24gZXN0aW1hdGlvbiBzdHJ1Y3R1cmUKKyAqIFtpbl0gUGFydFdpZHRoICAgLSBXaWR0aCBvZiBjdXJyZW50IHBhcnRpdGlvbgorICogW2luXSBQYXJ0SGVpZ2h0ICAtIEhlaWdodCBvZiBjdXJyZW50IHBhcnRpdGlvbgorICogW2luXSBCbG9ja1dpZHRoICAtIFdpZHRoIG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgY3VycmVudCBibG9jaworICogW2luXSBQYXJ0U3RhcnRYICAtIFBhcnRpdGlvbiBzdGFydCBYIGluZGV4IGluIGludGVnZXIgcGVscworICogW2luXSBQYXJ0U3RhcnRZICAtIFBhcnRpdGlvbiBzdGFydCBZIGluZGV4IGluIGludGVnZXIgcGVscworICogW2luXSBwTVZBcnIgICAgICAtIFBvaW50ZXIgdG8gTVYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCisgKiBbaW5dIHBSZWZGckFyciAgIC0gUG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBwcmVkaWN0aW9uCisgKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0CisgKiBbb3V0XSBwQ29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRlciBNQgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdAorICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX1BhcnRpdGlvbk1FICgKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisJY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKKwlPTVhfUzMyIFNyY1JlZlN0ZXAsCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkKiBwTUVTcGVjLCAKKworICAgIE9NWF9TMzIgUGFydFdpZHRoLAorICAgIE9NWF9TMzIgUGFydEhlaWdodCwKKyAgICBPTVhfUzMyIEJsb2NrV2lkdGgsCisgICAgT01YX1MzMiBCbG9ja0hlaWdodCwKKyAgICBPTVhfUzMyIFBhcnRTdGFydFgsIAorICAgIE9NWF9TMzIgUGFydFN0YXJ0WSwKKworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVkFyciBbXVsxMl0sCisgICAgT01YX1MzMiBwUmVmRnJBcnIgW11bNl0sCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZEFyciBbXVs0XSwKKworICAgIE9NWF9TMzIgTGFtYmRhLAorICAgIE9NWF9TMzIgKnBDb3N0CispCit7CisgICAgT01YX1UzMiAgICAgeCwgeSwgaSwgaiwgcmVmLCBPZmZYLCBPZmZZLCBPZmZTcmMsIE9mZlJlZjsKKyAgICBPTVhfUzMyICAgICBCbG9ja0Nvc3QsIFBhcnRpdGlvbkNvc3QsIEJlc3RDb3N0OworICAgIE9NWF9TMzIgICAgIEJlc3RSZWZGcmFtZT0wOworICAgIE9NWFZDTW90aW9uVmVjdG9yICAgQmVzdE1WIFs0XVs0XTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciAgIEJlc3RNVlByZWQgWzRdWzRdOworICAgIE9NWFZDTW90aW9uVmVjdG9yICAgTVZQcmVkOworICAgIE9NWFZDTW90aW9uVmVjdG9yICAgRHN0TVY7CisKKyAgICBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgIAorICAgIGZvciAocmVmID0gMDsgcmVmIDwgQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FUzsgcmVmKyspCisgICAgeworICAgICAgICBpZiAocFNyY1JlZkJ1Zkxpc3QgW3JlZl0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAJLyogTm8gcmVmZXJlbmNlIGZyYW1lLCBjb250aW51ZSAqLworICAgICAgICAJY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBQYXJ0aXRpb25Db3N0ID0gMDsKKyAgICAgICAgCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBQYXJ0SGVpZ2h0OyB5ICs9IEJsb2NrSGVpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgUGFydFdpZHRoOyB4ICs9IEJsb2NrV2lkdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJT2ZmU3JjID0gU3JjQ3VyclN0ZXAgKiAoUGFydFN0YXJ0WSArIHkpICsgUGFydFN0YXJ0WCArIHg7CisgICAgICAgICAgICAJT2ZmUmVmID0gU3JjUmVmU3RlcCAqIChQYXJ0U3RhcnRZICsgeSkgKyBQYXJ0U3RhcnRYICsgeDsKKyAgICAgICAgICAgICAgICBhcm1WQ000UDEwX0Jsb2NrTW90aW9uU2VhcmNoICgKKyAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYgKyBPZmZTcmMsIAorICAgICAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwgCisgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0IFtyZWZdICsgT2ZmUmVmLCAKKyAgICAgICAgICAgICAgICAgICAgU3JjUmVmU3RlcCwgCisgICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgICAgICAgICBwTUVTcGVjLCAKKworICAgICAgICAgICAgICAgICAgICBMYW1iZGEsCisgICAgICAgICAgICAgICAgICAgICZCbG9ja0Nvc3QsIAorICAgICAgICAgICAgICAgICAgICAmRHN0TVYsCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB4ICsgUGFydFN0YXJ0WCwgCisgICAgICAgICAgICAgICAgICAgIHkgKyBQYXJ0U3RhcnRZLAorICAgICAgICAgICAgICAgICAgICBCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcmVmLAorICAgICAgICAgICAgICAgICAgICBwUmVmRnJBcnIsIAorICAgICAgICAgICAgICAgICAgICBwTVZBcnIsCisgICAgICAgICAgICAgICAgICAgICZNVlByZWQpOworCisgICAgICAgICAgICAgICAgUGFydGl0aW9uQ29zdCArPSBCbG9ja0Nvc3Q7CisJCQkJCisJCQkJT2ZmWCA9IChQYXJ0U3RhcnRYICsgeCkgPj4gMjsKKwkJCQlPZmZZID0gKFBhcnRTdGFydFkgKyB5KSA+PiAyOworCQkJCQorCSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMik7IGorKykKKwkgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAyKTsgaSsrKQorCSAgICAgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keCA9IERzdE1WLmR4OworCSAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHkgPSBEc3RNVi5keTsKKwkgICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHggPSBNVlByZWQuZHg7CisJICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR5ID0gTVZQcmVkLmR5OworCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorCisJCQkJcFJlZkZyQXJyIFsyICsgKE9mZlkgPj4gMSldWzIgKyAoT2ZmWCA+PiAxKV0gPSByZWY7CisJICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAzKTsgaisrKQorCSAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDMpOyBpKyspCisJICAgICAgICAgICAgICAgIHsKKwkJCSAgICAgICAgICAgIHBSZWZGckFyciBbMiArIChPZmZZID4+IDEpICsgal1bMiArIChPZmZYID4+IDEpICsgaV0gPSByZWY7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJCS8qCisJCSAqIElmIFBhcnRpdGlvbkNvc3QgaXMgbGVzcyBmb3IgdGhpcyByZWZlcmVuY2UgZnJhbWUsIG1vdGlvbiB2ZWN0b3JzIG5lZWRzIHRvIGJlIGJhY2tlZHVwCisJCSAqLworICAgICAgICBpZiAoUGFydGl0aW9uQ29zdCA8PSBCZXN0Q29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgQmVzdENvc3QgPSBQYXJ0aXRpb25Db3N0OyAgICAgICAgICAgIAorICAgICAgICAgICAgQmVzdFJlZkZyYW1lID0gcmVmOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgKFBhcnRIZWlnaHQvQmxvY2tIZWlnaHQpOyB5KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IChQYXJ0V2lkdGgvQmxvY2tXaWR0aCk7IHgrKykKKyAgICAgICAgICAgICAgICB7CisJCQkJCU9mZlggPSAoUGFydFN0YXJ0WCArIHggKiBCbG9ja1dpZHRoKSA+PiAyOworCQkJCQlPZmZZID0gKFBhcnRTdGFydFkgKyB5ICogQmxvY2tIZWlnaHQpID4+IDI7CisJCQkJCisgICAgICAgICAgICAgICAgICAgIEJlc3RNVlt5XVt4XS5keCA9IHBNVkFyciBbNCArIE9mZlldWzQgKyBPZmZYXS5keDsKKyAgICAgICAgICAgICAgICAgICAgQmVzdE1WW3ldW3hdLmR5ID0gcE1WQXJyIFs0ICsgT2ZmWV1bNCArIE9mZlhdLmR5OworICAgICAgICAgICAgICAgICAgICBCZXN0TVZQcmVkW3ldW3hdLmR4ID0gcE1WUHJlZEFyciBbT2ZmWV1bT2ZmWF0uZHg7CisgICAgICAgICAgICAgICAgICAgIEJlc3RNVlByZWRbeV1beF0uZHkgPSBwTVZQcmVkQXJyIFtPZmZZXVtPZmZYXS5keTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCS8qCisJICogQ29weSBiYWNrIGJlc3QgcmVmZXJlbmNlIGZyYW1lLCBtb3Rpb24gdmVjdG9ycyBhbmQgY29zdC4KKwkgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgKFBhcnRIZWlnaHQvQmxvY2tIZWlnaHQpOyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgKFBhcnRXaWR0aC9CbG9ja1dpZHRoKTsgeCsrKQorICAgICAgICB7CisJCQlPZmZYID0gKFBhcnRTdGFydFggKyB4ICogQmxvY2tXaWR0aCkgPj4gMjsKKwkJCU9mZlkgPSAoUGFydFN0YXJ0WSArIHkgKiBCbG9ja0hlaWdodCkgPj4gMjsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAyKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAyKTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHggPSBCZXN0TVZbeV1beF0uZHg7CisgICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR5ID0gQmVzdE1WW3ldW3hdLmR5OworICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR4ID0gQmVzdE1WUHJlZFt5XVt4XS5keDsKKyAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keSA9IEJlc3RNVlByZWRbeV1beF0uZHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDMpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDMpOyBpKyspCisgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICBwUmVmRnJBcnIgWzIgKyAoT2ZmWSA+PiAxKSArIGpdWzIgKyAoT2ZmWCA+PiAxKSArIGldID0gQmVzdFJlZkZyYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCSpwQ29zdCA9IEJlc3RDb3N0OworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50cmExNngxNkVzdGltYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBJTlRFUiBNQiB0eXBlIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gc3RyYXRlZ3kgZnJvbSAKKyAqIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgSVNPL0lFQyAxNDQ5Ni0xMC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAorICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCisgKiBbaW5dIHBTcmNSZWNCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlY29uc3RydWN0ZWQgTUIgCisgKiBbaW5dIFNyY1JlY1N0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWNCdWYgCisgKiBbaW5dIG5NQlBvc1ggICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFggYXhpcworICogW2luXSBuTUJQb3NZICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBZIGF4aXMKKyAqIFtpbl0gcE1CSW50ZXIgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKKyAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCisgKiBbaW5dIHBNQkludHJhICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCisgKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAorICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIEZvbGxvd2luZyBtZW1iZXIgc2hvdWxkIGJlIHNldCAKKyAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0CisgKiBbb3V0XSBwQ29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRyYTE2eDE2CisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gTm8gRXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqCisgKi8KKworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludHJhMTZ4MTZFc3RpbWF0aW9uKAorICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCisgICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWNCdWYsICAgCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCisgICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfVTMyICpwQ29zdCkKK3sKKyAgICBPTVhfVTggICAgICBQcmVkQnVmIFsxNioxNiArIDE2XTsKKyAgICBPTVhfVTggICAgICAqcFByZWQ7CisgICAgT01YX1MzMiAgICAgbW9kZTsKKyAgICBPTVhfUzMyICAgICBDb3N0OworICAgIE9NWF9TMzIgICAgIGF2YWlsYWJpbGl0eSA9IDA7CisgICAgT01YUmVzdWx0ICAgUmV0OworICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgICAgSW50cmFNb2RlMTZ4MTYgWzRdID0gCisgICAgICAgIHtPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUiwgCisgICAgICAgIE9NWF9WQ18xNlgxNl9EQywgT01YX1ZDXzE2WDE2X1BMQU5FfTsgICAgICAgIAorICAgIE9NWF9VMzIgICAgIE1CUG9zWCA9IHBDdXJyUG9pbnRQb3MtPnggPj4gNDsgICAgICAgIAorICAgIE9NWF9VMzIgICAgIE1CUG9zWSA9IHBDdXJyUG9pbnRQb3MtPnkgPj4gNDsgICAgICAgIAorCisJcFByZWQgPSBhcm1BbGlnblRvMTZCeXRlcyhQcmVkQnVmKTsKKyAgICAKKwkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgTUIgKi8KKyAgICBpZiAoKE1CUG9zWCAhPSAwKSAmJiAocE1CSW50cmEgWzBdICE9IDAgfHwgcE1CSW50ZXIgWzBdICE9IDApKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUCBNQiAqLworICAgIGlmICgoTUJQb3NZICE9IDApICYmIChwTUJJbnRyYSBbMV0gIT0gMCB8fCBwTUJJbnRlciBbMV0gIT0gMCkpCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUC1MRUZUIE1CICovCisgICAgaWYgKChNQlBvc1ggPiAwKSAmJiAoTUJQb3NZID4gMCkgJiYgCisgICAgICAgIChwTUJJbnRyYSBbMl0gIT0gMCB8fCBwTUJJbnRlciBbMl0gIT0gMCkpCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKKyAgICB9CisKKyAgICAqcENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKKyAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgNDsgbW9kZSsrKQorICAgIHsKKyAgICAgICAgUmV0ID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoCisgICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiAtIDEsIAorICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgLSBTcmNSZWNTdGVwLCAKKyAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCAtIDEsIAorICAgICAgICAgICAgICAgIHBQcmVkLCAKKyAgICAgICAgICAgICAgICBTcmNSZWNTdGVwLCAKKyAgICAgICAgICAgICAgICAxNiwgCisgICAgICAgICAgICAgICAgSW50cmFNb2RlMTZ4MTYgW21vZGVdLCAKKyAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHkpOworICAgICAgICBpZiAoUmV0ID09IE9NWF9TdHNfTm9FcnIpICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB7CisgICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKCAgICAKKyAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICAgICBwUHJlZCwKKyAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAmQ29zdCwKKyAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAxNik7CisgICAgICAgICAgICBpZiAoQ29zdCA8ICpwQ29zdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcENvc3QgPSBDb3N0OworICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPkludHJhMTZ4MTZQcmVkTW9kZSA9IEludHJhTW9kZTE2eDE2IFttb2RlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludHJhNHg0RXN0aW1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gZm9yIEludHJhIDR4NCBNQiB0eXBlIGFuZCBzZWxlY3RzCisgKiB0aGUgYmVzdCBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKKyAqIFtpbl0gcFNyY1JlY0J1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVjb25zdHJ1Y3RlZCBNQiAKKyAqIFtpbl0gU3JjUmVjU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlY0J1ZiAKKyAqIFtpbl0gbk1CUG9zWCAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWCBheGlzCisgKiBbaW5dIG5NQlBvc1kgICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFkgYXhpcworICogW2luXSBwTUJJbnRyYSAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgorICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKKyAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICBGb2xsb3dpbmcgbWVtYmVyIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAorICogW291dF0gcENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50cmE0eDQKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBObyBFcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICoKKyAqLworCitzdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50cmE0eDRFc3RpbWF0aW9uKAorICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCisgICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWNCdWYsICAgCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UzMiAqcENvc3QpCit7CisgICAgT01YX1MzMiAgICAgeCwgeSwgQmxvY2s0eDQsIEJsb2NrOHg4OworICAgIE9NWF9TMzIgICAgIENvc3Q7CisKKyAgICAvKgorICAgICAqIFByZWRJbnRyYTR4NE1vZGUgd2lsbCBzdG9yZSBwcmVkaWN0aW9uIG1vZGVzIG9mIDR4NCBibG9ja3MuIAorICAgICAqIE1vZGVzIGZvciBjdXJyZW50IE1CIHN0YXJ0cyBhdCBpbmRleCBbMV1bMV0uICAgCisgICAgICogTW9kZXMgb2YgbmlnaGJvdXJpbmcgTUIncyB3aWxsIGJlIGFzIHNob3duIGJlbG93CisgICAgICogQSB2YWx1ZSBvZiBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIGZvciBhbnkgYmxvY2sgaW4gdGhpcyBhcnJheSBtZWFucyAKKyAgICAgKiB0aGF0IGJsb2NrIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByZWRpY3Rpb24uCisgICAgICoKKyAgICAgKiBjMyBiMCBiMSBiMiBiMyBkMCBkMSBkMiBkMworICAgICAqIGEwIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KKyAgICAgKiBhMSB4eCB4eCB4eCB4eCAtICAtICAtICAtCisgICAgICogYTIgeHggeHggeHggeHggLSAgLSAgLSAgLQorICAgICAqIGEzIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KKyAgICAgKgorICAgICAqLworICAgIE9NWF9TMzIgICAgIFByZWRJbnRyYTR4NE1vZGUgWzVdWzldOworCisgICAgLyoKKyAgICAgKiBwU3JjWSBzdG9yZXMgcmUtY29uc3RydXN0ZWQgc291cmNlIGFycmF5IG9mIHNpemUgM01CIFggMk1CIGFzIGJlbG93CisgICAgICoKKyAgICAgKiBNQjExIE1CMTIgTUIxMyAKKyAgICAgKiBNQjIxIE1CMjIgTUIyMworICAgICAqCisgICAgICogVGhpcyBhcnJheSB3aWxsIGJlIHVzZWQgZm9yIGxvY2FsIHJlY29uc3RydWN0aW9uIG9mIDR4NCBibG9ja3MgCisgICAgICogd2l0aCBiZXN0IHByZWRpY3Rpb24gbW9kZSB3aXRoaW4gYW4gTUIKKyAgICAgKi8gICAgCisgICAgT01YX1U4ICAgICAgcFNyY1kgWygxNiozKSooMTYqMildOworICAgIE9NWF9TMzIgICAgIFN0ZXBTcmNZOworICAgIAorICAgIC8qIGluaXQgKi8KKyAgICAqcENvc3QgPSAwOworCisgICAgZm9yICh5ID0gMDsgeSA8IDU7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA5OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICogSW5pdGlhbGl6ZSB3aXRoIHZhbHVlIG9mIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0ssIHRvIG1lYW4gdGhpcyAKKyAgICAgICAgICAgICAqIDR4NCBibG9jayBpcyBub3QgYXZhaWxhYmxlIAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFt5XVt4XSA9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXBsYWNlIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgdmFsdWUgd2l0aCBhdmFpbGFibGUgTUJzIHZhbHVlcyovCisgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICB7CisgICAgICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBiMCwgYjEsIGIyLCBiMyAqLworICAgICAgICBpZiAocE1CSW50cmFbMV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDFdID0gCisgICAgICAgICAgICAgICAgcE1CSW50cmFbMV0tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgZDAsIGQxLCBkMiwgZDMgKi8KKyAgICAgICAgaWYgKHBNQkludHJhWzNdICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyA1XSA9IAorICAgICAgICAgICAgICAgIHBNQkludHJhWzNdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgYzMgKi8KKyAgICBpZiAocE1CSW50cmFbMl0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgWzBdWzBdID0gcE1CSW50cmFbMl0tPnBJbnRyYTR4NFByZWRNb2RlWzE1XTsKKyAgICB9CisgICAgCisgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKKyAgICB7CisgICAgICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBhMCwgYTEsIGEyLCBhMyAqLworICAgICAgICBpZiAocE1CSW50cmFbMF0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbeSArIDFdWzBdID0gCisgICAgICAgICAgICAgICAgcE1CSW50cmFbMF0tPnBJbnRyYTR4NFByZWRNb2RlW3kqNCArIDNdOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAvKgorICAgICAqIFVwZGF0ZSBuZWlnaGJvdXJpbmcgUHJlZCBtb2RlIGFycmF5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IKKyAgICAgKiBwcmVkaWN0aW9uIG9mIEludHJhNHg0IG1vZGVzLgorICAgICAqLworICAgIAorICAgIFN0ZXBTcmNZID0gMTYgKiAzOworICAgIGZvciAoeSA9IDA7IHkgPCAoMTYgKiAyKTsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8ICgxNiAqIDMpOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTcmNZIFtTdGVwU3JjWSAqIHkgKyB4XSA9IAorICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgW1NyY1JlY1N0ZXAgKiAoeSAtIDE2KSArIHggLSAxNl07CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogZm9yIGVhY2ggOHg4IGJsb2NrICovCisgICAgZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKKyAgICB7CisgICAgICAgIC8qIGZvciBlYWNoIDR4NCBibG9jayBpbnNpZGUgOHg4IGJsb2NrICovCisgICAgICAgIGZvciAoQmxvY2s0eDQgPSAwOyBCbG9jazR4NCA8IDQ7IEJsb2NrNHg0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybVZDTTRQMTBfTW9kZTR4NERlY2lzaW9uICgKKyAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKKyAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLAorICAgICAgICAgICAgICAgIEJsb2NrOHg4LCAKKyAgICAgICAgICAgICAgICBCbG9jazR4NCwKKyAgICAgICAgICAgICAgICBwU3JjWSArIDE2ICogU3RlcFNyY1kgKyAxNiwKKyAgICAgICAgICAgICAgICBTdGVwU3JjWSwKKyAgICAgICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlLCAKKyAgICAgICAgICAgICAgICAmQ29zdCk7CisKKyAgICAgICAgICAgICpwQ29zdCArPSBDb3N0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVyTUVNQgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gZm9yIElOVEVSIE1CIHR5cGUgYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiBzdHJhdGVneSBmcm9tIAorICogdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBJU08vSUVDIDE0NDk2LTEwLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKKyAqIFtpbl0gcFNyY1JlZkJ1Zkxpc3QgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlZmVyZW5jZSBNQgorICogW2luXSBTcmNSZWZTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVmWSAKKyAqIFtpbl0gcFJlZlJlY3QgICBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLgorICogW2luXSBwQ3VyclBvaW50UG9zICAgUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4KKyAqIFtpbl0gcE1FU3BlYyAgICAgLSBNb3Rpb24gZXN0aW1hdGlvbiBzdHJ1Y3R1cmUKKyAqIFtpbl0gcE1CSW50ZXIgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKKyAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCisgKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgRm9sbG93aW5nIG1lbWJlciBzaG91bGQgYmUgc2V0IAorICogICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKKyAqIFtvdXRdIHBEc3RDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludGVyIE1CCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gTm8gRXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqCisgKi8KKworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVyTUVNQigKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLCAKKwlPTVhfUzMyIFNyY0N1cnJTdGVwLCAKKwljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAorCU9NWF9TMzIgU3JjUmVmU3RlcCwKKwljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKwljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorCU9NWF9VMzIgTGFtYmRhLAorCXZvaWQgKnBNRVNwZWMsCisJY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsIAorICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKKwlPTVhfVTMyICpwRHN0Q29zdCkKK3sKKyAgICBPTVhfUzMyICAgICBpLCBqLCB4LCB5LCBtb2RlOworICAgIE9NWF9VMzIgICAgIEJsb2NrOHg4LCBYUGVyTUIsIFlQZXJNQiwgQmxvY2syeCwgQmxvY2syeTsKKyAgICBPTVhfUzMyICAgICBQYXJ0U3RhcnRYID0gMCwgUGFydFN0YXJ0WSA9IDA7CisgICAgT01YX1MzMiAgICAgUGFydFdpZHRoID0gOCwgUGFydEhlaWdodCA9IDgsIEJsb2NrV2lkdGggPSA0LCBCbG9ja0hlaWdodCA9IDQ7CisgICAgY29uc3QgT01YX1UzMiAgICAgQmxrU3ogWzRdWzJdID0ge3s0LDR9LCB7NCw4fSwgezgsNH19OworICAgIGNvbnN0IE9NWF9VMzIgICAgIFBhcnRTeiBbNF1bMl0gPSB7ezgsOH0sIHs4LDE2fSwgezE2LDh9LCB7MTYsMTZ9fTsKKyAgICBjb25zdCBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgICAgIAorICAgICAgICAgICAgICAgIE1vZGVTdWJNQlR5cGU0eDQgW10gPSB7T01YX1ZDX1NVQl9QXzR4NCwgT01YX1ZDX1NVQl9QXzR4OCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfU1VCX1BfOHg0LCBPTVhfVkNfU1VCX1BfOHg4fTsKKyAgICBjb25zdCBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUKKyAgICAgICAgICAgICAgICBNb2RlTUJUeXBlIFtdID0ge09NWF9WQ19QXzh4OCwgT01YX1ZDX1BfOHgxNiwgT01YX1ZDX1BfMTZ4OCwgT01YX1ZDX1BfMTZ4MTZ9OworICAgIAorICAgIE9NWFZDTTRQMTBNRVBhcmFtcyAgKnBNQk9wdGlvbnM7CisgICAgLyoKKyAgICAgKiBSZWZGckFyciBhbmQgIE1WQXJyIHdpbGwgYmUgdXNlZCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2Ugb2YgUmVmZXJlbmNlIGZyYW1lIGluZGV4IGFuZCBNVnMKKyAgICAgKiBJdCB3aWxsIHN0b3JlIFJlZkluZGV4IGFuZCBNVnMgb2YgNiBNQnMgYXMgc2hvd24gYmVsb3cKKyAgICAgKiAKKyAgICAgKiAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfAorICAgICAqICAgICB8VHAtTHQgfFRvcCAgIHxUcC1SICB8CisgICAgICogICAgIHwgTUIgICB8IE1CICAgfCBNQiAgIHwKKyAgICAgKiAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfAorICAgICAqICAgICB8TGVmdCAgfCBDdXJyIHwgICAgICB8CisgICAgICogICAgIHwgTUIgICB8IE1CICAgfCAgICAgIHwKKyAgICAgKiAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfAorICAgICAqLworICAgIE9NWF9TMzIgICAgIFJlZkZyQXJyIFs0XVs2XTsgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgTVZBcnIgWzhdWzEyXTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBNVlByZWRBcnIgWzRdWzRdOworICAgIAorICAgIC8qCisgICAgICogSW5kZXhUb0xvYyB3aWxsIHRyYW5zbGF0ZSBwTUJJbnRlciBpbmRleCBpbnRvIHNwYWNpYWwgYXJyYW5nZW1lbnQgb2YgTUJzCisgICAgICovCisgICAgT01YX1MzMiAgICAgSW5kZXhUb0xvYyBbXSA9IHsyLDEsMywwfTsKKyAgICBPTVhfVTMyICAgICBwYXJ0LCBNYXhQYXJ0OworICAgIE9NWF9TMzIgICAgIENvc3QsIE1vdGlvbkNvc3Q4eDggWzRdLCBNQkNvc3QsIEJlc3RDb3N0OworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgbmVpZ2hib3VyaW5nIE1WIGFycmF5IGFuZCBSZWYgZnJhbWUgYXJyYXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvcgorICAgICAqIHByZWRpY3Rpb24gb2YgTVZzIGFuZCBSZWYgZnJhbWVzLgorICAgICAqLworCisgICAgLyogU2V0IGNvc3QgdG8gYSBoaWdoIHZhbHVlICovCisgICAgQ29zdCA9IEJlc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7CisgICAgCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxMjsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMyAqICh5ID4+IDIpICsgKHggPj4gMik7CisgICAgICAgICAgICBpZiAoKHkgPCA0IHx8IHggPCA0KSAmJiAocE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0gIT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR4ID0gCisgICAgICAgICAgICAgICAgICAgIHBNQkludGVyW0luZGV4VG9Mb2NbaV1dLT5wTVYwW3kgJSA0XVt4ICUgNF0uZHg7CisgICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR5ID0gCisgICAgICAgICAgICAgICAgICAgIHBNQkludGVyW0luZGV4VG9Mb2NbaV1dLT5wTVYwW3kgJSA0XVt4ICUgNF0uZHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR4ID0gMDsKKyAgICAgICAgICAgICAgICBNVkFyciBbeV1beF0uZHkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgICAKKworICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgNjsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMyAqICh5ID4+IDEpICsgKHggPj4gMSk7CisgICAgICAgICAgICBpZiAoKHkgPCAyIHx8IHggPCAyKSAmJiAocE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0gIT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVmRnJBcnIgW3ldW3hdID0gCisgICAgICAgICAgICAgICAgICAgIHBNQkludGVyW0luZGV4VG9Mb2NbaV1dLT5wUmVmTDBJZHggWyh5ICUgMikgKiAyICsgKHggJSAyKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVmRnJBcnIgW3ldW3hdID0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgTVZQcmVkQXJyIFt5XVt4XS5keCA9IDA7CisgICAgICAgICAgICBNVlByZWRBcnIgW3ldW3hdLmR5ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICAqIE1vdGlvbiBFc3RpbWF0aW9uIGZvciA4eDggTUIgUGFydGl0aW9uIAorICAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIE1vdGlvbkNvc3Q4eDggW2ldID0gMDsKKyAgICB9ICAgICAgICAKKyAgICAKKyAgICBwTUJPcHRpb25zID0gKE9NWFZDTTRQMTBNRVBhcmFtcyAqKSBwTUVTcGVjOworICAgIAorICAgIGlmIChwTUJPcHRpb25zLT5ibG9ja1NwbGl0RW5hYmxlOHg4ID09IDEgJiYgCisgICAgICAgIHBNQk9wdGlvbnMtPmJsb2NrU3BsaXRFbmFibGU0eDQgPT0gMSkKKyAgICB7CisgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19QXzh4ODsKKworICAgICAgICBQYXJ0V2lkdGggPSBQYXJ0U3ogWzBdWzBdOworICAgICAgICBQYXJ0SGVpZ2h0ID0gUGFydFN6IFswXVsxXTsKKyAgICAgICAgCisgICAgICAgIC8qIEZvciBlYWNoIDh4OCBwYXJ0aXRpb25zICovCisgICAgICAgIGZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnRTdGFydFggPSAoQmxvY2s4eDggJSAyKSA8PCAzOworICAgICAgICAgICAgUGFydFN0YXJ0WSA9IChCbG9jazh4OCAvIDIpIDw8IDM7CisKKyAgICAgICAgICAgIEJsb2NrMnggPSAoQmxvY2s4eDggJiAxKSA8PCAxOworICAgICAgICAgICAgQmxvY2syeSA9IChCbG9jazh4OCA+PiAxKSA8PCAxOworICAgICAgICAgICAgCisgICAgICAgICAgICBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgICAgICAgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IDM7IG1vZGUrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCbG9ja1dpZHRoID0gQmxrU3ogW21vZGVdWzBdOworICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0ID0gQmxrU3ogW21vZGVdWzFdOworCisgICAgICAgICAgICAgICAgYXJtVkNNNFAxMF9QYXJ0aXRpb25NRSAoCisgICAgICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAorICAgICAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsICAgCisgICAgICAgICAgICAgICAgICAgIFNyY1JlZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgICAgICAgICBwTUVTcGVjLAorCisgICAgICAgICAgICAgICAgICAgIFBhcnRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgUGFydEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIFBhcnRTdGFydFgsCisgICAgICAgICAgICAgICAgICAgIFBhcnRTdGFydFksCisKKyAgICAgICAgICAgICAgICAgICAgTVZBcnIsCisgICAgICAgICAgICAgICAgICAgIFJlZkZyQXJyLAorICAgICAgICAgICAgICAgICAgICBNVlByZWRBcnIsCisKKyAgICAgICAgICAgICAgICAgICAgTGFtYmRhLAorICAgICAgICAgICAgICAgICAgICAmQ29zdCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChDb3N0IDw9IEJlc3RDb3N0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGNvc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgQmVzdENvc3QgPSBDb3N0OworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIE1CQ3VyciBzdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+c3ViTUJUeXBlIFtCbG9jazh4OF0gPSBNb2RlU3ViTUJUeXBlNHg0IFttb2RlXTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBSZWZMMElkeCBbQmxvY2s4eDhdID0gUmVmRnJBcnIgWzIgKyAoUGFydFN0YXJ0WSA+PiAzKV1bMiArIChQYXJ0U3RhcnRYID4+IDMpXTsKKworICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgcE1WMCBhbmQgcE1WUHJlZCBvZiBNQkN1cnIgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WQXJyIFs0ICsgQmxvY2syeSArIGpdWzQgKyBCbG9jazJ4ICsgaV0uZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WQXJyIFs0ICsgQmxvY2syeSArIGpdWzQgKyBCbG9jazJ4ICsgaV0uZHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WUHJlZEFyciBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZQcmVkQXJyIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR5OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBVcGRhdGUgY29zdCAqLworICAgICAgICAgICAgTW90aW9uQ29zdDh4OCBbQmxvY2s4eDhdID0gQmVzdENvc3Q7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIENvc3QgZm9yIG1iVHlwZSBPTVhfVkNfUF84eDggKi8KKyAgICAgICAgQmVzdENvc3QgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBCZXN0Q29zdCArPSBNb3Rpb25Db3N0OHg4IFtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBTZXQgc3ViIE1CIHR5cGUgdG8gOHg4ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnN1Yk1CVHlwZSBbaV0gPSBPTVhfVkNfU1VCX1BfOHg4OworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNb3Rpb24gRXN0aW1hdGlvbiBmb3IgOHg4LCA4eDE2LCAxNng4IGFuZCAxNngxNiBNQiBQYXJ0aXRpb24KKyAgICAgKiBJZiBwTUJPcHRpb25zLT5iOHg4QmxvY2tTcGxpdEVuYWJsZSBpcyAwLCBkbyBvbmx5IDE2eDE2IE1FIChtb2RlIDMpCisgICAgICovCisgICAgZm9yIChtb2RlID0gKHBNQk9wdGlvbnMtPmJsb2NrU3BsaXRFbmFibGU4eDggPT0gMSA/IDAgOiAzKTsgbW9kZSA8IDQ7IG1vZGUrKykKKyAgICB7CisgICAgICAgIEJsb2NrV2lkdGggPSBQYXJ0V2lkdGggPSBQYXJ0U3ogW21vZGVdWzBdOworICAgICAgICBCbG9ja0hlaWdodCA9IFBhcnRIZWlnaHQgPSBQYXJ0U3ogW21vZGVdWzFdOworICAgICAgICAKKyAgICAgICAgWFBlck1CID0gMTYgLyBQYXJ0V2lkdGg7CisgICAgICAgIFlQZXJNQiA9IDE2IC8gUGFydEhlaWdodDsKKyAgICAgICAgTWF4UGFydCA9IFhQZXJNQiAqIFlQZXJNQjsKKyAgICAgICAgCisgICAgICAgIE1CQ29zdCA9IDA7CisgICAgICAgIAorICAgICAgICAvKiBwYXJ0IHNpemUgNCwgMiwgMiBhbmQgMSBjb3JyZXNwb25kaW5nIHRvIDh4OCwgOHgxNiwgMTZ4OCBhbmQgMTZ4MTYgTUIgKi8KKyAgICAgICAgZm9yIChwYXJ0ID0gMDsgcGFydCA8IE1heFBhcnQ7IHBhcnQrKykKKyAgICAgICAgeworICAgICAgICAJUGFydFN0YXJ0WCA9IChwYXJ0ICUgWFBlck1CKSAqIFBhcnRXaWR0aDsKKyAgICAgICAgCVBhcnRTdGFydFkgPSAocGFydCAvIFhQZXJNQikgKiBQYXJ0SGVpZ2h0OworICAgICAgICAJCisgICAgICAgICAgICBhcm1WQ000UDEwX1BhcnRpdGlvbk1FICgKKyAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgICAKKyAgICAgICAgICAgICAgICBTcmNSZWZTdGVwLAorICAgICAgICAgICAgICAgIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICAgICAgcE1FU3BlYywKKworICAgICAgICAgICAgICAgIFBhcnRXaWR0aCwKKyAgICAgICAgICAgICAgICBQYXJ0SGVpZ2h0LAorICAgICAgICAgICAgICAgIEJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgUGFydFN0YXJ0WCwKKyAgICAgICAgICAgICAgICBQYXJ0U3RhcnRZLAorCisgICAgICAgICAgICAgICAgTVZBcnIsCisgICAgICAgICAgICAgICAgUmVmRnJBcnIsCisgICAgICAgICAgICAgICAgTVZQcmVkQXJyLAorCisgICAgICAgICAgICAgICAgTGFtYmRhLAorICAgICAgICAgICAgICAgICZDb3N0KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBNQkNvc3QgKz0gQ29zdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChNQkNvc3QgPD0gQmVzdENvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBjb3N0ICovCisgICAgICAgICAgICBCZXN0Q29zdCA9IE1CQ29zdDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogVXBkYXRlIG1iVHlwZSBvZiBNQkN1cnIgc3RydWN0ICovCisgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBNb2RlTUJUeXBlIFttb2RlXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogVXBkYXRlIHBNVjAgYW5kIHBNVlByZWQgb2YgTUJDdXJyIHN0cnVjdCAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbal1baV0uZHggPSBNVkFyciBbNCtqXVs0K2ldLmR4OworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwIFtqXVtpXS5keSA9IE1WQXJyIFs0K2pdWzQraV0uZHk7CisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW2pdW2ldLmR4ID0gTVZQcmVkQXJyIFtqXVtpXS5keDsKKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbal1baV0uZHkgPSBNVlByZWRBcnIgW2pdW2ldLmR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBSZWZMMElkeCBbaioyK2ldID0gUmVmRnJBcnIgWzIral1bMitpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qIFVwZGF0ZSBCZXN0IENvc3QgKi8KKyAgICAqcERzdENvc3QgPSBCZXN0Q29zdDsKKyAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCisgKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAorICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCisgKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKKyAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKKyAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAorICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKKyAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5URVIuIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludGVyWzFdIAorICogICAgICAgICAgICAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byAKKyAqICAgICAgICAgICAgdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiAKKyAqICAgICAgICAgICAgaW5mb3JtYXRpb24gCisgKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVFJBLiBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRyYVsxXSAKKyAqICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgCisgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAorICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCisgKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCisgKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiBNYlR5cGUgCisgKiAgICAgICAgICAgIHN1Yk1CVHlwZVs0XSBwTVYwWzRdWzRdIHBNVlByZWRbNF1bNF0gcFJlZkwwSWR4WzRdIAorICogICAgICAgICAgICBJbnRyYTE2eDE2UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAorICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCisgKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCisgCitPTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIoICAgICAgICAgICAgICAgICAgICAKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlPTVhfUzMyIFNyY0N1cnJTdGVwLCAKKwljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAorCU9NWF9TMzIgU3JjUmVmU3RlcCwKKwljb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsIAorCU9NWF9TMzIgU3JjUmVjU3RlcCwKKwljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKwljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorCU9NWF9VMzIgTGFtYmRhLAorCXZvaWQgKnBNRVNwZWMsCisJY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsIAorCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisJT01YX0lOVCAqcERzdENvc3QsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FEKQoreworICAgIE9NWF9VMzIgICAgIENvc3QsIGksIEludHJhRmxhZyA9IDE7CisgICAgT01YVkNNNFAxME1FUGFyYW1zICAqcE1FUGFyYW1zOyAKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWZMaXN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWNCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocEN1cnJQb2ludFBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwTUVTcGVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBNQkludGVyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBNQkludHJhID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNQkN1cnIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoU3JjUmVmU3RlcCA8PSAwIHx8IFNyY1JlZlN0ZXAgJiAxNSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoU3JjUmVjU3RlcCA8PSAwIHx8IFNyY1JlY1N0ZXAgJiAxNSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoU3JjQ3VyclN0ZXAgPD0gMCB8fCBTcmNDdXJyU3RlcCAmIDE1LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpICAgIAorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY1JlY0J1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgZm9yIChpID0gMDsgaSA8IEFSTV9WQ000UDEwX01BWF9GUkFNRVM7IGkrKykKKyAgICB7CisgICAgICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWZMaXN0IFtpXSAhPSBOVUxMICYmCisgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNSZWZCdWZMaXN0IFtpXSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgIC8qIENoZWNrIGlmIGN1cnJlbnQgTUIgbmVlZHMgSU5URVIgY29zdCBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgaWYgKHBTcmNSZWZCdWZMaXN0IFtpXSAhPSBOVUxMICYmIEludHJhRmxhZyA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBJbnRyYUZsYWcgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgKnBEc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7CisgICAgLyoKKyAgICAgKiBJbnRlciBjb3N0IGNhbGN1bGF0aW9ucyAKKyAgICAgKi8KKworICAgICAvKiBjaGVjayB0aGlzIE1CIGNhbiBiZSBJbnRlciAqLworICAgIGlmIChJbnRyYUZsYWcgIT0gMSkKKyAgICB7CisgICAgICAgICBhcm1WQ000UDEwX0ludGVyTUVNQigKKyAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKKyAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgICAKKyAgICAgICAgICAgICBTcmNSZWZTdGVwLAorICAgICAgICAgICAgIHBSZWZSZWN0LCAgICAKKyAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgIExhbWJkYSwKKyAgICAgICAgICAgICBwTUVTcGVjLAorICAgICAgICAgICAgIHBNQkludGVyLAorICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsCisgICAgICAgICAgICAgJkNvc3QKKyAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgKnBEc3RDb3N0ID0gQ29zdDsKKyAgICB9ICAgICAKKworICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDEwTUVQYXJhbXMgKilwTUVTcGVjOworICAgIAorICAgIGlmIChwTUVQYXJhbXMtPmludHJhRW5hYmxlNHg0ID09IDEpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJbnRyYSA0eDQgY29zdCBjYWxjdWxhdGlvbnMKKyAgICAgICAgICovCisgICAgICAgIGFybVZDTTRQMTBfSW50cmE0eDRFc3RpbWF0aW9uKAorICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCisgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgIHBTcmNSZWNCdWYsICAgCisgICAgICAgICAgICBTcmNSZWNTdGVwLAorICAgICAgICAgICAgcE1CSW50cmEsCisgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLAorICAgICAgICAgICAgJkNvc3QKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgaWYgKENvc3QgPD0gKnBEc3RDb3N0KQorICAgICAgICB7CisgICAgICAgICAgICAqcERzdENvc3QgPSBDb3N0OworICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX0lOVFJBXzR4NDsKKworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIC8qCisgICAgICogQ29zdCBmb3IgSW50cmEgMTZ4MTYgbW9kZQorICAgICAqLworCisgICAgYXJtVkNNNFAxMF9JbnRyYTE2eDE2RXN0aW1hdGlvbigKKyAgICAgICAgcFNyY0N1cnJCdWYsICAgCisgICAgICAgIFNyY0N1cnJTdGVwLAorICAgICAgICBwU3JjUmVjQnVmLCAgIAorICAgICAgICBTcmNSZWNTdGVwLAorICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICBwTUJJbnRlciwKKyAgICAgICAgcE1CSW50cmEsCisgICAgICAgIHBTcmNEc3RNQkN1cnIsCisgICAgICAgICZDb3N0CisgICAgICAgICk7CisKKyAgICBpZiAoQ29zdCA8PSAqcERzdENvc3QpCisgICAgeworICAgICAgICAqcERzdENvc3QgPSBDb3N0OworICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5UUkFfMTZ4MTY7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgcERzdEJsb2NrU0FEIHRvIG1heCB2YWx1ZQorICAgICAqLworCWFybVZDTTRQMTBfQ2FsY3VsYXRlQmxvY2tTQUQoCXBTcmNEc3RNQkN1cnIsIAorICAgICAgICBwU3JjQ3VyckJ1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCVNyY0N1cnJTdGVwLCAKKyAgICAJcFNyY1JlZkJ1Zkxpc3QsCisgICAgCVNyY1JlZlN0ZXAsCisgICAgCXBTcmNSZWNCdWYsIAorICAgIAlTcmNSZWNTdGVwLAorICAgIAlwUmVmUmVjdCwKKyAgICAJcEN1cnJQb2ludFBvcywKKyAgICAJcE1CSW50ZXIsIAorICAgIAlwTUJJbnRyYSwKKyAgICAJcERzdEJsb2NrU0FEKTsKKworCisJcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Y2E3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYwpAQCAtMCwwICsxLDI4NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IENocm9tYSA4eDggaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgdXBwZXIgYmxvY2sgaGFzIHByaW9yaXR5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQorICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQorICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgorICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZworICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDVXA0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKQoreworICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOworCisgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgfQorICAgICAgICBDb3VudCsrOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKKyAgICB7CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOworICAgICAgICB9CisgICAgICAgIENvdW50Kys7CisgICAgfQorICAgIGlmIChDb3VudD09MCkKKyAgICB7CisgICAgICAgIFN1bSA9IDEyODsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7CisgICAgfQorICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBsZWZ0IGJsb2NrIGhhcyBwcmlvcml0eQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKKyAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKKyAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKKyAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKKyAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKi8KKworc3RhdGljIHZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ0xlZnQ0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKQoreworICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOworCisgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQorICAgIHsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgIH0KKyAgICAgICAgQ291bnQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKQorICAgIHsKKyAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdW0gKz0gcFNyY0Fib3ZlW3hdOworICAgICAgICB9CisgICAgICAgIENvdW50Kys7CisgICAgfQorICAgIGlmIChDb3VudD09MCkKKyAgICB7CisgICAgICAgIFN1bSA9IDEyODsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7CisgICAgfQorICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKKyAqICAgICAgICAgICAgMC4uNykuIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCisgKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAorICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIE5vdGU6IAorICogICAgICAgICAgICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCisgKiAgICAgICAgICAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqICAgICAgICAgICAgICAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSAKKyAqICAgICAgICAgICAgICBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorICkKK3sKKyAgICBpbnQgeCwgeSwgU3VtOworICAgIGludCBILCBWLCBhLCBiLCBjOworCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDgsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGRzdFN0ZXAgJSA4KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChsZWZ0U3RlcCAlIDgpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNBYm92ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSAgICAgICYmIHBTcmNBYm92ZSAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCApICAgICAgJiYgcFNyY0xlZnQgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSAmJiBwU3JjQWJvdmVMZWZ0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9WRVJUICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX0hPUiAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHVuc2lnbmVkKXByZWRNb2RlID4gT01YX1ZDX0NIUk9NQV9QTEFORSwgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorCisgICAgc3dpdGNoIChwcmVkTW9kZSkKKyAgICB7CisgICAgY2FzZSBPTVhfVkNfQ0hST01BX0RDOgorICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KCAgICAgICBwU3JjTGVmdCwgICAgICAgICAgICBwU3JjQWJvdmUsICAgcERzdCwgICAgICAgICAgICAgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7CisgICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENVcDR4NCggICAgIHBTcmNMZWZ0LCAgICAgICAgICAgIHBTcmNBYm92ZSs0LCBwRHN0KzQsICAgICAgICAgICBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKKyAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ0xlZnQ0eDQoICAgcFNyY0xlZnQrNCpsZWZ0U3RlcCwgcFNyY0Fib3ZlLCAgIHBEc3QrNCpkc3RTdGVwLCAgIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOworICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KCAgICAgICBwU3JjTGVmdCs0KmxlZnRTdGVwLCBwU3JjQWJvdmUrNCwgcERzdCs0KzQqZHN0U3RlcCwgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfQ0hST01BX0hPUjoKKyAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9WRVJUOgorICAgICAgICBmb3IgKHk9MDsgeTw4OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9QTEFORToKKyAgICAgICAgSCA9IDQqKHBTcmNBYm92ZVs3XSAtIHBTcmNBYm92ZUxlZnRbMF0pOworICAgICAgICBmb3IgKHg9MjsgeD49MDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICBIICs9ICh4KzEpKihwU3JjQWJvdmVbNCt4XSAtIHBTcmNBYm92ZVsyLXhdKTsKKyAgICAgICAgfQorICAgICAgICBWID0gNCoocFNyY0xlZnRbNypsZWZ0U3RlcF0gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKKyAgICAgICAgZm9yICh5PTI7IHk+PTA7IHktLSkKKyAgICAgICAgeworICAgICAgICAgICAgViArPSAoeSsxKSoocFNyY0xlZnRbKDQreSkqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbKDIteSkqbGVmdFN0ZXBdKTsKKyAgICAgICAgfQorICAgICAgICBhID0gMTYqKHBTcmNBYm92ZVs3XSArIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdKTsKKyAgICAgICAgYiA9ICgxNypIKzE2KT4+NTsKKyAgICAgICAgYyA9ICgxNypWKzE2KT4+NTsKKyAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3VtID0gKGEgKyBiKih4LTMpICsgYyooeS0zKSArIDE2KT4+NTsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpYXJtQ2xpcCgwLDI1NSxTdW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwY2I0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKQEAgLTAsMCArMSwxOTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IDE2eDE2IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKKyAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAorICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKKyAqICAgICAgICAgICAgMC4uMTUpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCisgKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAorICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqIE5vdGU6IAorICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAorICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsIAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLCAKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsIAorICAgIE9NWF9VOCogcERzdCwgCisgICAgT01YX0lOVCBsZWZ0U3RlcCwgCisgICAgT01YX0lOVCBkc3RTdGVwLCAKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLCAKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSkKK3sKKyAgICBpbnQgeCx5LFN1bSxDb3VudDsKKyAgICBpbnQgSCxWLGEsYixjOworCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDE2LCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgMTYpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGxlZnRTdGVwICUgMTYpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOyAgICAgICAgCisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9WRVJUICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfSE9SICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigodW5zaWduZWQpcHJlZE1vZGUgPiBPTVhfVkNfMTZYMTZfUExBTkUsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBzd2l0Y2ggKHByZWRNb2RlKQorICAgIHsKKyAgICBjYXNlIE9NWF9WQ18xNlgxNl9WRVJUOgorICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0Fib3ZlW3hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfMTZYMTZfSE9SOgorICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ18xNlgxNl9EQzoKKyAgICAgICAgLyogVGhpcyBjYW4gYWx3YXlzIGJlIHVzZWQgZXZlbiBpZiBubyBibG9ja3MgYXZhaWxhYmxlICovCisgICAgICAgIFN1bSA9IDA7CisgICAgICAgIENvdW50ID0gMDsKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdW0gKz0gcFNyY0Fib3ZlW3hdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ291bnQ9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSA9IDEyODsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChDb3VudD09MSkKKyAgICAgICAgeworICAgICAgICAgICAgU3VtID0gKFN1bSArIDgpID4+IDQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBDb3VudCA9IDIgKi8KKyAgICAgICAgeworICAgICAgICAgICAgU3VtID0gKFN1bSArIDE2KSA+PiA1OworICAgICAgICB9CisgICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzE2WDE2X1BMQU5FOgorICAgICAgICBIID0gOCoocFNyY0Fib3ZlWzE1XSAtIHBTcmNBYm92ZUxlZnRbMF0pOworICAgICAgICBmb3IgKHg9NjsgeD49MDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICBIICs9ICh4KzEpKihwU3JjQWJvdmVbOCt4XSAtIHBTcmNBYm92ZVs2LXhdKTsKKyAgICAgICAgfQorICAgICAgICBWID0gOCoocFNyY0xlZnRbMTUqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXSk7CisgICAgICAgIGZvciAoeT02OyB5Pj0wOyB5LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFYgKz0gKHkrMSkqKHBTcmNMZWZ0Wyg4K3kpKmxlZnRTdGVwXSAtIHBTcmNMZWZ0Wyg2LXkpKmxlZnRTdGVwXSk7CisgICAgICAgIH0KKyAgICAgICAgYSA9IDE2KihwU3JjQWJvdmVbMTVdICsgcFNyY0xlZnRbMTUqbGVmdFN0ZXBdKTsKKyAgICAgICAgYiA9ICg1KkgrMzIpPj42OworICAgICAgICBjID0gKDUqViszMik+PjY7CisgICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3VtID0gKGEgKyBiKih4LTcpICsgYyooeS03KSArIDE2KT4+NTsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpYXJtQ2xpcCgwLDI1NSxTdW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTgyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYwpAQCAtMCwwICsxLDMzOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IDR4NCBpbnRyYSBwcmVkaWN0aW9uIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKKyAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKKyAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCisgKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCisgKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAxXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAorICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCisgKQoreworICAgIGludCB4LCB5OworICAgIE9NWF9VOCBwVG1wWzEwXTsKKworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChsZWZ0U3RlcCAlIDQpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGRzdFN0ZXAgJSA0KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwIDwgNCksICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNBYm92ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVkVSVCAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hPUiAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RMICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19EUiAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfRFIgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RSICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVlIgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZSICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WUiAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSEQgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hEICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IRCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVkwgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hVICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigodW5zaWduZWQpcHJlZE1vZGUgPiBPTVhfVkNfNFg0X0hVLCAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgCisgICAgLyogTm90ZTogVGhpcyBjb2RlIG11c3Qgbm90IHJlYWQgdGhlIHBTcmMgYXJyYXlzIHVubGVzcyB0aGUgY29ycmVzcG9uZGluZworICAgICAqIGJsb2NrIGlzIG1hcmtlZCBhcyBhdmFpbGFibGUuIElmIHRoZSBibG9jayBpcyBub3QgYXZhaWJhYmxlIHRoZW4gcFNyYworICAgICAqIG1heSBub3QgYmUgYSB2YWxpZCBwb2ludGVyLgorICAgICAqCisgICAgICogTm90ZTogVG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlIHdlIHJlZmVyIHRvIHRoZSBuZWlnaGJvdXJpbmcgcGl4ZWxzCisgICAgICogaW4gdmFyaWFibGVzIG5hbWVkIGFzIGJlbG93OgorICAgICAqCisgICAgICogICAgVUwgVTAgVTEgVTIgVTMgVTQgVTUgVTYgVTcKKyAgICAgKiAgICBMMCB4eCB4eCB4eCB4eAorICAgICAqICAgIEwxIHh4IHh4IHh4IHh4CisgICAgICogICAgTDIgeHggeHggeHggeHgKKyAgICAgKiAgICBMMyB4eCB4eCB4eCB4eAorICAgICAqLworICAgICAKKyNkZWZpbmUgVUwgcFNyY0Fib3ZlTGVmdFswXQorI2RlZmluZSBVMCBwU3JjQWJvdmVbMF0KKyNkZWZpbmUgVTEgcFNyY0Fib3ZlWzFdCisjZGVmaW5lIFUyIHBTcmNBYm92ZVsyXQorI2RlZmluZSBVMyBwU3JjQWJvdmVbM10KKyNkZWZpbmUgVTQgcFNyY0Fib3ZlWzRdCisjZGVmaW5lIFU1IHBTcmNBYm92ZVs1XQorI2RlZmluZSBVNiBwU3JjQWJvdmVbNl0KKyNkZWZpbmUgVTcgcFNyY0Fib3ZlWzddCisjZGVmaW5lIEwwIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisjZGVmaW5lIEwxIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisjZGVmaW5lIEwyIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisjZGVmaW5lIEwzIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisKKyAgICBzd2l0Y2ggKHByZWRNb2RlKQorICAgIHsKKyAgICBjYXNlIE9NWF9WQ180WDRfVkVSVDoKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCswXSA9IFUwOworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArMV0gPSBVMTsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzJdID0gVTI7CisgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCszXSA9IFUzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X0hPUjoKKyAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0WzAqZHN0U3RlcCt4XSA9IEwwOworICAgICAgICAgICAgcERzdFsxKmRzdFN0ZXAreF0gPSBMMTsKKyAgICAgICAgICAgIHBEc3RbMipkc3RTdGVwK3hdID0gTDI7CisgICAgICAgICAgICBwRHN0WzMqZHN0U3RlcCt4XSA9IEwzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgT01YX1ZDXzRYNF9EQzoKKyAgICAgICAgLyogVGhpcyBjYW4gYWx3YXlzIGJlIHVzZWQgZXZlbiBpZiBubyBibG9ja3MgYXZhaWxhYmxlICovCisgICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQocFNyY0xlZnQsIHBTcmNBYm92ZSwgcERzdCwgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBjYXNlIE9NWF9WQ180WDRfRElBR19ETDoKKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChVMCArIDIqVTEgKyBVMiArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChVMSArIDIqVTIgKyBVMyArIDIpPj4yKTsKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9SSUdIVCkKKyAgICAgICAgeworICAgICAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMiArIDIqVTMgKyBVNCArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVTMgKyAyKlU0ICsgVTUgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFU0ICsgMipVNSArIFU2ICsgMik+PjIpOworICAgICAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVNSArIDIqVTYgKyBVNyArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTYgKyAzKlU3ICAgICAgKyAyKT4+Mik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUyICsgMypVMyAgICAgICsgMik+PjIpOworICAgICAgICAgICAgcFRtcFszXSA9IFUzOworICAgICAgICAgICAgcFRtcFs0XSA9IFUzOworICAgICAgICAgICAgcFRtcFs1XSA9IFUzOworICAgICAgICAgICAgcFRtcFs2XSA9IFUzOworICAgICAgICB9CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFt4K3ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X0RJQUdfRFI6ICAgICAgICAKKyAgICAgICAgLyogeC15ID0gLTMsIC0yLCAtMSwgMCwgMSwgMiwgMyAqLworICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKEwxICsgMipMMiArIEwzICsgMik+PjIpOworICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKEwwICsgMipMMSArIEwyICsgMik+PjIpOworICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFVMICsgMipMMCArIEwxICsgMik+PjIpOworICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFUwICsgMipVTCArIEwwICsgMik+PjIpOworICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFUxICsgMipVMCArIFVMICsgMik+PjIpOworICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUyICsgMipVMSArIFUwICsgMik+PjIpOworICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFUzICsgMipVMiArIFUxICsgMik+PjIpOworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMyt4LXldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X1ZSOgorICAgICAgICAvKiB6VlI9MngteSA9IC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYKKyAgICAgICAgICogeC0oeT4+MSkgPSAtMSwgLTEsICAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzCisgICAgICAgICAqIHkgICAgICAgID0gIDMsICAyLCAgPywgPywgPywgPywgPywgPywgMSwgMAorICAgICAgICAgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChMMiArIDIqTDEgKyBMMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChMMSArIDIqTDAgKyBVTCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChMMCArIDIqVUwgKyBVMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVTCArIFUwICsgMSk+PjEpOworICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFVMICsgMipVMCArIFUxICsgMik+PjIpOworICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUwICsgVTEgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTAgKyAyKlUxICsgVTIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbN10gPSAoT01YX1U4KSgoVTEgKyBVMiArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs4XSA9IChPTVhfVTgpKChVMSArIDIqVTIgKyBVMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs5XSA9IChPTVhfVTgpKChVMiArIFUzICsgMSk+PjEpOworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMysyKngteV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ180WDRfSEQ6CisgICAgICAgIC8qIHpIRD0yeS14ID0gLTMgLTIgLTEgIDAgIDEgIDIgIDMgIDQgIDUgIDYKKyAgICAgICAgICogeS0oeD4+MSkgPSAtMSAtMSAgMCAgMCAgMSAgMSAgMiAgMiAgMyAgMworICAgICAgICAgKiB4ICAgICAgICA9ICAzICAyICAgICAgICAgICAgICAgICAgICAxICAwCisgICAgICAgICAqLworICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKFUyICsgMipVMSArIFUwICsgMik+PjIpOworICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKFUxICsgMipVMCArIFVMICsgMik+PjIpOworICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUwICsgMipVTCArIEwwICsgMik+PjIpOworICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFVMICsgTDAgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVUwgKyAyKkwwICsgTDEgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoTDAgKyBMMSArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChMMCArIDIqTDEgKyBMMiArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs3XSA9IChPTVhfVTgpKChMMSArIEwyICsgMSk+PjEpOworICAgICAgICBwVG1wWzhdID0gKE9NWF9VOCkoKEwxICsgMipMMiArIEwzICsgMik+PjIpOworICAgICAgICBwVG1wWzldID0gKE9NWF9VOCkoKEwyICsgTDMgKyAxKT4+MSk7CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFszKzIqeS14XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9WTDoKKyAgICAgICAgLyogTm90ZTogeCsoeT4+MSkgPSAoMip4K3kpPj4xCisgICAgICAgICAqIDJ4K3kgPSAwIDEgMiAzIDQgNSA2IDcgOCA5CisgICAgICAgICAqLworICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKFUwICsgVTEgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoVTAgKyAyKlUxICsgVTIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTEgKyBVMiArIDEpPj4xKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVMSArIDIqVTIgKyBVMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVMiArIFUzICsgMSk+PjEpOworICAgICAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX1JJR0hUKQorICAgICAgICB7CisgICAgICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUyICsgMipVMyArIFU0ICsgMik+PjIpOworICAgICAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVMyArIFU0ICsgMSk+PjEpOworICAgICAgICAgICAgcFRtcFs3XSA9IChPTVhfVTgpKChVMyArIDIqVTQgKyBVNSArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbOF0gPSAoT01YX1U4KSgoVTQgKyBVNSArIDEpPj4xKTsKKyAgICAgICAgICAgIHBUbXBbOV0gPSAoT01YX1U4KSgoVTQgKyAyKlU1ICsgVTYgKyAyKT4+Mik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUyICsgMypVMyArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbNl0gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbN10gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbOF0gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbOV0gPSBVMzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMip4K3ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X0hVOgorICAgICAgICAvKiB6SFUgPSB4KzIqeSAqLworICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKEwwICsgTDEgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoTDAgKyAyKkwxICsgTDIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoTDEgKyBMMiArIDEpPj4xKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChMMSArIDIqTDIgKyBMMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChMMiArIEwzICsgMSk+PjEpOworICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKEwyICsgMypMMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs2XSA9IEwzOworICAgICAgICBwVG1wWzddID0gTDM7CisgICAgICAgIHBUbXBbOF0gPSBMMzsKKyAgICAgICAgcFRtcFs5XSA9IEwzOworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbeCsyKnldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTE0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKQEAgLTAsMCArMSw4NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCisgKiBvZiAxNngxNiBvciAxNng4CisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNngoCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVNyY1N0ZXAgPT0gMCkgfHwgKGlTcmNTdGVwICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAKKworICAgIHJldHVybiBhcm1WQ000UDEwX1NBRFF1YXIKKyAgICAgICAgKHBTcmMsIHBTcmNSZWYwLCBwU3JjUmVmMSwgaVNyY1N0ZXAsIAorICAgICAgICBpUmVmU3RlcDAsIGlSZWZTdGVwMSwgcERzdFNBRCwgaUhlaWdodCwgMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjMzMGJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKQEAgLTAsMCArMSw4NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEUXVhcl80eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgb2YgcFNyYyB3aXRoIGF2ZXJhZ2Ugb2YgdHdvIFJlZiBibG9ja3MKKyAqIG9mIDR4OCBvciA0eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCisgKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCggCisJICBjb25zdCBPTVhfVTgqIAlwU3JjLAorICAgICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCisJICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICAgIE9NWF9VMzIJaVJlZlN0ZXAwLAorICAgICAgT01YX1UzMglpUmVmU3RlcDEsCisgICAgICBPTVhfVTMyKglwRHN0U0FELAorICAgICAgT01YX1UzMiAgIGlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlTcmNTdGVwID09IDApIHx8IChpU3JjU3RlcCAmIDMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgcmV0dXJuIGFybVZDTTRQMTBfU0FEUXVhcgorICAgICAgICAocFNyYywgcFNyY1JlZjAsIHBTcmNSZWYxLCBpU3JjU3RlcCwgCisgICAgICAgIGlSZWZTdGVwMCwgaVJlZlN0ZXAxLCBwRHN0U0FELCBpSGVpZ2h0LCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllOWMyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfOHguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCisgKiBvZiA4eDE2IG9yIDh4OCBvciA4eDQKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4KCAKKwljb25zdCBPTVhfVTgqIAlwU3JjLAorICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKKyAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIqCXBEc3RTQUQsCisgICAgT01YX1UzMiAgICAgaUhlaWdodAorKQoreworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkgJiYgCisgICAgICAgIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3JjU3RlcCA9PSAwKSB8fCAoaVNyY1N0ZXAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9TQURRdWFyCisgICAgICAgIChwU3JjLCBwU3JjUmVmMCwgcFNyY1JlZjEsIGlTcmNTdGVwLCAKKyAgICAgICAgaVJlZlN0ZXAwLCBpUmVmU3RlcDEsIHBEc3RTQUQsIGlIZWlnaHQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3YzQ1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKQEAgLTAsMCArMSw3NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEXzR4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHgoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBPcmcgPT0gMCkgfHwgKGlTdGVwT3JnICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcFJlZiA9PSAwKSB8fCAoaVN0ZXBSZWYgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICByZXR1cm4gYXJtVkNDT01NX1NBRCAKKyAgICAgICAgKHBTcmNPcmcsIGlTdGVwT3JnLCBwU3JjUmVmLCBpU3RlcFJlZiwgcERzdFNBRCwgaUhlaWdodCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYWU2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FURF80eDQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCisgKiAKKyAqLworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKKyAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKKyAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCggCisJY29uc3QgT01YX1U4KgkJcFNyY09yZywKKwlPTVhfVTMyICAgICBpU3RlcE9yZywgICAgICAgICAgICAgICAgICAgICAgICAgCisJY29uc3QgT01YX1U4KgkJcFNyY1JlZiwKKwlPTVhfVTMyCQlpU3RlcFJlZiwKKwlPTVhfVTMyKiAgICBwRHN0U0FECispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzMyICAgICBTQVREID0gMDsKKyAgICBPTVhfUzMyICAgICBkIFs0XVs0XSwgbTFbNF1bNF0sIG0yWzRdWzRdOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNSZWYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBkIFtqXVtpXSA9IHBTcmNPcmcgW2ogKiBpU3RlcE9yZyArIGldIC0gcFNyY1JlZiBbaiAqIGlTdGVwUmVmICsgaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIYWRhbWFyZCBUcmFuc2ZvciBmb3IgNHg0IGJsb2NrICovCisKKyAgICAvKiBIb3Jpem9udGFsICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIG0xW2ldWzBdID0gZFtpXVswXSArIGRbaV1bMl07IC8qIGErYyAqLworICAgICAgICBtMVtpXVsxXSA9IGRbaV1bMV0gKyBkW2ldWzNdOyAvKiBiK2QgKi8KKyAgICAgICAgbTFbaV1bMl0gPSBkW2ldWzBdIC0gZFtpXVsyXTsgLyogYS1jICovCisgICAgICAgIG0xW2ldWzNdID0gZFtpXVsxXSAtIGRbaV1bM107IC8qIGItZCAqLworCisgICAgICAgIG0yW2ldWzBdID0gbTFbaV1bMF0gKyBtMVtpXVsxXTsgLyogYStiK2MrZCAqLworICAgICAgICBtMltpXVsxXSA9IG0xW2ldWzJdICsgbTFbaV1bM107IC8qIGErYi1jLWQgKi8KKyAgICAgICAgbTJbaV1bMl0gPSBtMVtpXVsyXSAtIG0xW2ldWzNdOyAvKiBhLWItYytkICovCisgICAgICAgIG0yW2ldWzNdID0gbTFbaV1bMF0gLSBtMVtpXVsxXTsgLyogYS1iK2MtZCAqLworCisgICAgfQorCisgICAgLyogVmVydGljYWwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgbTFbMF1baV0gPSBtMlswXVtpXSArIG0yWzJdW2ldOworICAgICAgICBtMVsxXVtpXSA9IG0yWzFdW2ldICsgbTJbM11baV07CisgICAgICAgIG0xWzJdW2ldID0gbTJbMF1baV0gLSBtMlsyXVtpXTsKKyAgICAgICAgbTFbM11baV0gPSBtMlsxXVtpXSAtIG0yWzNdW2ldOworCisgICAgICAgIG0yWzBdW2ldID0gbTFbMF1baV0gKyBtMVsxXVtpXTsKKyAgICAgICAgbTJbMV1baV0gPSBtMVsyXVtpXSArIG0xWzNdW2ldOworICAgICAgICBtMlsyXVtpXSA9IG0xWzJdW2ldIC0gbTFbM11baV07CisgICAgICAgIG0yWzNdW2ldID0gbTFbMF1baV0gLSBtMVsxXVtpXTsKKyAgICB9CisgICAgCisgICAgLyogY2FsY3VsYXRlIFNBRCBmb3IgVHJhbnNmb3JtZWQgY29lZmZpY2llbnRzICovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNBVEQgKz0gYXJtQWJzKG0yIFtqXVtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgICpwRHN0U0FEID0gKFNBVEQgKyAxKSAvIDI7CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2E1NjYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCkBAIC0wLDAgKzEsMjIwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDR4NCBibG9ja3MKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKKyAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKKyAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKKyAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCisgKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKKyAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgNC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAorICogICAgICAgICAgICBvZiA0LiAKKyAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAorICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKKyAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAorICogICAgICAgICAgICAwLUlOVEVSIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAorICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAorICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KKyBPTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCisJIGNvbnN0IE9NWF9VOCoJCXBTcmNPcmcsCisJIGNvbnN0IE9NWF9VOCoJCXBTcmNQcmVkLAorCSBPTVhfVTMyCQlpU3JjT3JnU3RlcCwKKwkgT01YX1UzMgkJaVNyY1ByZWRTdGVwLAorCSBPTVhfUzE2KgkgICAgcERzdFF1YW50Q29lZmYsCisJIE9NWF9TMTYqIAkgICAgcERzdERlUXVhbnRDb2VmZiwKKwkgT01YX1MxNioJICAgIHBEQ0NvZWZmLAorCSBPTVhfUzgqCQlwTnVtQ29lZmYsCisJIE9NWF9VMzIJCW5UaHJlc2hTQUQsCisJIE9NWF9VMzIJCWlRUCwKKwkgT01YX1U4CQkgICAgYkludHJhCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzggICAgICBOdW1Db2VmZiA9IDA7CisgICAgT01YX1MxNiAgICAgQnVmWzE2XSwgbVsxNl07CisgICAgT01YX1UzMiAgICAgUUJpdHMsIFFQcGVyLCBRUG1vZCwgZjsKKyAgICBPTVhfUzMyICAgICBWYWx1ZSwgTUYsIFRocmVzaERDOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKwlhcm1SZXRBcmdFcnJJZihwRHN0RGVRdWFudENvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCWFybVJldEFyZ0VycklmKHBOdW1Db2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKwlhcm1SZXRBcmdFcnJJZihwRENDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjUHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RRdWFudENvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0UXVhbnRDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChwRHN0RGVRdWFudENvZWZmICE9IE5VTEwpICYmIAorCQkJYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3REZVF1YW50Q29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoYkludHJhICE9IDApICYmIChiSW50cmEgIT0gMSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpU3JjT3JnU3RlcCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpU3JjUHJlZFN0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY09yZ1N0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpU3JjUHJlZFN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIAorICAgICAqIFplcm8tQmxvY2sgRWFybHkgZGV0ZWN0aW9uIHVzaW5nIG5UaHJlc2hTQUQgcGFyYW0gCisgICAgICovCisKKyAgICBRUHBlciA9IGlRUCAvIDY7CisgICAgUVBtb2QgPSBpUVAgJSA2OyAgICAKKyAgICBRQml0cyA9IDE1ICsgUVBwZXI7CisgICAgCisgICAgZiA9ICgxIDw8IFFCaXRzKSAvIChiSW50cmEgPyAzIDogNik7CisgICAgCisgICAgLyogRG8gWmVyby1CbG9jayBFYXJseSBkZXRlY3Rpb24gaWYgZW5hYmxlZCAqLworICAgIGlmIChuVGhyZXNoU0FEKQorICAgIHsKKyAgICAgICAgVGhyZXNoREMgPSAoKDEgPDwgUUJpdHMpIC0gZikgLyBhcm1WQ000UDEwX01GTWF0cml4W1FQbW9kXVswXTsKKyAgICAgICAgaWYgKG5UaHJlc2hTQUQgPCBUaHJlc2hEQykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IGJsb2NrIHRvIHplcm8gKi8KKyAgICAgICAgICAgIGlmIChwRENDb2VmZiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwRENDb2VmZiA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBEc3RRdWFudENvZWZmIFs0ICogaiArIGldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBEc3REZVF1YW50Q29lZmYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiBbNCAqIGogKyBpXSA9IDA7ICAgIAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwTnVtQ29lZmYgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcE51bUNvZWZmID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgICAgICB9CisgICAgfQorCisKKyAgIC8qIENhbGN1bGF0ZSBkaWZmZXJlbmNlICovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ1ZiBbaiAqIDQgKyBpXSA9IAorICAgICAgICAgICAgICAgIHBTcmNPcmcgW2ogKiBpU3JjT3JnU3RlcCArIGldIC0gcFNyY1ByZWQgW2ogKiBpU3JjUHJlZFN0ZXAgKyBpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlc2lkdWFsIFRyYW5zZm9ybSAqLworICAgIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQgKG0sIEJ1Zik7CisKKyAgICBpZiAocERDQ29lZmYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIENvcHkgdW5xdWFudGl6ZWQgREMgdmFsdWUgaW50byBwb2ludGVyICovCisgICAgICAgICpwRENDb2VmZiA9IG1bMF07CisgICAgfQorCisgICAgLyogUXVhbnRpemF0aW9uICovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE1GID0gYXJtVkNNNFAxMF9NRk1hdHJpeFtRUG1vZF1bYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaiAqIDQgKyBpXV07CisgICAgICAgICAgICBWYWx1ZSA9IGFybUFicyhtW2ogKiA0ICsgaV0pICogTUYgKyBmOworICAgICAgICAgICAgVmFsdWUgPj49IFFCaXRzOworICAgICAgICAgICAgVmFsdWUgPSBtW2ogKiA0ICsgaV0gPCAwID8gLVZhbHVlIDogVmFsdWU7CisgICAgICAgICAgICBCdWZbNCAqIGogKyBpXSA9IHBEc3RRdWFudENvZWZmIFs0ICogaiArIGldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgICAgICBpZiAoKHBOdW1Db2VmZiAhPSBOVUxMKSAmJiBWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOdW1Db2VmZisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogT3V0cHV0IG51bWJlciBvZiBub24temVybyBDb2VmZnMgKi8KKyAgICBpZiAocE51bUNvZWZmICE9IE5VTEwpCisgICAgeworICAgICAgICAqcE51bUNvZWZmID0gTnVtQ29lZmY7CisgICAgfQorICAgIAorICAgIC8qIFJlc2lkdWFsIEludiBUcmFuc2Zvcm0gKi8KKyAgICBpZiAocERzdERlUXVhbnRDb2VmZiAhPSBOVUxMKQorICAgIHsgICAgCisgICAgICAgIC8qIFJlIFNjYWxlICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbSBbaiAqIDQgKyBpXSAgPSBCdWYgW2ogKiA0ICsgaV0gKiAoMSA8PCBRUHBlcikgKgorICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDEwX1ZNYXRyaXhbUVBtb2RdW2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ogKiA0ICsgaV1dOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQgKHBEc3REZVF1YW50Q29lZmYsIG0pOyAgICAgICAgCisgICAgfQorICAgICAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQwZTgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlcXVhbnRpemUgQ2hyb21hIDJ4MiBEQyBibG9jaworICovCisKK3N0YXRpYyB2b2lkIERlcXVhbnRDaHJvbWFEQzJ4MigKKyAgICAgT01YX1MxNiogcERzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCispCit7CisgICAgaW50IFNoaWZ0ID0gKFFQLzYpLTEgOworICAgIGludCBTY2FsZSA9IGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXTsKKyAgICBpbnQgaSwgVmFsdWU7CisKKyAgICBpZiAoU2hpZnQgPj0gMCkKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlKSA8PCBTaGlmdDsKKyAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSkgPj4gMTsKKyAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKyAKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogSW52ZXJzZSBUcmFuc2Zvcm0gREMgMngyIENvZWZmaWNpZW50cworICovCisKK3N0YXRpYyB2b2lkIEludlRyYW5zZm9ybURDMngyKE9NWF9TMTYqIHBEYXRhKQoreworICAgIGludCBjMDAgPSBwRGF0YVswXTsKKyAgICBpbnQgYzAxID0gcERhdGFbMV07CisgICAgaW50IGMxMCA9IHBEYXRhWzJdOworICAgIGludCBjMTEgPSBwRGF0YVszXTsKKworICAgIGludCBkMDAgPSBjMDAgKyBjMDE7CisgICAgaW50IGQwMSA9IGMwMCAtIGMwMTsKKyAgICBpbnQgZDEwID0gYzEwICsgYzExOworICAgIGludCBkMTEgPSBjMTAgLSBjMTE7CisKKyAgICBwRGF0YVswXSA9IChPTVhfUzE2KShkMDAgKyBkMTApOworICAgIHBEYXRhWzFdID0gKE9NWF9TMTYpKGQwMSArIGQxMSk7CisgICAgcERhdGFbMl0gPSAoT01YX1MxNikoZDAwIC0gZDEwKTsKKyAgICBwRGF0YVszXSA9IChPTVhfUzE2KShkMDEgLSBkMTEpOworfQorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAorICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0LAorICAgICBPTVhfSU5UIFFQICAgICAgICAKKyApCit7CisgICAgYXJtUmV0QXJnRXJySWYocHBTcmMgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwU3JjID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCAgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoUVA8MCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoUVA+NTEsICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKHBwU3JjLCBwRHN0KTsKKyAgICBJbnZUcmFuc2Zvcm1EQzJ4MihwRHN0KTsKKyAgICBEZXF1YW50Q2hyb21hREMyeDIocERzdCwgUVApOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmM4YmUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYwpAQCAtMCwwICsxLDE0OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRGVxdWFudGl6ZSBMdW1hIERDIGJsb2NrCisgKi8KKworc3RhdGljIHZvaWQgRGVxdWFudEx1bWFEQzR4NCgKKyAgICAgT01YX1MxNiogcERzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCispCit7CisgICAgaW50IFNoaWZ0ID0gKFFQLzYpLTIgOworICAgIGludCBTY2FsZSA9IGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXTsKKyAgICBpbnQgaSwgUm91bmQsIFZhbHVlOworCisgICAgaWYgKFNoaWZ0ID49IDApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUpIDw8IFNoaWZ0OworICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OzsKKyAgICAgICAgUm91bmQgPSAxPDwoU2hpZnQtMSk7CisKKyAgICAgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlICsgUm91bmQpID4+IFNoaWZ0OworICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisgCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIEludmVyc2UgVHJhbnNmb3JtIERDIDR4NCBDb2VmZmljaWVudHMKKyAqLworc3RhdGljIHZvaWQgSW52VHJhbnNmb3JtREM0eDQoT01YX1MxNiogcERhdGEpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBUcmFuc2Zvcm0gcm93cyAqLworICAgIGZvciAoaT0wOyBpPDE2OyBpKz00KQorICAgIHsKKyAgICAgICAgaW50IGMwID0gcERhdGFbaSswXTsKKyAgICAgICAgaW50IGMxID0gcERhdGFbaSsxXTsKKyAgICAgICAgaW50IGMyID0gcERhdGFbaSsyXTsKKyAgICAgICAgaW50IGMzID0gcERhdGFbaSszXTsKKyAgICAgICAgcERhdGFbaSswXSA9IChPTVhfUzE2KShjMCtjMStjMitjMyk7CisgICAgICAgIHBEYXRhW2krMV0gPSAoT01YX1MxNikoYzArYzEtYzItYzMpOworICAgICAgICBwRGF0YVtpKzJdID0gKE9NWF9TMTYpKGMwLWMxLWMyK2MzKTsKKyAgICAgICAgcERhdGFbaSszXSA9IChPTVhfUzE2KShjMC1jMStjMi1jMyk7CisgICAgfQorCisgICAgLyogVHJhbnNmb3JtIGNvbHVtbnMgKi8KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICBpbnQgYzAgPSBwRGF0YVtpKzBdOworICAgICAgICBpbnQgYzEgPSBwRGF0YVtpKzRdOworICAgICAgICBpbnQgYzIgPSBwRGF0YVtpKzhdOworICAgICAgICBpbnQgYzMgPSBwRGF0YVtpKzEyXTsKKyAgICAgICAgcERhdGFbaSswXSA9IChPTVhfUzE2KShjMCtjMStjMitjMyk7CisgICAgICAgIHBEYXRhW2krNF0gPSAoT01YX1MxNikoYzArYzEtYzItYzMpOworICAgICAgICBwRGF0YVtpKzhdID0gKE9NWF9TMTYpKGMwLWMxLWMyK2MzKTsKKyAgICAgICAgcERhdGFbaSsxMl0gPSAoT01YX1MxNikoYzAtYzErYzItYzMpOworICAgIH0KK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCisgKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAorICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCisgKQoreworICAgIGFybVJldEFyZ0VycklmKHBwU3JjICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcFNyYyA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKFFQPDAsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKFFQPjUxLCAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NChwcFNyYywgcERzdCk7CisgICAgLypJbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0KHBEc3QsIFFQKTsqLworICAgIEludlRyYW5zZm9ybURDNHg0KHBEc3QpOworICAgIERlcXVhbnRMdW1hREM0eDQocERzdCwgUVApOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NDRkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYwpAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyAgCisgKiBjb2VmZmljaWVudHMgYW5kIHF1YW50aXphdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMoCisJT01YX1MxNiogCXBTcmNEc3QsCisJT01YX1UzMgkJaVFQLAorCU9NWF9VOAkJYkludHJhCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzMyICAgICBtWzJdWzJdOworICAgIE9NWF9TMzIgICAgIFZhbHVlOworICAgIE9NWF9TMzIgICAgIFFiaXRzUGx1c09uZSwgVHdvX2YsIE1GMDA7CisKKyAgICAvKiBDaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogSGFkYW1hcmQgVHJhbnNmb3JtIGZvciAyeDIgYmxvY2sgKi8KKyAgICBtWzBdWzBdID0gcFNyY0RzdFswXSArIHBTcmNEc3RbMV0gKyAgcFNyY0RzdFsyXSArIHBTcmNEc3RbM107CisgICAgbVswXVsxXSA9IHBTcmNEc3RbMF0gLSBwU3JjRHN0WzFdICsgIHBTcmNEc3RbMl0gLSBwU3JjRHN0WzNdOworICAgIG1bMV1bMF0gPSBwU3JjRHN0WzBdICsgcFNyY0RzdFsxXSAtICBwU3JjRHN0WzJdIC0gcFNyY0RzdFszXTsKKyAgICBtWzFdWzFdID0gcFNyY0RzdFswXSAtIHBTcmNEc3RbMV0gLSAgcFNyY0RzdFsyXSArIHBTcmNEc3RbM107CisKKyAgICAvKiBRdWFudGl6YXRpb24gKi8KKyAgICBRYml0c1BsdXNPbmUgPSBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpOyAvKmZsb29yIChRUC82KSovCisgICAgTUYwMCA9IGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdOworCisgICAgVHdvX2YgPSAoMSA8PCBRYml0c1BsdXNPbmUpIC8gKGJJbnRyYSA/IDMgOiA2KTsgLyogMy0+SU5UUkEsIDYtPklOVEVSICovCisKKyAgICAvKiBTY2FsaW5nICovCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKGFybUFicyhtW2pdW2ldKSAqIE1GMDAgKyBUd29fZikgPj4gUWJpdHNQbHVzT25lOworICAgICAgICAgICAgcFNyY0RzdFtqICogMiArIGldID0gKE9NWF9TMTYpKChtW2pdW2ldIDwgMCkgPyAtVmFsdWUgOiBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjY2Y3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCkBAIC0wLDAgKzEsMTE5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCBxdWFudGl6YXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDKAorCU9NWF9TMTYqIAlwU3JjRHN0LAorCU9NWF9VMzIJCWlRUAorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MzMiAgICAgbTFbNF1bNF0sIG0yWzRdWzRdOworICAgIE9NWF9TMzIgICAgIFZhbHVlOworICAgIE9NWF9VMzIgICAgIFFiaXRzUGx1c09uZSwgVHdvX2YsIE1GOworCisgICAgLyogQ2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBIYWRhbWFyZCBUcmFuc2Zvcm0gZm9yIDR4NCBibG9jayAqLworICAgIC8qIEhvcml6b250YWwgSGFkYW1hcmQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IGkgKiA0OworICAgICAgICAKKyAgICAgICAgbTFbaV1bMF0gPSBwU3JjRHN0W2ogKyAwXSArIHBTcmNEc3RbaiArIDJdOyAvKiBhK2MgKi8KKyAgICAgICAgbTFbaV1bMV0gPSBwU3JjRHN0W2ogKyAxXSArIHBTcmNEc3RbaiArIDNdOyAvKiBiK2QgKi8KKyAgICAgICAgbTFbaV1bMl0gPSBwU3JjRHN0W2ogKyAwXSAtIHBTcmNEc3RbaiArIDJdOyAvKiBhLWMgKi8KKyAgICAgICAgbTFbaV1bM10gPSBwU3JjRHN0W2ogKyAxXSAtIHBTcmNEc3RbaiArIDNdOyAvKiBiLWQgKi8KKworICAgICAgICBtMltpXVswXSA9IG0xW2ldWzBdICsgbTFbaV1bMV07IC8qIGErYitjK2QgKi8KKyAgICAgICAgbTJbaV1bMV0gPSBtMVtpXVsyXSArIG0xW2ldWzNdOyAvKiBhK2ItYy1kICovCisgICAgICAgIG0yW2ldWzJdID0gbTFbaV1bMl0gLSBtMVtpXVszXTsgLyogYS1iLWMrZCAqLworICAgICAgICBtMltpXVszXSA9IG0xW2ldWzBdIC0gbTFbaV1bMV07IC8qIGEtYitjLWQgKi8KKworICAgIH0KKworICAgIC8qIFZlcnRpY2FsICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIG0xWzBdW2ldID0gbTJbMF1baV0gKyBtMlsyXVtpXTsKKyAgICAgICAgbTFbMV1baV0gPSBtMlsxXVtpXSArIG0yWzNdW2ldOworICAgICAgICBtMVsyXVtpXSA9IG0yWzBdW2ldIC0gbTJbMl1baV07CisgICAgICAgIG0xWzNdW2ldID0gbTJbMV1baV0gLSBtMlszXVtpXTsKKworICAgICAgICBtMlswXVtpXSA9IG0xWzBdW2ldICsgbTFbMV1baV07CisgICAgICAgIG0yWzFdW2ldID0gbTFbMl1baV0gKyBtMVszXVtpXTsKKyAgICAgICAgbTJbMl1baV0gPSBtMVsyXVtpXSAtIG0xWzNdW2ldOworICAgICAgICBtMlszXVtpXSA9IG0xWzBdW2ldIC0gbTFbMV1baV07CisgICAgfQorCisgICAgCisgICAgLyogUXVhbnRpemF0aW9uICovCisgICAgUWJpdHNQbHVzT25lID0gQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KTsgLypmbG9vciAoUVAvNikqLworICAgIFR3b19mID0gKDEgPDwgUWJpdHNQbHVzT25lKSAvIDM7IC8qIDMtPklOVFJBLCA2LT5JTlRFUiAqLworICAgIE1GID0gYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF07CisKKyAgICAvKiBTY2FsaW5nICovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKGFybUFicygobTJbal1baV0vKiArIDEqLykgLyAyKSAqIE1GICsgVHdvX2YpID4+IFFiaXRzUGx1c09uZTsKKyAgICAgICAgICAgIHBTcmNEc3RbaiAqIDQgKyBpXSA9IChPTVhfUzE2KSgobTJbal1baV0gPCAwKSA/IC1WYWx1ZSA6IFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1NWI2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRENUX1RhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0RDVF9UYWJsZS5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIERDVC9JRENUIG1vZHVsZQorICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YRENUVEFCX0hfCisjZGVmaW5lIF9PTVhEQ1RUQUJfSF8KKworZXh0ZXJuIGNvbnN0IE9NWF9GNjQgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbOF1bOF07CisKKyNlbmRpZiAvKiBfT01YRENUVEFCX0hfICovCisKKworLyogRW5kIG9mIGZpbGUgKi8KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlY2MwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzLmgKKyAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgSHVmZmZtYW4gY29kaW5nIGFuZCBkZWNvZGluZyAKKyAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWEhVRkZUQUJfSF8KKyNkZWZpbmUgX09NWEhVRkZUQUJfSF8KKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJ1bklkeFsxMV07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wwWzY4XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSdW5JZHhbN107CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wxWzM2XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMTUFYWzE1XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFMTUFYWzIxXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSTUFYWzI3XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSTUFYWzhdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeFsxMl07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wwWzU5XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSdW5JZHhbM107CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wxWzQ1XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMTUFYWzI3XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFMTUFYWzQxXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSTUFYWzEyXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSTUFYWzNdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXhbMTRdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFsxNF07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hVmxjTVZEWzY2XTsKKworI2VuZGlmIC8qIF9PTVhIVUZGVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1ZWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApAQCAtMCwwICsxLDI1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YWklHWkFHVEFCX0hfCisjZGVmaW5lIF9PTVhaSUdaQUdUQUJfSF8KKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzY0XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOworCisjZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhMzk2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQUNEQ1ByZWRpY3QuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCisgKgorICovIAorIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0FDRENQcmVkaWN0CisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCisgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jaworICogW2luXSBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtpbl0gY3VyUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2suCisgKiBbaW5dIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworICogW2luXSBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKiBbaW5dIEFDUHJlZEZsYWcgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00CisgKiBbaW5dIHZpZGVvQ29tcCAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiBbaW5dIGZsYWcgICAgICAgIFRoaXMgZmxhZyBkZWZpbmVzIHRoZSBpZiBvbmUgd2FudHMgdG8gdXNlIHRoaXMgZnVuY3Rpb25zIHRvCisgKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQUUYgKHNldCAxLCBwcmVkaWN0aW9uKSBvciBRRiAoc2V0IDAsIHJlY29uc3RydWN0aW9uKQorICogW291dF0gICAgcFByZUFDUHJlZGljdCAgIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxlZCBPTkxZIGlmIGl0IGlzIG5vdCBOVUxMCisgKiBbb3V0XSAgICBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sKKyAqIFtvdXRdICAgIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW291dF0gICAgcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbb3V0XSAgICBwU3VtRXJyICAgICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIHN1bSBvZiB0aGUgZGlmZmVyZW5jZQorICogICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIHVucHJlZGljdGVkIGNvZWZmaWNpZW50cworICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBOVUxMLCBkbyBub3QgdXBkYXRlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCisgICAgIE9NWF9TMTYgKiBwU3JjRHN0LAorICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCisgICAgIE9NWF9JTlQgY3VyUVAsCisgICAgIE9NWF9JTlQgcHJlZFFQLAorICAgICBPTVhfSU5UIHByZWREaXIsCisgICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAorICAgICBPTVhfVTggZmxhZywKKyAgICAgT01YX0lOVCAqcFN1bUVycgorKQoreworICAgIE9NWF9JTlQgZGNTY2FsZXIsIGk7CisgICAgT01YX1MxNiB0ZW1wUHJlZDsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY3VyUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRRUCA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgIT0gMSkgJiYgKHByZWREaXIgIT0gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFByZWRCdWZSb3cpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmQ29sKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgCisgICAgLyogU2V0IERDIHNjYWxlciB2YWx1ZSB0byBhdm9pZCBzb21lIGNvbXBpbGVycyBnaXZpbmcgYSB3YXJuaW5nLiAqLworICAgIGRjU2NhbGVyPTA7CisgICAgCisgICAgLyogQ2FsY3VsYXRlIHRoZSBEQyBzY2FsZXIgdmFsdWUgKi8KKyAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCisgICAgeworICAgICAgICBpZiAoY3VyUVAgPj0gMSAmJiBjdXJRUCA8PSA0KQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3VyUVAgPj0gNSAmJiBjdXJRUCA8PSA4KQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IDIgKiBjdXJRUDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdXJRUCA+PSA5ICYmIGN1clFQIDw9IDI0KQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IGN1clFQICsgODsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjU2NhbGVyID0gKDIgKiBjdXJRUCkgLSAxNjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0NIUk9NSU5BTkNFKQorICAgIHsKKyAgICAgICAgaWYgKGN1clFQID49IDEgJiYgY3VyUVAgPD0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGN1clFQID49IDUgJiYgY3VyUVAgPD0gMjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjU2NhbGVyID0gKGN1clFQICsgMTMpLzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IGN1clFQIC0gNjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwUHJlQUNQcmVkaWN0ICE9IE5VTEwpCisgICAgeworICAgICAgICBwUHJlQUNQcmVkaWN0WzBdID0gcHJlZERpcjsKKyAgICB9CisKKyAgICBpZiAocHJlZERpciA9PSBPTVhfVkNfVkVSVElDQUwpCisgICAgeworICAgICAgICAvKiBGWzBdWzBdLy9kY19zY2FsZXIgKi8KKyAgICAgICAgdGVtcFByZWQgPSBhcm1JbnREaXZBd2F5RnJvbVplcm8ocFByZWRCdWZSb3dbMF0sIGRjU2NhbGVyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRlswXVswXS8vZGNfc2NhbGVyICovCisgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvKHBQcmVkQnVmQ29sWzBdLCBkY1NjYWxlcik7CisgICAgfQorCisgICAgLyogVXBkYXRpbmcgdGhlIERDIHZhbHVlIHRvIHRoZSByb3cgYW5kIGNvbCBidWZmZXIgKi8KKyAgICAqKHBQcmVkQnVmUm93IC0gOCkgPSAqcFByZWRCdWZDb2w7CisKKyAgICBpZiAoZmxhZykKKyAgICB7CisgICAgICAgIC8qIENhbCBhbmQgc3RvcmUgRlswXVswXSBpbnRvIHRoZSBjb2wgYnVmZmVyICovCisgICAgICAgICpwUHJlZEJ1ZkNvbCA9IHBTcmNEc3RbMF0gKiBkY1NjYWxlcjsKKworICAgICAgICAvKiBQUUYgPSBRRiAtIEZbMF1bMF0vL2RjX3NjYWxlciAqLworICAgICAgICBwU3JjRHN0WzBdIC09IHRlbXBQcmVkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBRRiA9IFBRRiArIEZbMF1bMF0vL2RjX3NjYWxlciAqLworICAgICAgICBwU3JjRHN0WzBdICs9IHRlbXBQcmVkOworICAgICAgICAKKyAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgcFNyY0RzdFswXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0WzBdKTsKKworICAgICAgICAvKiBDYWwgYW5kIHN0b3JlIEZbMF1bMF0gaW50byB0aGUgY29sIGJ1ZmZlciAqLworICAgICAgICAqcFByZWRCdWZDb2wgPSBwU3JjRHN0WzBdICogZGNTY2FsZXI7CisgICAgfQorCisKKyAgICBpZiAoQUNQcmVkRmxhZyA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKHByZWREaXIgPT0gT01YX1ZDX1ZFUlRJQ0FMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUHJlZEJ1ZlJvd1tpXSAqIHByZWRRUCwgY3VyUVApOworICAgICAgICAgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gdGhlIHJvdyBidWZmICovCisgICAgICAgICAgICAgICAgICAgIHBQcmVkQnVmUm93W2ldID0gcFNyY0RzdFtpXTsKKyAgICAgICAgICAgICAgICAgICAgLypQUUZYW3ZdWzBdID0gUUZYW3ZdWzBdIC0gKFFGQVt2XVswXSAqIFFQQSkgLy8gUVBYICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gLT0gdGVtcFByZWQ7CisgICAgICAgICAgICAgICAgICAgIC8qIFN1bSBvZiBhYnNvbHV0ZSB2YWx1ZXMgb2YgQUMgcHJlZGljdGlvbiBlcnJvciwgdGhpcyBjYW4KKyAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSB0byBjaG9vc2Ugd2hldGhlciB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgQUMgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAqcFN1bUVyciArPSBhcm1BYnMocFNyY0RzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIC8qIHBQcmVBQ1ByZWRpY3RbMX43XSBzdG9yZSB0aGUgZXJyb3Igc2lnbmFsCisgICAgICAgICAgICAgICAgICAgIGFmdGVyIEFDIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgcFByZUFDUHJlZGljdFtpXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qUUZYW3ZdWzBdID0gUFFGWFt2XVswXSArIChRRkFbdl1bMF0gKiBRUEEpIC8vIFFQWCAqLworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldICs9IHRlbXBQcmVkOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0aW5nIFFGIHRvIHRoZSByb3cgYnVmZiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZlJvd1tpXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gODsgaSA8IDY0OyBpICs9IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcFByZWQgPSBhcm1JbnREaXZBd2F5RnJvbVplcm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQcmVkQnVmQ29sW2k+PjNdICogcHJlZFFQLCBjdXJRUCk7CisgICAgICAgICAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byBjb2wgYnVmZiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZkNvbFtpPj4zXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgICAgIC8qUFFGWFswXVt1XSA9IFFGWFswXVt1XSAtIChRRkFbMF1bdV0gKiBRUEEpIC8vIFFQWCAqLworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldIC09IHRlbXBQcmVkOworICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2YgYWJzb2x1dGUgdmFsdWVzIG9mIEFDIHByZWRpY3Rpb24gZXJyb3IsIHRoaXMgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlIEFDCisgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKnBTdW1FcnIgKz0gYXJtQWJzKHBTcmNEc3RbaV0pOworICAgICAgICAgICAgICAgICAgICAvKiBwUHJlQUNQcmVkaWN0WzF+N10gc3RvcmUgdGhlIGVycm9yIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICBhZnRlciBBQyBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbaT4+M10gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKlFGWFswXVt1XSA9IFBRRlhbMF1bdV0gKyAoUUZBWzBdW3VdICogUVBBKSAvLyBRUFggKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSArPSB0ZW1wUHJlZDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byBjb2wgYnVmZiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZkNvbFtpPj4zXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjlhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCisgKiBpcyBpbXBsZW1lbnRlZAorICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCisgKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCisgKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCisgKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCisgKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKKyAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKKyAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCisgKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAorICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAorICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCisgKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgT01YX0lOVCBybmRWYWwsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKykKK3sKKyAgICBPTVhfSU5UICAgICBvdXRlciwgaW5uZXIsIGNvdW50LCBpbmRleDsKKyAgICBPTVhfUzE2ICAgICBoYWxmUGVsWCA9IDAsIGhhbGZQZWxZID0gMCwgeCwgeTsKKyAgICBPTVhfSU5UICAgICBjYW5kU0FELCByZWZTQUQgPSAwOworICAgIE9NWF9JTlQgICAgIG1pblNBRCwgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKKyAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLworICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZkJ1ZjsKKyAgICBPTVhfVTggdGVtcFBlbDsKKyAgICAgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU2VhcmNoUG9pbnRSZWZQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLworICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChyZWZXaWR0aCAqIChwU3JjRHN0TVYtPmR5LzIpKSArIChwU3JjRHN0TVYtPmR4LzIpOworCisgICAgLyogQ29weSB0aGUgY2FuZGlkYXRlIHRvIHRoZSB0ZW1wb3JhcnkgbGluZWFyIGFycmF5ICovCisgICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCxpbmRleCA9IDA7CisgICAgICAgICBvdXRlciA8IEJsb2NrU2l6ZTsKKyAgICAgICAgIG91dGVyKyssIGluZGV4ICs9IHJlZldpZHRoIC0gQmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgQmxvY2tTaXplOyBpbm5lcisrLCBjb3VudCsrLCBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICByZWZTQUQgKz0gYXJtQWJzIChwVGVtcFNyY1JlZkJ1ZltpbmRleF0gLSBwU3JjQ3VyckJ1Zltjb3VudF0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHRoZSBtaW5TYWQgYXMgcmVmZXJlbmNlIFNBRCAqLworICAgIG1pblNBRCA9IHJlZlNBRDsKKyAgICAqcERzdFNBRCA9IHJlZlNBRDsKKworICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8KKyAgICBmcm9tWCA9IDE7CisgICAgdG9YICAgPSAxOworICAgIGZyb21ZID0gMTsKKyAgICB0b1kgICA9IDE7CisgICAgaWYgKChwU2VhcmNoUG9pbnRSZWZQb3MtPnggLSAxKSA8IHBSZWZSZWN0LT54KQorICAgIHsKKyAgICAgICAgZnJvbVggPSAwOworICAgIH0KKworICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT54ICsgQmxvY2tTaXplICsgMSkgPiAocFJlZlJlY3QtPnggKyBwUmVmUmVjdC0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgdG9YICAgPSAwOworICAgIH0KKworICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT55IC0gMSkgPCBwUmVmUmVjdC0+eSkKKyAgICB7CisgICAgICAgIGZyb21ZID0gMDsKKyAgICB9CisKKyAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eSArIEJsb2NrU2l6ZSArIDEpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCisgICAgeworICAgICAgICB0b1kgICA9IDA7CisgICAgfQorCisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGludGVnZXIgcG9zaXRpb24gKi8KKyAgICAgICAgICAgIGlmICggeCA9PSAwICYmIHkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCisgICAgICAgICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAocmVmV2lkdGggKiAocFNyY0RzdE1WLT5keS8yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocFNyY0RzdE1WLT5keC8yKTsKKworICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgdGhlIHBpeGVsIGFuZCBjYWxjdWxhdGUgdGhlIFNBRCovCisgICAgICAgICAgICBmb3IgKG91dGVyID0gMCwgY291bnQgPSAwLCBjYW5kU0FEID0gMCxpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgIG91dGVyIDwgQmxvY2tTaXplOworICAgICAgICAgICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBCbG9ja1NpemU7IGlubmVyKyssIGNvdW50KyssaW5kZXgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBQZWwgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmQnVmW2luZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBUZW1wU3JjUmVmQnVmW2luZGV4ICsgeF0gKiBhcm1BYnMoeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHJlZldpZHRoICogeV0gKiBhcm1BYnMoeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHJlZldpZHRoICogeSArIHhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcm1BYnMoeCp5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFybUFicyAoeCkgKyBhcm1BYnMgKHkpIC0gcm5kVmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8gKDIgKiAoYXJtQWJzICh4KSArIGFybUFicyAoeSkpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCArPSBhcm1BYnMgKHRlbXBQZWwgLSBwU3JjQ3VyckJ1Zltjb3VudF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgaWYgKGFybVZDTTRQMl9Db21wYXJlTVYgKHgsIHksIGNhbmRTQUQsIGhhbGZQZWxYLCBoYWxmUGVsWSwgbWluU0FEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcERzdFNBRCA9IGNhbmRTQUQ7CisgICAgICAgICAgICAgICAgbWluU0FEICAgPSBjYW5kU0FEOworICAgICAgICAgICAgICAgIGhhbGZQZWxYID0geDsKKyAgICAgICAgICAgICAgICBoYWxmUGVsWSA9IHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLworICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLworCisgICAgcFNyY0RzdE1WLT5keCArPSBoYWxmUGVsWDsKKyAgICBwU3JjRHN0TVYtPmR5ICs9IGhhbGZQZWxZOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmZTM1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCkBAIC0wLDAgKzEsMTY3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAorICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAorICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAorICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKKyAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAorICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKKyAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCisgKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQorICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKKyAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAorICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgorICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAorICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKykKK3sKKworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworCisgICAgT01YX0lOVCAgICAgb3V0ZXIsIGlubmVyLCBjb3VudCxpbmRleDsKKyAgICBPTVhfSU5UICAgICBjYW5kU0FEOworICAgIC8qKDI1NioyNTYgKzEpIHRoaXMgaXMgdG8gbWFrZSB0aGUgU0FEIG1heCBpbml0aWFsbHkqLworICAgIE9NWF9JTlQgICAgIG1pblNBRCA9IDB4MTAwMDEsIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7CisgICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KKyAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZCdWY7CisgICAgT01YX1MxNiAgICAgeCwgeTsKKyAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOworICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQ3VyclBvaW50UG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTUVTcGVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAKKyAgICBzZWFyY2hSYW5nZSA9ICgoT01YVkNNNFAyTUVQYXJhbXMgKilwTUVTcGVjKS0+c2VhcmNoUmFuZ2U7CisgICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLworICAgIGZyb21YID0gc2VhcmNoUmFuZ2U7CisgICAgdG9YICAgPSBzZWFyY2hSYW5nZTsKKyAgICBmcm9tWSA9IHNlYXJjaFJhbmdlOworICAgIHRvWSAgID0gc2VhcmNoUmFuZ2U7CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggLSBzZWFyY2hSYW5nZSkgPCBwUmVmUmVjdC0+eCkKKyAgICB7CisgICAgICAgIGZyb21YID0gIHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eDsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggKyBCbG9ja1NpemUgKyBzZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnggKyBwUmVmUmVjdC0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgdG9YICAgPSBwUmVmUmVjdC0+d2lkdGggLSAocEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54KSAtIEJsb2NrU2l6ZTsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgLSBzZWFyY2hSYW5nZSkgPCBwUmVmUmVjdC0+eSkKKyAgICB7CisgICAgICAgIGZyb21ZID0gcEN1cnJQb2ludFBvcy0+eSAtIHBSZWZSZWN0LT55OworICAgIH0KKworICAgIGlmICgocEN1cnJQb2ludFBvcy0+eSArIEJsb2NrU2l6ZSArIHNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eSArIHBSZWZSZWN0LT5oZWlnaHQpKQorICAgIHsKKyAgICAgICAgdG9ZICAgPSBwUmVmUmVjdC0+d2lkdGggLSAocEN1cnJQb2ludFBvcy0+eSAtIHBSZWZSZWN0LT55KSAtIEJsb2NrU2l6ZTsKKyAgICB9CisKKyAgICBwRHN0TVYtPmR4ID0gLWZyb21YOworICAgIHBEc3RNVi0+ZHkgPSAtZnJvbVk7CisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKworICAgICAgICAvKiBMb29waW5nIG9uIHgtIGF4aXMgKi8KKyAgICAgICAgZm9yICh4ID0gLWZyb21YOyB4IDw9IHRvWDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLworICAgICAgICAgICAgcFRlbXBTcmNSZWZCdWYgPSBwU3JjUmVmQnVmICsgKHJlZldpZHRoICogeSkgKyB4OworCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLworICAgICAgICAgICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwLCBjYW5kU0FEID0gMDsKKyAgICAgICAgICAgICAgICAgb3V0ZXIgPCBCbG9ja1NpemU7CisgICAgICAgICAgICAgICAgIG91dGVyKyssIGluZGV4ICs9IHJlZldpZHRoIC0gQmxvY2tTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IEJsb2NrU2l6ZTsgaW5uZXIrKywgY291bnQrKywgaW5kZXgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQgKz0gYXJtQWJzIChwVGVtcFNyY1JlZkJ1ZltpbmRleF0gLSBwU3JjQ3VyckJ1Zltjb3VudF0pOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCisgICAgICAgICAgICBpZiAoYXJtVkNNNFAyX0NvbXBhcmVNViAoeCwgeSwgY2FuZFNBRCwgcERzdE1WLT5keC8yLCBwRHN0TVYtPmR5LzIsIG1pblNBRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBEc3RTQUQgPSBjYW5kU0FEOworICAgICAgICAgICAgICAgIG1pblNBRCAgID0gY2FuZFNBRDsKKyAgICAgICAgICAgICAgICBwRHN0TVYtPmR4ID0geCoyOworICAgICAgICAgICAgICAgIHBEc3RNVi0+ZHkgPSB5KjI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLworICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlODYzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBlc2NhcGUgbW9kZSBjaGVjayAKKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAKKyAqIFJldHVybiBWYWx1ZToKKyAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCisgKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKKyAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMworICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgorICoKKyAqLworCitPTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgT01YX1UzMiBydW4sCisgICAgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgT01YX1MxNiBsZXZlbCwKKyAgICAgT01YX1MxNiBsZXZlbFBsdXMsCisgICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCisgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCispCit7CisgICAgT01YX1U4IGVzY2FwZSA9IDAsIGZNb2RlID0gMCwgZW50cmllczsKKyAgICAKKyAgICBsZXZlbCA9IGFybUFicyAobGV2ZWwpOworICAgIGxldmVsUGx1cyA9IGFybUFicyAobGV2ZWxQbHVzKTsKKyAgICAKKyAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSB3aXRoIHJ1biwgbGV2ZWwgYW5kIExhc3QgY29tYmluYXRpb24gCisgICAgICAgTW9kZSAwIGNoZWNrICovCisgICAgaWYgKHJ1biA8PSBtYXhTdG9yZVJ1bikKKyAgICB7CisgICAgICAgIGVudHJpZXMgPSBwUnVuSW5kZXhUYWJsZVtydW4gKyAxXQorICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5dOworICAgICAgICBpZiAocnVuID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBlbnRyaWVzID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWwgPiBlbnRyaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBlc2NhcGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVzY2FwZSA9IDE7CisgICAgfQorICAgIGlmKGVzY2FwZSAmJiBzaG9ydFZpZGVvSGVhZGVyKQorICAgIHsKKyAgICAgICAgZXNjYXBlID0gMDsKKyAgICAgICAgZk1vZGUgPSA0OworICAgIH0KKyAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSB3aXRoIHJ1biwgbGV2ZWxQbHVzIGFuZCBMYXN0IGNvbWJpbmF0aW9uIAorICAgICAgIE1vZGUgMSBjaGVjayAqLyAgICAKKyAgICBpZiAoZXNjYXBlKQorICAgIHsKKyAgICAgICAgZXNjYXBlID0gMDsKKyAgICAgICAgZk1vZGUgPSAxOworICAgICAgICBpZiAocnVuIDw9IG1heFN0b3JlUnVuKQorICAgICAgICB7CisgICAgICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuICsgMV0KKyAgICAgICAgICAgICAgICAgICAgICAtIHBSdW5JbmRleFRhYmxlW3J1bl07CisgICAgICAgICAgICBpZiAocnVuID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVudHJpZXMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsUGx1cyA+IGVudHJpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXNjYXBlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVzY2FwZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW5QbHVzLCBsZXZlbCBhbmQgTGFzdCBjb21iaW5hdGlvbiAKKyAgICAgICBNb2RlIDIgY2hlY2sgKi8gICAgCisgICAgaWYgKGVzY2FwZSkKKyAgICB7CisgICAgICAgIGVzY2FwZSA9IDA7CisgICAgICAgIGZNb2RlID0gMjsKKyAgICAgICAgaWYgKHJ1blBsdXMgPD0gbWF4U3RvcmVSdW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGVudHJpZXMgPSBwUnVuSW5kZXhUYWJsZVtydW5QbHVzICsgMV0KKyAgICAgICAgICAgICAgICAgICAgICAtIHBSdW5JbmRleFRhYmxlW3J1blBsdXNdOworICAgICAgICAgICAgaWYgKHJ1blBsdXMgPiBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW50cmllcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGV2ZWwgPiBlbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVzY2FwZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlc2NhcGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIHNlbGVjdCBtb2RlIDMgLS0+IEZMQyAqLworICAgIGlmIChlc2NhcGUpCisgICAgeworICAgICAgICBmTW9kZSA9IDM7CisgICAgfQorICAgIAorICAgIHJldHVybiBmTW9kZTsKK30KKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ29tcGFyZU1WLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4ODQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ29tcGFyZU1WLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgY29tcGFyaW5nIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgCisgKiB0aGUgYmVzdCBNViBhbmQgU0FECisgKgorICovCisgIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUgCisgKiBiZXN0IE1WIGFuZCBTQUQKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICBtdlgJCXggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0JICAgIG12WQkJeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXQkgICAgY2FuZFNBRAlDYW5kaWRhdGUgU0FECisgKiBbaW5dCSAgICBiZXN0TVZYCXggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dCSAgICBiZXN0TVZZCXkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dCSAgICBiZXN0U0FECWJlc3QgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0IAorICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAorICovCisKK09NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCisgICAgT01YX1MxNiBtdlgsIAorICAgIE9NWF9TMTYgbXZZLCAKKyAgICBPTVhfSU5UIGNhbmRTQUQsIAorICAgIE9NWF9TMTYgYmVzdE1WWCwgCisgICAgT01YX1MxNiBiZXN0TVZZLCAKKyAgICBPTVhfSU5UIGJlc3RTQUQKKykgCit7CisgICAgaWYgKGNhbmRTQUQgPCBiZXN0U0FEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChjYW5kU0FEID4gYmVzdFNBRCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBzaG9ydGVyIG1vdGlvbiB2ZWN0b3IgKi8KKyAgICBpZiAoIChtdlggKiBtdlggKyBtdlkgKiBtdlkpIDwgKGJlc3RNVlgqYmVzdE1WWCtiZXN0TVZZKmJlc3RNVlkpICkKKyAgICB7CisgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY3MTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKQEAgLTAsMCArMSwxMTIgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RDVF9UYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0RDVF9UYWJsZS5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIERDVC9JRENUIGNvZWZmaWNlbnQgbWF0cml4CisgKgorICovCisKKyNpZm5kZWYgX09NWERDVENPU1RBQl9DXworI2RlZmluZSBfT01YRENUQ09TVEFCX0NfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCitjb25zdCBPTVhfRjY0IGFybVZDTTRQMl9wcmVDYWxjRENUQ29zWzhdWzhdID0KK3sKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCisgICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMzNzAsIAorICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3Mzc5MCwgCisgICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDExNDAsIAorICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ0OTIwLCAKKyAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDE1MiAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjYyMCwgCisgICAgICAgICAgICAgICAgMC4xOTEzNDE3MTYxODI1NDQ5MjAsIAorICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDA5NiwgCisgICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUyMjAsIAorICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzQyMCwgCisgICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAxMDkwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDExNDAsIAorICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NDg2MCwgCisgICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKKyAgICAgICAgICAgICAgICAtMC4zNTM1NTMzOTA1OTMyNzM4NDAsIAorICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0MTM4LCAKKyAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzI2MCwgCisgICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI3MzAgCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQxNTIsIAorICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzM3MCwgCisgICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAxMDkwLCAKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzY4MCwgCisgICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI3MzAsIAorICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NDkyMCwgCisgICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MzMwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0MDk2LCAKKyAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDM0MjAsIAorICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAwOTIwLCAKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3Mzg0MCwgCisgICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKKyAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDUyODAsIAorICAgICAgICAgICAgICAgIDAuNDkwMzkyNjQwMjAxNjE1MjIwIAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAorICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMDk4MCwgCisgICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ1MTcwLCAKKyAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCisgICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczMzQwLCAKKyAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQwMTMsIAorICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMzcwLCAKKyAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI1MTAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI2NzAsIAorICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ1MDAwLCAKKyAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDM4OCwgCisgICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczNjIwLCAKKyAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTMzMCwgCisgICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzMjAwLCAKKyAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMDc2MCAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUyMjAsIAorICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMjYwLCAKKyAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAorICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczMjkwLCAKKyAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDA3NjAsIAorICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ0NzgwLCAKKyAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQyNzcKKyAgICAgICAgfQorfTsKKworI2VuZGlmIC8qX09NWERDVENPU1RBQl9DXyovCisKKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTcyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyCisgKgorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhfVTggIHN0YXJ0CispCit7CisgICAgT01YX1U4ICBsYXN0ID0gMDsKKyAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgPiAyKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgc3dpdGNoIChwcmVkRGlyKQorICAgIHsKKyAgICAgICAgY2FzZSBPTVhfVkNfTk9ORToKKyAgICAgICAgeworICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9WQ19IT1JJWk9OVEFMOgorICAgICAgICB7CisgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfVkNfVkVSVElDQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBlcnJvckNvZGUgPSBhcm1WQ000UDJfR2V0VkxDQml0cyAoCisgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBwQml0T2Zmc2V0LAorCQkJICBwRHN0LAorCQkJICBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBzdGFydCwKKwkJCSAgJmxhc3QsCisJCQkgIDEwLAorCQkJICA2MiwKKwkJCSAgIDcsCisJCQkgIDIxLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDAsCisJCQkgIGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMUxNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUk1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFSTUFYLAorICAgICAgICAgICAgICBwWmlnemFnVGFibGUgKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICBpZiAobGFzdCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9NWF9TdHNfRXJyOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDZiNTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCisgKiBmb3IgaW50cmEgYmxvY2suCisgKgorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCisgKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfVTggcGF0dGVybiwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhfVTggc3RhcnQKKykKK3sKKyAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzdGFydCA+IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkRGlyID4gMiwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgaWYgKHBhdHRlcm4pCisgICAgeworICAgICAgICBzd2l0Y2ggKHByZWREaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgT01YX1ZDX05PTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIE9NWF9WQ19IT1JJWk9OVEFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIE9NWF9WQ19WRVJUSUNBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBlcnJvckNvZGUgPSBhcm1WQ000UDJfUHV0VkxDQml0cyAoCisgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBwUURjdEJsa0NvZWYsCisgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAxNCwKKyAgICAgICAgICAgICAgMjAsCisgICAgICAgICAgICAgIDksCisgICAgICAgICAgICAgIDYsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUnVuSWR4LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMCwKKwkJCSAgYXJtVkNNNFAyX0ludHJhTDFSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wxLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMExNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMVJNQVgsCisgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZQorICAgICAgICApOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAgICAgCisgICAgfSAvKiBQYXR0ZXJuIGNoZWNrIGVuZHMqLworCisgICAgcmV0dXJuIChPTVhfU3RzX05vRXJyKTsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzk1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIHB1dHRpbmcgVkxDIGJpdHMKKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAorICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcworICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKKwkJCSAgT01YX1UzMiBydW5QbHVzLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCisgICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCisJCQkgIE9NWF9VOCAgbGFzdCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKKykKK3sKKyAgICBPTVhfSU5UIHRlbXBJbmRleDsKKwlPTVhfVTMyIHRlbXBSdW4gPSBydW4sIHNpZ24gPSAwOworICAgIE9NWF9TMTYgdGVtcExldmVsID0gbGV2ZWw7IAorICAgIAorICAgIC8qIEVzY2FwZSBzZXF1ZW5jZSBhZGRpdGlvbiAqLworICAgIGlmIChmTW9kZSA9PSAxKQorICAgIHsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMCwgMSk7CisJCXRlbXBMZXZlbCA9IGxldmVsUGx1czsKKworICAgIH0KKyAgICBlbHNlIGlmKGZNb2RlID09IDIpCisgICAgeworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAyLCAyKTsKKwkJdGVtcFJ1biA9IHJ1blBsdXM7CisgICAgfQorICAgIGVsc2UgaWYgKGZNb2RlID09IDMpCisgICAgeworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCAyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZk1vZGUgPT0gNCkKKyAgICB7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIChPTVhfVTMyKWxhc3QsIDEpOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgdGVtcFJ1biwgNik7CisJCWlmKCh0ZW1wTGV2ZWwgIT0gMCkgJiYgKHRlbXBMZXZlbCAhPSAtMTI4KSkKKwkJeworCQkgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCisJCQkgICAoT01YX1UzMikgdGVtcExldmVsLCA4KTsKKwkJfQorCQlyZXR1cm4gT01YX1N0c19Ob0VycjsJCQorICAgIH0KKyAgICAKKyAgICBpZiAodGVtcExldmVsIDwgMCkKKyAgICB7CisgICAgICAgIHNpZ24gPSAxOworICAgICAgICB0ZW1wTGV2ZWwgPSBhcm1BYnModGVtcExldmVsKTsKKyAgICB9CisgICAgLyogUHV0dGluZyBWTEMgYml0cyBpbiB0aGUgc3RyZWFtICovCisJaWYgKGZNb2RlIDwgMykKKwl7CisJCWlmICh0ZW1wUnVuID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQorCQl7CisJCQl0ZW1wSW5kZXggPSBwUnVuSW5kZXhUYWJsZSBbbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzICsgMV0gKyAKKwkJCQkJCSh0ZW1wUnVuIC0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIC0gMSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0ZW1wSW5kZXggPSBwUnVuSW5kZXhUYWJsZSBbdGVtcFJ1bl0gKyAodGVtcExldmVsIC0xKTsKKwkJfQorICAgIAorCQlhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorCQkJCQkgIHBWbGNUYWJsZSBbdGVtcEluZGV4XSk7CisJCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilzaWduLCAxKTsKKwl9CisgICAgZWxzZQorCXsKKwkJaWYgKHNpZ24pCisJCXsKKwkJCXRlbXBMZXZlbCA9IC10ZW1wTGV2ZWw7CisJCX0KKwkJdGVtcFJ1biAgPSBydW47CisJCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilsYXN0LCAxKTsKKwkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHRlbXBSdW4sIDYpOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSwgMSk7CisJCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorCQkJICAgKE9NWF9VMzIpIHRlbXBMZXZlbCwgMTIpOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSwgMSk7CisJfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTJjM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBnZXQgYml0cyBmcm9tIHRoZSBzdHJlYW0gCisgKgorICovIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKKyAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4CisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCisgKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKKyAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAorICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCisgKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4CisgKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcworICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKyAgICBPTVhfVTMyIHN0b3JlUnVuLAorICAgIE9NWF9TMTYgKiBwRHN0LAorICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKKyAgICBPTVhfVTggIHNpZ24sCisgICAgT01YX1U4ICBsYXN0LAorICAgIE9NWF9VOCAgKiBwSW5kZXgsCisgICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCispCit7CisgICAgLyogU3RvcmUgdGhlIHplcm8ncyBhcyBwZXIgdGhlIHJ1biBsZW5ndGggY291bnQgKi8KKyAgICBmb3IgKDtzdG9yZVJ1biA+IDA7IHN0b3JlUnVuLS0sICgqcEluZGV4KSsrKQorICAgIHsKKyAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gMDsKKyAgICB9CisgICAgLyogU3RvcmUgdGhlIGxldmVsIGRlcGVuZGluZyBvbiB0aGUgc2lnbiovCisgICAgaWYgKHNpZ24gPT0gMSkKKyAgICB7CisgICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IC1zdG9yZUxldmVsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRHN0W3BaaWd6YWdUYWJsZVsqcEluZGV4XV0gPSBzdG9yZUxldmVsOworICAgIH0KKyAgICAoKnBJbmRleCkrKzsKKworICAgIC8qIElmIGxhc3QgaXMgMSwgZmlsbCB0aGUgcmVtYWluaW5nIGVsbWVudHMgb2YgdGhlIGJ1ZmZlciB3aXRoIHplcm9zICovCisgICAgaWYgKGxhc3QgPT0gMSkKKyAgICB7CisgICAgICAgIHdoaWxlICgqcEluZGV4IDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IDA7CisgICAgICAgICAgICAoKnBJbmRleCkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzZjU5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYwpAQCAtMCwwICsxLDI3OCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9HZXRWTENCaXRzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgVkxDIGdldCBiaXRzIGZyb20gdGhlIHN0cmVhbSAKKyAqCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworIAorLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZworICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorCQkJICBPTVhfUzE2ICogcERzdCwKKwkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKKwkJCSAgT01YX1U4ICAqIHBMYXN0LAorCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKQoreworICAgIE9NWF9VMzIgc3RvcmVSdW47CisgICAgT01YX1U4ICB0YWJJbmRleCwgbWFya2VyQml0OworICAgIE9NWF9TMTYgc3RvcmVMZXZlbDsKKyAgICBPTVhfVTE2IHVucGFja1JldEluZGV4OworCU9NWF9VOCAgaSwgZlR5cGUsIGVzY2FwZTsJCisJT01YX1U4ICBzaWduID0gMDsKKwkKKwkvKiBVbnBhY2tpbmcgdGhlIGJpdHN0cmVhbSBhbmQgUkxEICovCisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCA2NDspCisgICAgeworCQllc2NhcGUgPSBhcm1Mb29rQWhlYWRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA3KTsKKwkJaWYgKGVzY2FwZSAhPSAzKQorCQl7CQorCQkJZlR5cGUgPSAwOyAvKiBOb3QgaW4gZXNjYXBlIG1vZGUgKi8KKwkJfQorCQllbHNlCisJCXsKKwkJCWFybVNraXBCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgNyk7CisJCQlpZihzaG9ydFZpZGVvSGVhZGVyKQorCQkJeworCQkJICAqcExhc3QgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJCSAgc3RvcmVSdW4gPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA2KTsKKwkJCSAgc3RvcmVMZXZlbCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDgpOworCQkJICAKKwkJCSAgLyogUmVmIHRvIFRhYmxlIEItMTggKGMpIGluIE1QRUc0IFN0YW5kYXJkLSBGTEMgY29kZSBmb3IgICovCisJCQkgIC8qIExFVkVMIHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIDEsIHRoZSBzdG9yZUxldmVsIGlzICAqLworCQkJICAvKiBhIHNpZ25lZCB2YWx1ZSBhbmQgdGhlIHNpZ24gYW5kIHRoZSB1bnNpZ25lZCB2YWx1ZSBmb3IgKi8KKwkJCSAgLyogc3RvcmVMZXZlbCBuZWVkIHRvIGJlIGV4dHJhY3RlZCBhbmQgcGFzc2VkIHRvIGFybSAgICAgICovCisJCQkgIC8qIEZpbGxWTERCdWZmZXIgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJICAgICAKKwkJCSAgc2lnbiA9IChzdG9yZUxldmVsICYgMHg4MCk7CisJCQkgIGlmKHNpZ249PTB4ODApCisJCQkgIHsKKwkJCSAgCXN0b3JlTGV2ZWw9KHN0b3JlTGV2ZWxeMHhmZikrMTsJCQkgIAorCQkJICAJc2lnbj0xOworCQkJICAJCisJCQkgIH0KKwkJCSAgCisJCQkgIGFybVJldERhdGFFcnJJZiggc3RvcmVMZXZlbCA9PSAwIHx8IHNpZ24qc3RvcmVMZXZlbCA9PSAxMjggLCBPTVhfU3RzX0Vycik7IC8qIEludmFsaWQgRkxDICovCisJCQkgIGFybVJldERhdGFFcnJJZigoaSArIHN0b3JlUnVuKSA+PSA2NCwgT01YX1N0c19FcnIpOworCQkJICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKwkJCSAgICBzdG9yZVJ1biwKKwkJCSAgICBwRHN0LAorCQkJICAgIHN0b3JlTGV2ZWwsCisJCQkgICAgc2lnbiwKKwkJCSAgICAqcExhc3QsCisJCQkgICAgJmksCisJCQkgICAgcFppZ3phZ1RhYmxlKTsKKwkJCSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKwkJCSAgICAKKwkJCX0KKwkJCWlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKSkKKwkJCXsKKwkJCQlpZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSkpCisJCQkJeworCQkJCQlmVHlwZSA9IDM7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWZUeXBlID0gMjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZlR5cGUgPSAxOworCQkJfQorCQl9CisKKwkgICAgaWYgKGZUeXBlIDwgMykKKwkgICAgeworCSAgICAgICAgdW5wYWNrUmV0SW5kZXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKwkJCQkJCQkJCQlwVmxjVGFibGVMMCk7CisJCQlpZiAodW5wYWNrUmV0SW5kZXggIT0gQVJNX05PX0NPREVCT09LX0lOREVYKQorCQkgICAgeworCQkJICAgIC8qIERlY29kZSBydW4gYW5kIGxldmVsIGZyb20gdGhlIGluZGV4ICovCisJCQkgICAgLyogbGFzdCA9IDAgKi8KKwkJCSAgICAqcExhc3QgPSAwOworCQkJICAgIGlmICh1bnBhY2tSZXRJbmRleCA+IG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDApCisJCQkgICAgeworCQkJCSAgICBzdG9yZUxldmVsID0gMTsKKwkJCQkgICAgc3RvcmVSdW4gPSAodW5wYWNrUmV0SW5kZXggLSBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwKSAKKwkJCQkJCQkrIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDA7CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCSAgICB7CisJCQkJICAgIHRhYkluZGV4ID0gMTsKKwkJCQkgICAgd2hpbGUgKHBSdW5JbmRleFRhYmxlTDBbdGFiSW5kZXhdIDw9IHVucGFja1JldEluZGV4KQorCQkJCSAgICB7CisJCQkJCSAgICB0YWJJbmRleCsrOworCQkJCSAgICB9CisJCQkJICAgIHN0b3JlUnVuID0gdGFiSW5kZXggLSAxOworCQkJCSAgICBzdG9yZUxldmVsID0gdW5wYWNrUmV0SW5kZXggLSBwUnVuSW5kZXhUYWJsZUwwW3RhYkluZGV4IC0gMV0gKyAxOworCQkJICAgIH0KKwkJCSAgICBzaWduID0gKE9NWF9VOCkgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7CisJCQkKKwkJCSAgICBpZiAoZlR5cGUgPT0gMSkKKwkJCSAgICB7CisJCQkJICAgIHN0b3JlTGV2ZWwgPSAoYXJtQWJzKHN0b3JlTGV2ZWwpICsgcExNQVhUYWJsZUwwW3N0b3JlUnVuXSk7CisJCQkgICAgfQorCQkJICAgIGVsc2UgaWYgKGZUeXBlID09IDIpCisJCQkgICAgeworCQkJCSAgICBzdG9yZVJ1biA9IHN0b3JlUnVuICsgcFJNQVhUYWJsZUwwW3N0b3JlTGV2ZWwtMV0gKyAxOworCQkJICAgIH0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCSAgICB1bnBhY2tSZXRJbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKKwkJCQkJCQkJCQkJcFZsY1RhYmxlTDEpOworCisJCQkgICAgYXJtUmV0RGF0YUVycklmKHVucGFja1JldEluZGV4ID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOworCisJCQkgICAgLyogRGVjb2RlIHJ1biBhbmQgbGV2ZWwgZnJvbSB0aGUgaW5kZXggKi8KKwkJCSAgICAvKiBsYXN0ID0gMSAqLworCQkJICAgICpwTGFzdCA9IDE7CisJCQkgICAgaWYgKHVucGFja1JldEluZGV4ID4gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSkKKwkJCSAgICB7CisJCQkJICAgIHN0b3JlTGV2ZWwgPSAxOworCQkJCSAgICBzdG9yZVJ1biA9ICh1bnBhY2tSZXRJbmRleCAtIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEpIAorCQkJCQkJCSsgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDE7CisJCSAgICAgICAgfQorCQkgICAgICAgIGVsc2UKKwkJCSAgICB7CisJCQkJICAgIHRhYkluZGV4ID0gMTsKKwkJCQkgICAgd2hpbGUgKHBSdW5JbmRleFRhYmxlTDFbdGFiSW5kZXhdIDw9IHVucGFja1JldEluZGV4KQorCQkJCSAgICB7CisJCQkJCSAgICB0YWJJbmRleCsrOworCQkJCSAgICB9CisJCQkJICAgIHN0b3JlUnVuID0gdGFiSW5kZXggLSAxOworCQkJCSAgICBzdG9yZUxldmVsID0gdW5wYWNrUmV0SW5kZXggLSBwUnVuSW5kZXhUYWJsZUwxW3RhYkluZGV4IC0gMV0gKyAxOworCQkJICAgIH0KKwkJCSAgICBzaWduID0gKE9NWF9VOCkgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7CisKKwkJCSAgICBpZiAoZlR5cGUgPT0gMSkKKwkJCSAgICB7CisJCQkgICAgICAgIHN0b3JlTGV2ZWwgPSAoYXJtQWJzKHN0b3JlTGV2ZWwpICsgcExNQVhUYWJsZUwxW3N0b3JlUnVuXSk7CQkJCQorCQkJICAgIH0KKwkJCSAgICBlbHNlIGlmIChmVHlwZSA9PSAyKQorCQkJICAgIHsKKwkJCQkgICAgc3RvcmVSdW4gPSBzdG9yZVJ1biArIHBSTUFYVGFibGVMMVtzdG9yZUxldmVsLTFdICsgMTsKKwkJCSAgICB9CisJCSAgICB9CisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoKGkgKyBzdG9yZVJ1bikgPj0gNjQsIE9NWF9TdHNfRXJyKTsKKwkJICAgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorCQkJICAgIHN0b3JlUnVuLAorCQkJICAgIHBEc3QsCisJCQkgICAgc3RvcmVMZXZlbCwKKwkJCSAgICBzaWduLAorCQkJICAgICpwTGFzdCwKKwkJCSAgICAmaSwKKwkJCSAgICBwWmlnemFnVGFibGUpOwkJCisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCSAgICAqcExhc3QgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJICAgIHN0b3JlUnVuICA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDYpOworCQkgICAgYXJtUmV0RGF0YUVycklmKChpICsgc3RvcmVSdW4pID49IDY0LCBPTVhfU3RzX0Vycik7CisJCSAgICBtYXJrZXJCaXQgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJICAgIGFybVJldERhdGFFcnJJZiggbWFya2VyQml0ID09IDAsIE9NWF9TdHNfRXJyKTsKKwkJICAgIHN0b3JlTGV2ZWwgID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMTIpOworCQkgICAgaWYgKHN0b3JlTGV2ZWwgJiAweDgwMCkKKwkJICAgIHsKKwkJCSAgICBzdG9yZUxldmVsIC09IDQwOTY7CisJCSAgICB9CQkJCisJCSAgICBhcm1SZXREYXRhRXJySWYoIHN0b3JlTGV2ZWwgPT0gMCB8fCBzdG9yZUxldmVsID09IC0yMDQ4ICwgT01YX1N0c19FcnIpOyAvKiBJbnZhbGlkIEZMQyAqLworCQkgICAgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7CisJCSAgICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKwkJCSAgICBzdG9yZVJ1biwKKwkJCSAgICBwRHN0LAorCQkJICAgIHN0b3JlTGV2ZWwsCisJCQkgICAgMCwgLyogU2lnbiBpcyBub3QgdXNlZCwgcHJlcHJvY2Vzc2luZyBkb25lICovCisJCQkgICAgKnBMYXN0LAorCQkJICAgICZpLAorCQkJICAgIHBaaWd6YWdUYWJsZSk7CisKKwkgICAgfQorICAgIH0gLyogRW5kIG9mIGZvcmxvb3AgZm9yIGkgKi8KKwlyZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIEZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdlOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKQEAgLTAsMCArMSw0OTUgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBIdWZmbWFuIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyogCisqICBGb3IgSW50cmEKKyogIGxhc3QgPSAwIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJ1bklkeFsxMV0gPSAKK3sgCisgICAgMCwgMjcsIDM3LCA0MiwgNDYsIDQ5LCA1MiwgCisgICAgNTUsIDU4LCA2MCwgNjIKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byAxNAorKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wwWzY4XSA9IAoreworICAgICAgICB7MiwgICAgMn0sCisgICAgICAgIHszLCAgICA2fSwKKyAgICAgICAgezQsICAgIDE1fSwKKyAgICAgICAgezUsICAgIDEzfSwKKyAgICAgICAgezUsICAgIDEyfSwKKyAgICAgICAgezYsICAgIDIxfSwKKyAgICAgICAgezYsICAgIDE5fSwKKyAgICAgICAgezYsICAgIDE4fSwKKyAgICAgICAgezcsICAgIDIzfSwKKyAgICAgICAgezgsICAgIDMxfSwKKyAgICAgICAgezgsICAgIDMwfSwKKyAgICAgICAgezgsICAgIDI5fSwKKyAgICAgICAgezksICAgIDM3fSwKKyAgICAgICAgezksICAgIDM2fSwKKyAgICAgICAgezksICAgIDM1fSwKKyAgICAgICAgezksICAgIDMzfSwKKyAgICAgICAgezEwLCAgIDMzfSwKKyAgICAgICAgezEwLCAgIDMyfSwKKyAgICAgICAgezEwLCAgIDE1fSwKKyAgICAgICAgezEwLCAgIDE0fSwKKyAgICAgICAgezExLCAgICA3fSwKKyAgICAgICAgezExLCAgICA2fSwKKyAgICAgICAgezExLCAgIDMyfSwKKyAgICAgICAgezExLCAgIDMzfSwKKyAgICAgICAgezEyLCAgIDgwfSwKKyAgICAgICAgezEyLCAgIDgxfSwKKyAgICAgICAgezEyLCAgIDgyfSwKKyAgICAgICAgezQsICAgIDE0fSwKKyAgICAgICAgezYsICAgIDIwfSwKKyAgICAgICAgezcsICAgIDIyfSwKKyAgICAgICAgezgsICAgIDI4fSwKKyAgICAgICAgezksICAgIDMyfSwKKyAgICAgICAgezksICAgIDMxfSwKKyAgICAgICAgezEwLCAgIDEzfSwKKyAgICAgICAgezExLCAgIDM0fSwKKyAgICAgICAgezEyLCAgIDgzfSwKKyAgICAgICAgezEyLCAgIDg1fSwKKyAgICAgICAgezUsICAgIDExfSwKKyAgICAgICAgezcsICAgIDIxfSwKKyAgICAgICAgezksICAgIDMwfSwKKyAgICAgICAgezEwLCAgIDEyfSwKKyAgICAgICAgezEyLCAgIDg2fSwKKyAgICAgICAgezYsICAgIDE3fSwKKyAgICAgICAgezgsICAgIDI3fSwKKyAgICAgICAgezksICAgIDI5fSwKKyAgICAgICAgezEwLCAgIDExfSwKKyAgICAgICAgezYsICAgIDE2fSwKKyAgICAgICAgezksICAgIDM0fSwKKyAgICAgICAgezEwLCAgIDEwfSwKKyAgICAgICAgezYsICAgIDEzfSwKKyAgICAgICAgezksICAgIDI4fSwKKyAgICAgICAgezEwLCAgICA4fSwKKyAgICAgICAgezcsICAgIDE4fSwKKyAgICAgICAgezksICAgIDI3fSwKKyAgICAgICAgezEyLCAgIDg0fSwKKyAgICAgICAgezcsICAgIDIwfSwKKyAgICAgICAgezksICAgIDI2fSwKKyAgICAgICAgezEyLCAgIDg3fSwKKyAgICAgICAgezgsICAgIDI1fSwKKyAgICAgICAgezEwLCAgICA5fSwKKyAgICAgICAgezgsICAgIDI0fSwKKyAgICAgICAgezExLCAgIDM1fSwKKyAgICAgICAgezgsICAgIDIzfSwKKyAgICAgICAgezksICAgIDI1fSwKKyAgICAgICAgezksICAgIDI0fSwKKyAgICAgICAgezEwLCAgICA3fSwKKyAgICAgICAgezEyLCAgIDg4fSwKKyAgICAgICAgezAsICAgICAwfQorfTsKKworLyogCisqICBGb3IgSW50cmEKKyogIGxhc3QgPSAxIAorKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4WzhdID0gCit7CisgICAgMCwgIDgsIDExLCAxMywgMTUsIDE3LCAxOSwgMjEKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byAyMAorKiAgKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wxWzM2XSA9IAoreworICAgICAgICB7NCwgICAgIDd9LAorICAgICAgICB7NiwgICAgMTJ9LAorICAgICAgICB7OCwgICAgMjJ9LAorICAgICAgICB7OSwgICAgMjN9LAorICAgICAgICB7MTAsICAgIDZ9LAorICAgICAgICB7MTEsICAgIDV9LAorICAgICAgICB7MTEsICAgIDR9LAorICAgICAgICB7MTIsICAgODl9LAorICAgICAgICB7NiwgICAgMTV9LAorICAgICAgICB7OSwgICAgMjJ9LAorICAgICAgICB7MTAsICAgIDV9LAorICAgICAgICB7NiwgICAgMTR9LAorICAgICAgICB7MTAsICAgIDR9LAorICAgICAgICB7NywgICAgMTd9LAorICAgICAgICB7MTEsICAgMzZ9LAorICAgICAgICB7NywgICAgMTZ9LAorICAgICAgICB7MTEsICAgMzd9LAorICAgICAgICB7NywgICAgMTl9LAorICAgICAgICB7MTIsICAgOTB9LAorICAgICAgICB7OCwgICAgMjF9LAorICAgICAgICB7MTIsICAgOTF9LAorICAgICAgICB7OCwgICAgMjB9LAorICAgICAgICB7OCwgICAgMTl9LAorICAgICAgICB7OCwgICAgMjZ9LAorICAgICAgICB7OSwgICAgMjF9LAorICAgICAgICB7OSwgICAgMjB9LAorICAgICAgICB7OSwgICAgMTl9LAorICAgICAgICB7OSwgICAgMTh9LAorICAgICAgICB7OSwgICAgMTd9LAorICAgICAgICB7MTEsICAgMzh9LAorICAgICAgICB7MTEsICAgMzl9LAorICAgICAgICB7MTIsICAgOTJ9LAorICAgICAgICB7MTIsICAgOTN9LAorICAgICAgICB7MTIsICAgOTR9LAorICAgICAgICB7MTIsICAgOTV9LCAgCisgICAgICAgIHswLCAgICAgMH0KK307CisKKy8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMExNQVhbMTVdID0gCit7CisgICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAorICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxCit9OworCisvKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKSovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFMTUFYWzIxXSA9IAoreworICAgIDgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMQorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJNQVhbMjddID0KK3sKKyAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMVJNQVhbOF0gPQoreworICAgMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCit9OworCisvKiAKKyogIEZvciBJbnRlcgorKiAgbGFzdCA9IDAgCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUnVuSWR4WzEyXSA9IAoreyAKKyAgICAgMCwgIDEyLCAgMTgsICAyMiwgIDI1LCAgMjgsICAKKyAgICAzMSwgIDM0LCAgMzYsICAzOCwgIDQwLCAgNDIKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byAyNgorKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wwWzU5XSA9IAoreworICAgICAgICB7MiwgICAgIDJ9LAorICAgICAgICB7NCwgICAgMTV9LAorICAgICAgICB7NiwgICAgMjF9LAorICAgICAgICB7NywgICAgMjN9LAorICAgICAgICB7OCwgICAgMzF9LAorICAgICAgICB7OSwgICAgMzd9LAorICAgICAgICB7OSwgICAgMzZ9LAorICAgICAgICB7MTAsICAgMzN9LAorICAgICAgICB7MTAsICAgMzJ9LAorICAgICAgICB7MTEsICAgIDd9LAorICAgICAgICB7MTEsICAgIDZ9LAorICAgICAgICB7MTEsICAgMzJ9LAorICAgICAgICB7MywgICAgIDZ9LAorICAgICAgICB7NiwgICAgMjB9LAorICAgICAgICB7OCwgICAgMzB9LAorICAgICAgICB7MTAsICAgMTV9LAorICAgICAgICB7MTEsICAgMzN9LAorICAgICAgICB7MTIsICAgODB9LAorICAgICAgICB7NCwgICAgMTR9LAorICAgICAgICB7OCwgICAgMjl9LAorICAgICAgICB7MTAsICAgMTR9LAorICAgICAgICB7MTIsICAgODF9LAorICAgICAgICB7NSwgICAgMTN9LAorICAgICAgICB7OSwgICAgMzV9LAorICAgICAgICB7MTAsICAgMTN9LAorICAgICAgICB7NSwgICAgMTJ9LAorICAgICAgICB7OSwgICAgMzR9LAorICAgICAgICB7MTIsICAgODJ9LAorICAgICAgICB7NSwgICAgMTF9LAorICAgICAgICB7MTAsICAgMTJ9LAorICAgICAgICB7MTIsICAgODN9LAorICAgICAgICB7NiwgICAgMTl9LAorICAgICAgICB7MTAsICAgMTF9LAorICAgICAgICB7MTIsICAgODR9LAorICAgICAgICB7NiwgICAgMTh9LAorICAgICAgICB7MTAsICAgMTB9LAorICAgICAgICB7NiwgICAgMTd9LAorICAgICAgICB7MTAsICAgIDl9LAorICAgICAgICB7NiwgICAgMTZ9LAorICAgICAgICB7MTAsICAgIDh9LAorICAgICAgICB7NywgICAgMjJ9LAorICAgICAgICB7MTIsICAgODV9LAorICAgICAgICB7NywgICAgMjF9LAorICAgICAgICB7NywgICAgMjB9LAorICAgICAgICB7OCwgICAgMjh9LAorICAgICAgICB7OCwgICAgMjd9LAorICAgICAgICB7OSwgICAgMzN9LAorICAgICAgICB7OSwgICAgMzJ9LAorICAgICAgICB7OSwgICAgMzF9LAorICAgICAgICB7OSwgICAgMzB9LAorICAgICAgICB7OSwgICAgMjl9LAorICAgICAgICB7OSwgICAgMjh9LAorICAgICAgICB7OSwgICAgMjd9LAorICAgICAgICB7OSwgICAgMjZ9LAorICAgICAgICB7MTEsICAgMzR9LAorICAgICAgICB7MTEsICAgMzV9LAorICAgICAgICB7MTIsICAgODZ9LAorICAgICAgICB7MTIsICAgODd9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworIAorCisvKiAKKyogIEZvciBJbnRyYQorKiAgbGFzdCA9IDEgCisqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSdW5JZHhbM10gPSAKK3sKKyAgICAwLCAzLCA1Cit9OworCisvKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAorKiAgZm9yIHJ1biA9IDAgdG8gNDAKKyogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZworKi8KK2NvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMVs0NV0gPSAKK3sKKyAgICAgICAgezQsICAgICA3fSwKKyAgICAgICAgezksICAgIDI1fSwKKyAgICAgICAgezExLCAgICA1fSwKKyAgICAgICAgezYsICAgIDE1fSwKKyAgICAgICAgezExLCAgICA0fSwKKyAgICAgICAgezYsICAgIDE0fSwKKyAgICAgICAgezYsICAgIDEzfSwKKyAgICAgICAgezYsICAgIDEyfSwKKyAgICAgICAgezcsICAgIDE5fSwKKyAgICAgICAgezcsICAgIDE4fSwKKyAgICAgICAgezcsICAgIDE3fSwKKyAgICAgICAgezcsICAgIDE2fSwKKyAgICAgICAgezgsICAgIDI2fSwKKyAgICAgICAgezgsICAgIDI1fSwKKyAgICAgICAgezgsICAgIDI0fSwKKyAgICAgICAgezgsICAgIDIzfSwKKyAgICAgICAgezgsICAgIDIyfSwKKyAgICAgICAgezgsICAgIDIxfSwKKyAgICAgICAgezgsICAgIDIwfSwKKyAgICAgICAgezgsICAgIDE5fSwKKyAgICAgICAgezksICAgIDI0fSwKKyAgICAgICAgezksICAgIDIzfSwKKyAgICAgICAgezksICAgIDIyfSwKKyAgICAgICAgezksICAgIDIxfSwKKyAgICAgICAgezksICAgIDIwfSwKKyAgICAgICAgezksICAgIDE5fSwKKyAgICAgICAgezksICAgIDE4fSwKKyAgICAgICAgezksICAgIDE3fSwKKyAgICAgICAgezEwLCAgICA3fSwKKyAgICAgICAgezEwLCAgICA2fSwKKyAgICAgICAgezEwLCAgICA1fSwKKyAgICAgICAgezEwLCAgICA0fSwKKyAgICAgICAgezExLCAgIDM2fSwKKyAgICAgICAgezExLCAgIDM3fSwKKyAgICAgICAgezExLCAgIDM4fSwKKyAgICAgICAgezExLCAgIDM5fSwKKyAgICAgICAgezEyLCAgIDg4fSwKKyAgICAgICAgezEyLCAgIDg5fSwKKyAgICAgICAgezEyLCAgIDkwfSwKKyAgICAgICAgezEyLCAgIDkxfSwKKyAgICAgICAgezEyLCAgIDkyfSwKKyAgICAgICAgezEyLCAgIDkzfSwKKyAgICAgICAgezEyLCAgIDk0fSwKKyAgICAgICAgezEyLCAgIDk1fSwKKyAgICAgICAgeyAwLCAgICAwfQorfTsKKworLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTE1BWFsyN10gPSAKK3sKKyAgIDEyLCAgNiwgIDQsICAzLCAgMywgIDMsICAzLCAgMiwgCisgICAgMiwgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLAorfTsKKworLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxTE1BWFs0MV0gPSAKK3sKKyAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIAorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJNQVhbMTJdID0gCit7CisgICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMVJNQVhbM10gPSAKK3sKKyAgIDQwLCAgMSwgIDAKK307CisKKy8qIAorKiAgRm9yIEludHJhIC0gTHVtaW5hbmNlCisqLworCitjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4WzE0XSA9IAoreworICAgICAgICB7MywgICAgIDN9LAorICAgICAgICB7MiwgICAgIDN9LAorICAgICAgICB7MiwgICAgIDJ9LAorICAgICAgICB7MywgICAgIDJ9LAorICAgICAgICB7MywgICAgIDF9LAorICAgICAgICB7NCwgICAgIDF9LAorICAgICAgICB7NSwgICAgIDF9LAorICAgICAgICB7NiwgICAgIDF9LAorICAgICAgICB7NywgICAgIDF9LAorICAgICAgICB7OCwgICAgIDF9LAorICAgICAgICB7OSwgICAgIDF9LAorICAgICAgICB7MTAsICAgIDF9LAorICAgICAgICB7MTEsICAgIDF9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworCisvKiAKKyogIEZvciBJbnRyYSAtIENocm9taW5hbmNlCisqLworIAorY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzE0XSA9IAoreworICAgICAgICB7MiwgICAgIDN9LAorICAgICAgICB7MiwgICAgIDJ9LAorICAgICAgICB7MiwgICAgIDF9LAorICAgICAgICB7MywgICAgIDF9LAorICAgICAgICB7NCwgICAgIDF9LAorICAgICAgICB7NSwgICAgIDF9LAorICAgICAgICB7NiwgICAgIDF9LAorICAgICAgICB7NywgICAgIDF9LAorICAgICAgICB7OCwgICAgIDF9LAorICAgICAgICB7OSwgICAgIDF9LAorICAgICAgICB7MTAsICAgIDF9LAorICAgICAgICB7MTEsICAgIDF9LAorICAgICAgICB7MTIsICAgIDF9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworCisvKiAKKyAqICBNb3Rpb24gdmVjdG9yIGRlY29kaW5nIHRhYmxlCisgKi8KKyAKK2NvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYVZsY01WRFs2Nl0gPQoreworICAgICAgICB7MTMsICAgICA1fSwKKyAgICAgICAgezEzLCAgICAgN30sCisgICAgICAgIHsxMiwgICAgIDV9LAorICAgICAgICB7MTIsICAgICA3fSwKKyAgICAgICAgezEyLCAgICAgOX0sCisgICAgICAgIHsxMiwgICAgMTF9LAorICAgICAgICB7MTIsICAgIDEzfSwKKyAgICAgICAgezEyLCAgICAxNX0sCisgICAgICAgIHsxMSwgICAgIDl9LAorICAgICAgICB7MTEsICAgIDExfSwKKyAgICAgICAgezExLCAgICAxM30sCisgICAgICAgIHsxMSwgICAgMTV9LAorICAgICAgICB7MTEsICAgIDE3fSwKKyAgICAgICAgezExLCAgICAxOX0sCisgICAgICAgIHsxMSwgICAgMjF9LAorICAgICAgICB7MTEsICAgIDIzfSwKKyAgICAgICAgezExLCAgICAyNX0sCisgICAgICAgIHsxMSwgICAgMjd9LAorICAgICAgICB7MTEsICAgIDI5fSwKKyAgICAgICAgezExLCAgICAzMX0sCisgICAgICAgIHsxMSwgICAgMzN9LAorICAgICAgICB7MTEsICAgIDM1fSwKKyAgICAgICAgezEwLCAgICAxOX0sCisgICAgICAgIHsxMCwgICAgMjF9LAorICAgICAgICB7MTAsICAgIDIzfSwKKyAgICAgICAgezgsICAgICAgN30sCisgICAgICAgIHs4LCAgICAgIDl9LAorICAgICAgICB7OCwgICAgIDExfSwKKyAgICAgICAgezcsICAgICAgN30sCisgICAgICAgIHs1LCAgICAgIDN9LAorICAgICAgICB7NCwgICAgICAzfSwKKyAgICAgICAgezMsICAgICAgM30sCisgICAgICAgIHsxLCAgICAgIDF9LAorICAgICAgICB7MywgICAgICAyfSwKKyAgICAgICAgezQsICAgICAgMn0sCisgICAgICAgIHs1LCAgICAgIDJ9LAorICAgICAgICB7NywgICAgICA2fSwKKyAgICAgICAgezgsICAgICAxMH0sCisgICAgICAgIHs4LCAgICAgIDh9LAorICAgICAgICB7OCwgICAgICA2fSwKKyAgICAgICAgezEwLCAgICAyMn0sCisgICAgICAgIHsxMCwgICAgMjB9LAorICAgICAgICB7MTAsICAgIDE4fSwKKyAgICAgICAgezExLCAgICAzNH0sCisgICAgICAgIHsxMSwgICAgMzJ9LAorICAgICAgICB7MTEsICAgIDMwfSwKKyAgICAgICAgezExLCAgICAyOH0sCisgICAgICAgIHsxMSwgICAgMjZ9LAorICAgICAgICB7MTEsICAgIDI0fSwKKyAgICAgICAgezExLCAgICAyMn0sCisgICAgICAgIHsxMSwgICAgMjB9LAorICAgICAgICB7MTEsICAgIDE4fSwKKyAgICAgICAgezExLCAgICAxNn0sCisgICAgICAgIHsxMSwgICAgMTR9LAorICAgICAgICB7MTEsICAgIDEyfSwKKyAgICAgICAgezExLCAgICAxMH0sCisgICAgICAgIHsxMSwgICAgIDh9LAorICAgICAgICB7MTIsICAgIDE0fSwKKyAgICAgICAgezEyLCAgICAxMn0sCisgICAgICAgIHsxMiwgICAgMTB9LAorICAgICAgICB7MTIsICAgICA4fSwKKyAgICAgICAgezEyLCAgICAgNn0sCisgICAgICAgIHsxMiwgICAgIDR9LAorICAgICAgICB7MTMsICAgICA2fSwKKyAgICAgICAgezEzLCAgICAgNH0sCisgICAgICAgIHsgMCwgICAgIDB9Cit9OworCisvKiBFbmQgb2YgZmlsZSAqLworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWVmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfUHV0VkxDQml0cy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBwdXQgYml0cyB0byBiaXRzdHJlYW0gCisgKgorICovIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisKKyAKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAorICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispCit7CisKKyAgICBPTVhfVTMyIHN0b3JlUnVuID0gMCwgcnVuLCBzdG9yZVJ1blBsdXM7CisgICAgT01YX1U4ICBsYXN0ID0gMCwgZmlyc3QgPSAxLCBmTW9kZTsKKyAgICBPTVhfUzE2IGxldmVsLCBzdG9yZUxldmVsID0gMCwgc3RvcmVMZXZlbFBsdXM7CisgICAgT01YX0lOVCBpOworICAgIAorICAgICAgICAvKiBSTEUgZW5jb2RpbmcgYW5kIHBhY2tpbmcgdGhlIGJpdHMgaW50byB0aGUgc3RyZWFtcyAqLworICAgICAgICBmb3IgKGkgPSBzdGFydCwgcnVuPTA7IGkgPCA2NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBsZXZlbCAgID0gcFFEY3RCbGtDb2VmW3BaaWd6YWdUYWJsZVtpXV07CisKKyAgICAgICAgICAgIC8qIENvdW50aW5nIHRoZSBydW4gKi8KKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bisrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBGb3VuZCBhIG5vbi16ZXJvIGNvZWZmICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IGluIHRoZSBWTEMgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMgPSBhcm1TaWduQ2hlY2soc3RvcmVMZXZlbCkgKiAKKyAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwwW3N0b3JlUnVuXSk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuUGx1cyA9IHN0b3JlUnVuIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBSTUFYVGFibGVMMFthcm1BYnMoc3RvcmVMZXZlbCkgLSAxXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZNb2RlID0gYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW5QbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcmVSdW5MMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLCAKKwkJCQkJCQkJCSAgc3RvcmVSdW5QbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNb2RlLAorCQkJCQkJCQkJICBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9yZUxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgc3RvcmVSdW4gICA9IHJ1bjsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IC8qIGVuZCBvZiBmb3IgbG9vcCBmb3IgNjQgZWxlbWVudHMgKi8KKworICAgICAgICAvKiB3cml0aW5nIHRoZSBsYXN0IGVsZW1lbnQgKi8KKyAgICAgICAgbGFzdCA9IDE7CisgICAgICAgIAorICAgICAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSBpbiB0aGUgVkxDIHRhYmxlICovCisgICAgICAgIHN0b3JlTGV2ZWxQbHVzID0gYXJtU2lnbkNoZWNrKHN0b3JlTGV2ZWwpICogCisgICAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwxW3J1bl0pOworICAgICAgICBzdG9yZVJ1blBsdXMgPSBzdG9yZVJ1biAtIAorICAgICAgICAgICAgICAgICAgICAgIChwUk1BWFRhYmxlTDFbYXJtQWJzKHN0b3JlTGV2ZWwpIC0gMV0gKyAxKTsKKyAgICAgICAgZk1vZGUgPSBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1blBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yZVJ1bkwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMSk7CisgICAgICAgIAorICAgICAgICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIAorCQkJCQkJICBzdG9yZVJ1blBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmTW9kZSwKKwkJCQkJCSAgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwxKTsKKwlyZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKiBFbmQgb2YgRmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Y2QwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKQEAgLTAsMCArMSw4OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9TZXRQcmVkRGlyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICoKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9JTlQgKnByZWREaXIsCisgICAgIE9NWF9JTlQgKnByZWRRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKKykKK3sKKyAgICBPTVhfVTggIGJsb2NrRENMZWZ0OworICAgIE9NWF9VOCAgYmxvY2tEQ1RvcDsKKyAgICBPTVhfVTggIGJsb2NrRENUb3BMZWZ0OworCisgICAgaWYgKGJsb2NrSW5kZXggPT0gMykKKyAgICB7CisgICAgICAgIGJsb2NrRENUb3AgPSAqKHBDb2VmQnVmQ29sIC0gOCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJsb2NrRENUb3AgPSAqcENvZWZCdWZSb3c7CisgICAgfQorICAgIGJsb2NrRENMZWZ0ID0gKnBDb2VmQnVmQ29sOworICAgIGJsb2NrRENUb3BMZWZ0ID0gKihwQ29lZkJ1ZlJvdyAtIDgpOworCisgICAgaWYgKGFybUFicyhibG9ja0RDTGVmdCAtIGJsb2NrRENUb3BMZWZ0KSA8IGFybUFicyhibG9ja0RDVG9wTGVmdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYmxvY2tEQ1RvcCkpCisgICAgeworICAgICAgICAqcHJlZERpciA9IE9NWF9WQ19WRVJUSUNBTDsKKyAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlsxXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnByZWREaXIgPSBPTVhfVkNfSE9SSVpPTlRBTDsKKyAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlswXTsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0N2M2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpAQCAtMCwwICsxLDU4IEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzY0XSA9IAoreworICAgICAwLCAgMSwgIDgsIDE2LCAgOSwgIDIsICAzLCAxMCwKKyAgICAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCAgNCwgIDUsCisgICAgMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAorICAgIDI3LCAyMCwgMTMsICA2LCAgNywgMTQsIDIxLCAyOCwgCisgICAgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LAorICAgIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKKyAgICA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCisgICAgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzCit9OworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdID0gCit7CisgICAgIDAsICAxLCAgMiwgIDMsICA4LCAgOSwgMTYsIDE3LAorICAgIDEwLCAxMSwgIDQsICA1LCAgNiwgIDcsIDE1LCAxNCwKKyAgICAxMywgMTIsIDE5LCAxOCwgMjQsIDI1LCAzMiwgMzMsCisgICAgMjYsIDI3LCAyMCwgMjEsIDIyLCAyMywgMjgsIDI5LAorICAgIDMwLCAzMSwgMzQsIDM1LCA0MCwgNDEsIDQ4LCA0OSwKKyAgICA0MiwgNDMsIDM2LCAzNywgMzgsIDM5LCA0NCwgNDUsIAorICAgIDQ2LCA0NywgNTAsIDUxLCA1NiwgNTcsIDU4LCA1OSwKKyAgICA1MiwgNTMsIDU0LCA1NSwgNjAsIDYxLCA2MiwgNjMKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdID0gCit7CisgICAgIDAsICA4LCAxNiwgMjQsICAxLCAgOSwgIDIsIDEwLAorICAgICAxNywgMjUsIDMyLCA0MCwgNDgsIDU2LCA1NywgNDksCisgICAgIDQxLCAzMywgMjYsIDE4LCAgMywgMTEsICA0LCAxMiwKKyAgICAgMTksIDI3LCAzNCwgNDIsIDUwLCA1OCwgMzUsIDQzLAorICAgICA1MSwgNTksIDIwLCAyOCwgIDUsIDEzLCAgNiwgMTQsCisgICAgIDIxLCAyOSwgMzYsIDQ0LCA1MiwgNjAsIDM3LCA0NSwgCisgICAgIDUzLCA2MSwgMjIsIDMwLCAgNywgMTUsIDIzLCAzMSwKKyAgICAgMzgsIDQ2LCA1NCwgNjIsIDM5LCA0NywgNTUsIDYzCit9OworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QzY2UxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAorICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworCisgICAgLyogRm9yIGEgYmxvY2tzaXplIG9mIDE2eDE2ICovCisgICAgT01YX1U4IEJsb2NrU2l6ZSA9IDE2OworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLyAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCAgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNlYXJjaFBvaW50UmVmUG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TVYgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgICByZXR1cm4gKGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSkpOworCisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTk2ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCkBAIC0wLDAgKzEsMTA5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworICAgIC8qIEZvciBhIGJsb2Nrc2l6ZSBvZiA4eDggKi8KKyAgICBPTVhfVTggQmxvY2tTaXplID0gODsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTZWFyY2hQb2ludFJlZlBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1WICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgICByZXR1cm4gKGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSkpOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTRlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYwpAQCAtMCwwICsxLDExNCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCisgKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAorICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAorICogICAgICAgICAgICAtNC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2KAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisKKyAgIE9NWF9VOCBCbG9ja1NpemUgPSAxNjsKKyAgIAorICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovICAKKyAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgIHJldHVybiAoIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIHBTcmNSZWZCdWYsCisgICAgIHJlZldpZHRoLAorICAgICBwUmVmUmVjdCwKKyAgICAgcFNyY0N1cnJCdWYsCisgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgIHBTcmNQcmVNViwKKyAgICAgcFNyY1ByZVNBRCwKKyAgICAgcE1FU3BlYywKKyAgICAgcERzdE1WLAorICAgICBwRHN0U0FELAorICAgICBCbG9ja1NpemUpCisgICAgICk7CisKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwN2U2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAorICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKKyAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAorICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKKyAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQKKykKK3sKKyAgIE9NWF9VOCBCbG9ja1NpemUgPSA4OworICAgCisgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAorICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgCisgICByZXR1cm4gKCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBwU3JjUmVmQnVmLAorICAgICByZWZXaWR0aCwKKyAgICAgcFJlZlJlY3QsCisgICAgIHBTcmNDdXJyQnVmLAorICAgICBwQ3VyclBvaW50UG9zLAorICAgICBwU3JjUHJlTVYsCisgICAgIHBTcmNQcmVTQUQsCisgICAgIHBNRVNwZWMsCisgICAgIHBEc3RNViwKKyAgICAgcERzdFNBRCwKKyAgICAgQmxvY2tTaXplKQorICAgICApOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzdhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYwpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RDVDh4OGJsay5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIDh4OCBibG9jayBEQ1QKKyAqIAorICovCisgCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0RDVF9UYWJsZS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoY29uc3QgT01YX1MxNiAqcFNyYywgT01YX1MxNiAqcERzdCkKK3sKKyAgICBPTVhfSU5UIHgsIHksIHUsIHY7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworCisgICAgZm9yICh1ID0gMDsgdSA8IDg7IHUrKykKKyAgICB7CisgICAgICAgIGZvciAodiA9IDA7IHYgPCA4OyB2KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9GNjQgc3VtID0gMC4wOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IHBTcmNbKHggKiA4KSArIHldICoKKyAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbeF1bdV0gKgorICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t5XVt2XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0Wyh1ICogOCkgKyB2XT0gYXJtUm91bmRGbG9hdFRvUzE2IChzdW0pOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmN2JhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCkBAIC0wLDAgKzEsMTE1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKKyAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAorICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCisgKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCisgKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKKyAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgUVAgPD0gMC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAorICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLworICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07CisgICAgT01YX1MxNiAqcFRlbXBCdWYxOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworCisgICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIFFQKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGIyMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIHJlY29uc3RydWN0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgc3RlcCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfVTggY3VyUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyApCit7CisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7CisgICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXIsIGksIGosIGNvdW50OworICAgIE9NWF9JTlQgIHByZWRRUDsKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQ29lZkJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocENvZWZCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBRUEJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChjdXJRUCA8PSAwKSB8fCAoY3VyUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYmxvY2tJbmRleCA8IDApIHx8IChibG9ja0luZGV4ID4gNSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3RlcCAlIDgpICE9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKworICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOworICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKKyAgICAKKyAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFQQnVmKTsKKworICAgIHByZWRBQ0RpciA9IHByZWREaXI7CisKKyAgICBhcm1SZXRBcmdFcnJJZigoKHByZWRRUCA8PSAwKSB8fCAocHJlZFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGlmIChBQ1ByZWRGbGFnID09IDApCisgICAgeworICAgICAgICBwcmVkQUNEaXIgPSBPTVhfVkNfTk9ORTsKKyAgICB9CisKKyAgICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KKyAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOworICAgIH0KKyAgICAKKworICAgIC8qIFZMRCBhbmQgemlnemFnICovCisgICAgaWYgKGludHJhRENWTEMgPT0gMSkKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICB2aWRlb0NvbXApOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICAgICAgcHJlZEFDRGlyLAorICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIH0KKworICAgIC8qIEFDIERDIHByZWRpY3Rpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAorICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgIHBDb2VmQnVmUm93LAorICAgICAgICBwQ29lZkJ1ZkNvbCwKKyAgICAgICAgY3VyUVAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgY3VyUVAsCisgICAgIHZpZGVvQ29tcCwKKyAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIFBsYWNpbmcgdGhlIGxpbmVhciBhcnJheSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSBhbmQgY2xpcHBpbmcKKyAgICAgICBpdCB0byAwIHRvIDI1NSAqLworICAgIGZvciAoaiA9IDAsIGNvdW50ID0gMDsgaiA8IDg7IGorKykKKyAgICB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKywgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtpXSA9IGFybUNsaXAgKDAsIDI1NSwgcFRlbXBCdWYyW2NvdW50XSk7CisgICAgICAgIH0KKyAgICAgICAgcERzdCArPSBzdGVwOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE1OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCkBAIC0wLDAgKzEsMjQzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlIGZvciBkZWNvZGluZyBNViBhbmQgcGFkZGluZyB0aGUgc2FtZQorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKKyAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKKyAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCisgKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCisgKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAorICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKKyAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAorICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKKyAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAorICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAorICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAorICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBzeW50YXggCisgKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCisgKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KKyAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCisgKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVkxlZnRNQiwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WVXBwZXJSaWdodE1CLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBEc3RNVkN1ck1CLAorICAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCisgKQoreworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNVjsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkc3RNVlByZWRNRVsxMl07CisgICAgT01YX0lOVCBpQmxrLCBpLCBjb3VudCA9IDE7CisgICAgT01YX1MzMiBtdkhvclJlc2lkdWFsID0gMSwgbXZWZXJSZXNpZHVhbCA9IDEsIG12SG9yRGF0YSwgbXZWZXJEYXRhOworICAgIE9NWF9TOCBzY2FsZUZhY3RvciwgaW5kZXg7CisgICAgT01YX1MxNiBoaWdoLCBsb3csIHJhbmdlOworCisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVZDdXJNQiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+IDcpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoZmNvZGVGb3J3YXJkIDwgMSkgfHwgKGZjb2RlRm9yd2FyZCA+IDcpKSwgXAorICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3RNVkN1ck1CKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRSQSkgfHwKKyAgICAgICAgKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkFfUSkKKyAgICAgICApCisgICAgeworICAgICAgICAvKiBBbGwgTVYncyBhcmUgemVybyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpXS5keCA9IDA7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpXS5keSA9IDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKyAgICB9CisKKyAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0VikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0Vl9RKSkKKyAgICB7CisgICAgICAgIGNvdW50ID0gNDsKKyAgICB9CisgICAgZWxzZSBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVIpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSX1EpKQorICAgIHsKKyAgICAgICAgY291bnQgPSAxOworICAgIH0KKworICAgIC8qIENhbGN1bGF0aW5nIHRoZSBzY2FsZSBmYWN0b3IgKi8KKyAgICBzY2FsZUZhY3RvciA9IDEgPDwgKGZjb2RlRm9yd2FyZCAtMSk7CisgICAgaGlnaCA9ICAoIDMyICogc2NhbGVGYWN0b3IpIC0gMTsKKyAgICBsb3cgPSAgICggKC0zMikgKiBzY2FsZUZhY3Rvcik7CisgICAgcmFuZ2UgPSAoIDY0ICogc2NhbGVGYWN0b3IpOworCisgICAgLyogSHVmZm1hbiBkZWNvZGluZyBhbmQgTVYgcmVjb25zdHJ1Y3Rpb24gKi8KKyAgICBmb3IgKGlCbGsgPSAwOyBpQmxrIDwgY291bnQ7IGlCbGsrKykKKyAgICB7CisKKyAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyB0byBnZXQgSG9yaXpvbnRhbCBkYXRhIGFuZCByZXNpZHVhbCAqLworICAgICAgICBpbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYVZsY01WRCk7CisgICAgICAgIGFybVJldERhdGFFcnJJZihpbmRleCA9PSAtMSwgT01YX1N0c19FcnIpOworCisgICAgICAgIG12SG9yRGF0YSA9IGluZGV4IC0gMzI7CisKKyAgICAgICAgaWYgKChmY29kZUZvcndhcmQgPiAxKSAmJiAobXZIb3JEYXRhICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtdkhvclJlc2lkdWFsID0gKE9NWF9TMzIpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIChmY29kZUZvcndhcmQgLTEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2RpbmcgdG8gZ2V0IFZlcnRpY2FsIGRhdGEgYW5kIHJlc2lkdWFsICovCisgICAgICAgIGluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKGluZGV4ID09IC0xLCBPTVhfU3RzX0Vycik7CisKKyAgICAgICAgbXZWZXJEYXRhID0gaW5kZXggLSAzMjsKKworICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChtdlZlckRhdGEgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAoT01YX1MzMikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgKGZjb2RlRm9yd2FyZCAtMSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIGRpZmZlcnRpYWwgTVYgKi8KKyAgICAgICAgaWYgKCAoc2NhbGVGYWN0b3IgPT0gMSkgfHwgKG12SG9yRGF0YSA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZNVi5keCA9IG12SG9yRGF0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZNVi5keCA9ICgoYXJtQWJzKG12SG9yRGF0YSkgLSAxKSAqIGZjb2RlRm9yd2FyZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIG12SG9yUmVzaWR1YWwgKyAxOworICAgICAgICAgICAgaWYgKG12SG9yRGF0YSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlmZk1WLmR4ID0gLWRpZmZNVi5keDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggKHNjYWxlRmFjdG9yID09IDEpIHx8IChtdlZlckRhdGEgPT0gMCkgKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSBtdlZlckRhdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSAoKGFybUFicyhtdlZlckRhdGEpIC0gMSkgKiBmY29kZUZvcndhcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBtdlZlclJlc2lkdWFsICsgMTsKKyAgICAgICAgICAgIGlmIChtdlZlckRhdGEgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpZmZNVi5keSA9IC1kaWZmTVYuZHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBwcmVkaWN0ZWQgdmVjdG9yICovCisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICgKKyAgICAgICAgICAgIHBEc3RNVkN1ck1CLAorICAgICAgICAgICAgcFNyY01WTGVmdE1CLAorICAgICAgICAgICAgcFNyY01WVXBwZXJNQiwKKyAgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICAgICAgICAgICZwRHN0TVZDdXJNQltpQmxrXSwKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FLAorICAgICAgICAgICAgaUJsayk7CisKKyAgICAgICAgLyogQWRkaW5nIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0ZWQgTVYgdG8gcmVjb25zdHJ1Y3QgTVYgKi8KKyAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHggKz0gZGlmZk1WLmR4OworICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSArPSBkaWZmTVYuZHk7CisKKyAgICAgICAgLyogQ2hlY2tpbmcgdGhlIHJhbmdlIGFuZCBrZWVwaW5nIGl0IHdpdGhpbiB0aGUgbGltaXRzICovCisgICAgICAgIGlmICggcERzdE1WQ3VyTUJbaUJsa10uZHggPCBsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCArPSByYW5nZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocERzdE1WQ3VyTUJbaUJsa10uZHggPiBoaWdoKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCAtPSByYW5nZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcERzdE1WQ3VyTUJbaUJsa10uZHkgPCBsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSArPSByYW5nZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocERzdE1WQ3VyTUJbaUJsa10uZHkgPiBoaWdoKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSAtPSByYW5nZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCisgICAgeworICAgICAgICBwRHN0TVZDdXJNQlsxXSA9IHBEc3RNVkN1ck1CWzBdOworICAgICAgICBwRHN0TVZDdXJNQlsyXSA9IHBEc3RNVkN1ck1CWzBdOworICAgICAgICBwRHN0TVZDdXJNQlszXSA9IHBEc3RNVkN1ck1CWzBdOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE4ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCisgKiBmb3IgaW50ZXIgYmxvY2suCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICBPTVhfVTggIGxhc3Qsc3RhcnQgPSAwOworICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKwkJCSAgcERzdCwKKwkJCSAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgc3RhcnQsCisJCQkgICZsYXN0LAorCQkJICAxMSwKKwkJCSAgNDIsCisJCQkgICAyLAorCQkJICAgNSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwLAorCQkJICBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDEsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxUk1BWCwKKyAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlICk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgaWYgKGxhc3QgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBPTVhfU3RzX0VycjsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTkzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCkBAIC0wLDAgKzEsMTAzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCisgKiBmb3IgaW50cmEgYmxvY2suCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKKyAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKKyAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCisgKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKKyAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKKyAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAorICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCisgKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KKworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIE9NWF9VOCBzdGFydCA9IDA7CisKKyAgICByZXR1cm4gYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgcHBCaXRTdHJlYW0sCisgICAgIHBCaXRPZmZzZXQsCisgICAgIHBEc3QsCisgICAgIHByZWREaXIsCisgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIHN0YXJ0KTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlMDBkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispCit7CisgICAgLyogRHVtbXkgaW5pdGlsYWl6YXRpb24gdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9yICovCisgICAgT01YX1M4ICBEQ1ZhbHVlU2l6ZSA9IDA7CisgICAgT01YX1UxNiBwb3dPZlNpemUsIGZldGNoRENiaXRzOworICAgIE9NWF9VOCBzdGFydCA9IDE7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyID4gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIEluc2VydCB0aGUgY29kZSBpbnRvIHRoZSBiaXRzdHJlYW0gKi8KKyAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCisgICAgeworICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFJbmRleCk7CisgICAgfQorICAgIGVsc2UgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfQ0hST01JTkFOQ0UpCisgICAgeworICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4KTsKKyAgICB9CisgICAgYXJtUmV0RGF0YUVycklmKERDVmFsdWVTaXplID09IC0xLCBPTVhfU3RzX0Vycik7CisgICAgYXJtUmV0RGF0YUVycklmKERDVmFsdWVTaXplID4gMTIsIE9NWF9TdHNfRXJyKTsKKworCisgICAgaWYgKERDVmFsdWVTaXplID09IDApCisgICAgeworICAgICAgICBwRHN0WzBdID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZmV0Y2hEQ2JpdHMgPSAoT01YX1UxNikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDVmFsdWVTaXplKTsKKworICAgICAgICBpZiAoIChmZXRjaERDYml0cyA+PiAoRENWYWx1ZVNpemUgLSAxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2FsdWxhdGUgcG93ICovCisgICAgICAgICAgICBwb3dPZlNpemUgPSAoMSA8PCBEQ1ZhbHVlU2l6ZSk7CisKKyAgICAgICAgICAgIHBEc3RbMF0gPSAgKE9NWF9TMTYpIChmZXRjaERDYml0cyBeIChwb3dPZlNpemUgLSAxKSk7CisgICAgICAgICAgICBwRHN0WzBdID0gLXBEc3RbMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0WzBdID0gZmV0Y2hEQ2JpdHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiA4KQorICAgICAgICB7CisgICAgICAgICAgICAvKiByZWFkaW5nIGFuZCBjaGVja2luZyB0aGUgbWFya2VyIGJpdCovCisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYgKGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpID09IDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19FcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgIHByZWREaXIsCisgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgICBzdGFydCk7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjJiNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZU1WLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgcHJlZGljdGluZyBNViBvZiBNQgorICoKKyAqLyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKKyAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKKyAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKKyAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCisgKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCisgKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCisgKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCisgKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAorICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCisgKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBNVkN1ck1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVkxlZnRNQiwKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZVcHBlck1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKQoreworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZCwgZGlmZk1WOworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZE1FWzEyXTsKKyAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gd2FybmluZyAqLworICAgIE9NWF9JTlQgaUJsaywgaSwgY291bnQgPSAxOworICAgIE9NWF9TMzIgbXZIb3JSZXNpZHVhbCwgbXZWZXJSZXNpZHVhbCwgbXZIb3JEYXRhLCBtdlZlckRhdGE7CisgICAgT01YX1U4IHNjYWxlRmFjdG9yLCBpbmRleDsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNykpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChmY29kZUZvcndhcmQgPCAxKSB8fCAoZmNvZGVGb3J3YXJkID4gNykpLCBcCisgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkEpIHx8CisgICAgICAgIChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBX1EpCisgICAgICAgKQorICAgIHsKKyAgICAgICAgLyogTm8gY2FuZGlkYXRlIHZlY3RvcnMgaGVuY2UgbWFrZSB0aGVtIHplcm8gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR4ID0gMDsKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgIH0KKworICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWX1EpKQorICAgIHsKKyAgICAgICAgY291bnQgPSA0OworICAgIH0KKyAgICBlbHNlIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCisgICAgeworICAgICAgICBjb3VudCA9IDE7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRpbmcgdGhlIHNjYWxlIGZhY3RvciAqLworICAgIHNjYWxlRmFjdG9yID0gMSA8PCAoZmNvZGVGb3J3YXJkIC0xKTsKKworICAgIGZvciAoaUJsayA9IDA7IGlCbGsgPCBjb3VudDsgaUJsaysrKQorICAgIHsKKworICAgICAgICAvKiBGaW5kIHRoZSBwcmVkaWN0ZWQgdmVjdG9yICovCisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICgKKyAgICAgICAgICAgIHBNVkN1ck1CLAorICAgICAgICAgICAgcFNyY01WTGVmdE1CLAorICAgICAgICAgICAgcFNyY01WVXBwZXJNQiwKKyAgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICAgICAgICAgICZkc3RNVlByZWQsCisgICAgICAgICAgICBkc3RNVlByZWRNRSwKKyAgICAgICAgICAgIGlCbGsgKTsKKworICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZGlmZmVyZW50aWFsIG1vdGlvbiB2ZWN0b3IgKGRpZmZNVikgKi8KKyAgICAgICAgZGlmZk1WLmR4ID0gcE1WQ3VyTUJbaUJsa10uZHggLSBkc3RNVlByZWQuZHg7CisgICAgICAgIGRpZmZNVi5keSA9IHBNVkN1ck1CW2lCbGtdLmR5IC0gZHN0TVZQcmVkLmR5OworCisgICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBtdl9kYXRhIGFuZCBtdl9yZXNpZHVhbCBmb3IgSG9yaXphbnRhbCBNViAqLworICAgICAgICBpZiAoZGlmZk1WLmR4ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAwOworICAgICAgICAgICAgbXZIb3JEYXRhID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHgpIC0gMSkgJSBzY2FsZUZhY3RvcjsKKyAgICAgICAgICAgIG12SG9yRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR4KSAtIG12SG9yUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7CisgICAgICAgICAgICBpZiAoZGlmZk1WLmR4IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtdkhvckRhdGEgPSAtbXZIb3JEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIG12X2RhdGEgYW5kIG12X3Jlc2lkdWFsIGZvciBWZXJ0aWNhbCBNViAqLworICAgICAgICBpZiAoZGlmZk1WLmR5ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAwOworICAgICAgICAgICAgbXZWZXJEYXRhID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHkpIC0gMSkgJSBzY2FsZUZhY3RvcjsKKyAgICAgICAgICAgIG12VmVyRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR5KSAtIG12VmVyUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7CisgICAgICAgICAgICBpZiAoZGlmZk1WLmR5IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtdlZlckRhdGEgPSAtbXZWZXJEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSHVmZm1hbiBlbmNvZGluZyAqLworCisgICAgICAgIC8qIFRoZSBpbmRleCBpcyBhY3R1YWxseSBjYWxjdWxhdGUgYXMKKyAgICAgICAgICAgaW5kZXggPSAoKGZsb2F0KSAobXZIb3JEYXRhLzIpICsgMTYpICogMiwKKyAgICAgICAgICAgbWVhbmluZyB0aGUgTVYgZGF0YSBpcyBoYWxmZWQgYW5kIHRoZW4gbm9ybWFsaXplZAorICAgICAgICAgICB0byBiZWdpbiB3aXRoIHplcm8gYW5kIHRoZW4gZG91YmxlZCB0byB0YWtlIGNhcmUgb2YgaW5kZXhpbmcKKyAgICAgICAgICAgdGhlIGZyYWN0aW9uYWwgcGFydCBpbmNsdWRlZCAqLworICAgICAgICBpbmRleCA9IG12SG9yRGF0YSArIDMyOworICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYVZsY01WRFtpbmRleF0pOworICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChkaWZmTVYuZHggIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybVBhY2tCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgbXZIb3JSZXNpZHVhbCwgKGZjb2RlRm9yd2FyZCAtMSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogVGhlIGluZGV4IGlzIGFjdHVhbGx5IGNhbGN1bGF0ZSBhcworICAgICAgICAgICBpbmRleCA9ICgoZmxvYXQpIChtdlZlckRhdGEvMikgKyAxNikgKiAyLAorICAgICAgICAgICBtZWFuaW5nIHRoZSBNViBkYXRhIGlzIGhhbGZlZCBhbmQgdGhlbiBub3JtYWxpemVkCisgICAgICAgICAgIHRvIGJlZ2luIHdpdGggemVybyBhbmQgdGhlbiBkb3VibGVkIHRvIHRha2UgY2FyZSBvZiBpbmRleGluZworICAgICAgICAgICB0aGUgZnJhY3Rpb25hbCBwYXJ0IGluY2x1ZGVkICovCisgICAgICAgIGluZGV4ID0gbXZWZXJEYXRhICsgMzI7CisgICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEW2luZGV4XSk7CisgICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKGRpZmZNVi5keSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJtUGFja0JpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBtdlZlclJlc2lkdWFsLCAoZmNvZGVGb3J3YXJkIC0xKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjNzNlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCkBAIC0wLDAgKzEsMTEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZworICogZm9yIGludGVyIGJsb2NrLgorICoKKyAqLyAKKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAorICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcGF0dGVybiwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgT01YX1U4IHN0YXJ0ID0gMDsKKyAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGlmIChwYXR0ZXJuKQorICAgIHsKKyAgICAgICAgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgMjYsCisgICAgICAgICAgICAgIDQwLAorICAgICAgICAgICAgICAxMCwKKyAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwLAorCQkJICBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDEsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxUk1BWCwKKyAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlCisgICAgICAgICk7CisgICAgfSAvKiBQYXR0ZXJuIGNoZWNrIGVuZHMqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDc5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAorICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIE9NWF9VOCBzdGFydCA9IDA7CisKKyAgICByZXR1cm4gYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgcHBCaXRTdHJlYW0sCisgICAgIHBCaXRPZmZzZXQsCisgICAgIHBRRGN0QmxrQ29lZiwKKyAgICAgcHJlZERpciwKKyAgICAgcGF0dGVybiwKKyAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgc3RhcnQpOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3YWNkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispCit7CisgICAgT01YX1MxNiBkY1ZhbHVlLCBwb3dPZlNpemU7CisgICAgT01YX1U4ICBEQ1ZhbHVlU2l6ZSwgc3RhcnQgPSAxOworICAgIE9NWF9VMTYgYWJzRENWYWx1ZTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBRRGN0QmxrQ29lZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCh2aWRlb0NvbXAgIT0gT01YX1ZDX0xVTUlOQU5DRSkgJiYgKHZpZGVvQ29tcCAhPSBPTVhfVkNfQ0hST01JTkFOQ0UpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKHByZWREaXIgIT0gT01YX1ZDX05PTkUpICYmIChwcmVkRGlyICE9IE9NWF9WQ19IT1JJWk9OVEFMKSAmJiAocHJlZERpciAhPSBPTVhfVkNfVkVSVElDQUwpICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGlmIChwYXR0ZXJuKQorICAgIHsKKyAgICAgICAgZGNWYWx1ZSA9IHBRRGN0QmxrQ29lZlswXTsKKyAgICAgICAgYWJzRENWYWx1ZSA9IGFybUFicyhkY1ZhbHVlKTsKKworICAgICAgICAvKiBGaW5kIHRoZSBzaXplICovCisgICAgICAgIERDVmFsdWVTaXplID0gYXJtTG9nU2l6ZSAoYWJzRENWYWx1ZSk7CisgICAgICAgIGFic0RDVmFsdWUgPSBhcm1BYnMoZGNWYWx1ZSk7CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBjb2RlIGludG8gdGhlIGJpdHN0cmVhbSAqLworICAgICAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCisgICAgICAgIHsKKworICAgICAgICAgICAgYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4W0RDVmFsdWVTaXplXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKKyAgICAgICAgeworCisgICAgICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFtEQ1ZhbHVlU2l6ZV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogQWRkaXRpb25hbCBjb2RlIGdlbmVyYXRpb24gaW4gY2FzZSBvZiBuZWdhdGl2ZQorICAgICAgICAgICBkYyB2YWx1ZSB0aGUgYWRkaXRpb25hbCAqLworICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGNWYWx1ZSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogY2FsdWxhdGUgMiBwb3cgKi8KKyAgICAgICAgICAgICAgICBwb3dPZlNpemUgPSAoMSA8PCBEQ1ZhbHVlU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBhYnNEQ1ZhbHVlID0gIGFic0RDVmFsdWUgXiAocG93T2ZTaXplIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpYWJzRENWYWx1ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRENWYWx1ZVNpemUpOworCisgICAgICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAorICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICAgIHByZWREaXIsCisgICAgICAgICAgICAgICAgcGF0dGVybiwKKyAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICAgIHN0YXJ0KTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNmZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCkBAIC0wLDAgKzEsMTg4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0ZpbmRNVnByZWQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlIGZvciBwcmVkaWN0aW5nIE1WIG9mIE1CCisgKgorICovCisgIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCgKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNNVkN1ck1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjEsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMiwKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYzLAorICAgICBPTVhWQ01vdGlvblZlY3RvciogcERzdE1WUHJlZCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBEc3RNVlByZWRNRSwKKyAgICAgT01YX0lOVCBpQmxrCisgKQoreworICAgIE9NWFZDTW90aW9uVmVjdG9yIENhbmRNVjsKKwljb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcENhbmRNVjE7CisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBDYW5kTVYyOworICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwQ2FuZE1WMzsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKwlhcm1SZXRBcmdFcnJJZihpQmxrIT0wICYmIHBTcmNNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsayA8IDApIHx8IChpQmxrID4gMyksIE9NWF9TdHNfQmFkQXJnRXJyKTsgCisKKyAgICBDYW5kTVYuZHggPSBDYW5kTVYuZHkgPSAwOworCS8qIEJhc2VkIG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgYmxvY2sgZXh0cmFjdCB0aGUgbW90aW9uIHZlY3RvcnMgYW5kCisgICAgICAgdGhlIHRyYW5wZXJhbmN5IHN0YXR1cyAqLworICAgCisgICAgCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZSB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwgKi8KKyAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjMgPSAmQ2FuZE1WOworCisgICAgCisgICAgc3dpdGNoIChpQmxrKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICB7CisgICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJICAgIHBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzFdOworCQkJfQorCQkJaWYocFNyY0NhbmRNVjIgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKwkJCQlwQ2FuZE1WMiA9ICZwU3JjQ2FuZE1WMlsyXTsKKwkJCX0KKwkJCWlmKHBTcmNDYW5kTVYzICE9IE5VTEwpCisgICAgICAgICAgICB7CisJCQkJcENhbmRNVjMgPSAmcFNyY0NhbmRNVjNbMl07CisJCQl9CisJCQlpZiAoKHBTcmNDYW5kTVYxID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMiA9PSBOVUxMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKChwU3JjQ2FuZE1WMSA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENhbmRNVjEgPSBwQ2FuZE1WMyA9IHBDYW5kTVYyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigocFNyY0NhbmRNVjIgPT0gTlVMTCkgJiYgKHBTcmNDYW5kTVYzID09IE5VTEwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDYW5kTVYyID0gcENhbmRNVjMgPSBwQ2FuZE1WMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgeworICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMF07CisJCQlpZihwU3JjQ2FuZE1WMiAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJCXBDYW5kTVYyID0gJnBTcmNDYW5kTVYyWzNdOworCQkJfQorCQkJaWYocFNyY0NhbmRNVjMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKwkJCQlwQ2FuZE1WMyA9ICZwU3JjQ2FuZE1WM1syXTsKKwkJCX0KKwkJCWlmKChwU3JjQ2FuZE1WMiA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENhbmRNVjIgPSBwQ2FuZE1WMyA9IHBDYW5kTVYxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJCXBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzNdOworCQkJfQorCQkJcENhbmRNVjIgPSAmcFNyY01WQ3VyTUJbMF07CisJCQlwQ2FuZE1WMyA9ICZwU3JjTVZDdXJNQlsxXTsKKwkJCWJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgeworICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMl07CisJCQlwQ2FuZE1WMiA9ICZwU3JjTVZDdXJNQlswXTsKKwkJCXBDYW5kTVYzID0gJnBTcmNNVkN1ck1CWzFdOworCQkJYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MgKi8KKyAgICBwRHN0TVZQcmVkLT5keCA9IGFybU1lZGlhbk9mMyAocENhbmRNVjEtPmR4LCBwQ2FuZE1WMi0+ZHgsIHBDYW5kTVYzLT5keCk7CisgICAgcERzdE1WUHJlZC0+ZHkgPSBhcm1NZWRpYW5PZjMgKHBDYW5kTVYxLT5keSwgcENhbmRNVjItPmR5LCBwQ2FuZE1WMy0+ZHkpOworICAgICAgICAKKyAgICBpZiAocERzdE1WUHJlZE1FICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCB0aGVzZSBjYW4gYmUgdXNlZAorICAgICAgICAgICBpbiB0aGUgZmFzdCBhbGdvcml0aG0gaWYgaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgcERzdE1WUHJlZE1FWzBdLmR4ID0gcENhbmRNVjEtPmR4OworICAgICAgICBwRHN0TVZQcmVkTUVbMF0uZHkgPSBwQ2FuZE1WMS0+ZHk7CisgICAgICAgIHBEc3RNVlByZWRNRVsxXS5keCA9IHBDYW5kTVYyLT5keDsKKyAgICAgICAgcERzdE1WUHJlZE1FWzFdLmR5ID0gcENhbmRNVjItPmR5OworICAgICAgICBwRHN0TVZQcmVkTUVbMl0uZHggPSBwQ2FuZE1WMy0+ZHg7CisgICAgICAgIHBEc3RNVlByZWRNRVsyXS5keSA9IHBDYW5kTVYzLT5keTsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisvKiBFbmQgb2YgZmlsZSAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4NmQ5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYwpAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciA4eDggYmxvY2sgSURDVAorICogCisgKi8KKworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfRENUX1RhYmxlLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKGNvbnN0IE9NWF9TMTYgKnBTcmMsIE9NWF9TMTYgKnBEc3QpCit7CisgICAgT01YX0lOVCB4LCB5LCB1LCB2OworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBPTVhfRjY0IHN1bSA9IDAuMDsKKyAgICAgICAgICAgIGZvciAodSA9IDA7IHUgPCA4OyB1KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2ID0gMDsgdiA8IDg7IHYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBwU3JjWyh1ICogOCkgKyB2XSAqCisgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t4XVt1XSAqCisgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t5XVt2XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSA9IChPTVhfUzE2KSBmbG9vcihzdW0gKyAwLjUpOworCisgICAgICAgICAgICAvKiBTYXR1cmF0ZSB0byBbLTI1NiwgMjU1XSAqLworICAgICAgICAgICAgcERzdFsoeCAqIDgpICsgeV0gPSBhcm1DbGlwICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2ZhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYwpAQCAtMCwwICsxLDM1NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2suYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIE1QRUc0IG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAorICogaW50ZXJwb2xhdGlvbgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9IYWxmUGVsVmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBoYWxmIHBlbCBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgdmVydGljYWwgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsIHN1YmNsYXVzZSA3LjYuMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dIHNyY1N0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzCisgKiAgICAgICAgICAgICAgICAgIGluIHRoZSByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUKKyAqICAgICAgICAgICAgICAgICAgb2YgOC4KKyAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCisgKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGxpbmFlciA4eDggZGVzdGluYXRpb24gYnVmZmVyOworICoKKyAqLworc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX0hhbGZQZWxWZXIoCisgICAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgICBPTVhfSU5UIHNyY1N0ZXAsIAorICAgICAgT01YX1U4ICpwRHN0LAorICAgICAgT01YX0lOVCBybmRWYWwpCit7CisgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMxOworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMjsKKyAgT01YX0lOVCB5LCB4OworICAKKyAgcFRlbXBTcmMxID0gcFNyYzsgIAorICBwVGVtcFNyYzIgPSBwU3JjICsgc3JjU3RlcDsKKyAgc3JjU3RlcCAtPSA4OworICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICB7CisgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICB7CisgICAgICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKyspICsgMSAtIHJuZFZhbCkgPj4gMTsKKyAgICB9CisgICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxIb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyBob3Jpem9udGFsIAorICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gSVNPL0lFQyAxNDQ5Ni0yLCBzdWJjbGF1c2UgNy42LjIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcworICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCisgKiAgICAgICAgICAgICAgICAgIG9mIDguCisgKiBbaW5dIHJuZFZhbCAgICAgIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLgorICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBsaW5hZXIgOHg4IGRlc3RpbmF0aW9uIGJ1ZmZlcjsKKyAqCisgKi8KK3N0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9IYWxmUGVsSG9yKAorICAgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgICAgT01YX0lOVCBzcmNTdGVwLCAKKyAgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgIE9NWF9JTlQgcm5kVmFsKQoreworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMTsKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzI7CisgIE9NWF9JTlQgeSwgeDsKKyAgCisgIHBUZW1wU3JjMSA9IHBTcmM7CisgIHBUZW1wU3JjMiA9IHBUZW1wU3JjMSArIDE7CisKKyAgc3JjU3RlcCAtPSA4OworICBmb3IgKHk9MDsgeTw4OyB5KyspCisgIHsKKyAgICBmb3IgKHg9MDsgeDw4OyB4KyspCisgICAgeworICAgICAgKnBEc3QrKyA9ICgoKnBUZW1wU3JjMSsrICsgKnBUZW1wU3JjMisrKSArIDEgLSBybmRWYWwpID4+IDE7CisgICAgfQorICAgIHBUZW1wU3JjMSArPSBzcmNTdGVwOworICAgIHBUZW1wU3JjMiArPSBzcmNTdGVwOworICB9Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxWZXJIb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyBib3RoIAorICogaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gSVNPL0lFQyAxNDQ5Ni0yLAorICogc3ViY2xhdXNlIDcuNi4yLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQorICogICAgICAgICAgICAgICAgICBvZiA4LgorICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KKyAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgbGluYWVyIDh4OCBkZXN0aW5hdGlvbiBidWZmZXI7CisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfSGFsZlBlbFZlckhvcigKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICAgIE9NWF9JTlQgc3JjU3RlcCwgCisgICAgICBPTVhfVTggKnBEc3QsCisgICAgICBPTVhfSU5UIHJuZFZhbCkKK3sKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzE7CisgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMyOworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMzsKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzQ7CisgIE9NWF9JTlQgeSwgeDsKKworICBwVGVtcFNyYzEgPSBwU3JjOworICBwVGVtcFNyYzIgPSBwU3JjICsgc3JjU3RlcDsKKyAgcFRlbXBTcmMzID0gcFNyYyArIDE7CisgIHBUZW1wU3JjNCA9IHBTcmMgKyBzcmNTdGVwICsgMTsKKworICBzcmNTdGVwIC09IDg7CisgIGZvciAoeT0wOyB5PDg7IHkrKykKKyAgeworICAgIGZvciAoeD0wOyB4PDg7IHgrKykKKwl7CisJICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKysgKyAqcFRlbXBTcmMzKysgKyAqcFRlbXBTcmM0KyspICsgCisJICAgICAgICAgICAgICAgICAgMiAtIHJuZFZhbCkgPj4gMjsKKwl9CisgICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMzICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmM0ICs9IHNyY1N0ZXA7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogRG8gbW90aW9uIGNvbXBlbnNhdGlvbiBhbmQgY29weSB0aGUgcmVzdWx0IHRvIHRoZSBjdXJyZW50IGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQorICogICAgICAgICAgICAgICAgICBvZiA4LgorICogW2luXSBkc3RTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAqIFtpbl0gcHJlZGljdFR5cGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjEuMi4KKyAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCisgKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgICAgICAgICAgICAgICAgSWYgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzCisgKiAgICAgICAgICAgICAgICAgIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLgorICoKKyAqLworc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcygKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywgCisgICAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgICBPTVhfVTggKnBEc3QsCisgICAgICBPTVhfSU5UIGRzdFN0ZXApCit7CisgICAgT01YX1U4IHgseSxjb3VudCxpbmRleDsKKyAgICAKKyAgICAvKiBDb3B5aW5nIHRoZSByZWYgOHg4IGJsayB0byB0aGUgY3VyciBibGsgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDg7IHkrKyxpbmRleCArPSAoc3JjU3RlcCAtOCksIGNvdW50ICs9IChkc3RTdGVwIC0gOCkpCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrLGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbY291bnRdID0gcFNyY1tpbmRleF07CisgICAgICAgIH0gICAgICAgCisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIElOVEVSIGJsb2NrIGJ5IHN1bW1pbmcgdGhlIG1vdGlvbiBjb21wZW5zYXRpb24gcmVzdWx0cworICogYW5kIHRoZSByZXN1bHRzIG9mIHRoZSBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIChwcmVkaWN0aW9uIHJlc2lkdWFscykuCisgKiBPdXRwdXQgaW50ZW5zaXRpZXMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXSBwU3JjUmVzaWR1ZSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uCisgKiAgICAgICAgICAgICAgICAgIHJlc2lkdWFscy4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCx0aGVuIG5vIHByZWRpY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgaXMKKyAqICAgICAgICAgICAgICAgICAgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLgorICogW2luXSBkc3RTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogICAgICAgICAgICAgICAgICBJZiBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMKKyAqICAgICAgICAgICAgICAgICAgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcygKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywgCisgICAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKKyAgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgIE9NWF9JTlQgZHN0U3RlcCkKK3sKKyAgICAgIAorICBPTVhfVTggeCx5OworICBPTVhfSU5UIHRlbXA7CisgIAorICBmb3IoeSA9IDA7IHkgPCA4OyB5KyspCisgIHsKKyAgICBmb3IoeCA9IDA7IHggPCA4OyB4KyspCisgICAgeworICAgICAgdGVtcCA9IHBTcmNbeF0gKyBwU3JjUmVzaWR1ZVt4XTsgICAgICAgICAKKyAgICAgIHBEc3RbeF0gPSBhcm1DbGlwKDAsMjU1LHRlbXApOworICAgIH0KKyAgICBwRHN0ICs9IGRzdFN0ZXA7CisgICAgcFNyYyArPSA4OworICAgIHBTcmNSZXNpZHVlICs9IDg7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAorICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCisgKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCisgKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCisgKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCisgKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCisgKiAgICAgICAgICAgIDYuMi4xLjIuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKKyAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCisgKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jaygKKwkJY29uc3QgT01YX1U4ICpwU3JjLAorCQlPTVhfSU5UIHNyY1N0ZXAsCisJCWNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorCQlPTVhfVTggKnBEc3QsIAorCQlPTVhfSU5UIGRzdFN0ZXAsCisJCU9NWF9JTlQgcHJlZGljdFR5cGUsCisJCU9NWF9JTlQgcm5kVmFsKQoreworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworICAgIE9NWF9VOCBwVGVtcERzdFs2NF07CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVzaWR1ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKGRzdFN0ZXAgJSA4KSB8fCAoc3JjU3RlcCAlIDgpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgocHJlZGljdFR5cGUgIT0gT01YX1ZDX0lOVEVHRVJfUElYRUwpICYmCisgICAgICAgICAgICAgICAgICAgIChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSEFMRl9QSVhFTF9YKSAmJgorICAgICAgICAgICAgICAgICAgICAocHJlZGljdFR5cGUgIT0gT01YX1ZDX0hBTEZfUElYRUxfWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHByZWRpY3RUeXBlICE9IE9NWF9WQ19IQUxGX1BJWEVMX1hZKQorICAgICAgICAgICAgICAgICAgICksT01YX1N0c19CYWRBcmdFcnIpOyAKKyAgICBhcm1SZXRBcmdFcnJJZigoKHJuZFZhbCAhPSAwKSAmJiAocm5kVmFsICE9IDEpKSxPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgc3dpdGNoKHByZWRpY3RUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBPTVhfVkNfSU5URUdFUl9QSVhFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcyhwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9WQ19IQUxGX1BJWEVMX1g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsSG9yKHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfVkNfSEFMRl9QSVhFTF9ZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSGFsZlBlbFZlcihwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFRlbXBEc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1ZDX0hBTEZfUElYRUxfWFk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsVmVySG9yKHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgaWYocFNyY1Jlc2lkdWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKCYocFRlbXBEc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwKTsgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcygmKHBUZW1wRHN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZXNpZHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXApOyAgICAKKyAgICB9CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNTFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FTW9kZSwgCisgICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywgCisgICAgT01YX1UzMiAqcFNpemUKKyAgICkKK3sKKyAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIXBTaXplLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1FUGFyYW1zLT5zZWFyY2hSYW5nZSA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0gpICYmCisgICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgKnBTaXplID0gKE9NWF9JTlQpIHNpemVvZihBUk1WQ000UDJfTUVTcGVjKTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTllNzFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NRUluaXQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVNb2RlLCAKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLCAKKyAgICB2b2lkICpwTUVTcGVjCisgICApCit7CisgICAgQVJNVkNNNFAyX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMl9NRVNwZWMgKikgcE1FU3BlYzsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIXBNRVNwZWMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIKSAmJiAKKyAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoRW5hYmxlOHg4ICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoRW5hYmxlOHg4OworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuaGFsZlBlbFNlYXJjaEVuYWJsZSA9IHBNRVBhcmFtcy0+aGFsZlBlbFNlYXJjaEVuYWJsZTsKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlICAgICAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOyAgICAgICAgCisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5ybmRWYWwgICAgICAgICAgICAgID0gcE1FUGFyYW1zLT5ybmRWYWw7CisgICAgYXJtTUVTcGVjLT5NRU1vZGUgICAgICAgICAgICAgICAgICAgICAgID0gTUVNb2RlOworICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTQ5MDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKQEAgLTAsMCArMSw2MzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBtb3Rpb24gc2VhcmNoIDE2eDE2IG1hY3JvYmxvY2sKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2CisgKgorICogRGVzY3JpcHRpb246CisgKiAxNngxNiBibG9jayBtYXRjaCB3cmFwcGVyIGZ1bmN0aW9uLCBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LgorICogSWYgaGFsZiBwZWwgc2VhcmNoIGlzIGVuYWJsZWQgaXQgYWxzbyBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2CisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCSAgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlzcmNSZWZTdGVwCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLgorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJICBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuCisgKiBbaW5dIHBNRVNwZWMJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbb3V0XSBwRHN0TVYJICAgICAgcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdIHBEc3RTQUQJICBwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKiAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF8xNngxNigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBjb25zdCBPTVhfSU5UIHNyY1JlZlN0ZXAsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7CisgICAgT01YX0lOVCBybmRWYWw7CisgICAgCisgICAgcm5kVmFsID0gcE1FUGFyYW1zLT5ybmRWYWw7CisgICAgCisgICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNigKKyAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgcFJlZlJlY3QsCisgICAgICAgIHBTcmNDdXJyQnVmLAorICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICBwU3JjUHJlTVYsCisgICAgICAgIHBTcmNQcmVTQUQsCisgICAgICAgIHBNRVBhcmFtcywKKyAgICAgICAgcERzdE1WLAorICAgICAgICBwRHN0U0FEKTsKKyAgICAKKyAgICBpZiAocE1FUGFyYW1zLT5oYWxmUGVsU2VhcmNoRW5hYmxlKQorICAgIHsKKyAgICAgICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNigKKyAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICAgICAgcFJlZlJlY3QsCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICBybmRWYWwsCisgICAgICAgICAgICBwRHN0TVYsCisgICAgICAgICAgICBwRHN0U0FEKTsKKyAgICB9CisgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7ICAgICAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4CisgKgorICogRGVzY3JpcHRpb246CisgKiA4eDggYmxvY2sgbWF0Y2ggd3JhcHBlciBmdW5jdGlvbiwgY2FsbHMgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguCisgKiBJZiBoYWxmIHBlbCBzZWFyY2ggaXMgZW5hYmxlZCBpdCBhbHNvIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4CisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCSAgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlzcmNSZWZTdGVwCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLgorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJICBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuCisgKiBbaW5dIHBNRVNwZWMJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbb3V0XSBwRHN0TVYJICAgICAgcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdIHBEc3RTQUQJICBwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKiAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDgoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCBzcmNSZWZTdGVwLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICAgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICAgdm9pZCAqcE1FU3BlYywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworICAgIE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMgPSAoT01YVkNNNFAyTUVQYXJhbXMgKilwTUVTcGVjOworICAgIE9NWF9JTlQgcm5kVmFsOworICAgIAorICAgIHJuZFZhbCA9IHBNRVBhcmFtcy0+cm5kVmFsOworICAgIAorICAgIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4KAorICAgICAgICBwU3JjUmVmQnVmLAorICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgIHBTcmNQcmVNViwKKyAgICAgICAgcFNyY1ByZVNBRCwKKyAgICAgICAgcE1FUGFyYW1zLAorICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgIHBEc3RTQUQpOworICAgIAorICAgIGlmIChwTUVQYXJhbXMtPmhhbGZQZWxTZWFyY2hFbmFibGUpCisgICAgeworICAgICAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCgKKyAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICAgICAgcFJlZlJlY3QsCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICBybmRWYWwsCisgICAgICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgICAgICBwRHN0U0FEKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7ICAgICAgICAKK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKKyAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAorICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCisgKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAorICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCisgKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKKyAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKKyAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKKyAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCisgKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKKyAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCisgKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKKyAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAorICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKKyAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKKyAqICAgICAgICAgICAgaWdub3JlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAorICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAorICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKKyAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKKyAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKKyAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKKyAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCisgKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKKyAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKKyAqICAgICAgICAgICAgZWFjaCBNQi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKykKK3sKKyAKKyAgICBPTVhfSU5UIGludHJhU0FELCBhdmVyYWdlLCBjb3VudCwgaW5kZXgsIHgsIHk7CisgICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVYxNngxNjsKKyAgICBPTVhfSU5UICAgICAgICAgICBkc3RTQUQxNngxNjsKKyAgICBPTVhfSU5UICAgICAgICAgICBkc3RTQUQ4eDg7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgICpwTUVQYXJhbXM7IAorCU9NWFZDTTRQMkNvb3JkaW5hdGUgVGVtcEN1cnJQb2ludFBvczsgCisgICAgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFRlbXBDdXJyUG9pbnRQb3M7IAorICAgIE9NWF9VOCBhVGVtcFNyY0N1cnJCdWZbMjcxXTsKKyAgICBPTVhfVTggKnBUZW1wU3JjQ3VyckJ1ZjsKKyAgICBPTVhfVTggKnBEc3Q7CisgICAgT01YX1U4IGFEc3RbNzFdOworICAgIE9NWF9TMzIgZHN0U3RlcCA9IDg7CisgICAgT01YX0lOVCBwcmVkaWN0VHlwZTsKKwlPTVhfUzMyIFNhZDsKKyAgICBjb25zdCBPTVhfVTggKnBUZW1wU3JjUmVmQnVmOworICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMVs0XTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjJbNF07CisgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYzWzRdOworICAgICAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZkJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKHNyY0N1cnJTdGVwICUgMTYpIHx8IChzcmNSZWZTdGVwICUgMTYpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKHBDdXJyUG9pbnRQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNQkN1cnIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIAorICAgIHBUZW1wQ3VyclBvaW50UG9zID0gJihUZW1wQ3VyclBvaW50UG9zKTsKKyAgICBwVGVtcFNyY0N1cnJCdWYgPSBhcm1BbGlnblRvMTZCeXRlcyhhVGVtcFNyY0N1cnJCdWYpOworICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7CisgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggPSBwQ3VyclBvaW50UG9zLT54OworICAgIHBUZW1wQ3VyclBvaW50UG9zLT55ID0gcEN1cnJQb2ludFBvcy0+eTsKKyAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5URVI7CisgICAgCisgICAgLyogUHJlcGFyaW5nIGEgbGluZWFyIGJ1ZmZlciBmb3IgYmxvY2sgbWF0Y2ggKi8KKyAgICBmb3IgKHkgPSAwLCBpbmRleCA9IGNvdW50ID0gMDsgeSA8IDE2OyB5KyssIGluZGV4ICs9IHNyY0N1cnJTdGVwIC0gMTYpCisgICAgeworICAgICAgICBmb3IoeCA9IDA7IHggPCAxNjsgeCsrLCBjb3VudCsrLCBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWZbY291bnRdID0gcFNyY0N1cnJCdWZbaW5kZXhdOworICAgICAgICB9CisgICAgfQorICAgIGZvcih5ID0gMCwgaW5kZXggPSAwOyB5IDwgMjsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgMjsgeCsrLGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChwTUJJbmZvWzBdICE9IE5VTEwpICYmIChwTUJJbmZvWzBdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxW2luZGV4XSA9ICYocE1CSW5mb1swXS0+cE1WMFt5XVt4XSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbaW5kZXhdID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKChwTUJJbmZvWzFdICE9IE5VTEwpICYmIChwTUJJbmZvWzFdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyW2luZGV4XSA9ICYocE1CSW5mb1sxXS0+cE1WMFt5XVt4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMltpbmRleF0gPSBOVUxMOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKChwTUJJbmZvWzNdICE9IE5VTEwpICYmIChwTUJJbmZvWzNdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzW2luZGV4XSA9ICYocE1CSW5mb1szXS0+cE1WMFt5XVt4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1tpbmRleF0gPSBOVUxMOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwkvKiBDYWxjdWxhdGluZyBTQUQgYXQgTVYoMCwwKSAqLworCWFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmLAorCQkJCQkgIDE2LAorCQkJCQkgIHBTcmNSZWZCdWYsCisJCQkJCSAgc3JjUmVmU3RlcCwKKwkJCQkJICAmU2FkLAorCQkJCQkgIDE2LAorCQkJCQkgIDE2KTsKKwkqcERzdFNBRCA9IFNhZDsKKworICAgIC8qIE1vZGUgZGVjaXNpb24gZm9yIE5PVF9DT0RFRCBNQiAqLworCWlmKCpwRHN0U0FEID09IDApCisJeworICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR4ID0gMDsKKyAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSA9IDA7CisgICAgICAgICpwRHN0U0FEICAgPSAwOworCQlyZXR1cm4gT01YX1N0c19Ob0VycjsKKwl9CisKKyAgICBvbXhWQ000UDJfRmluZE1WcHJlZCgKKyAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbMF0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyWzBdLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1swXSwKKyAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgIC8qIEludGVyIDEgTVYgKi8KKyAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF8xNngxNigKKyAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgcFJlZlJlY3QsCisgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwKKyAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgcE1FUGFyYW1zLAorICAgICAgICAmZHN0TVYxNngxNiwKKyAgICAgICAgJmRzdFNBRDE2eDE2KTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIGFsbCB3aXRoIDEgTVYgdmFsdWVzICovCisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSA9IGRzdE1WMTZ4MTYuZHk7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keSA9IGRzdE1WMTZ4MTYuZHk7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keSA9IGRzdE1WMTZ4MTYuZHk7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keSA9IGRzdE1WMTZ4MTYuZHk7IAorICAgIAorICAgICpwRHN0U0FEICAgPSBkc3RTQUQxNngxNjsgICAgICAgCisgICAgCisgICAgaWYgKHBNRVBhcmFtcy0+c2VhcmNoRW5hYmxlOHg4KQorICAgIHsKKyAgICAgICAgLyogSW50ZXIgNE1WICovCisgICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVswXSksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBwRHN0QmxvY2tTQURbMF0gPSBkc3RTQUQ4eDg7CisgICAgICAgICpwRHN0U0FEID0gZHN0U0FEOHg4OworICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCArPSA4OworICAgICAgICBwU3JjUmVmQnVmICs9IDg7CisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMV0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzFdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMV0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgCisgICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVsxXSksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBwRHN0QmxvY2tTQURbMV0gPSBkc3RTQUQ4eDg7CisgICAgICAgICpwRHN0U0FEICs9IGRzdFNBRDh4ODsKKyAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggLT0gODsKKyAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnkgKz0gODsKKyAgICAgICAgcFNyY1JlZkJ1ZiArPSAoc3JjUmVmU3RlcCAqIDgpIC0gODsKKyAgICAgICAgCisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVsyXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMl0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzJdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMF0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzBdKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBEc3RCbG9ja1NBRFsyXSA9IGRzdFNBRDh4ODsKKyAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OworICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCArPSA4OworICAgICAgICBwU3JjUmVmQnVmICs9IDg7CisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVszXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbM10sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzNdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMV0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAzKTsKKyAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzFdKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBEc3RCbG9ja1NBRFszXSA9IGRzdFNBRDh4ODsKKyAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OyAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8qIENoZWNraW5nIGlmIDRNViBpcyBlcXVhbCB0byAxTVYgKi8KKyAgICAgICAgaWYgKAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpIHx8CisgICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0uZHkgIT0gZHN0TVYxNngxNi5keSkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR4ICE9IGRzdE1WMTZ4MTYuZHgpIHx8CisgICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keSAhPSBkc3RNVjE2eDE2LmR5KSB8fAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpCisgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2VsZWN0IHRoZSA0IE1WICovCisgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5URVI0VjsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvKiBmaW5kaW5nIHRoZSBlcnJvciBpbiBpbnRyYSBtb2RlICovCisgICAgZm9yIChjb3VudCA9IDAsIGF2ZXJhZ2UgPSAwOyBjb3VudCA8IDI1NiA7IGNvdW50KyspCisgICAgeworICAgICAgICBhdmVyYWdlID0gYXZlcmFnZSArIHBUZW1wU3JjQ3VyckJ1Zltjb3VudF07CisgICAgfQorICAgIGF2ZXJhZ2UgPSBhdmVyYWdlLzI1NjsKKyAgICAKKwlpbnRyYVNBRCA9IDA7CisKKyAgICAvKiBJbnRyYSBTQUQgY2FsY3VsYXRpb24gKi8KKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTYgOyBjb3VudCsrKQorICAgIHsKKyAgICAgICAgaW50cmFTQUQgKz0gYXJtQWJzICgocFRlbXBTcmNDdXJyQnVmW2NvdW50XSkgLSAoYXZlcmFnZSkpOworICAgIH0KKyAgICAKKwkvKiBVc2luZyB0aGUgTVBFRzQgVk0gZm9ybXVsYSBmb3IgaW50cmEvaW50ZXIgbW9kZSBkZWNpc2lvbiAKKwkgICBWYXIgPCAoU0FEIC0gMipOQikgd2hlcmUgTkIgPSBOXjIgaXMgdGhlIG51bWJlciBvZiBwaXhlbHMKKwkgICBvZiB0aGUgbWFjcm9ibG9jay4qLworCisgICAgaWYgKGludHJhU0FEIDw9ICgqcERzdFNBRCAtIDUxMikpCisgICAgeworICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5UUkE7CisgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggPSAwOworICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gMDsKKyAgICAgICAgKnBEc3RTQUQgICA9IGludHJhU0FEOworICAgICAgICBwRHN0QmxvY2tTQURbMF0gPSAweEZGRkY7CisgICAgICAgIHBEc3RCbG9ja1NBRFsxXSA9IDB4RkZGRjsKKyAgICAgICAgcERzdEJsb2NrU0FEWzJdID0gMHhGRkZGOworICAgICAgICBwRHN0QmxvY2tTQURbM10gPSAweEZGRkY7CisgICAgfQorCisgICAgaWYocFNyY0RzdE1CQ3Vyci0+bWJUeXBlID09IE9NWF9WQ19JTlRFUikKKyAgICB7CisgICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAoc3JjUmVmU3RlcCAqIGRzdE1WMTZ4MTYuZHkpICsgZHN0TVYxNngxNi5keDsKKyAgICAKKyAgICAgIGlmKChkc3RNVjE2eDE2LmR4ICYgMHgxKSAmJiAoZHN0TVYxNngxNi5keSAmIDB4MSkpCisgICAgICB7CisgICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0hBTEZfUElYRUxfWFk7CisgICAgICB9CisgICAgICBlbHNlIGlmKGRzdE1WMTZ4MTYuZHggJiAweDEpCisgICAgICB7CisgICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0hBTEZfUElYRUxfWDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoZHN0TVYxNngxNi5keSAmIDB4MSkKKyAgICAgIHsKKyAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9ZOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmVkaWN0VHlwZSA9IE9NWF9WQ19JTlRFR0VSX1BJWEVMOworICAgICAgfQorICAgICAgCisgICAgICBwRHN0ID0gYXJtQWxpZ25UbzhCeXRlcygmKGFEc3RbMF0pKTsKKyAgICAgIC8qIENhbGN1bGF0aW5nIEJsb2NrIFNBRCBhdCBNVihkc3RNVjE2eDE2LmR4LGRzdE1WMTZ4MTYuZHkpICovCisJICAvKiBCbG9jayAwICovCisgICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKKyAgICAKKyAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCisgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgOCk7CisgICAgICBwRHN0QmxvY2tTQURbMF0gPSBTYWQ7CisgICAKKyAgICAgIC8qIEJsb2NrIDEgKi8KKyAgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2socFRlbXBTcmNSZWZCdWYgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsJCQkJCSAgCisKKyAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgpOworICAgICAgcERzdEJsb2NrU0FEWzFdID0gU2FkOworCQorICAgICAgLyogQmxvY2sgMiAqLworICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwKjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKKworICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyAoMTYqOCksCisgICAgICAgICAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgJlNhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICA4KTsKKyAgICAgIHBEc3RCbG9ja1NBRFsyXSA9IFNhZDsKKworCSAgLyogQmxvY2sgMyAqLworICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwKjgpICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMtPnJuZFZhbCk7CisKKyAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmICsgKDE2KjgpICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgpOworICAgICAgcERzdEJsb2NrU0FEWzNdID0gU2FkOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEzZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKQEAgLTAsMCArMSwxMjEgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9TMTYuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIG1vZHVsZXMgZm9yIEFDIERDIHByZWRpY3Rpb24KKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCisgKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCisgKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAorICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCisgKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAorICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKKyAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKKyAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAorICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAorICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAorICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAorICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KKyAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorICkKK3sKKyAgICBPTVhfVTggZmxhZzsKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGN1clFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGN1clFQID4gMzEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPiAzMSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IDEpICYmIChwcmVkRGlyICE9IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmUm93KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZkNvbCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZsYWcgPSAwOworICAgIHJldHVybiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCisgICAgICAgIHBTcmNEc3QsCisgICAgICAgIE5VTEwsCisgICAgICAgIHBQcmVkQnVmUm93LAorICAgICAgICBwUHJlZEJ1ZkNvbCwKKyAgICAgICAgY3VyUVAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wLAorICAgICAgICBmbGFnLAorICAgICAgICBOVUxMKTsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2NGY3MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCkBAIC0wLDAgKzEsMTE3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIFF1YW50aXphdGlvbgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9VOCBRUCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKyAgICBPTVhfSU5UIGNvZWZmQ291bnQ7CisgICAgT01YX0lOVCBmU2lnbjsKKyAgICBPTVhfSU5UIG1heENscEFDID0gMCwgbWluQ2xwQUMgPSAwOworICAgIE9NWF9JTlQgbWF4Q2xwREMgPSAwLCBtaW5DbHBEQyA9IDA7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgLyogT25lIGFyZ3VtZW50IGNoZWNrIGlzIGRlbGF5ZWQgdW50aWwgd2UgaGF2ZSBhc2NlcnRhaW5lZCB0aGF0ICAqLworICAgLyogcFFNYXRyaXggaXMgbm90IE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIAorICAgIC8qIFNldCB0aGUgQ2xpcCBSYW5nZSBiYXNlZCBvbiBTVkggb24vb2ZmICovCisgICAgaWYoc2hvcnRWaWRlb0hlYWRlciA9PSAxKQorICAgIHsKKyAgICAgICBtYXhDbHBEQyA9IDI1NDsKKyAgICAgICBtaW5DbHBEQyA9IDE7CisgICAgICAgbWF4Q2xwQUMgPSAxMjc7CisgICAgICAgbWluQ2xwQUMgPSAtMTI3OyAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1heENscERDID0gMjA0NzsKKyAgICAgICAgbWluQ2xwREMgPSAtMjA0NzsKKyAgICAgICAgbWF4Q2xwQUMgPSAyMDQ3OworICAgICAgICBtaW5DbHBBQyA9IC0yMDQ3OyAgIAorICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCisgICAgZm9yIChjb2VmZkNvdW50ID0gMDsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCisgICAgeworICAgICAgICBmU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSAoYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoUVAvMikpLygyICogUVApOworICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IGZTaWduOworICAgICAgICAKKyAgICAgICAgLyogQ2xpcCAqLworICAgICAgICBpZiAoY29lZmZDb3VudCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQorICAgICAgICAgICAoT01YX1MxNikgYXJtQ2xpcCAobWluQ2xwREMsIG1heENscERDLCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9CisgICAgICAgICAgIChPTVhfUzE2KSBhcm1DbGlwIChtaW5DbHBBQywgbWF4Q2xwQUMsIHBTcmNEc3RbY29lZmZDb3VudF0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgUXVhbnRpemF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCisgKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCisgKiAgICAgICAgICAgIDYuMS4zLjguIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JKAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1U4IFFQLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisJIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorICkKK3sKKworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvciAqLworICAgIE9NWF9JTlQgZGNTY2FsZXIgPSAwLCBjb2VmZkNvdW50LGZTaWduOworICAgIE9NWF9JTlQgbWF4Q2xwQUMsIG1pbkNscEFDOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPj0gMTApKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgIC8qIE9uZSBhcmd1bWVudCBjaGVjayBpcyBkZWxheWVkIHVudGlsIHdlIGhhdmUgYXNjZXJ0YWluZWQgdGhhdCAgKi8KKyAgIC8qIHBRTWF0cml4IGlzIG5vdCBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIAorICAgIC8qIFNldCB0aGUgQ2xpcCBSYW5nZSBiYXNlZCBvbiBTVkggb24vb2ZmICovCisgICAgaWYoc2hvcnRWaWRlb0hlYWRlciA9PSAxKQorICAgIHsKKyAgICAgICAgbWF4Q2xwQUMgPSAxMjc7CisgICAgICAgIG1pbkNscEFDID0gLTEyNzsKKyAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KKyAgICAgICAgcFNyY0RzdFswXSA9IGFybUludERpdkF3YXlGcm9tWmVybyAocFNyY0RzdFswXSwgZGNTY2FsZXIpOworICAgIAorICAgICAgICAvKiBDbGlwIGJldHdlZW4gMSBhbmQgMjU0ICovCisgICAgICAgIHBTcmNEc3RbMF0gPSAoT01YX1MxNikgYXJtQ2xpcCAoMSwgMjU0LCBwU3JjRHN0WzBdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWF4Q2xwQUMgPSAyMDQ3OworICAgICAgICBtaW5DbHBBQyA9IC0yMDQ3OyAgIAorICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIERDIHNjYWxlciB2YWx1ZSAqLworICAgICAgICBpZiAoKGJsb2NrSW5kZXggIDwgNCkgfHwgKGJsb2NrSW5kZXggID4gNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gMiAqIFFQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gOSAmJiBRUCA8PSAyNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IFFQICsgODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9ICgyICogUVApIC0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYmxvY2tJbmRleCA8IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSAyNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IChRUCArIDEzKS8yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgLSA2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KKyAgICAgICAgcFNyY0RzdFswXSA9IGFybUludERpdkF3YXlGcm9tWmVybyAocFNyY0RzdFswXSwgZGNTY2FsZXIpOworICAgIH0KKyAgICAKKyAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCisgICAgZm9yIChjb2VmZkNvdW50ID0gMTsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCisgICAgeworICAgICAgICBmU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkvKDIgKiBRUCk7CisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gZlNpZ247CisKKyAgICAgICAgLyogQ2xpcCAqLworICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KKyAgICAgICAgKE9NWF9TMTYpIGFybUNsaXAgKG1pbkNscEFDLCBtYXhDbHBBQywgcFNyY0RzdFtjb2VmZkNvdW50XSk7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBkZTVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKQEAgLTAsMCArMSw5NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciBpbnZlcnNlIFF1YW50aXphdGlvbgorICogCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9JTlQgUVAKKwkgKQoreworCisgICAgT01YX0lOVCBjb2VmZkNvdW50LCBTaWduOworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KKyAgICBmb3IgKGNvZWZmQ291bnQgPSAwOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIHNpZ24gKi8KKyAgICAgICAgU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOworICAgICAgICAgICAgICAKKyAgICAgICAgLyogUXVhbnRpemUgdGhlIGNvZWZmICovCisgICAgICAgIGlmIChRUCAmIDB4MSkKKyAgICAgICAgeworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKSAqIFFQOworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUVAgLSAxOworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOworICAgICAgICB9CisgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtjb2VmZkNvdW50XSk7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0NmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCkBAIC0wLDAgKzEsMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIGludmVyc2UgUXVhbnRpemF0aW9uCisgKiAKKyAqLyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisKKyAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gZXJyb3IgKi8KKyAgICBPTVhfSU5UIGRjU2NhbGVyID0gMCwgY29lZmZDb3VudCwgU2lnbjsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoKHZpZGVvQ29tcCAhPSBPTVhfVkNfTFVNSU5BTkNFKSAmJiAodmlkZW9Db21wICE9IE9NWF9WQ19DSFJPTUlOQU5DRSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgLyogQ2FsY3VsYXRlIHRoZSBEQyBzY2FsZXIgdmFsdWUgKi8KKyAgICAKKyAgICAvKiBsaW5lYXIgaW50cmEgREMgbW9kZSAqLworICAgIGlmKHNob3J0VmlkZW9IZWFkZXIpCisgICAgeworICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgfQorICAgIC8qIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlICovCisgICAgZWxzZQorICAgIHsKKyAgICAKKyAgICAgICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUVAgPj0gMSAmJiBRUCA8PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDUgJiYgUVAgPD0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDIgKiBRUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDkgJiYgUVAgPD0gMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCArIDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAoMiAqIFFQKSAtIDE2OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDI0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKFFQICsgMTMpLzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCAtIDY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogRGVxdWFudCB0aGUgREMgdmFsdWUsIHRoaXMgYXBwbGllcyB0byBib3RoIHRoZSBtZXRob2RzICovCisgICAgcFNyY0RzdFswXSA9IHBTcmNEc3RbMF0gKiBkY1NjYWxlcjsKKworICAgIC8qIFNhdHVyYXRlICovCisgICAgcFNyY0RzdFswXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0WzBdKTsKKworICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KKyAgICBmb3IgKGNvZWZmQ291bnQgPSAxOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIHNpZ24gKi8KKyAgICAgICAgU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCisKKyAgICAgICAgaWYgKFFQICYgMHgxKQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVA7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVAgLSAxOworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOworICAgICAgICB9CisKKyAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBjNTliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwpAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgRENULT5xdWFudCBhbmQgcmVjb25zdHJ1Y3RpbmcgdGhlIGludGVyIHRleHR1cmUgZGF0YQorICogCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIoCisgICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfUzE2ICogcFJlYywKKyAgICAgT01YX1U4IFFQLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkIAorICAgIDggbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmZmVyWzcyXTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZmZlcjsKKyAgICBPTVhfSU5UIGk7CisgICAgICAgIAorICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWZmZXIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmZmVyKTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBSZWMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBvbXhWQ000UDJfRENUOHg4YmxrIChwU3JjLCBwRHN0KTsKKyAgICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JKAorICAgICBwRHN0LAorICAgICBRUCwKKyAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICB7CisgICAgICAgIHBUZW1wQnVmZmVyW2ldID0gcERzdFtpXTsKKyAgICB9CisKKyAgICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBwVGVtcEJ1ZmZlciwKKyAgICAgUVApOworICAgIG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZmZlciwgcFJlYyk7CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ0NGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwpAQCAtMCwwICsxLDI2MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgRENULT5xdWFudCBhbmQgcmVjb25zdHJ1Y3RpbmcgdGhlIGludHJhIHRleHR1cmUgZGF0YQorICogCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCisgKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCisgKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAorICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAorICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKKyAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAorICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCisgKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAorICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKKyAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKKyAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKKyAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKKyAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKKyAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAorICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKKyAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCisgKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAorICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKKyAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCisgKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCisgKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKKyAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAorICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKKyAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKKyAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCisgKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKKyAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAorICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCisgKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKKyAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCisgKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAorICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCisgKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCisgKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAorICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAorICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAorICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKKyAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgIHBTcmMsIHBSZWMuICAKKyAqCisgKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCisgKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4ICogcFJlYywKKyAgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCisgICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKKyAgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfVTggY3VyUXAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAorICAgIDggbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2IHRlbXBCdWYzWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjIsKnBUZW1wQnVmMzsKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7CisgICAgT01YX1U4ICBmbGFnOworICAgIE9NWF9JTlQgeCwgeSwgY291bnQsIHByZWREaXI7CisgICAgT01YX0lOVCBwcmVkUVAsIEFDUHJlZEZsYWc7CisgICAgCisKKyAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLworICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYxKTsKKyAgICBwVGVtcEJ1ZjIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMik7CisgICAgcFRlbXBCdWYzID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjMpOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBSZWMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFByZUFDUHJlZGljdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFN1bUVyciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFFwQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoZHN0U3RlcCA8PSAwKSB8fAorICAgICAgICAgICAgICAgIChkc3RTdGVwICYgNykgfHwgKHNyY1N0ZXAgJiA3KQorICAgICAgICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPiA5KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgYXJtUmV0QXJnRXJySWYoKGN1clFwIDw9IDApIHx8IChjdXJRcCA+PTMyKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisKKyAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLworICAgIGlmIChibG9ja0luZGV4IDw9IDMpCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7CisgICAgfQorICAgIC8qIENvbnZlcnRpbmcgZnJvbSAyLWQgdG8gMS1kIGJ1ZmZlciAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsgeSA8IDg7IHkrKykKKyAgICB7CisgICAgICAgIGZvcih4PSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcEJ1ZjFbY291bnRdID0gcFNyY1soeSpzcmNTdGVwKSArIHhdOworICAgICAgICB9CisgICAgfQorCisgICAgb214VkNNNFAyX0RDVDh4OGJsayAgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKKyAgICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JKAorICAgICAgICBwVGVtcEJ1ZjIsCisgICAgICAgIGN1clFwLAorICAgICAgICBibG9ja0luZGV4LAorICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKKworICAgIC8qIENvbnZlcnRpbmcgZnJvbSAxLUQgdG8gMi1EIGJ1ZmZlciAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsgeSA8IDg7IHkrKykKKyAgICB7CisgICAgICAgIGZvcih4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogc3RvcmluZyB0ZW1wYnVmMiB0byB0ZW1wYnVmMSAqLworICAgICAgICAgICAgcFRlbXBCdWYxW2NvdW50XSA9IHBUZW1wQnVmMltjb3VudF07CisgICAgICAgICAgICBwRHN0Wyh5KmRzdFN0ZXApICsgeF0gPSBwVGVtcEJ1ZjJbY291bnRdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQUMgYW5kIERDIHByZWRpY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcFByZWRCdWZSb3csCisgICAgICAgIHBQcmVkQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFwQnVmKTsKKworICAgIGFybVJldERhdGFFcnJJZigoKHByZWRRUCA8PSAwKSB8fCAocHJlZFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZsYWcgPSAxOworICAgIGlmICgqcFN1bUVyciA8IDApCisgICAgeworICAgICAgICBBQ1ByZWRGbGFnID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQUNQcmVkRmxhZyA9IDE7CisgICAgfQorCisgICAgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICAgICBwVGVtcEJ1ZjIsCisgICAgICAgIHBQcmVBQ1ByZWRpY3QsCisgICAgICAgIHBQcmVkQnVmUm93LAorICAgICAgICBwUHJlZEJ1ZkNvbCwKKyAgICAgICAgY3VyUXAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wLAorICAgICAgICBmbGFnLAorICAgICAgICBwU3VtRXJyKTsKKworICAgIC8qIFJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIGRhdGEgKi8KKyAgICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAorICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgIGN1clFwLAorICAgICAgICB2aWRlb0NvbXAsCisgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgIG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMyk7CisgICAgZm9yKGNvdW50ID0gMDsgY291bnQgPCA2NDsgY291bnQrKykKKyAgICB7CisgICAgICAgIHBSZWNbY291bnRdID0gYXJtTWF4KDAscFRlbXBCdWYzW2NvdW50XSk7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTM2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKKworI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCitjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjZjJlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jCkBAIC0wLDAgKzEsNzYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENIRUNLX01FTU9SWV9VU0FHRSBwcmludHMgYW5kIHN1bXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgaW4gY2FsbHMgdG8KKyAqIEgyNjRTd0RlY01hbGxvYygpICovCisvKiAjZGVmaW5lIENIRUNLX01FTU9SWV9VU0FHRSAqLworCisvKiBfTk9fT1VUIGRpc2FibGVzIG91dHB1dCBmaWxlIHdyaXRpbmcgKi8KKy8qICNkZWZpbmUgX05PX09VVCAqLworCisvKiBEZWJ1ZyBwcmludHMgKi8KKyNkZWZpbmUgREVCVUcoYXJndikgcHJpbnRmIGFyZ3YKKworLyogQ1ZTIHRhZyBuYW1lIGZvciBpZGVudGlmaWNhdGlvbiAqLworY29uc3QgY2hhciB0YWdOYW1lWzI1Nl0gPSAiJE5hbWU6IEZJUlNUX0FORFJPSURfQ09QWVJJR0hUICQiOworCit2b2lkIFdyaXRlT3V0cHV0KGNoYXIgKmZpbGVuYW1lLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpOwordTMyIE5leHRQYWNrZXQodTggKipwU3RybSk7Cit1MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAorICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpOworCisvKiBHbG9iYWwgdmFyaWFibGVzIGZvciBzdHJlYW0gaGFuZGxpbmcgKi8KK3U4ICpzdHJlYW1TdG9wID0gTlVMTDsKK3UzMiBwYWNrZXRpemUgPSAwOwordTMyIG5hbFVuaXRTdHJlYW0gPSAwOworRklMRSAqZm91dHB1dCA9IE5VTEw7CisKKyNpZmRlZiBTT0NfREVTSUdORVIKKworLy8gSW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZGVmaW5lZCBpbiBJbml0Q2FjaGUucworZXh0ZXJuIHZvaWQgY2FjaGVfaW5pdCh2b2lkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICAkU3ViJCRtYWluCisKKyAgICBQdXJwb3NlOgorICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBDIGxpYnJhcnkgaW5pdGlhbGlzYXRpb24gYW5kCisgICAgICAgIGJlZm9yZSBtYWluLiBJdHMgcHVycG9zZSBpcyB0byBkbyBhbnkgZnVydGhlciBpbml0aWFsaXNhdGlvbiBiZWZvcmUgdGhlCisgICAgICAgIGFwcGxpY2F0aW9uIHN0YXJ0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50ICRTdWIkJG1haW4oY2hhciBhcmdjLCBjaGFyICogYXJndltdKQoreworICBjYWNoZV9pbml0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIHNvbWUgZXh0cmEgc2V0dXAgd29yayBzZXR0aW5nIHVwIGNhY2hlcworICByZXR1cm4gJFN1cGVyJCRtYWluKGFyZ2MsIGFyZ3YpOyAvLyBjYWxscyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24KK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIG1haW4KKworICAgIFB1cnBvc2U6CisgICAgICAgIG1haW4gZnVuY3Rpb24gb2YgZGVjb2RlciB0ZXN0YmVuY2guIFByb3ZpZGVzIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UKKyAgICAgICAgd2l0aCBmaWxlIEkvTyBmb3IgSC4yNjQgZGVjb2Rlci4gUHJpbnRzIG91dCB0aGUgdXNhZ2UgaW5mb3JtYXRpb24KKyAgICAgICAgd2hlbiBleGVjdXRlZCB3aXRob3V0IGFyZ3VtZW50cy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCisgICAgdTMyIGksIHRtcDsKKyAgICB1MzIgbWF4TnVtUGljcyA9IDA7CisgICAgdTggKmJ5dGVTdHJtU3RhcnQ7CisgICAgdTggKmltYWdlRGF0YTsKKyAgICB1OCAqdG1wSW1hZ2UgPSBOVUxMOworICAgIHUzMiBzdHJtTGVuOworICAgIHUzMiBwaWNTaXplOworICAgIEgyNjRTd0RlY0luc3QgZGVjSW5zdDsKKyAgICBIMjY0U3dEZWNSZXQgcmV0OworICAgIEgyNjRTd0RlY0lucHV0IGRlY0lucHV0OworICAgIEgyNjRTd0RlY091dHB1dCBkZWNPdXRwdXQ7CisgICAgSDI2NFN3RGVjUGljdHVyZSBkZWNQaWN0dXJlOworICAgIEgyNjRTd0RlY0luZm8gZGVjSW5mbzsKKyAgICBIMjY0U3dEZWNBcGlWZXJzaW9uIGRlY1ZlcjsKKyAgICB1MzIgcGljRGVjb2RlTnVtYmVyOworICAgIHUzMiBwaWNEaXNwbGF5TnVtYmVyOworICAgIHUzMiBudW1FcnJvcnMgPSAwOworICAgIHUzMiBjcm9wRGlzcGxheSA9IDA7CisgICAgdTMyIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMDsKKworICAgIEZJTEUgKmZpbnB1dDsKKworICAgIGNoYXIgb3V0RmlsZU5hbWVbMjU2XSA9ICIiOworCisgICAgLyogUHJpbnQgQVBJIHZlcnNpb24gbnVtYmVyICovCisgICAgZGVjVmVyID0gSDI2NFN3RGVjR2V0QVBJVmVyc2lvbigpOworICAgIERFQlVHKCgiSC4yNjQgRGVjb2RlciBBUEkgdiVkLiVkXG4iLCBkZWNWZXIubWFqb3IsIGRlY1Zlci5taW5vcikpOworCisgICAgLyogUHJpbnQgdGFnIG5hbWUgaWYgJy1UJyBhcmd1bWVudCBwcmVzZW50ICovCisgICAgaWYgKCBhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi1UIikgPT0gMCApCisgICAgeworICAgICAgICBERUJVRygoIiVzXG4iLCB0YWdOYW1lKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIENoZWNrIHRoYXQgZW5vdWdoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZ2l2ZW4sIGlmIG5vdCAtPiBwcmludCB1c2FnZQorICAgICAqIGluZm9ybWF0aW9uIG91dCAqLworICAgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICAgIERFQlVHKCgKKyAgICAgICAgICAgICJVc2FnZTogJXMgWy1Obl0gWy1Pb3V0ZmlsZV0gWy1QXSBbLVVdIFstQ10gWy1SXSBbLVRdIGZpbGUuaDI2NFxuIiwKKyAgICAgICAgICAgIGFyZ3ZbMF0pKTsKKyAgICAgICAgREVCVUcoKCJcdC1ObiBmb3JjZXMgZGVjb2RpbmcgdG8gc3RvcCBhZnRlciBuIHBpY3R1cmVzXG4iKSk7CisjaWYgZGVmaW5lZChfTk9fT1VUKQorICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIG91dHB1dCB3cml0aW5nIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZVxuIikpOworI2Vsc2UKKyAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSB3cml0ZSBvdXRwdXQgdG8gXCJvdXRmaWxlXCIgKGRlZmF1bHQgb3V0X3d4eHhoeXl5Lnl1dilcbiIpKTsKKyAgICAgICAgREVCVUcoKCJcdC1Pbm9uZSBkb2VzIG5vdCB3cml0ZSBvdXRwdXRcbiIpKTsKKyNlbmRpZgorICAgICAgICBERUJVRygoIlx0LVAgcGFja2V0LWJ5LXBhY2tldCBtb2RlXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtVSBOQUwgdW5pdCBzdHJlYW0gbW9kZVxuIikpOworICAgICAgICBERUJVRygoIlx0LUMgZGlzcGxheSBjcm9wcGVkIGltYWdlIChkZWZhdWx0IGRlY29kZWQgaW1hZ2UpXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtUiBkaXNhYmxlIERQQiBvdXRwdXQgcmVvcmRlcmluZ1xuIikpOworICAgICAgICBERUJVRygoIlx0LVQgdG8gcHJpbnQgdGFnIG5hbWUgYW5kIGV4aXRcbiIpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogcmVhZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisgICAgZm9yIChpID0gMTsgaSA8ICh1MzIpKGFyZ2MtMSk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU4iLCAyKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbWF4TnVtUGljcyA9ICh1MzIpYXRvaShhcmd2W2ldKzIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTyIsIDIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJjcHkob3V0RmlsZU5hbWUsIGFyZ3ZbaV0rMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVAiKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFja2V0aXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItVSIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBuYWxVbml0U3RyZWFtID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItQyIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjcm9wRGlzcGxheSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVIiKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nLCBmaWxlIG5hbWUgZ2l2ZW4gYnkgdXNlci4gSWYgZmlsZSBvcGVuCisgICAgICogZmFpbHMgLT4gZXhpdCAqLworICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy0xXSwicmIiKTsKKyAgICBpZiAoZmlucHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBPUEVOIElOUFVUIEZJTEVcbiIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNoZWNrIHNpemUgb2YgdGhlIGlucHV0IGZpbGUgLT4gbGVuZ3RoIG9mIHRoZSBzdHJlYW0gaW4gYnl0ZXMgKi8KKyAgICBmc2VlayhmaW5wdXQsMEwsU0VFS19FTkQpOworICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7CisgICAgcmV3aW5kKGZpbnB1dCk7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmVhbSBidWZmZXIuIGlmIHVuc3VjY2Vzc2Z1bCAtPiBleGl0ICovCisgICAgYnl0ZVN0cm1TdGFydCA9ICh1OCAqKW1hbGxvYyhzaXplb2YodTgpKnN0cm1MZW4pOworICAgIGlmIChieXRlU3RybVN0YXJ0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBBTExPQ0FURSBNRU1PUllcbiIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHJlYWQgaW5wdXQgc3RyZWFtIGZyb20gZmlsZSB0byBidWZmZXIgYW5kIGNsb3NlIGlucHV0IGZpbGUgKi8KKyAgICBmcmVhZChieXRlU3RybVN0YXJ0LCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOworICAgIGZjbG9zZShmaW5wdXQpOworCisgICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVyLiBJZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLworICAgIHJldCA9IEgyNjRTd0RlY0luaXQoJmRlY0luc3QsIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nKTsKKyAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICB7CisgICAgICAgIERFQlVHKCgiREVDT0RFUiBJTklUSUFMSVpBVElPTiBGQUlMRURcbiIpKTsKKyAgICAgICAgZnJlZShieXRlU3RybVN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlICovCisgICAgc3RyZWFtU3RvcCA9IGJ5dGVTdHJtU3RhcnQgKyBzdHJtTGVuOworICAgIGRlY0lucHV0LnBTdHJlYW0gPSBieXRlU3RybVN0YXJ0OworICAgIGRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOworICAgIGRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOworCisgICAgLyogZ2V0IHBvaW50ZXIgdG8gbmV4dCBwYWNrZXQgYW5kIHRoZSBzaXplIG9mIHBhY2tldAorICAgICAqIChmb3IgcGFja2V0aXplIG9yIG5hbFVuaXRTdHJlYW0gbW9kZXMpICovCisgICAgaWYgKCAodG1wID0gTmV4dFBhY2tldCgmZGVjSW5wdXQucFN0cmVhbSkpICE9IDAgKQorICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gdG1wOworCisgICAgcGljRGVjb2RlTnVtYmVyID0gcGljRGlzcGxheU51bWJlciA9IDE7CisgICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIFBpY3R1cmUgSUQgaXMgdGhlIHBpY3R1cmUgbnVtYmVyIGluIGRlY29kaW5nIG9yZGVyICovCisgICAgICAgIGRlY0lucHV0LnBpY0lkID0gcGljRGVjb2RlTnVtYmVyOworCisgICAgICAgIC8qIGNhbGwgQVBJIGZ1bmN0aW9uIHRvIHBlcmZvcm0gZGVjb2RpbmcgKi8KKyAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY0luc3QsICZkZWNJbnB1dCwgJmRlY091dHB1dCk7CisKKyAgICAgICAgc3dpdGNoKHJldCkKKyAgICAgICAgeworCisgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKKyAgICAgICAgICAgICAgICAvKiBTdHJlYW0gaGVhZGVycyB3ZXJlIHN1Y2Nlc3NmdWxseSBkZWNvZGVkCisgICAgICAgICAgICAgICAgICogLT4gc3RyZWFtIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgcXVlcnkgbm93ICovCisKKyAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY0luc3QsICZkZWNJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgREVCVUcoKCJQcm9maWxlICVkXG4iLCBkZWNJbmZvLnByb2ZpbGUpKTsKKworICAgICAgICAgICAgICAgIERFQlVHKCgiV2lkdGggJWQgSGVpZ2h0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCkpOworCisgICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJDcm9wcGluZyBwYXJhbXM6ICglZCwgJWQpICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BMZWZ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQpKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBDcm9wcGVkIGZyYW1lIHNpemUgaW4gcGxhbmFyIFlVViA0OjI6MCAqLworICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wSW1hZ2UgPSBtYWxsb2MocGljU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXBJbWFnZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBEZWNvZGVyIG91dHB1dCBmcmFtZSBzaXplIGluIHBsYW5hciBZVVYgNDoyOjAgKi8KKyAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8ucGljV2lkdGggKiBkZWNJbmZvLnBpY0hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBERUJVRygoInZpZGVvUmFuZ2UgJWQsIG1hdHJpeENvZWZmaWNpZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVjSW5mby52aWRlb1JhbmdlLCBkZWNJbmZvLm1hdHJpeENvZWZmaWNpZW50cykpOworCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKworICAgICAgICAgICAgICAgIC8qIElmIC1PIG9wdGlvbiBub3QgdXNlZCwgZ2VuZXJhdGUgZGVmYXVsdCBmaWxlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBpZiAob3V0RmlsZU5hbWVbMF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihvdXRGaWxlTmFtZSwgIm91dF93JWRoJWQueXV2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk6CisgICAgICAgICAgICAgICAgLyogUGljdHVyZSBpcyByZWFkeSBhbmQgbW9yZSBkYXRhIHJlbWFpbnMgaW4gaW5wdXQgYnVmZmVyCisgICAgICAgICAgICAgICAgICogLT4gdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKKworICAgICAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wSW1hZ2UscGljU2l6ZSkgdmFyaWFibGUgaW5pdGlhbGl6ZWQgYXQKKyAgICAgICAgICAgICAgICAgKiBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkgY2FzZSAqLworCisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICAgICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IE5leHRQYWNrZXQoJmRlY0lucHV0LnBTdHJlYW0pOworCisgICAgICAgICAgICAgICAgLyogSWYgZW5vdWdoIHBpY3R1cmVzIGRlY29kZWQgLT4gZm9yY2UgZGVjb2RpbmcgdG8gZW5kCisgICAgICAgICAgICAgICAgICogYnkgc2V0dGluZyB0aGF0IG5vIG1vcmUgc3RyZWFtIGlzIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGlmIChtYXhOdW1QaWNzICYmIHBpY0RlY29kZU51bWJlciA9PSBtYXhOdW1QaWNzKQorICAgICAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gMDsKKworICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBkZWNvZGluZyBudW1iZXIgZm9yIGV2ZXJ5IGRlY29kZWQgcGljdHVyZSAqLworICAgICAgICAgICAgICAgIHBpY0RlY29kZU51bWJlcisrOworCisgICAgICAgICAgICAgICAgLyogdXNlIGZ1bmN0aW9uIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZQorICAgICAgICAgICAgICAgICAqIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcworICAgICAgICAgICAgICAgICAqIGFyZSByZWFkeSBmb3IgZGlzcGxheSAqLworICAgICAgICAgICAgICAgIHdoaWxlICggSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDApID09CisgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBERUJVRygoIlBJQyAlZCwgdHlwZSAlcyIsIHBpY0Rpc3BsYXlOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaWNEaXNwbGF5TnVtYmVyICE9IGRlY1BpY3R1cmUucGljSWQpCisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIiwgZGVjb2RlZCBwaWMgJWQiLCBkZWNQaWN0dXJlLnBpY0lkKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNQaWN0dXJlLm5ick9mRXJyTUJzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIiwgY29uY2VhbGVkICVkXG4iLCBkZWNQaWN0dXJlLm5ick9mRXJyTUJzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgbnVtRXJyb3JzICs9IGRlY1BpY3R1cmUubmJyT2ZFcnJNQnM7CisKKyAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IGRpc3BsYXkgbnVtYmVyIGZvciBldmVyeSBkaXNwbGF5ZWQgcGljdHVyZSAqLworICAgICAgICAgICAgICAgICAgICBwaWNEaXNwbGF5TnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCxkZWNJbmZvKSBhbHdheXMgaW5pdGlhbGl6ZWQgaWYgcGljdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICogYXZhaWxhYmxlIGZvciBkaXNwbGF5ICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogV3JpdGUgb3V0cHV0IHBpY3R1cmUgdG8gZmlsZSAqLworICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLmNyb3BwaW5nRmxhZykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gQ3JvcFBpY3R1cmUodG1wSW1hZ2UsIGltYWdlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjSW5mby5jcm9wUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIHRtcEltYWdlLCBwaWNTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCBpbWFnZURhdGEsIHBpY1NpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOgorICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9FUlI6CisgICAgICAgICAgICAgICAgLyogSW5wdXQgc3RyZWFtIHdhcyBkZWNvZGVkIGJ1dCBubyBwaWN0dXJlIGlzIHJlYWR5CisgICAgICAgICAgICAgICAgICogLT4gR2V0IG1vcmUgZGF0YSAqLworICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSBOZXh0UGFja2V0KCZkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBERUJVRygoIkZBVEFMIEVSUk9SXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIH0KKyAgICAvKiBrZWVwIGRlY29kaW5nIHVudGlsIGFsbCBkYXRhIGZyb20gaW5wdXQgc3RyZWFtIGJ1ZmZlciBjb25zdW1lZCAqLworICAgIH0gd2hpbGUgKGRlY0lucHV0LmRhdGFMZW4gPiAwKTsKKworICAgIC8qIGlmIG91dHB1dCBpbiBkaXNwbGF5IG9yZGVyIGlzIHByZWZlcnJlZCwgdGhlIGRlY29kZXIgc2hhbGwgYmUgZm9yY2VkCisgICAgICogdG8gb3V0cHV0IHBpY3R1cmVzIHJlbWFpbmluZyBpbiBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyLiBVc2UgZnVuY3Rpb24KKyAgICAgKiBIMjY0U3dEZWNOZXh0UGljdHVyZSgpIHRvIG9idGFpbiBuZXh0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24KKyAgICAgKiBpcyBjYWxsZWQgdW50aWwgbm8gbW9yZSBpbWFnZXMgYXJlIHJlYWR5IGZvciBkaXNwbGF5LiBTZWNvbmQgcGFyYW1ldGVyCisgICAgICogZm9yIHRoZSBmdW5jdGlvbiBpcyBzZXQgdG8gJzEnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBlbmQgb2YgdGhlCisgICAgICogc3RyZWFtIGFuZCBhbGwgcGljdHVyZXMgc2hhbGwgYmUgb3V0cHV0ICovCisgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAxKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICB7CisgICAgICAgIERFQlVHKCgiUElDICVkLCB0eXBlICVzIiwgcGljRGlzcGxheU51bWJlciwKKyAgICAgICAgICAgIGRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlID8gIklEUiIgOiAiTk9OLUlEUiIpKTsKKyAgICAgICAgaWYgKHBpY0Rpc3BsYXlOdW1iZXIgIT0gZGVjUGljdHVyZS5waWNJZCkKKyAgICAgICAgICAgIERFQlVHKCgiLCBkZWNvZGVkIHBpYyAlZCIsIGRlY1BpY3R1cmUucGljSWQpKTsKKyAgICAgICAgaWYgKGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiLCBjb25jZWFsZWQgJWRcbiIsIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBERUJVRygoIlxuIikpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICBudW1FcnJvcnMgKz0gZGVjUGljdHVyZS5uYnJPZkVyck1CczsKKworICAgICAgICAvKiBJbmNyZW1lbnQgZGlzcGxheSBudW1iZXIgZm9yIGV2ZXJ5IGRpc3BsYXllZCBwaWN0dXJlICovCisgICAgICAgIHBpY0Rpc3BsYXlOdW1iZXIrKzsKKworICAgICAgICAvKiBXcml0ZSBvdXRwdXQgcGljdHVyZSB0byBmaWxlICovCisgICAgICAgIGltYWdlRGF0YSA9ICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZTsKKyAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAorICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0LAorICAgICAgICAgICAgICAgICZkZWNJbmZvLmNyb3BQYXJhbXMpOworICAgICAgICAgICAgaWYgKHRtcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgdG1wSW1hZ2UsIHBpY1NpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIGltYWdlRGF0YSwgcGljU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWxlYXNlIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY0luc3QpOworCisgICAgaWYgKGZvdXRwdXQpCisgICAgICAgIGZjbG9zZShmb3V0cHV0KTsKKworICAgIC8qIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKyAgICBmcmVlKGJ5dGVTdHJtU3RhcnQpOworICAgIGZyZWUodG1wSW1hZ2UpOworCisgICAgREVCVUcoKCJPdXRwdXQgZmlsZTogJXNcbiIsIG91dEZpbGVOYW1lKSk7CisKKyAgICBERUJVRygoIkRFQ09ESU5HIERPTkVcbiIpKTsKKyAgICBpZiAobnVtRXJyb3JzIHx8IHBpY0RlY29kZU51bWJlciA9PSAxKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJFUlJPUlMgRk9VTkRcbiIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgV3JpdGVPdXRwdXQKKworICAgIFB1cnBvc2U6CisgICAgICAgIFdyaXRlIHBpY3R1cmUgcG9pbnRlZCBieSBkYXRhIHRvIGZpbGUuIFNpemUgb2YgdGhlCisgICAgICAgIHBpY3R1cmUgaW4gcGl4ZWxzIGlzIGluZGljYXRlZCBieSBwaWNTaXplLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChjaGFyICpmaWxlbmFtZSwgdTggKmRhdGEsIHUzMiBwaWNTaXplKQoreworCisgICAgLyogZm91dHB1dCBpcyBnbG9iYWwgZmlsZSBwb2ludGVyICovCisgICAgaWYgKGZvdXRwdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIG9wZW4gb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcsIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGRlZmluZS4KKyAgICAgICAgICogSWYgZmlsZSBvcGVuIGZhaWxzIC0+IGV4aXQgKi8KKyAgICAgICAgaWYgKHN0cmNtcChmaWxlbmFtZSwgIm5vbmUiKSAhPSAwKQorICAgICAgICB7CisjaWYgIWRlZmluZWQoX05PX09VVCkKKyAgICAgICAgICAgIGZvdXRwdXQgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgICAgICAgICBpZiAoZm91dHB1dCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERFQlVHKCgiVU5BQkxFIFRPIE9QRU4gT1VUUFVUIEZJTEVcbiIpKTsKKyAgICAgICAgICAgICAgICBleGl0KDEwMCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmb3V0cHV0ICYmIGRhdGEpCisgICAgICAgIGZ3cml0ZShkYXRhLCAxLCBwaWNTaXplLCBmb3V0cHV0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IE5leHRQYWNrZXQKKworICAgIFB1cnBvc2U6CisgICAgICAgIEdldCB0aGUgcG9pbnRlciB0byBzdGFydCBvZiBuZXh0IHBhY2tldCBpbiBpbnB1dCBzdHJlYW0uIFVzZXMKKyAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyAncGFja2V0aXplJyBhbmQgJ25hbFVuaXRTdHJlYW0nIHRvIGRldGVybWluZSB0aGUKKyAgICAgICAgZGVjb2RlciBpbnB1dCBzdHJlYW0gbW9kZSBhbmQgJ3N0cmVhbVN0b3AnIHRvIGRldGVybWluZSB0aGUgZW5kCisgICAgICAgIG9mIHN0cmVhbS4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0cmVhbSBtb2RlczoKKyAgICAgICAgICAgIGRlZmF1bHQgLSB0aGUgd2hvbGUgc3RyZWFtIGF0IG9uY2UKKyAgICAgICAgICAgIHBhY2tldGl6ZSAtIGEgc2luZ2xlIE5BTC11bml0IHdpdGggc3RhcnQgY29kZSBwcmVmaXgKKyAgICAgICAgICAgIG5hbFVuaXRTdHJlYW0gLSBhIHNpbmdsZSBOQUwtdW5pdCB3aXRob3V0IHN0YXJ0IGNvZGUgcHJlZml4CisKKyAgICAgICAgcFN0cm0gc3RvcmVzIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHByZXZpb3VzIGRlY29kZXIgaW5wdXQgYW5kIGlzCisgICAgICAgIHJlcGxhY2VkIHdpdGggcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGVjb2RlciBpbnB1dC4KKworICAgICAgICBSZXR1cm5zIHRoZSBwYWNrZXQgc2l6ZSBpbiBieXRlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIE5leHRQYWNrZXQodTggKipwU3RybSkKK3sKKworICAgIHUzMiBpbmRleDsKKyAgICB1MzIgbWF4SW5kZXg7CisgICAgdTMyIHplcm9Db3VudDsKKyAgICB1OCAqc3RyZWFtOworICAgIHU4IGJ5dGU7CisgICAgc3RhdGljIHUzMiBwcmV2SW5kZXg9MDsKKworICAgIC8qIEZvciBkZWZhdWx0IHN0cmVhbSBtb2RlIGFsbCB0aGUgc3RyZWFtIGlzIGluIGZpcnN0IHBhY2tldCAqLworICAgIGlmICghcGFja2V0aXplICYmICFuYWxVbml0U3RyZWFtKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGluZGV4ID0gMDsKKyAgICBzdHJlYW0gPSAqcFN0cm0gKyBwcmV2SW5kZXg7CisgICAgbWF4SW5kZXggPSAodTMyKShzdHJlYW1TdG9wIC0gc3RyZWFtKTsKKworICAgIGlmIChtYXhJbmRleCA9PSAwKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICAvKiBsZWFkaW5nIHplcm9zIG9mIGZpcnN0IE5BTCB1bml0ICovCisgICAgZG8KKyAgICB7CisgICAgICAgIGJ5dGUgPSBzdHJlYW1baW5kZXgrK107CisgICAgfSB3aGlsZSAoYnl0ZSAhPSAxICYmIGluZGV4IDwgbWF4SW5kZXgpOworCisgICAgLyogaW52YWxpZCBzdGFydCBjb2RlIHByZWZpeCAqLworICAgIGlmIChpbmRleCA9PSBtYXhJbmRleCB8fCBpbmRleCA8IDMpCisgICAgeworICAgICAgICBERUJVRygoIklOVkFMSUQgQllURSBTVFJFQU1cbiIpKTsKKyAgICAgICAgZXhpdCgxMDApOworICAgIH0KKworICAgIC8qIG5hbFVuaXRTdHJlYW0gaXMgd2l0aG91dCBzdGFydCBjb2RlIHByZWZpeCAqLworICAgIGlmIChuYWxVbml0U3RyZWFtKQorICAgIHsKKyAgICAgICAgc3RyZWFtICs9IGluZGV4OworICAgICAgICBtYXhJbmRleCAtPSBpbmRleDsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0KKworICAgIHplcm9Db3VudCA9IDA7CisKKyAgICAvKiBTZWFyY2ggc3RyZWFtIGZvciBuZXh0IHN0YXJ0IGNvZGUgcHJlZml4ICovCisgICAgLypsaW50IC1lKDcxNikgd2hpbGUoMSkgdXNlZCBjb25zY2lvdXNseSAqLworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgYnl0ZSA9IHN0cmVhbVtpbmRleCsrXTsKKyAgICAgICAgaWYgKCFieXRlKQorICAgICAgICAgICAgemVyb0NvdW50Kys7CisKKyAgICAgICAgaWYgKCAoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIpICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU3RhcnQgY29kZSBwcmVmaXggaGFzIHR3byB6ZXJvcworICAgICAgICAgICAgICogVGhpcmQgemVybyBpcyBhc3N1bWVkIHRvIGJlIGxlYWRpbmcgemVybyBvZiBuZXh0IHBhY2tldAorICAgICAgICAgICAgICogRm91cnRoIGFuZCBtb3JlIHplcm9zIGFyZSBhc3N1bWVkIHRvIGJlIHRyYWlsaW5nIHplcm9zIG9mIHRoaXMKKyAgICAgICAgICAgICAqIHBhY2tldCAqLworICAgICAgICAgICAgaWYgKHplcm9Db3VudCA+IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZXggLT0gNDsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgLT0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCAtPSB6ZXJvQ291bnQrMTsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYnl0ZSkKKyAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisKKyAgICAgICAgaWYgKGluZGV4ID09IG1heEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyogU3RvcmUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KKyAgICAqcFN0cm0gPSBzdHJlYW07CisgICAgcHJldkluZGV4ID0gaW5kZXg7CisKKyAgICAvKiBuYWxVbml0U3RyZWFtIGlzIHdpdGhvdXQgdHJhaWxpbmcgemVyb3MgKi8KKyAgICBpZiAobmFsVW5pdFN0cmVhbSkKKyAgICAgICAgaW5kZXggLT0gemVyb0NvdW50OworCisgICAgcmV0dXJuKGluZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogQ3JvcFBpY3R1cmUKKworICAgIFB1cnBvc2U6CisgICAgICAgIFBlcmZvcm0gY3JvcHBpbmcgZm9yIHBpY3R1cmUuIElucHV0IHBpY3R1cmUgcEluSW1hZ2Ugd2l0aCBkaW1lbnNpb25zCisgICAgICAgIHBpY1dpZHRoIHggcGljSGVpZ2h0IGlzIGNyb3BwZWQgd2l0aCBwQ3JvcFBhcmFtcyBhbmQgdGhlIHJlc3VsdGluZworICAgICAgICBwaWN0dXJlIGlzIHN0b3JlZCBpbiBwT3V0SW1hZ2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAorICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpCit7CisKKyAgICB1MzIgaSwgajsKKyAgICB1MzIgb3V0V2lkdGgsIG91dEhlaWdodDsKKyAgICB1OCAqcE91dCwgKnBJbjsKKworICAgIGlmIChwT3V0SW1hZ2UgPT0gTlVMTCB8fCBwSW5JbWFnZSA9PSBOVUxMIHx8IHBDcm9wUGFyYW1zID09IE5VTEwgfHwKKyAgICAgICAgIXBpY1dpZHRoIHx8ICFwaWNIZWlnaHQpCisgICAgeworICAgICAgICAvKiBqdXN0IHRvIHByZXZlbnQgbGludCB3YXJuaW5nLCByZXR1cm5pbmcgbm9uLXplcm8gd2lsbCByZXN1bHQgaW4KKyAgICAgICAgICogcmV0dXJuIHdpdGhvdXQgZnJlZWluZyB0aGUgbWVtb3J5ICovCisgICAgICAgIGZyZWUocE91dEltYWdlKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIGlmICggKChwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoKSA+CisgICAgICAgICAgIHBpY1dpZHRoICkgfHwKKyAgICAgICAgICgocENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodCkgPgorICAgICAgICAgICBwaWNIZWlnaHQgKSApCisgICAgeworICAgICAgICAvKiBqdXN0IHRvIHByZXZlbnQgbGludCB3YXJuaW5nLCByZXR1cm5pbmcgbm9uLXplcm8gd2lsbCByZXN1bHQgaW4KKyAgICAgICAgICogcmV0dXJuIHdpdGhvdXQgZnJlZWluZyB0aGUgbWVtb3J5ICovCisgICAgICAgIGZyZWUocE91dEltYWdlKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIG91dFdpZHRoID0gcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aDsKKyAgICBvdXRIZWlnaHQgPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodDsKKworICAgIC8qIENhbGN1bGF0ZSBzdGFydGluZyBwb2ludGVyIGZvciBsdW1hICovCisgICAgcEluID0gcEluSW1hZ2UgKyBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aCArCisgICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldDsKKyAgICBwT3V0ID0gcE91dEltYWdlOworCisgICAgLyogQ29weSBsdW1hIHBpeGVsIHZhbHVlcyAqLworICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKKyAgICAgICAgfQorICAgICAgICBwSW4gKz0gcGljV2lkdGggLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICBvdXRXaWR0aCA+Pj0gMTsKKyAgICBvdXRIZWlnaHQgPj49IDE7CisKKyAgICAvKiBDYWxjdWxhdGUgc3RhcnRpbmcgcG9pbnRlciBmb3IgY2IgKi8KKyAgICBwSW4gPSBwSW5JbWFnZSArIHBpY1dpZHRoKnBpY0hlaWdodCArCisgICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKKworICAgIC8qIENvcHkgY2IgcGl4ZWwgdmFsdWVzICovCisgICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOworICAgICAgICB9CisgICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIHBvaW50ZXIgZm9yIGNyICovCisgICAgcEluID0gcEluSW1hZ2UgKyA1KnBpY1dpZHRoKnBpY0hlaWdodC80ICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOworCisgICAgLyogQ29weSBjciBwaXhlbCB2YWx1ZXMgKi8KKyAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7CisgICAgICAgIH0KKyAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICByZXR1cm4gKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY1RyYWNlCisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY1RyYWNlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhcHBlbmRzCisgICAgICAgIHRyYWNlIG1lc3NhZ2VzIHRvIGZpbGUgbmFtZWQgJ2RlY19hcGkudHJjJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKQoreworICAgIEZJTEUgKmZwOworCisgICAgZnAgPSBmb3BlbigiZGVjX2FwaS50cmMiLCAiYXQiKTsKKworICAgIGlmICghZnApCisgICAgICAgIHJldHVybjsKKworICAgIGZ3cml0ZShzdHJpbmcsIDEsIHN0cmxlbihzdHJpbmcpLCBmcCk7CisgICAgZndyaXRlKCJcbiIsIDEsMSwgZnApOworCisgICAgZmNsb3NlKGZwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNYWxsb2MKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWFsbG9jIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWFsbG9jIGZvciBhbGxvY2F0aW9uIG9mIG1lbW9yeS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSkKK3sKKworI2lmIGRlZmluZWQoQ0hFQ0tfTUVNT1JZX1VTQUdFKQorICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZGVjb2RlciBoYXMgdG8gZnJlZSBhbmQgcmVhbGxvY2F0ZSBzb21lIG9mIHRoZSBidWZmZXJzCisgICAgICogdGhlIHRvdGFsIHZhbHVlIHdpbGwgYmUgaW52YWxpZCAqLworICAgIHN0YXRpYyB1MzIgbnVtQnl0ZXMgPSAwOworICAgIG51bUJ5dGVzICs9IHNpemU7CisgICAgREVCVUcoKCJBbGxvY2F0ZWQgJWQgYnl0ZXMsIHRvdGFsICVkXG4iLCBzaXplLCBudW1CeXRlcykpOworI2VuZGlmCisKKyAgICByZXR1cm4gbWFsbG9jKHNpemUpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY0ZyZWUKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjRnJlZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIGZyZWUgZm9yIGZyZWVpbmcgb2YgbWVtb3J5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKK3sKKyAgICBmcmVlKHB0cik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5CisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbWNweSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbWNweSB0byBjb3B5IHNyYyB0byBkZXN0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpCit7CisgICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbXNldAorCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1zZXQgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1zZXQgdG8gc2V0IGNvbnRlbnQgb2YgbWVtb3J5IGFyZWEgcG9pbnRlZCBieSBwdHIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQoreworICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWFkYzc1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIG1haW4KKworICAgIFB1cnBvc2U6CisgICAgICAgIG1haW4gZnVuY3Rpb24uIEFzc3VtaW5nIHRoYXQgZXhlY3V0YWJsZSBpcyBuYW1lZCAnZGVjb2RlcicgdGhlIHVzYWdlCisgICAgICAgIGlzIGFzIGZvbGxvd3MKKworICAgICAgICAgICAgZGVjb2RlciBpbnB1dEZpbGVOYW1lCisKKyAgICAgICAgLCB3aGVyZSBpbnB1dEZpbGVOYW1lIHNoYWxsIGJlIG5hbWUgb2YgZmlsZSBjb250YWluaW5nIGgyNjQgc3RyZWFtCisgICAgICAgIGRhdGEuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisKKyAgICB1OCAqYnl0ZVN0cm1TdGFydDsKKyAgICB1OCAqYnl0ZVN0cm07CisgICAgdTMyIHN0cm1MZW47CisgICAgdTMyIHBpY1NpemU7CisgICAgSDI2NFN3RGVjSW5zdCBkZWNJbnN0OworICAgIEgyNjRTd0RlY1JldCByZXQ7CisgICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7CisgICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKKyAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7CisgICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOworICAgIHUzMiBwaWNOdW1iZXI7CisKKyAgICBGSUxFICpmaW5wdXQ7CisgICAgRklMRSAqZm91dHB1dDsKKworICAgIC8qIENoZWNrIHRoYXQgZW5vdWdoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZ2l2ZW4sIGlmIG5vdCAtPiBwcmludCB1c2FnZQorICAgICAqIGluZm9ybWF0aW9uIG91dCAqLworICAgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICAgIHByaW50ZiggIlVzYWdlOiAlcyBmaWxlLmgyNjRcbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogb3BlbiBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZywgb3V0cHV0IGZpbGUgbmFtZWQgb3V0Lnl1di4gSWYgZmlsZSBvcGVuCisgICAgICogZmFpbHMgLT4gZXhpdCAqLworICAgIGZvdXRwdXQgPSBmb3Blbigib3V0Lnl1diIsICJ3YiIpOworICAgIGlmIChmb3V0cHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBPUEVOIE9VVFBVVCBGSUxFXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIG9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZywgZmlsZSBuYW1lIGdpdmVuIGJ5IHVzZXIuIElmIGZpbGUgb3BlbgorICAgICAqIGZhaWxzIC0+IGV4aXQgKi8KKyAgICBmaW5wdXQgPSBmb3Blbihhcmd2W2FyZ2MtMV0sICJyYiIpOworICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiVU5BQkxFIFRPIE9QRU4gSU5QVVQgRklMRVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBzaXplIG9mIHRoZSBpbnB1dCBmaWxlIC0+IGxlbmd0aCBvZiB0aGUgc3RyZWFtIGluIGJ5dGVzICovCisgICAgZnNlZWsoZmlucHV0LCAwTCwgU0VFS19FTkQpOworICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7CisgICAgcmV3aW5kKGZpbnB1dCk7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmVhbSBidWZmZXIsIGV4aXQgaWYgdW5zdWNjZXNzZnVsICovCisgICAgYnl0ZVN0cm0gPSBieXRlU3RybVN0YXJ0ID0gKHU4ICopSDI2NFN3RGVjTWFsbG9jKHNpemVvZih1OCkqc3RybUxlbik7CisgICAgaWYgKGJ5dGVTdHJtID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBBTExPQ0FURSBNRU1PUllcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogcmVhZCBpbnB1dCBzdHJlYW0gZnJvbSBmaWxlIHRvIGJ1ZmZlciBhbmQgY2xvc2UgaW5wdXQgZmlsZSAqLworICAgIGZyZWFkKGJ5dGVTdHJtLCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOworICAgIGZjbG9zZShmaW5wdXQpOworCisgICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVyLiBJZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLworICAgIHJldCA9IEgyNjRTd0RlY0luaXQoJmRlY0luc3QsIDApOworICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJERUNPREVSIElOSVRJQUxJWkFUSU9OIEZBSUxFRFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSAqLworICAgIGRlY0lucHV0LnBTdHJlYW0gPSBieXRlU3RybVN0YXJ0OworICAgIGRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOworICAgIGRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOworCisgICAgcGljTnVtYmVyID0gMDsKKworICAgIC8qIEZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMsIHJlYWQgdGhlIHN0YXJ0IHRpbWUgKGluIHNlY29uZHMpIGhlcmUuCisgICAgICogVGhlIGRlY29kaW5nIHRpbWUgc2hvdWxkIGJlIG1lYXN1cmVkIG92ZXIgc2V2ZXJhbCBmcmFtZXMgYW5kIGFmdGVyCisgICAgICogdGhhdCBhdmVyYWdlIGZwcyAoZnJhbWVzL3NlY29uZCkgY2FuIGJlIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBzdGFydFRpbWUgPSBHZXRUaW1lKCk7CisgICAgICoKKyAgICAgKiBUbyBwcmV2ZW50IGNhbGN1bGF0aW5nIGZpbGUgSS9PIGxhdGVuc2llcyBhcyBhIGRlY29kaW5nIHRpbWUsCisgICAgICogY29tbWVudCBvdXQgV3JpdGVPdXRwdXQgZnVuY3Rpb24gY2FsbC4gQWxzbyBwcmludHMgdG8gc3Rkb3V0IG1pZ2h0CisgICAgICogY29uc3VtZSBjb25zaWRlcmFibGUgYW1vdW50IG9mIGN5Y2xlcyBkdXJpbmcgbWVhc3VyZW1lbnQgKi8KKworICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLworICAgIGRvCisgICAgeworICAgICAgICAvKiBjYWxsIEFQSSBmdW5jdGlvbiB0byBwZXJmb3JtIGRlY29kaW5nICovCisgICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShkZWNJbnN0LCAmZGVjSW5wdXQsICZkZWNPdXRwdXQpOworCisgICAgICAgIHN3aXRjaChyZXQpCisgICAgICAgIHsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6CisKKyAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIGRpbWVuc2lvbnMgYXJlIGF2YWlsYWJsZSBmb3IgcXVlcnkgbm93ICovCisgICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNJbnN0LCAmZGVjSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgc2l6ZSBpbiBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0OworICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBuZWVkZWQgZm9yIFlDYkNyIDQ6MjowIHBpY3R1cmUgaW4gYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBuZWVkZWQgZm9yIDE2LWJpdCBSR0IgcGljdHVyZSBpbiBieXRlcworICAgICAgICAgICAgICAgICAqIHBpY1NpemUgPSAoZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0KSAqIDI7ICovCisKKyAgICAgICAgICAgICAgICBwcmludGYoIldpZHRoICVkIEhlaWdodCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQpOworCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWToKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6CisKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQorICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLworICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOworCisgICAgICAgICAgICAgICAgLyogdXNlIGZ1bmN0aW9uIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZQorICAgICAgICAgICAgICAgICAqIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcworICAgICAgICAgICAgICAgICAqIGFyZSByZWFkeSBmb3IgZGlzcGxheSAqLworICAgICAgICAgICAgICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMCkgPT0KKyAgICAgICAgICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkpIHsgcGljTnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwgcGljTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpOworICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIGlmIG5lZWRlZCB0byBnZXQgZGlzcGxheSBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgKiBpbiBSR0ItZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAqIFl1dlRvUmdiKCBkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLCBwUmdiUGljdHVyZSApOyAqLworCisgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIG5leHQgZGlzcGxheSBpbWFnZSB0byBvdXRwdXQgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICBwaWNTaXplKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRDoKKyAgICAgICAgICAgICAgICAvKiBldmFsdWF0aW9uIHZlcnNpb24gb2YgdGhlIGRlY29kZXIgaGFzIGxpbWl0ZWQgZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgKiBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIkVWQUxVQVRJT04gTElNSVQgUkVBQ0hFRFxuIik7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJVTlJFQ09WRVJBQkxFIEVSUk9SXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAvKiBrZWVwIGRlY29kaW5nIHVudGlsIGFsbCBkYXRhIGZyb20gaW5wdXQgc3RyZWFtIGJ1ZmZlciBjb25zdW1lZCAqLworICAgIH0gd2hpbGUgKGRlY0lucHV0LmRhdGFMZW4gPiAwKTsKKworZW5kOgorCisgICAgLyogaWYgb3V0cHV0IGluIGRpc3BsYXkgb3JkZXIgaXMgcHJlZmVycmVkLCB0aGUgZGVjb2RlciBzaGFsbCBiZSBmb3JjZWQKKyAgICAgKiB0byBvdXRwdXQgcGljdHVyZXMgcmVtYWluaW5nIGluIGRlY29kZWQgcGljdHVyZSBidWZmZXIuIFVzZSBmdW5jdGlvbgorICAgICAqIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyLiBGdW5jdGlvbgorICAgICAqIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcyBhcmUgcmVhZHkgZm9yIGRpc3BsYXkuIFNlY29uZCBwYXJhbWV0ZXIKKyAgICAgKiBmb3IgdGhlIGZ1bmN0aW9uIGlzIHNldCB0byAnMScgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGVuZCBvZiB0aGUKKyAgICAgKiBzdHJlYW0gYW5kIGFsbCBwaWN0dXJlcyBzaGFsbCBiZSBvdXRwdXQgKi8KKyAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDEpID09CisgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZKSB7CisKKyAgICAgICAgcGljTnVtYmVyKys7CisKKyAgICAgICAgcHJpbnRmKCJQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwgcGljTnVtYmVyLAorICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIiwKKyAgICAgICAgICAgIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIGlmIG5lZWRlZCB0byBnZXQgZGlzcGxheSBpbWFnZQorICAgICAgICAgKiBpbiBSR0ItZm9ybWF0CisgICAgICAgICAqCisgICAgICAgICAqIFl1dlRvUmdiKCBkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLCBwUmdiUGljdHVyZSApOyAqLworCisgICAgICAgIC8qIHdyaXRlIG5leHQgZGlzcGxheSBpbWFnZSB0byBvdXRwdXQgZmlsZSAqLworICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBpY1NpemUpOworICAgIH0KKworICAgIC8qIEZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMsIHJlYWQgdGhlIGVuZCB0aW1lIChpbiBzZWNvbmRzKSBoZXJlLgorICAgICAqCisgICAgICogZW5kVGltZSA9IEdldFRpbWUoKTsKKyAgICAgKgorICAgICAqIE5vdyB0aGUgcGVyZm9ybWFuY2UgY2FuIGJlIGNhbGN1bGF0ZWQgYXMgZnJhbWVzIHBlciBzZWNvbmQ6CisgICAgICogZnBzID0gcGljTnVtYmVyIC8gKGVuZFRpbWUgLSBzdGFydFRpbWUpOyAqLworCisKKyAgICAvKiByZWxlYXNlIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY0luc3QpOworCisgICAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KKyAgICBmY2xvc2UoZm91dHB1dCk7CisKKyAgICAvKiBmcmVlIGJ5dGUgc3RyZWFtIGJ1ZmZlciAqLworICAgIGZyZWUoYnl0ZVN0cm1TdGFydCk7CisKKyAgICByZXR1cm4gMDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIFdyaXRlT3V0cHV0CisKKyAgICBQdXJwb3NlOgorICAgICAgICBXcml0ZSBwaWN0dXJlIHBvaW50ZWQgYnkgZGF0YSB0byBmaWxlIHBvaW50ZWQgYnkgZmlkLiBTaXplIG9mIHRoZQorICAgICAgICBwaWN0dXJlIGluIHBpeGVscyBpcyBpbmRpY2F0ZWQgYnkgcGljU2l6ZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpCit7CisgICAgZndyaXRlKGRhdGEsIDEsIHBpY1NpemUsIGZpZCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjVHJhY2UKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjVHJhY2UgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIGFwcGVuZHMKKyAgICAgICAgdHJhY2UgbWVzc2FnZXMgdG8gZmlsZSBuYW1lZCAnZGVjX2FwaS50cmMnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCit7CisgICAgRklMRSAqZnA7CisKKyAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOworCisgICAgaWYgKCFmcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKKyAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7CisKKyAgICBmY2xvc2UoZnApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY21hbGxvYworCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNYWxsb2MgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtYWxsb2MgZm9yIGFsbG9jYXRpb24gb2YgbWVtb3J5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKQoreworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQorCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNGcmVlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gZnJlZSBmb3IgZnJlZWluZyBvZiBtZW1vcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1jcHkKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWVtY3B5IGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWVtY3B5IHRvIGNvcHkgc3JjIHRvIGRlc3QuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKK3sKKyAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0CisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbXNldCBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbXNldCB0byBzZXQgY29udGVudCBvZiBtZW1vcnkgYXJlYSBwb2ludGVkIGJ5IHB0ci4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpCit7CisgICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBIMjY0U3dEZWNJbml0CisgICAgICAgICAgSDI2NFN3RGVjR2V0SW5mbworICAgICAgICAgIEgyNjRTd0RlY1JlbGVhc2UKKyAgICAgICAgICBIMjY0U3dEZWNEZWNvZGUKKyAgICAgICAgICBIMjY0U3dEZWNHZXRBUElWZXJzaW9uCisgICAgICAgICAgSDI2NFN3RGVjTmV4dFBpY3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFZlcnNpb24gSW5mb3JtYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgSDI2NFNXREVDX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBIMjY0U1dERUNfTUlOT1JfVkVSU0lPTiAzCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0gyNjRERUNfVFJBQ0UgICAgICAgICAgIFRyYWNlIEgyNjQgRGVjb2RlciBBUEkgZnVuY3Rpb24gY2FsbHMuCitIMjY0REVDX0VWQUxVQVRJT04gICAgICBDb21waWxlIGV2YWx1YXRpb24gdmVyc2lvbiwgcmVzdHJpY3RzIG51bWJlciBvZiBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIGRlY29kZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBERUNfQVBJX1RSQyhzdHIpICAgIEgyNjRTd0RlY1RyYWNlKHN0cikKKyNlbHNlCisjZGVmaW5lIERFQ19BUElfVFJDKHN0cikKKyNlbmRpZgorCisjaWZkZWYgSDI2NERFQ19FVkFMVUFUSU9OCisjZGVmaW5lIEgyNjRERUNfRVZBTFVBVElPTl9MSU1JVCAgIDUwMAorI2VuZGlmCisKK3ZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKSB7Cit9CisKK3ZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSkgeworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKK3ZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpIHsKKyAgICBmcmVlKHB0cik7Cit9CisKK3ZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KSB7CisgICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOworfQorCit2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KSB7CisgICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY0luaXQoKQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBJbml0aWFsaXplIGRlY29kZXIgc29mdHdhcmUuIEZ1bmN0aW9uIHJlc2VydmVzIG1lbW9yeSBmb3IgdGhlCisgICAgICAgICAgICBkZWNvZGVyIGluc3RhbmNlIGFuZCBjYWxscyBoMjY0YnNkSW5pdCB0byBpbml0aWFsaXplIHRoZQorICAgICAgICAgICAgaW5zdGFuY2UgZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBub091dHB1dFJlb3JkZXJpbmcgIGZsYWcgdG8gaW5kaWNhdGUgZGVjb2RlciB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cnkgdG8gcHJvdmlkZSBvdXRwdXQgcGljdHVyZXMgaW4gZGlzcGxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciwgc2F2ZXMgbWVtb3J5CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRlY0luc3QgICAgICAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBpbnN0YW5jZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIMjY0U1dERUNfT0sgICAgICAgIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB0aGUgaW5zdGFuY2UKKyAgICAgICAgICAgIEgyNjRTV0RFQ19JTklURkFJTCAgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSIGludmFsaWQgcGFyYW1ldGVycworICAgICAgICAgICAgSDI2NFNXREVDX01FTV9GQUlMICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0luaXQoSDI2NFN3RGVjSW5zdCAqZGVjSW5zdCwgdTMyIG5vT3V0cHV0UmVvcmRlcmluZykKK3sKKyAgICB1MzIgcnYgPSAwOworCisgICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIik7CisKKyAgICAvKiBjaGVjayB0aGF0IHJpZ2h0IHNoaWZ0IG9uIG5lZ2F0aXZlIG51bWJlcnMgaXMgcGVyZm9ybWVkIHNpZ25lZCAqLworICAgIC8qbGludCAtc2F2ZSAtZSogZm9sbG93aW5nIGNoZWNrIGNhdXNlcyBtdWx0aXBsZSBsaW50IG1lc3NhZ2VzICovCisgICAgaWYgKCAoKC0xKT4+MSkgIT0gKC0xKSApCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMgRVJST1I6IFJpZ2h0IHNoaWZ0IGlzIG5vdCBzaWduZWQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19JTklURkFJTCk7CisgICAgfQorICAgIC8qbGludCAtcmVzdG9yZSAqLworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyBFUlJPUjogZGVjSW5zdCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCAqKUgyNjRTd0RlY01hbGxvYyhzaXplb2YoZGVjQ29udGFpbmVyX3QpKTsKKworICAgIGlmIChwRGVjQ29udCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIEVSUk9SOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19NRU1GQUlMKTsKKyAgICB9CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjSW5pdCMgZGVjSW5zdCAlcCBub091dHB1dFJlb3JkZXJpbmcgJWQiLAorICAgICAgICAgICAgKHZvaWQqKWRlY0luc3QsIG5vT3V0cHV0UmVvcmRlcmluZyk7CisgICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7CisjZW5kaWYKKworICAgIHJ2ID0gaDI2NGJzZEluaXQoJnBEZWNDb250LT5zdG9yYWdlLCBub091dHB1dFJlb3JkZXJpbmcpOworICAgIGlmIChydiAhPSBIQU5UUk9fT0spCisgICAgeworICAgICAgICBIMjY0U3dEZWNSZWxlYXNlKHBEZWNDb250KTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19NRU1GQUlMKTsKKyAgICB9CisKKyAgICBwRGVjQ29udC0+ZGVjU3RhdCAgPSBJTklUSUFMSVpFRDsKKyAgICBwRGVjQ29udC0+cGljTnVtYmVyID0gMDsKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNJbml0IyBPSzogcmV0dXJuICVwIiwgKHZvaWQqKXBEZWNDb250KTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgKmRlY0luc3QgPSAoZGVjQ29udGFpbmVyX3QgKilwRGVjQ29udDsKKworICAgIHJldHVybihIMjY0U1dERUNfT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSDI2NFN3RGVjR2V0SW5mbygpCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgcmVhZCBhY2Nlc3MgdG8gZGVjb2RlciBpbmZvcm1hdGlvbi4gVGhpcworICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgYmVmb3JlIEgyNjRTd0RlY0RlY29kZSBmdW5jdGlvbiBoYXMKKyAgICAgICAgICAgIGluZGljYXRlZCB0aGF0IGhlYWRlcnMgYXJlIHJlYWR5LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcERlY0luZm8gICAgcG9pbnRlciB0byBpbmZvIHN0cnVjdCB3aGVyZSBkYXRhIGlzIHdyaXR0ZW4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSDI2NFNXREVDX09LICAgICAgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBIMjY0U1dERUNfSERSU19OT1RfUkRZICBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHlldAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjR2V0SW5mbyhIMjY0U3dEZWNJbnN0IGRlY0luc3QsIEgyNjRTd0RlY0luZm8gKnBEZWNJbmZvKQoreworCisgICAgc3RvcmFnZV90ICpwU3RvcmFnZTsKKworICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyIpOworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwRGVjSW5mbyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIEVSUk9SOiBkZWNJbnN0IG9yIHBEZWNJbmZvIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOworICAgIH0KKworICAgIHBTdG9yYWdlID0gJigoKGRlY0NvbnRhaW5lcl90ICopZGVjSW5zdCktPnN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgPT0gTlVMTCB8fCBwU3RvcmFnZS0+YWN0aXZlUHBzID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMgRVJST1I6IEhlYWRlcnMgbm90IGRlY29kZWQgeWV0Iik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfSERSU19OT1RfUkRZKTsKKyAgICB9CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZigoKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0KS0+c3RyLAorICAgICAgICAiSDI2NFN3RGVjR2V0SW5mbyMgZGVjSW5zdCAlcCAgcERlY0luZm8gJXAiLCBkZWNJbnN0LCAodm9pZCopcERlY0luZm8pOworICAgIERFQ19BUElfVFJDKCgoZGVjQ29udGFpbmVyX3QqKWRlY0luc3QpLT5zdHIpOworI2VuZGlmCisKKyAgICAvKiBoMjY0YnNkUGljV2lkdGggYW5kIC1IZWlnaHQgcmV0dXJuIGRpbWVuc2lvbnMgaW4gbWFjcm9ibG9jayB1bml0cywKKyAgICAgKiBwaWNXaWR0aCBhbmQgLUhlaWdodCBpbiBwaXhlbHMgKi8KKyAgICBwRGVjSW5mby0+cGljV2lkdGggICAgICAgID0gaDI2NGJzZFBpY1dpZHRoKHBTdG9yYWdlKSA8PCA0OworICAgIHBEZWNJbmZvLT5waWNIZWlnaHQgICAgICAgPSBoMjY0YnNkUGljSGVpZ2h0KHBTdG9yYWdlKSA8PCA0OworICAgIHBEZWNJbmZvLT52aWRlb1JhbmdlICAgICAgPSBoMjY0YnNkVmlkZW9SYW5nZShwU3RvcmFnZSk7CisgICAgcERlY0luZm8tPm1hdHJpeENvZWZmaWNpZW50cyA9IGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMocFN0b3JhZ2UpOworCisgICAgaDI2NGJzZENyb3BwaW5nUGFyYW1zKHBTdG9yYWdlLAorICAgICAgICAmcERlY0luZm8tPmNyb3BwaW5nRmxhZywKKyAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BMZWZ0T2Zmc2V0LAorICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAorICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcFRvcE9mZnNldCwKKyAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQpOworCisgICAgLyogc2FtcGxlIGFzcGVjdCByYXRpbyAqLworICAgIGgyNjRic2RTYW1wbGVBc3BlY3RSYXRpbyhwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEZWNJbmZvLT5wYXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEZWNJbmZvLT5wYXJIZWlnaHQpOworCisgICAgLyogcHJvZmlsZSAqLworICAgIHBEZWNJbmZvLT5wcm9maWxlID0gaDI2NGJzZFByb2ZpbGUocFN0b3JhZ2UpOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIE9LIik7CisKKyAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY1JlbGVhc2UoKQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBSZWxlYXNlIHRoZSBkZWNvZGVyIGluc3RhbmNlLiBGdW5jdGlvbiBjYWxscyBoMjY0YnNkU2h1dERvd24gdG8KKyAgICAgICAgICAgIHJlbGVhc2UgaW5zdGFuY2UgZGF0YSBhbmQgZnJlZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZQorICAgICAgICAgICAgaW5zdGFuY2UuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGVjSW5zdCAgICAgRGVjb2RlciBpbnN0YW5jZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBIMjY0U3dEZWNSZWxlYXNlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCkKK3sKKworICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKKworICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNSZWxlYXNlIyIpOworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNSZWxlYXNlIyBFUlJPUjogZGVjSW5zdCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCopZGVjSW5zdDsKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNSZWxlYXNlIyBkZWNJbnN0ICVwIixkZWNJbnN0KTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgaDI2NGJzZFNodXRkb3duKCZwRGVjQ29udC0+c3RvcmFnZSk7CisKKyAgICBIMjY0U3dEZWNGcmVlKHBEZWNDb250KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY0RlY29kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgc3RyZWFtIGRhdGEuIENhbGxzIGgyNjRic2REZWNvZGUgdG8gZG8gdGhlIGFjdHVhbCBkZWNvZGluZy4KKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UKKyAgICAgICAgICAgIHBJbnB1dCAgICAgIHBvaW50ZXIgdG8gaW5wdXQgc3RydWN0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBPdXRwdXQgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHN0cnVjdAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEICAgZGVjb2RlciBpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQgeWV0CisgICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSICAgICAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCisKKyAgICAgICAgICAgIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRCAgICBzdHJlYW0gYnVmZmVyIGRlY29kZWQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSAgIGhlYWRlcnMgZGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgbm90IGZpbmlzaGVkCisgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSAgICAgICAgICAgICAgICAgICBkZWNvZGluZyBvZiBhIHBpY3R1cmUgZmluaXNoZWQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgbm90IGZpbmlzaGVkCisgICAgICAgICAgICBIMjY0U1dERUNfU1RSTV9FUlIgICAgICAgICAgICAgICAgICBzZXJpb3VzIGVycm9yIGluIGRlY29kaW5nLCBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgcGFyYW1ldGVyIHNldHMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZWNvZGUgcGljdHVyZSBkYXRhCisgICAgICAgICAgICBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCB0aGlzIGNhbiBvbmx5IG9jY3VyIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24gdmVyc2lvbiBpcyB1c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IG51bWJlciBvZiBmcmFtZXMgcmVhY2hlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjRGVjb2RlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwgSDI2NFN3RGVjSW5wdXQgKnBJbnB1dCwKKyAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY091dHB1dCAqcE91dHB1dCkKK3sKKworICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKKyAgICB1MzIgc3RybUxlbjsKKyAgICB1MzIgbnVtUmVhZEJ5dGVzOworICAgIHU4ICp0bXBTdHJlYW07CisgICAgdTMyIGRlY1Jlc3VsdCA9IDA7CisgICAgSDI2NFN3RGVjUmV0IHJldHVyblZhbHVlID0gSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMiKTsKKworICAgIC8qIENoZWNrIHRoYXQgZnVuY3Rpb24gaW5wdXQgcGFyYW1ldGVycyBhcmUgdmFsaWQgKi8KKyAgICBpZiAocElucHV0ID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IHBJbnB1dCBvciBwT3V0cHV0IGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOworICAgIH0KKworICAgIGlmICgocElucHV0LT5wU3RyZWFtID09IE5VTEwpIHx8IChwSW5wdXQtPmRhdGFMZW4gPT0gMCkpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyBFUlJPUjogSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCAqKWRlY0luc3Q7CisKKyAgICAvKiBDaGVjayBpZiBkZWNvZGVyIGlzIGluIGFuIGluY29ycmVjdCBtb2RlICovCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwRGVjQ29udC0+ZGVjU3RhdCA9PSBVTklOSVRJQUxJWkVEKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IERlY29kZXIgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICB9CisKKyNpZmRlZiBIMjY0REVDX0VWQUxVQVRJT04KKyAgICBpZiAocERlY0NvbnQtPnBpY051bWJlciA+PSBIMjY0REVDX0VWQUxVQVRJT05fTElNSVQpCisgICAgICAgIHJldHVybihIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCk7CisjZW5kaWYKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNEZWNvZGUjIGRlY0luc3QgJXAgIHBJbnB1dCAlcCAgcE91dHB1dCAlcCIsCisgICAgICAgICAgICBkZWNJbnN0LCAodm9pZCopcElucHV0LCAodm9pZCopcE91dHB1dCk7CisgICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7CisjZW5kaWYKKworICAgIHBPdXRwdXQtPnBTdHJtQ3VyclBvcyAgID0gTlVMTDsKKworICAgIG51bVJlYWRCeXRlcyA9IDA7CisgICAgc3RybUxlbiA9IHBJbnB1dC0+ZGF0YUxlbjsKKyAgICB0bXBTdHJlYW0gPSBwSW5wdXQtPnBTdHJlYW07CisgICAgcERlY0NvbnQtPnN0b3JhZ2UuaW50cmFDb25jZWFsbWVudEZsYWcgPSBwSW5wdXQtPmludHJhQ29uY2VhbG1lbnRNZXRob2Q7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogUmV0dXJuIEhEUlNfUkRZIGFmdGVyIERQQiBmbHVzaCBjYXVzZWQgYnkgbmV3IFNQUyAqLworICAgICAgICBpZiAocERlY0NvbnQtPmRlY1N0YXQgPT0gTkVXX0hFQURFUlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY1Jlc3VsdCA9IEgyNjRCU0RfSERSU19SRFk7CisgICAgICAgICAgICBwRGVjQ29udC0+ZGVjU3RhdCA9IElOSVRJQUxJWkVEOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogQ29udGludWUgZGVjb2Rpbmcgbm9ybWFsbHkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZGVjUmVzdWx0ID0gaDI2NGJzZERlY29kZSgmcERlY0NvbnQtPnN0b3JhZ2UsIHRtcFN0cmVhbSwgc3RybUxlbiwKKyAgICAgICAgICAgICAgICBwSW5wdXQtPnBpY0lkLCAmbnVtUmVhZEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICB0bXBTdHJlYW0gKz0gbnVtUmVhZEJ5dGVzOworICAgICAgICAvKiBjaGVjayBpZiB0b28gbWFueSBieXRlcyBhcmUgcmVhZCBmcm9tIHN0cmVhbSAqLworICAgICAgICBpZiAoIChpMzIpKHN0cm1MZW4gLSBudW1SZWFkQnl0ZXMpID49IDAgKQorICAgICAgICAgICAgc3RybUxlbiAtPSBudW1SZWFkQnl0ZXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cm1MZW4gPSAwOworCisgICAgICAgIHBPdXRwdXQtPnBTdHJtQ3VyclBvcyA9IHRtcFN0cmVhbTsKKworICAgICAgICBzd2l0Y2ggKGRlY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX0hEUlNfUkRZOgorCisgICAgICAgICAgICAgICAgaWYocERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5mbHVzaGVkICYmCisgICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5udW1PdXQgIT0KKyAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPm91dEluZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0IGZpcnN0IGFsbCBEUEIgc3RvcmVkIHBpY3R1cmVzCisgICAgICAgICAgICAgICAgICAgICAqIERQQiBmbHVzaCBjYXVzZWQgYnkgbmV3IFNQUyAqLworICAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPmZsdXNoZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+ZGVjU3RhdCA9IE5FV19IRUFERVJTOworICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOworICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk7CisgICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX1BJQ19SRFk6CisgICAgICAgICAgICAgICAgcERlY0NvbnQtPnBpY051bWJlcisrOworCisgICAgICAgICAgICAgICAgaWYgKHN0cm1MZW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfUElDX1JEWTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk7CisKKyAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUjoKKyAgICAgICAgICAgICAgICBpZiAoICFoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cygmcERlY0NvbnQtPnN0b3JhZ2UpICYmCisgICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfU1RSTV9FUlI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX01FTUFMTE9DX0VSUk9SOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfTUVNRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoc3RybUxlbik7CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjRGVjb2RlIyBPSzogRGVjUmVzdWx0ICVkIiwKKyAgICAgICAgICAgIHJldHVyblZhbHVlKTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuKHJldHVyblZhbHVlKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY0dldEFQSVZlcnNpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUmV0dXJuIHZlcnNpb24gaW5mb3JtYXRpb24gb2YgdGhlIEFQSQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBBUEkgdmVyc2lvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNBcGlWZXJzaW9uIEgyNjRTd0RlY0dldEFQSVZlcnNpb24oKQoreworICAgIEgyNjRTd0RlY0FwaVZlcnNpb24gdmVyOworCisgICAgdmVyLm1ham9yID0gSDI2NFNXREVDX01BSk9SX1ZFUlNJT047CisgICAgdmVyLm1pbm9yID0gSDI2NFNXREVDX01JTk9SX1ZFUlNJT047CisKKyAgICByZXR1cm4odmVyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNOZXh0UGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIgaWYgYW55IGF2YWlsYWJsZS4KKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UuCisgICAgICAgICAgICBmbHVzaEJ1ZmZlciBmb3JjZSBvdXRwdXQgb2YgYWxsIGJ1ZmZlcmVkIHBpY3R1cmVzCisKKyAgICAgICAgT3V0cHV0OgorICAgICAgICAgICAgcE91dHB1dCAgICAgcG9pbnRlciB0byBvdXRwdXQgc3RydWN0dXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEgyNjRTV0RFQ19PSyAgICAgICAgICAgIG5vIHBpY3R1cmVzIGF2YWlsYWJsZSBmb3IgZGlzcGxheQorICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgICAgICAgcGljdHVyZSBhdmFpbGFibGUgZm9yIGRpc3BsYXkKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgICAgIGludmFsaWQgcGFyYW1ldGVycworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjTmV4dFBpY3R1cmUoSDI2NFN3RGVjSW5zdCBkZWNJbnN0LAorICAgIEgyNjRTd0RlY1BpY3R1cmUgKnBPdXRwdXQsIHUzMiBmbHVzaEJ1ZmZlcikKK3sKKworICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKKyAgICB1MzIgbnVtRXJyTWJzLCBpc0lkclBpYywgcGljSWQ7CisgICAgdTMyICpwT3V0UGljOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyIpOworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwT3V0cHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIEVSUk9SOiBkZWNJbnN0IG9yIHBPdXRwdXQgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7CisgICAgfQorCisgICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QqKWRlY0luc3Q7CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIGRlY0luc3QgJXAgcE91dHB1dCAlcCAlcyAlZCIsCisgICAgICAgICAgICBkZWNJbnN0LCAodm9pZCopcE91dHB1dCwgImZsdXNoQnVmZmVyIiwgZmx1c2hCdWZmZXIpOworICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOworI2VuZGlmCisKKyAgICBpZiAoZmx1c2hCdWZmZXIpCisgICAgICAgIGgyNjRic2RGbHVzaEJ1ZmZlcigmcERlY0NvbnQtPnN0b3JhZ2UpOworCisgICAgcE91dFBpYyA9ICh1MzIqKWgyNjRic2ROZXh0T3V0cHV0UGljdHVyZSgmcERlY0NvbnQtPnN0b3JhZ2UsICZwaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0lkclBpYywgJm51bUVyck1icyk7CisKKyAgICBpZiAocE91dFBpYyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBPSzogcmV0dXJuIEgyNjRTV0RFQ19PSyIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcE91dHB1dC0+cE91dHB1dFBpY3R1cmUgPSBwT3V0UGljOworICAgICAgICBwT3V0cHV0LT5waWNJZCAgICAgICAgICA9IHBpY0lkOworICAgICAgICBwT3V0cHV0LT5pc0lkclBpY3R1cmUgICA9IGlzSWRyUGljOworICAgICAgICBwT3V0cHV0LT5uYnJPZkVyck1CcyAgICA9IG51bUVyck1iczsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBPSzogcmV0dXJuIEgyNjRTV0RFQ19QSUNfUkRZIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUElDX1JEWSk7CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL1Rlc3RCZW5jaE11bHRpcGxlSW5zdGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjE3MGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBDVlMgdGFnIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uICovCitjb25zdCBjaGFyIHRhZ05hbWVbMjU2XSA9ICIkTmFtZTogRklSU1RfQU5EUk9JRF9DT1BZUklHSFQgJCI7CisKKyNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIERFQlVHKGFyZ3YpIHByaW50ZiBhcmd2CisKKy8qIF9OT19PVVQgZGlzYWJsZXMgb3V0cHV0IGZpbGUgd3JpdGluZyAqLworI2lmZGVmIF9fYXJtCisjZGVmaW5lIF9OT19PVVQKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSk7CisKK3UzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCisgICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcyk7CisKK3ZvaWQgQ3JvcFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmltYWdlRGF0YSwgdTMyIGNyb3BEaXNwbGF5LAorICAgICAgICBIMjY0U3dEZWNJbmZvICpkZWNJbmZvKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBIMjY0U3dEZWNJbnN0IGRlY0luc3Q7CisgICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7CisgICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKKyAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7CisgICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOworICAgIEZJTEUgKmZvdXRwdXQ7CisgICAgY2hhciBvdXRGaWxlTmFtZVsyNTZdOworICAgIHU4ICpieXRlU3RybVN0YXJ0OworICAgIHUzMiBwaWNOdW1iZXI7Cit9IERlY29kZXI7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKworICAgIGkzMiBpbnN0Q291bnQsIGluc3RSdW5uaW5nOworICAgIGkzMiBpOworICAgIHUzMiBtYXhOdW1QaWNzOworICAgIHUzMiBzdHJtTGVuOworICAgIEgyNjRTd0RlY1JldCByZXQ7CisgICAgdTMyIG51bUVycm9ycyA9IDA7CisgICAgdTMyIGNyb3BEaXNwbGF5ID0gMDsKKyAgICB1MzIgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAwOworICAgIEZJTEUgKmZpbnB1dDsKKyAgICBEZWNvZGVyICoqZGVjb2RlcjsKKyAgICBjaGFyIG91dEZpbGVOYW1lWzI1Nl0gPSAib3V0Lnl1diI7CisKKworICAgIGlmICggYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItVCIpID09IDAgKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgdGFnTmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICAgIERFQlVHKCgKKyAgICAgICAgICAgICJVc2FnZTogJXMgWy1Obl0gWy1Pb3V0ZmlsZV0gWy1QXSBbLVVdIFstQ10gWy1SXSBbLVRdIGZpbGUxLjI2NCBbZmlsZTIuMjY0XSAuLiBbZmlsZU4uMjY0XVxuIiwKKyAgICAgICAgICAgIGFyZ3ZbMF0pKTsKKyAgICAgICAgREVCVUcoKCJcdC1ObiBmb3JjZXMgZGVjb2RpbmcgdG8gc3RvcCBhZnRlciBuIHBpY3R1cmVzXG4iKSk7CisjaWYgZGVmaW5lZChfTk9fT1VUKQorICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIG91dHB1dCB3cml0aW5nIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZVxuIikpOworI2Vsc2UKKyAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSB3cml0ZSBvdXRwdXQgdG8gXCJvdXRmaWxlXCIgKGRlZmF1bHQgb3V0Lnl1dilcbiIpKTsKKyAgICAgICAgREVCVUcoKCJcdC1Pbm9uZSBkb2VzIG5vdCB3cml0ZSBvdXRwdXRcbiIpKTsKKyNlbmRpZgorICAgICAgICBERUJVRygoIlx0LUMgZGlzcGxheSBjcm9wcGVkIGltYWdlIChkZWZhdWx0IGRlY29kZWQgaW1hZ2UpXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtUiBkaXNhYmxlIERQQiBvdXRwdXQgcmVvcmRlcmluZ1xuIikpOworICAgICAgICBERUJVRygoIlx0LVQgdG8gcHJpbnQgdGFnIG5hbWUgYW5kIGV4aXRcbiIpKTsKKyAgICAgICAgZXhpdCgxMDApOworICAgIH0KKworICAgIGluc3RDb3VudCA9IGFyZ2MgLSAxOworCisgICAgLyogcmVhZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisgICAgbWF4TnVtUGljcyA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IChhcmdjLTEpOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1OIiwgMikgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heE51bVBpY3MgPSAodTMyKWF0b2koYXJndltpXSsyKTsKKyAgICAgICAgICAgIGluc3RDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTyIsIDIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJjcHkob3V0RmlsZU5hbWUsIGFyZ3ZbaV0rMik7CisgICAgICAgICAgICBpbnN0Q291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItQyIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjcm9wRGlzcGxheSA9IDE7CisgICAgICAgICAgICBpbnN0Q291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItUiIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDE7CisgICAgICAgICAgICBpbnN0Q291bnQtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnN0Q291bnQgPCAxKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJObyBpbnB1dCBmaWxlc1xuIikpOworICAgICAgICBleGl0KDEwMCk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBtdWx0aXBsZSBkZWNvZGVyIGluc3RhbmNlcworICAgICAqIG9uZSBpbnN0YW5jZSBmb3IgZXZlcnkgc3RyZWFtIGZpbGUgKi8KKyAgICBkZWNvZGVyID0gKERlY29kZXIgKiopbWFsbG9jKHNpemVvZihEZWNvZGVyKikqKHUzMilpbnN0Q291bnQpOworICAgIGlmIChkZWNvZGVyID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpKTsKKyAgICAgICAgZXhpdCgxMDApOworICAgIH0KKworICAgIC8qIHByZXBhcmUgZWFjaCBkZWNvZGVyIGluc3RhbmNlICovCisgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgZGVjb2RlcltpXSA9IChEZWNvZGVyICopY2FsbG9jKDEsIHNpemVvZihEZWNvZGVyKSk7CisKKyAgICAgICAgLyogb3BlbiBpbnB1dCBmaWxlICovCisgICAgICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy1pbnN0Q291bnQraV0sInJiIik7CisgICAgICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gb3BlbiBpbnB1dCBmaWxlIDwlcz5cbiIsIGFyZ3ZbYXJnYy1pbnN0Q291bnQraV0pKTsKKyAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgfQorCisgICAgICAgIERFQlVHKCgiUmVhZGluZyBpbnB1dCBmaWxlWyVkXSAlc1xuIiwgaSwgYXJndlthcmdjLWluc3RDb3VudCtpXSkpOworCisgICAgICAgIC8qIHJlYWQgaW5wdXQgc3RyZWFtIHRvIGJ1ZmZlciAqLworICAgICAgICBmc2VlayhmaW5wdXQsMEwsU0VFS19FTkQpOworICAgICAgICBzdHJtTGVuID0gKHUzMilmdGVsbChmaW5wdXQpOworICAgICAgICByZXdpbmQoZmlucHV0KTsKKyAgICAgICAgZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCA9ICh1OCAqKW1hbGxvYyhzaXplb2YodTgpKnN0cm1MZW4pOworICAgICAgICBpZiAoZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpKTsKKyAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgfQorICAgICAgICBmcmVhZChkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0LCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOworICAgICAgICBmY2xvc2UoZmlucHV0KTsKKworICAgICAgICAvKiBvcGVuIG91dHB1dCBmaWxlICovCisgICAgICAgIGlmIChzdHJjbXAob3V0RmlsZU5hbWUsICJub25lIikgIT0gMCkKKyAgICAgICAgeworI2lmIGRlZmluZWQoX05PX09VVCkKKyAgICAgICAgICAgIGRlY29kZXJbaV0tPmZvdXRwdXQgPSBOVUxMOworI2Vsc2UKKyAgICAgICAgICAgIHNwcmludGYoZGVjb2RlcltpXS0+b3V0RmlsZU5hbWUsICIlcyVpIiwgb3V0RmlsZU5hbWUsIGkpOworICAgICAgICAgICAgZGVjb2RlcltpXS0+Zm91dHB1dCA9IGZvcGVuKGRlY29kZXJbaV0tPm91dEZpbGVOYW1lLCAid2IiKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyW2ldLT5mb3V0cHV0ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZVxuIikpOworICAgICAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gSDI2NFN3RGVjSW5pdCgmKGRlY29kZXJbaV0tPmRlY0luc3QpLCBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyk7CisKKyAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiSW5pdCBmYWlsZWQgJWRcbiIsIHJldCkpOworICAgICAgICAgICAgZXhpdCgxMDApOworICAgICAgICB9CisKKyAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSA9IGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQ7CisgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOworICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5pbnRyYUNvbmNlYWxtZW50TWV0aG9kID0gMDsKKworICAgIH0KKworICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLworICAgIGRvCisgICAgeworICAgICAgICAvKiBkZWNvZGUgb25jZSB1c2luZyBlYWNoIGluc3RhbmNlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnN0Q291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjSW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY091dHB1dCkpOworCisgICAgICAgICAgICBzd2l0Y2gocmV0KQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6CisKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNvZGVyW2ldLT5kZWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjSW5mbykpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIENyb3BwaW5nIHBhcmFtczogKCVkLCAlZCkgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcExlZnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBXaWR0aCAlZCBIZWlnaHQgJWRcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLnBpY1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5waWNIZWlnaHQpKTsKKworICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIHZpZGVvUmFuZ2UgJWQsIG1hdHJpY0NvZWZmaWNpZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPmRlY0luZm8udmlkZW9SYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8ubWF0cml4Q29lZmZpY2llbnRzKSk7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3MgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNvZGVyW2ldLT5kZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3M7CisgICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX1BJQ19SRFkpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID0gMDsKKworICAgICAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY1BpY3R1cmUpLCAwKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+cGljTnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUVycm9ycyArPSBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLm5ick9mRXJyTUJzOworCisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPnBpY051bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLmlzSWRyUGljdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJJRFIiIDogIk5PTi1JRFIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDcm9wV3JpdGVPdXRwdXQoZGVjb2RlcltpXS0+Zm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4KilkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wRGlzcGxheSwgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobWF4TnVtUGljcyAmJiBkZWNvZGVyW2ldLT5waWNOdW1iZXIgPT0gbWF4TnVtUGljcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fRVJSOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BBUkFNX0VSUjoKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBGQVRBTCBFUlJPUlxuIiwgaSkpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIGlmIGFueSBvZiB0aGUgaW5zdGFuY2VzIGlzIHN0aWxsIHJ1bm5pbmcgKD1oYXMgbW9yZSBkYXRhKSAqLworICAgICAgICBpbnN0UnVubmluZyA9IGluc3RDb3VudDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9PSAwKQorICAgICAgICAgICAgICAgIGluc3RSdW5uaW5nLS07CisgICAgICAgIH0KKworICAgIH0gd2hpbGUgKGluc3RSdW5uaW5nKTsKKworCisgICAgLyogZ2V0IGxhc3QgZnJhbWVzIGFuZCBjbG9zZSBlYWNoIGluc3RhbmNlICovCisgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNQaWN0dXJlKSwgMSkgPT0gSDI2NFNXREVDX1BJQ19SRFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY29kZXJbaV0tPnBpY051bWJlcisrOworCisgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLAorICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPnBpY051bWJlciwKKyAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLmlzSWRyUGljdHVyZQorICAgICAgICAgICAgICAgICAgICA/ICJJRFIiIDogIk5PTi1JRFIiLAorICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgICAgICBDcm9wV3JpdGVPdXRwdXQoZGVjb2RlcltpXS0+Zm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgKHU4KilkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICBjcm9wRGlzcGxheSwgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgIH0KKworICAgICAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY29kZXJbaV0tPmRlY0luc3QpOworCisgICAgICAgIGlmIChkZWNvZGVyW2ldLT5mb3V0cHV0KQorICAgICAgICAgICAgZmNsb3NlKGRlY29kZXJbaV0tPmZvdXRwdXQpOworCisgICAgICAgIGZyZWUoZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCk7CisKKyAgICAgICAgZnJlZShkZWNvZGVyW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGRlY29kZXIpOworCisgICAgaWYgKG51bUVycm9ycykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBDcm9wV3JpdGVPdXRwdXQoRklMRSAqZm91dHB1dCwgdTggKmltYWdlRGF0YSwgdTMyIGNyb3BEaXNwbGF5LAorICAgICAgICBIMjY0U3dEZWNJbmZvICpkZWNJbmZvKQoreworICAgIHU4ICp0bXBJbWFnZSA9IE5VTEw7CisgICAgdTMyIHRtcCwgcGljU2l6ZTsKKworICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLT5jcm9wcGluZ0ZsYWcpCisgICAgeworICAgICAgICBwaWNTaXplID0gZGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0V2lkdGggKgorICAgICAgICAgICAgICAgICAgZGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0OworICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICB0bXBJbWFnZSA9IG1hbGxvYyhwaWNTaXplKTsKKyAgICAgICAgaWYgKHRtcEltYWdlID09IE5VTEwpCisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAorICAgICAgICAgICAgZGVjSW5mby0+cGljV2lkdGgsIGRlY0luZm8tPnBpY0hlaWdodCwKKyAgICAgICAgICAgICYoZGVjSW5mby0+Y3JvcFBhcmFtcykpOworICAgICAgICBpZiAodG1wKQorICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgV3JpdGVPdXRwdXQoZm91dHB1dCwgdG1wSW1hZ2UsIHBpY1NpemUpOworICAgICAgICBmcmVlKHRtcEltYWdlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8tPnBpY1dpZHRoICogZGVjSW5mby0+cGljSGVpZ2h0OworICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCBpbWFnZURhdGEsIHBpY1NpemUpOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSkKK3sKKyAgICBpZiAoZmlkKQorICAgICAgICBmd3JpdGUoZGF0YSwgMSwgcGljU2l6ZSwgZmlkKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNUcmFjZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCit7CisgICAgRklMRSAqZnA7CisKKyAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOworCisgICAgaWYgKCFmcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKKyAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7CisKKyAgICBmY2xvc2UoZnApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY21hbGxvYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKQoreworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKK3sKKyAgICBmcmVlKHB0cik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKK3sKKyAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQoreworICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBDcm9wUGljdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKKyAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKQoreworCisgICAgdTMyIGksIGo7CisgICAgdTMyIG91dFdpZHRoLCBvdXRIZWlnaHQ7CisgICAgdTggKnBPdXQsICpwSW47CisKKyAgICBpZiAocE91dEltYWdlID09IE5VTEwgfHwgcEluSW1hZ2UgPT0gTlVMTCB8fCBwQ3JvcFBhcmFtcyA9PSBOVUxMIHx8CisgICAgICAgICFwaWNXaWR0aCB8fCAhcGljSGVpZ2h0KQorICAgIHsKKyAgICAgICAgLyogZHVlIHRvIGxpbnQgd2FybmluZyAqLworICAgICAgICBmcmVlKHBPdXRJbWFnZSk7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICBpZiAoICgocENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aCkgPgorICAgICAgICAgICBwaWNXaWR0aCApIHx8CisgICAgICAgICAoKHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQpID4KKyAgICAgICAgICAgcGljSGVpZ2h0ICkgKQorICAgIHsKKyAgICAgICAgLyogZHVlIHRvIGxpbnQgd2FybmluZyAqLworICAgICAgICBmcmVlKHBPdXRJbWFnZSk7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICBvdXRXaWR0aCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGg7CisgICAgb3V0SGVpZ2h0ID0gcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQ7CisKKyAgICBwSW4gPSBwSW5JbWFnZSArIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0OworICAgIHBPdXQgPSBwT3V0SW1hZ2U7CisKKyAgICAvKiBsdW1hICovCisgICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOworICAgICAgICB9CisgICAgICAgIHBJbiArPSBwaWNXaWR0aCAtIG91dFdpZHRoOworICAgIH0KKworICAgIG91dFdpZHRoID4+PSAxOworICAgIG91dEhlaWdodCA+Pj0gMTsKKworICAgIHBJbiA9IHBJbkltYWdlICsgcGljV2lkdGgqcGljSGVpZ2h0ICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOworCisgICAgLyogY2IgKi8KKyAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7CisgICAgICAgIH0KKyAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICBwSW4gPSBwSW5JbWFnZSArIDUqcGljV2lkdGgqcGljSGVpZ2h0LzQgKworICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7CisKKyAgICAvKiBjciAqLworICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKKyAgICAgICAgfQorICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOworICAgIH0KKworICAgIHJldHVybiAoMCk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MzRhNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKQEAgLTAsMCArMSwyOTggQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvciBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiAgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IgcmVnaXN0ZXIgYWxsb2NhdGlvbgorCityZWYgICAgIFJOIDAKK3B0ckEgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2Jsb2NrICAgUk4gMQorCit4MCAgICAgIFJOIDIKK2NvdW50ICAgUk4gMgorCit5MCAgICAgIFJOIDMKK3ZhbFggICAgUk4gMworCit3aWR0aCAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit0bXA3ICAgIFJOIDUKKworY2hyUFcgICBSTiA2Cit0bXA4ICAgIFJOIDYKKwordG1wMSAgICBSTiA3CitjaHJQSCAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK3RtcDUgICAgUk4gMTEKKwordG1wNiAgICBSTiAxMgorCitjMzIgICAgIFJOIDE0Cit4RnJhYyAgIFJOIDE0CisKKzsvLyBGdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCisKKzsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCis7Ly8KKzsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Cis7Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAorOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKKzsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCis7Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAorOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKKzsvLyAgdTMyIHhGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAorOy8vICB1MzIgY2hyb21hUGFydFdpZHRoLCAgICAgICA6IDB4MTA0Cis7Ly8gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0ICAgICAgIDogMHgxMDgKKworaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweGM0CisKKyAgICBMRFIgICAgIGNoclBXLCBbc3AsICMweDEwNF0gICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAorICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsCisKKyAgICBBREQgICAgIHRtcDYsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXA2ID0geDArIGNocm9tYVBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNiwgdG1wNiwgIzEgICAgICAgICAgOy8vIHRtcDYgPSB4MCArIGNocm9tYVBhcnRXaWR0aCArIDEKKyAgICBDTVAgICAgIHRtcDYsIHdpZHRoICAgICAgICAgICAgIDsvLyB4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoCisgICAgQkhJICAgICBkb19maWxsCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDYsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXA2ID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgQ01QICAgICB0bXA2LCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbAorCitkb19maWxsCisgICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wOCwgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDggPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIE1PViAgICAgdG1wMiwgdG1wOCAgICAgICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXA4LGNoclBILHRtcDJ9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wOCxjaHJQSCx0bXAyfQorICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCisgICAgTUxBICAgICByZWYsIGhlaWdodCwgd2lkdGgsIHJlZiA7Ly8gcmVmICs9IHdpZHRoICogaGVpZ2h0OyAKKyAgICBNTEEgICAgIGJsb2NrLCBjaHJQSCwgdG1wOCwgYmxvY2s7Ly8gYmxvY2sgKyAoY2hyb21hUEgpKihjaHJvbWFQVysxKQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCisgICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCisgICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KKyAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQorICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisKKyAgICBTVFIgICAgIGNoclBILCBbc3AsICMweGZjXSAgICAgIDsvLyBoZWlnaHQKKyAgICBTVFIgICAgIHRtcDgsIFtzcCwgIzB4ZjhdICAgICAgIDsvLyB3aWR0aAorICAgIE1PViAgICAgd2lkdGgsIHRtcDgKKyAgICBTVUIgICAgIGNoclBXLCBjaHJQVywgIzEKKworc2tpcF9maWxsCisgICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCisgICAgTERSICAgICB4RnJhYywgW3NwLCAjMHgxMDBdICAgICA7Ly8geEZyYWMKKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKKyAgICBSU0IgICAgIHZhbFgsIHhGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxYID0gOC14RnJhYworCisgICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKKworCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCisgICAgOy8vIFszMToyOF0gbG9vcF94IChjaHJvbWFQYXJ0V2lkdGgtMSkKKyAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKGNocm9tYVBhcnRIZWlnaHQtMSkKKyAgICA7Ly8gWzIzOjIwXSBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIDsvLyBbMTk6MTZdIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIDsvLyBbMTU6MDBdIG5vdGhpbmcKKworICAgIFNVQiAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBTVUIgICAgIHRtcDEsIGNoclBXLCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydFdpZHRoLTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNiA7Ly8gY2hyb21hUGFydEhlaWdodC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMjQgOy8vIGxvb3BfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzIwIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBsb29wX3gKKyAgICBQS0hCVCAgIHZhbFgsIHZhbFgsIHhGcmFjLCBMU0wgIzE2ICA7Ly8gfHhGcmFjfHZhbFggfAorICAgIE1PViAgICAgdmFsWCwgdmFsWCwgTFNMICMzICAgICAgICAgIDsvLyBtdWx0aXBseSBieSA4IGluIGFkdmFuY2UKKyAgICBNT1YgICAgIGMzMiwgIzMyCisKKworICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICA7Ly8gQ2IKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCisKK2xvb3AxX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4CisgICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCisKK2xvb3AxX3gKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwgIzEKKworICAgIFBLSEJUICAgdG1wNSwgdG1wMSwgdG1wMywgTFNMICMxNgorICAgIFBLSEJUICAgdG1wNiwgdG1wMiwgdG1wNCwgTFNMICMxNgorCisgICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCisKKyAgICBTTUxBRCAgIHRtcDUsIHRtcDUsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDYsIHRtcDYsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKworICAgIFBLSEJUICAgdG1wNywgdG1wMywgdG1wMSwgTFNMICMxNgorICAgIFBLSEJUICAgdG1wOCwgdG1wNCwgdG1wMiwgTFNMICMxNgorCisgICAgU01MQUQgICB0bXA3LCB0bXA3LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgU01MQUQgICB0bXA4LCB0bXA4LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKKworICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCisKKyAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wOCwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDFfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorICAgIFNVQiAgICAgcHRyQSwgcHRyQSwgIzEKKworICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0CisgICAgQkdFICAgICBsb29wMV95CisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENyCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4ZmNdICAgICAgICAgIDsvLyBoZWlnaHQKKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgICAgICA7Ly8gcmVmCisgICAgTERSICAgICB0bXAxLCBbc3AsICMweGQwXSAgICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB0bXAyLCBbc3AsICMweGNjXSAgICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCisKKyAgICBBREQgICAgIHRtcDEsIGhlaWdodCwgdG1wMQorICAgIE1MQSAgICAgdG1wMywgdG1wMSwgd2lkdGgsIHRtcDIKKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMworICAgIEFERCAgICAgbWIsIG1iLCAjNjQKKworICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRgorICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCitsb29wMl95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAorICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQorCitsb29wMl94CisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA0LCBbcHRyQV0sICMxCisKKyAgICBQS0hCVCAgIHRtcDUsIHRtcDEsIHRtcDMsIExTTCAjMTYKKyAgICBQS0hCVCAgIHRtcDYsIHRtcDIsIHRtcDQsIExTTCAjMTYKKworICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQorCisgICAgU01MQUQgICB0bXA1LCB0bXA1LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgU01MQUQgICB0bXA2LCB0bXA2LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisKKyAgICBQS0hCVCAgIHRtcDcsIHRtcDMsIHRtcDEsIExTTCAjMTYKKyAgICBQS0hCVCAgIHRtcDgsIHRtcDQsIHRtcDIsIExTTCAjMTYKKworICAgIFNNTEFEICAgdG1wNywgdG1wNywgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wOCwgdG1wOCwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDUsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKKworICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA2LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAxCisKKyAgICBNT1YgICAgIHRtcDcsIHRtcDcsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNywgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMgorCisgICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDgsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKKyAgICBCQ1MgICAgIGxvb3AyX3gKKworICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICBBRERTICAgIG1iLCBtYiwgIzE2CisgICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKKyAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKKyAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKKyAgICBTVUIgICAgIHB0ckEsIHB0ckEsICMxCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAorICAgIEJHRSAgICAgbG9vcDJfeQorCisgICAgQUREICAgICBzcCxzcCwjMHhkNAorICAgIExETUZEICAgc3AhLCB7cjQtcjExLHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzQyMGFkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucwpAQCAtMCwwICsxLDMzOSBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIAorOy0tICAgICAgICAgICAgZnVuY3Rpb24KKzstLQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgSUYgIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworCis7Ly8gaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCitwdHJBICAgIFJOIDAKKworbWIgICAgICBSTiAxCitibG9jayAgIFJOIDEKKworeDAgICAgICBSTiAyCitjb3VudCAgIFJOIDIKKworeTAgICAgICBSTiAzCit2YWxZICAgIFJOIDMKKword2lkdGggICBSTiA0CisKK3RtcDQgICAgUk4gNQoraGVpZ2h0ICBSTiA1CisKK3RtcDEgICAgUk4gNgorCit0bXAyICAgIFJOIDcKKwordG1wMyAgICBSTiA4CisKK3ZhbFggICAgUk4gOQorCit0bXA1ICAgIFJOIDEwCitjaHJQVyAgIFJOIDEwCisKK3RtcDYgICAgUk4gMTEKK2NoclBIICAgUk4gMTEKKworeEZyYWMgICBSTiAxMgorCitjMzIgICAgIFJOIDE0Cit5RnJhYyAgIFJOIDE0CisKKzsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyCisKKzsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCis7Ly8KKzsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Cis7Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAorOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKKzsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCis7Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAorOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKKzsvLyAgdTMyIHhGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAorOy8vICB1MzIgeUZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTA0Cis7Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDgKKzsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwYworCitoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKKworICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAorICAgIExEUiAgICAgeEZyYWMsIFtzcCwgIzB4MTAwXSAgICAgOy8vIHhGcmFjCisgICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHgwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorCisgICAgQUREICAgICB0bXAxLCB4MCwgY2hyUFcgICAgICAgICA7Ly8gdG1wMSA9IHgwKyBjaHJvbWFQYXJ0V2lkdGgKKyAgICBBREQgICAgIHRtcDEsIHRtcDEsICMxICAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aCsxCisgICAgQ01QICAgICB0bXAxLCB3aWR0aCAgICAgICAgICAgICA7Ly8geDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwKKyAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwY10gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0CisgICAgQUREICAgICB0bXAxLCB5MCwgY2hyUEggICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodAorICAgIEFERCAgICAgdG1wMSwgdG1wMSwgIzEgICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQgKyAxCisgICAgQ01QICAgICB0bXAxLCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbAorCitkb19maWxsCisgICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMGNdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wMywgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDMgPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIEFERCAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDEgPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIEFERCAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0SGVpZ2h0KzEKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAorICAgIE1MQSAgICAgYmxvY2ssIHRtcDIsIHRtcDEsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBXKzEpKihjaHJvbWFQSCsxKQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCisgICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCisgICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KKyAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQorICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisKKyAgICBTVFIgICAgIHRtcDIsIFtzcCwgIzB4ZmNdICAgICAgIDsvLyBoZWlnaHQKKyAgICBTVFIgICAgIHRtcDEsIFtzcCwgIzB4ZjhdICAgICAgIDsvLyB3aWR0aAorICAgIE1PViAgICAgd2lkdGgsIHRtcDEKKworc2tpcF9maWxsCisgICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCisgICAgTERSICAgICB5RnJhYywgW3NwLCAjMHgxMDRdICAgICA7Ly8geUZyYWMKKyAgICBMRFIgICAgIHhGcmFjLCBbc3AsICMweDEwMF0KKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKKyAgICBSU0IgICAgIHZhbFgsIHhGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxYID0gOC14RnJhYworICAgIFJTQiAgICAgdmFsWSwgeUZyYWMsICM4ICAgICAgICAgOy8vIHZhbFkgPSA4LXlGcmFjCisKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQorCisKKyAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKKyAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQorICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCisgICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCisgICAgOy8vIFsxNTowMF0gbm90aGluZworCisgICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAorICAgIFBLSEJUICAgdmFsWSwgdmFsWSwgeUZyYWMsIExTTCAjMTYgIDsvLyB8eUZyYWN8dmFsWSB8CisgICAgTU9WICAgICBjMzIsICMzMgorCisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENiCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KKyAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgYW5kIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbgorCitsb29wMV95CisgICAgTERSQiAgICB0bXAxLCBbcHRyQV0KKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQorCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKKyAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAorCisgICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCisgICAgU01VQUQgICB0bXAzLCB0bXAzLCB2YWxZICAgICAgICAgICAgOy8vIHQzPSh0Myp2YWxZICsgdDUqeUZyYWMpCisKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Citsb29wMV94CisgICAgOy8vIGZpcnN0CisgICAgTERSQiAgICB0bXAyLCBbcHRyQSwgIzFdIQorICAgIExEUkIgICAgdG1wNCwgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wNiwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCisKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjMTYgICA7Ly8gfHQ0fHQyfAorICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMxNiAgIDsvLyB8dDZ8dDR8CisKKyAgICBTTVVBRCAgIHRtcDIsIHRtcDIsIHZhbFkgICAgICAgICAgICA7Ly8gdDI9KHQyKnZhbFkgKyB0NCp5RnJhYykKKyAgICBNTEEgICAgIHRtcDUsIHRtcDEsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDU9dDEqdmFsWCszMgorICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgeEZyYWMsIHRtcDUgICAgIDsvLyB0NT10Mip4RnJhYyt0NQorCisgICAgU01VQUQgICB0bXA0LCB0bXA0LCB2YWxZICAgICAgICAgICAgOy8vIHQ0PSh0NCp2YWxZICsgdDYqeUZyYWMpCisgICAgTUxBICAgICB0bXA2LCB0bXAzLCB2YWxYLCBjMzIgICAgICAgOy8vIHQzPXQzKnZhbFgrMzIKKyAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHhGcmFjLCB0bXA2ICAgICA7Ly8gdDY9dDQqeEZyYWMrdDYKKworICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA2LCBbbWIsICM4XSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDUsIFttYl0sICMxICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKworICAgIDsvLyBzZWNvbmQKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8CisgICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKKworICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgorICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1CisKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKKyAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDFfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AxX3kKKworICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICA7Ly8gQ3IKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKKyAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKKworICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCisgICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgorICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCisgICAgQUREICAgICBtYiwgbWIsICM2NAorCisgICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4CisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24KK2xvb3AyX3kKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBXQorICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wNSwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCisKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjMTYgICA7Ly8gfHQzfHQxfAorICAgIFBLSEJUICAgdG1wMywgdG1wMywgdG1wNSwgTFNMICMxNiAgIDsvLyB8dDV8dDN8CisKKyAgICBTTVVBRCAgIHRtcDEsIHRtcDEsIHZhbFkgICAgICAgICAgICA7Ly8gdDE9KHQxKnZhbFkgKyB0Myp5RnJhYykKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKworICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKK2xvb3AyX3gKKyAgICA7Ly8gZmlyc3QKKyAgICBMRFJCICAgIHRtcDIsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXA0LCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA2LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMxNiAgIDsvLyB8dDR8dDJ8CisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHx0Nnx0NHwKKworICAgIFNNVUFEICAgdG1wMiwgdG1wMiwgdmFsWSAgICAgICAgICAgIDsvLyB0Mj0odDIqdmFsWSArIHQ0KnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgdmFsWCwgYzMyICAgICAgIDsvLyB0NT10MSp2YWxYKzMyCisgICAgTUxBICAgICB0bXA1LCB0bXAyLCB4RnJhYywgdG1wNSAgICAgOy8vIHQ1PXQyKnhGcmFjK3Q1CisKKyAgICBTTVVBRCAgIHRtcDQsIHRtcDQsIHZhbFkgICAgICAgICAgICA7Ly8gdDQ9KHQ0KnZhbFkgKyB0Nip5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDM9dDMqdmFsWCszMgorICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgeEZyYWMsIHRtcDYgICAgIDsvLyB0Nj10NCp4RnJhYyt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgOy8vIHNlY29uZCAKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8CisgICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKKworICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgorICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1CisKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKKyAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDJfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AyX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4ZDQKKyAgICBMRE1GRCAgIHNwISx7cjQtcjExLHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmOWRmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucwpAQCAtMCwwICsxLDI4OCBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlciByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorcHRyQSAgICBSTiAwCisKK21iICAgICAgUk4gMQorYmxvY2sgICBSTiAxCisKK3gwICAgICAgUk4gMgorY291bnQgICBSTiAyCisKK3kwICAgICAgUk4gMwordmFsWSAgICBSTiAzCisKK3dpZHRoICAgUk4gNAorCitoZWlnaHQgIFJOIDUKK3RtcDcgICAgUk4gNQorCitjaHJQVyAgIFJOIDYKK3RtcDggICAgUk4gNgorCit0bXAxICAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK3RtcDUgICAgUk4gMTEKK2NoclBIICAgUk4gMTEKKwordG1wNiAgICBSTiAxMgorCitjMzIgICAgIFJOIDE0Cit5RnJhYyAgIFJOIDE0CisKKzsvLyBGdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCisKKzsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCis7Ly8KKzsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Cis7Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAorOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKKzsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCis7Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAorOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKKzsvLyAgdTMyIHlGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAorOy8vICB1MzIgY2hyb21hUGFydFdpZHRoLCAgICAgICA6IDB4MTA0Cis7Ly8gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0ICAgICAgIDogMHgxMDgKKworaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweGM0CisKKyAgICBMRFIgICAgIGNoclBXLCBbc3AsICMweDEwNF0gICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAorICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsCisKKyAgICBBREQgICAgIHRtcDEsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aAorICAgIENNUCAgICAgdG1wMSwgd2lkdGggICAgICAgICAgICAgOy8vIHgwK2Nocm9tYVBhcnRXaWR0aCA+IHdpZHRoCisgICAgQkhJICAgICBkb19maWxsCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDEsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXAxID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAxLCB0bXAxLCAjMSAgICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodCArIDEKKyAgICBDTVAgICAgIHRtcDEsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0CisgICAgQUREICAgICB0bXAxLCBjaHJQSCwgIzEgICAgICAgICA7Ly8gdG1wMSA9IGNocm9tYVBhcnRIZWlnaHQrMQorICAgIE1PViAgICAgdG1wMiwgY2hyUFcgICAgICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0V2lkdGgKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsY2hyUFcsdG1wMSx0bXAyfQorICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBMRFIgICAgIHgwLCBbc3AsICMweGNjXQorICAgIExEUiAgICAgeTAsIFtzcCwgIzB4ZDBdCisgICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisgICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LGNoclBXLHRtcDEsdG1wMn0KKyAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jaworICAgIE1MQSAgICAgcmVmLCBoZWlnaHQsIHdpZHRoLCByZWYgOy8vIHJlZiArPSB3aWR0aCAqIGhlaWdodDsgCisgICAgTUxBICAgICBibG9jaywgY2hyUFcsIHRtcDEsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBXKSooY2hyb21hUEgrMSkKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIE1PViAgICAgeDAsICMwICAgICAgICAgICAgICAgICAgOy8vIHgwID0gMAorICAgIE1PViAgICAgeTAsICMwICAgICAgICAgICAgICAgICAgOy8vIHkwID0gMAorICAgIFNUUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgU1RSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBBREQgICAgIHJlZiwgc3AsICMweDFjICAgICAgICAgIDsvLyByZWYgPSBibG9jaworICAgIFNUUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgorCisgICAgU1RSICAgICB0bXAxLCBbc3AsICMweGZjXSAgICAgICA7Ly8gaGVpZ2h0CisgICAgU1RSICAgICBjaHJQVywgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNT1YgICAgIHdpZHRoLCBjaHJQVworCitza2lwX2ZpbGwKKyAgICBNTEEgICAgIHRtcDMsIHkwLCB3aWR0aCwgeDAgICAgIDsvLyB0bXAzID0geTAqd2lkdGgreDAKKyAgICBMRFIgICAgIHlGcmFjLCBbc3AsICMweDEwMF0gICAgIDsvLyB5RnJhYworICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzICAgICAgICAgOy8vIHB0ckEgPSByZWYgKyB5MCp3aWR0aCt4MAorICAgIFJTQiAgICAgdmFsWSwgeUZyYWMsICM4ICAgICAgICAgOy8vIHZhbFkgPSA4LXlGcmFjCisKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQorCisKKyAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKKyAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQorICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCisgICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCisgICAgOy8vIFsxNTowMF0gbm90aGluZworCisgICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAorICAgIFBLSEJUICAgdmFsWSwgdmFsWSwgeUZyYWMsIExTTCAjMTYgIDsvLyB8eUZyYWN8dmFsWSB8CisgICAgTU9WICAgICB2YWxZLCB2YWxZLCBMU0wgIzMgICAgICAgICAgOy8vIG11bHRpcGx5IGJ5IDggaW4gYWR2YW5jZQorICAgIE1PViAgICAgYzMyLCAjMzIKKworCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIDsvLyBDYgorICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KKworbG9vcDFfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKK2xvb3AxX3gKKyAgICA7Ly8gUHJvY2VzcyAyeDIgYmxvY2sKKyAgICBMRFJCICAgIHRtcDIsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDEgY29sCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAxIGNvbAorICAgIExEUkIgICAgdG1wMSwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMSBjb2wKKworICAgIExEUkIgICAgdG1wNSwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMiBjb2wKKyAgICBMRFJCICAgIHRtcDYsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDIgY29sCisgICAgTERSQiAgICB0bXA0LCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAyIGNvbAorCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzE2ICAgOy8vIHxCfEF8CisgICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHxDfEJ8CisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzE2ICAgOy8vIHxCfEF8CisKKyAgICBTTUxBRCAgIHRtcDcsIHRtcDIsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcDYsIExTTCAjMTYgICA7Ly8gfEN8QnwKKyAgICBTTUxBRCAgIHRtcDIsIHRtcDEsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDgsIHRtcDUsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDUsIHRtcDQsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKworICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCisgICAgTU9WICAgICB0bXAyLCB0bXAyLCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDIsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKKworICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA4LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDUsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKKworCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDFfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AxX3kgCisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENyCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4ZmNdICAgICAgICAgIDsvLyBoZWlnaHQKKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgICAgICA7Ly8gcmVmCisgICAgTERSICAgICB0bXAxLCBbc3AsICMweGQwXSAgICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB0bXAyLCBbc3AsICMweGNjXSAgICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCisKKyAgICBBREQgICAgIHRtcDEsIGhlaWdodCwgdG1wMQorICAgIE1MQSAgICAgdG1wMywgdG1wMSwgd2lkdGgsIHRtcDIKKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMworICAgIEFERCAgICAgbWIsIG1iLCAjNjQKKworICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRgorICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCitsb29wMl95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAorbG9vcDJfeAorICAgIDsvLyBQcm9jZXNzIDJ4MiBibG9jaworICAgIExEUkIgICAgdG1wMiwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMSBjb2wKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDEgY29sCisgICAgTERSQiAgICB0bXAxLCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAxIGNvbAorCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAyIGNvbAorICAgIExEUkIgICAgdG1wNiwgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMiBjb2wKKyAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDIgY29sCisKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjMTYgICA7Ly8gfEJ8QXwKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDMsIExTTCAjMTYgICA7Ly8gfEN8QnwKKyAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjMTYgICA7Ly8gfEJ8QXwKKworICAgIFNNTEFEICAgdG1wNywgdG1wMiwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wNiwgTFNMICMxNiAgIDsvLyB8Q3xCfAorICAgIFNNTEFEICAgdG1wMiwgdG1wMSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wOCwgdG1wNSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wNSwgdG1wNCwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorCisgICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKKyAgICBNT1YgICAgIHRtcDIsIHRtcDIsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wMiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQorCisgICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDgsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgorCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4CisgICAgQkNTICAgICBsb29wMl94CisKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAorCisgICAgQUREUyAgICBtYiwgbWIsICMxNgorICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCisgICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCisgICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAorICAgIEJHRSAgICAgbG9vcDJfeQorCisgICAgQUREICAgICBzcCxzcCwjMHhkNAorICAgIExETUZEICAgc3AhLCB7cjQtcjExLHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM5NjhiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucwpAQCAtMCwwICsxLDI1MSBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZiBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCisgICAgRUxTRQorICAgICAgICBSRVFVSVJFOAorICAgICAgICBQUkVTRVJWRTgKKyAgICBFTkRJRgorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCisKK21iICAgICAgUk4gMQorYnVmZiAgICBSTiAxCisKK2NvdW50ICAgUk4gMgoreDAgICAgICBSTiAyCisKK3kwICAgICAgUk4gMworeF8yXzAgICBSTiAzCisKK3dpZHRoICAgUk4gNAoreF8zXzEgICBSTiA0CisKK2hlaWdodCAgUk4gNQoreF82XzQgICBSTiA1CisKK3BhcnRXICAgUk4gNgoreF83XzUgICBSTiA2CisKK3BhcnRIICAgUk4gNwordG1wMSAgICBSTiA3CisKK3RtcDIgICAgUk4gOAorCit0bXAzICAgIFJOIDkKKwordG1wNCAgICBSTiAxMAorCittdWx0XzIwXzAxICBSTiAxMQorbXVsdF8yMF9tNSAgUk4gMTIKKworcGx1czE2ICBSTiAxNAorCisKKzsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZgorCis7Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKKzsvLworOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cworOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCis7Ly8KKzsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAorOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQorOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKKzsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKKworCitoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQorICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKKworICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBBREQgICAgIHRtcDQsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQorICAgIEFERCAgICAgdG1wNCwgdG1wNCwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0Vys1KQorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgQ01QICAgICB0bXA0LCB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKKworICAgIENNUCAgICAgeTAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAyLCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgQ01QICAgICB0bXAyLCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKKworCitkb19maWxsCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNCwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcDQgPSBwYXJ0VyArIDU7CisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wNH0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1CisgICAgU1RSICAgICBwYXJ0SCwgW3NwLCMweGNdICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQKKyAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1CisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKKyAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQorICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDIsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4CisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKKworICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCisgICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCisgICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKKyAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKKyAgICA7Ly8gWzE1OjAwXSB3aWR0aAorICAgIE1PViAgICAgY291bnQsIHdpZHRoCisgICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOworICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKKyAgICBBREQgICAgIHRtcDIsIHBhcnRILCBwYXJ0VywgTFNMICM0CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYKKworCisgICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEKKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQgorICAgIE1PViAgICAgcGx1czE2LCAjMTYKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorbG9vcF95CisgICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzgKKyAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisgICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKKworbG9vcF94CisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyCisgICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMworICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQKKworICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1CisgICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQorICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKKyAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0CisgICAgQkNDICAgICBuZXh0X3kKKworICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKworICAgIFNNTEFEICAgdG1wMSwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wMiwgeF82XzQsIG11bHRfMjBfbTUsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wNCwgeF83XzUsIG11bHRfMjBfMDEsIHBsdXMxNgorCisgICAgU01MQUQgICB0bXAxLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMQorICAgIFNNTEFUQiAgdG1wMywgeF83XzUsIG11bHRfMjBfbTUsIHRtcDMKKyAgICBTTUxBRCAgIHRtcDIsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAyCisgICAgTERSICAgICB4XzdfNSwgW3JlZl0sICM0CisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNAorCisgICAgU01MQUJCICB0bXAxLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMQorICAgIFNNTEFEWCAgdG1wMywgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDMKKyAgICBTTUxBRFggIHRtcDIsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXAyCisgICAgU01MQURYICB0bXA0LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNAorCisgICAgU01MQUJCICB0bXAxLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMQorICAgIFVYVEIxNiAgeF82XzQsIHhfN181CisgICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMgorICAgIFNNTEFEWCAgdG1wMywgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDMKKyAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXA0CisKKyAgICBNT1YgICAgIHRtcDIsIHRtcDIsIEFTUiAjNQorICAgIE1PViAgICAgdG1wMSwgdG1wMSwgQVNSICM1CisgICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIygxNi01KQorICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMoMTYtNSkKKyAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCisgICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAorICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisgICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNAorICAgIEJDUyAgICAgbG9vcF94CisKK25leHRfeQorICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQorICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmIDsvLyArd2lkdGgKKyAgICBBRERTICAgIG1iLCBtYiwgIzE2ICAgICAgICAgICAgICAgICA7Ly8gKzE2LCBDYXJyeT0wCisgICAgU0JDICAgICBtYiwgbWIsIHRtcDMsIExTUiAjMjAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKKyAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXAzLCBMU1IgIzIwICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjQpCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4MWY0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQorCisgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTI0M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCkBAIC0wLDAgKzEsMjczIEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7Cis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy0tCis7LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgorCityZWYgICAgIFJOIDAKKworbWIgICAgICBSTiAxCitidWZmICAgIFJOIDEKKworY291bnQgICBSTiAyCit4MCAgICAgIFJOIDIKKworeTAgICAgICBSTiAzCit4XzJfMCAgIFJOIDMKKword2lkdGggICBSTiA0Cit4XzNfMSAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit4XzZfNCAgIFJOIDUKKworcGFydFcgICBSTiA2Cit4XzdfNSAgIFJOIDYKKworcGFydEggICBSTiA3Cit0bXAxICAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK211bHRfMjBfMDEgIFJOIDExCisKK211bHRfMjBfbTUgIFJOIDEyCisKK3BsdXMxNiAgUk4gMTQKKworCis7Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cworCisgICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKKworCis7Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKKzsvLworOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cworOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCis7Ly8KKzsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAorOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQorOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKKzsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKKworCitoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQorICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKKworICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBBREQgICAgIHRtcDQsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQorICAgIEFERCAgICAgdG1wNCwgdG1wNCwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0Vys1KQorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgQ01QICAgICB0bXA0LCB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKKworICAgIENNUCAgICAgeTAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAyLCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgQ01QICAgICB0bXAyLCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKKworCitkb19maWxsCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNCwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcDQgPSBwYXJ0VyArIDU7CisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wNH0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1CisgICAgU1RSICAgICBwYXJ0SCwgW3NwLCMweGNdICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQKKyAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1CisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKKyAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQorICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDIsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4CisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKKworICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCisgICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCisgICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKKyAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKKyAgICA7Ly8gWzE1OjAwXSB3aWR0aAorICAgIE1PViAgICAgY291bnQsIHdpZHRoCisgICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOworICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKKyAgICBBREQgICAgIHRtcDIsIHBhcnRILCBwYXJ0VywgTFNMICM0CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYKKworCisgICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEKKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQgorICAgIE1PViAgICAgcGx1czE2LCAjMTYKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorbG9vcF95CisgICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzgKKyAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisgICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKKworbG9vcF94CisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyCisgICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMworICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQKKworICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1CisgICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQorICAgIExEUiAgICAgdG1wNCwgW3NwLCAjMHgyMjhdCisgICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgorICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKKyAgICBTVUIgICAgIHRtcDQsIHRtcDQsICMxMAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAorICAgIExEUiAgICAgdG1wMywgW3JlZiwgdG1wNF0KKyAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAorCis7Ly8gcXVhcnRlciBwZWwgcG9zaXRpb24KKyAgICBMRFIgICAgIHRtcDIsID0gMHg4MDgwODA4MAorICAgIE1WTiAgICAgdG1wMywgdG1wMworICAgIFVIU1VCOCAgdG1wMSwgdG1wMSwgdG1wMworICAgIEVPUiAgICAgdG1wMSwgdG1wMSwgdG1wMgorICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKKworICAgIEJDQyAgICAgbmV4dF95CisKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDMsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKKworICAgIFNNTEFEICAgdG1wMSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBVEIgIHRtcDMsIHhfN181LCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQUQgICB0bXAyLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMgorICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAorICAgIFNNTEFEICAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBRFggIHRtcDMsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQURYICB0bXAyLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wMgorICAgIFNNTEFEWCAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDEKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorICAgIFNNTEFCQiAgdG1wMiwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDIKKyAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzCisgICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNAorCisgICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKKyAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQorICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCisgICAgTERSICAgICB0bXA0LCBbc3AsICMweDIyOF0KKyAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCisgICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQorICAgIFNVQiAgICAgdG1wNCwgdG1wNCwgIzEwCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgTERSICAgICB0bXAzLCBbcmVmLCB0bXA0XQorICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisKKzsvLyBxdWFydGVyIHBlbAorICAgIExEUiAgICAgdG1wMiwgPSAweDgwODA4MDgwCisgICAgTVZOICAgICB0bXAzLCB0bXAzCisgICAgVUhTVUI4ICB0bXAxLCB0bXAxLCB0bXAzCisgICAgRU9SICAgICB0bXAxLCB0bXAxLCB0bXAyCisKKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0CisgICAgQkNTICAgICBsb29wX3gKKworbmV4dF95CisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgOy8vICt3aWR0aAorICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMywgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDMsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkKKyAgICBCR0UgICAgIGxvb3BfeQorCisgICAgQUREICAgICBzcCxzcCwjMHgxZjQKKyAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9CisKKyAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWM3OWIzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKQEAgLTAsMCArMSw1MzYgQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIgCis7LS0gICAgICAgICAgICBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCisgICAgRUxTRQorICAgICAgICBSRVFVSVJFOAorICAgICAgICBQUkVTRVJWRTgKKyAgICBFTkRJRgorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCisKK21iICAgICAgUk4gMQorYnVmZiAgICBSTiAxCisKK2NvdW50ICAgUk4gMgoreDAgICAgICBSTiAyCisKK3kwICAgICAgUk4gMworeF8yXzAgICBSTiAzCityZXMgICAgIFJOIDMKKworeF8zXzEgICBSTiA0Cit0bXAxICAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit4XzZfNCAgIFJOIDUKK3RtcDIgICAgUk4gNQorCitwYXJ0VyAgIFJOIDYKK3hfN181ICAgUk4gNgordG1wMyAgICBSTiA2CisKK3BhcnRIICAgUk4gNwordG1wNCAgICBSTiA3CisKK3RtcDUgICAgUk4gOAorCit0bXA2ICAgIFJOIDkKKwordG1wYSAgICBSTiAxMAorCittdWx0XzIwXzAxICBSTiAxMQordG1wYiAgICAgICAgUk4gMTEKKworbXVsdF8yMF9tNSAgUk4gMTIKK3dpZHRoICAgICAgIFJOIDEyCisKK3BsdXMxNiAgUk4gMTQKKworCis7Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cworCisgICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIKKworOy8vIEhvcml6b250YWwgZmlsdGVyIGFwcHJvYWNoCis7Ly8KKzsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMKKzsvLyBsaWtlIGJlbG93LiBDYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggMTYtYml0IG1hdGhzLgorOy8vCis7Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzAKKzsvLyAgICAgICBbICAyICAwIF0gWyAgMyAgMSBdIFsgIDYgIDQgXSBbICA3ICA1IF0gWyAxMCAgOCBdIC4uLgorOy8vIHlfMCA9ICAgMjAgIDEgICAgIDIwIC01ICAgICAgICAtNSAgICAgICAgIDEKKzsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01Cis7Ly8geV8yID0gICAgMSAgICAgICAgLTUgICAgICAgIC01IDIwICAgICAgMSAyMAorOy8vIHlfMyA9ICAgICAgICAgICAgICAxICAgICAgICAyMCAtNSAgICAgLTUgMjAgICAgICAgICAxCisKKworaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgorICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0CisKKyAgICBDTVAgICAgIHgwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBBREQgICAgIHRtcGEsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgIzUgICAgICAgICAgOy8vICh4MCtwYXJ0Vys1KQorICAgIENNUCAgICAgdG1wYSwgd2lkdGgKKyAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wNSwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQorICAgIEFERCAgICAgdG1wNSwgdG1wNSwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0SCs1KQorICAgIENNUCAgICAgdG1wNSwgaGVpZ2h0CisgICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCisKKworZG9fZmlsbAorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDUsIHBhcnRILCAjNSAgICAgICAgIDsvLyB0bXA1ID0gcGFydEggKyA1CisgICAgQUREICAgICB0bXBhLCBwYXJ0VywgIzUgICAgICAgICA7Ly8gdG1wYSA9IHBhcnRXICsgNQorICAgIFNUTUlCICAgc3AsIHtoZWlnaHQsIHRtcGF9ICAgICAgOy8vIHNwKzQgPSBoZWlnaHQsIHNwKzggPSBwYXJ0V2lkdGgrNQorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgU1RSICAgICB0bXA1LCBbc3AsIzB4Y10gICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQrNQorICAgIFNUUiAgICAgdG1wYSwgW3NwLCMweDEwXSAgICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoKzUKKyAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKKyAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQorICAgIFNUUiAgICAgdG1wYSwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBMRFIgICAgIHRtcDYsIFtzcCwjMHgyMjhdICAgICAgIDsvLyBob3JWZXJPZmZzZXQKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgorICAgIE1MQSAgICAgdG1wNSwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCisgICAgQUREICAgICByZWYsIHJlZiwgdG1wNSAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4MWU0XSAgICAgICA7Ly8gc3RvcmUgInJlZiIgZm9yIHZlcnRpY2FsIGZpbHRlcmluZworICAgIEFORCAgICAgdG1wNiwgdG1wNiwgIzIgICAgICAgICAgOy8vIGNhbGN1bGF0ZSByZWYgZm9yIGhvcml6b250YWwgZmlsdGVyCisgICAgTU9WICAgICB0bXBhLCAjMgorICAgIEFERCAgICAgdG1wNiwgdG1wYSwgdG1wNiwgTFNSICMxCisgICAgTUxBICAgICByZWYsIHRtcDYsIHdpZHRoLCByZWYKKyAgICBBREQgICAgIHJlZiwgcmVmLCAjOCAgICAgICAgICAgIDsvLyByZWYgPSByZWYrOAorCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCisgICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkKKyAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkKKyAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQorICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQorICAgIDsvLyBbMTU6MDBdIHdpZHRoCisgICAgTU9WICAgICBjb3VudCwgd2lkdGgKKyAgICBTVUIgICAgIHBhcnRXLCBwYXJ0VywgIzE7CisgICAgU1VCICAgICBwYXJ0SCwgcGFydEgsICMxOworICAgIEFERCAgICAgdG1wNSwgcGFydEgsIHBhcnRXLCBMU0wgIzQKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNSwgTFNMICMxNgorCisKKyAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMSAgICA7Ly8gY29uc3RhbnQgbXVsdGlwbGllcnMKKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQiAgICA7Ly8gY29uc3RhbnQgbXVsdGlwbGllcnMKKyAgICBNT1YgICAgIHBsdXMxNiwgIzE2ICAgICAgICAgICAgICAgICA7Ly8gY29uc3RhbnQgZm9yIGFkZAorICAgIEFORCAgICAgdG1wNCwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKKyAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNCwgTFNMICM4ICA7Ly8gcGFydEgtMSB0byBsb3dlciBwYXJ0IG9mIHRvcCBieXRlCisKKzsvLyBIT1JJWk9OVEFMIFBBUlQKKworbG9vcF95X2hvcgorICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0KKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNiwgTFNMICM4ICAgOy8vIHBhcnRXLTEgdG8gdXBwZXIgcGFydCBvZiB0b3AgYnl0ZQorICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQorICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorCitsb29wX3hfaG9yCisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXA2LCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXA1LCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXBhLCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0CisgICAgU01MQVRCICB0bXA2LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNgorICAgIFNNTEFEICAgdG1wNSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDUKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcGEsIHhfNl80LCBtdWx0XzIwX201LCB0bXBhCisKKyAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0CisgICAgU01MQURYICB0bXA2LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNgorICAgIFNNTEFEWCAgdG1wNSwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDUKKyAgICBTTUxBRFggIHRtcGEsIHhfN181LCBtdWx0XzIwX201LCB0bXBhCisKKyAgICBTTUxBQkIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCB0bXA0CisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBTTUxBQkIgIHRtcDUsIHhfN181LCBtdWx0XzIwX201LCB0bXA1CisgICAgU01MQURYICB0bXA2LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNgorICAgIFNNTEFCQiAgdG1wYSwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcGEKKworICAgIE1PViAgICAgdG1wNSwgdG1wNSwgQVNSICM1CisgICAgTU9WICAgICB0bXA0LCB0bXA0LCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcGEsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIygxNi01KQorICAgIFVTQVQxNiAgdG1wNSwgIzgsIHRtcDUKKyAgICBVU0FUMTYgIHRtcDQsICM4LCB0bXA0CisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgT1JSICAgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzgKKyAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0CisgICAgQkNDICAgICBuZXh0X3lfaG9yCisKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisKKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDYsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDUsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcGEsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKKworICAgIFNNTEFEICAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQKKyAgICBTTUxBVEIgIHRtcDYsIHhfN181LCBtdWx0XzIwX201LCB0bXA2CisgICAgU01MQUQgICB0bXA1LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNQorICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAorICAgIFNNTEFEICAgdG1wYSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcGEKKworICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKKyAgICBTTUxBRFggIHRtcDYsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA2CisgICAgU01MQURYICB0bXA1LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNQorICAgIFNNTEFEWCAgdG1wYSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcGEKKworICAgIFNNTEFCQiAgdG1wNCwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDQKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorICAgIFNNTEFCQiAgdG1wNSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDUKKyAgICBTTUxBRFggIHRtcDYsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXA2CisgICAgU01MQUJCICB0bXBhLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wYQorCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBBU1IgIzUKKyAgICBNT1YgICAgIHRtcDQsIHRtcDQsIEFTUiAjNQorICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wYSwgTFNMICMoMTYtNSkKKyAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDYsIExTTCAjKDE2LTUpCisgICAgVVNBVDE2ICB0bXA1LCAjOCwgdG1wNQorICAgIFVTQVQxNiAgdG1wNCwgIzgsIHRtcDQKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKKyAgICBPUlIgICAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjOAorICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQKKyAgICBCQ1MgICAgIGxvb3BfeF9ob3IKKworbmV4dF95X2hvcgorICAgIEFORCAgICAgdG1wNiwgY291bnQsICMweDAwRjAwMDAwICAgICAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiAgICAgOy8vICt3aWR0aAorICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgICAgICA7Ly8gKzE2LCBDYXJyeT0wCisgICAgU0JDICAgICBtYiwgbWIsIHRtcDYsIExTUiAjMjAgICAgICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgU0JDICAgICByZWYsIHJlZiwgdG1wNiwgTFNSICMyMCAgICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkgIDsvLyBkZWNyZW1lbnQgY291bnRlciAocGFydFcpCisgICAgQkdFICAgICBsb29wX3lfaG9yCisKKworCis7Ly8gVkVSVElDQUwgUEFSVAorOy8vCis7Ly8gQXBwcm9hY2ggdG8gdmVydGljYWwgaW50ZXJwb2xhdGlvbgorOy8vCis7Ly8gSW50ZXJwb2xhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIDMyLWJpdCBsb2FkcyBhbmQgc3RvcmVzCis7Ly8gYW5kIGJ5IHVzaW5nIDE2IGJpdCBhcml0aG1ldGljLiA0eDQgYmxvY2sgaXMgcHJvY2Vzc2VkCis7Ly8gaW4gZWFjaCByb3VuZC4KKzsvLworOy8vIHxhXzExfGFfMTF8YV8xMXxhXzExfC4uLnxhXzFufGFfMW58YV8xbnxhXzFufAorOy8vIHxiXzExfGJfMTF8Yl8xMXxiXzExfC4uLnxiXzFufGJfMW58Yl8xbnxiXzFufAorOy8vIHxjXzExfGNfMTF8Y18xMXxjXzExfC4uLnxjXzFufGNfMW58Y18xbnxjXzFufAorOy8vIHxkXzExfGRfMTF8ZF8xMXxkXzExfC4uLnxkXzFufGRfMW58ZF8xbnxkXzFufAorOy8vICAgICAgICAgICAuLgorOy8vICAgICAgICAgICAuLgorOy8vIHxhX20xfGFfbTF8YV9tMXxhX20xfC4uLgorOy8vIHxiX20xfGJfbTF8Yl9tMXxiX20xfC4uLgorOy8vIHxjX20xfGNfbTF8Y19tMXxjX20xfC4uLgorOy8vIHxkX20xfGRfbTF8ZF9tMXxkX20xfC4uLgorCis7Ly8gQXBwcm9hY2ggdG8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0byBxdWFydGVyIHBlbCBwb3NpdGlvbi4KKzsvLyA0IGJ5dGVzIGFyZSBwcm9jZXNzZWQgcGFyYWxsZWwKKzsvLworOy8vIGFsZ29yaXRobSAoYStiKzEpLzIuIFJvdWRpbmcgdXB3YXJkcyArMSBjYW4gYmUgYWNoaWV2ZWQgYnkgCis7Ly8gbmVnYXRpbmcgc2Vjb25kIG9wZXJhbmQgdG8gZ2V0IG9uZSdzIGNvbXBsZW1lbnQgKGluc3RlYWQgb2YgMidzKQorOy8vIGFuZCB1c2luZyBzdWJ0cmFjdGlvbiwgRU9SIGlzIHVzZWQgdG8gY29ycmVjdCBzaWduLgorOy8vCis7Ly8gTVZOICAgICBiLCBiCis7Ly8gVUhTVUI4ICBhLCBhLCBiCis7Ly8gRU9SICAgICBhLCBhLCAweDgwODA4MDgwCisKKworICAgIExEUiAgICAgcmVmLCBbc3AsICMweDFlNF0gICAgICAgICAgIDsvLyByZWYKKyAgICBMRFIgICAgIHRtcGEsIFtzcCwgIzB4MjI4XSAgICAgICAgICA7Ly8gaG9yVmVyT2Zmc2V0CisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICAgICAgOy8vIG1iCisgICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHgyMThdICAgICAgICAgOy8vIHdpZHRoCisgICAgQUREICAgICByZWYsIHJlZiwgIzIgICAgICAgICAgICAgICAgOy8vIGNhbGN1bGF0ZSBjb3JyZWN0IHBvc2l0aW9uCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCAjMQorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcGEKKyAgICBMRFIgICAgIHBsdXMxNiwgPSAweDAwMTAwMDEwICAgICAgICA7Ly8gKzE2IHRvIGxvd2VyIGFuZCB1cHBlcmYgaGFsZndvcmRzCisgICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGICAgOy8vIHBhcnRXaWR0aC0xCisKKyAgICBBTkQgICAgIHRtcGEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcGEsIExTTCAjOAorCitsb29wX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNiwgTFNMICM4ICA7Ly8gcGFydFdpZHRoLTEKKworbG9vcF94CisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8CisgICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8CisgICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8CisgICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8CisgICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8CisgICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMgCisgICAgVVhUQjE2ICB0bXBhLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wMiAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wMiwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wMSwgW21iXQorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisgICAgTVZOICAgICB0bXAxLCB0bXAxCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKworICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCisgICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KKyAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdworICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KKworICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdyAobWIpCisKKworICAgIDsvLyB0bXAyID0gfGE0fGEzfGEyfGExfAorICAgIDsvLyB0bXAzID0gfGM0fGMzfGMyfGMxfAorICAgIDsvLyB0bXA0ID0gfGc0fGczfGcyfGcxfAorICAgIDsvLyB0bXA1ID0gfG00fG0zfG0yfG0xfAorICAgIDsvLyB0bXA2ID0gfHI0fHIzfHIyfHIxfAorICAgIDsvLyB0bXAxID0gfHQ0fHQzfHQyfHQxfAorCisgICAgOy8vIHNlY29uZCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAyLCBbbWJdCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk4gICAgIHRtcDIsIHRtcDIKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAyICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAzLCBbbWJdCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk4gICAgIHRtcDMsIHRtcDMKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAzICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMywgW3JlZl0gICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDQgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDUgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDYgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDEgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDIgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDMgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZm91cnRoIGZvdXIgcGl4ZWxzCisgICAgVVhUQjE2ICB0bXBhLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXA2LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDUsIFttYl0KKyAgICBMRFIgICAgIHRtcDQsID0gMHhGRjAwRkYwMAorICAgIE1WTiAgICAgdG1wNSwgdG1wNQorCisgICAgQU5EICAgICB0bXBhLCB0bXA0LCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDUgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisKKyAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOCAgICAgICAgOy8vIGRlY3JlbWVudCB4IGxvb3AgY291bnRlcgorCisgICAgOy8vIGNhbGN1bGF0ZSAicmVmIiBhZGRyZXNzIGZvciBuZXh0IHJvdW5kCisgICAgU1VCICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMyAgICAgOy8vIHJlZiAtPSA4KndpZHRoOworICAgIEFERCAgICAgcmVmLCByZWYsICM0ICAgICAgICAgICAgICAgIDsvLyBuZXh0IGNvbHVtbiAoNCBwaXhlbHMpCisKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisgICAgU1RSICAgICByZXMsIFttYl0sICMtNDQKKworICAgIEJDUyAgICAgbG9vcF94CisKKyAgICBBRERTICAgIG1iLCBtYiwgIzY0ICAgICAgICAgICAgICAgICA7Ly8gc2V0IENhcnJ5PTAKKyAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKKyAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXA2LCBMU1IgIzIwICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIFNCQyAgICAgbWIsIG1iLCB0bXA2LCBMU1IgIzIwICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4QyA8PCAyNCAgICA7Ly8gZGVjcmVtZW50IHkgbG9vcCBjb3VudGVyCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3AsIHNwLCAjMHgxZjQKKyAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9taWRfaG9yLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTgxYWVkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCkBAIC0wLDAgKzEsMTYzIEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorOw0KKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCis7DQorOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKzsNCis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKw0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorOy0tDQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gaG9yaXpvbnRhbCBwYXJ0IG9mIA0KKzstLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZCBmdW5jdGlvbnMNCis7LS0NCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKw0KKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQ0KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQ0KKyAgICBFTFNFDQorICAgICAgICBSRVFVSVJFOA0KKyAgICAgICAgUFJFU0VSVkU4DQorICAgIEVORElGDQorDQorICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQ0KKw0KKw0KKzsvLyBSZWdpc3RlciBhbGxvY2F0aW9uDQorDQorcmVmICAgICBSTiAwICAgIDsvLyBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gcmVmZXJlbmNlIGltYWdlDQorbWIgICAgICBSTiAxICAgIDsvLyBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gaW50ZXJwb2xhdGVkIG1iDQorY291bnQgICBSTiAyICAgIDsvLyBiaXQtcGFja2VkIHdpZHRoIGFuZCBjb3VudCB2YWx1ZXMNCisNCit4XzJfMCAgIFJOIDQNCit4XzNfMSAgIFJOIDUNCit4XzZfNCAgIFJOIDYNCit4XzdfNSAgIFJOIDcNCisNCit0bXAxICAgIFJOIDgNCit0bXAyICAgIFJOIDkNCit0bXAzICAgIFJOIDEwDQordG1wNCAgICBSTiAxMQ0KKw0KK211bHRfMjBfMDEgIFJOIDEyICAgOy8vIFsyMCwgIDFdDQorbXVsdF8yMF9tNSAgUk4gMTQgICA7Ly8gWzIwLCAtNV0NCisNCisNCisgICAgICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUGFydA0KKw0KKzsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaA0KKzsvLw0KKzsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMNCis7Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4NCis7Ly8NCis7Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzANCis7Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4NCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQ0KKzsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01DQorOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjANCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDENCisNCisNCitoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JQYXJ0DQorICAgIFNUTUZEICAgc3AhLCB7cjQtcjExLCBscn0NCisNCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyDQorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpDQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAocGFydEhlaWdodC0xKQ0KKyAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQ0KKyAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTENCisgICAgOy8vIFsxNTowMF0gd2lkdGgNCisNCisNCisgICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDENCisgICAgTERSICAgICBtdWx0XzIwX201LCA9IDB4MDAxNEZGRkINCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRXaWR0aC0xDQorbG9vcF95DQorICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0NCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDMsIExTTCAjMTINCisgICAgTERSICAgICB4XzdfNSwgW3JlZiwgIy00XQ0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQ0KKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4DQorICAgIFVYVEIxNiAgeF82XzQsIHhfN181DQorDQorbG9vcF94DQorICAgIFVYVEIxNiAgeF83XzUsIHhfN181LCBST1IgIzgNCisNCisgICAgU01VQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMQ0KKyAgICBTTVVMVEIgIHRtcDIsIHhfMl8wLCBtdWx0XzIwX201DQorICAgIFNNVUxUQiAgdG1wMywgeF8yXzAsIG11bHRfMjBfMDENCisgICAgU01VTFRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMQ0KKw0KKyAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQNCisgICAgU01MQUQgICB0bXA0LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNA0KKw0KKyAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0DQorDQorICAgIFNNTEFCQiAgdG1wMSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDENCisgICAgU01MQUJCICB0bXAyLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMg0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQ0KKyAgICBTTUxBRFggIHRtcDMsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAzDQorICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQNCisNCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOA0KKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0DQorICAgIFNUUiAgICAgdG1wMiwgW21iXSwgIzQNCisgICAgU1RSICAgICB0bXAzLCBbbWJdLCAjNA0KKyAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0DQorICAgIEJDQyAgICAgbmV4dF95DQorDQorICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgNCisNCisgICAgU01VQUQgICB0bXAxLCB4XzZfNCwgbXVsdF8yMF8wMQ0KKyAgICBTTVVMVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201DQorICAgIFNNVUxUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDENCisgICAgU01VTFRCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMQ0KKw0KKyAgICBTTUxBRCAgIHRtcDEsIHhfN181LCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEICAgdG1wMiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQVRCICB0bXAzLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQNCisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNA0KKw0KKyAgICBTTUxBQkIgIHRtcDEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEWCAgdG1wMiwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQURYICB0bXAzLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBTTUxBRFggIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0DQorDQorICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDENCisgICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMg0KKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQ0KKyAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzDQorICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDQNCisNCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOA0KKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0DQorICAgIFNUUiAgICAgdG1wMiwgW21iXSwgIzQNCisgICAgU1RSICAgICB0bXAzLCBbbWJdLCAjNA0KKyAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0DQorICAgIEJDUyAgICAgbG9vcF94DQorDQorbmV4dF95DQorICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQ0KKyAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiAgIDsvLyArd2lkdGgNCisgICAgU0JDICAgICByZWYsIHJlZiwgdG1wMywgTFNSICMxNiAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xDQorICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjApDQorICAgIEJHRSAgICAgbG9vcF95DQorDQorICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30NCisNCisgICAgRU5EDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0NGZjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMKQEAgLTAsMCArMSwzNDcgQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYgZnVuY3Rpb24KKzstLQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCis7Ly8gaDI2NGJzZEludGVycG9sYXRlVmVySGFsZiByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2J1ZmYgICAgUk4gMQorCitjb3VudCAgIFJOIDIKK3gwICAgICAgUk4gMgorCityZXMgICAgIFJOIDMKK3kwICAgICAgUk4gMworCit0bXAxICAgIFJOIDQKKwordG1wMiAgICBSTiA1CitoZWlnaHQgIFJOIDUKKwordG1wMyAgICBSTiA2CitwYXJ0VyAgIFJOIDYKKwordG1wNCAgICBSTiA3CitwYXJ0SCAgIFJOIDcKKwordG1wNSAgICBSTiA4Cit0bXA2ICAgIFJOIDkKKwordG1wYSAgICBSTiAxMAordG1wYiAgICBSTiAxMQord2lkdGggICBSTiAxMgorCitwbHVzMTYgIFJOIDE0CisKKworOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmCisKKzsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCis7Ly8KKzsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKKzsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKKzsvLyBpbiBlYWNoIHJvdW5kLgorOy8vCis7Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Cis7Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Cis7Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Cis7Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Cis7Ly8gICAgICAgICAgIC4uCis7Ly8gICAgICAgICAgIC4uCis7Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCis7Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCis7Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCis7Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCisKK2gyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweDFlNAorCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHRtcDUsIHdpZHRoCisgICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDYsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKKyAgICBBREQgICAgIHRtcDYsIHRtcDYsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBDTVAgICAgIHRtcDYsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAorCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gcjIgPSBwYXJ0SCArIDU7CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgcGFydFd9ICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aAorICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgcGFydEhlaWdodCs1CisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDEwXSAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAorICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAorICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDIxOF0KKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDYsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDYgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCisKKyAgICBBREQgICAgIGNvdW50LCBwYXJ0VywgcGFydEgsIExTTCAjMTYgICAgOy8vIHxwYXJ0SHxwYXJ0V3wKKyAgICBMRFIgICAgIHRtcDUsID0gMHgwMDAxMDAwMQorICAgIFNTVUIxNiAgY291bnQsIGNvdW50LCB0bXA1OyAgICAgOy8vIHxwYXJ0SC0xfHBhcnRXLTF8CisgICAgTERSICAgICBwbHVzMTYsID0gMHgwMDEwMDAxMAorCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgOy8vIHBhcnRXaWR0aAorCisKK2xvb3BfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzI0ICA7Ly8gcGFydFdpZHRoLTEgdG8gdG9wIGJ5dGUKKworbG9vcF94CisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8CisgICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8CisgICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8CisgICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8CisgICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8CisgICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXAyICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXAyLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGgKKyAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAorCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQorCisgICAgOy8vIHRtcDIgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDMgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDQgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDUgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDYgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDEgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gc2Vjb25kIGZvdXIgcGl4ZWxzCisgICAgVVhUQjE2ICB0bXBhLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aAorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisKKyAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAzLCBbcmVmXQorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisKKyAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyNCAgICAgICAgOy8vIChwYXJ0V2lkdGgtMSkgLT0gNDsKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCisKKyAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKKyAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7CisgICAgQUREICAgICByZWYsIHJlZiwgIzQ7ICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKKyAgICBBTkQgICAgIHRtcGEsIHRtcDQsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjLTQ0CisKKyAgICBCQ1MgICAgIGxvb3BfeAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMyNTI8PDE2ICAgICAgOy8vIChwYXJ0SGVpZ2h0LTEpIC09IDQ7CisgICAgQUREICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMiAgICAgOy8vIHJlZiArPSA0KndpZHRoCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgQUREICAgICB0bXAyLCB0bXAxLCAjMSAgICAgICAgICAgICAgOy8vIHBhcnRXaWR0aAorICAgIFNVQiAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgICAgIDsvLyByZWYgLT0gcGFydFdpZHRoCisgICAgQUREICAgICBtYiwgbWIsICM2NDsKKyAgICBTVUIgICAgIG1iLCBtYiwgdG1wMjsgICAgICAgICAgICAgICA7Ly8gbWIgLT0gcGFydFdpZHRoCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4MWY0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTI2NmM4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucwpAQCAtMCwwICsxLDM3NCBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlciBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCis7Ly8gaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlciByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2J1ZmYgICAgUk4gMQorCitjb3VudCAgIFJOIDIKK3gwICAgICAgUk4gMgorCityZXMgICAgIFJOIDMKK3kwICAgICAgUk4gMworCit0bXAxICAgIFJOIDQKKwordG1wMiAgICBSTiA1CitoZWlnaHQgIFJOIDUKKwordG1wMyAgICBSTiA2CitwYXJ0VyAgIFJOIDYKKwordG1wNCAgICBSTiA3CitwYXJ0SCAgIFJOIDcKKwordG1wNSAgICBSTiA4Cit0bXA2ICAgIFJOIDkKKwordG1wYSAgICBSTiAxMAordG1wYiAgICBSTiAxMQord2lkdGggICBSTiAxMgorCitwbHVzMTYgIFJOIDE0CisKKworOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyCisKKzsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCis7Ly8KKzsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKKzsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKKzsvLyBpbiBlYWNoIHJvdW5kLgorOy8vCis7Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Cis7Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Cis7Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Cis7Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Cis7Ly8gICAgICAgICAgIC4uCis7Ly8gICAgICAgICAgIC4uCis7Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCis7Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCis7Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCis7Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCisKK2gyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweDFlNAorCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHRtcDUsIHdpZHRoCisgICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDYsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKKyAgICBBREQgICAgIHRtcDYsIHRtcDYsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBDTVAgICAgIHRtcDYsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAorCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gcjIgPSBwYXJ0SCArIDU7CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgcGFydFd9ICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aAorICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgcGFydEhlaWdodCs1CisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDEwXSAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAorICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAorICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDIxOF0KKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDYsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDYgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCisKKyAgICBBREQgICAgIGNvdW50LCBwYXJ0VywgcGFydEgsIExTTCAjOCAgICA7Ly8gfHh4fHh4fHBhcnRIfHBhcnRXfAorICAgIExEUiAgICAgdG1wNSwgPSAweDAwMDEwMTAwCisgICAgUlNCICAgICBjb3VudCwgdG1wNSwgY291bnQsIExTTCAjOCAgICAgIDsvLyB8eHh8cGFydEgtMXxwYXJ0Vy0xfHh4fAorICAgIExEUiAgICAgdG1wMiwgW3NwLCAjMHgyMjhdICAgICAgOy8vIHZlck9mZnNldAorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyICAgICAgOy8vIHx4eHxwYXJ0SC0xfHBhcnRXLTF8dmVyT2Zmc2V0fAorICAgIExEUiAgICAgcGx1czE2LCA9IDB4MDAxMDAwMTAKKworICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMDBGRjAwIDsvLyBwYXJ0V2lkdGgKKworCitsb29wX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMxNiAgOy8vIHBhcnRXaWR0aC0xIHRvIHRvcCBieXRlCisKK2xvb3BfeAorICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGE0fGEzfGEyfGExfAorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGM0fGMzfGMyfGMxfAorICAgIExEUiAgICAgdG1wMywgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGc0fGczfGcyfGcxfAorICAgIExEUiAgICAgdG1wNCwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfG00fG0zfG0yfG0xfAorICAgIExEUiAgICAgdG1wNSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHI0fHIzfHIyfHIxfAorICAgIExEUiAgICAgdG1wNiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHQ0fHQzfHQyfHQxfAorCisgICAgOy8vIGZpcnN0IGZvdXIgcGl4ZWxzIAorICAgIFVYVEIxNiAgdG1wYSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDIgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKworICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDIsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBNT1ZTICAgIHRtcDEsIGNvdW50LCBMU0wgIzMxICAgICAgICA7Ly8gdXBkYXRlIGZsYWdzICh2ZXJPZmZzZXQpCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk5FUSAgIHRtcDEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCisgICAgTVZOTkUgICB0bXAxLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQorICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZlZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDEgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisKKyAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQorCisKKyAgICA7Ly8gdG1wMiA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wMyA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNCA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wNSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wNiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMSA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBzZWNvbmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisgICAgTVZORVEgICB0bXAyLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAorICAgIE1WTk5FICAgdG1wMiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAyICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk5FUSAgIHRtcDMsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCisgICAgTVZOTkUgICB0bXAzLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQorCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDMgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgTERSICAgICB0bXAzLCBbcmVmXSAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCisgICAgTVZORVEgICB0bXA1LCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAorICAgIE1WTk5FICAgdG1wNSwgdG1wMSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKKworICAgIEFORCAgICAgdG1wYSwgdG1wNCwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXA1ICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorCisgICAgOy8vIGRlY3JlbWVudCBsb29wX3ggY291bnRlcgorICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjQgICAgICAgIDsvLyAocGFydFdpZHRoLTEpIC09IDQ7CisKKyAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKKyAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7CisgICAgQUREICAgICByZWYsIHJlZiwgIzQ7ICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKKworICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KKyAgICBTVFIgICAgIHJlcywgW21iXSwgIy00NAorIAorICAgIEJDUyAgICAgbG9vcF94CisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzI1Mjw8MTYgICAgICA7Ly8gKHBhcnRIZWlnaHQtMSkgLT0gNDsKKyAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwRkYwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBNT1YgICAgIHRtcDIsICMxCisgICAgQUREICAgICB0bXAyLCB0bXAyLCB0bXAxLCBMU1IgIzggICAgOy8vIHBhcnRXaWR0aAorICAgIFNVQiAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgICAgIDsvLyByZWYgLT0gcGFydFdpZHRoCisgICAgQUREICAgICBtYiwgbWIsICM2NDsKKyAgICBTVUIgICAgIG1iLCBtYiwgdG1wMjsgICAgICAgICAgICAgICA7Ly8gbWIgLT0gcGFydFdpZHRoCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4MWY0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL3dpbl9hc20uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGQ4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdApAQCAtMCwwICsxLDE1IEBACitlY2hvIG9mZgorc2V0IEFTTUZMQUdTPSAtY2hlY2tyZWdsaXN0IC1DUFUgQVJNMTEzNiAtUHJlRGVmaW5lICJIMjY0REVDX1dJTkFTTSBTRVRMIHtUUlVFfSIKK3NldCBBU009IkQ6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gOFxWQ1xjZVxiaW5ceDg2X2FybVxhcm1hc20iCitlY2hvIG9uCisKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfdmVyLnMKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zCislQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucworJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2hvcl92ZXJfcXVhcnRlci5zCislQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfdmVyX2hhbGYucworJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKKworcmVtICVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yX3Zlci5zCityZW0gJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX21pZF9ob3IucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTE2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMKQEAgLTAsMCArMSw2NiBAQAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKworICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworICAgIEVYUE9SVCBoMjY0YnNkQ2xlYXJNYkxheWVyCisKKzsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCitwTWJMYXllciAgICBSTiAgMAorc2l6ZSAgICAgICAgUk4gIDEKK3BUbXAgICAgICAgIFJOICAyCitzdGVwICAgICAgICBSTiAgMworCis7IC0tIE5FT04gcmVnaXN0ZXJzIC0tCisKK3FaZXJvICAgUU4gIFEwLlU4CisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZENsZWFyTWJMYXllcgorOworOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKzsKKzsgICAgICAgIElucHV0czoKKzsKKzsgICAgICAgIE91dHB1dHM6Cis7Cis7ICAgICAgICBSZXR1cm5zOgorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2gyNjRic2RDbGVhck1iTGF5ZXIKKworICAgIFZNT1YgICAgcVplcm8sICMwCisgICAgQUREICAgICBwVG1wLCBwTWJMYXllciwgIzE2CisgICAgTU9WICAgICBzdGVwLCAjMzIKKyAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAorCitsb29wCisgICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAorICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0CisgICAgVlNUMSAgICBxWmVybywgW3BUbXBdLCBzdGVwCisgICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAorICAgIFZTVDEgICAgcVplcm8sIFtwVG1wXSwgc3RlcAorICAgIEJDUyAgICAgbG9vcAorCisgICAgQlggICAgICBscgorICAgIEVORAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiZDczZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zCkBAIC0wLDAgKzEsNDkgQEAKKzsKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKyAgICBFWFBPUlQgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKzsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCit2YWx1ZSAgICBSTiAgMAorCis7IC0tIE5FT04gcmVnaXN0ZXJzIC0tCisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCis7Cis7ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorOworOyAgICAgICAgSW5wdXRzOgorOworOyAgICAgICAgT3V0cHV0czoKKzsKKzsgICAgICAgIFJldHVybnM6Cis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKyAgICBDTFogICAgIHZhbHVlLCB2YWx1ZQorICAgIEJYICAgICAgbHIKKyAgICBFTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGaWxsUm93Ny5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZmFjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucwpAQCAtMCwwICsxLDE4MCBAQAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKworICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworICAgIEVYUE9SVCBoMjY0YnNkRmlsbFJvdzcKKworOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKKworcmVmICAgICBSTiAwCitmaWxsICAgIFJOIDEKK2xlZnQgICAgUk4gMgordG1wMiAgICBSTiAyCitjZW50ZXIgIFJOIDMKK3JpZ2h0ICAgUk4gNAordG1wMSAgICBSTiA1CisKKzsgLS0gTkVPTiByZWdpc3RlcnMgLS0KKworcVRtcDAgICBRTiAgUTAuVTgKK3FUbXAxICAgUU4gIFExLlU4CitkVG1wMCAgIEROICBEMC5VOAorZFRtcDEgICBETiAgRDEuVTgKK2RUbXAyICAgRE4gIEQyLlU4CitkVG1wMyAgIEROICBEMy5VOAorCisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZEZpbGxSb3c3Cis7Cis7ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorOworOyAgICAgICAgSW5wdXRzOgorOworOyAgICAgICAgT3V0cHV0czoKKzsKKzsgICAgICAgIFJldHVybnM6Cis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaDI2NGJzZEZpbGxSb3c3CisgICAgICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICAgICAgQ01QICAgICAgbGVmdCwgIzAKKyAgICAgICAgTERSICAgICAgcmlnaHQsIFtzcCwjMHgxMF0KKyAgICAgICAgQkVRICAgICAgc3dpdGNoX2NlbnRlcgorICAgICAgICBMRFJCICAgICB0bXAxLCBbcmVmLCMwXQorCitsb29wX2xlZnQKKyAgICAgICAgU1VCUyAgICAgbGVmdCwgbGVmdCwgIzEKKyAgICAgICAgU1RSQiAgICAgdG1wMSwgW2ZpbGxdLCAjMQorICAgICAgICBCTkUgICAgICBsb29wX2xlZnQKKworc3dpdGNoX2NlbnRlcgorICAgICAgICBBU1IgICAgICB0bXAyLGNlbnRlciwjMgorICAgICAgICBDTVAgICAgICB0bXAyLCM5CisgICAgICAgIEFERENDICAgIHBjLHBjLHRtcDIsTFNMICMyCisgICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCisgICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCisgICAgICAgIEIgICAgICAgIGNhc2VfMQorICAgICAgICBCICAgICAgICBjYXNlXzIKKyAgICAgICAgQiAgICAgICAgY2FzZV8zCisgICAgICAgIEIgICAgICAgIGNhc2VfNAorICAgICAgICBCICAgICAgICBjYXNlXzUKKyAgICAgICAgQiAgICAgICAgY2FzZV82CisgICAgICAgIEIgICAgICAgIGNhc2VfNworICAgICAgICBCICAgICAgICBjYXNlXzgKKztjYXNlXzgKKzsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCAjNAorOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Cis7ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Cis7Y2FzZV83Cis7ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfNgorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Cis7ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKKzsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwjNAorO2Nhc2VfNQorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Cis7ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKKzsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwjNAorO2Nhc2VfNAorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfMworOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfMgorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfMQorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorCitjYXNlXzgKKyAgICAgICAgVkxEMSAgICB7cVRtcDAsIHFUbXAxfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMzMgorICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCisgICAgICAgIFZTVDEgICAgcVRtcDEsIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV83CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyOAorICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV82CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV81CisgICAgICAgIFZMRDEgICAgcVRtcDAsIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjAKKyAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKKyAgICAgICAgVlNUMSAgICBxVG1wMCwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzQKKyAgICAgICAgVkxEMSAgICBxVG1wMCwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxNgorICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfMworICAgICAgICBWTEQxICAgIGRUbXAwLCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzEyCisgICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0CisgICAgICAgIFZTVDEgICAgZFRtcDAsIFtmaWxsXSEKKyAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV8yCisgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0CisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CitjYXNlXzEKKyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0CisgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKKworbG9vcF9jZW50ZXIKKyAgICAgICAgQ01QICAgICAgY2VudGVyLCAjMAorICAgICAgICBMRFJCTkUgICB0bXAyLCBbcmVmXSwgIzEKKyAgICAgICAgU1VCTkUgICAgY2VudGVyLCBjZW50ZXIsICMxCisgICAgICAgIFNUUkJORSAgIHRtcDIsIFtmaWxsXSwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQ01QICAgICAgcmlnaHQsIzAKKyAgICAgICAgUE9QRVEgICAge3I0LXI2LHBjfQorICAgICAgICBMRFJCICAgICB0bXAyLCBbcmVmLCMtMV0KKworbG9vcF9yaWdodAorICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCisgICAgICAgIFNVQlMgICAgIHJpZ2h0LCByaWdodCwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9yaWdodAorCisgICAgICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTMzNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zCkBAIC0wLDAgKzEsODIgQEAKKzsKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKyAgICBFWFBPUlQgaDI2NGJzZEZsdXNoQml0cworCis7IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycworcFN0cm1EYXRhICAgICAgIFJOICAwCitudW1CaXRzICAgICAgICAgUk4gIDEKK3JlYWRCaXRzICAgICAgICBSTiAgMgorc3RybUJ1ZmZTaXplICAgIFJOICAzCitwU3RybUJ1ZmZTdGFydCAgUk4gIDEKK3BTdHJtQ3VyclBvcyAgICBSTiAgMgorYml0UG9zSW5Xb3JkICAgIFJOICAxCisKKzsgLS0gTkVPTiByZWdpc3RlcnMgLS0KKworCisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cworOworOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKzsKKzsgICAgICAgIElucHV0czoKKzsKKzsgICAgICAgIE91dHB1dHM6Cis7Cis7ICAgICAgICBSZXR1cm5zOgorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2gyNjRic2RGbHVzaEJpdHMKKzsvLyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisKKyAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCisKKyAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCisgICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3CisKKyAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCisKKyAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCisKKyAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCisKKyAgICBCSEkgZW5kX29mX3N0cmVhbQorCisgICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKKyAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQorICAgIE1PViByMCwgIzAKKyAgICBCWCAgbHIKKzsvLyAgICBQT1AgICAgICB7cjQtcjYscGN9CisKK2VuZF9vZl9zdHJlYW0KKyAgICBNVk4gcjAsICMwCisgICAgQlggIGxyCis7Ly8gICAgUE9QICAgICAge3I0LXI2LHBjfQorCisgICAgRU5ECisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTA3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLnMKQEAgLTAsMCArMSwxNTIgQEAKKzsKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKyAgICBFWFBPUlQgaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworCis7IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycworaW1hZ2UgICBSTiAgMAorZGF0YSAgICBSTiAgMQord2lkdGggICBSTiAgMgorbHVtYSAgICBSTiAgMworY2IgICAgICBSTiAgNAorY3IgICAgICBSTiAgNQorY3dpZHRoICBSTiAgNgorCis7IC0tIE5FT04gcmVnaXN0ZXJzIC0tCisKK3FSb3cwICAgUU4gIFEwLlU4CitxUm93MSAgIFFOICBRMS5VOAorcVJvdzIgICBRTiAgUTIuVTgKK3FSb3czICAgUU4gIFEzLlU4CitxUm93NCAgIFFOICBRNC5VOAorcVJvdzUgICBRTiAgUTUuVTgKK3FSb3c2ICAgUU4gIFE2LlU4CitxUm93NyAgIFFOICBRNy5VOAorcVJvdzggICBRTiAgUTguVTgKK3FSb3c5ICAgUU4gIFE5LlU4CitxUm93MTAgIFFOICBRMTAuVTgKK3FSb3cxMSAgUU4gIFExMS5VOAorcVJvdzEyICBRTiAgUTEyLlU4CitxUm93MTMgIFFOICBRMTMuVTgKK3FSb3cxNCAgUU4gIFExNC5VOAorcVJvdzE1ICBRTiAgUTE1LlU4CisKK2RSb3cwICAgRE4gIEQwLlU4CitkUm93MSAgIEROICBEMS5VOAorZFJvdzIgICBETiAgRDIuVTgKK2RSb3czICAgRE4gIEQzLlU4CitkUm93NCAgIEROICBENC5VOAorZFJvdzUgICBETiAgRDUuVTgKK2RSb3c2ICAgRE4gIEQ2LlU4CitkUm93NyAgIEROICBENy5VOAorZFJvdzggICBETiAgRDguVTgKK2RSb3c5ICAgRE4gIEQ5LlU4CitkUm93MTAgIEROICBEMTAuVTgKK2RSb3cxMSAgRE4gIEQxMS5VOAorZFJvdzEyICBETiAgRDEyLlU4CitkUm93MTMgIEROICBEMTMuVTgKK2RSb3cxNCAgRE4gIEQxNC5VOAorZFJvdzE1ICBETiAgRDE1LlU4CisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworOworOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKzsgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKKzsgICAgICAgICAgICBjb21wb25lbnRzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lLgorOworOyAgICAgICAgSW5wdXRzOgorOyAgICAgICAgICAgIGRhdGEgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgdG8gYmUgd3JpdHRlbiwgMjU2IHZhbHVlcyBmb3IKKzsgICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCis7Cis7ICAgICAgICBPdXRwdXRzOgorOyAgICAgICAgICAgIGltYWdlICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIG1hY3JvYmxvY2sgd2lsbCBiZSB3cml0dGVuCis7Cis7ICAgICAgICBSZXR1cm5zOgorOyAgICAgICAgICAgIG5vbmUKKzsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCisgICAgUFVTSCAgICB7cjQtcjYsbHJ9CisgICAgVlBVU0ggICB7cTQtcTd9CisKKyAgICBMRFIgICAgIHdpZHRoLCBbaW1hZ2UsICM0XQorICAgIExEUiAgICAgbHVtYSwgW2ltYWdlLCAjMHhDXQorICAgIExEUiAgICAgY2IsIFtpbWFnZSwgIzB4MTBdCisgICAgTERSICAgICBjciwgW2ltYWdlLCAjMHgxNF0KKworCis7ICAgV3JpdGUgbHVtYQorICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEKKyAgICBMU0wgICAgIHdpZHRoLCB3aWR0aCwgIzQKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hCisgICAgTFNSICAgICBjd2lkdGgsIHdpZHRoLCAjMQorICAgIFZTVDEgICAge3FSb3cwfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzF9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93Mn0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzgsIHFSb3c5fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3czfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MTAsIHFSb3cxMX0sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93NH0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzEyLCBxUm93MTN9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzV9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3cxNCwgcVJvdzE1fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3c2fSwgW2x1bWFAMTI4XSwgd2lkdGgKKworICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEgO2NiIHJvd3MgMCwxLDIsMworICAgIFZTVDEgICAge3FSb3c3fSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hIDtjYiByb3dzIDQsNSw2LDcKKyAgICBWU1QxICAgIHtxUm93OH0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdISA7Y3Igcm93cyAwLDEsMiwzCisgICAgVlNUMSAgICB7cVJvdzl9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEgO2NyIHJvd3MgNCw1LDYsNworICAgIFZTVDEgICAge3FSb3cxMH0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzB9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93OH0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMX0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzF9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93OX0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMn0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzJ9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTB9LCBbY3JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtxUm93MTN9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3czfSwgW2NiQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzExfSwgW2NyQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzE0fSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93NH0sIFtjYkA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxMn0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxNX0sIFtsdW1hXQorICAgIFZTVDEgICAge2RSb3c1fSwgW2NiQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzEzfSwgW2NyQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzZ9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTR9LCBbY3JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93N30sIFtjYkA2NF0KKyAgICBWU1QxICAgIHtkUm93MTV9LCBbY3JANjRdCisKKyAgICBWUE9QICAgIHtxNC1xN30KKyAgICBQT1AgICAgIHtyNC1yNixwY30KKyAgICBFTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvYXNtX2NvbW1vbi5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzlmNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUwpAQCAtMCwwICsxLDQxIEBACitACitAIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQAorQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQAorQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQAorCisKKworCisgICAgLm1hY3JvIFJFUVVJUkU4CisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVuZG0KKworICAgIC5tYWNybyBQUkVTRVJWRTgKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKyAgICAuZW5kbQorCisKKyAgICAubWFjcm8gZnVuY3Rpb24gbmFtZSwgZXhwb3J0PTAKKy5pZiBcZXhwb3J0CisgICAgLmdsb2JhbCBcbmFtZQorLmVuZGlmCisgICAgLnR5cGUgICBcbmFtZSwgJWZ1bmN0aW9uCisgICAgLmZ1bmMgICBcbmFtZQorXG5hbWU6CisgICAgLmVuZG0KKworICAgIC5tYWNybyBlbmRmdW5jdGlvbgorICAgIC5lbmRmdW5jCisgICAgLmVuZG0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDbGVhck1iTGF5ZXIuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhOTQwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMKQEAgLTAsMCArMSw2OCBAQAorQAorQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AKK0AgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK0AKK0AgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK0AgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK0AKKworI2luY2x1ZGUgImFzbV9jb21tb24uUyIKKworICAgIHByZXNlcnZlOAorCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIHBNYkxheWVyICAgIHIwCisjZGVmaW5lIHNpemUgICAgICAgIHIxCisjZGVmaW5lIHBUbXAgICAgICAgIHIyCisjZGVmaW5lIHN0ZXAgICAgICAgIHIzCisKKy8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCisKKyNkZWZpbmUgcVplcm8gICBRMC5VOAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDbGVhck1iTGF5ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorCisgICAgICAgIElucHV0czoKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Z1bmN0aW9uIGgyNjRic2RDbGVhck1iTGF5ZXIsIGV4cG9ydD0xCisKKyAgICBWTU9WICAgIHFaZXJvLCAjMAorICAgIEFERCAgICAgcFRtcCwgcE1iTGF5ZXIsICMxNgorICAgIE1PViAgICAgc3RlcCwgIzMyCisgICAgU1VCUyAgICBzaXplLCBzaXplLCAjNjQKKworbG9vcDoKKyAgICBWU1QxICAgIHtxWmVyb30sIFtwTWJMYXllcl0sIHN0ZXAKKyAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAorICAgIFZTVDEgICAge3FaZXJvfSwgW3BUbXBdLCBzdGVwCisgICAgVlNUMSAgICB7cVplcm99LCBbcE1iTGF5ZXJdLCBzdGVwCisgICAgVlNUMSAgICB7cVplcm99LCBbcFRtcF0sIHN0ZXAKKyAgICBCQ1MgICAgIGxvb3AKKworICAgIEJYICAgICAgbHIKKworZW5kZnVuY3Rpb24KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTI1M2QwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TCkBAIC0wLDAgKzEsNDggQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisjaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgorCisgICAgcHJlc2VydmU4CisgICAgLmFybQorICAgIC50ZXh0CisKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIHZhbHVlICAgIHIwCisKKy8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKworICAgICAgICBJbnB1dHM6CisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmdW5jdGlvbiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MsIGV4cG9ydD0xCisKKyAgICBDTFogICAgIHZhbHVlLCB2YWx1ZQorICAgIEJYICAgICAgbHIKKworZW5kZnVuY3Rpb24KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTViOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMKQEAgLTAsMCArMSwxNDMgQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisKKyNpbmNsdWRlICJhc21fY29tbW9uLlMiCisKKyAgICBwcmVzZXJ2ZTgKKworICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKy8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIHJlZiAgICAgcjAKKyNkZWZpbmUgZmlsbCAgICByMQorI2RlZmluZSBsZWZ0ICAgIHIyCisjZGVmaW5lIHRtcDIgICAgcjIKKyNkZWZpbmUgY2VudGVyICByMworI2RlZmluZSByaWdodCAgIHI0CisjZGVmaW5lIHRtcDEgICAgcjUKKworLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KKworI2RlZmluZSBxVG1wMCAgICAgUTAuVTgKKyNkZWZpbmUgcVRtcDEgICAgIFExLlU4CisjZGVmaW5lIGRUbXAwICAgICBEMC5VOAorI2RlZmluZSBkVG1wMSAgICAgRDEuVTgKKyNkZWZpbmUgZFRtcDIgICAgIEQyLlU4CisjZGVmaW5lIGRUbXAzICAgICBEMy5VOAorCisvKgordm9pZCBoMjY0YnNkRmlsbFJvdzcoY29uc3QgdTggKiByZWYsIHU4ICogZmlsbCwgaTMyIGxlZnQsIGkzMiBjZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICBpMzIgcmlnaHQpOworKi8KKworZnVuY3Rpb24gaDI2NGJzZEZpbGxSb3c3LCBleHBvcnQ9MQorCisgICAgICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICAgICAgQ01QICAgICAgbGVmdCwgIzAKKyAgICAgICAgTERSICAgICAgcmlnaHQsIFtzcCwjMHgxMF0KKyAgICAgICAgQkVRICAgICAgc3dpdGNoX2NlbnRlcgorICAgICAgICBMRFJCICAgICB0bXAxLCBbcmVmLCMwXQorCitsb29wX2xlZnQ6CisgICAgICAgIFNVQlMgICAgIGxlZnQsIGxlZnQsICMxCisgICAgICAgIFNUUkIgICAgIHRtcDEsIFtmaWxsXSwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9sZWZ0CisKK3N3aXRjaF9jZW50ZXI6CisgICAgICAgIEFTUiAgICAgIHRtcDIsY2VudGVyLCMyCisgICAgICAgIENNUCAgICAgIHRtcDIsIzkKKyAgICAgICAgQUREQ0MgICAgcGMscGMsdG1wMixMU0wgIzIKKyAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQiAgICAgICAgY2FzZV8xCisgICAgICAgIEIgICAgICAgIGNhc2VfMgorICAgICAgICBCICAgICAgICBjYXNlXzMKKyAgICAgICAgQiAgICAgICAgY2FzZV80CisgICAgICAgIEIgICAgICAgIGNhc2VfNQorICAgICAgICBCICAgICAgICBjYXNlXzYKKyAgICAgICAgQiAgICAgICAgY2FzZV83CisgICAgICAgIEIgICAgICAgIGNhc2VfOAorCitjYXNlXzg6CisgICAgICAgIFZMRDEgICAge3FUbXAwLCBxVG1wMX0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMzIKKyAgICAgICAgVlNUMSAgICB7cVRtcDB9LCBbZmlsbF0hCisgICAgICAgIFZTVDEgICAge3FUbXAxfSwgW2ZpbGxdIQorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzc6CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyOAorICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV82OgorICAgICAgICBWTEQxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjQKKyAgICAgICAgVlNUMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbZmlsbF0hCisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfNToKKyAgICAgICAgVkxEMSAgICB7cVRtcDB9LCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzIwCisgICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0CisgICAgICAgIFZTVDEgICAge3FUbXAwfSwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzQ6CisgICAgICAgIFZMRDEgICAge3FUbXAwfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxNgorICAgICAgICBWU1QxICAgIHtxVG1wMH0sIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV8zOgorICAgICAgICBWTEQxICAgIHtkVG1wMH0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMTIKKyAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKKyAgICAgICAgVlNUMSAgICBkVG1wMCwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzI6CisgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0CisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CitjYXNlXzE6CisgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0CisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CisKK2xvb3BfY2VudGVyOgorICAgICAgICBDTVAgICAgICBjZW50ZXIsICMwCisgICAgICAgIEJFUSAgICAgIGp1bXAKKyAgICAgICAgTERSQiAgICAgdG1wMiwgW3JlZl0sICMxCisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjMQorICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCisgICAgICAgIEJORSAgICAgIGxvb3BfY2VudGVyCitqdW1wOgorICAgICAgICBDTVAgICAgICByaWdodCwjMAorICAgICAgICBQT1BFUSAgICB7cjQtcjYscGN9CisgICAgICAgIExEUkIgICAgIHRtcDIsIFtyZWYsIy0xXQorCitsb29wX3JpZ2h0OgorICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCisgICAgICAgIFNVQlMgICAgIHJpZ2h0LCByaWdodCwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9yaWdodAorCisgICAgICAgIFBPUCAgICAgIHtyNC1yNixwY30KKworZW5kZnVuY3Rpb24KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2YzMTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUwpAQCAtMCwwICsxLDc4IEBACitACitAIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQAorQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQAorQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQAorCisjaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgorCisgICAgcHJlc2VydmU4CisKKyAgICAuYXJtCisgICAgLnRleHQKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIHBTdHJtRGF0YSAgICAgICByMAorI2RlZmluZSBudW1CaXRzICAgICAgICAgcjEKKyNkZWZpbmUgcmVhZEJpdHMgICAgICAgIHIyCisjZGVmaW5lIHN0cm1CdWZmU2l6ZSAgICByMworI2RlZmluZSBwU3RybUJ1ZmZTdGFydCAgcjEKKyNkZWZpbmUgcFN0cm1DdXJyUG9zICAgIHIyCisjZGVmaW5lIGJpdFBvc0luV29yZCAgICByMQorCisvKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisKKyAgICAgICAgSW5wdXRzOgorCisgICAgICAgIE91dHB1dHM6CisKKyAgICAgICAgUmV0dXJuczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Z1bmN0aW9uIGgyNjRic2RGbHVzaEJpdHMsIGV4cG9ydD0xCisKKyAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCisKKyAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCisgICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3CisKKyAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCisKKyAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCisKKyAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCisKKyAgICBCSEkgZW5kX29mX3N0cmVhbQorCisgICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKKyAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQorICAgIE1PViByMCwgIzAKKyAgICBCWCAgbHIKKworZW5kX29mX3N0cmVhbToKKyAgICBNVk4gcjAsICMwCisgICAgQlggIGxyCisKK2VuZGZ1bmN0aW9uCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1ZDU2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMKQEAgLTAsMCArMSwxNTcgQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisKKyNpbmNsdWRlICJhc21fY29tbW9uLlMiCisKKyAgICByZXF1aXJlOAorICAgIHByZXNlcnZlOAorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKy8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLworI2RlZmluZSBpbWFnZSAgIHIwCisjZGVmaW5lIGRhdGEgICAgcjEKKyNkZWZpbmUgd2lkdGggICByMgorI2RlZmluZSBsdW1hICAgIHIzCisjZGVmaW5lIGNiICAgICAgcjQKKyNkZWZpbmUgY3IgICAgICByNQorI2RlZmluZSBjd2lkdGggIHI2CisKKy8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCisKKyNkZWZpbmUgcVJvdzAgICAgIFEwLlU4CisjZGVmaW5lIHFSb3cxICAgICBRMS5VOAorI2RlZmluZSBxUm93MiAgICAgUTIuVTgKKyNkZWZpbmUgcVJvdzMgICAgIFEzLlU4CisjZGVmaW5lIHFSb3c0ICAgICBRNC5VOAorI2RlZmluZSBxUm93NSAgICAgUTUuVTgKKyNkZWZpbmUgcVJvdzYgICAgIFE2LlU4CisjZGVmaW5lIHFSb3c3ICAgICBRNy5VOAorI2RlZmluZSBxUm93OCAgICAgUTguVTgKKyNkZWZpbmUgcVJvdzkgICAgIFE5LlU4CisjZGVmaW5lIHFSb3cxMCAgICBRMTAuVTgKKyNkZWZpbmUgcVJvdzExICAgIFExMS5VOAorI2RlZmluZSBxUm93MTIgICAgUTEyLlU4CisjZGVmaW5lIHFSb3cxMyAgICBRMTMuVTgKKyNkZWZpbmUgcVJvdzE0ICAgIFExNC5VOAorI2RlZmluZSBxUm93MTUgICAgUTE1LlU4CisKKyNkZWZpbmUgZFJvdzAgICAgIEQwLlU4CisjZGVmaW5lIGRSb3cxICAgICBEMS5VOAorI2RlZmluZSBkUm93MiAgICAgRDIuVTgKKyNkZWZpbmUgZFJvdzMgICAgIEQzLlU4CisjZGVmaW5lIGRSb3c0ICAgICBENC5VOAorI2RlZmluZSBkUm93NSAgICAgRDUuVTgKKyNkZWZpbmUgZFJvdzYgICAgIEQ2LlU4CisjZGVmaW5lIGRSb3c3ICAgICBENy5VOAorI2RlZmluZSBkUm93OCAgICAgRDguVTgKKyNkZWZpbmUgZFJvdzkgICAgIEQ5LlU4CisjZGVmaW5lIGRSb3cxMCAgICBEMTAuVTgKKyNkZWZpbmUgZFJvdzExICAgIEQxMS5VOAorI2RlZmluZSBkUm93MTIgICAgRDEyLlU4CisjZGVmaW5lIGRSb3cxMyAgICBEMTMuVTgKKyNkZWZpbmUgZFJvdzE0ICAgIEQxNC5VOAorI2RlZmluZSBkUm93MTUgICAgRDE1LlU4CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKKyAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Z1bmN0aW9uIGgyNjRic2RXcml0ZU1hY3JvYmxvY2ssIGV4cG9ydD0xCisgICAgUFVTSCAgICB7cjQtcjYsbHJ9CisgICAgVlBVU0ggICB7cTQtcTd9CisKKyAgICBMRFIgICAgIHdpZHRoLCBbaW1hZ2UsICM0XQorICAgIExEUiAgICAgbHVtYSwgW2ltYWdlLCAjMHhDXQorICAgIExEUiAgICAgY2IsIFtpbWFnZSwgIzB4MTBdCisgICAgTERSICAgICBjciwgW2ltYWdlLCAjMHgxNF0KKworCitAICAgV3JpdGUgbHVtYQorICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEKKyAgICBMU0wgICAgIHdpZHRoLCB3aWR0aCwgIzQKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hCisgICAgTFNSICAgICBjd2lkdGgsIHdpZHRoLCAjMQorICAgIFZTVDEgICAge3FSb3cwfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3cxfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3cyfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzgsIHFSb3c5fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3czfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzEwLCBxUm93MTF9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzR9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MTIsIHFSb3cxM30sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93NX0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3cxNCwgcVJvdzE1fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3c2fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisKKyAgICBWTEQxICAgIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hIDsvL2NiIHJvd3MgMCwxLDIsMworICAgIFZTVDEgICAge3FSb3c3fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdISA7Ly9jYiByb3dzIDQsNSw2LDcKKyAgICBWU1QxICAgIHtxUm93OH0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEgOy8vY3Igcm93cyAwLDEsMiwzCisgICAgVlNUMSAgICB7cVJvdzl9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hIDsvL2NyIHJvd3MgNCw1LDYsNworICAgIFZTVDEgICAge3FSb3cxMH0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3cwfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c4fSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMX0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3cxfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c5fSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMn0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3cyfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxMH0sIFtjciw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtxUm93MTN9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93M30sIFtjYiw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTF9LCBbY3IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzE0fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzR9LCBbY2IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzEyfSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxNX0sIFtsdW1hXQorICAgIFZTVDEgICAge2RSb3c1fSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxM30sIFtjciw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93Nn0sIFtjYiw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTR9LCBbY3IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzd9LCBbY2IsOjY0XQorICAgIFZTVDEgICAge2RSb3cxNX0sIFtjciw6NjRdCisKKyAgICBWUE9QICAgIHtxNC1xN30KKyAgICBQT1AgICAgIHtyNC1yNixwY30KK0AgICAgQlggICAgICBscgorCisgICAgLmVuZGZ1bmMKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI3N2Y4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgRXh0cmFjdE5hbFVuaXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgQllURV9TVFJFQU1fRVJST1IgIDB4RkZGRkZGRkYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogRXh0cmFjdE5hbFVuaXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRXh0cmFjdHMgb25lIE5BTCB1bml0IGZyb20gdGhlIGJ5dGUgc3RyZWFtIGJ1ZmZlci4gUmVtb3ZlcworICAgICAgICAgICAgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgaWYgcHJlc2VudC4gVGhlIG9yaWdpbmFsIHN0cmVhbSBidWZmZXIKKyAgICAgICAgICAgIGlzIHVzZWQgZGlyZWN0bHkgYW5kIGlzIHRoZXJlZm9yZSBtb2RpZmllZCBpZiBlbXVsYXRpb24gcHJldmVudGlvbgorICAgICAgICAgICAgYnl0ZXMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cmVhbS4KKworICAgICAgICAgICAgU3RyZWFtIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gZWl0aGVyIGV4YWN0bHkgb25lIE5BTCB1bml0CisgICAgICAgICAgICBhbmQgbm90aGluZyBlbHNlLCBvciBvbmUgb3IgbW9yZSBOQUwgdW5pdHMgZW1iZWRkZWQgaW4gYnl0ZQorICAgICAgICAgICAgc3RyZWFtIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIEFubmV4IEIgb2YgdGhlIHN0YW5kYXJkLiBGdW5jdGlvbgorICAgICAgICAgICAgZGV0ZWN0cyB3aGljaCBvbmUgaXMgdXNlZCBiYXNlZCBvbiB0aGUgZmlyc3QgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwQnl0ZVN0cmVhbSAgICAgcG9pbnRlciB0byBieXRlIHN0cmVhbSBidWZmZXIKKyAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIHN0cmVhbSBidWZmZXIgKGluIGJ5dGVzKQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgc3RyZWFtIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCisgICAgICAgICAgICByZWFkQnl0ZXMgICAgICAgbnVtYmVyIG9mIGJ5dGVzICJjb25zdW1lZCIgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlcgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGVycm9yIGluIGJ5dGUgc3RyZWFtCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRXh0cmFjdE5hbFVuaXQodTggKnBCeXRlU3RyZWFtLCB1MzIgbGVuLCBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgdTMyICpyZWFkQnl0ZXMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKyAgICB1MzIgYnl0ZUNvdW50LGluaXRCeXRlQ291bnQ7CisgICAgdTMyIHplcm9Db3VudDsKKyAgICB1OCAgYnl0ZTsKKyAgICB1MzIgaGFzRW11bGF0aW9uID0gSEFOVFJPX0ZBTFNFOworICAgIHUzMiBpbnZhbGlkU3RyZWFtID0gSEFOVFJPX0ZBTFNFOworICAgIHU4ICpyZWFkUHRyLCAqd3JpdGVQdHI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwQnl0ZVN0cmVhbSk7CisgICAgQVNTRVJUKGxlbik7CisgICAgQVNTRVJUKGxlbiA8IEJZVEVfU1RSRUFNX0VSUk9SKTsKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKworICAgIC8qIGJ5dGUgc3RyZWFtIGZvcm1hdCBpZiBzdGFydHMgd2l0aCAweDAwMDAwMSBvciAweDAwMDAwMCAqLworICAgIGlmIChsZW4gPiAzICYmIHBCeXRlU3RyZWFtWzBdID09IDB4MDAgJiYgcEJ5dGVTdHJlYW1bMV0gPT0gMHgwMCAmJgorICAgICAgICAocEJ5dGVTdHJlYW1bMl0mMHhGRSkgPT0gMHgwMCkKKyAgICB7CisgICAgICAgIC8qIHNlYXJjaCBmb3IgTkFMIHVuaXQgc3RhcnQgcG9pbnQsIGkuZS4gcG9pbnQgYWZ0ZXIgZmlyc3Qgc3RhcnQgY29kZQorICAgICAgICAgKiBwcmVmaXggaW4gdGhlIHN0cmVhbSAqLworICAgICAgICB6ZXJvQ291bnQgPSBieXRlQ291bnQgPSAyOworICAgICAgICByZWFkUHRyID0gcEJ5dGVTdHJlYW0gKyAyOworICAgICAgICAvKmxpbnQgLWUoNzE2KSB3aGlsZSgxKSB1c2VkIGNvbnNjaW91c2x5ICovCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlID0gKnJlYWRQdHIrKzsKKyAgICAgICAgICAgIGJ5dGVDb3VudCsrOworCisgICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBzdGFydCBjb2RlIHByZWZpeCBmb3VuZCAtPiBlcnJvciAqLworICAgICAgICAgICAgICAgICpyZWFkQnl0ZXMgPSBsZW47CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWJ5dGUpCisgICAgICAgICAgICAgICAgemVyb0NvdW50Kys7CisgICAgICAgICAgICBlbHNlIGlmICgoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpbml0Qnl0ZUNvdW50ID0gYnl0ZUNvdW50OworCisgICAgICAgIC8qIGRldGVybWluZSBzaXplIG9mIHRoZSBOQUwgdW5pdC4gU2VhcmNoIGZvciBuZXh0IHN0YXJ0IGNvZGUgcHJlZml4CisgICAgICAgICAqIG9yIGVuZCBvZiBzdHJlYW0gYW5kIGlnbm9yZSBwb3NzaWJsZSB0cmFpbGluZyB6ZXJvIGJ5dGVzICovCisgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgIC8qbGludCAtZSg3MTYpIHdoaWxlKDEpIHVzZWQgY29uc2Npb3VzbHkgKi8KKyAgICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgPSAqcmVhZFB0cisrOworICAgICAgICAgICAgYnl0ZUNvdW50Kys7CisgICAgICAgICAgICBpZiAoIWJ5dGUpCisgICAgICAgICAgICAgICAgemVyb0NvdW50Kys7CisKKyAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMykgJiYgKHplcm9Db3VudCA9PSAyKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMSkgJiYgKHplcm9Db3VudCA+PSAyICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplID0KKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50IC0gaW5pdEJ5dGVDb3VudCAtIHplcm9Db3VudCAtIDE7CisgICAgICAgICAgICAgICAgemVyb0NvdW50IC09IE1JTih6ZXJvQ291bnQsIDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoemVyb0NvdW50ID49IDMpCisgICAgICAgICAgICAgICAgICAgIGludmFsaWRTdHJlYW0gPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGJ5dGVDb3VudCAtIGluaXRCeXRlQ291bnQgLSB6ZXJvQ291bnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzZXBhcmF0ZSBOQUwgdW5pdHMgYXMgaW5wdXQgLT4ganVzdCBzZXQgc3RyZWFtIHBhcmFtcyAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluaXRCeXRlQ291bnQgPSAwOworICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGxlbjsKKyAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7CisgICAgfQorCisgICAgcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCAgICA9IHBCeXRlU3RyZWFtICsgaW5pdEJ5dGVDb3VudDsKKyAgICBwU3RybURhdGEtPnBTdHJtQ3VyclBvcyAgICAgID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKKyAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZCAgICAgID0gMDsKKyAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgID0gMDsKKworICAgIC8qIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgImNvbnN1bWVkIiAqLworICAgICpyZWFkQnl0ZXMgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSArIGluaXRCeXRlQ291bnQgKyB6ZXJvQ291bnQ7CisKKyAgICBpZiAoaW52YWxpZFN0cmVhbSkKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiByZW1vdmUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgYmVmb3JlIHJic3AgcHJvY2Vzc2luZyAqLworICAgIGlmIChoYXNFbXVsYXRpb24pCisgICAgeworICAgICAgICB0bXAgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZTsKKyAgICAgICAgcmVhZFB0ciA9IHdyaXRlUHRyID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKKyAgICAgICAgemVyb0NvdW50ID0gMDsKKyAgICAgICAgZm9yIChpID0gdG1wOyBpLS07KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHplcm9Db3VudCA9PSAyKSAmJiAoKnJlYWRQdHIgPT0gMHgwMykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSBzaGFsbCBiZSBmb2xsb3dlZCBieSBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICogZm9sbG93aW5nIGJ5dGVzOiAweDAwLCAweDAxLCAweDAyLCAweDAzLiBUaGlzIGltcGxpZXMgdGhhdAorICAgICAgICAgICAgICAgICAqIGVtdWxhdGlvbiBwcmV2ZW50aW9uIDB4MDMgYnl0ZSBzaGFsbCBub3QgYmUgdGhlIGxhc3QgYnl0ZQorICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJlYW0uICovCisgICAgICAgICAgICAgICAgaWYgKCAoaSA9PSAwKSB8fCAoKihyZWFkUHRyKzEpID4gMHgwMykgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgICAgICAgICAvKiBkbyBub3Qgd3JpdGUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSAqLworICAgICAgICAgICAgICAgIHJlYWRQdHIrKzsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5BTCB1bml0IHNoYWxsIG5vdCBjb250YWluIGJ5dGUgc2VxdWVuY2VzIDB4MDAwMDAwLAorICAgICAgICAgICAgICAgICAqIDB4MDAwMDAxIG9yIDB4MDAwMDAyICovCisgICAgICAgICAgICAgICAgaWYgKCAoemVyb0NvdW50ID09IDIpICYmICgqcmVhZFB0ciA8PSAweDAyKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAgICAgICAgIGlmICgqcmVhZFB0ciA9PSAwKQorICAgICAgICAgICAgICAgICAgICB6ZXJvQ291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisKKyAgICAgICAgICAgICAgICAqd3JpdGVQdHIrKyA9ICpyZWFkUHRyKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiAocmVhZFB0ciAtIHdyaXRlUHRyKSBpbmRpY2F0ZXMgbnVtYmVyIG9mICJyZW1vdmVkIiBlbXVsYXRpb24KKyAgICAgICAgICogcHJldmVudGlvbiBieXRlcyAtPiBzdWJ0cmFjdCBmcm9tIHN0cmVhbSBidWZmZXIgc2l6ZSAqLworICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSAtPSAodTMyKShyZWFkUHRyIC0gd3JpdGVQdHIpOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzZhZWM3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfQllURV9TVFJFQU1fSAorI2RlZmluZSBIMjY0U1dERUNfQllURV9TVFJFQU1fSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRXh0cmFjdE5hbFVuaXQodTggKnBCeXRlU3RyZWFtLCB1MzIgbGVuLCBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgdTMyICpyZWFkQnl0ZXMpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19CWVRFX1NUUkVBTV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTFkNzhiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jCkBAIC0wLDAgKzEsOTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgRGVjb2RlQ29lZmZUb2tlbgorICAgICAgICAgIERlY29kZUxldmVsUHJlZml4CisgICAgICAgICAgRGVjb2RlVG90YWxaZXJvcworICAgICAgICAgIERlY29kZVJ1bkJlZm9yZQorICAgICAgICAgIERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfY2F2bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRm9sbG93aW5nIGRlc2NyaXB0aW9ucyB1c2UgdGVybSAiaW5mb3JtYXRpb24gZmllbGQiIHRvIHJlcHJlc2VudCBjb21iaW5hdGlvbgorICogb2YgY2VydGFpbiBkZWNvZGVkIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZQorICogbGVuZ3RoIGNvZGUgd29yZC4gRm9yIGV4YW1wbGUsIHRvdGFsX3plcm9zIGluZm9ybWF0aW9uIGZpZWxkIGNvbnNpc3RzIG9mCisgKiA0IGJpdHMgc3ltYm9sIHZhbHVlIChiaXRzIFs0LDddKSBhbG9uZyB3aXRoIGZvdXIgYml0cyB0byByZXByZXNlbnQgbGVuZ3RoCisgKiBvZiB0aGUgVkxDIGNvZGUgd29yZCAoYml0cyBbMCwzXSkgKi8KKworLyogbWFjcm8gdG8gb2J0YWluIGxlbmd0aCBvZiB0aGUgY29lZmYgdG9rZW4gaW5mb3JtYXRpb24gZmllbGQsIGJpdHMgWzAsNF0gICovCisjZGVmaW5lIExFTkdUSF9UQyh2bGMpICgodmxjKSAmIDB4MUYpCisvKiBtYWNybyB0byBvYnRhaW4gbGVuZ3RoIG9mIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBmaWVsZHMsIGJpdHMgWzAsM10gKi8KKyNkZWZpbmUgTEVOR1RIKHZsYykgKCh2bGMpICYgMHhGKQorLyogbWFjcm8gdG8gb2J0YWluIGNvZGUgd29yZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBmaWVsZHMsIGJpdHMgWzQsN10gKi8KKyNkZWZpbmUgSU5GTyh2bGMpICgoKHZsYykgPj4gNCkgJiAweEYpICAvKiA0IE1TQiBiaXRzIGNvbnRhaW4gaW5mb3JtYXRpb24gKi8KKy8qIG1hY3JvIHRvIG9idGFpbiB0cmFpbGluZyBvbmVzIGZyb20gdGhlIGNvZWZmIHRva2VuIGluZm9ybWF0aW9uIHdvcmQsCisgKiBiaXRzIFs1LDEwXSAqLworI2RlZmluZSBUUkFJTElOR19PTkVTKGNvZWZmVG9rZW4pICgoY29lZmZUb2tlbj4+NSkgJiAweDNGKQorLyogbWFjcm8gdG8gb2J0YWluIHRvdGFsIGNvZWZmIGZyb20gdGhlIGNvZWZmIHRva2VuIGluZm9ybWF0aW9uIHdvcmQsCisgKiBiaXRzIFsxMSwxNV0gKi8KKyNkZWZpbmUgVE9UQUxfQ09FRkYoY29lZmZUb2tlbikgKCgoY29lZmZUb2tlbikgPj4gMTEpICYgMHgxRikKKworI2RlZmluZSBWTENfTk9UX0ZPVU5EIDB4RkZGRkZGRkVVCisKKy8qIFZMQyB0YWJsZXMgZm9yIGNvZWZmX3Rva2VuLiBCZWNhdXNlIG9mIGxvbmcgY29kZXMgKG1heC4gMTYgYml0cykgc29tZSBvZiB0aGUKKyAqIHRhYmxlcyBoYXZlIGJlZW4gc3BsaXR0ZWQgaW50byBtdWx0aXBsZSBzZXBhcmF0ZSB0YWJsZXMuIEVhY2ggYXJyYXkvdGFibGUKKyAqIGVsZW1lbnQgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICogWzUgYml0cyBmb3IgdG90LmNvZWZmLl0gWzYgYml0cyBmb3IgdHIub25lc10gWzUgYml0cyBmb3IgVkxDIGxlbmd0aF0KKyAqIElmIHRoZXJlIGlzIGEgMHgwMDAwIHZhbHVlLCBpdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vdCBjb3JyZXNwb25kaW5nIFZMQworICogY29kZXdvcmQgZm9yIHRoYXQgaW5kZXguICovCisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgMCA8PSBuQyA8IDIgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMFszMl0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgyMDY2LDB4MTAyNiwweDA4MDYsMHgxODY1LDB4MTg2NSwKKyAgICAweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLAorICAgIDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsCisgICAgMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDEwIGJpdHMsIDAgPD0gbkMgPCAyICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzFbNDhdID0geworICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDQwNmEsMHgzMDRhLDB4MjgyYSwweDIwMGEsCisgICAgMHgzODY5LDB4Mzg2OSwweDI4NDksMHgyODQ5LDB4MjAyOSwweDIwMjksMHgxODA5LDB4MTgwOSwKKyAgICAweDMwNjgsMHgzMDY4LDB4MzA2OCwweDMwNjgsMHgyMDQ4LDB4MjA0OCwweDIwNDgsMHgyMDQ4LAorICAgIDB4MTgyOCwweDE4MjgsMHgxODI4LDB4MTgyOCwweDEwMDgsMHgxMDA4LDB4MTAwOCwweDEwMDgsCisgICAgMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywKKyAgICAweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3fTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gMTQgYml0cywgMCA8PSBuQyA8IDIgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMls1Nl0gPSB7CisgICAgMHg2MDZlLDB4NTg0ZSwweDUwMmUsMHg1MDBlLDB4NTg2ZSwweDUwNGUsMHg0ODJlLDB4NDgwZSwKKyAgICAweDQwMGQsMHg0MDBkLDB4NDg0ZCwweDQ4NGQsMHg0MDJkLDB4NDAyZCwweDM4MGQsMHgzODBkLAorICAgIDB4NTA2ZCwweDUwNmQsMHg0MDRkLDB4NDA0ZCwweDM4MmQsMHgzODJkLDB4MzAwZCwweDMwMGQsCisgICAgMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwKKyAgICAweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLAorICAgIDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsCisgICAgMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDE2IGJpdHMsIDAgPD0gbkMgPCAyICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzNbMzJdID0geworICAgIDB4MDAwMCwweDAwMDAsMHg2ODJmLDB4NjgyZiwweDgwMTAsMHg4MDUwLDB4ODAzMCwweDc4MTAsCisgICAgMHg4MDcwLDB4Nzg1MCwweDc4MzAsMHg3MDEwLDB4Nzg3MCwweDcwNTAsMHg3MDMwLDB4NjgxMCwKKyAgICAweDcwNmYsMHg3MDZmLDB4Njg0ZiwweDY4NGYsMHg2MDJmLDB4NjAyZiwweDYwMGYsMHg2MDBmLAorICAgIDB4Njg2ZiwweDY4NmYsMHg2MDRmLDB4NjA0ZiwweDU4MmYsMHg1ODJmLDB4NTgwZiwweDU4MGZ9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byA2IGJpdHMsIDIgPD0gbkMgPCA0ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzBbMzJdID0geworICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDM4NjYsMHgyMDQ2LDB4MjAyNiwweDEwMDYsCisgICAgMHgzMDY2LDB4MTg0NiwweDE4MjYsMHgwODA2LDB4Mjg2NSwweDI4NjUsMHgxMDI1LDB4MTAyNSwKKyAgICAweDIwNjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxODY0LAorICAgIDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDN9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byA5IGJpdHMsIDIgPD0gbkMgPCA0ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzFbMzJdID0geworICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDQ4NjksMHgzODQ5LDB4MzgyOSwweDMwMDksCisgICAgMHgyODA4LDB4MjgwOCwweDMwNDgsMHgzMDQ4LDB4MzAyOCwweDMwMjgsMHgyMDA4LDB4MjAwOCwKKyAgICAweDQwNjcsMHg0MDY3LDB4NDA2NywweDQwNjcsMHgyODQ3LDB4Mjg0NywweDI4NDcsMHgyODQ3LAorICAgIDB4MjgyNywweDI4MjcsMHgyODI3LDB4MjgyNywweDE4MDcsMHgxODA3LDB4MTgwNywweDE4MDd9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byAxNCBiaXRzLCAyIDw9IG5DIDwgNCAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMl8yWzEyOF0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDc4NmQsMHg3ODZkLDB4ODA2ZSwweDgwNGUsMHg4MDJlLDB4ODAwZSwKKyAgICAweDc4MmUsMHg3ODBlLDB4Nzg0ZSwweDcwMmUsMHg3MDRkLDB4NzA0ZCwweDcwMGQsMHg3MDBkLAorICAgIDB4NzA2ZCwweDcwNmQsMHg2ODRkLDB4Njg0ZCwweDY4MmQsMHg2ODJkLDB4NjgwZCwweDY4MGQsCisgICAgMHg2ODZkLDB4Njg2ZCwweDYwNGQsMHg2MDRkLDB4NjAyZCwweDYwMmQsMHg2MDBkLDB4NjAwZCwKKyAgICAweDU4MGMsMHg1ODBjLDB4NTgwYywweDU4MGMsMHg1ODRjLDB4NTg0YywweDU4NGMsMHg1ODRjLAorICAgIDB4NTgyYywweDU4MmMsMHg1ODJjLDB4NTgyYywweDUwMGMsMHg1MDBjLDB4NTAwYywweDUwMGMsCisgICAgMHg2MDZjLDB4NjA2YywweDYwNmMsMHg2MDZjLDB4NTA0YywweDUwNGMsMHg1MDRjLDB4NTA0YywKKyAgICAweDUwMmMsMHg1MDJjLDB4NTAyYywweDUwMmMsMHg0ODBjLDB4NDgwYywweDQ4MGMsMHg0ODBjLAorICAgIDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsCisgICAgMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwKKyAgICAweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLAorICAgIDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsCisgICAgMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwKKyAgICAweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLAorICAgIDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsCisgICAgMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgNCA8PSBuQyA8IDggKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjRfMFs2NF0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwKKyAgICAweDE4MDYsMHgzODQ2LDB4MzgyNiwweDEwMDYsMHg0ODY2LDB4MzA0NiwweDMwMjYsMHgwODA2LAorICAgIDB4MjgyNSwweDI4MjUsMHgyODQ1LDB4Mjg0NSwweDIwMjUsMHgyMDI1LDB4MjA0NSwweDIwNDUsCisgICAgMHgxODI1LDB4MTgyNSwweDQwNjUsMHg0MDY1LDB4MTg0NSwweDE4NDUsMHgxMDI1LDB4MTAyNSwKKyAgICAweDM4NjQsMHgzODY0LDB4Mzg2NCwweDM4NjQsMHgzMDY0LDB4MzA2NCwweDMwNjQsMHgzMDY0LAorICAgIDB4Mjg2NCwweDI4NjQsMHgyODY0LDB4Mjg2NCwweDIwNjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsCisgICAgMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxODY0LDB4MTA0NCwweDEwNDQsMHgxMDQ0LDB4MTA0NCwKKyAgICAweDA4MjQsMHgwODI0LDB4MDgyNCwweDA4MjQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0fTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gMTAgYml0cywgNCA8PSBuQyA8IDggKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjRfMVsxMjhdID0geworICAgIDB4MDAwMCwweDgwMGEsMHg4MDZhLDB4ODA0YSwweDgwMmEsMHg3ODBhLDB4Nzg2YSwweDc4NGEsCisgICAgMHg3ODJhLDB4NzAwYSwweDcwNmEsMHg3MDRhLDB4NzAyYSwweDY4MGEsMHg2ODI5LDB4NjgyOSwKKyAgICAweDYwMDksMHg2MDA5LDB4Njg0OSwweDY4NDksMHg2MDI5LDB4NjAyOSwweDU4MDksMHg1ODA5LAorICAgIDB4Njg2OSwweDY4NjksMHg2MDQ5LDB4NjA0OSwweDU4MjksMHg1ODI5LDB4NTAwOSwweDUwMDksCisgICAgMHg2MDY4LDB4NjA2OCwweDYwNjgsMHg2MDY4LDB4NTg0OCwweDU4NDgsMHg1ODQ4LDB4NTg0OCwKKyAgICAweDUwMjgsMHg1MDI4LDB4NTAyOCwweDUwMjgsMHg0ODA4LDB4NDgwOCwweDQ4MDgsMHg0ODA4LAorICAgIDB4NTg2OCwweDU4NjgsMHg1ODY4LDB4NTg2OCwweDUwNDgsMHg1MDQ4LDB4NTA0OCwweDUwNDgsCisgICAgMHg0ODI4LDB4NDgyOCwweDQ4MjgsMHg0ODI4LDB4NDAwOCwweDQwMDgsMHg0MDA4LDB4NDAwOCwKKyAgICAweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LAorICAgIDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsCisgICAgMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywKKyAgICAweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LAorICAgIDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsCisgICAgMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywKKyAgICAweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LAorICAgIDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDd9OworCisvKiBmaXhlZCA2IGJpdCBsZW5ndGggVkxDLCBuQyA8PSA4ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW44WzY0XSA9IHsKKyAgICAweDA4MDYsMHgwODI2LDB4MDAwMCwweDAwMDYsMHgxMDA2LDB4MTAyNiwweDEwNDYsMHgwMDAwLAorICAgIDB4MTgwNiwweDE4MjYsMHgxODQ2LDB4MTg2NiwweDIwMDYsMHgyMDI2LDB4MjA0NiwweDIwNjYsCisgICAgMHgyODA2LDB4MjgyNiwweDI4NDYsMHgyODY2LDB4MzAwNiwweDMwMjYsMHgzMDQ2LDB4MzA2NiwKKyAgICAweDM4MDYsMHgzODI2LDB4Mzg0NiwweDM4NjYsMHg0MDA2LDB4NDAyNiwweDQwNDYsMHg0MDY2LAorICAgIDB4NDgwNiwweDQ4MjYsMHg0ODQ2LDB4NDg2NiwweDUwMDYsMHg1MDI2LDB4NTA0NiwweDUwNjYsCisgICAgMHg1ODA2LDB4NTgyNiwweDU4NDYsMHg1ODY2LDB4NjAwNiwweDYwMjYsMHg2MDQ2LDB4NjA2NiwKKyAgICAweDY4MDYsMHg2ODI2LDB4Njg0NiwweDY4NjYsMHg3MDA2LDB4NzAyNiwweDcwNDYsMHg3MDY2LAorICAgIDB4NzgwNiwweDc4MjYsMHg3ODQ2LDB4Nzg2NiwweDgwMDYsMHg4MDI2LDB4ODA0NiwweDgwNjZ9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byAzIGJpdHMsIG5DID09IC0xICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW5NaW51czFfMFs4XSA9IHsKKyAgICAweDAwMDAsMHgxMDQzLDB4MDAwMiwweDAwMDIsMHgwODIxLDB4MDgyMSwweDA4MjEsMHgwODIxfTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gOCBiaXRzLCBuQyA9PSAtMSAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuTWludXMxXzFbMzJdID0geworICAgIDB4MjA2NywweDIwNjcsMHgyMDQ4LDB4MjAyOCwweDE4NDcsMHgxODQ3LDB4MTgyNywweDE4MjcsCisgICAgMHgyMDA2LDB4MjAwNiwweDIwMDYsMHgyMDA2LDB4MTgwNiwweDE4MDYsMHgxODA2LDB4MTgwNiwKKyAgICAweDEwMDYsMHgxMDA2LDB4MTAwNiwweDEwMDYsMHgxODY2LDB4MTg2NiwweDE4NjYsMHgxODY2LAorICAgIDB4MTAyNiwweDEwMjYsMHgxMDI2LDB4MTAyNiwweDA4MDYsMHgwODA2LDB4MDgwNiwweDA4MDZ9OworCisvKiBWTEMgdGFibGVzIGZvciB0b3RhbF96ZXJvcy4gT25lIHRhYmxlIGNvbnRhaW5pbmcgbG9uZ2VyIGNvZGUsIHRvdGFsWmVyb3NfMSwKKyAqIGhhcyBiZWVuIGJyb2tlbiBpbnRvIHR3byBzZXBhcmF0ZSB0YWJsZXMuIFRhYmxlIGVsZW1lbnRzIGhhdmUgdGhlCisgKiBmb2xsb3dpbmcgc3RydWN0dXJlOgorICogWzQgYml0cyBmb3IgaW5mb10gWzQgYml0cyBmb3IgVkxDIGxlbmd0aF0gKi8KKworLyogVkxDIGxlbmd0aHMgdXAgdG8gNSBiaXRzICovCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xXzBbMzJdID0geworICAgIDB4MDAsMHgwMCwweDY1LDB4NTUsMHg0NCwweDQ0LDB4MzQsMHgzNCwKKyAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MTMsMHgxMywweDEzLDB4MTMsCisgICAgMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorICAgIDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMX07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDkgYml0cyAqLworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMV8xWzMyXSA9IHsKKyAgICAweDAwLDB4ZjksMHhlOSwweGQ5LDB4YzgsMHhjOCwweGI4LDB4YjgsCisgICAgMHhhNywweGE3LDB4YTcsMHhhNywweDk3LDB4OTcsMHg5NywweDk3LAorICAgIDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwKKyAgICAweDc2LDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2LDB4NzZ9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18yWzY0XSA9IHsKKyAgICAweGU2LDB4ZDYsMHhjNiwweGI2LDB4YTUsMHhhNSwweDk1LDB4OTUsCisgICAgMHg4NCwweDg0LDB4ODQsMHg4NCwweDc0LDB4NzQsMHg3NCwweDc0LAorICAgIDB4NjQsMHg2NCwweDY0LDB4NjQsMHg1NCwweDU0LDB4NTQsMHg1NCwKKyAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKKyAgICAweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsCisgICAgMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfM1s2NF0gPSB7CisgICAgMHhkNiwweGI2LDB4YzUsMHhjNSwweGE1LDB4YTUsMHg5NSwweDk1LAorICAgIDB4ODQsMHg4NCwweDg0LDB4ODQsMHg1NCwweDU0LDB4NTQsMHg1NCwKKyAgICAweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDQsMHgwNCwweDA0LDB4MDQsCisgICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCisgICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLAorICAgIDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzRbMzJdID0geworICAgIDB4YzUsMHhiNSwweGE1LDB4MDUsMHg5NCwweDk0LDB4NzQsMHg3NCwKKyAgICAweDM0LDB4MzQsMHgyNCwweDI0LDB4ODMsMHg4MywweDgzLDB4ODMsCisgICAgMHg2MywweDYzLDB4NjMsMHg2MywweDUzLDB4NTMsMHg1MywweDUzLAorICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHgxMywweDEzLDB4MTMsMHgxM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzVbMzJdID0geworICAgIDB4YjUsMHg5NSwweGE0LDB4YTQsMHg4NCwweDg0LDB4MjQsMHgyNCwKKyAgICAweDE0LDB4MTQsMHgwNCwweDA0LDB4NzMsMHg3MywweDczLDB4NzMsCisgICAgMHg2MywweDYzLDB4NjMsMHg2MywweDUzLDB4NTMsMHg1MywweDUzLAorICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHgzMywweDMzLDB4MzMsMHgzM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzZbNjRdID0geworICAgIDB4YTYsMHgwNiwweDE1LDB4MTUsMHg4NCwweDg0LDB4ODQsMHg4NCwKKyAgICAweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsCisgICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsCisgICAgMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLAorICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKKyAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjN9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc183WzY0XSA9IHsKKyAgICAweDk2LDB4MDYsMHgxNSwweDE1LDB4NzQsMHg3NCwweDc0LDB4NzQsCisgICAgMHg4MywweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywweDgzLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKKyAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCisgICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfOFs2NF0gPSB7CisgICAgMHg4NiwweDA2LDB4MjUsMHgyNSwweDE0LDB4MTQsMHgxNCwweDE0LAorICAgIDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywKKyAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKKyAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCisgICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAorICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0Mn07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzlbNjRdID0geworICAgIDB4MTYsMHgwNiwweDc1LDB4NzUsMHgyNCwweDI0LDB4MjQsMHgyNCwKKyAgICAweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsCisgICAgMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLAorICAgIDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwKKyAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCisgICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAorICAgIDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwKKyAgICAweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzJ9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMFszMl0gPSB7CisgICAgMHgxNSwweDA1LDB4NjQsMHg2NCwweDIzLDB4MjMsMHgyMywweDIzLAorICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKKyAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCisgICAgMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTFbMTZdID0geworICAgIDB4MDQsMHgxNCwweDIzLDB4MjMsMHgzMywweDMzLDB4NTMsMHg1MywKKyAgICAweDQxLDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxLDB4NDF9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMlsxNl0gPSB7CisgICAgMHgwNCwweDE0LDB4NDMsMHg0MywweDIyLDB4MjIsMHgyMiwweDIyLAorICAgIDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMX07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzEzWzhdID0gezB4MDMsMHgxMywweDMyLDB4MzIsMHgyMSwweDIxLDB4MjEsMHgyMX07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzE0WzRdID0gezB4MDIsMHgxMiwweDIxLDB4MjF9OworCisvKiBWTEMgdGFibGVzIGZvciBydW5fYmVmb3JlLiBUYWJsZSBlbGVtZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICogWzQgYml0cyBmb3IgaW5mb10gWzRiaXRzIGZvciBWTEMgbGVuZ3RoXQorICovCisKK3N0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfNls4XSA9IHsweDEzLDB4MjMsMHg0MywweDMzLDB4NjMsMHg1MywweDAyLDB4MDJ9OworCitzdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzVbOF0gPSB7MHg1MywweDQzLDB4MzMsMHgyMywweDEyLDB4MTIsMHgwMiwweDAyfTsKKworc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV80WzhdID0gezB4NDMsMHgzMywweDIyLDB4MjIsMHgxMiwweDEyLDB4MDIsMHgwMn07CisKK3N0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfM1s0XSA9IHsweDMyLDB4MjIsMHgxMiwweDAyfTsKKworc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV8yWzRdID0gezB4MjIsMHgxMiwweDAxLDB4MDF9OworCitzdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzFbMl0gPSB7MHgxMSwweDAxfTsKKworLyogZm9sbG93aW5nIGZvdXIgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBzdHJlYW0gYnVmZmVyICJjYWNoZSIgaW4gdGhlIENBVkxDCisgKiBkZWNvZGluZyBmdW5jdGlvbiAqLworCisvKiBtYWNybyB0byBpbml0aWFsaXplIHN0cmVhbSBidWZmZXIgY2FjaGUsIGZpbGxzIHRoZSBidWZmZXIgKDMyIGJpdHMpICovCisjZGVmaW5lIEJVRkZFUl9JTklUKHZhbHVlLCBiaXRzKSBcCit7IFwKKyAgICBiaXRzID0gMzI7IFwKKyAgICB2YWx1ZSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7IFwKK30KKworLyogbWFjcm8gdG8gcmVhZCBudW1CaXRzIGJpdHMgZnJvbSB0aGUgYnVmZmVyLCBiaXRzIHdpbGwgYmUgd3JpdHRlbiB0bworICogb3V0VmFsLiBSZWZpbGxzIHRoZSBidWZmZXIgaWYgbm90IGVub3VnaCBiaXRzIGxlZnQgKi8KKyNkZWZpbmUgQlVGRkVSX1NIT1codmFsdWUsIGJpdHMsIG91dFZhbCwgbnVtQml0cykgXAoreyBcCisgICAgaWYgKGJpdHMgPCAobnVtQml0cykpIFwKKyAgICB7IFwKKyAgICAgICAgaWYoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzItYml0cykgPT0gRU5EX09GX1NUUkVBTSkgXAorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOyBcCisgICAgICAgIHZhbHVlID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAorICAgICAgICBiaXRzID0gMzI7IFwKKyAgICB9IFwKKyAgICAob3V0VmFsKSA9IHZhbHVlID4+ICgzMiAtIChudW1CaXRzKSk7IFwKK30KKworLyogbWFjcm8gdG8gZmx1c2ggbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBCVUZGRVJfRkxVU0godmFsdWUsIGJpdHMsIG51bUJpdHMpIFwKK3sgXAorICAgIHZhbHVlIDw8PSAobnVtQml0cyk7IFwKKyAgICBiaXRzIC09IChudW1CaXRzKTsgXAorfQorCisvKiBtYWNybyB0byByZWFkIGFuZCBmbHVzaCAgbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciwgYml0cyB3aWxsIGJlIHdyaXR0ZW4KKyAqIHRvIG91dFZhbC4gUmVmaWxscyB0aGUgYnVmZmVyIGlmIG5vdCBlbm91Z2ggYml0cyBsZWZ0ICovCisjZGVmaW5lIEJVRkZFUl9HRVQodmFsdWUsIGJpdHMsIG91dFZhbCwgbnVtQml0cykgXAoreyBcCisgICAgaWYgKGJpdHMgPCAobnVtQml0cykpIFwKKyAgICB7IFwKKyAgICAgICAgaWYoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzItYml0cykgPT0gRU5EX09GX1NUUkVBTSkgXAorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOyBcCisgICAgICAgIHZhbHVlID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAorICAgICAgICBiaXRzID0gMzI7IFwKKyAgICB9IFwKKyAgICAob3V0VmFsKSA9IHZhbHVlID4+ICgzMiAtIChudW1CaXRzKSk7IFwKKyAgICB2YWx1ZSA8PD0gKG51bUJpdHMpOyBcCisgICAgYml0cyAtPSAobnVtQml0cyk7IFwKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUNvZWZmVG9rZW4odTMyIGJpdHMsIHUzMiBuYyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlTGV2ZWxQcmVmaXgodTMyIGJpdHMpOworCitzdGF0aWMgdTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUnVuQmVmb3JlKHUzMiBiaXRzLHUzMiB6ZXJvc0xlZnQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUNvZWZmVG9rZW4KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBjb2VmZl90b2tlbiBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCAxNiBzdHJlYW0gYml0cworICAgICAgICAgIHUzMiBuYyAgICAgICAgICAgICAgICAgICAgbkMsIHNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgdTMyICBpbmZvcm1hdGlvbiBmaWVsZCAoMTEgYml0cyBmb3IgdmFsdWUsIDUgYml0cyBmb3IgbGVuZ3RoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlQ29lZmZUb2tlbih1MzIgYml0cywgdTMyIG5jKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YWx1ZTsKKworLyogQ29kZSAqLworCisgICAgLyogc3RhbmRhcmQgZGVmaW5lcyB0aGF0IG5jIGZvciBkZWNvZGluZyBvZiBjaHJvbWEgZGMgY29lZmZpY2llbnRzIGlzIC0xLAorICAgICAqIHJlcHJlc2VudGVkIGJ5IHUzMiBoZXJlIC0+IC0xIG1hcHMgdG8gMl4zMiAtIDEgKi8KKyAgICBBU1NFUlQobmMgPD0gMTYgfHwgbmMgPT0gKHUzMikoLTEpKTsKKworICAgIGlmIChuYyA8IDIpCisgICAgeworICAgICAgICBpZiAoYml0cyA+PSAweDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gMHgwMDAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwQzAwKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8wW2JpdHMgPj4gMTBdOworICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDEwMCkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMVtiaXRzID4+IDZdOworICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDAyMCkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMlsoYml0cz4+MiktOF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfM1tiaXRzXTsKKyAgICB9CisgICAgZWxzZSBpZiAobmMgPCA0KQorICAgIHsKKyAgICAgICAgaWYgKGJpdHMgPj0gMHg4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSA9IGJpdHMgJiAweDQwMDAgPyAweDAwMDIgOiAweDA4MjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDEwMDApCisgICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4yXzBbYml0cyA+PiAxMF07CisgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMjAwKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMl8xW2JpdHMgPj4gN107CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjJfMltiaXRzPj4yXTsKKyAgICB9CisgICAgZWxzZSBpZiAobmMgPCA4KQorICAgIHsKKyAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8wW2JpdHMgPj4gMTBdOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8xW2JpdHM+PjZdOworICAgIH0KKyAgICBlbHNlIGlmIChuYyA8PSAxNikKKyAgICB7CisgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjhbYml0cz4+MTBdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW5NaW51czFfMFtiaXRzID4+IDEzXTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbk1pbnVzMV8xW2JpdHM+PjhdOworICAgIH0KKworICAgIHJldHVybih2YWx1ZSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVMZXZlbFByZWZpeAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgdTMyIGJpdHMgICAgICBuZXh0IDE2IHN0cmVhbSBiaXRzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICB1MzIgIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBvciBWTENfTk9UX0ZPVU5ECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZWNvZGVMZXZlbFByZWZpeCh1MzIgYml0cykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgbnVtWmVyb3M7CisKKy8qIENvZGUgKi8KKworICAgIGlmIChiaXRzID49IDB4ODAwMCkKKyAgICAgICAgbnVtWmVyb3MgPSAwOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg0MDAwKQorICAgICAgICBudW1aZXJvcyA9IDE7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDIwMDApCisgICAgICAgIG51bVplcm9zID0gMjsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMCkKKyAgICAgICAgbnVtWmVyb3MgPSAzOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwODAwKQorICAgICAgICBudW1aZXJvcyA9IDQ7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDA0MDApCisgICAgICAgIG51bVplcm9zID0gNTsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MDIwMCkKKyAgICAgICAgbnVtWmVyb3MgPSA2OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMTAwKQorICAgICAgICBudW1aZXJvcyA9IDc7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwODApCisgICAgICAgIG51bVplcm9zID0gODsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MDA0MCkKKyAgICAgICAgbnVtWmVyb3MgPSA5OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDIwKQorICAgICAgICBudW1aZXJvcyA9IDEwOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDEwKQorICAgICAgICBudW1aZXJvcyA9IDExOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA4KQorICAgICAgICBudW1aZXJvcyA9IDEyOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA0KQorICAgICAgICBudW1aZXJvcyA9IDEzOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAyKQorICAgICAgICBudW1aZXJvcyA9IDE0OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAxKQorICAgICAgICBudW1aZXJvcyA9IDE1OworICAgIGVsc2UgLyogbW9yZSB0aGFuIDE1IHplcm9zIGVuY291bnRlcmVkIHdoaWNoIGlzIGFuIGVycm9yICovCisgICAgICAgIHJldHVybihWTENfTk9UX0ZPVU5EKTsKKworICAgIHJldHVybihudW1aZXJvcyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVUb3RhbFplcm9zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgdG90YWxfemVyb3MgaW5mb3JtYXRpb24gZmllbGQgZnJvbSB0aGUgc3RyZWFtCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCA5IHN0cmVhbSBiaXRzCisgICAgICAgICAgdTMyIHRvdGFsQ29lZmYgICAgICAgICAgICB0b3RhbCBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciB0aGUgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGRlY29kZWQKKyAgICAgICAgICB1MzIgaXNDaHJvbWFEQyAgICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBjaHJvbWEgREMgYmxvY2sKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdmFsdWUgPSAweDA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCh0b3RhbENvZWZmKTsKKworICAgIGlmICghaXNDaHJvbWFEQykKKyAgICB7CisgICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgMTYpOworICAgICAgICBzd2l0Y2ggKHRvdGFsQ29lZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMV8wW2JpdHMgPj4gNF07CisgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzFfMVtiaXRzXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18yW2JpdHMgPj4gM107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfM1tiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzRbYml0cyA+PiA0XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc181W2JpdHMgPj4gNF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfNltiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzdbYml0cyA+PiAzXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc184W2JpdHMgPj4gM107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfOVtiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMFtiaXRzID4+IDRdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMVtiaXRzID4+IDVdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMltiaXRzID4+IDVdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xM1tiaXRzID4+IDZdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xNFtiaXRzID4+IDddOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDE1ICovCisgICAgICAgICAgICAgICAgdmFsdWUgPSAoYml0cyA+PiA4KSA/IDB4MTEgOiAweDAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgNCk7CisgICAgICAgIGJpdHMgPj49IDY7CisgICAgICAgIGlmIChiaXRzID4gMykKKyAgICAgICAgICAgIHZhbHVlID0gMHgwMTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodG90YWxDb2VmZiA9PSAzKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRvdGFsQ29lZmYgPT0gMikKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MjI7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHgyMzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MzM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4odmFsdWUpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUnVuQmVmb3JlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgcnVuX2JlZm9yZSBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgdTMyIGJpdHMgICAgICAgICAgICAgICAgICBuZXh0IDExIHN0cmVhbSBiaXRzCisgICAgICAgICAgdTMyIHplcm9zTGVmdCAgICAgICAgICAgICBudW1iZXIgb2YgemVyb3MgbGVmdCBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVJ1bkJlZm9yZSh1MzIgYml0cywgdTMyIHplcm9zTGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdmFsdWUgPSAweDA7CisKKy8qIENvZGUgKi8KKworICAgIHN3aXRjaCAoemVyb3NMZWZ0KQorICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfMVtiaXRzPj4xMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV8yW2JpdHM+PjldOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfM1tiaXRzPj45XTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzRbYml0cz4+OF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV81W2JpdHM+PjhdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfNltiaXRzPj44XTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoYml0cyA+PSAweDEwMCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoNy0oYml0cz4+OCkpPDw0KSsweDM7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4ODApCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweDc0OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQwKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHg4NTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgyMCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4OTY7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MTApCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGE3OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDgpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGI4OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGM5OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDIpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGRBOworICAgICAgICAgICAgZWxzZSBpZiAoYml0cykKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4ZUI7CisgICAgICAgICAgICBpZiAoSU5GTyh2YWx1ZSkgPiB6ZXJvc0xlZnQpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKHZhbHVlKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIG9uZSBDQVZMQyBjb2RlZCBibG9jay4gVGhpcyBjb3JyZXNwb25kcyB0bworICAgICAgICAgIHN5bnRheCBlbGVtZW50cyByZXNpZHVhbF9ibG9ja19jYXZsYygpIGluIHRoZSBzdGFuZGFyZC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcFN0cm1EYXRhICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgbmMgICAgICAgICAgICAgICAgICAgIG5DIHZhbHVlCisgICAgICAgICAgbWF4TnVtQ29lZmYgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHJlc2lkdWFsIGNvZWZmaWNpZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgY29lZmZMZXZlbCAgICAgICAgICAgIHN0b3JlcyBkZWNvZGVkIGNvZWZmaWNpZW50IGxldmVscworCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgbnVtQ29lZmZzICAgICAgICAgICAgIG9uIGJpdHMgWzQsMTFdIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgICBjb2VmZk1hcCAgICAgICAgICAgICAgb24gYml0cyBbMTYsMzFdIGlmIHN1Y2Nlc3NmdWwsIHRoaXMgaXMgYml0IG1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBlYWNoIGJpdCBpbmRpY2F0ZXMgaWYgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnQgd2FzIHplcm8gKDApIG9yIG5vbi16ZXJvICgxKQorICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgICBlbmQgb2Ygc3RyZWFtIG9yIGVycm9yIGluIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBpMzIgKmNvZWZmTGV2ZWwsCisgIGkzMiBuYywKKyAgdTMyIG1heE51bUNvZWZmKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXAsIHRvdGFsQ29lZmYsIHRyYWlsaW5nT25lcywgc3VmZml4TGVuZ3RoLCBsZXZlbFByZWZpeDsKKyAgICB1MzIgbGV2ZWxTdWZmaXgsIHplcm9zTGVmdCwgYml0OworICAgIGkzMiBsZXZlbFsxNl07CisgICAgdTMyIHJ1blsxNl07CisgICAgLyogc3RyZWFtICJjYWNoZSIgKi8KKyAgICB1MzIgYnVmZmVyVmFsdWU7CisgICAgdTMyIGJ1ZmZlckJpdHM7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChjb2VmZkxldmVsKTsKKyAgICBBU1NFUlQobmMgPiAtMik7CisgICAgQVNTRVJUKG1heE51bUNvZWZmID09IDQgfHwgbWF4TnVtQ29lZmYgPT0gMTUgfHwgbWF4TnVtQ29lZmYgPT0gMTYpOworICAgIEFTU0VSVChWTENfTk9UX0ZPVU5EICE9IEVORF9PRl9TVFJFQU0pOworCisgICAgLyogYXNzdW1lIHRoYXQgY29lZmZMZXZlbCBhcnJheSBoYXMgYmVlbiAiY2xlYW5lZCIgYnkgY2FsbGVyICovCisKKyAgICBCVUZGRVJfSU5JVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cyk7CisKKyAgICAvKmxpbnQgLWU3NzQgZGlzYWJsZSBsaW50IHdhcm5pbmcgb24gYWx3YXlzIGZhbHNlIGNvbXBhcmlzb24gKi8KKyAgICBCVUZGRVJfU0hPVyhidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCAxNik7CisgICAgLypsaW50ICtlNzc0ICovCisgICAgdG1wID0gRGVjb2RlQ29lZmZUb2tlbihiaXQsICh1MzIpbmMpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBMRU5HVEhfVEModG1wKSk7CisKKyAgICB0b3RhbENvZWZmID0gVE9UQUxfQ09FRkYodG1wKTsKKyAgICBpZiAodG90YWxDb2VmZiA+IG1heE51bUNvZWZmKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgdHJhaWxpbmdPbmVzID0gVFJBSUxJTkdfT05FUyh0bXApOworCisgICAgaWYgKHRvdGFsQ29lZmYgIT0gMCkKKyAgICB7CisgICAgICAgIGkgPSAwOworICAgICAgICAvKiBub256ZXJvIGNvZWZmaWNpZW50czogKy8tIDEgKi8KKyAgICAgICAgaWYgKHRyYWlsaW5nT25lcykKKyAgICAgICAgeworICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCB0cmFpbGluZ09uZXMpOworICAgICAgICAgICAgdG1wID0gMSA8PCAodHJhaWxpbmdPbmVzIC0gMSk7CisgICAgICAgICAgICBmb3IgKDsgdG1wOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSBiaXQgJiB0bXAgPyAtMSA6IDE7CisgICAgICAgICAgICAgICAgdG1wID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogb3RoZXIgbGV2ZWxzICovCisgICAgICAgIGlmICh0b3RhbENvZWZmID4gMTAgJiYgdHJhaWxpbmdPbmVzIDwgMykKKyAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDA7CisKKyAgICAgICAgZm9yICg7IGkgPCB0b3RhbENvZWZmOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsIDE2KTsKKyAgICAgICAgICAgIGxldmVsUHJlZml4ID0gRGVjb2RlTGV2ZWxQcmVmaXgoYml0KTsKKyAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA9PSBWTENfTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxQcmVmaXgrMSk7CisKKyAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA8IDE0KQorICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsUHJlZml4ID09IDE0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aCA/IHN1ZmZpeExlbmd0aCA6IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2V0dGluZyBzdWZmaXhMZW5ndGggdG8gMSBoZXJlIGNvcnJlc3BvbmRzIHRvIGFkZGluZyAxNQorICAgICAgICAgICAgICAgICAqIHRvIGxldmVsQ29kZSB2YWx1ZSBpZiBsZXZlbFByZWZpeCA9PSAxNSBhbmQKKyAgICAgICAgICAgICAgICAgKiBzdWZmaXhMZW5ndGggPT0gMCAqLworICAgICAgICAgICAgICAgIGlmICghc3VmZml4TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAxOworICAgICAgICAgICAgICAgIHRtcCA9IDEyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoKQorICAgICAgICAgICAgICAgIGxldmVsUHJlZml4IDw8PSBzdWZmaXhMZW5ndGg7CisKKyAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxTdWZmaXgsIHRtcCk7CisgICAgICAgICAgICAgICAgbGV2ZWxQcmVmaXggKz0gbGV2ZWxTdWZmaXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcCA9IGxldmVsUHJlZml4OworCisgICAgICAgICAgICBpZiAoaSA9PSB0cmFpbGluZ09uZXMgJiYgdHJhaWxpbmdPbmVzIDwgMykKKyAgICAgICAgICAgICAgICB0bXAgKz0gMjsKKworICAgICAgICAgICAgbGV2ZWxbaV0gPSAodG1wKzIpPj4xOworCisgICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMTsKKworICAgICAgICAgICAgaWYgKChsZXZlbFtpXSA+ICgzIDw8IChzdWZmaXhMZW5ndGggLSAxKSkpICYmIHN1ZmZpeExlbmd0aCA8IDYpCisgICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoKys7CisKKyAgICAgICAgICAgIGlmICh0bXAgJiAweDEpCisgICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSAtbGV2ZWxbaV07CisgICAgICAgIH0KKworICAgICAgICAvKiB6ZXJvIHJ1bnMgKi8KKyAgICAgICAgaWYgKHRvdGFsQ29lZmYgPCBtYXhOdW1Db2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCw5KTsKKyAgICAgICAgICAgIHplcm9zTGVmdCA9IERlY29kZVRvdGFsWmVyb3MoYml0LCB0b3RhbENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKG1heE51bUNvZWZmID09IDQpKTsKKyAgICAgICAgICAgIGlmICghemVyb3NMZWZ0KQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgTEVOR1RIKHplcm9zTGVmdCkpOworICAgICAgICAgICAgemVyb3NMZWZ0ID0gSU5GTyh6ZXJvc0xlZnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHplcm9zTGVmdCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ29lZmYgLSAxOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh6ZXJvc0xlZnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsMTEpOworICAgICAgICAgICAgICAgIHRtcCA9IERlY29kZVJ1bkJlZm9yZShiaXQsIHplcm9zTGVmdCk7CisgICAgICAgICAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBCVUZGRVJfRkxVU0goYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIExFTkdUSCh0bXApKTsKKyAgICAgICAgICAgICAgICBydW5baV0gPSBJTkZPKHRtcCk7CisgICAgICAgICAgICAgICAgemVyb3NMZWZ0IC09IHJ1bltpXSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bltpXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjb21iaW5pbmcgbGV2ZWwgYW5kIHJ1biwgbGV2ZWxTdWZmaXggdmFyaWFibGUgdXNlZCB0byBob2xkIGNvZWZmTWFwLAorICAgICAgICAgKiBpLmUuIGJpdCBtYXAgaW5kaWNhdGluZyB3aGljaCBjb2VmZmljaWVudHMgaGFkIG5vbi16ZXJvIHZhbHVlLiAqLworCisgICAgICAgIC8qbGludCAtZXN5bSg3NzEsbGV2ZWwscnVuKSBsZXZlbCBhbmQgcnVuIGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgdG1wID0gemVyb3NMZWZ0OworICAgICAgICBjb2VmZkxldmVsW3RtcF0gPSBsZXZlbFt0b3RhbENvZWZmLTFdOworICAgICAgICBsZXZlbFN1ZmZpeCA9IDEgPDwgdG1wOworICAgICAgICBmb3IgKGkgPSB0b3RhbENvZWZmLTE7IGktLTspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCArPSBydW5baV07CisgICAgICAgICAgICBsZXZlbFN1ZmZpeCB8PSAxIDw8IHRtcDsKKyAgICAgICAgICAgIGNvZWZmTGV2ZWxbdG1wXSA9IGxldmVsW2ldOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgICAgICBsZXZlbFN1ZmZpeCA9IDA7CisKKyAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyLWJ1ZmZlckJpdHMpICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcmV0dXJuKCh0b3RhbENvZWZmIDw8IDQpIHwgKGxldmVsU3VmZml4IDw8IDE2KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODAzNTNkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfQ0FWTENfSAorI2RlZmluZSBIMjY0U1dERUNfQ0FWTENfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgaTMyICpjb2VmZkxldmVsLAorICBpMzIgbmMsCisgIHUzMiBtYXhOdW1Db2VmZik7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NBVkxDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NmZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiYWJhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19DRkdfSAorI2RlZmluZSBIMjY0U1dERUNfQ0ZHX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWF9OVU1fUkVGX1BJQ1MgMTYKKyNkZWZpbmUgTUFYX05VTV9TTElDRV9HUk9VUFMgOAorI2RlZmluZSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTIDMyCisjZGVmaW5lIE1BWF9OVU1fUElDX1BBUkFNX1NFVFMgMjU2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NGR19IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5M2ZiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCkBAIC0wLDAgKzEsNjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZENvbmNlYWwKKyAgICAgICAgICBDb25jZWFsTWIKKyAgICAgICAgICBUcmFuc2Zvcm0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2NvbmNlYWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypsaW50IC1lNzAyIGRpc2FibGUgbGludCB3YXJuaW5nIG9uIHJpZ2h0IHNoaWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKKyAgICB1MzIgc2xpY2VUeXBlLCB1OCAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybShpMzIgKmRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENvbmNlYWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVyZm9ybSBlcnJvciBjb25jZWFsbWVudCBmb3IgYSBwaWN0dXJlLiBUd28gdHlwZXMgb2YgY29uY2VhbG1lbnQKKyAgICAgICAgICAgIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBzbGljZVR5cGU6CisgICAgICAgICAgICAgICAgMSkgY29weSBmcm9tIHByZXZpb3VzIHBpY3R1cmUgZm9yIFAtc2xpY2VzLgorICAgICAgICAgICAgICAgIDIpIGNvbmNlYWxtZW50IGZyb20gbmVpZ2hib3VyIHBpeGVscyBmb3IgSS1zbGljZXMKKworICAgICAgICAgICAgSS10eXBlIGNvbmNlYWxtZW50IGlzIGJhc2VkIG9uIGlkZWFzIHByZXNlbnRlZCBieSBKYXJubyBUdWxra2kuCisgICAgICAgICAgICBUaGUgY29uY2VhbG1lbnQgYWxnb3JpdGhtIGRldGVybWluZXMgZnJlcXVlbmN5IGRvbWFpbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgIGZyb20gdGhlIG5laWdoYm91ciBwaXhlbHMsIGFwcGxpZXMgaW50ZWdlciB0cmFuc2Zvcm0gKHRoZSBzYW1lCisgICAgICAgICAgICB0cmFuc2Zvcm0gdXNlZCBpbiB0aGUgcmVzaWR1YWwgcHJvY2Vzc2luZykgYW5kIHVzZXMgdGhlIHJlc3VsdHMgYXMKKyAgICAgICAgICAgIHBpeGVsIHZhbHVlcyBmb3IgY29uY2VhbGVkIG1hY3JvYmxvY2tzLiBUcmFuc2Zvcm0gcHJvZHVjZXMgNHg0CisgICAgICAgICAgICBhcnJheSBhbmQgb25lIHBpeGVsIHZhbHVlIGhhcyB0byBiZSB1c2VkIGZvciA0eDQgbHVtYSBibG9ja3MgYW5kCisgICAgICAgICAgICAyeDIgY2hyb21hIGJsb2Nrcy4KKworICAgICAgICAgICAgU2ltaWxhciBjb25jZWFsbWVudCBpcyBwZXJmb3JtZWQgZm9yIHdob2xlIHBpY3R1cmUgKHRoZSBjaG9pc2UKKyAgICAgICAgICAgIG9mIHRoZSB0eXBlIGlzIGJhc2VkIG9uIGxhc3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQgc2xpY2UgaGVhZGVyIG9mCisgICAgICAgICAgICB0aGUgcGljdHVyZSBidXQgaXQgaXMgaGFuZGxlZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbikuIEl0IGlzCisgICAgICAgICAgICBhY2tub3dsZWRnZWQgdGhhdCB0aGlzIG1heSByZXN1bHQgaW4gd3JvbmcgdHlwZSBvZiBjb25jZWFsbWVudAorICAgICAgICAgICAgd2hlbiBhIHBpY3R1cmUgY29udGFpbnMgYm90aCB0eXBlcyBvZiBzbGljZXMuIEhvd2V2ZXIsCisgICAgICAgICAgICBkZXRlcm1pbmF0aW9uIG9mIHNsaWNlIHR5cGUgbWFjcm9ibG9jay1ieS1tYWNyb2Jsb2NrIGNhbm5vdAorICAgICAgICAgICAgYmUgZG9uZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvIGtub3cgdG8gd2hpY2gKKyAgICAgICAgICAgIHNsaWNlIGVhY2ggY29ycnVwdGVkIChub3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQpIG1hY3JvYmxvY2sKKyAgICAgICAgICAgIGJlbG9uZ3MuCisKKyAgICAgICAgICAgIFRoZSBlcnJvciBjb25jZWFsbWVudCBpcyBzdGFydGVkIGJ5IHNlYXJjaGluZyB0aGUgZmlyc3QgcHJvcG9lcmx5CisgICAgICAgICAgICBkZWNvZGVkIG1hY3JvYmxvY2sgYW5kIGNvbmNlYWxpbmcgdGhlIHJvdyBjb250YWluaW5nIHRoZSBtYWNyb2Jsb2NrCisgICAgICAgICAgICBpbiBxdWVzdGlvbi4gQWZ0ZXIgdGhhdCBhbGwgbWFjcm9ibG9ja3MgYWJvdmUgdGhlIHJvdyBpbiBxdWVzdGlvbgorICAgICAgICAgICAgYXJlIGNvbmNlYWxlZC4gRmluYWxseSBjb25jZWFsbWVudCBvZiByb3dzIGJlbG93IGlzIHBlcmZvcm1lZC4KKyAgICAgICAgICAgIFRoZSBvcmRlciBvZiBjb25jZWFsbWVudCBmb3IgNHg0IHBpY3R1cmUgd2hlcmUgbWFjcm9ibG9jayA5IGlzIHRoZQorICAgICAgICAgICAgZmlyc3QgcHJvcGVybHkgZGVjb2RlZCBvbmUgaXMgYXMgZm9sbG93cyAocHJvcGVybHkgZGVjb2RlZAorICAgICAgICAgICAgbWFjcm9ibG9ja3MgbWFya2VkIHdpdGggJ3gnLCBudW1iZXJzIGluZGljYXRpbmcgdGhlIG9yZGVyIG9mCisgICAgICAgICAgICBjb25jZWFsbWVudCk6CisKKyAgICAgICAgICAgICAgIDQgIDYgIDggMTAKKyAgICAgICAgICAgICAgIDMgIDUgIDcgIDkKKyAgICAgICAgICAgICAgIDEgIHggIHggIDIKKyAgICAgICAgICAgICAgMTEgMTIgMTMgMTQKKworICAgICAgICAgICAgSWYgYWxsIG1hY3JvYmxvY2tzIG9mIHRoZSBwaWN0dXJlIGFyZSBsb3N0LCB0aGUgY29uY2VhbG1lbnQgaXMKKyAgICAgICAgICAgIGNvcHkgb2YgcHJldmlvdXMgcGljdHVyZSBmb3IgUC10eXBlIGFuZCBzZXR0aW5nIHRoZSBpbWFnZSB0bworICAgICAgICAgICAgY29uc3RhbnQgZ3JheSAocGl4ZWwgdmFsdWUgMTI4KSBmb3IgSS10eXBlLgorCisgICAgICAgICAgICBDb25jZWFsbWVudCBzZXRzIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGNvbmNlYWxlZAorICAgICAgICAgICAgbWFjcm9ibG9ja3MgdG8gdmFsdWUgNDAgYW5kIG1hY3JvYmxvY2sgdHlwZSB0byBpbnRyYSB0byBlbmFibGUKKyAgICAgICAgICAgIGRlYmxvY2tpbmcgZmlsdGVyIHRvIHNtb290aCB0aGUgZWRnZXMgb2YgdGhlIGNvbmNlYWxlZCBhcmVhcy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBpbWFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHNsaWNlVHlwZSAgICAgICB0eXBlIG9mIHRoZSBzbGljZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgY29uY2VhbGVkIG1hY3JvYmxvY2tzIHdpbGwgYmUgd3JpdHRlbiBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENvbmNlYWwoc3RvcmFnZV90ICpwU3RvcmFnZSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgc2xpY2VUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIHUzMiByb3csIGNvbDsKKyAgICB1MzIgd2lkdGgsIGhlaWdodDsKKyAgICB1OCAqcmVmRGF0YTsKKyAgICBtYlN0b3JhZ2VfdCAqbWI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKGN1cnJJbWFnZSk7CisKKyAgICBERUJVRygoIkNvbmNlYWxpbmcgJXMgc2xpY2VcbiIsIElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSA/CisgICAgICAgICAgICAiaW50cmEiIDogImludGVyIikpOworCisgICAgd2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOworICAgIGhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OworICAgIHJlZkRhdGEgPSBOVUxMOworICAgIC8qIHVzZSByZWZlcmVuY2UgcGljdHVyZSB3aXRoIHNtYWxsZXN0IGF2YWlsYWJsZSBpbmRleCAqLworICAgIGlmIChJU19QX1NMSUNFKHNsaWNlVHlwZSkgfHwgKHBTdG9yYWdlLT5pbnRyYUNvbmNlYWxtZW50RmxhZyAhPSAwKSkKKyAgICB7CisgICAgICAgIGkgPSAwOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICByZWZEYXRhID0gaDI2NGJzZEdldFJlZlBpY0RhdGEocFN0b3JhZ2UtPmRwYiwgaSk7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoaSA+PSAxNikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSB3aGlsZSAocmVmRGF0YSA9PSBOVUxMKTsKKyAgICB9CisKKyAgICBpID0gcm93ID0gY29sID0gMDsKKyAgICAvKiBmaW5kIGZpcnN0IHByb3Blcmx5IGRlY29kZWQgbWFjcm9ibG9jayAtPiBzdGFydCBwb2ludCBmb3IgY29uY2VhbG1lbnQgKi8KKyAgICB3aGlsZSAoaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMgJiYgIXBTdG9yYWdlLT5tYltpXS5kZWNvZGVkKQorICAgIHsKKyAgICAgICAgaSsrOworICAgICAgICBjb2wrKzsKKyAgICAgICAgaWYgKGNvbCA9PSB3aWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcm93Kys7CisgICAgICAgICAgICBjb2wgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogd2hvbGUgcGljdHVyZSBsb3N0IC0+IGNvcHkgcHJldmlvdXMgb3Igc2V0IGdyZXkgKi8KKyAgICBpZiAoaSA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQorICAgIHsKKyAgICAgICAgaWYgKCAoSVNfSV9TTElDRShzbGljZVR5cGUpICYmIChwU3RvcmFnZS0+aW50cmFDb25jZWFsbWVudEZsYWcgPT0gMCkpIHx8CisgICAgICAgICAgICAgcmVmRGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGN1cnJJbWFnZS0+ZGF0YSwgMTI4LCB3aWR0aCpoZWlnaHQqMzg0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgSDI2NFN3RGVjTWVtY3B5KGN1cnJJbWFnZS0+ZGF0YSwgcmVmRGF0YSwgd2lkdGgqaGVpZ2h0KjM4NCk7CisKKyAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyA9IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7CisKKyAgICAgICAgLyogbm8gZmlsdGVyaW5nIGlmIHdob2xlIHBpY3R1cmUgY29uY2VhbGVkICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOyBpKyspCisgICAgICAgICAgICBwU3RvcmFnZS0+bWJbaV0uZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSAxOworCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKworICAgIC8qIHN0YXJ0IGZyb20gdGhlIHJvdyBjb250YWluaW5nIHRoZSBmaXJzdCBjb3JyZWN0IG1hY3JvYmxvY2ssIGNvbmNlYWwgdGhlCisgICAgICogcm93IGluIHF1ZXN0aW9uLCBhbGwgcm93cyBhYm92ZSB0aGF0IHJvdyBhbmQgdGhlbiBjb250aW51ZSBkb3dud2FyZHMgKi8KKyAgICBtYiA9IHBTdG9yYWdlLT5tYiArIHJvdyAqIHdpZHRoOworICAgIGZvciAoaiA9IGNvbDsgai0tOykKKyAgICB7CisgICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgbWJbal0uZGVjb2RlZCA9IDE7CisgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKKyAgICB9CisgICAgZm9yIChqID0gY29sICsgMTsgaiA8IHdpZHRoOyBqKyspCisgICAgeworICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgICAgIG1iW2pdLmRlY29kZWQgPSAxOworICAgICAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOworICAgICAgICB9CisgICAgfQorICAgIC8qIGlmIHByZXZpb3VzIHJvdyhzKSBjb3VsZCBub3QgYmUgY29uY2VhbGVkIC0+IGNvbmNlYWwgdGhlbSBub3cgKi8KKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSByb3cgLSAxOworICAgICAgICAgICAgbWIgPSBwU3RvcmFnZS0+bWIgKyBpKndpZHRoICsgajsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iLCBjdXJySW1hZ2UsIGksIGosIHNsaWNlVHlwZSwgcmVmRGF0YSk7CisgICAgICAgICAgICAgICAgbWItPmRlY29kZWQgPSAxOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKKyAgICAgICAgICAgICAgICBtYiAtPSB3aWR0aDsKKyAgICAgICAgICAgIH0gd2hpbGUoaS0tKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHByb2Nlc3Mgcm93cyBiZWxvdyB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGNvcnJlY3QgbWFjcm9ibG9jayAqLworICAgIGZvciAoaSA9IHJvdyArIDE7IGkgPCBoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIG1iID0gcFN0b3JhZ2UtPm1iICsgaSAqIHdpZHRoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iK2osIGN1cnJJbWFnZSwgaSwgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgICAgICAgICBtYltqXS5kZWNvZGVkID0gMTsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IENvbmNlYWxNYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZXJmb3JtIGVycm9yIGNvbmNlYWxtZW50IGZvciBvbmUgbWFjcm9ibG9jaywgbG9jYXRpb24gb2YgdGhlCisgICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBwaWN0dXJlIGluZGljYXRlZCBieSByb3cgYW5kIGNvbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKKyAgICB1MzIgc2xpY2VUeXBlLCB1OCAqcmVmRGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaiwgY29tcDsKKyAgICB1MzIgaG9yLCB2ZXI7CisgICAgdTMyIG1iTnVtOworICAgIHUzMiB3aWR0aCwgaGVpZ2h0OworICAgIHU4ICptYlBvczsKKyAgICB1OCBkYXRhWzM4NF07CisgICAgdTggKnBEYXRhOworICAgIGkzMiB0bXA7CisgICAgaTMyIGZpcnN0UGhhc2VbMTZdOworICAgIGkzMiAqcFRtcDsKKyAgICAvKiBuZWlnaGJvdXJzIGFib3ZlLCBiZWxvdywgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBpMzIgYVs0XSwgYls0XSwgbFs0XSwgcls0XTsKKyAgICB1MzIgQSwgQiwgTCwgUjsKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgdTggZmlsbEJ1ZmZbMzIqMjEgKyAxNSArIDMyXTsKKyAgICB1OCAqcEZpbGw7CisjZW5kaWYKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVCghcE1iLT5kZWNvZGVkKTsKKyAgICBBU1NFUlQoY3VyckltYWdlKTsKKyAgICBBU1NFUlQoY29sIDwgY3VyckltYWdlLT53aWR0aCk7CisgICAgQVNTRVJUKHJvdyA8IGN1cnJJbWFnZS0+aGVpZ2h0KTsKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICBwRmlsbCA9IEFMSUdOKGZpbGxCdWZmLCAxNik7CisjZW5kaWYKKyAgICB3aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7CisgICAgaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7CisgICAgbWJOdW0gPSByb3cgKiB3aWR0aCArIGNvbDsKKworICAgIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGN1cnJJbWFnZSwgbWJOdW0pOworCisgICAgbWJQb3MgPSBjdXJySW1hZ2UtPmRhdGEgKyByb3cgKiAxNiAqIHdpZHRoICogMTYgKyBjb2wgKiAxNjsKKyAgICBBID0gQiA9IEwgPSBSID0gSEFOVFJPX0ZBTFNFOworCisgICAgLyogc2V0IHFwWSB0byA0MCB0byBlbmFibGUgc29tZSBmaWx0ZXJpbmcgaW4gZGVibG9ja2luZyAoc3RldHNvbiB2YWx1ZSkgKi8KKyAgICBwTWItPnFwWSA9IDQwOworICAgIHBNYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSAwOworICAgIC8qIG1iVHlwZSBzZXQgdG8gaW50cmEgdG8gcGVyZm9ybSBmaWx0ZXJpbmcgZGVzcGl0ZSB0aGUgdmFsdWVzIG9mIG90aGVyCisgICAgICogYm91bmRhcnkgc3RyZW5ndGggZGV0ZXJtaW5hdGlvbiBmaWVsZHMgKi8KKyAgICBwTWItPm1iVHlwZSA9IElfNHg0OworICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QSA9IDA7CisgICAgcE1iLT5maWx0ZXJPZmZzZXRCID0gMDsKKyAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQgPSAwOworCisgICAgaWYgKElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSkKKyAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbXZfdCBtdiA9IHswLDB9OworICAgICAgICBpbWFnZV90IHJlZkltYWdlOworICAgICAgICByZWZJbWFnZS53aWR0aCA9IHdpZHRoOworICAgICAgICByZWZJbWFnZS5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHJlZkltYWdlLmRhdGEgPSByZWZEYXRhOworICAgICAgICBpZiAocmVmSW1hZ2UuZGF0YSkKKyAgICAgICAgeworI2lmbmRlZiBIMjY0REVDX09NWERMCisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgJm12LCAmcmVmSW1hZ2UsIGNvbCoxNiwgcm93KjE2LAorICAgICAgICAgICAgICAgIDAsIDAsIDE2LCAxNik7CisjZWxzZQorICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsICZtdiwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAoKHJvdyoxNikgKyAoKGNvbCoxNik8PDE2KSksCisgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTAsIHBGaWxsKTsKKyNlbmRpZgorICAgICAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOworCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9CisKKyAgICBIMjY0U3dEZWNNZW1zZXQoZmlyc3RQaGFzZSwgMCwgc2l6ZW9mKGZpcnN0UGhhc2UpKTsKKworICAgIC8qIGNvdW50ZXIgZm9yIG51bWJlciBvZiBuZWlnaGJvdXJzIHVzZWQgKi8KKyAgICBqID0gMDsKKyAgICBob3IgPSB2ZXIgPSAwOworICAgIGlmIChyb3cgJiYgKHBNYi13aWR0aCktPmRlY29kZWQpCisgICAgeworICAgICAgICBBID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHBEYXRhID0gbWJQb3MgLSB3aWR0aCoxNjsKKyAgICAgICAgYVswXSA9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOworICAgICAgICBhWzFdID0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7CisgICAgICAgIGFbMl0gPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsKKyAgICAgICAgYVszXSA9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOworICAgICAgICBqKys7CisgICAgICAgIGhvcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGFbMF0gKyBhWzFdICsgYVsyXSArIGFbM107CisgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYVswXSArIGFbMV0gLSBhWzJdIC0gYVszXTsKKyAgICB9CisgICAgaWYgKChyb3cgIT0gaGVpZ2h0IC0gMSkgJiYgKHBNYit3aWR0aCktPmRlY29kZWQpCisgICAgeworICAgICAgICBCID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHBEYXRhID0gbWJQb3MgKyAxNip3aWR0aCoxNjsKKyAgICAgICAgYlswXSA9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOworICAgICAgICBiWzFdID0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7CisgICAgICAgIGJbMl0gPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsKKyAgICAgICAgYlszXSA9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOworICAgICAgICBqKys7CisgICAgICAgIGhvcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGJbMF0gKyBiWzFdICsgYlsyXSArIGJbM107CisgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYlswXSArIGJbMV0gLSBiWzJdIC0gYlszXTsKKyAgICB9CisgICAgaWYgKGNvbCAmJiAocE1iLTEpLT5kZWNvZGVkKQorICAgIHsKKyAgICAgICAgTCA9IEhBTlRST19UUlVFOworICAgICAgICBwRGF0YSA9IG1iUG9zIC0gMTsKKyAgICAgICAgbFswXSA9IHBEYXRhWzBdOyBsWzBdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFswXSArPSBwRGF0YVszMip3aWR0aF07IGxbMF0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgbFsxXSA9IHBEYXRhWzBdOyBsWzFdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFsxXSArPSBwRGF0YVszMip3aWR0aF07IGxbMV0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgbFsyXSA9IHBEYXRhWzBdOyBsWzJdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFsyXSArPSBwRGF0YVszMip3aWR0aF07IGxbMl0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgbFszXSA9IHBEYXRhWzBdOyBsWzNdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFszXSArPSBwRGF0YVszMip3aWR0aF07IGxbM10gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBqKys7CisgICAgICAgIHZlcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGxbMF0gKyBsWzFdICsgbFsyXSArIGxbM107CisgICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gbFswXSArIGxbMV0gLSBsWzJdIC0gbFszXTsKKyAgICB9CisgICAgaWYgKChjb2wgIT0gd2lkdGggLSAxKSAmJiAocE1iKzEpLT5kZWNvZGVkKQorICAgIHsKKyAgICAgICAgUiA9IEhBTlRST19UUlVFOworICAgICAgICBwRGF0YSA9IG1iUG9zICsgMTY7CisgICAgICAgIHJbMF0gPSBwRGF0YVswXTsgclswXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbMF0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzBdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7CisgICAgICAgIHJbMV0gPSBwRGF0YVswXTsgclsxXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbMV0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzFdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7CisgICAgICAgIHJbMl0gPSBwRGF0YVswXTsgclsyXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbMl0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzJdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7CisgICAgICAgIHJbM10gPSBwRGF0YVswXTsgclszXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbM10gKz0gcERhdGFbMzIqd2lkdGhdOyByWzNdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgaisrOworICAgICAgICB2ZXIrKzsKKyAgICAgICAgZmlyc3RQaGFzZVswXSArPSByWzBdICsgclsxXSArIHJbMl0gKyByWzNdOworICAgICAgICBmaXJzdFBoYXNlWzRdICs9IHJbMF0gKyByWzFdIC0gclsyXSAtIHJbM107CisgICAgfQorCisgICAgLyogYXQgbGVhc3Qgb25lIHByb3Blcmx5IGRlY29kZWQgbmVpZ2hib3VyIGF2YWlsYWJsZSAqLworICAgIEFTU0VSVChqKTsKKworICAgIC8qbGludCAtZXN5bSg2NDQsbCxyLGEsYikgdmFyaWFibGUgaW5pdGlhbGl6ZWQgYWJvdmUgKi8KKyAgICBpZiAoIWhvciAmJiBMICYmIFIpCisgICAgICAgIGZpcnN0UGhhc2VbMV0gPSAobFswXStsWzFdK2xbMl0rbFszXS1yWzBdLXJbMV0tclsyXS1yWzNdKSA+PiA1OworICAgIGVsc2UgaWYgKGhvcikKKyAgICAgICAgZmlyc3RQaGFzZVsxXSA+Pj0gKDMraG9yKTsKKworICAgIGlmICghdmVyICYmIEEgJiYgQikKKyAgICAgICAgZmlyc3RQaGFzZVs0XSA9IChhWzBdK2FbMV0rYVsyXSthWzNdLWJbMF0tYlsxXS1iWzJdLWJbM10pID4+IDU7CisgICAgZWxzZSBpZiAodmVyKQorICAgICAgICBmaXJzdFBoYXNlWzRdID4+PSAoMyt2ZXIpOworCisgICAgc3dpdGNoIChqKQorICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSAoZmlyc3RQaGFzZVswXSo0LzMpPj42ICovCisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID0gKDIxICogZmlyc3RQaGFzZVswXSkgPj4gMTA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiA0ICovCisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKKworICAgIFRyYW5zZm9ybShmaXJzdFBoYXNlKTsKKworICAgIGZvciAoaSA9IDAsIHBEYXRhID0gZGF0YSwgcFRtcCA9IGZpcnN0UGhhc2U7IGkgPCAyNTY7KQorICAgIHsKKyAgICAgICAgdG1wID0gcFRtcFsoaSAmIDB4Rik+PjJdOworICAgICAgICAvKmxpbnQgLWU3MzQgQ0xJUDEgbWFjcm8gcmVzdWx0cyBpbiB2YWx1ZSB0aGF0IGZpdHMgaW50byA4IGJpdHMgKi8KKyAgICAgICAgKnBEYXRhKysgPSBDTElQMSh0bXApOworICAgICAgICAvKmxpbnQgK2U3MzQgKi8KKworICAgICAgICBpKys7CisgICAgICAgIGlmICghKGkgJiAweDNGKSkKKyAgICAgICAgICAgIHBUbXAgKz0gNDsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgY29tcG9uZW50cyAqLworICAgIG1iUG9zID0gY3VyckltYWdlLT5kYXRhICsgd2lkdGggKiBoZWlnaHQgKiAyNTYgKworICAgICAgIHJvdyAqIDggKiB3aWR0aCAqIDggKyBjb2wgKiA4OworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCAyOyBjb21wKyspCisgICAgeworCisgICAgICAgIEgyNjRTd0RlY01lbXNldChmaXJzdFBoYXNlLCAwLCBzaXplb2YoZmlyc3RQaGFzZSkpOworCisgICAgICAgIC8qIGNvdW50ZXIgZm9yIG51bWJlciBvZiBuZWlnaGJvdXJzIHVzZWQgKi8KKyAgICAgICAgaiA9IDA7CisgICAgICAgIGhvciA9IHZlciA9IDA7CisgICAgICAgIGlmIChBKQorICAgICAgICB7CisgICAgICAgICAgICBwRGF0YSA9IG1iUG9zIC0gd2lkdGgqODsKKyAgICAgICAgICAgIGFbMF0gPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGFbMV0gPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGFbMl0gPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGFbM10gPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGhvcisrOworICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSBhWzBdICsgYVsxXSArIGFbMl0gKyBhWzNdOworICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBhWzBdICsgYVsxXSAtIGFbMl0gLSBhWzNdOworICAgICAgICB9CisgICAgICAgIGlmIChCKQorICAgICAgICB7CisgICAgICAgICAgICBwRGF0YSA9IG1iUG9zICsgOCp3aWR0aCo4OworICAgICAgICAgICAgYlswXSA9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYlsxXSA9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYlsyXSA9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYlszXSA9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgaG9yKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGJbMF0gKyBiWzFdICsgYlsyXSArIGJbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGJbMF0gKyBiWzFdIC0gYlsyXSAtIGJbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgLSAxOworICAgICAgICAgICAgbFswXSA9IHBEYXRhWzBdOyBsWzBdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7CisgICAgICAgICAgICBsWzFdID0gcERhdGFbMF07IGxbMV0gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKKyAgICAgICAgICAgIGxbMl0gPSBwRGF0YVswXTsgbFsyXSArPSBwRGF0YVs4KndpZHRoXTsKKyAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOworICAgICAgICAgICAgbFszXSA9IHBEYXRhWzBdOyBsWzNdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgdmVyKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGxbMF0gKyBsWzFdICsgbFsyXSArIGxbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzRdICs9IGxbMF0gKyBsWzFdIC0gbFsyXSAtIGxbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgKyA4OworICAgICAgICAgICAgclswXSA9IHBEYXRhWzBdOyByWzBdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7CisgICAgICAgICAgICByWzFdID0gcERhdGFbMF07IHJbMV0gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKKyAgICAgICAgICAgIHJbMl0gPSBwRGF0YVswXTsgclsyXSArPSBwRGF0YVs4KndpZHRoXTsKKyAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOworICAgICAgICAgICAgclszXSA9IHBEYXRhWzBdOyByWzNdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgdmVyKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IHJbMF0gKyByWzFdICsgclsyXSArIHJbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzRdICs9IHJbMF0gKyByWzFdIC0gclsyXSAtIHJbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFob3IgJiYgTCAmJiBSKQorICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSA9IChsWzBdK2xbMV0rbFsyXStsWzNdLXJbMF0tclsxXS1yWzJdLXJbM10pID4+IDQ7CisgICAgICAgIGVsc2UgaWYgKGhvcikKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gPj49ICgyK2hvcik7CisKKyAgICAgICAgaWYgKCF2ZXIgJiYgQSAmJiBCKQorICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSA9IChhWzBdK2FbMV0rYVsyXSthWzNdLWJbMF0tYlsxXS1iWzJdLWJbM10pID4+IDQ7CisgICAgICAgIGVsc2UgaWYgKHZlcikKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gPj49ICgyK3Zlcik7CisKKyAgICAgICAgc3dpdGNoIChqKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSAoZmlyc3RQaGFzZVswXSo0LzMpPj41ICovCisgICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA9ICgyMSAqIGZpcnN0UGhhc2VbMF0pID4+IDk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIDQgKi8KKyAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA1OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgICAgICBUcmFuc2Zvcm0oZmlyc3RQaGFzZSk7CisKKyAgICAgICAgcERhdGEgPSBkYXRhICsgMjU2ICsgY29tcCo2NDsKKyAgICAgICAgZm9yIChpID0gMCwgcFRtcCA9IGZpcnN0UGhhc2U7IGkgPCA2NDspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IHBUbXBbKGkgJiAweDcpPj4xXTsKKyAgICAgICAgICAgIC8qbGludCAtZTczNCBDTElQMSBtYWNybyByZXN1bHRzIGluIHZhbHVlIHRoYXQgZml0cyBpbnRvIDggYml0cyAqLworICAgICAgICAgICAgKnBEYXRhKysgPSBDTElQMSh0bXApOworICAgICAgICAgICAgLypsaW50ICtlNzM0ICovCisKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmICghKGkgJiAweEYpKQorICAgICAgICAgICAgICAgIHBUbXAgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGluY3JlbWVudCBwb2ludGVycyBmb3IgY3IgKi8KKyAgICAgICAgbWJQb3MgKz0gd2lkdGggKiBoZWlnaHQgKiA2NDsKKyAgICB9CisKKyAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBUcmFuc2Zvcm0KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU2ltcGxpZmllZCB0cmFuc2Zvcm0sIGFzc3VtaW5nIHRoYXQgb25seSBkYyBjb21wb25lbnQgYW5kIGxvd2VzdAorICAgICAgICAgICAgaG9yaXpvbnRhbCBhbmQgbG93ZXN0IHZlcnRpY2FsIGNvbXBvbmVudCBtYXkgYmUgbm9uLXplcm8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBUcmFuc2Zvcm0oaTMyICpkYXRhKQoreworCisgICAgdTMyIGNvbDsKKyAgICBpMzIgdG1wMCwgdG1wMTsKKworICAgIGlmICghZGF0YVsxXSAmJiAhZGF0YVs0XSkKKyAgICB7CisgICAgICAgIGRhdGFbMV0gID0gZGF0YVsyXSAgPSBkYXRhWzNdICA9IGRhdGFbNF0gID0gZGF0YVs1XSAgPQorICAgICAgICBkYXRhWzZdICA9IGRhdGFbN10gID0gZGF0YVs4XSAgPSBkYXRhWzldICA9IGRhdGFbMTBdID0KKyAgICAgICAgZGF0YVsxMV0gPSBkYXRhWzEyXSA9IGRhdGFbMTNdID0gZGF0YVsxNF0gPSBkYXRhWzE1XSA9IGRhdGFbMF07CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogZmlyc3QgaG9yaXpvbnRhbCB0cmFuc2Zvcm0gZm9yIHJvd3MgMCBhbmQgMSAqLworICAgIHRtcDAgPSBkYXRhWzBdOworICAgIHRtcDEgPSBkYXRhWzFdOworICAgIGRhdGFbMF0gPSB0bXAwICsgdG1wMTsKKyAgICBkYXRhWzFdID0gdG1wMCArICh0bXAxPj4xKTsKKyAgICBkYXRhWzJdID0gdG1wMCAtICh0bXAxPj4xKTsKKyAgICBkYXRhWzNdID0gdG1wMCAtIHRtcDE7CisKKyAgICB0bXAwID0gZGF0YVs0XTsKKyAgICBkYXRhWzVdID0gdG1wMDsKKyAgICBkYXRhWzZdID0gdG1wMDsKKyAgICBkYXRhWzddID0gdG1wMDsKKworICAgIC8qIHRoZW4gdmVydGljYWwgdHJhbnNmb3JtICovCisgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQorICAgIHsKKyAgICAgICAgdG1wMCA9IGRhdGFbMF07CisgICAgICAgIHRtcDEgPSBkYXRhWzRdOworICAgICAgICBkYXRhWzBdID0gdG1wMCArIHRtcDE7CisgICAgICAgIGRhdGFbNF0gPSB0bXAwICsgKHRtcDE+PjEpOworICAgICAgICBkYXRhWzhdID0gdG1wMCAtICh0bXAxPj4xKTsKKyAgICAgICAgZGF0YVsxMl0gPSB0bXAwIC0gdG1wMTsKKyAgICB9CisKK30KKy8qbGludCArZTcwMiAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMTM0NjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0NPTkNFQUxfSAorI2RlZmluZSBIMjY0U1dERUNfQ09OQ0VBTF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDb25jZWFsKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHNsaWNlVHlwZSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NPTkNFQUxfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTliNzRhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0NPTlRBSU5FUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19DT05UQUlORVJfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN0cmluZyBsZW5ndGggZm9yIHRyYWNpbmcgKi8KKyNkZWZpbmUgSDI2NERFQ19UUkFDRV9TVFJfTEVOIDEwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZW51bSB7CisgICAgICAgIFVOSU5JVElBTElaRUQsCisgICAgICAgIElOSVRJQUxJWkVELAorICAgICAgICBORVdfSEVBREVSUworICAgIH0gZGVjU3RhdDsKKworICAgIHUzMiBwaWNOdW1iZXI7CisgICAgc3RvcmFnZV90IHN0b3JhZ2U7CisjaWZkZWYgSDI2NERFQ19UUkFDRQorICAgIGNoYXIgc3RyW0gyNjRERUNfVFJBQ0VfU1RSX0xFTl07CisjZW5kaWYKK30gZGVjQ29udGFpbmVyX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVDQ09OVEFJTkVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjhjMWY3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKQEAgLTAsMCArMSwyNDE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEZpbHRlclBpY3R1cmUKKyAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZQorICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlCisgICAgICAgICAgRmlsdGVySG9yTHVtYQorICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UKKyAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlCisgICAgICAgICAgRmlsdGVySG9yQ2hyb21hCisgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoCisgICAgICAgICAgRWRnZUJvdW5kYXJ5U3RyZW5ndGgKKyAgICAgICAgICBHZXRCb3VuZGFyeVN0cmVuZ3RocworICAgICAgICAgIElzU2xpY2VCb3VuZGFyeU9uTGVmdAorICAgICAgICAgIElzU2xpY2VCb3VuZGFyeU9uVG9wCisgICAgICAgICAgR2V0TWJGaWx0ZXJpbmdGbGFncworICAgICAgICAgIEdldEx1bWFFZGdlVGhyZXNob2xkcworICAgICAgICAgIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCisgICAgICAgICAgRmlsdGVyTHVtYQorICAgICAgICAgIEZpbHRlckNocm9tYQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kZWJsb2NraW5nLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6CisgKiBJbmZvIDcwMTogU2hpZnQgbGVmdCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqLworLypsaW50IC1lNzAxIC1lNzAyICovCisKKy8qIGFycmF5IG9mIGFscGhhIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQgKi8KK3N0YXRpYyBjb25zdCB1OCBhbHBoYXNbNTJdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCw0LDUsNiw3LDgsOSwxMCwKKyAgICAxMiwxMywxNSwxNywyMCwyMiwyNSwyOCwzMiwzNiw0MCw0NSw1MCw1Niw2Myw3MSw4MCw5MCwxMDEsMTEzLDEyNywxNDQsMTYyLAorICAgIDE4MiwyMDMsMjI2LDI1NSwyNTV9OworCisvKiBhcnJheSBvZiBiZXRhIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQgKi8KK3N0YXRpYyBjb25zdCB1OCBiZXRhc1s1Ml0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDIsMiwzLDMsMywzLDQsNCwKKyAgICA0LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNywxNywxOCwxOH07CisKKworCisjaWZuZGVmIEgyNjRERUNfT01YREwKKy8qIGFycmF5IG9mIHRjMCB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkLCBlYWNoIHRyaXBsZXQgY29ycmVzcG9uZHMgdG8gYQorICogY29sdW1uIGluIHRoZSB0YWJsZS4gSW5kZXhpbmcgZ29lcyBhcyB0YzBbaW5kZXhBXVtiUy0xXSAqLworc3RhdGljIGNvbnN0IHU4IHRjMFs1Ml1bM10gPSB7CisgICAgezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LAorICAgIHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSwKKyAgICB7MCwwLDB9LHswLDAsMX0sezAsMCwxfSx7MCwwLDF9LHswLDAsMX0sezAsMSwxfSx7MCwxLDF9LHsxLDEsMX0sCisgICAgezEsMSwxfSx7MSwxLDF9LHsxLDEsMX0sezEsMSwyfSx7MSwxLDJ9LHsxLDEsMn0sezEsMSwyfSx7MSwyLDN9LAorICAgIHsxLDIsM30sezIsMiwzfSx7MiwyLDR9LHsyLDMsNH0sezIsMyw0fSx7MywzLDV9LHszLDQsNn0sezMsNCw2fSwKKyAgICB7NCw1LDd9LHs0LDUsOH0sezQsNiw5fSx7NSw3LDEwfSx7Niw4LDExfSx7Niw4LDEzfSx7NywxMCwxNH0sezgsMTEsMTZ9LAorICAgIHs5LDEyLDE4fSx7MTAsMTMsMjB9LHsxMSwxNSwyM30sezEzLDE3LDI1fQorfTsKKyNlbHNlCisvKiBhcnJheSBvZiB0YzAgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCwgZWFjaCB0cmlwbGV0IGNvcnJlc3BvbmRzIHRvIGEKKyAqIGNvbHVtbiBpbiB0aGUgdGFibGUuIEluZGV4aW5nIGdvZXMgYXMgdGMwW2luZGV4QV1bYlNdICovCitzdGF0aWMgY29uc3QgdTggdGMwWzUyXVs1XSA9IHsKKyAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAorICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMSwgMH0sIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDAsIDEsIDB9LAorICAgIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDEsIDEsIDB9LCB7MCwgMCwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwKKyAgICB7MCwgMSwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwgezAsIDEsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMiwgMH0sCisgICAgezAsIDEsIDEsIDIsIDB9LCB7MCwgMSwgMSwgMiwgMH0sIHswLCAxLCAxLCAyLCAwfSwgezAsIDEsIDIsIDMsIDB9LAorICAgIHswLCAxLCAyLCAzLCAwfSwgezAsIDIsIDIsIDMsIDB9LCB7MCwgMiwgMiwgNCwgMH0sIHswLCAyLCAzLCA0LCAwfSwKKyAgICB7MCwgMiwgMywgNCwgMH0sIHswLCAzLCAzLCA1LCAwfSwgezAsIDMsIDQsIDYsIDB9LCB7MCwgMywgNCwgNiwgMH0sCisgICAgezAsIDQsIDUsIDcsIDB9LCB7MCwgNCwgNSwgOCwgMH0sIHswLCA0LCA2LCA5LCAwfSwgezAsIDUsIDcsIDEwLCAwfSwKKyAgICB7MCwgNiwgOCwgMTEsIDB9LCB7MCwgNiwgOCwgMTMsIDB9LCB7MCwgNywgMTAsIDE0LCAwfSwKKyAgICB7MCwgOCwgMTEsIDE2LCAwfSwgezAsIDksIDEyLCAxOCwgMH0sIHswLCAxMCwgMTMsIDIwLCAwfSwKKyAgICB7MCwgMTEsIDE1LCAyMywgMH0sIHswLCAxMywgMTcsIDI1LCAwfQorfTsKKyNlbmRpZgorCisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyogbWFwcGluZyBvZiByYXN0ZXIgc2NhbiBibG9jayBpbmRleCB0byA0eDQgYmxvY2sgaW5kZXggKi8KK3N0YXRpYyBjb25zdCB1MzIgbWI0eDRJbmRleFsxNl0gPQorICAgIHswLCAxLCA0LCA1LCAyLCAzLCA2LCA3LCA4LCA5LCAxMiwgMTMsIDEwLCAxMSwgMTQsIDE1fTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IHU4ICp0YzA7CisgICAgdTMyIGFscGhhOworICAgIHUzMiBiZXRhOworfSBlZGdlVGhyZXNob2xkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1MzIgdG9wOworICAgIHUzMiBsZWZ0OworfSBiU190OworCitlbnVtIHsgVE9QID0gMCwgTEVGVCA9IDEsIElOTkVSID0gMiB9OworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworI2RlZmluZSBGSUxURVJfTEVGVF9FREdFICAgIDB4MDQKKyNkZWZpbmUgRklMVEVSX1RPUF9FREdFICAgICAweDAyCisjZGVmaW5lIEZJTFRFUl9JTk5FUl9FREdFICAgMHgwMQorCisKKy8qIGNsaXBwaW5nIHRhYmxlIGRlZmluZWQgaW4gaW50cmFfcHJlZGljdGlvbi5jICovCitleHRlcm4gY29uc3QgdTggaDI2NGJzZENsaXBbXTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaTEsIHUzMiBpMik7CisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyLAorICAgIHUzMiBpMSwgdTMyIGkyKTsKKyNlbHNlCitzdGF0aWMgdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aDIobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGkxLCB1MzIgaTIpOworc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMik7CitzdGF0aWMgdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpOworI2VuZGlmCisKK3N0YXRpYyB1MzIgSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iU3RvcmFnZV90ICptYik7CisKK3N0YXRpYyB1MzIgSXNTbGljZUJvdW5kYXJ5T25Ub3AobWJTdG9yYWdlX3QgKm1iKTsKKworc3RhdGljIHUzMiBHZXRNYkZpbHRlcmluZ0ZsYWdzKG1iU3RvcmFnZV90ICptYik7CisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorCitzdGF0aWMgdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgYlNfdCAqYnMsIHUzMiBmbGFncyk7CisKK3N0YXRpYyB2b2lkIEZpbHRlckx1bWEodTggKmRhdGEsIGJTX3QgKmJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKKworc3RhdGljIHZvaWQgRmlsdGVyQ2hyb21hKHU4ICpjYiwgdTggKmNyLCBiU190ICpiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICAgICAgICB1MzIgaW1hZ2VXaWR0aCk7CisKK3N0YXRpYyB2b2lkIEZpbHRlclZlckx1bWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKK3N0YXRpYyB2b2lkIEZpbHRlckhvckx1bWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIGkzMiBpbWFnZVdpZHRoKTsKK3N0YXRpYyB2b2lkIEZpbHRlckhvckx1bWEoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgICAgICAgaTMyIGltYWdlV2lkdGgpOworCitzdGF0aWMgdm9pZCBGaWx0ZXJWZXJDaHJvbWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIHUzMiBpbWFnZVdpZHRoKTsKK3N0YXRpYyB2b2lkIEZpbHRlckhvckNocm9tYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgaTMyIGltYWdlV2lkdGgpOworc3RhdGljIHZvaWQgRmlsdGVySG9yQ2hyb21hKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIGkzMiBpbWFnZVdpZHRoKTsKKworc3RhdGljIHZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIG1iU3RvcmFnZV90ICptYiwKKyAgdTMyIGZpbHRlcmluZ0ZsYWdzKTsKKworc3RhdGljIHZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgbWJTdG9yYWdlX3QgKm1iLAorICB1MzIgZmlsdGVyaW5nRmxhZ3MsCisgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLworCitzdGF0aWMgdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgdTggKCpicylbMTZdLCB1MzIgZmxhZ3MpOworCitzdGF0aWMgdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCisgICAgbWJTdG9yYWdlX3QgKm1iLAorICAgIHU4ICgqYWxwaGEpWzJdLAorICAgIHU4ICgqYmV0YSlbMl0sCisgICAgdTggKCp0aHJlc2hvbGQpWzE2XSwKKyAgICB1OCAoKmJzKVsxNl0sCisgICAgdTMyIGZpbHRlcmluZ0ZsYWdzICk7CisKK3N0YXRpYyB2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAorICAgIG1iU3RvcmFnZV90ICptYiwKKyAgICB1OCAoKmFscGhhKVsyXSwKKyAgICB1OCAoKmJldGEpWzJdLAorICAgIHU4ICgqdGhyZXNob2xkKVs4XSwKKyAgICB1OCAoKmJzKVsxNl0sCisgICAgdTMyIGZpbHRlcmluZ0ZsYWdzLAorICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJc1NsaWNlQm91bmRhcnlPbkxlZnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc2xpY2UgYm91bmRhcnkgb24gdGhlIGxlZnQgc2lkZQorICAgICAgICAgICAgb2YgYSBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIElzU2xpY2VCb3VuZGFyeU9uTGVmdChtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWIgJiYgbWItPm1iQSk7CisKKyAgICBpZiAobWItPnNsaWNlSWQgIT0gbWItPm1iQS0+c2xpY2VJZCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSXNTbGljZUJvdW5kYXJ5T25Ub3AKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc2xpY2UgYm91bmRhcnkgYWJvdmUgdGhlCisgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgSXNTbGljZUJvdW5kYXJ5T25Ub3AobWJTdG9yYWdlX3QgKm1iKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iICYmIG1iLT5tYkIpOworCisgICAgaWYgKG1iLT5zbGljZUlkICE9IG1iLT5tYkItPnNsaWNlSWQpCisgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldE1iRmlsdGVyaW5nRmxhZ3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBlZGdlcyBvZiBhIG1hY3JvYmxvY2sgaGFzIHRvIGJlCisgICAgICAgICAgZmlsdGVyZWQuIE91dHB1dCBpcyBhIGJpdC13aXNlIE9SIG9mIEZJTFRFUl9MRUZUX0VER0UsCisgICAgICAgICAgRklMVEVSX1RPUF9FREdFIGFuZCBGSUxURVJfSU5ORVJfRURHRSwgZGVwZW5kaW5nIG9uIHdoaWNoIGVkZ2VzCisgICAgICAgICAgc2hhbGwgYmUgZmlsdGVyZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgR2V0TWJGaWx0ZXJpbmdGbGFncyhtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGZsYWdzID0gMDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iKTsKKworICAgIC8qIG5vdGhpbmcgd2lsbCBiZSBmaWx0ZXJlZCBpZiBkaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9PSAxICovCisgICAgaWYgKG1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAxKQorICAgIHsKKyAgICAgICAgZmxhZ3MgfD0gRklMVEVSX0lOTkVSX0VER0U7CisKKyAgICAgICAgLyogZmlsdGVyTGVmdE1iRWRnZUZsYWcsIGxlZnQgbWIgaXMgTUJfQSAqLworICAgICAgICBpZiAobWItPm1iQSAmJgorICAgICAgICAgICAgKChtYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMikgfHwKKyAgICAgICAgICAgICAhSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iKSkpCisgICAgICAgICAgICBmbGFncyB8PSBGSUxURVJfTEVGVF9FREdFOworCisgICAgICAgIC8qIGZpbHRlclRvcE1iRWRnZUZsYWcgKi8KKyAgICAgICAgaWYgKG1iLT5tYkIgJiYKKyAgICAgICAgICAgICgobWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDIpIHx8CisgICAgICAgICAgICAgIUlzU2xpY2VCb3VuZGFyeU9uVG9wKG1iKSkpCisgICAgICAgICAgICBmbGFncyB8PSBGSUxURVJfVE9QX0VER0U7CisgICAgfQorCisgICAgcmV0dXJuKGZsYWdzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IElubmVyQm91bmRhcnlTdHJlbmd0aAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGFuIGlubmVyCisgICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlIGlzIGNoZWNrZWQgYmVmb3JlIHRoaXMgaXMKKyAgICAgICAgICAgIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb24gaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGluZDEsIHUzMiBpbmQyKQoreworICAgIGkzMiB0bXAxLCB0bXAyOworICAgIGkzMiBtdjEsIG12MiwgbXYzLCBtdjQ7CisKKyAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmW2luZDFdOworICAgIHRtcDIgPSBtYjEtPnRvdGFsQ29lZmZbaW5kMl07CisgICAgbXYxID0gbWIxLT5tdltpbmQxXS5ob3I7CisgICAgbXYyID0gbWIxLT5tdltpbmQyXS5ob3I7CisgICAgbXYzID0gbWIxLT5tdltpbmQxXS52ZXI7CisgICAgbXY0ID0gbWIxLT5tdltpbmQyXS52ZXI7CisKKyAgICBpZiAodG1wMSB8fCB0bXAyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGVsc2UgaWYgKCAoQUJTKG12MSAtIG12MikgPj0gNCkgfHwgKEFCUyhtdjMgLSBtdjQpID49IDQpIHx8CisgICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjEtPnJlZkFkZHJbaW5kMiA+PiAyXSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGFuIGlubmVyCisgICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gVGhlIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzCisgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGggYnV0IHdpdGhvdXQgY2hlY2tpbmcgdG90YWxDb2VmZi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpbmQxLCB1MzIgaW5kMikKK3sKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKworICAgIHRtcDEgPSBtYjEtPm12W2luZDFdLmhvcjsKKyAgICB0bXAyID0gbWIxLT5tdltpbmQyXS5ob3I7CisgICAgdG1wMyA9IG1iMS0+bXZbaW5kMV0udmVyOworICAgIHRtcDQgPSBtYjEtPm12W2luZDJdLnZlcjsKKworICAgIGlmICggKEFCUyh0bXAxIC0gdG1wMikgPj0gNCkgfHwgKEFCUyh0bXAzIC0gdG1wNCkgPj0gNCkgfHwKKyAgICAgICAgIChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjEtPnJlZkFkZHJbaW5kMiA+PiAyXSkpCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBFZGdlQm91bmRhcnlTdHJlbmd0aAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGxlZnQtIG9yCisgICAgICAgICAgICB0b3AtbW9zdCBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAorICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBFZGdlQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyLAorICAgIHUzMiBpbmQxLCB1MzIgaW5kMikKK3sKKworICAgIGlmIChtYjEtPnRvdGFsQ29lZmZbaW5kMV0gfHwgbWIyLT50b3RhbENvZWZmW2luZDJdKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGVsc2UgaWYgKChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjItPnJlZkFkZHJbaW5kMiA+PiAyXSkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbaW5kMV0uaG9yIC0gbWIyLT5tdltpbmQyXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12W2luZDFdLnZlciAtIG1iMi0+bXZbaW5kMl0udmVyKSA+PSA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvcgorICAgICAgICAgICAgdG9wLW1vc3QgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZXMgYXJlIGNoZWNrZWQKKyAgICAgICAgICAgIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb25zIGhlcmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMikKK3sKKyAgICB1MzIgdG9wQnMgPSAwOworICAgIHUzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworCisgICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZlswXTsKKyAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzEwXTsKKyAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzFdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTFdOworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICB0b3BCcyA9IDI8PDA7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlswXS5ob3IgLSBtYjItPm12WzEwXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzBdLnZlciAtIG1iMi0+bXZbMTBdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkclsxMCA+PiAyXSkpCisgICAgeworICAgICAgICB0b3BCcyA9IDE8PDA7CisgICAgfQorICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbNF07CisgICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxNF07CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIHRvcEJzICs9IDI8PDg7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlsxXS5ob3IgLSBtYjItPm12WzExXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzFdLnZlciAtIG1iMi0+bXZbMTFdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkclsxMSA+PiAyXSkpCisgICAgeworICAgICAgICB0b3BCcyArPSAxPDw4OworICAgIH0KKyAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzVdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTVdOworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICB0b3BCcyArPSAyPDwxNjsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzRdLmhvciAtIG1iMi0+bXZbMTRdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbNF0udmVyIC0gbWIyLT5tdlsxNF0udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbNCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTQgPj4gMl0pKQorICAgIHsKKyAgICAgICAgdG9wQnMgKz0gMTw8MTY7CisgICAgfQorICAgIGlmICh0bXAzIHx8IHRtcDQpCisgICAgeworICAgICAgICB0b3BCcyArPSAyPDwyNDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzVdLmhvciAtIG1iMi0+bXZbMTVdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbNV0udmVyIC0gbWIyLT5tdlsxNV0udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbNSA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTUgPj4gMl0pKQorICAgIHsKKyAgICAgICAgdG9wQnMgKz0gMTw8MjQ7CisgICAgfQorCisgICAgcmV0dXJuIHRvcEJzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGxlZnQtCisgICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAorICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMikKK3sKKyAgICB1MzIgbGVmdEJzID0gMDsKKyAgICB1MzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKworICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbMF07CisgICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZls1XTsKKyAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzJdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbN107CisKKyAgICBpZiAodG1wMSB8fCB0bXAyKQorICAgIHsKKyAgICAgICAgbGVmdEJzID0gMjw8MDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzBdLmhvciAtIG1iMi0+bXZbNV0uaG9yKSA+PSA0KSB8fAorICAgICAgICAgICAgIChBQlMobWIxLT5tdlswXS52ZXIgLSBtYjItPm12WzVdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkcls1ID4+IDJdKSkKKyAgICB7CisgICAgICAgIGxlZnRCcyA9IDE8PDA7CisgICAgfQorICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbOF07CisgICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxM107CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAyPDw4OworICAgIH0KKyAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMl0uaG9yIC0gbWIyLT5tdls3XS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzJdLnZlciAtIG1iMi0+bXZbN10udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzcgPj4gMl0pKQorICAgIHsKKyAgICAgICAgbGVmdEJzICs9IDE8PDg7CisgICAgfQorICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbMTBdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTVdOworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICBsZWZ0QnMgKz0gMjw8MTY7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdls4XS5ob3IgLSBtYjItPm12WzEzXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzhdLnZlciAtIG1iMi0+bXZbMTNdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzggPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzEzID4+IDJdKSkKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAxPDwxNjsKKyAgICB9CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAyPDwyNDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzEwXS5ob3IgLSBtYjItPm12WzE1XS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzEwXS52ZXIgLSBtYjItPm12WzE1XS52ZXIpID49IDQpIHx8CisgICAgICAgICAgICAgKG1iMS0+cmVmQWRkclsxMCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTUgPj4gMl0pKQorICAgIHsKKyAgICAgICAgbGVmdEJzICs9IDE8PDI0OworICAgIH0KKworICAgIHJldHVybiBsZWZ0QnM7Cit9CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsdGVyUGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZyBmb3IgYSBwaWN0dXJlLiBGaWx0ZXIgZG9lcyBub3QgY29weQorICAgICAgICAgIHRoZSBvcmlnaW5hbCBwaWN0dXJlIGFueXdoZXJlIGJ1dCBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGRpcmVjdGx5CisgICAgICAgICAgb24gdGhlIG9yaWdpbmFsIGltYWdlLiBQYXJhbWV0ZXJzIGNvbnRyb2xsaW5nIHRoZSBmaWx0ZXJpbmcgcHJvY2VzcworICAgICAgICAgIGFyZSBjb21wdXRlZCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgb2YgdGhlCisgICAgICAgICAgZmlsdGVyZWQgbWFjcm9ibG9jaywgbWFjcm9ibG9jayBhYm92ZSBhbmQgbWFjcm9ibG9jayBvbiB0aGUgbGVmdCBvZgorICAgICAgICAgIHRoZSBmaWx0ZXJlZCBvbmUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIGltYWdlICAgICAgICAgcG9pbnRlciB0byBpbWFnZSB0byBiZSBmaWx0ZXJlZAorICAgICAgICAgIG1iICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgc3RydWN0dXJlIG9mIHRoZSB0b3AtbGVmdAorICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayBvZiB0aGUgcGljdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgaW1hZ2UgICAgICAgICBmaWx0ZXJlZCBpbWFnZSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX09NWERMCit2b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAorICBpbWFnZV90ICppbWFnZSwKKyAgbWJTdG9yYWdlX3QgKm1iKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBmbGFnczsKKyAgICB1MzIgcGljU2l6ZUluTWJzLCBtYlJvdywgbWJDb2w7CisgICAgdTMyIHBpY1dpZHRoSW5NYnM7CisgICAgdTggKmRhdGE7CisgICAgbWJTdG9yYWdlX3QgKnBNYjsKKyAgICBiU190IGJTWzE2XTsKKyAgICBlZGdlVGhyZXNob2xkX3QgdGhyZXNob2xkc1szXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGltYWdlKTsKKyAgICBBU1NFUlQobWIpOworICAgIEFTU0VSVChpbWFnZS0+ZGF0YSk7CisgICAgQVNTRVJUKGltYWdlLT53aWR0aCk7CisgICAgQVNTRVJUKGltYWdlLT5oZWlnaHQpOworCisgICAgcGljV2lkdGhJbk1icyA9IGltYWdlLT53aWR0aDsKKyAgICBkYXRhID0gaW1hZ2UtPmRhdGE7CisgICAgcGljU2l6ZUluTWJzID0gcGljV2lkdGhJbk1icyAqIGltYWdlLT5oZWlnaHQ7CisKKyAgICBwTWIgPSBtYjsKKworICAgIGZvciAobWJSb3cgPSAwLCBtYkNvbCA9IDA7IG1iUm93IDwgaW1hZ2UtPmhlaWdodDsgcE1iKyspCisgICAgeworICAgICAgICBmbGFncyA9IEdldE1iRmlsdGVyaW5nRmxhZ3MocE1iKTsKKworICAgICAgICBpZiAoZmxhZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldEJvdW5kYXJ5U3RyZW5ndGhzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUgaWYgYW55IG9mCisgICAgICAgICAgICAgKiB0aGUgYlMgdmFsdWVzIGZvciB0aGUgbWFjcm9ibG9jayBiZWluZyBwcm9jZXNzZWQgd2FzIG5vbi16ZXJvICovCisgICAgICAgICAgICBpZiAoR2V0Qm91bmRhcnlTdHJlbmd0aHMocE1iLCBiUywgZmxhZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGx1bWEgKi8KKyAgICAgICAgICAgICAgICBHZXRMdW1hRWRnZVRocmVzaG9sZHModGhyZXNob2xkcywgcE1iLCBmbGFncyk7CisgICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogMjU2ICsgbWJDb2wgKiAxNjsKKworICAgICAgICAgICAgICAgIEZpbHRlckx1bWEoKHU4KilkYXRhLCBiUywgdGhyZXNob2xkcywgcGljV2lkdGhJbk1icyoxNik7CisKKyAgICAgICAgICAgICAgICAvKiBjaHJvbWEgKi8KKyAgICAgICAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcyh0aHJlc2hvbGRzLCBwTWIsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpOworICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemVJbk1icyAqIDI1NiArCisgICAgICAgICAgICAgICAgICAgIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDY0ICsgbWJDb2wgKiA4OworCisgICAgICAgICAgICAgICAgRmlsdGVyQ2hyb21hKCh1OCopZGF0YSwgZGF0YSArIDY0KnBpY1NpemVJbk1icywgYlMsCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRzLCBwaWNXaWR0aEluTWJzKjgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYkNvbCsrOworICAgICAgICBpZiAobWJDb2wgPT0gcGljV2lkdGhJbk1icykKKyAgICAgICAgeworICAgICAgICAgICAgbWJDb2wgPSAwOworICAgICAgICAgICAgbWJSb3crKzsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlclZlckx1bWFFZGdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBvbmUgdmVydGljYWwgNC1waXhlbCBsdW1hIGVkZ2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlclZlckx1bWFFZGdlKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIHUzMiBpbWFnZVdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOworICAgIHUzMiB0bXBGbGFnOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyAmJiBiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBpZiAoYlMgPCA0KQorICAgIHsKKyAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07CisgICAgICAgIHRtcCA9IHRjOworICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGEgKz0gaW1hZ2VXaWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKKyAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOworICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLTNdOworICAgICAgICAgICAgICAgIHEyID0gZGF0YVsyXTsKKworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhWy0yXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9ICh1OCkocTEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOworCisgICAgICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07CisgICAgICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICAgICAgdG1wID0gdGM7CisgICAgICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKKyAgICAgICAgICAgICAgICBkYXRhWyAwXSA9IHEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSwgZGF0YSArPSBpbWFnZVdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcEZsYWcgPQorICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCAoKHRocmVzaG9sZHMtPmFscGhhID4+IDIpICsyKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLTNdOworICAgICAgICAgICAgICAgIHEyID0gZGF0YVsyXTsKKworICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHAxICsgcDAgKyBxMDsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSAodTgpKChwMiArIDIgKiB0bXAgKyBxMSArIDQpID4+IDMpOworICAgICAgICAgICAgICAgICAgICBkYXRhWy0yXSA9ICh1OCkoKHAyICsgdG1wICsgMikgPj4gMik7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLTNdID0gKHU4KSgoMiAqIGRhdGFbLTRdICsgMyAqIHAyICsgdG1wICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7CisKKyAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMCArIHEwICsgcTE7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAodTgpKChwMSArIDIgKiB0bXAgKyBxMiArIDQpID4+IDMpOworICAgICAgICAgICAgICAgICAgICBkYXRhWzFdID0gKHU4KSgodG1wICsgcTIgKyAyKSA+PiAyKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSA9ICh1OCkoKDIgKiBkYXRhWzNdICsgMyAqIHEyICsgdG1wICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9ICh1OCkoKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckx1bWFFZGdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBvbmUgaG9yaXpvbnRhbCA0LXBpeGVsIGx1bWEgZWRnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJIb3JMdW1hRWRnZSgKKyAgdTggKmRhdGEsCisgIHUzMiBiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgaW1hZ2VXaWR0aCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgZGVsdGEsIHRjLCB0bXA7CisgICAgdTMyIGk7CisgICAgdTggcDAsIHEwLCBwMSwgcTEsIHAyLCBxMjsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYlMgPCA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXTsKKyAgICB0bXAgPSB0YzsKKyAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGErKykKKyAgICB7CisgICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKKyAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07CisgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICB7CisgICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107CisKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgIChwMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHAxIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOworCisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKHExICsgQ0xJUDMoLXRjLHRjLAorICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisKKyAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOworICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICB0bXAgPSB0YzsKKyAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gcDA7CisgICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JMdW1hCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBhbGwgZm91ciBzdWNjZXNzaXZlIGhvcml6b250YWwgNC1waXhlbCBsdW1hIGVkZ2VzLiBUaGlzIGNhbgorICAgICAgICAgICAgYmUgZG9uZSB3aGVuIGJTIGlzIGVxdWFsIHRvIGFsbCBmb3VyIGVkZ2VzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJIb3JMdW1hKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIGkzMiBpbWFnZVdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOworICAgIHUzMiB0bXBGbGFnOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBpZiAoYlMgPCA0KQorICAgIHsKKyAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07CisgICAgICAgIHRtcCA9IHRjOworICAgICAgICBmb3IgKGkgPSAxNjsgaTsgaS0tLCBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKKyAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW2ltYWdlV2lkdGhdOworICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107CisKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBxMiA9IGRhdGFbaW1hZ2VXaWR0aCoyXTsKKworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGhdID0gKHU4KShxMSArIENMSVAzKC10Yyx0YywKKyAgICAgICAgICAgICAgICAgICAgICAgIChxMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHExIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRtcCwgdG1wLCAoKCgocTAgLSBwMCkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisKKyAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgICAgICB0bXAgPSB0YzsKKyAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9IHAwOworICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDE2OyBpOyBpLS0sIGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy1pbWFnZVdpZHRoKjJdOyBwMCA9IGRhdGFbLWltYWdlV2lkdGhdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcEZsYWcgPSAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCAoKHRocmVzaG9sZHMtPmFscGhhID4+IDIpICsyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgcDIgPSBkYXRhWy1pbWFnZVdpZHRoKjNdOworICAgICAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOworCisgICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gcDEgKyBwMCArIHEwOworICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9ICh1OCkoKHAyICsgMiAqIHRtcCArIHExICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqMl0gPSAodTgpKChwMiArIHRtcCArIDIpID4+IDIpOworICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjNdID0gKHU4KSgoMiAqIGRhdGFbLWltYWdlV2lkdGgqNF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBwMiArIHRtcCArIDQpID4+IDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gKHU4KSgoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDIpOworCisgICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gcDAgKyBxMCArIHExOworICAgICAgICAgICAgICAgICAgICBkYXRhWyAwXSA9ICh1OCkoKHAxICsgMiAqIHRtcCArIHEyICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKCh0bXAgKyBxMiArIDIpID4+IDIpOworICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGgqMl0gPSAodTgpKCgyICogZGF0YVtpbWFnZVdpZHRoKjNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBxMiArIHRtcCArIDQpID4+IDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWx0ZXJWZXJDaHJvbWFFZGdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBvbmUgdmVydGljYWwgMi1waXhlbCBjaHJvbWEgZWRnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJWZXJDaHJvbWFFZGdlKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIHUzMiB3aWR0aCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgZGVsdGEsIHRjOworICAgIHU4IHAwLCBxMCwgcDEsIHExOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOworICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOworICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICB7CisgICAgICAgIGlmIChiUyA8IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKKyAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOworICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKKyAgICAgICAgICAgIGRhdGFbIDBdID0gcTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhWy0xXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKKyAgICAgICAgICAgIGRhdGFbIDBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOworICAgICAgICB9CisgICAgfQorICAgIGRhdGEgKz0gd2lkdGg7CisgICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKKyAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKKyAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCisgICAgeworICAgICAgICBpZiAoYlMgPCA0KQorICAgICAgICB7CisgICAgICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7CisgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOworICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07CisgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgIGRhdGFbLTFdID0gcDA7CisgICAgICAgICAgICBkYXRhWyAwXSA9IHEwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7CisgICAgICAgICAgICBkYXRhWyAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckNocm9tYUVkZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmlsdGVyIG9uZSBob3Jpem9udGFsIDItcGl4ZWwgY2hyb21hIGVkZ2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRmlsdGVySG9yQ2hyb21hRWRnZSgKKyAgdTggKmRhdGEsCisgIHUzMiBiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgd2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGRlbHRhLCB0YzsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYlMgPCA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7CisgICAgZm9yIChpID0gMjsgaTsgaS0tLCBkYXRhKyspCisgICAgeworICAgICAgICBwMSA9IGRhdGFbLXdpZHRoKjJdOyBwMCA9IGRhdGFbLXdpZHRoXTsKKyAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOworICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgorICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKKyAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOworICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSBwMDsKKyAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOworICAgICAgICB9CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckNocm9tYQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGaWx0ZXIgYWxsIGZvdXIgc3VjY2Vzc2l2ZSBob3Jpem9udGFsIDItcGl4ZWwgY2hyb21hIGVkZ2VzLiBUaGlzCisgICAgICAgICAgICBjYW4gYmUgZG9uZSBpZiBiUyBpcyBlcXVhbCBmb3IgYWxsIGZvdXIgZWRnZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlckhvckNocm9tYSgKKyAgdTggKmRhdGEsCisgIHUzMiBiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgd2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGRlbHRhLCB0YzsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYlMgPD0gNCk7CisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworCisgICAgaWYgKGJTIDwgNCkKKyAgICB7CisgICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKKyAgICAgICAgZm9yIChpID0gODsgaTsgaS0tLCBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gZGF0YVstd2lkdGgqMl07IHAwID0gZGF0YVstd2lkdGhdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOworICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKKyAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSBwMDsKKyAgICAgICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSA4OyBpOyBpLS0sIGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy13aWR0aCoyXTsgcDAgPSBkYXRhWy13aWR0aF07CisgICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVt3aWR0aF07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0Qm91bmRhcnlTdHJlbmd0aHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RocyBmb3IgYWxsIGVkZ2VzIG9mIGEKKyAgICAgICAgICAgIG1hY3JvYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgSEFOVFJPX1RSVUUgaWYgYW55IG9mIHRoZSBiUyB2YWx1ZXMgZm9yCisgICAgICAgICAgICB0aGUgbWFjcm9ibG9jayBoYWQgbm9uLXplcm8gdmFsdWUsIEhBTlRST19GQUxTRSBvdGhlcndpc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCBiU190ICpiUywgdTMyIGZsYWdzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgSEFOVFJPX1RSVUUgYXMgc29vbiBhcyBhbnkgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgaXMKKyAgICAgKiBub24temVybyAqLworICAgIHUzMiBub25aZXJvQnMgPSBIQU5UUk9fRkFMU0U7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGJTKTsKKyAgICBBU1NFUlQoZmxhZ3MpOworCisgICAgLyogdG9wIGVkZ2VzICovCisgICAgaWYgKGZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgaWYgKElTX0lOVFJBX01CKCptYikgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkIpKQorICAgICAgICB7CisgICAgICAgICAgICBiU1swXS50b3AgPSBiU1sxXS50b3AgPSBiU1syXS50b3AgPSBiU1szXS50b3AgPSA0OworICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiU1swXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgMCwgMTApOworICAgICAgICAgICAgYlNbMV0udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDEsIDExKTsKKyAgICAgICAgICAgIGJTWzJdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCA0LCAxNCk7CisgICAgICAgICAgICBiU1szXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgNSwgMTUpOworICAgICAgICAgICAgaWYgKGJTWzBdLnRvcCB8fCBiU1sxXS50b3AgfHwgYlNbMl0udG9wIHx8IGJTWzNdLnRvcCkKKyAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiU1swXS50b3AgPSBiU1sxXS50b3AgPSBiU1syXS50b3AgPSBiU1szXS50b3AgPSAwOworICAgIH0KKworICAgIC8qIGxlZnQgZWRnZXMgKi8KKyAgICBpZiAoZmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQorICAgIHsKKyAgICAgICAgaWYgKElTX0lOVFJBX01CKCptYikgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkEpKQorICAgICAgICB7CisgICAgICAgICAgICBiU1swXS5sZWZ0ID0gYlNbNF0ubGVmdCA9IGJTWzhdLmxlZnQgPSBiU1sxMl0ubGVmdCA9IDQ7CisgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJTWzBdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgMCwgNSk7CisgICAgICAgICAgICBiU1s0XS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDIsIDcpOworICAgICAgICAgICAgYlNbOF0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCA4LCAxMyk7CisgICAgICAgICAgICBiU1sxMl0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCAxMCwgMTUpOworICAgICAgICAgICAgaWYgKCFub25aZXJvQnMgJiYKKyAgICAgICAgICAgICAgICAoYlNbMF0ubGVmdCB8fCBiU1s0XS5sZWZ0IHx8IGJTWzhdLmxlZnQgfHwgYlNbMTJdLmxlZnQpKQorICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJTWzBdLmxlZnQgPSBiU1s0XS5sZWZ0ID0gYlNbOF0ubGVmdCA9IGJTWzEyXS5sZWZ0ID0gMDsKKyAgICB9CisKKyAgICAvKiBpbm5lciBlZGdlcyAqLworICAgIGlmIChJU19JTlRSQV9NQigqbWIpKQorICAgIHsKKyAgICAgICAgYlNbNF0udG9wICA9IGJTWzVdLnRvcCAgPSBiU1s2XS50b3AgID0gYlNbN10udG9wICA9CisgICAgICAgIGJTWzhdLnRvcCAgPSBiU1s5XS50b3AgID0gYlNbMTBdLnRvcCA9IGJTWzExXS50b3AgPQorICAgICAgICBiU1sxMl0udG9wID0gYlNbMTNdLnRvcCA9IGJTWzE0XS50b3AgPSBiU1sxNV0udG9wID0gMzsKKworICAgICAgICBiU1sxXS5sZWZ0ICA9IGJTWzJdLmxlZnQgID0gYlNbM10ubGVmdCAgPQorICAgICAgICBiU1s1XS5sZWZ0ICA9IGJTWzZdLmxlZnQgID0gYlNbN10ubGVmdCAgPQorICAgICAgICBiU1s5XS5sZWZ0ICA9IGJTWzEwXS5sZWZ0ID0gYlNbMTFdLmxlZnQgPQorICAgICAgICBiU1sxM10ubGVmdCA9IGJTWzE0XS5sZWZ0ID0gYlNbMTVdLmxlZnQgPSAzOworICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogMTZ4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBvciBtb3Rpb24gdmVjdG9ycyBjYW5ub3QgZGlmZmVyLAorICAgICAgICAgKiBvbmx5IGNoZWNrIGlmIGVpdGhlciBvZiB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzICovCisgICAgICAgIGlmIChoMjY0YnNkTnVtTWJQYXJ0KG1iLT5tYlR5cGUpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJTWzRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzJdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s1XS50b3AgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNl0udG9wID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzddLnRvcCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzVdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s4XS50b3AgPSBtYi0+dG90YWxDb2VmZls4XSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOV0udG9wID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEwXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzExXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbN10gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOworCisgICAgICAgICAgICBiU1sxXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMV0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzJdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls0XSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s5XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTRdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxNF0gPyAyIDogMDsKKyAgICAgICAgfQorICAgICAgICAvKiAxNng4IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKKyAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSBob3Jpem9udGFsIGVkZ2UsIGZvciB0aGUgb3RoZXIgdG9wIGVkZ2VzIGl0IGlzCisgICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKKyAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCBsZWZ0IGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfMTZ4OCkKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOF0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA4LCAyKTsKKyAgICAgICAgICAgIGJTWzldLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOSwgMyk7CisgICAgICAgICAgICBiU1sxMF0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgNik7CisgICAgICAgICAgICBiU1sxMV0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMywgNyk7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzRdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1szXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNV0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s3XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzldLmxlZnQgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbMTBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzE0XSA/IDIgOiAwOworICAgICAgICB9CisgICAgICAgIC8qIDh4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAorICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIHZlcnRpY2FsIGVkZ2UsIGZvciB0aGUgb3RoZXIgbGVmdCBlZGdlcyBpdCBpcworICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCisgICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgdG9wIGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfOHgxNikKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzhdLnRvcCA9IG1iLT50b3RhbENvZWZmWzhdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s5XS50b3AgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTBdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTFdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZls3XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTJdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEwXSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLnRvcCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE1XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTNdID8gMiA6IDA7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzddLmxlZnQgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1syXS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKKyAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDYsIDMpOworICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA5KTsKKyAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNF0sIG1iNHg0SW5kZXhbMF0pOworICAgICAgICAgICAgYlNbNV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNV0sIG1iNHg0SW5kZXhbMV0pOworICAgICAgICAgICAgYlNbNl0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNl0sIG1iNHg0SW5kZXhbMl0pOworICAgICAgICAgICAgYlNbN10udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbN10sIG1iNHg0SW5kZXhbM10pOworICAgICAgICAgICAgYlNbOF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOF0sIG1iNHg0SW5kZXhbNF0pOworICAgICAgICAgICAgYlNbOV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOV0sIG1iNHg0SW5kZXhbNV0pOworICAgICAgICAgICAgYlNbMTBdLnRvcCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEwXSwgbWI0eDRJbmRleFs2XSk7CisgICAgICAgICAgICBiU1sxMV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTFdLCBtYjR4NEluZGV4WzddKTsKKyAgICAgICAgICAgIGJTWzEyXS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMl0sIG1iNHg0SW5kZXhbOF0pOworICAgICAgICAgICAgYlNbMTNdLnRvcCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEzXSwgbWI0eDRJbmRleFs5XSk7CisgICAgICAgICAgICBiU1sxNF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTRdLCBtYjR4NEluZGV4WzEwXSk7CisgICAgICAgICAgICBiU1sxNV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTVdLCBtYjR4NEluZGV4WzExXSk7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxXSwgbWI0eDRJbmRleFswXSk7CisgICAgICAgICAgICBiU1syXS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMl0sIG1iNHg0SW5kZXhbMV0pOworICAgICAgICAgICAgYlNbM10ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzNdLCBtYjR4NEluZGV4WzJdKTsKKyAgICAgICAgICAgIGJTWzVdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs1XSwgbWI0eDRJbmRleFs0XSk7CisgICAgICAgICAgICBiU1s2XS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNl0sIG1iNHg0SW5kZXhbNV0pOworICAgICAgICAgICAgYlNbN10ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzddLCBtYjR4NEluZGV4WzZdKTsKKyAgICAgICAgICAgIGJTWzldLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs5XSwgbWI0eDRJbmRleFs4XSk7CisgICAgICAgICAgICBiU1sxMF0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEwXSwgbWI0eDRJbmRleFs5XSk7CisgICAgICAgICAgICBiU1sxMV0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzExXSwgbWI0eDRJbmRleFsxMF0pOworICAgICAgICAgICAgYlNbMTNdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxM10sIG1iNHg0SW5kZXhbMTJdKTsKKyAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTRdLCBtYjR4NEluZGV4WzEzXSk7CisgICAgICAgICAgICBiU1sxNV0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE1XSwgbWI0eDRJbmRleFsxNF0pOworICAgICAgICB9CisgICAgICAgIGlmICghbm9uWmVyb0JzICYmCisgICAgICAgICAgICAoYlNbNF0udG9wIHx8IGJTWzVdLnRvcCB8fCBiU1s2XS50b3AgfHwgYlNbN10udG9wIHx8CisgICAgICAgICAgICAgYlNbOF0udG9wIHx8IGJTWzldLnRvcCB8fCBiU1sxMF0udG9wIHx8IGJTWzExXS50b3AgfHwKKyAgICAgICAgICAgICBiU1sxMl0udG9wIHx8IGJTWzEzXS50b3AgfHwgYlNbMTRdLnRvcCB8fCBiU1sxNV0udG9wIHx8CisgICAgICAgICAgICAgYlNbMV0ubGVmdCB8fCBiU1syXS5sZWZ0IHx8IGJTWzNdLmxlZnQgfHwKKyAgICAgICAgICAgICBiU1s1XS5sZWZ0IHx8IGJTWzZdLmxlZnQgfHwgYlNbN10ubGVmdCB8fAorICAgICAgICAgICAgIGJTWzldLmxlZnQgfHwgYlNbMTBdLmxlZnQgfHwgYlNbMTFdLmxlZnQgfHwKKyAgICAgICAgICAgICBiU1sxM10ubGVmdCB8fCBiU1sxNF0ubGVmdCB8fCBiU1sxNV0ubGVmdCkpCisgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4obm9uWmVyb0JzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEx1bWFFZGdlVGhyZXNob2xkcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAorICAgICAgICAgICAgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBtYlN0b3JhZ2VfdCAqbWIsCisgIHUzMiBmaWx0ZXJpbmdGbGFncykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaW5kZXhBLCBpbmRleEI7CisgICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworICAgIEFTU0VSVChtYik7CisKKyAgICBxcCA9IG1iLT5xcFk7CisKKyAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOworICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOworICAgIHRocmVzaG9sZHNbSU5ORVJdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgIHRocmVzaG9sZHNbSU5ORVJdLnRjMCA9IHRjMFtpbmRleEFdOworCisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7CisgICAgICAgIGlmIChxcFRtcCAhPSBxcCkKKyAgICAgICAgeworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQorICAgIHsKKyAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7CisgICAgICAgIGlmIChxcFRtcCAhPSBxcCkKKyAgICAgICAgeworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCisgICAgICAgICAgICBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBtYlN0b3JhZ2VfdCAqbWIsCisgIHUzMiBmaWx0ZXJpbmdGbGFncywKKyAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGluZGV4QSwgaW5kZXhCOworICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgcXAgPSBtYi0+cXBZOworICAgIHFwID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKworICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgIHRocmVzaG9sZHNbSU5ORVJdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgdGhyZXNob2xkc1tJTk5FUl0uYmV0YSA9IGJldGFzW2luZGV4Ql07CisgICAgdGhyZXNob2xkc1tJTk5FUl0udGMwID0gdGMwW2luZGV4QV07CisKKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IGJldGFzW2luZGV4Ql07CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGMwW2luZGV4QV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKKyAgICAgICAgeworICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckx1bWEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmlsdGVyIGFsbCBsdW1hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jaworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJMdW1hKAorICB1OCAqZGF0YSwKKyAgYlNfdCAqYlMsCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgdTMyIHdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YmxvY2s7CisgICAgYlNfdCAqdG1wOworICAgIHU4ICpwdHI7CisgICAgdTMyIG9mZnNldDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyk7CisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworCisgICAgcHRyID0gZGF0YTsKKyAgICB0bXAgPSBiUzsKKworICAgIG9mZnNldCAgPSBUT1A7CisKKyAgICAvKiBsb29wIGJsb2NrIHJvd3MsIHBlcmZvcm0gZmlsdGVyaW5nIGZvciBhbGwgdmVydGljYWwgZWRnZXMgb2YgdGhlIGJsb2NrCisgICAgICogcm93IGZpcnN0LCB0aGVuIGZpbHRlciBlYWNoIGhvcml6b250YWwgZWRnZSBvZiB0aGUgcm93ICovCisgICAgZm9yICh2YmxvY2sgPSA0OyB2YmxvY2stLTspCisgICAgeworICAgICAgICAvKiBvbmx5IHBlcmZvcm0gZmlsdGVyaW5nIGlmIGJTIGlzIG5vbi16ZXJvLCBmaXJzdCBvZiB0aGUgZm91cgorICAgICAgICAgKiBGaWx0ZXJWZXJMdW1hRWRnZSBoYW5kbGVzIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIG1hY3JvYmxvY2ssIG90aGVycworICAgICAgICAgKiBmaWx0ZXIgaW5uZXIgZWRnZXMgKi8KKyAgICAgICAgaWYgKHRtcFswXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyLCB0bXBbMF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsIHdpZHRoKTsKKyAgICAgICAgaWYgKHRtcFsxXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzQsIHRtcFsxXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKyAgICAgICAgaWYgKHRtcFsyXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzgsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKyAgICAgICAgaWYgKHRtcFszXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzEyLCB0bXBbM10ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7CisKKyAgICAgICAgLyogaWYgYlMgaXMgZXF1YWwgZm9yIGFsbCBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSByb3cgLT4gcGVyZm9ybQorICAgICAgICAgKiBmaWx0ZXJpbmcgd2l0aCBGaWx0ZXJIb3JMdW1hLCBvdGhlcndpc2UgdXNlIEZpbHRlckhvckx1bWFFZGdlIGZvcgorICAgICAgICAgKiBlYWNoIGVkZ2Ugc2VwYXJhdGVseS4gb2Zmc2V0IHZhcmlhYmxlIGluZGljYXRlcyB0b3AgbWFjcm9ibG9jayBlZGdlCisgICAgICAgICAqIG9uIHRoZSBmaXJzdCBsb29wIHJvdW5kLCBpbm5lciBlZGdlIGZvciB0aGUgb3RoZXIgcm91bmRzICovCisgICAgICAgIGlmICh0bXBbMF0udG9wID09IHRtcFsxXS50b3AgJiYgdG1wWzFdLnRvcCA9PSB0bXBbMl0udG9wICYmCisgICAgICAgICAgICB0bXBbMl0udG9wID09IHRtcFszXS50b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHRtcFswXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYShwdHIsIHRtcFswXS50b3AsIHRocmVzaG9sZHMgKyBvZmZzZXQsIChpMzIpd2lkdGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIGlmKHRtcFsxXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzQsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIGlmKHRtcFsyXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzgsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIGlmKHRtcFszXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzEyLCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBmb3VyIHBpeGVsIHJvd3MgYWhlYWQsIGkuZS4gbmV4dCByb3cgb2YgNHg0LWJsb2NrcyAqLworICAgICAgICBwdHIgKz0gd2lkdGgqNDsKKyAgICAgICAgdG1wICs9IDQ7CisgICAgICAgIG9mZnNldCA9IElOTkVSOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWx0ZXJDaHJvbWEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmlsdGVyIGFsbCBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlckNocm9tYSgKKyAgdTggKmRhdGFDYiwKKyAgdTggKmRhdGFDciwKKyAgYlNfdCAqYlMsCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgdTMyIHdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YmxvY2s7CisgICAgYlNfdCAqdG1wOworICAgIHUzMiBvZmZzZXQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhQ2IpOworICAgIEFTU0VSVChkYXRhQ3IpOworICAgIEFTU0VSVChiUyk7CisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworCisgICAgdG1wID0gYlM7CisgICAgb2Zmc2V0ID0gVE9QOworCisgICAgLyogbG9vcCBibG9jayByb3dzLCBwZXJmb3JtIGZpbHRlcmluZyBmb3IgYWxsIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBibG9jaworICAgICAqIHJvdyBmaXJzdCwgdGhlbiBmaWx0ZXIgZWFjaCBob3Jpem9udGFsIGVkZ2Ugb2YgdGhlIHJvdyAqLworICAgIGZvciAodmJsb2NrID0gMDsgdmJsb2NrIDwgMjsgdmJsb2NrKyspCisgICAgeworICAgICAgICAvKiBvbmx5IHBlcmZvcm0gZmlsdGVyaW5nIGlmIGJTIGlzIG5vbi16ZXJvLCBmaXJzdCB0d28gb2YgdGhlIGZvdXIKKyAgICAgICAgICogRmlsdGVyVmVyQ2hyb21hRWRnZSBjYWxscyBoYW5kbGUgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFjcm9ibG9jaywKKyAgICAgICAgICogb3RoZXJzIGZpbHRlciB0aGUgaW5uZXIgZWRnZS4gTm90ZSB0aGF0IGFzIGNocm9tYSB1c2VzIGJTIHZhbHVlcworICAgICAgICAgKiBkZXRlcm1pbmVkIGZvciBsdW1hIGVkZ2VzLCBlYWNoIGJTIGlzIHVzZWQgb25seSBmb3IgMiBwaXhlbHMgb2YKKyAgICAgICAgICogYSA0LXBpeGVsIGVkZ2UgKi8KKyAgICAgICAgaWYgKHRtcFswXS5sZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYiwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDciwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcFs0XS5sZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYisyKndpZHRoLCB0bXBbNF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsCisgICAgICAgICAgICAgICAgd2lkdGgpOworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrMip3aWR0aCwgdG1wWzRdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULAorICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wWzJdLmxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiKzQsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsCisgICAgICAgICAgICAgICAgd2lkdGgpOworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrNCwgdG1wWzJdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwKKyAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcFs2XS5sZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYisyKndpZHRoKzQsIHRtcFs2XS5sZWZ0LAorICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrMip3aWR0aCs0LCB0bXBbNl0ubGVmdCwKKyAgICAgICAgICAgICAgICB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIGJTIGlzIGVxdWFsIGZvciBhbGwgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgcm93IC0+IHBlcmZvcm0KKyAgICAgICAgICogZmlsdGVyaW5nIHdpdGggRmlsdGVySG9yQ2hyb21hLCBvdGhlcndpc2UgdXNlIEZpbHRlckhvckNocm9tYUVkZ2UKKyAgICAgICAgICogZm9yIGVhY2ggZWRnZSBzZXBhcmF0ZWx5LiBvZmZzZXQgdmFyaWFibGUgaW5kaWNhdGVzIHRvcCBtYWNyb2Jsb2NrCisgICAgICAgICAqIGVkZ2Ugb24gdGhlIGZpcnN0IGxvb3Agcm91bmQsIGlubmVyIGVkZ2UgZm9yIHRoZSBzZWNvbmQgKi8KKyAgICAgICAgaWYgKHRtcFswXS50b3AgPT0gdG1wWzFdLnRvcCAmJiB0bXBbMV0udG9wID09IHRtcFsyXS50b3AgJiYKKyAgICAgICAgICAgIHRtcFsyXS50b3AgPT0gdG1wWzNdLnRvcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWEoZGF0YUNiLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hKGRhdGFDciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRtcFswXS50b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRtcFsxXS50b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IrMiwgdG1wWzFdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyKzIsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0bXBbMl0udG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiKzQsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDcis0LCB0bXBbMl0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG1wWzNdLnRvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYis2LCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IrNiwgdG1wWzNdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wICs9IDg7CisgICAgICAgIGRhdGFDYiArPSB3aWR0aCo0OworICAgICAgICBkYXRhQ3IgKz0gd2lkdGgqNDsKKyAgICAgICAgb2Zmc2V0ID0gSU5ORVI7CisgICAgfQorfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZpbHRlclBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gZGVibG9ja2luZyBmaWx0ZXJpbmcgZm9yIGEgcGljdHVyZS4gRmlsdGVyIGRvZXMgbm90IGNvcHkKKyAgICAgICAgICB0aGUgb3JpZ2luYWwgcGljdHVyZSBhbnl3aGVyZSBidXQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCBkaXJlY3RseQorICAgICAgICAgIG9uIHRoZSBvcmlnaW5hbCBpbWFnZS4gUGFyYW1ldGVycyBjb250cm9sbGluZyB0aGUgZmlsdGVyaW5nIHByb2Nlc3MKKyAgICAgICAgICBhcmUgY29tcHV0ZWQgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gbWFjcm9ibG9jayBzdHJ1Y3R1cmVzIG9mIHRoZQorICAgICAgICAgIGZpbHRlcmVkIG1hY3JvYmxvY2ssIG1hY3JvYmxvY2sgYWJvdmUgYW5kIG1hY3JvYmxvY2sgb24gdGhlIGxlZnQgb2YKKyAgICAgICAgICB0aGUgZmlsdGVyZWQgb25lLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBpbWFnZSAgICAgICAgIHBvaW50ZXIgdG8gaW1hZ2UgdG8gYmUgZmlsdGVyZWQKKyAgICAgICAgICBtYiAgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHN0cnVjdHVyZSBvZiB0aGUgdG9wLWxlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgb2YgdGhlIHBpY3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGltYWdlICAgICAgICAgZmlsdGVyZWQgaW1hZ2Ugc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypsaW50IC0tZXs1NTB9IFN5bWJvbCBub3QgYWNjZXNzZWQgKi8KK3ZvaWQgaDI2NGJzZEZpbHRlclBpY3R1cmUoCisgIGltYWdlX3QgKmltYWdlLAorICBtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGZsYWdzOworICAgIHUzMiBwaWNTaXplSW5NYnMsIG1iUm93LCBtYkNvbDsKKyAgICB1MzIgcGljV2lkdGhJbk1iczsKKyAgICB1OCAqZGF0YTsKKyAgICBtYlN0b3JhZ2VfdCAqcE1iOworICAgIHU4IGJTWzJdWzE2XTsKKyAgICB1OCB0aHJlc2hvbGRMdW1hWzJdWzE2XTsKKyAgICB1OCB0aHJlc2hvbGRDaHJvbWFbMl1bOF07CisgICAgdTggYWxwaGFbMl1bMl07CisgICAgdTggYmV0YVsyXVsyXTsKKyAgICBPTVhSZXN1bHQgcmVzOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGltYWdlLT5kYXRhKTsKKyAgICBBU1NFUlQoaW1hZ2UtPndpZHRoKTsKKyAgICBBU1NFUlQoaW1hZ2UtPmhlaWdodCk7CisKKyAgICBwaWNXaWR0aEluTWJzID0gaW1hZ2UtPndpZHRoOworICAgIGRhdGEgPSBpbWFnZS0+ZGF0YTsKKyAgICBwaWNTaXplSW5NYnMgPSBwaWNXaWR0aEluTWJzICogaW1hZ2UtPmhlaWdodDsKKworICAgIHBNYiA9IG1iOworCisgICAgZm9yIChtYlJvdyA9IDAsIG1iQ29sID0gMDsgbWJSb3cgPCBpbWFnZS0+aGVpZ2h0OyBwTWIrKykKKyAgICB7CisgICAgICAgIGZsYWdzID0gR2V0TWJGaWx0ZXJpbmdGbGFncyhwTWIpOworCisgICAgICAgIGlmIChmbGFncykKKyAgICAgICAgeworICAgICAgICAgICAgLyogR2V0Qm91bmRhcnlTdHJlbmd0aHMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyB2YWx1ZSBpZiBhbnkgb2YKKyAgICAgICAgICAgICAqIHRoZSBiUyB2YWx1ZXMgZm9yIHRoZSBtYWNyb2Jsb2NrIGJlaW5nIHByb2Nlc3NlZCB3YXMgbm9uLXplcm8gKi8KKyAgICAgICAgICAgIGlmIChHZXRCb3VuZGFyeVN0cmVuZ3RocyhwTWIsIGJTLCBmbGFncykpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAvKiBMdW1hICovCisgICAgICAgICAgICAgICAgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKHBNYixhbHBoYSxiZXRhLHRocmVzaG9sZEx1bWEsYlMsZmxhZ3MpOworICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDI1NiArIG1iQ29sICogMTY7CisKKyAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZEx1bWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOworCisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyoxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkTHVtYSsxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTKzE2ICk7CisgICAgICAgICAgICAgICAgLyogQ2IgKi8KKyAgICAgICAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcyhwTWIsIGFscGhhLCBiZXRhLCB0aHJlc2hvbGRDaHJvbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlMsIGZsYWdzLCBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpOworICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemVJbk1icyAqIDI1NiArCisgICAgICAgICAgICAgICAgICAgIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDY0ICsgbWJDb2wgKiA4OworCisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOworICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGErMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hKzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMrMTYgKTsKKyAgICAgICAgICAgICAgICAvKiBDciAqLworICAgICAgICAgICAgICAgIGRhdGEgKz0gKHBpY1NpemVJbk1icyAqIDY0KTsKKyAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTICk7CisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGErMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWErOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUysxNiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWJDb2wrKzsKKyAgICAgICAgaWYgKG1iQ29sID09IHBpY1dpZHRoSW5NYnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iQ29sID0gMDsKKyAgICAgICAgICAgIG1iUm93Kys7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBHZXRCb3VuZGFyeVN0cmVuZ3RocworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGhzIGZvciBhbGwgZWRnZXMgb2YgYQorICAgICAgICAgICAgbWFjcm9ibG9jay4gRnVuY3Rpb24gcmV0dXJucyBIQU5UUk9fVFJVRSBpZiBhbnkgb2YgdGhlIGJTIHZhbHVlcyBmb3IKKyAgICAgICAgICAgIHRoZSBtYWNyb2Jsb2NrIGhhZCBub24temVybyB2YWx1ZSwgSEFOVFJPX0ZBTFNFIG90aGVyd2lzZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIHU4ICgqYlMpWzE2XSwgdTMyIGZsYWdzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgSEFOVFJPX1RSVUUgYXMgc29vbiBhcyBhbnkgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgaXMKKyAgICAgKiBub24temVybyAqLworICAgIHUzMiBub25aZXJvQnMgPSBIQU5UUk9fRkFMU0U7CisgICAgdTMyICpwVG1wOworICAgIHUzMiB0bXAxLCB0bXAyLCBpc0ludHJhTWI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGJTKTsKKyAgICBBU1NFUlQoZmxhZ3MpOworCisgICAgaXNJbnRyYU1iID0gSVNfSU5UUkFfTUIoKm1iKTsKKworICAgIC8qIHRvcCBlZGdlcyAqLworICAgIHBUbXAgPSAodTMyKikmYlNbMV1bMF07CisgICAgaWYgKGZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgaWYgKGlzSW50cmFNYiB8fCBJU19JTlRSQV9NQigqbWItPm1iQikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwVG1wID0gMHgwNDA0MDQwNDsKKyAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBUbXAgPSBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcChtYiwgbWItPm1iQik7CisgICAgICAgICAgICBpZiAoKnBUbXApCisgICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBUbXAgPSAwOworICAgIH0KKworICAgIC8qIGxlZnQgZWRnZXMgKi8KKyAgICBwVG1wID0gKHUzMiopJmJTWzBdWzBdOworICAgIGlmIChmbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCisgICAgeworICAgICAgICBpZiAoaXNJbnRyYU1iIHx8IElTX0lOVFJBX01CKCptYi0+bWJBKSkKKyAgICAgICAgeworICAgICAgICAgICAgLypiU1swXVswXSA9IGJTWzBdWzFdID0gYlNbMF1bMl0gPSBiU1swXVszXSA9IDQ7Ki8KKyAgICAgICAgICAgICpwVG1wID0gMHgwNDA0MDQwNDsKKyAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBUbXAgPSBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWIsIG1iLT5tYkEpOworICAgICAgICAgICAgaWYgKCFub25aZXJvQnMgJiYgKnBUbXApCisgICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBUbXAgPSAwOworICAgIH0KKworICAgIC8qIGlubmVyIGVkZ2VzICovCisgICAgaWYgKGlzSW50cmFNYikKKyAgICB7CisgICAgICAgIHBUbXArKzsKKyAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7CisgICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOworICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKKyAgICAgICAgcFRtcCsrOworICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKKyAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7CisgICAgICAgICpwVG1wID0gMHgwMzAzMDMwMzsKKworICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFRtcCA9ICh1MzIqKW1iLT50b3RhbENvZWZmOworCisgICAgICAgIC8qIDE2eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgb3IgbW90aW9uIHZlY3RvcnMgY2Fubm90IGRpZmZlciwKKyAgICAgICAgICogb25seSBjaGVjayBpZiBlaXRoZXIgb2YgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyAqLworICAgICAgICBpZiAoaDI2NGJzZE51bU1iUGFydChtYi0+bWJUeXBlKSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNF0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMl0gIHx8IFswXSAqLworICAgICAgICAgICAgYlNbMV1bNV0gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsxXSAqLworICAgICAgICAgICAgYlNbMF1bNF0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMV0gIHx8IFswXSAqLworICAgICAgICAgICAgYlNbMF1bNV0gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsyXSAqLworCisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKKyAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCisKKyAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCisgICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLworICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0bXAzLCB0bXA0OworCisgICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbOF07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMl07CisgICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107CisKKyAgICAgICAgICAgIGJTWzFdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7CisgICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzZdOworICAgICAgICAgICAgYlNbMV1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxM107CisgICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbN107CisgICAgICAgICAgICBiU1sxXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls0XTsKKyAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsxXTsKKyAgICAgICAgICAgIGJTWzFdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzZdOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOworICAgICAgICAgICAgYlNbMF1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICBiU1swXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzE0XTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlsxMV07CisgICAgICAgICAgICBiU1swXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzBdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogMTZ4OCBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50CisgICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgaG9yaXpvbnRhbCBlZGdlLCBmb3IgdGhlIG90aGVyIHRvcCBlZGdlcyBpdCBpcworICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCisgICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgbGVmdCBlZGdlcy4gKi8KKyAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzE2eDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgdG1wMiA9ICpwVG1wKys7CisgICAgICAgICAgICBiU1sxXVs0XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsyXSAgfHwgWzBdICovCisgICAgICAgICAgICBiU1sxXVs1XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzFdICovCisgICAgICAgICAgICBiU1swXVs0XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxXSAgfHwgWzBdICovCisgICAgICAgICAgICBiU1swXVs1XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzJdICovCisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKKyAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCisKKyAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCisgICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLworICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCisKKyAgICAgICAgICAgIGJTWzFdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOCwgMik7CisgICAgICAgICAgICBiU1sxXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDksIDMpOworICAgICAgICAgICAgYlNbMV1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDYpOworICAgICAgICAgICAgYlNbMV1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTMsIDcpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKKworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzRdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzFdOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzZdOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOworICAgICAgICAgICAgYlNbMF1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICBiU1swXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzE0XTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlsxMV07CisgICAgICAgICAgICBiU1swXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzBdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIDh4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAorICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIHZlcnRpY2FsIGVkZ2UsIGZvciB0aGUgb3RoZXIgbGVmdCBlZGdlcyBpdCBpcworICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCisgICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgdG9wIGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfOHgxNikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7CisgICAgICAgICAgICB0bXAyID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzRdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzJdICB8fCBbMF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzVdICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzRdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzFdICB8fCBbMF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzVdICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMl0gKi8KKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbNl0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs1XSAqLworICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbNV0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs2XSAqLworICAgICAgICAgICAgdG1wMiA9ICpwVG1wOworICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTBdIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFs5XSAqLworICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbOV0gIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFsxMF0gKi8KKworICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTRdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTNdICovCisgICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxM10gfHwgWzEyXSAqLworICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxNF0gKi8KKworICAgICAgICAgICAgYlNbMF1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKKyAgICAgICAgICAgIGJTWzBdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7CisgICAgICAgICAgICBiU1swXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7CisgICAgICAgICAgICBiU1swXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKKworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzhdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzJdOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzldOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOworICAgICAgICAgICAgYlNbMV1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbNl07CisgICAgICAgICAgICBiU1sxXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzEzXTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZls3XTsKKyAgICAgICAgICAgIGJTWzFdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOworICAgICAgICAgICAgYlNbMV1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzRdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMiwgMCk7CisgICAgICAgICAgICBiU1sxXVs1XSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDMsIDEpOworICAgICAgICAgICAgYlNbMF1bNF0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxLCAwKTsKKyAgICAgICAgICAgIGJTWzBdWzVdID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMywgMik7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDYsIDQpOworICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNywgNSk7CisgICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA1LCA0KTsKKyAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDcsIDYpOworICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7CisgICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMCwgOCk7CisgICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMSwgOSk7CisgICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA5LCA4KTsKKyAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDExLCAxMCk7CisgICAgICAgICAgICB0bXAxID0gKnBUbXA7CisgICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNCwgMTIpOworICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTUsIDEzKTsKKyAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDEzLCAxMik7CisgICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNSwgMTQpOworCisgICAgICAgICAgICBiU1sxXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDgsIDIpOworICAgICAgICAgICAgYlNbMV1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA5LCAzKTsKKyAgICAgICAgICAgIGJTWzFdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA2KTsKKyAgICAgICAgICAgIGJTWzFdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEzLCA3KTsKKworICAgICAgICAgICAgYlNbMF1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKKyAgICAgICAgICAgIGJTWzBdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7CisgICAgICAgICAgICBiU1swXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7CisgICAgICAgICAgICBiU1swXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOworICAgICAgICB9CisgICAgICAgIHBUbXAgPSAodTMyKikmYlNbMF1bMF07CisgICAgICAgIGlmICghbm9uWmVyb0JzICYmIChwVG1wWzFdIHx8IHBUbXBbMl0gfHwgcFRtcFszXSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRtcFs1XSB8fCBwVG1wWzZdIHx8IHBUbXBbN10pICkKKyAgICAgICAgeworICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4obm9uWmVyb0JzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEx1bWFFZGdlVGhyZXNob2xkcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAorICAgICAgICAgICAgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKKyAgICBtYlN0b3JhZ2VfdCAqbWIsCisgICAgdTggKCphbHBoYSlbMl0sCisgICAgdTggKCpiZXRhKVsyXSwKKyAgICB1OCAoKnRocmVzaG9sZClbMTZdLAorICAgIHU4ICgqYnMpWzE2XSwKKyAgICB1MzIgZmlsdGVyaW5nRmxhZ3MgKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpbmRleEEsIGluZGV4QjsKKyAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQodGhyZXNob2xkKTsKKyAgICBBU1NFUlQoYnMpOworICAgIEFTU0VSVChiZXRhKTsKKyAgICBBU1NFUlQoYWxwaGEpOworICAgIEFTU0VSVChtYik7CisKKyAgICBxcCA9IG1iLT5xcFk7CisKKyAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOworICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAvKiBJbnRlcm5hbCBlZGdlIHZhbHVlcyAqLworICAgIGFscGhhWzBdWzFdID0gYWxwaGFzW2luZGV4QV07CisgICAgYWxwaGFbMV1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOworICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgYmV0YVswXVsxXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVsxXVsxXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07CisKKyAgICAvKiB2ZXJ0aWNhbCBzY2FuIG9yZGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICAgIHUzMiB0MSwgdDI7CisKKyAgICAgICAgdDEgPSBic1tpXVswXTsKKyAgICAgICAgdDIgPSBic1tpXVsxXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzBdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzJdOworICAgICAgICB0aHJlc2hvbGRbaV1bMV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bM107CisgICAgICAgIHRocmVzaG9sZFtpXVsyXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVs0XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzNdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzVdOworICAgICAgICB0aHJlc2hvbGRbaV1bNF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHQxID0gYnNbaV1bNl07CisgICAgICAgIHRocmVzaG9sZFtpXVs1XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVs3XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzZdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzhdOworICAgICAgICB0aHJlc2hvbGRbaV1bN10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bOV07CisgICAgICAgIHRocmVzaG9sZFtpXVs4XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxMF07CisgICAgICAgIHRocmVzaG9sZFtpXVs5XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxMV07CisgICAgICAgIHRocmVzaG9sZFtpXVsxMF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxMl07CisgICAgICAgIHRocmVzaG9sZFtpXVsxMV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxM107CisgICAgICAgIHRocmVzaG9sZFtpXVsxMl0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxNF07CisgICAgICAgIHRocmVzaG9sZFtpXVsxM10gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxNV07CisgICAgICAgIHRocmVzaG9sZFtpXVsxNF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdGhyZXNob2xkW2ldWzE1XSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgIH0KKworICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gcXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0MSwgdDIsIHQzLCB0NDsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdDEgPSBic1sxXVswXTsKKyAgICAgICAgICAgIHQyID0gYnNbMV1bMV07CisgICAgICAgICAgICB0MyA9IGJzWzFdWzJdOworICAgICAgICAgICAgdDQgPSBic1sxXVszXTsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVswXSA9ICh0MSAmJiAodDEgPCA0KSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzFdID0gKHQyICYmICh0MiA8IDQpKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMV1bMl0gPSAodDMgJiYgKHQzIDwgNCkpID8gdGMwW2luZGV4QV1bdDNdIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVszXSA9ICh0NCAmJiAodDQgPCA0KSkgPyB0YzBbaW5kZXhBXVt0NF0gOiAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IHFwKQorICAgICAgICB7CisgICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOworCisgICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAgICAgICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVswXSA9IChic1swXVswXSAmJiAoYnNbMF1bMF0gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVswXV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzFdID0gKGJzWzBdWzFdICYmIChic1swXVsxXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzFdXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMF1bMl0gPSAoYnNbMF1bMl0gJiYgKGJzWzBdWzJdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bMl1dIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVszXSA9IChic1swXVszXSAmJiAoYnNbMF1bM10gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVszXV0gOiAwOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKKyAgICAgICAgICAgIGNocm9tYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAorICAgIG1iU3RvcmFnZV90ICptYiwKKyAgICB1OCAoKmFscGhhKVsyXSwKKyAgICB1OCAoKmJldGEpWzJdLAorICAgIHU4ICgqdGhyZXNob2xkKVs4XSwKKyAgICB1OCAoKmJzKVsxNl0sCisgICAgdTMyIGZpbHRlcmluZ0ZsYWdzLAorICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpbmRleEEsIGluZGV4QjsKKyAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQodGhyZXNob2xkKTsKKyAgICBBU1NFUlQoYnMpOworICAgIEFTU0VSVChiZXRhKTsKKyAgICBBU1NFUlQoYWxwaGEpOworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIHFwID0gbWItPnFwWTsKKyAgICBxcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07CisKKyAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOworICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICBhbHBoYVswXVsxXSA9IGFscGhhc1tpbmRleEFdOworICAgIGFscGhhWzFdWzFdID0gYWxwaGFzW2luZGV4QV07CisgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOworICAgIGJldGFbMF1bMV0gPSBiZXRhc1tpbmRleEJdOworICAgIGJldGFbMV1bMV0gPSBiZXRhc1tpbmRleEJdOworICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOworICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICAgIHUzMiB0MSwgdDI7CisKKyAgICAgICAgdDEgPSBic1tpXVswXTsKKyAgICAgICAgdDIgPSBic1tpXVsxXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzBdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzJdOworICAgICAgICB0aHJlc2hvbGRbaV1bMV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bM107CisgICAgICAgIHRocmVzaG9sZFtpXVsyXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVs4XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzNdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzldOworICAgICAgICB0aHJlc2hvbGRbaV1bNF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHQxID0gYnNbaV1bMTBdOworICAgICAgICB0aHJlc2hvbGRbaV1bNV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bMTFdOworICAgICAgICB0aHJlc2hvbGRbaV1bNl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHRocmVzaG9sZFtpXVs3XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0MSwgdDIsIHQzLCB0NDsKKyAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOworCisgICAgICAgICAgICB0MSA9IGJzWzFdWzBdOworICAgICAgICAgICAgdDIgPSBic1sxXVsxXTsKKyAgICAgICAgICAgIHQzID0gYnNbMV1bMl07CisgICAgICAgICAgICB0NCA9IGJzWzFdWzNdOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzBdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMV1bMV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVsyXSA9ICh0MykgPyB0YzBbaW5kZXhBXVt0M10gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzNdID0gKHQ0KSA/IHRjMFtpbmRleEFdW3Q0XSA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKKyAgICAgICAgeworCisgICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07CisgICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOworCisgICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAgICAgICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVswXSA9IChic1swXVswXSkgPyB0YzBbaW5kZXhBXVtic1swXVswXV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzFdID0gKGJzWzBdWzFdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzFdXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMF1bMl0gPSAoYnNbMF1bMl0pID8gdGMwW2luZGV4QV1bYnNbMF1bMl1dIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVszXSA9IChic1swXVszXSkgPyB0YzBbaW5kZXhBXVtic1swXVszXV0gOiAwOworICAgICAgICB9CisgICAgfQorCit9CisKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qbGludCArZTcwMSArZTcwMiAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNTcxZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0RFQkxPQ0tJTkdfSAorI2RlZmluZSBIMjY0U1dERUNfREVCTE9DS0lOR19ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAorICBpbWFnZV90ICppbWFnZSwKKyAgbWJTdG9yYWdlX3QgKm1iKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVCTE9DS0lOR19IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTY4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5jCkBAIC0wLDAgKzEsOTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEluaXQKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlCisgICAgICAgICAgaDI2NGJzZFNodXRkb3duCisgICAgICAgICAgaDI2NGJzZEN1cnJlbnRJbWFnZQorICAgICAgICAgIGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZQorICAgICAgICAgIGgyNjRic2RQaWNXaWR0aAorICAgICAgICAgIGgyNjRic2RQaWNIZWlnaHQKKyAgICAgICAgICBoMjY0YnNkRmx1c2hCdWZmZXIKKyAgICAgICAgICBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cworICAgICAgICAgIGgyNjRic2RWaWRlb1JhbmdlCisgICAgICAgICAgaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cworICAgICAgICAgIGgyNjRic2RDcm9wcGluZ1BhcmFtcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2RhdGEuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kZWJsb2NraW5nLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jb25jZWFsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RJbml0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIGRlY29kZXIuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nICBmbGFnIHRvIGluZGljYXRlIHRoZSBkZWNvZGVyIHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0byBwZXJmb3JtIHJlb3JkZXJpbmcgb2YgZGlzcGxheSBpbWFnZXMuCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW5pdChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgbm9PdXRwdXRSZW9yZGVyaW5nKQoreworCisvKiBWYXJpYWJsZXMgKi8KKyAgICB1MzIgc2l6ZTsKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBoMjY0YnNkSW5pdFN0b3JhZ2UocFN0b3JhZ2UpOworCisgICAgLyogYWxsb2NhdGUgbWJMYXllciB0byBiZSBuZXh0IG11bHRpcGxlIG9mIDY0IHRvIGVuYWJsZSB1c2Ugb2YKKyAgICAgKiBzcGVjaWZpYyBORU9OIG9wdGltaXplZCAibWVtc2V0IiBmb3IgY2xlYXJpbmcgdGhlIHN0cnVjdHVyZSAqLworICAgIHNpemUgPSAoc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSArIDYzKSAmIH4weDNGOworCisgICAgcFN0b3JhZ2UtPm1iTGF5ZXIgPSAobWFjcm9ibG9ja0xheWVyX3QqKUgyNjRTd0RlY01hbGxvYyhzaXplKTsKKyAgICBpZiAoIXBTdG9yYWdlLT5tYkxheWVyKQorICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKKworICAgIGlmIChub091dHB1dFJlb3JkZXJpbmcpCisgICAgICAgIHBTdG9yYWdlLT5ub1Jlb3JkZXJpbmcgPSBIQU5UUk9fVFJVRTsKKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgYSBOQUwgdW5pdC4gVGhpcyBmdW5jdGlvbiBjYWxscyBvdGhlciBtb2R1bGVzIHRvIHBlcmZvcm0KKyAgICAgICAgICAgIHRhc2tzIGxpa2UKKyAgICAgICAgICAgICAgICAqIGV4dHJhY3QgYW5kIGRlY29kZSBOQUwgdW5pdCBmcm9tIHRoZSBieXRlIHN0cmVhbQorICAgICAgICAgICAgICAgICogZGVjb2RlIHBhcmFtZXRlciBzZXRzCisgICAgICAgICAgICAgICAgKiBkZWNvZGUgc2xpY2UgaGVhZGVyIGFuZCBzbGljZSBkYXRhCisgICAgICAgICAgICAgICAgKiBjb25jZWFsIGVycm9ycyBpbiB0aGUgcGljdHVyZQorICAgICAgICAgICAgICAgICogcGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZworCisgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIHRvcCBsZXZlbCBjb250cm9sIGxvZ2ljIG9mIHRoZSBkZWNvZGVyLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGJ5dGVTdHJtICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBidWZmZXIgZ2l2ZW4gYnkgYXBwbGljYXRpb24KKyAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiBieXRlcworICAgICAgICAgICAgcGljSWQgICAgICAgICAgIGlkZW50aWZpZXIgZm9yIGEgcGljdHVyZSwgYXNzaWduZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcmVhZEJ5dGVzICAgICAgIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSBpcyBzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEgyNjRCU0RfUkRZICAgICAgICAgICAgIGRlY29kaW5nIGZpbmlzaGVkLCBub3RoaW5nIHNwZWNpYWwKKyAgICAgICAgICAgIEgyNjRCU0RfUElDX1JEWSAgICAgICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZAorICAgICAgICAgICAgSDI2NEJTRF9IRFJTX1JEWSAgICAgICAgcGFyYW0gc2V0cyBhY3RpdmF0ZWQsIGluZm9ybWF0aW9uIGxpa2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgZGltZW5zaW9ucyBldGMgY2FuIGJlIHJlYWQKKyAgICAgICAgICAgIEgyNjRCU0RfRVJST1IgICAgICAgICAgIGVycm9yIGluIGRlY29kaW5nCisgICAgICAgICAgICBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUiBzZXJpdXMgZXJyb3IgaW4gZGVjb2RpbmcsIGZhaWxlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGUgcGFyYW0gc2V0cworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1OCAqYnl0ZVN0cm0sIHUzMiBsZW4sIHUzMiBwaWNJZCwKKyAgICB1MzIgKnJlYWRCeXRlcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBwcHNJZCwgc3BzSWQ7CisgICAgaTMyIHBpY09yZGVyQ250OworICAgIG5hbFVuaXRfdCBuYWxVbml0OworICAgIHNlcVBhcmFtU2V0X3Qgc2VxUGFyYW1TZXQ7CisgICAgcGljUGFyYW1TZXRfdCBwaWNQYXJhbVNldDsKKyAgICBzdHJtRGF0YV90IHN0cm07CisgICAgdTMyIGFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fRkFMU0U7CisgICAgdTMyIHBpY1JlYWR5ID0gSEFOVFJPX0ZBTFNFOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworICAgIEFTU0VSVChieXRlU3RybSk7CisgICAgQVNTRVJUKGxlbik7CisgICAgQVNTRVJUKHJlYWRCeXRlcyk7CisKKyAgICAvKiBpZiBwcmV2aW91cyBidWZmZXIgd2FzIG5vdCBmaW5pc2hlZCBhbmQgc2FtZSBwb2ludGVyIGdpdmVuIC0+IHNraXAgTkFMCisgICAgICogdW5pdCBleHRyYWN0aW9uICovCisgICAgaWYgKHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgJiYgYnl0ZVN0cm0gPT0gcFN0b3JhZ2UtPnByZXZCdWZQb2ludGVyKQorICAgIHsKKyAgICAgICAgc3RybSA9IHBTdG9yYWdlLT5zdHJtWzBdOworICAgICAgICBzdHJtLnBTdHJtQ3VyclBvcyA9IHN0cm0ucFN0cm1CdWZmU3RhcnQ7CisgICAgICAgIHN0cm0uc3RybUJ1ZmZSZWFkQml0cyA9IHN0cm0uYml0UG9zSW5Xb3JkID0gMDsKKyAgICAgICAgKnJlYWRCeXRlcyA9IHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEV4dHJhY3ROYWxVbml0KGJ5dGVTdHJtLCBsZW4sICZzdHJtLCByZWFkQnl0ZXMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJCWVRFX1NUUkVBTSIpOworICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICB9CisgICAgICAgIC8qIHN0b3JlIHN0cmVhbSAqLworICAgICAgICBwU3RvcmFnZS0+c3RybVswXSA9IHN0cm07CisgICAgICAgIHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZCA9ICpyZWFkQnl0ZXM7CisgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmUG9pbnRlciA9IGJ5dGVTdHJtOworICAgIH0KKyAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZU5hbFVuaXQoJnN0cm0sICZuYWxVbml0KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIEVQUklOVCgiTkFMX1VOSVQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgIH0KKworICAgIC8qIERpc2NhcmQgdW5zcGVjaWZpZWQsIHJlc2VydmVkLCBTUFMgZXh0ZW5zaW9uIGFuZCBhdXhpbGlhcnkgcGljdHVyZSBzbGljZXMgKi8KKyAgICBpZihuYWxVbml0Lm5hbFVuaXRUeXBlID09IDAgfHwgbmFsVW5pdC5uYWxVbml0VHlwZSA+PSAxMykKKyAgICB7CisgICAgICAgIERFQlVHKCgiRElTQ0FSREVEIE5BTCAoVU5TUEVDSUZJRUQsIFJFR0lTVEVSRUQsIFNQUyBleHQgb3IgQVVYIHNsaWNlKVxuIikpOworICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKKyAgICAgICZzdHJtLAorICAgICAgJm5hbFVuaXQsCisgICAgICBwU3RvcmFnZSwKKyAgICAgICZhY2Nlc3NVbml0Qm91bmRhcnlGbGFnKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIEVQUklOVCgiQUNDRVNTIFVOSVQgQk9VTkRBUlkgQ0hFQ0siKTsKKyAgICAgICAgaWYgKHRtcCA9PSBQQVJBTV9TRVRfRVJST1IpCisgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgfQorCisgICAgaWYgKCBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnICkKKyAgICB7CisgICAgICAgIERFQlVHKCgiQWNjZXNzIHVuaXQgYm91bmRhcnlcbiIpKTsKKyAgICAgICAgLyogY29uY2VhbCBpZiBwaWN0dXJlIHN0YXJ0ZWQgYW5kIHBhcmFtIHNldHMgYWN0aXZhdGVkICovCisgICAgICAgIGlmIChwU3RvcmFnZS0+cGljU3RhcnRlZCAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiQ09OQ0VBTElORy4uLiIpKTsKKworICAgICAgICAgICAgLyogcmV0dXJuIGVycm9yIGlmIHNlY29uZCBwaGFzZSBvZgorICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLworICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UocFN0b3JhZ2UtPmRwYik7CisgICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDb25jZWFsKHBTdG9yYWdlLCBwU3RvcmFnZS0+Y3VyckltYWdlLCBQX1NMSUNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ29uY2VhbChwU3RvcmFnZSwgcFN0b3JhZ2UtPmN1cnJJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZVR5cGUpOworCisgICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOworCisgICAgICAgICAgICAvKiBjdXJyZW50IE5BTCB1bml0IHNob3VsZCBiZSBkZWNvZGVkIG9uIG5leHQgYWN0aXZhdGlvbiAtPiBzZXQKKyAgICAgICAgICAgICAqIHJlYWRCeXRlcyB0byAwICovCisgICAgICAgICAgICAqcmVhZEJ5dGVzID0gMDsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgIERFQlVHKCgiLi4uRE9ORVxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcFN0b3JhZ2UtPnNraXBSZWR1bmRhbnRTbGljZXMgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFwaWNSZWFkeSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobmFsVW5pdC5uYWxVbml0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOQUxfU0VRX1BBUkFNX1NFVDoKKyAgICAgICAgICAgICAgICBERUJVRygoIlNFUSBQQVJBTSBTRVRcbiIpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoJnN0cm0sICZzZXFQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNFUV9QQVJBTV9TRVQiKTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShzZXFQYXJhbVNldC5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIEZSRUUoc2VxUGFyYW1TZXQudnVpUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQocFN0b3JhZ2UsICZzZXFQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTkFMX1BJQ19QQVJBTV9TRVQ6CisgICAgICAgICAgICAgICAgREVCVUcoKCJQSUMgUEFSQU0gU0VUXG4iKSk7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KCZzdHJtLCAmcGljUGFyYW1TZXQpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJQSUNfUEFSQU1fU0VUIik7CisgICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQucnVuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC50b3BMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC5ib3R0b21SaWdodCk7CisgICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQuc2xpY2VHcm91cElkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChwU3RvcmFnZSwgJnBpY1BhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQUxfQ09ERURfU0xJQ0VfSURSOgorICAgICAgICAgICAgICAgIERFQlVHKCgiSURSICIpKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgTkFMX0NPREVEX1NMSUNFOgorICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgSEVBREVSXG4iKSk7CisKKyAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBhbmQgc3RpbGwgZGVjb2Rpbmcgc2FtZSBvbGQKKyAgICAgICAgICAgICAgICAgKiBhY2Nlc3MgdW5pdCAtPiBubyBuZWVkIHRvIGRlY29kZSByZWR1bmRhbnQgc2xpY2VzICovCisgICAgICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5za2lwUmVkdW5kYW50U2xpY2VzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOworCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fVFJVRTsKKworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkSXNTdGFydE9mUGljdHVyZShwU3RvcmFnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJlbnRQaWNJZCAgICA9IHBpY0lkOworCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja1Bwc0lkKCZzdHJtLCAmcHBzSWQpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQodG1wID09IEhBTlRST19PSyk7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIG9sZCBhY3RpdmVTcHNJZCBhbmQgcmV0dXJuIGhlYWRlcnMgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICogaW5kaWNhdGlvbiBpZiBhY3RpdmVTcHMgY2hhbmdlcyAqLworICAgICAgICAgICAgICAgICAgICBzcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZDsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHBTdG9yYWdlLCBwcHNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBhcmFtIHNldCBhY3RpdmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOworICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOworICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRtcCA9PSBNRU1PUllfQUxMT0NBVElPTl9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSDI2NEJTRF9NRU1BTExPQ19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwc0lkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VxUGFyYW1TZXRfdCAqb2xkU1BTID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcVBhcmFtU2V0X3QgKm5ld1NQUyA9IHBTdG9yYWdlLT5hY3RpdmVTcHM7CisgICAgICAgICAgICAgICAgICAgICAgICB1MzIgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwU3RvcmFnZS0+b2xkU3BzSWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFNQUyA9IHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPm9sZFNwc0lkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKnJlYWRCeXRlcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX1RSVUU7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYobmFsVW5pdC5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZygmbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cm0sIG5ld1NQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXQubmFsVW5pdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IEhBTlRST19OT0s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0bXAgIT0gSEFOVFJPX09LKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnICE9IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAocFN0b3JhZ2UtPmRwYi0+bm9SZW9yZGVyaW5nKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+cGljV2lkdGhJbk1icyAhPSBuZXdTUFMtPnBpY1dpZHRoSW5NYnMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTLT5waWNIZWlnaHRJbk1icyAhPSBuZXdTUFMtPnBpY0hlaWdodEluTWJzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+bWF4RHBiU2l6ZSAhPSBuZXdTUFMtPm1heERwYlNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5kcGItPmZsdXNoZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm9sZFNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9IRFJTX1JEWSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiByZXR1cm4gZXJyb3IgaWYgc2Vjb25kIHBoYXNlIG9mCisgICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSDI2NEJTRF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVTbGljZUhlYWRlcigmc3RybSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyICsgMSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcywgcFN0b3JhZ2UtPmFjdGl2ZVBwcywgJm5hbFVuaXQpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJTTElDRV9IRUFERVIiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUocFN0b3JhZ2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bShwU3RvcmFnZS0+ZHBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlclsxXS5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0Lm5hbFJlZklkYyAhPSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJHYXBzIGluIGZyYW1lIG51bSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHN0b3JlIHNsaWNlIGhlYWRlciB0byBzdG9yYWdlIGlmIHN1Y2Nlc3NmdWxseSBkZWNvZGVkICovCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzBdID0gcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzFdOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnByZXZOYWxVbml0WzBdID0gbmFsVW5pdDsKKworICAgICAgICAgICAgICAgIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcChwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUpOworCisgICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdChwU3RvcmFnZS0+ZHBiLAorICAgICAgICAgICAgICAgICAgICAmcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlJlb3JkZXJpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgREFUQSwgRklSU1QgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlKSk7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVNsaWNlRGF0YSgmc3RybSwgcFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UsIHBTdG9yYWdlLT5zbGljZUhlYWRlcik7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNMSUNFX0RBVEEiKTsKKyAgICAgICAgICAgICAgICAgICAgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGgyNjRic2RJc0VuZE9mUGljdHVyZShwU3RvcmFnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2tpcFJlZHVuZGFudFNsaWNlcyA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQUxfU0VJOgorICAgICAgICAgICAgICAgIERFQlVHKCgiU0VJIE1FU1NBR0UsIE5PVCBERUNPREVEIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIERFQlVHKCgiTk9UIElNUExFTUVOVEVEIFlFVCAlZFxuIixuYWxVbml0Lm5hbFVuaXRUeXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGljUmVhZHkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsdGVyUGljdHVyZShwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+bWIpOworCisgICAgICAgIGgyNjRic2RSZXNldFN0b3JhZ2UocFN0b3JhZ2UpOworCisgICAgICAgIHBpY09yZGVyQ250ID0gaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBTdG9yYWdlLT5wb2MsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXIsIHBTdG9yYWdlLT5wcmV2TmFsVW5pdCk7CisKKyAgICAgICAgaWYgKHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnByZXZOYWxVbml0LT5uYWxSZWZJZGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwKKyAgICAgICAgICAgICAgICAgICAgJnBTdG9yYWdlLT5zbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZywKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCisgICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KKyAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogbm9uLXJlZmVyZW5jZSBwaWN0dXJlLCBqdXN0IHN0b3JlIGZvciBwb3NzaWJsZSBkaXNwbGF5CisgICAgICAgICAgICAgKiByZW9yZGVyaW5nICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCisgICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KKyAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHJldHVybihIMjY0QlNEX1BJQ19SRFkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybihIMjY0QlNEX1JEWSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2h1dGRvd24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU2h1dGRvd24gYSBkZWNvZGVyIGluc3RhbmNlLiBGdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yaWVzCisgICAgICAgICAgICBhbGxvY2F0ZWQgZm9yIHRoZSBkZWNvZGVyIGluc3RhbmNlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkU2h1dGRvd24oc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOyBpKyspCisgICAgeworICAgICAgICBpZiAocFN0b3JhZ2UtPnNwc1tpXSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldLT5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaV0tPnZ1aVBhcmFtZXRlcnMpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOyBpKyspCisgICAgeworICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1tpXSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5ydW5MZW5ndGgpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT50b3BMZWZ0KTsKKyAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpXS0+Ym90dG9tUmlnaHQpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5zbGljZUdyb3VwSWQpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZSRUUocFN0b3JhZ2UtPm1iTGF5ZXIpOworICAgIEZSRUUocFN0b3JhZ2UtPm1iKTsKKyAgICBGUkVFKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwKTsKKworICAgIGgyNjRic2RGcmVlRHBiKHBTdG9yYWdlLT5kcGIpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBuZXh0IG91dHB1dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBpY0lkICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQorICAgICAgICAgICAgaXNJZHJQaWMgICAgSURSIGZsYWcgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQorICAgICAgICAgICAgbnVtRXJyTWJzICAgbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgcGljdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBwaWN0dXJlIGRhdGEKKyAgICAgICAgICAgIE5VTEwgaWYgbm8gcGljdHVyZXMgYXZhaWxhYmxlIGZvciBkaXNwbGF5CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3U4KiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpwaWNJZCwgdTMyICppc0lkclBpYywKKyAgICB1MzIgKm51bUVyck1icykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBkcGJPdXRQaWN0dXJlX3QgKnBPdXQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBwT3V0ID0gaDI2NGJzZERwYk91dHB1dFBpY3R1cmUocFN0b3JhZ2UtPmRwYik7CisKKyAgICBpZiAocE91dCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgKnBpY0lkID0gcE91dC0+cGljSWQ7CisgICAgICAgICppc0lkclBpYyA9IHBPdXQtPmlzSWRyOworICAgICAgICAqbnVtRXJyTWJzID0gcE91dC0+bnVtRXJyTWJzOworICAgICAgICByZXR1cm4gKHBPdXQtPmRhdGEpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVUxMKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQaWNXaWR0aAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgd2lkdGggb2YgdGhlIHBpY3R1cmUgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwaWN0dXJlIHdpZHRoCisgICAgICAgICAgICAwIGlmIHBhcmFtZXRlcnMgc2V0cyBub3QgeWV0IGFjdGl2YXRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFBpY1dpZHRoKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCisgICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybigwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQaWNIZWlnaHQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGhlaWdodCBvZiB0aGUgcGljdHVyZSBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBpY3R1cmUgd2lkdGgKKyAgICAgICAgICAgIDAgaWYgcGFyYW1ldGVycyBzZXRzIG5vdCB5ZXQgYWN0aXZhdGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUGljSGVpZ2h0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCisgICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oMCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCdWZmZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmx1c2ggdGhlIGRlY29kZWQgcGljdHVyZSBidWZmZXIsIHNlZSBkcGIuYyBmb3IgZGV0YWlscworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGbHVzaEJ1ZmZlcihzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIGFueSB2YWxpZCBwYXJhbWV0ZXIgc2V0IGNvbWJpbmF0aW9ucyAoU1BTL1BQUykgZXhpc3RzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgMSAgICAgICBhdCBsZWFzdCBvbmUgdmFsaWQgU1BTL1BQUyBjb21iaW5hdGlvbiBmb3VuZAorICAgICAgICAgICAgMCAgICAgICBubyB2YWxpZCBwYXJhbSBzZXQgY29tYmluYXRpb25zIGZvdW5kCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgcmV0dXJuKGgyNjRic2RWYWxpZFBhcmFtU2V0cyhwU3RvcmFnZSkgPT0gSEFOVFJPX09LID8gMSA6IDApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFZpZGVvUmFuZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHZhbHVlIG9mIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAxICAgdmlkZW9fZnVsbF9yYW5nZV9mbGFnIHJlY2VpdmVkIGFuZCB2YWx1ZSBpcyAxCisgICAgICAgICAgICAwICAgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkVmlkZW9SYW5nZShzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvRnVsbFJhbmdlRmxhZykKKyAgICAgICAgcmV0dXJuKDEpOworICAgIGVsc2UgLyogZGVmYXVsdCB2YWx1ZSBvZiB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgaXMgMCAqLworICAgICAgICByZXR1cm4oMCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCB2YWx1ZSBvZiBtYXRyaXhfY29lZmZpY2llbnRzIHJlY2VpdmVkIGluIHRoZSBWVUkgZGF0YQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgdmFsdWUgb2YgbWF0cml4X2NvZWZmaWNpZW50cyBpZiByZWNlaXZlZAorICAgICAgICAgICAgMiAgIG90aGVyd2lzZSAodGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnKQorICAgICAgICByZXR1cm4ocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzKTsKKyAgICBlbHNlIC8qIGRlZmF1bHQgdW5zcGVjaWZpZWQgKi8KKyAgICAgICAgcmV0dXJuKDIpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaGgyNjRic2RDcm9wcGluZ1BhcmFtcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgY3JvcHBpbmcgcGFyYW1ldGVycyBvZiB0aGUgYWN0aXZlIFNQUworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgY3JvcHBpbmdGbGFnICAgIGZsYWcgaW5kaWNhdGluZyBpZiBjcm9wcGluZyBwYXJhbXMgcHJlc2VudCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZCBoZXJlCisgICAgICAgICAgICBsZWZ0T2Zmc2V0ICAgICAgY3JvcHBpbmcgbGVmdCBvZmZzZXQgaW4gcGl4ZWxzIGlzIHN0b3JlZCBoZXJlCisgICAgICAgICAgICB3aWR0aCAgICAgICAgICAgd2lkdGggb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCisgICAgICAgICAgICB0b3BPZmZzZXQgICAgICAgY3JvcHBpbmcgdG9wIG9mZnNldCBpbiBwaXhlbHMgaXMgc3RvcmVkIGhlcmUKKyAgICAgICAgICAgIGhlaWdodCAgICAgICAgICBoZWlnaHQgb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpjcm9wcGluZ0ZsYWcsCisgICAgdTMyICpsZWZ0T2Zmc2V0LCB1MzIgKndpZHRoLCB1MzIgKnRvcE9mZnNldCwgdTMyICpoZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wcGluZ0ZsYWcpCisgICAgeworICAgICAgICAqY3JvcHBpbmdGbGFnID0gMTsKKyAgICAgICAgKmxlZnRPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wTGVmdE9mZnNldDsKKyAgICAgICAgKndpZHRoID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzIC0KKyAgICAgICAgICAgICAgICAgMiAqIChwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BSaWdodE9mZnNldCk7CisgICAgICAgICp0b3BPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wVG9wT2Zmc2V0OworICAgICAgICAqaGVpZ2h0ID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyAtCisgICAgICAgICAgICAgICAgICAyICogKHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcFRvcE9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpjcm9wcGluZ0ZsYWcgPSAwOworICAgICAgICAqbGVmdE9mZnNldCA9IDA7CisgICAgICAgICp3aWR0aCA9IDA7CisgICAgICAgICp0b3BPZmZzZXQgPSAwOworICAgICAgICAqaGVpZ2h0ID0gMDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFzcGVjdCByYXRpbyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHNhcldpZHRoICAgIHNhbXBsZSBhc3BlY3QgcmF0aW8gaGVpZ2h0CisgICAgICAgICAgICBzYXJIZWlnaHQgICBzYW1wbGUgYXNwZWN0IHJhdGlvIHdpZHRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqc2FyV2lkdGgsIHUzMiAqc2FySGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKyAgICB1MzIgdyA9IDE7CisgICAgdTMyIGggPSAxOworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZyApCisgICAgeworICAgICAgICBzd2l0Y2ggKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19VTlNQRUNJRklFRDogIHcgPSAgIDA7IGggPSAgMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xXzE6ICAgICAgICAgIHcgPSAgIDE7IGggPSAgMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMl8xMTogICAgICAgIHcgPSAgMTI7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMF8xMTogICAgICAgIHcgPSAgMTA7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNl8xMTogICAgICAgIHcgPSAgMTY7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT180MF8zMzogICAgICAgIHcgPSAgNDA7IGggPSAzMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yNF8xMTogICAgICAgIHcgPSAgMjQ7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yMF8xMTogICAgICAgIHcgPSAgMjA7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18zMl8xMTogICAgICAgIHcgPSAgMzI7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT184MF8zMzogICAgICAgIHcgPSAgODA7IGggPSAzMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xOF8xMTogICAgICAgIHcgPSAgMTg7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNV8xMTogICAgICAgIHcgPSAgMTU7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT182NF8zMzogICAgICAgIHcgPSAgNjQ7IGggPSAzMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNjBfOTk6ICAgICAgIHcgPSAxNjA7IGggPSA5OTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19FWFRFTkRFRF9TQVI6CisgICAgICAgICAgICAgICAgdyA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnNhcldpZHRoOworICAgICAgICAgICAgICAgIGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5zYXJIZWlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKCh3ID09IDApIHx8IChoID09IDApKQorICAgICAgICAgICAgICAgICAgICB3ID0gaCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHcgPSAwOworICAgICAgICAgICAgICAgIGggPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2V0IGFzcGVjdCByYXRpbyovCisgICAgKnNhcldpZHRoID0gdzsKKyAgICAqc2FySGVpZ2h0ID0gaDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcm9maWxlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBwcm9maWxlIGluZm9ybWF0aW9uIGZyb20gYWN0aXZlIFNQUworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcHJvZmlsZSAgIGN1cnJlbnQgcHJvZmlsZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIGgyNjRic2RQcm9maWxlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCisgICAgICAgIHJldHVybiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5wcm9maWxlSWRjOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzY1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfREVDT0RFUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19ERUNPREVSX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnVtZXJhdGVkIHJldHVybiB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyAqLworZW51bSB7CisgICAgSDI2NEJTRF9SRFksCisgICAgSDI2NEJTRF9QSUNfUkRZLAorICAgIEgyNjRCU0RfSERSU19SRFksCisgICAgSDI2NEJTRF9FUlJPUiwKKyAgICBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUiwKKyAgICBIMjY0QlNEX01FTUFMTE9DX0VSUk9SCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJbml0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBub091dHB1dFJlb3JkZXJpbmcpOwordTMyIGgyNjRic2REZWNvZGUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTggKmJ5dGVTdHJtLCB1MzIgbGVuLCB1MzIgcGljSWQsCisgICAgdTMyICpyZWFkQnl0ZXMpOwordm9pZCBoMjY0YnNkU2h1dGRvd24oc3RvcmFnZV90ICpwU3RvcmFnZSk7CisKK3U4KiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpwaWNJZCwgdTMyICppc0lkclBpYywKKyAgICB1MzIgKm51bUVyck1icyk7CisKK3UzMiBoMjY0YnNkUGljV2lkdGgoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit1MzIgaDI2NGJzZFBpY0hlaWdodChzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkVmlkZW9SYW5nZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordm9pZCBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpjcm9wcGluZ0ZsYWcsCisgICAgdTMyICpsZWZ0LCB1MzIgKndpZHRoLCB1MzIgKnRvcCwgdTMyICpoZWlnaHQpOwordm9pZCBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8oc3RvcmFnZV90ICpwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAqc2FyV2lkdGgsIHUzMiAqc2FySGVpZ2h0KTsKK3UzMiBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKwordm9pZCBoMjY0YnNkRmx1c2hCdWZmZXIoc3RvcmFnZV90ICpwU3RvcmFnZSk7CisKK3UzMiBoMjY0YnNkUHJvZmlsZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVDT0RFUl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTE3ZDBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jCkBAIC0wLDAgKzEsMTU4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIENvbXBhcmVQaWN0dXJlcworICAgICAgICAgIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdAorICAgICAgICAgIE1tY29wMQorICAgICAgICAgIE1tY29wMgorICAgICAgICAgIE1tY29wMworICAgICAgICAgIE1tY29wNAorICAgICAgICAgIE1tY29wNQorICAgICAgICAgIE1tY29wNgorICAgICAgICAgIGgyNjRic2RNYXJrRGVjUmVmUGljCisgICAgICAgICAgaDI2NGJzZEdldFJlZlBpY0RhdGEKKyAgICAgICAgICBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZQorICAgICAgICAgIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nCisgICAgICAgICAgaDI2NGJzZEluaXREcGIKKyAgICAgICAgICBoMjY0YnNkUmVzZXREcGIKKyAgICAgICAgICBoMjY0YnNkSW5pdFJlZlBpY0xpc3QKKyAgICAgICAgICBGaW5kRHBiUGljCisgICAgICAgICAgU2V0UGljTnVtcworICAgICAgICAgIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtCisgICAgICAgICAgRmluZFNtYWxsZXN0UGljT3JkZXJDbnQKKyAgICAgICAgICBPdXRwdXRQaWN0dXJlCisgICAgICAgICAgaDI2NGJzZERwYk91dHB1dFBpY3R1cmUKKyAgICAgICAgICBoMjY0YnNkRmx1c2hEcGIKKyAgICAgICAgICBoMjY0YnNkRnJlZURwYgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBtYWNyb3MgdG8gZGV0ZXJtaW5lIHBpY3R1cmUgc3RhdHVzLiBOb3RlIHRoYXQgSVNfU0hPUlRfVEVSTSBtYWNybyByZXR1cm5zCisgKiB0cnVlIGFsc28gZm9yIG5vbi1leGlzdGluZyBwaWN0dXJlcyBiZWNhdXNlIG5vbi1leGlzdGluZyBwaWN0dXJlcyBhcmUKKyAqIHJlZ2FyZGVkIHNob3J0IHRlcm0gcGljdHVyZXMgYWNjb3JkaW5nIHRvIEguMjY0IHN0YW5kYXJkICovCisjZGVmaW5lIElTX1JFRkVSRU5DRShhKSAoKGEpLnN0YXR1cykKKyNkZWZpbmUgSVNfRVhJU1RJTkcoYSkgKChhKS5zdGF0dXMgPiBOT05fRVhJU1RJTkcpCisjZGVmaW5lIElTX1NIT1JUX1RFUk0oYSkgXAorICAgICgoYSkuc3RhdHVzID09IE5PTl9FWElTVElORyB8fCAoYSkuc3RhdHVzID09IFNIT1JUX1RFUk0pCisjZGVmaW5lIElTX0xPTkdfVEVSTShhKSAoKGEpLnN0YXR1cyA9PSBMT05HX1RFUk0pCisKKy8qIG1hY3JvIHRvIHNldCBhIHBpY3R1cmUgdW51c2VkIGZvciByZWZlcmVuY2UgKi8KKyNkZWZpbmUgU0VUX1VOVVNFRChhKSAoYSkuc3RhdHVzID0gVU5VU0VEOworCisjZGVmaW5lIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgMTYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaTMyIENvbXBhcmVQaWN0dXJlcyhjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyKTsKKworc3RhdGljIHUzMiBNbWNvcDEoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcyk7CisKK3N0YXRpYyB1MzIgTW1jb3AyKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbG9uZ1Rlcm1QaWNOdW0pOworCitzdGF0aWMgdTMyIE1tY29wMyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zLAorICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KTsKKworc3RhdGljIHUzMiBNbWNvcDQoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4KTsKKworc3RhdGljIHUzMiBNbWNvcDUoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgdTMyIE1tY29wNihkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGZyYW1lTnVtLCBpMzIgcGljT3JkZXJDbnQsCisgICAgdTMyIGxvbmdUZXJtRnJhbWVJZHgpOworCitzdGF0aWMgdTMyIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKworc3RhdGljIGkzMiBGaW5kRHBiUGljKGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgcGljTnVtLCB1MzIgaXNTaG9ydFRlcm0pOworCitzdGF0aWMgdm9pZCBTZXRQaWNOdW1zKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyckZyYW1lTnVtKTsKKworc3RhdGljIGRwYlBpY3R1cmVfdCogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgdTMyIE91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgdm9pZCBTaGVsbFNvcnQoZHBiUGljdHVyZV90ICpwUGljLCB1MzIgbnVtKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBDb21wYXJlUGljdHVyZXMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gY29tcGFyZSBkcGIgcGljdHVyZXMsIHVzZWQgYnkgdGhlIFNoZWxsU29ydCgpIGZ1bmN0aW9uLgorICAgICAgICAgICAgT3JkZXIgb2YgdGhlIHBpY3R1cmVzIGFmdGVyIHNvcnRpbmcgc2hhbGwgYmUgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAxKSBzaG9ydCB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyBzdGFydGluZyB3aXRoIHRoZSBsYXJnZXN0CisgICAgICAgICAgICAgICAgICAgcGljTnVtCisgICAgICAgICAgICAgICAgMikgbG9uZyB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyBzdGFydGluZyB3aXRoIHRoZSBzbWFsbGVzdAorICAgICAgICAgICAgICAgICAgIGxvbmdUZXJtUGljTnVtCisgICAgICAgICAgICAgICAgMykgcGljdHVyZXMgdW51c2VkIGZvciByZWZlcmVuY2UgYnV0IG5lZWRlZCBmb3IgZGlzcGxheQorICAgICAgICAgICAgICAgIDQpIG90aGVyIHBpY3R1cmVzCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIC0xICAgICAgcGljIDEgaXMgZ3JlYXRlciB0aGFuIHBpYyAyCisgICAgICAgICAgICAgMCAgICAgIGVxdWFsIGZyb20gY29tcGFyaXNvbiBwb2ludCBvZiB2aWV3CisgICAgICAgICAgICAgMSAgICAgIHBpYyAyIGlzIGdyZWF0ZXIgdGhlbiBwaWMgMQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaTMyIENvbXBhcmVQaWN0dXJlcyhjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGRwYlBpY3R1cmVfdCAqcGljMSwgKnBpYzI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwdHIxKTsKKyAgICBBU1NFUlQocHRyMik7CisKKyAgICBwaWMxID0gKGRwYlBpY3R1cmVfdCopcHRyMTsKKyAgICBwaWMyID0gKGRwYlBpY3R1cmVfdCopcHRyMjsKKworICAgIC8qIGJvdGggYXJlIG5vbi1yZWZlcmVuY2UgcGljdHVyZXMsIGNoZWNrIGlmIG5lZWRlZCBmb3IgZGlzcGxheSAqLworICAgIGlmICghSVNfUkVGRVJFTkNFKCpwaWMxKSAmJiAhSVNfUkVGRVJFTkNFKCpwaWMyKSkKKyAgICB7CisgICAgICAgIGlmIChwaWMxLT50b0JlRGlzcGxheWVkICYmICFwaWMyLT50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgZWxzZSBpZiAoIXBpYzEtPnRvQmVEaXNwbGF5ZWQgJiYgcGljMi0+dG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICAvKiBvbmx5IHBpYyAxIG5lZWRlZCBmb3IgcmVmZXJlbmNlIC0+IGdyZWF0ZXIgKi8KKyAgICBlbHNlIGlmICghSVNfUkVGRVJFTkNFKCpwaWMyKSkKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAvKiBvbmx5IHBpYyAyIG5lZWRlZCBmb3IgcmVmZXJlbmNlIC0+IGdyZWF0ZXIgKi8KKyAgICBlbHNlIGlmICghSVNfUkVGRVJFTkNFKCpwaWMxKSkKKyAgICAgICAgcmV0dXJuKDEpOworICAgIC8qIGJvdGggYXJlIHNob3J0IHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIC0+IGNoZWNrIHBpY051bSAqLworICAgIGVsc2UgaWYgKElTX1NIT1JUX1RFUk0oKnBpYzEpICYmIElTX1NIT1JUX1RFUk0oKnBpYzIpKQorICAgIHsKKyAgICAgICAgaWYgKHBpYzEtPnBpY051bSA+IHBpYzItPnBpY051bSkKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UgaWYgKHBpYzEtPnBpY051bSA8IHBpYzItPnBpY051bSkKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICAvKiBvbmx5IHBpYyAxIGlzIHNob3J0IHRlcm0gLT4gZ3JlYXRlciAqLworICAgIGVsc2UgaWYgKElTX1NIT1JUX1RFUk0oKnBpYzEpKQorICAgICAgICByZXR1cm4oLTEpOworICAgIC8qIG9ubHkgcGljIDIgaXMgc2hvcnQgdGVybSAtPiBncmVhdGVyICovCisgICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMikpCisgICAgICAgIHJldHVybigxKTsKKyAgICAvKiBib3RoIGFyZSBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIC0+IGNoZWNrIHBpY051bSAoY29udGFpbnMgdGhlCisgICAgICogbG9uZ1Rlcm1QaWNOdW0gKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocGljMS0+cGljTnVtID4gcGljMi0+cGljTnVtKQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICBlbHNlIGlmIChwaWMxLT5waWNOdW0gPCBwaWMyLT5waWNOdW0pCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBiYXNlZCBvbgorICAgICAgICAgICAgcmVvcmRlcmluZyBjb21tYW5kcyByZWNlaXZlZCBpbiB0aGUgc2xpY2UgaGVhZGVyLiBTZWUgZGV0YWlscworICAgICAgICAgICAgb2YgdGhlIHByb2Nlc3MgaW4gdGhlIEguMjY0IHN0YW5kYXJkLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgICAgICBwb2ludGVyIHRvIGRwYiBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgb3JkZXIgICAgICAgICAgIHBvaW50ZXIgdG8gcmVvcmRlcmluZyBjb21tYW5kcworICAgICAgICAgICAgY3VyckZyYW1lTnVtICAgIGN1cnJlbnQgZnJhbWUgbnVtYmVyCisgICAgICAgICAgICBudW1SZWZJZHhBY3RpdmUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2UgaW5kaWNlcyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZHBiICAgICAgICAgICAgICdsaXN0JyBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIHJlb3JkZXJlZAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpZiBub24tZXhpc3RpbmcgcGljdHVyZXMgcmVmZXJyZWQgdG8gaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZW9yZGVyaW5nIGNvbW1hbmRzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUmVvcmRlclJlZlBpY0xpc3QoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICByZWZQaWNMaXN0UmVvcmRlcmluZ190ICpvcmRlciwKKyAgdTMyIGN1cnJGcmFtZU51bSwKKyAgdTMyIG51bVJlZklkeEFjdGl2ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaiwgaywgcGljTnVtUHJlZCwgcmVmSWR4OworICAgIGkzMiBwaWNOdW0sIHBpY051bU5vV3JhcCwgaW5kZXg7CisgICAgdTMyIGlzU2hvcnRUZXJtOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQob3JkZXIpOworICAgIEFTU0VSVChjdXJyRnJhbWVOdW0gPD0gZHBiLT5tYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKG51bVJlZklkeEFjdGl2ZSA8PSBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFKTsKKworICAgIC8qIHNldCBkcGIgcGljdHVyZSBudW1iZXJzIGZvciBzb3J0aW5nICovCisgICAgU2V0UGljTnVtcyhkcGIsIGN1cnJGcmFtZU51bSk7CisKKyAgICBpZiAoIW9yZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisKKyAgICByZWZJZHggICAgID0gMDsKKyAgICBwaWNOdW1QcmVkID0gY3VyckZyYW1lTnVtOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKG9yZGVyLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPCAzKQorICAgIHsKKyAgICAgICAgLyogc2hvcnQgdGVybSAqLworICAgICAgICBpZiAob3JkZXItPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvcmRlci0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwID0KKyAgICAgICAgICAgICAgICAgICAgKGkzMilwaWNOdW1QcmVkIC0gKGkzMilvcmRlci0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtOworICAgICAgICAgICAgICAgIGlmIChwaWNOdW1Ob1dyYXAgPCAwKQorICAgICAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgKz0gKGkzMilkcGItPm1heEZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpY051bU5vV3JhcCA9CisgICAgICAgICAgICAgICAgICAgIChpMzIpKHBpY051bVByZWQgKyBvcmRlci0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtKTsKKyAgICAgICAgICAgICAgICBpZiAocGljTnVtTm9XcmFwID49IChpMzIpZHBiLT5tYXhGcmFtZU51bSkKKyAgICAgICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwIC09IChpMzIpZHBiLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpY051bVByZWQgPSAodTMyKXBpY051bU5vV3JhcDsKKyAgICAgICAgICAgIHBpY051bSA9IHBpY051bU5vV3JhcDsKKyAgICAgICAgICAgIGlmICgodTMyKXBpY051bU5vV3JhcCA+IGN1cnJGcmFtZU51bSkKKyAgICAgICAgICAgICAgICBwaWNOdW0gLT0gKGkzMilkcGItPm1heEZyYW1lTnVtOworICAgICAgICAgICAgaXNTaG9ydFRlcm0gPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBsb25nIHRlcm0gKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwaWNOdW0gPSAoaTMyKW9yZGVyLT5jb21tYW5kW2ldLmxvbmdUZXJtUGljTnVtOworICAgICAgICAgICAgaXNTaG9ydFRlcm0gPSBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgfQorICAgICAgICAvKiBmaW5kIGNvcnJlc3BvbmRpbmcgcGljdHVyZSBmcm9tIGRwYiAqLworICAgICAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIGlzU2hvcnRUZXJtKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCB8fCAhSVNfRVhJU1RJTkcoZHBiLT5idWZmZXJbaW5kZXhdKSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAvKiBzaGlmdCBwaWN0dXJlcyAqLworICAgICAgICBmb3IgKGogPSBudW1SZWZJZHhBY3RpdmU7IGogPiByZWZJZHg7IGotLSkKKyAgICAgICAgICAgIGRwYi0+bGlzdFtqXSA9IGRwYi0+bGlzdFtqLTFdOworICAgICAgICAvKiBwdXQgcGljdHVyZSBpbnRvIHRoZSBsaXN0ICovCisgICAgICAgIGRwYi0+bGlzdFtyZWZJZHgrK10gPSAmZHBiLT5idWZmZXJbaW5kZXhdOworICAgICAgICAvKiByZW1vdmUgbGF0ZXIgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBwaWN0dXJlICovCisgICAgICAgIGZvciAoaiA9IGsgPSByZWZJZHg7IGogPD0gbnVtUmVmSWR4QWN0aXZlOyBqKyspCisgICAgICAgICAgICBpZihkcGItPmxpc3Rbal0gIT0gJmRwYi0+YnVmZmVyW2luZGV4XSkKKyAgICAgICAgICAgICAgICBkcGItPmxpc3RbaysrXSA9IGRwYi0+bGlzdFtqXTsKKworICAgICAgICBpKys7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhIHNob3J0LXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUgdW51c2VkIGZvcgorICAgICAgICAgICAgcmVmZXJlbmNlLCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byAxCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIHBpY3R1cmUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGJ1ZmZlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIE1tY29wMShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBpbmRleCwgcGljTnVtOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoY3VyclBpY051bSA8IGRwYi0+bWF4RnJhbWVOdW0pOworCisgICAgcGljTnVtID0gKGkzMiljdXJyUGljTnVtIC0gKGkzMilkaWZmZXJlbmNlT2ZQaWNOdW1zOworCisgICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgcGljTnVtLCBIQU5UUk9fVFJVRSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOworICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgaWYgKCFkcGItPmJ1ZmZlcltpbmRleF0udG9CZURpc3BsYXllZCkKKyAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhIGxvbmctdGVybSByZWZlcmVuY2UgcGljdHVyZSB1bnVzZWQgZm9yCisgICAgICAgICAgICByZWZlcmVuY2UsIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDIKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgcGljdHVyZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYnVmZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgTW1jb3AyKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbG9uZ1Rlcm1QaWNOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGluZGV4OworCisvKiBDb2RlICovCisKKyAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCAoaTMyKWxvbmdUZXJtUGljTnVtLCBIQU5UUk9fRkFMU0UpOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaW5kZXhdKTsKKyAgICBkcGItPm51bVJlZkZyYW1lcy0tOworICAgIGlmICghZHBiLT5idWZmZXJbaW5kZXhdLnRvQmVEaXNwbGF5ZWQpCisgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTW1jb3AzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGFzc2luZyBhIGxvbmdUZXJtRnJhbWVJZHggdG8gYSBzaG9ydC10ZXJtIHJlZmVyZW5jZQorICAgICAgICAgICAgZnJhbWUgKGkuZS4gdG8gY2hhbmdlIGl0IHRvIGEgbG9uZy10ZXJtIHJlZmVyZW5jZSBwaWN0dXJlKSwKKyAgICAgICAgICAgIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDMKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgc2hvcnQtdGVybSBwaWN0dXJlIGRvZXMgbm90IGV4aXN0IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIG9yIGlzIGEgbm9uLWV4aXN0aW5nIHBpY3R1cmUsIG9yIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdUZXJtRnJhbWVJZHggZ2l2ZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDMoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcywKKyAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgaW5kZXgsIHBpY051bTsKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRwYik7CisgICAgQVNTRVJUKGN1cnJQaWNOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKKworICAgIGlmICggKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgfHwKKyAgICAgICAgIChsb25nVGVybUZyYW1lSWR4ID4gZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4KSApCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIGNoZWNrIGlmIGEgbG9uZyB0ZXJtIHBpY3R1cmUgd2l0aCB0aGUgc2FtZSBsb25nVGVybUZyYW1lSWR4IGFscmVhZHkKKyAgICAgKiBleGlzdCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm1heFJlZkZyYW1lczsgaSsrKQorICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICh1MzIpZHBiLT5idWZmZXJbaV0ucGljTnVtID09IGxvbmdUZXJtRnJhbWVJZHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKKyAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgcGljTnVtID0gKGkzMiljdXJyUGljTnVtIC0gKGkzMilkaWZmZXJlbmNlT2ZQaWNOdW1zOworCisgICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgcGljTnVtLCBIQU5UUk9fVFJVRSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGlmICghSVNfRVhJU1RJTkcoZHBiLT5idWZmZXJbaW5kZXhdKSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgZHBiLT5idWZmZXJbaW5kZXhdLnN0YXR1cyA9IExPTkdfVEVSTTsKKyAgICBkcGItPmJ1ZmZlcltpbmRleF0ucGljTnVtID0gKGkzMilsb25nVGVybUZyYW1lSWR4OworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gc2V0IG1heExvbmdUZXJtRnJhbWVJZHgsCisgICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA0CisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDQoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBtYXhMb25nVGVybUZyYW1lSWR4OworCisgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bWF4UmVmRnJhbWVzOyBpKyspCisgICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCisgICAgICAgICAgKCAoKHUzMilkcGItPmJ1ZmZlcltpXS5waWNOdW0gPiBtYXhMb25nVGVybUZyYW1lSWR4KSB8fAorICAgICAgICAgICAgKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKKyAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07CisgICAgICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTW1jb3A1CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIG1hcmsgYWxsIHJlZmVyZW5jZSBwaWN0dXJlcyB1bnVzZWQgZm9yIHJlZmVyZW5jZSBhbmQKKyAgICAgICAgICAgIHNldCBtYXhMb25nVGVybUZyYW1lSWR4IHRvIE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTLAorICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gNS4gRnVuY3Rpb24gZmx1c2hlcworICAgICAgICAgICAgdGhlIGJ1ZmZlciBhbmQgcGxhY2VzIGFsbCBwaWN0dXJlcyB0aGF0IGFyZSBuZWVkZWQgZm9yIGRpc3BsYXkgaW50bworICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDUoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKElTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltpXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG91dHB1dCBhbGwgcGljdHVyZXMgKi8KKyAgICB3aGlsZSAoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSykKKyAgICAgICAgOworICAgIGRwYi0+bnVtUmVmRnJhbWVzID0gMDsKKyAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKKyAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9IDA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE1tY29wNgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBhc3NpZ24gbG9uZ1Rlcm1GcmFtZUlkeCB0byB0aGUgY3VycmVudCBwaWN0dXJlLAorICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gNgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpbnZhbGlkIGxvbmdUZXJtRnJhbWVJZHggb3Igbm8gcm9vbSBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBpbiB0aGUgYnVmZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgTW1jb3A2KGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIGkzMiBwaWNPcmRlckNudCwKKyAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBpZiAoIChkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPT0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMpIHx8CisgICAgICAgICAobG9uZ1Rlcm1GcmFtZUlkeCA+IGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCkgKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBjaGVjayBpZiBhIGxvbmcgdGVybSBwaWN0dXJlIHdpdGggdGhlIHNhbWUgbG9uZ1Rlcm1GcmFtZUlkeCBhbHJlYWR5CisgICAgICogZXhpc3QgYW5kIHJlbW92ZSBpdCBpZiBuZWNlc3NhcnkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5tYXhSZWZGcmFtZXM7IGkrKykKKyAgICAgICAgaWYgKElTX0xPTkdfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKKyAgICAgICAgICAodTMyKWRwYi0+YnVmZmVyW2ldLnBpY051bSA9PSBsb25nVGVybUZyYW1lSWR4KQorICAgICAgICB7CisgICAgICAgICAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2ldKTsKKyAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQpCisgICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQorICAgIHsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSA9IGZyYW1lTnVtOworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSAgID0gKGkzMilsb25nVGVybUZyYW1lSWR4OworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gcGljT3JkZXJDbnQ7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzICAgPSBMT05HX1RFUk07CisgICAgICAgIGlmIChkcGItPm5vUmVvcmRlcmluZykKKyAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gSEFOVFJPX1RSVUU7CisgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzKys7CisgICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIC8qIGlmIHRoZXJlIGlzIG5vIHJvb20sIHJldHVybiBhbiBlcnJvciAqLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE1hcmtEZWNSZWZQaWMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3MuIFRoaXMKKyAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYm90aCBmb3IgcmVmZXJlbmNlIGFuZCBub24tcmVmZXJlbmNlCisgICAgICAgICAgICBwaWN0dXJlcy4gIE5vbi1yZWZlcmVuY2UgcGljdHVyZXMgc2hhbGwgaGF2ZSBtYXJrIHBvaW50ZXIgc2V0IHRvCisgICAgICAgICAgICBOVUxMLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIERQQiBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbWFyayAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIGNvbW1hbmRzCisgICAgICAgICAgICBpbWFnZSAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgcGljdHVyZSB0byBiZSBwbGFjZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgZnJhbWVOdW0gICAgZnJhbWUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHBpY3R1cmUKKyAgICAgICAgICAgIHBpY09yZGVyQ250IHBpY3R1cmUgb3JkZXIgY291bnQgZm9yIHRoZSBjdXJyZW50IHBpY3R1cmUKKyAgICAgICAgICAgIGlzSWRyICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGN1cnJlbnQgcGljdHVyZSBpcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgSURSIHBpY3R1cmUKKyAgICAgICAgICAgIGN1cnJlbnRQaWNJZCAgICBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBwaWN0dXJlLCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLCBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgcGljdHVyZQorICAgICAgICAgICAgbnVtRXJyTWJzICAgICAgIG51bWJlciBvZiBjb25jZWFsZWQgbWFjcm9ibG9ja3MgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLCBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgcGljdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICAgICAnYnVmZmVyJyBtb2RpZmllZCwgcG9zc2libGUgb3V0cHV0IGZyYW1lcyBwbGFjZWQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgJ291dEJ1ZicKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgZmFpbHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE1hcmtEZWNSZWZQaWMoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICBkZWNSZWZQaWNNYXJraW5nX3QgKm1hcmssCisgIGltYWdlX3QgKmltYWdlLAorICB1MzIgZnJhbWVOdW0sCisgIGkzMiBwaWNPcmRlckNudCwKKyAgdTMyIGlzSWRyLAorICB1MzIgY3VycmVudFBpY0lkLAorICB1MzIgbnVtRXJyTWJzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBzdGF0dXM7CisgICAgdTMyIG1hcmtlZEFzTG9uZ1Rlcm07CisgICAgdTMyIHRvQmVEaXNwbGF5ZWQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworICAgIEFTU0VSVChtYXJrIHx8ICFpc0lkcik7CisgICAgQVNTRVJUKCFpc0lkciB8fCAoZnJhbWVOdW0gPT0gMCAmJiBwaWNPcmRlckNudCA9PSAwKSk7CisgICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBpZiAoaW1hZ2UtPmRhdGEgIT0gZHBiLT5jdXJyZW50T3V0LT5kYXRhKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJUUllJTkcgVE8gTUFSSyBOT04tQUxMT0NBVEVEIElNQUdFIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICBkcGItPmxhc3RDb250YWluc01tY281ID0gSEFOVFJPX0ZBTFNFOworICAgIHN0YXR1cyA9IEhBTlRST19PSzsKKworICAgIHRvQmVEaXNwbGF5ZWQgPSBkcGItPm5vUmVvcmRlcmluZyA/IEhBTlRST19GQUxTRSA6IEhBTlRST19UUlVFOworCisgICAgLyogbm9uLXJlZmVyZW5jZSBwaWN0dXJlLCBzdG9yZWQgZm9yIGRpc3BsYXkgcmVvcmRlcmluZyBwdXJwb3NlcyAqLworICAgIGlmIChtYXJrID09IE5VTEwpCisgICAgeworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IFVOVVNFRDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSA9IGZyYW1lTnVtOworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSA9IChpMzIpZnJhbWVOdW07CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljT3JkZXJDbnQgPSBwaWNPcmRlckNudDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKKyAgICAgICAgaWYgKCFkcGItPm5vUmVvcmRlcmluZykKKyAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKKyAgICB9CisgICAgLyogSURSIHBpY3R1cmUgKi8KKyAgICBlbHNlIGlmIChpc0lkcikKKyAgICB7CisKKyAgICAgICAgLyogaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0gbm90IGNhbGxlZCBmb3IgSURSIHBpY3R1cmVzIC0+IGhhdmUgdG8KKyAgICAgICAgICogcmVzZXQgbnVtT3V0IGFuZCBvdXRJbmRleCBoZXJlICovCisgICAgICAgIGRwYi0+bnVtT3V0ID0gZHBiLT5vdXRJbmRleCA9IDA7CisKKyAgICAgICAgLyogZmx1c2ggdGhlIGJ1ZmZlciAqLworICAgICAgICBNbWNvcDUoZHBiKTsKKyAgICAgICAgLyogaWYgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgd2FzIHNldCAtPiB0aGUgcGljdHVyZXMgcHJlY2VkaW5nIHRoZQorICAgICAgICAgKiBJRFIgcGljdHVyZSBzaGFsbCBub3QgYmUgb3V0cHV0IC0+IHNldCBvdXRwdXQgYnVmZmVyIGVtcHR5ICovCisgICAgICAgIGlmIChtYXJrLT5ub091dHB1dE9mUHJpb3JQaWNzRmxhZyB8fCBkcGItPm5vUmVvcmRlcmluZykKKyAgICAgICAgeworICAgICAgICAgICAgZHBiLT5udW1PdXQgPSAwOworICAgICAgICAgICAgZHBiLT5vdXRJbmRleCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFyay0+bG9uZ1Rlcm1SZWZlcmVuY2VGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IExPTkdfVEVSTTsKKyAgICAgICAgICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IFNIT1JUX1RFUk07CisgICAgICAgICAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKKyAgICAgICAgfQorICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtICA9IDA7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtICAgID0gMDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IDA7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IHRvQmVEaXNwbGF5ZWQ7CisgICAgICAgIGRwYi0+ZnVsbG5lc3MgPSAxOworICAgICAgICBkcGItPm51bVJlZkZyYW1lcyA9IDE7CisgICAgfQorICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWFya2VkQXNMb25nVGVybSA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgaWYgKG1hcmstPmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChtYXJrLT5vcGVyYXRpb25baV0ubWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtYXJrLT5vcGVyYXRpb25baV0ubWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDEoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5kaWZmZXJlbmNlT2ZQaWNOdW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wMihkcGIsIG1hcmstPm9wZXJhdGlvbltpXS5sb25nVGVybVBpY051bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAgTW1jb3AzKAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0uZGlmZmVyZW5jZU9mUGljTnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5tYXhMb25nVGVybUZyYW1lSWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wNShkcGIpOworICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5sYXN0Q29udGFpbnNNbWNvNSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A2KAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VkQXNMb25nVGVybSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogaW52YWxpZCBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX05PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZyhkcGIpOworICAgICAgICB9CisgICAgICAgIC8qIGlmIGN1cnJlbnQgcGljdHVyZSB3YXMgbm90IG1hcmtlZCBhcyBsb25nLXRlcm0gcmVmZXJlbmNlIGJ5CisgICAgICAgICAqIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uIDYgLT4gbWFyayBjdXJyZW50IGFzIHNob3J0CisgICAgICAgICAqIHRlcm0gYW5kIGluc2VydCBpdCBpbnRvIGRwYiAoaWYgdGhlcmUgaXMgcm9vbSkgKi8KKyAgICAgICAgaWYgKCFtYXJrZWRBc0xvbmdUZXJtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHBiLT5udW1SZWZGcmFtZXMgPCBkcGItPm1heFJlZkZyYW1lcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07CisgICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNOdW0gICA9IChpMzIpZnJhbWVOdW07CisgICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IHBpY09yZGVyQ250OworICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzICAgPSBTSE9SVF9URVJNOworICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IHRvQmVEaXNwbGF5ZWQ7CisgICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOworICAgICAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBubyByb29tICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX05PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRwYi0+Y3VycmVudE91dC0+aXNJZHIgPSBpc0lkcjsKKyAgICBkcGItPmN1cnJlbnRPdXQtPnBpY0lkID0gY3VycmVudFBpY0lkOworICAgIGRwYi0+Y3VycmVudE91dC0+bnVtRXJyTWJzID0gbnVtRXJyTWJzOworCisgICAgLyogZHBiIHdhcyBpbml0aWFsaXplZCB0byBub3QgdG8gcmVvcmRlciB0aGUgcGljdHVyZXMgLT4gb3V0cHV0IGN1cnJlbnQKKyAgICAgKiBwaWN0dXJlIGltbWVkaWF0ZWx5ICovCisgICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGRwYi0+bnVtT3V0ID09IDApOworICAgICAgICBBU1NFUlQoZHBiLT5vdXRJbmRleCA9PSAwKTsKKyAgICAgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmRhdGEgID0gZHBiLT5jdXJyZW50T3V0LT5kYXRhOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uaXNJZHIgPSBkcGItPmN1cnJlbnRPdXQtPmlzSWRyOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ucGljSWQgPSBkcGItPmN1cnJlbnRPdXQtPnBpY0lkOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ubnVtRXJyTWJzID0gZHBiLT5jdXJyZW50T3V0LT5udW1FcnJNYnM7CisgICAgICAgIGRwYi0+bnVtT3V0Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIG91dHB1dCBwaWN0dXJlcyBpZiBidWZmZXIgZnVsbCAqLworICAgICAgICB3aGlsZSAoZHBiLT5mdWxsbmVzcyA+IGRwYi0+ZHBiU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IE91dHB1dFBpY3R1cmUoZHBiKTsKKyAgICAgICAgICAgIEFTU0VSVChpID09IEhBTlRST19PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzb3J0IGRwYiAqLworICAgIFNoZWxsU29ydChkcGItPmJ1ZmZlciwgZHBiLT5kcGJTaXplKzEpOworCisgICAgcmV0dXJuKHN0YXR1cyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0UmVmUGljRGF0YQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBnZXQgcmVmZXJlbmNlIHBpY3R1cmUgZGF0YSBmcm9tIHRoZSByZWZlcmVuY2UgcGljdHVyZQorICAgICAgICAgICAgbGlzdAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIGRlc2lyZWQgcmVmZXJlbmNlIHBpY3R1cmUgZGF0YQorICAgICAgICAgICAgTlVMTCBpZiBpbnZhbGlkIGluZGV4IG9yIG5vbi1leGlzdGluZyBwaWN0dXJlIHJlZmVycmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3U4KiBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGluZGV4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgaWYoaW5kZXggPiAxNiB8fCBkcGItPmxpc3RbaW5kZXhdID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBlbHNlIGlmKCFJU19FWElTVElORygqZHBiLT5saXN0W2luZGV4XSkpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihkcGItPmxpc3RbaW5kZXhdLT5kYXRhKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RBbGxvY2F0ZURwYkltYWdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBpbWFnZS4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgcmVhbGx5IGFsbG9jYXRlIGFueSBtZW1vcnkgYnV0IHJlc2VydmVzIG9uZSBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICBwb3NpdGlvbnMgZm9yIGRlY29kaW5nIG9mIGN1cnJlbnQgcGljdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG1lbW9yeSBhcmVhIGZvciB0aGUgaW1hZ2UKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1OCogaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoICFkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgJiYKKyAgICAgICAgICAgICFJU19SRUZFUkVOQ0UoZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXSkgKTsKKyAgICBBU1NFUlQoZHBiLT5mdWxsbmVzcyA8PSAgZHBiLT5kcGJTaXplKTsKKworICAgIGRwYi0+Y3VycmVudE91dCA9IGRwYi0+YnVmZmVyICsgZHBiLT5kcGJTaXplOworCisgICAgcmV0dXJuKGRwYi0+Y3VycmVudE91dC0+ZGF0YSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHNsaWRpbmcgd2luZG93IHJlZmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3MuCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIG5vIHNob3J0LXRlcm0gcmVmZXJlbmNlIGZyYW1lIGZvdW5kIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIG1hcmtlZCB1bnVzZWQKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBpbmRleCwgcGljTnVtOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBpZiAoZHBiLT5udW1SZWZGcmFtZXMgPCBkcGItPm1heFJlZkZyYW1lcykKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmRleCA9IC0xOworICAgICAgICBwaWNOdW0gPSAwOworICAgICAgICAvKiBmaW5kIHRoZSBvbGRlc3Qgc2hvcnQgdGVybSBwaWN0dXJlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bVJlZkZyYW1lczsgaSsrKQorICAgICAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pKQorICAgICAgICAgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5waWNOdW0gPCBwaWNOdW0gfHwgaW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IChpMzIpaTsKKyAgICAgICAgICAgICAgICAgICAgcGljTnVtID0gZHBiLT5idWZmZXJbaV0ucGljTnVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4ID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaW5kZXhdKTsKKyAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2luZGV4XS50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdERwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBpbml0aWFsaXplIERQQi4gUmVzZXJ2ZXMgbWVtb3JpZXMgZm9yIHRoZSBidWZmZXIsCisgICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZSBsaXN0IGFuZCBvdXRwdXQgYnVmZmVyLiBkcGJTaXplIGluZGljYXRlcworICAgICAgICAgICAgdGhlIG1heGltdW0gRFBCIHNpemUgaW5kaWNhdGVkIGJ5IHRoZSBsZXZlbElkYyBpbiB0aGUgc3RyZWFtLgorICAgICAgICAgICAgSWYgbm9SZW9yZGVyaW5nIGZsYWcgaXMgRkFMU0UgdGhlIERQQiBzdG9yZXMgZHBiU2l6ZSBwaWN0dXJlcworICAgICAgICAgICAgZm9yIGRpc3BsYXkgcmVvcmRlcmluZyBwdXJwb3Nlcy4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICAgICAgICAgZmxhZyBpcyBUUlVFIHRoZSBEUEIgb25seSBzdG9yZXMgbWF4UmVmRnJhbWVzIHJlZmVyZW5jZSBwaWN0dXJlcworICAgICAgICAgICAgYW5kIG91dHB1dHMgYWxsIHRoZSBwaWN0dXJlcyBpbW1lZGlhdGVseS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBkcGJTaXplICAgICAgICAgc2l6ZSBvZiB0aGUgRFBCIChudW1iZXIgb2YgcGljdHVyZXMpCisgICAgICAgICAgICBtYXhSZWZGcmFtZXMgICAgbWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzCisgICAgICAgICAgICBtYXhGcmFtZU51bSAgICAgbWF4IGZyYW1lIG51bWJlcgorICAgICAgICAgICAgbm9SZW9yZGVyaW5nICAgIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBEUEIgZG9lcyBub3QgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmUgdG8gcmVvcmRlciBmcmFtZXMgZm9yIGRpc3BsYXkKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZHBiICAgICAgICAgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RvcmFnZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW5pdERwYigKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHUzMiBwaWNTaXplSW5NYnMsCisgIHUzMiBkcGJTaXplLAorICB1MzIgbWF4UmVmRnJhbWVzLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiBub1Jlb3JkZXJpbmcpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOworICAgIEFTU0VSVChtYXhSZWZGcmFtZXMgPD0gTUFYX05VTV9SRUZfUElDUyk7CisgICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBkcGJTaXplKTsKKyAgICBBU1NFUlQobWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChkcGJTaXplKTsKKworICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOworICAgIGRwYi0+bWF4UmVmRnJhbWVzICAgICAgICA9IE1BWChtYXhSZWZGcmFtZXMsIDEpOworICAgIGlmIChub1Jlb3JkZXJpbmcpCisgICAgICAgIGRwYi0+ZHBiU2l6ZSAgICAgICAgID0gZHBiLT5tYXhSZWZGcmFtZXM7CisgICAgZWxzZQorICAgICAgICBkcGItPmRwYlNpemUgICAgICAgICA9IGRwYlNpemU7CisgICAgZHBiLT5tYXhGcmFtZU51bSAgICAgICAgID0gbWF4RnJhbWVOdW07CisgICAgZHBiLT5ub1Jlb3JkZXJpbmcgICAgICAgID0gbm9SZW9yZGVyaW5nOworICAgIGRwYi0+ZnVsbG5lc3MgICAgICAgICAgICA9IDA7CisgICAgZHBiLT5udW1SZWZGcmFtZXMgICAgICAgID0gMDsKKyAgICBkcGItPnByZXZSZWZGcmFtZU51bSAgICAgPSAwOworCisgICAgQUxMT0NBVEUoZHBiLT5idWZmZXIsIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxLCBkcGJQaWN0dXJlX3QpOworICAgIGlmIChkcGItPmJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgIEgyNjRTd0RlY01lbXNldChkcGItPmJ1ZmZlciwgMCwKKyAgICAgICAgICAgIChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkqc2l6ZW9mKGRwYlBpY3R1cmVfdCkpOworICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUgKyAxOyBpKyspCisgICAgeworICAgICAgICAvKiBBbGxvY2F0ZSBuZWVkZWQgYW1vdW50IG9mIG1lbW9yeSwgd2hpY2ggaXM6CisgICAgICAgICAqIGltYWdlIHNpemUgKyAzMiArIDE1LCB3aGVyZSAzMiBjYW1lcyBmcm9tIHRoZSBmYWN0IHRoYXQgaW4gQVJNIE9wZW5NYXgKKyAgICAgICAgICogREwgaW1wbGVtZW50YXRpb24gRnVuY3Rpb25zIG1heSByZWFkIGJleW9uZCB0aGUgZW5kIG9mIGFuIGFycmF5LAorICAgICAgICAgKiBieSBhIG1heGltdW0gb2YgMzIgYnl0ZXMuIEFuZCArMTUgY2FtZXMgZm9yIHRoZSBuZWVkIHRvIGFsaWduIG1lbW9yeQorICAgICAgICAgKiB0byAxNi1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIEFMTE9DQVRFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAocGljU2l6ZUluTWJzKjM4NCArIDMyKzE1KSwgdTgpOworICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9IEFMSUdOKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAxNik7CisgICAgfQorCisgICAgQUxMT0NBVEUoZHBiLT5saXN0LCBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSwgZHBiUGljdHVyZV90Kik7CisgICAgQUxMT0NBVEUoZHBiLT5vdXRCdWYsIGRwYi0+ZHBiU2l6ZSsxLCBkcGJPdXRQaWN0dXJlX3QpOworCisgICAgaWYgKGRwYi0+bGlzdCA9PSBOVUxMIHx8IGRwYi0+b3V0QnVmID09IE5VTEwpCisgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICBIMjY0U3dEZWNNZW1zZXQoZHBiLT5saXN0LCAwLAorICAgICAgICAgICAgKChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkgKiBzaXplb2YoZHBiUGljdHVyZV90KikpICk7CisKKyAgICBkcGItPm51bU91dCA9IGRwYi0+b3V0SW5kZXggPSAwOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVzZXREcGIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gcmVzZXQgRFBCLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhbiBJRFIKKyAgICAgICAgICAgIHNsaWNlIChvdGhlciB0aGFuIHRoZSBmaXJzdCkgYWN0aXZhdGVzIG5ldyBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0LgorICAgICAgICAgICAgRnVuY3Rpb24gY2FsbHMgaDI2NGJzZEZyZWVEcGIgdG8gZnJlZSBvbGQgYWxsb2NhdGVkIG1lbW9yaWVzIGFuZAorICAgICAgICAgICAgaDI2NGJzZEluaXREcGIgdG8gcmUtaW5pdGlhbGl6ZSB0aGUgRFBCLiBTYW1lIGlucHV0cywgb3V0cHV0cyBhbmQKKyAgICAgICAgICAgIHJldHVybnMgYXMgZm9yIGgyNjRic2RJbml0RHBiLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFJlc2V0RHBiKAorICBkcGJTdG9yYWdlX3QgKmRwYiwKKyAgdTMyIHBpY1NpemVJbk1icywKKyAgdTMyIGRwYlNpemUsCisgIHUzMiBtYXhSZWZGcmFtZXMsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgdTMyIG5vUmVvcmRlcmluZykKK3sKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBpY1NpemVJbk1icyk7CisgICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBNQVhfTlVNX1JFRl9QSUNTKTsKKyAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IGRwYlNpemUpOworICAgIEFTU0VSVChtYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKGRwYlNpemUpOworCisgICAgaDI2NGJzZEZyZWVEcGIoZHBiKTsKKworICAgIHJldHVybiBoMjY0YnNkSW5pdERwYihkcGIsIHBpY1NpemVJbk1icywgZHBiU2l6ZSwgbWF4UmVmRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGcmFtZU51bSwgbm9SZW9yZGVyaW5nKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdFJlZlBpY0xpc3QKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0LiBGdW5jdGlvbiBqdXN0CisgICAgICAgICAgICBzZXRzIHBvaW50ZXJzIGluIHRoZSBsaXN0IGFjY29yZGluZyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLgorICAgICAgICAgICAgVGhlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gcGljdHVyZXMgc29ydGVkIGFjY29yZGluZyB0bworICAgICAgICAgICAgd2hhdCB0aGUgSC4yNjQgc3RhbmRhcmQgc2F5cyBhYm91dCBpbml0aWFsIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZHBiICAgICBwb2ludGVyIHRvIGRwYiBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICdsaXN0JyBmaWVsZCBpbml0aWFsaXplZAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEluaXRSZWZQaWNMaXN0KGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKKyAgICAgICAgZHBiLT5saXN0W2ldID0gJmRwYi0+YnVmZmVyW2ldOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmluZERwYlBpYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmaW5kIGEgcmVmZXJlbmNlIHBpY3R1cmUgZnJvbSB0aGUgYnVmZmVyLiBUaGUgcGljdHVyZQorICAgICAgICAgICAgdG8gYmUgZm91bmQgaXMgaWRlbnRpZmllZCBieSBwaWNOdW0gYW5kIGlzU2hvcnRUZXJtIGZsYWcuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwaWN0dXJlIGluIHRoZSBidWZmZXIKKyAgICAgICAgICAgIC0xIGlmIHRoZSBzcGVjaWZpZWQgcGljdHVyZSB3YXMgbm90IGZvdW5kIGluIHRoZSBidWZmZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGkzMiBGaW5kRHBiUGljKGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgcGljTnVtLCB1MzIgaXNTaG9ydFRlcm0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGkgPSAwOworICAgIHUzMiBmb3VuZCA9IEhBTlRST19GQUxTRTsKKworLyogQ29kZSAqLworCisgICAgaWYgKGlzU2hvcnRUZXJtKQorICAgIHsKKyAgICAgICAgd2hpbGUgKGkgPCBkcGItPm1heFJlZkZyYW1lcyAmJiAhZm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJU19TSE9SVF9URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQorICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFTU0VSVChwaWNOdW0gPj0gMCk7CisgICAgICAgIHdoaWxlIChpIDwgZHBiLT5tYXhSZWZGcmFtZXMgJiYgIWZvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQorICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kKQorICAgICAgICByZXR1cm4oKGkzMilpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybigtMSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBTZXRQaWNOdW1zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHNldCBwaWNOdW0gdmFsdWVzIGZvciBzaG9ydC10ZXJtIHBpY3R1cmVzIGluIHRoZQorICAgICAgICAgICAgYnVmZmVyLiBOdW1iZXJpbmcgb2YgcGljdHVyZXMgaXMgYmFzZWQgb24gZnJhbWUgbnVtYmVycyBhbmQgYXMKKyAgICAgICAgICAgIGZyYW1lIG51bWJlcnMgYXJlIG1vZHVsbyBtYXhGcmFtZU51bSAtPiBmcmFtZSBudW1iZXJzIG9mIG9sZGVyCisgICAgICAgICAgICBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIG1heSBiZSBiaWdnZXIgdGhhbiB0aGUgY3VyckZyYW1lTnVtLgorICAgICAgICAgICAgcGljTnVtcyB3aWxsIGJlIHNldCBzbyB0aGF0IGN1cnJlbnQgZnJhbWUgaGFzIHRoZSBsYXJnZXN0IHBpY051bQorICAgICAgICAgICAgYW5kIGFsbCB0aGUgc2hvcnQtdGVybSBmcmFtZXMgaW4gdGhlIGJ1ZmZlciB3aWxsIGdldCBzbWFsbGVyIHBpY051bQorICAgICAgICAgICAgcmVwcmVzZW50aW5nIHRoZWlyICJkaXN0YW5jZSIgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4gVGhpcworICAgICAgICAgICAgZnVuY3Rpb24ga2luZCBvZiBtYXBzIHRoZSBtb2R1bG8gYXJpdGhtZXRpYyBiYWNrIHRvIG5vcm1hbC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgU2V0UGljTnVtcyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJGcmFtZU51bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICBpMzIgZnJhbWVOdW1XcmFwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKyAgICBBU1NFUlQoY3VyckZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKKyAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZnJhbWVOdW0gPiBjdXJyRnJhbWVOdW0pCisgICAgICAgICAgICAgICAgZnJhbWVOdW1XcmFwID0KKyAgICAgICAgICAgICAgICAgICAgKGkzMilkcGItPmJ1ZmZlcltpXS5mcmFtZU51bSAtIChpMzIpZHBiLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZU51bVdyYXAgPSAoaTMyKWRwYi0+YnVmZmVyW2ldLmZyYW1lTnVtOworICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0ucGljTnVtID0gZnJhbWVOdW1XcmFwOworICAgICAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjaGVjayBnYXBzIGluIGZyYW1lX251bSBhbmQgZ2VuZXJhdGUgbm9uLWV4aXN0aW5nCisgICAgICAgICAgICAoc2hvcnQgdGVybSkgcmVmZXJlbmNlIHBpY3R1cmVzIGlmIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzaG91bGQKKyAgICAgICAgICAgIGJlIGNhbGxlZCBvbmx5IGZvciBub24tSURSIHBpY3R1cmVzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBmcmFtZU51bSAgICBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcGljdHVyZQorICAgICAgICAgICAgaXNSZWZQaWMgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiBjdXJyZW50IHBpY3R1cmUgaXMgYSByZWZlcmVuY2Ugb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1yZWZlcmVuY2UgcGljdHVyZQorICAgICAgICAgICAgZ2Fwc0FsbG93ZWQgRmxhZyB3aGljaCBpbmRpY2F0ZXMgYWN0aXZlIFNQUyBzdGFuY2Ugb24gd2hldGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsb3cgZ2FwcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICAgICAnYnVmZmVyJyBwb3NzaWJseSBtb2RpZmllZCBieSBpbnNlcnRpbmcgbm9uLWV4aXN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlcyB3aXRoIHNsaWRpbmcgd2luZG93IG1hcmtpbmcgcHJvY2VzcworCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICBlcnJvciBpbiBzbGlkaW5nIHdpbmRvdyByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSBlcXVhbCB0byBwcmV2aW91cyByZWZlcmVuY2UgZnJhbWUgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVmZXJlbmNlIHBpY3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIHUzMiBpc1JlZlBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZ2Fwc0FsbG93ZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtOworICAgIHU4ICp0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworICAgIEFTU0VSVChkcGItPmZ1bGxuZXNzIDw9IGRwYi0+ZHBiU2l6ZSk7CisgICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBkcGItPm51bU91dCA9IDA7CisgICAgZHBiLT5vdXRJbmRleCA9IDA7CisKKyAgICBpZighZ2Fwc0FsbG93ZWQpCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworCisgICAgaWYgKCAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pICYmCisgICAgICAgICAoZnJhbWVOdW0gIT0gKChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bSkpKQorICAgIHsKKworICAgICAgICB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSA9IChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bTsKKworICAgICAgICAvKiBzdG9yZSBkYXRhIHBvaW50ZXIgb2YgbGFzdCBidWZmZXIgcG9zaXRpb24gdG8gYmUgdXNlZCBhcyBuZXh0CisgICAgICAgICAqICJhbGxvY2F0ZWQiIGRhdGEgcG9pbnRlciBpZiBsYXN0IGJ1ZmZlciBwb3NpdGlvbiBhZnRlciB0aGlzIHByb2Nlc3MKKyAgICAgICAgICogY29udGFpbnMgZGF0YSBwb2ludGVyIGxvY2F0ZWQgaW4gb3V0QnVmIChidWZmZXIgcGxhY2VkIGluIHRoZSBvdXRwdXQKKyAgICAgICAgICogc2hhbGwgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjdXJyZW50IHBpY3R1cmUpICovCisgICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgU2V0UGljTnVtcyhkcGIsIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtKTsKKworICAgICAgICAgICAgaWYgKFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogb3V0cHV0IHBpY3R1cmVzIGlmIGJ1ZmZlciBmdWxsICovCisgICAgICAgICAgICB3aGlsZSAoZHBiLT5mdWxsbmVzcyA+PSBkcGItPmRwYlNpemUpCisgICAgICAgICAgICB7CisjaWZkZWYgX0FTU0VSVF9VU0VECisgICAgICAgICAgICAgICAgQVNTRVJUKCFkcGItPm5vUmVvcmRlcmluZyk7CisgICAgICAgICAgICAgICAgQVNTRVJUKE91dHB1dFBpY3R1cmUoZHBiKSA9PSBIQU5UUk9fT0spOworI2Vsc2UKKyAgICAgICAgICAgICAgICBPdXRwdXRQaWN0dXJlKGRwYik7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYWRkIHRvIGVuZCBvZiBsaXN0ICovCisgICAgICAgICAgICBBU1NFUlQoICFkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgIUlTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdKSApOworICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5zdGF0dXMgPSBOT05fRVhJU1RJTkc7CisgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmZyYW1lTnVtID0gdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW07CisgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnBpY051bSAgID0gKGkzMil1blVzZWRTaG9ydFRlcm1GcmFtZU51bTsKKyAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0ucGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOworICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKKworICAgICAgICAgICAgLyogc29ydCB0aGUgYnVmZmVyICovCisgICAgICAgICAgICBTaGVsbFNvcnQoZHBiLT5idWZmZXIsIGRwYi0+ZHBiU2l6ZSsxKTsKKworICAgICAgICAgICAgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gPSAodW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gKyAxKSAlCisgICAgICAgICAgICAgICAgZHBiLT5tYXhGcmFtZU51bTsKKworICAgICAgICB9IHdoaWxlICh1blVzZWRTaG9ydFRlcm1GcmFtZU51bSAhPSBmcmFtZU51bSk7CisKKyAgICAgICAgLyogcGljdHVyZXMgcGxhY2VkIGluIG91dHB1dCBidWZmZXIgLT4gY2hlY2sgdGhhdCAnZGF0YScgaW4KKyAgICAgICAgICogYnVmZmVyIHBvc2l0aW9uIGRwYlNpemUgaXMgbm90IGluIHRoZSBvdXRwdXQgYnVmZmVyICh0aGlzIHdpbGwgYmUKKyAgICAgICAgICogImFsbG9jYXRlZCIgYnkgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UpLiBJZiBpdCBpcyAtPiBleGNoYW5nZSBkYXRhCisgICAgICAgICAqIHBvaW50ZXIgd2l0aCB0aGUgb25lIHN0b3JlZCBpbiB0aGUgYmVnaW5uaW5nICovCisgICAgICAgIGlmIChkcGItPm51bU91dCkKKyAgICAgICAgeworICAgICAgICAgICAgdTMyIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bU91dDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkcGItPm91dEJ1ZltpXS5kYXRhID09IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgYnVmZmVyIHBvc2l0aW9uIGNvbnRhaW5pbmcgZGF0YSBwb2ludGVyIHN0b3JlZCBpbgorICAgICAgICAgICAgICAgICAgICAgKiB0bXAgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+ZHBiU2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZGF0YSA9PSB0bXApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmRhdGEgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGkgPCBkcGItPmRwYlNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogZnJhbWVOdW0gZm9yIHJlZmVyZW5jZSBwaWN0dXJlcyBzaGFsbCBub3QgYmUgdGhlIHNhbWUgYXMgZm9yIHByZXZpb3VzCisgICAgICogcmVmZXJlbmNlIHBpY3R1cmUsIG90aGVyd2lzZSBhY2Nlc3NlcyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIGNhbm5vdAorICAgICAqIGJlIHNvbHZlZCB1bmFtYmlndW91c2x5ICovCisgICAgZWxzZSBpZiAoaXNSZWZQaWMgJiYgZnJhbWVOdW0gPT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogc2F2ZSBjdXJyZW50IGZyYW1lX251bSBpbiBwcmV2UmVmRnJhbWVOdW0uIEZvciBub24tcmVmZXJlbmNlIGZyYW1lCisgICAgICogcHJldkZyYW1lTnVtIGlzIHNldCB0byBmcmFtZSBudW1iZXIgb2YgbGFzdCBub24tZXhpc3RpbmcgZnJhbWUgYWJvdmUgKi8KKyAgICBpZiAoaXNSZWZQaWMpCisgICAgICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0gZnJhbWVOdW07CisgICAgZWxzZSBpZiAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCisgICAgeworICAgICAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9CisgICAgICAgICAgICAoZnJhbWVOdW0gKyBkcGItPm1heEZyYW1lTnVtIC0gMSkgJSBkcGItPm1heEZyYW1lTnVtOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmluZCBwaWN0dXJlIHdpdGggc21hbGxlc3QgcGljdHVyZSBvcmRlciBjb3VudC4gVGhpcworICAgICAgICAgICAgd2lsbCBiZSB0aGUgbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHBpY3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2RwYlBpY3R1cmVfdCogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgaTMyIHBpY09yZGVyQ250OworICAgIGRwYlBpY3R1cmVfdCAqdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKworICAgIHBpY09yZGVyQ250ID0gMHg3RkZGRkZGRjsKKyAgICB0bXAgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8PSBkcGItPmRwYlNpemU7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkICYmCisgICAgICAgICAgICAoZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQgPCBwaWNPcmRlckNudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyICsgaTsKKyAgICAgICAgICAgIHBpY09yZGVyQ250ID0gZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4odG1wKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE91dHB1dFBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gcHV0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIG5vIHBpY3R1cmVzIHRvIGRpc3BsYXkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgZHBiUGljdHVyZV90ICp0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworCisgICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGIpOworCisgICAgLyogbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkICovCisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uZGF0YSAgPSB0bXAtPmRhdGE7CisgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmlzSWRyID0gdG1wLT5pc0lkcjsKKyAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ucGljSWQgPSB0bXAtPnBpY0lkOworICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5udW1FcnJNYnMgPSB0bXAtPm51bUVyck1iczsKKyAgICBkcGItPm51bU91dCsrOworCisgICAgdG1wLT50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOworICAgIGlmICghSVNfUkVGRVJFTkNFKCp0bXApKQorICAgIHsKKyAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERwYk91dHB1dFBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZ2V0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGZyb20gdGhlIG91dHB1dCBidWZmZXIuCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAgICAgcG9pbnRlciB0byBvdXRwdXQgcGljdHVyZSBzdHJ1Y3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8KKyAgICAgICAgICAgIGRpc3BsYXkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZHBiT3V0UGljdHVyZV90KiBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworCisgICAgaWYgKGRwYi0+b3V0SW5kZXggPCBkcGItPm51bU91dCkKKyAgICAgICAgcmV0dXJuKGRwYi0+b3V0QnVmICsgZHBiLT5vdXRJbmRleCsrKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVUxMKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaERwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmbHVzaCB0aGUgRFBCLiBGdW5jdGlvbiBwdXRzIGFsbCBwaWN0dXJlcyBuZWVkZWQgZm9yCisgICAgICAgICAgICBkaXNwbGF5IGludG8gdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUgY2FsbGVkIGluCisgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gdG8gb2J0YWluIHBpY3R1cmVzIGJ1ZmZlcmVkIGZvciBkaXNwbGF5CisgICAgICAgICAgICByZS1vcmRlcmluZyBwdXJwb3Nlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkRmx1c2hEcGIoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKyAgICAvKiBkb24ndCBkbyBhbnl0aGluZyBpZiBidWZmZXIgbm90IHJlc2VydmVkICovCisgICAgaWYgKGRwYi0+YnVmZmVyKQorICAgIHsKKyAgICAgICAgZHBiLT5mbHVzaGVkID0gMTsKKyAgICAgICAgLyogb3V0cHV0IGFsbCBwaWN0dXJlcyAqLworICAgICAgICB3aGlsZSAoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSykKKyAgICAgICAgICAgIDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRnJlZURwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmcmVlIG1lbW9yaWVzIHJlc2VydmVkIGZvciB0aGUgRFBCLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGcmVlRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKworICAgIGlmIChkcGItPmJ1ZmZlcikKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUrMTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBGUkVFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBGUkVFKGRwYi0+YnVmZmVyKTsKKyAgICBGUkVFKGRwYi0+bGlzdCk7CisgICAgRlJFRShkcGItPm91dEJ1Zik7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBTaGVsbFNvcnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU29ydCBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLiBGdW5jdGlvbiBpbXBsZW1lbnRzIFNoZWxsJ3MgbWV0aG9kLAorICAgICAgICAgICAgaS5lLiBkaW1pbmlzaGluZyBpbmNyZW1lbnQgc29ydC4gU2VlIGUuZy4gIk51bWVyaWNhbCBSZWNpcGVzIGluIEMiCisgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgU2hlbGxTb3J0KGRwYlBpY3R1cmVfdCAqcFBpYywgdTMyIG51bSkKK3sKKworICAgIHUzMiBpLCBqOworICAgIHUzMiBzdGVwOworICAgIGRwYlBpY3R1cmVfdCB0bXBQaWM7CisKKyAgICBzdGVwID0gNzsKKworICAgIHdoaWxlIChzdGVwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gc3RlcDsgaSA8IG51bTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXBQaWMgPSBwUGljW2ldOworICAgICAgICAgICAgaiA9IGk7CisgICAgICAgICAgICB3aGlsZSAoaiA+PSBzdGVwICYmIENvbXBhcmVQaWN0dXJlcyhwUGljICsgaiAtIHN0ZXAsICZ0bXBQaWMpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUGljW2pdID0gcFBpY1tqLXN0ZXBdOworICAgICAgICAgICAgICAgIGogLT0gc3RlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBQaWNbal0gPSB0bXBQaWM7CisgICAgICAgIH0KKyAgICAgICAgc3RlcCA+Pj0gMTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlMjUwODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfRFBCX0gKKyNkZWZpbmUgSDI2NFNXREVDX0RQQl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnVtZXJhdGlvbiB0byByZXByZXNlbnQgc3RhdHVzIG9mIGJ1ZmZlcmVkIGltYWdlICovCit0eXBlZGVmIGVudW0geworICAgIFVOVVNFRCA9IDAsCisgICAgTk9OX0VYSVNUSU5HLAorICAgIFNIT1JUX1RFUk0sCisgICAgTE9OR19URVJNCit9IGRwYlBpY3R1cmVTdGF0dXNfZTsKKworLyogc3RydWN0dXJlIHRvIHJlcHJlc2VudCBhIGJ1ZmZlcmVkIHBpY3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1OCAqZGF0YTsgICAgICAgICAgIC8qIDE2LWJ5dGUgYWxpZ25lZCBwb2ludGVyIG9mIHBBbGxvY2F0ZWREYXRhICovCisgICAgdTggKnBBbGxvY2F0ZWREYXRhOyAvKiBhbGxvY2F0ZWQgcGljdHVyZSBwb2ludGVyOyAoc2l6ZSArIDE1KSBieXRlcyAqLworICAgIGkzMiBwaWNOdW07CisgICAgdTMyIGZyYW1lTnVtOworICAgIGkzMiBwaWNPcmRlckNudDsKKyAgICBkcGJQaWN0dXJlU3RhdHVzX2Ugc3RhdHVzOworICAgIHUzMiB0b0JlRGlzcGxheWVkOworICAgIHUzMiBwaWNJZDsKKyAgICB1MzIgbnVtRXJyTWJzOworICAgIHUzMiBpc0lkcjsKK30gZHBiUGljdHVyZV90OworCisvKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGRpc3BsYXkgaW1hZ2Ugb3V0cHV0IGZyb20gdGhlIGJ1ZmZlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHU4ICpkYXRhOworICAgIHUzMiBwaWNJZDsKKyAgICB1MzIgbnVtRXJyTWJzOworICAgIHUzMiBpc0lkcjsKK30gZHBiT3V0UGljdHVyZV90OworCisvKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IERQQiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGRwYlBpY3R1cmVfdCAqYnVmZmVyOworICAgIGRwYlBpY3R1cmVfdCAqKmxpc3Q7CisgICAgZHBiUGljdHVyZV90ICpjdXJyZW50T3V0OworICAgIGRwYk91dFBpY3R1cmVfdCAqb3V0QnVmOworICAgIHUzMiBudW1PdXQ7CisgICAgdTMyIG91dEluZGV4OworICAgIHUzMiBtYXhSZWZGcmFtZXM7CisgICAgdTMyIGRwYlNpemU7CisgICAgdTMyIG1heEZyYW1lTnVtOworICAgIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4OworICAgIHUzMiBudW1SZWZGcmFtZXM7CisgICAgdTMyIGZ1bGxuZXNzOworICAgIHUzMiBwcmV2UmVmRnJhbWVOdW07CisgICAgdTMyIGxhc3RDb250YWluc01tY281OworICAgIHUzMiBub1Jlb3JkZXJpbmc7CisgICAgdTMyIGZsdXNoZWQ7Cit9IGRwYlN0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEluaXREcGIoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICB1MzIgcGljU2l6ZUluTWJzLAorICB1MzIgZHBiU2l6ZSwKKyAgdTMyIG51bVJlZkZyYW1lcywKKyAgdTMyIG1heEZyYW1lTnVtLAorICB1MzIgbm9SZW9yZGVyaW5nKTsKKwordTMyIGgyNjRic2RSZXNldERwYigKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHUzMiBwaWNTaXplSW5NYnMsCisgIHUzMiBkcGJTaXplLAorICB1MzIgbnVtUmVmRnJhbWVzLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiBub1Jlb3JkZXJpbmcpOworCit2b2lkIGgyNjRic2RJbml0UmVmUGljTGlzdChkcGJTdG9yYWdlX3QgKmRwYik7CisKK3U4KiBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShkcGJTdG9yYWdlX3QgKmRwYik7CisKK3U4KiBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGluZGV4KTsKKwordTMyIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdCgKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKm9yZGVyLAorICB1MzIgY3VyckZyYW1lTnVtLAorICB1MzIgbnVtUmVmSWR4QWN0aXZlKTsKKwordTMyIGgyNjRic2RNYXJrRGVjUmVmUGljKAorICBkcGJTdG9yYWdlX3QgKmRwYiwKKyAgZGVjUmVmUGljTWFya2luZ190ICptYXJrLAorICBpbWFnZV90ICppbWFnZSwKKyAgdTMyIGZyYW1lTnVtLAorICBpMzIgcGljT3JkZXJDbnQsCisgIHUzMiBpc0lkciwKKyAgdTMyIHBpY0lkLAorICB1MzIgbnVtRXJyTWJzKTsKKwordTMyIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIHUzMiBpc1JlZlBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZ2Fwc0FsbG93ZWQpOworCitkcGJPdXRQaWN0dXJlX3QqIGgyNjRic2REcGJPdXRwdXRQaWN0dXJlKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKwordm9pZCBoMjY0YnNkRmx1c2hEcGIoZHBiU3RvcmFnZV90ICpkcGIpOworCit2b2lkIGgyNjRic2RGcmVlRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfRFBCX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjkyODcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCisgICAgICAgICAgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHgtIGFuZCB5LWNvb3JkaW5hdGVzIGZvciBlYWNoIGJsb2NrLCBkZWZpbmVkIGluIGgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jICovCitleHRlcm4gY29uc3QgdTMyIGgyNjRic2RCbG9ja1hbXTsKK2V4dGVybiBjb25zdCB1MzIgaDI2NGJzZEJsb2NrWVtdOworCisvKiBjbGlwcGluZyB0YWJsZSwgZGVmaW5lZCBpbiBoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyAqLworZXh0ZXJuIGNvbnN0IHU4IGgyNjRic2RDbGlwW107CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKKyAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfTkVPTgordm9pZCBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGltYWdlX3QgKmltYWdlLCB1OCAqZGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgd2lkdGg7CisgICAgdTMyICpsdW0sICpjYiwgKmNyOworICAgIHUzMiAqcHRyOworICAgIHUzMiB0bXAxLCB0bXAyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoISgodTMyKWRhdGEmMHgzKSk7CisKKyAgICB3aWR0aCA9IGltYWdlLT53aWR0aDsKKworICAgIC8qbGludCAtc2F2ZSAtZTgyNiBsdW0sIGNiIGFuZCBjciB1c2VkIHRvIGNvcHkgNCBieXRlcyBhdCB0aGUgdGltZSwgZGlzYWJsZQorICAgICAqICJhcmVhIHRvbyBzbWFsbCIgaW5mbyBtZXNzYWdlICovCisgICAgbHVtID0gKHUzMiopaW1hZ2UtPmx1bWE7CisgICAgY2IgPSAodTMyKilpbWFnZS0+Y2I7CisgICAgY3IgPSAodTMyKilpbWFnZS0+Y3I7CisgICAgQVNTRVJUKCEoKHUzMilsdW0mMHgzKSk7CisgICAgQVNTRVJUKCEoKHUzMiljYiYweDMpKTsKKyAgICBBU1NFUlQoISgodTMyKWNyJjB4MykpOworCisgICAgcHRyID0gKHUzMiopZGF0YTsKKworICAgIHdpZHRoICo9IDQ7CisgICAgZm9yIChpID0gMTY7IGkgOyBpLS0pCisgICAgeworICAgICAgICB0bXAxID0gKnB0cisrOworICAgICAgICB0bXAyID0gKnB0cisrOworICAgICAgICAqbHVtKysgPSB0bXAxOworICAgICAgICAqbHVtKysgPSB0bXAyOworICAgICAgICB0bXAxID0gKnB0cisrOworICAgICAgICB0bXAyID0gKnB0cisrOworICAgICAgICAqbHVtKysgPSB0bXAxOworICAgICAgICAqbHVtKysgPSB0bXAyOworICAgICAgICBsdW0gKz0gd2lkdGgtNDsKKyAgICB9CisKKyAgICB3aWR0aCA+Pj0gMTsKKyAgICBmb3IgKGkgPSA4OyBpIDsgaS0tKQorICAgIHsKKyAgICAgICAgdG1wMSA9ICpwdHIrKzsKKyAgICAgICAgdG1wMiA9ICpwdHIrKzsKKyAgICAgICAgKmNiKysgPSB0bXAxOworICAgICAgICAqY2IrKyA9IHRtcDI7CisgICAgICAgIGNiICs9IHdpZHRoLTI7CisgICAgfQorCisgICAgZm9yIChpID0gODsgaSA7IGktLSkKKyAgICB7CisgICAgICAgIHRtcDEgPSAqcHRyKys7CisgICAgICAgIHRtcDIgPSAqcHRyKys7CisgICAgICAgICpjcisrID0gdG1wMTsKKyAgICAgICAgKmNyKysgPSB0bXAyOworICAgICAgICBjciArPSB3aWR0aC0yOworICAgIH0KKworfQorI2VuZGlmCisjaWZuZGVmIEgyNjRERUNfT01YREwKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBQcmVkaWN0aW9uIGZvciB0aGUgbWFjcm9ibG9jaworICAgICAgICAgICAgYW5kIHRoZSByZXNpZHVhbCBhcmUgZ2l2ZW4gc2VwYXJhdGVseSBhbmQgd2lsbCBiZSBjb21iaW5lZCB3aGlsZQorICAgICAgICAgICAgd3JpdGluZyB0aGUgZGF0YSB0byB0aGUgaW1hZ2UKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBkYXRhLCAyNTYgdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgbHVtYSBmb2xsb3dlZCBieSA2NCB2YWx1ZXMgZm9yIGJvdGggY2hyb21hIGNvbXBvbmVudHMKKyAgICAgICAgICAgIG1iTnVtICAgICAgIG51bWJlciBvZiB0aGUgbWFjcm9ibG9jaworICAgICAgICAgICAgcmVzaWR1YWwgICAgcG9pbnRlciB0byByZXNpZHVhbCBkYXRhLCAxNiAxNi1lbGVtZW50IGFycmF5cyBmb3IgbHVtYQorICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgNCAxNi1lbGVtZW50IGFycmF5cyBmb3IgYm90aCBjaHJvbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgaW1hZ2UgICAgICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSwgdTggKmRhdGEsCisgICAgICAgIGkzMiByZXNpZHVhbFtdWzE2XSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgcGljV2lkdGgsIHBpY1NpemU7CisgICAgdTggKmx1bSwgKmNiLCAqY3I7CisgICAgdTggKmltYWdlQmxvY2s7CisgICAgdTggKnRtcDsKKyAgICB1MzIgcm93LCBjb2w7CisgICAgdTMyIGJsb2NrOworICAgIHUzMiB4LCB5OworICAgIGkzMiAqcFJlczsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChpbWFnZSk7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOworICAgIEFTU0VSVCghKCh1MzIpZGF0YSYweDMpKTsKKworICAgIC8qIEltYWdlIHNpemUgaW4gbWFjcm9ibG9ja3MgKi8KKyAgICBwaWNXaWR0aCA9IGltYWdlLT53aWR0aDsKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBpbWFnZS0+aGVpZ2h0OworICAgIHJvdyA9IG1iTnVtIC8gcGljV2lkdGg7CisgICAgY29sID0gbWJOdW0gJSBwaWNXaWR0aDsKKworICAgIC8qIE91dHB1dCBtYWNyb2Jsb2NrIHBvc2l0aW9uIGluIG91dHB1dCBwaWN0dXJlICovCisgICAgbHVtID0gKGltYWdlLT5kYXRhICsgcm93ICogcGljV2lkdGggKiAyNTYgKyBjb2wgKiAxNik7CisgICAgY2IgPSAoaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgcm93ICogcGljV2lkdGggKiA2NCArIGNvbCAqIDgpOworICAgIGNyID0gKGNiICsgcGljU2l6ZSAqIDY0KTsKKworICAgIHBpY1dpZHRoICo9IDE2OworCisgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgMTY7IGJsb2NrKyspCisgICAgeworICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja107CisgICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrXTsKKworICAgICAgICBwUmVzID0gcmVzaWR1YWxbYmxvY2tdOworCisgICAgICAgIEFTU0VSVChwUmVzKTsKKworICAgICAgICB0bXAgPSBkYXRhICsgeSoxNiArIHg7CisgICAgICAgIGltYWdlQmxvY2sgPSBsdW0gKyB5KnBpY1dpZHRoICsgeDsKKworICAgICAgICBBU1NFUlQoISgodTMyKXRtcCYweDMpKTsKKyAgICAgICAgQVNTRVJUKCEoKHUzMilpbWFnZUJsb2NrJjB4MykpOworCisgICAgICAgIGlmIChJU19SRVNJRFVBTF9FTVBUWShwUmVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLypsaW50IC1lODI2ICovCisgICAgICAgICAgICBpMzIgKmluMzIgPSAoaTMyKil0bXA7CisgICAgICAgICAgICBpMzIgKm91dDMyID0gKGkzMiopaW1hZ2VCbG9jazsKKworICAgICAgICAgICAgLyogUmVzaWR1YWwgaXMgemVybyA9PiBjb3B5IHByZWRpY3Rpb24gYmxvY2sgdG8gb3V0cHV0ICovCisgICAgICAgICAgICB0bXAxID0gKmluMzI7ICBpbjMyICs9IDQ7CisgICAgICAgICAgICB0bXAyID0gKmluMzI7ICBpbjMyICs9IDQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAxOyBvdXQzMiArPSBwaWNXaWR0aC80OworICAgICAgICAgICAgKm91dDMyID0gdG1wMjsgb3V0MzIgKz0gcGljV2lkdGgvNDsKKyAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gNDsKKyAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICBSQU5HRV9DSEVDS19BUlJBWShwUmVzLCAtNTEyLCA1MTEsIDE2KTsKKworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGltYWdlID0gcHJlZGljdGlvbiArIHJlc2lkdWFsCisgICAgICAgICAgICAgKiBQcm9jZXNzIGZvdXIgcGl4ZWxzIGluIGEgbG9vcCAqLworICAgICAgICAgICAgZm9yIChpID0gNDsgaTsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDEgPSB0bXBbMF07CisgICAgICAgICAgICAgICAgdG1wMiA9ICpwUmVzKys7CisgICAgICAgICAgICAgICAgdG1wMyA9IHRtcFsxXTsKKyAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKKyAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzBdID0gKHU4KXRtcDE7CisgICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07CisgICAgICAgICAgICAgICAgdG1wMSA9IHRtcFsyXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzFdID0gKHU4KXRtcDM7CisgICAgICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07CisgICAgICAgICAgICAgICAgdG1wMyA9IHRtcFszXTsKKyAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzJdID0gKHU4KXRtcDE7CisgICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07CisgICAgICAgICAgICAgICAgdG1wICs9IDE2OworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbM10gPSAodTgpdG1wMzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrICs9IHBpY1dpZHRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwaWNXaWR0aCAvPSAyOworCisgICAgZm9yIChibG9jayA9IDE2OyBibG9jayA8PSAyMzsgYmxvY2srKykKKyAgICB7CisgICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrICYgMHgzXTsKKyAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2sgJiAweDNdOworCisgICAgICAgIHBSZXMgPSByZXNpZHVhbFtibG9ja107CisKKyAgICAgICAgQVNTRVJUKHBSZXMpOworCisgICAgICAgIHRtcCA9IGRhdGEgKyAyNTY7CisgICAgICAgIGltYWdlQmxvY2sgPSBjYjsKKworICAgICAgICBpZiAoYmxvY2sgPj0gMjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGltYWdlQmxvY2sgPSBjcjsKKyAgICAgICAgICAgIHRtcCArPSA2NDsKKyAgICAgICAgfQorCisgICAgICAgIHRtcCArPSB5KjggKyB4OworICAgICAgICBpbWFnZUJsb2NrICs9IHkqcGljV2lkdGggKyB4OworCisgICAgICAgIEFTU0VSVCghKCh1MzIpdG1wJjB4MykpOworICAgICAgICBBU1NFUlQoISgodTMyKWltYWdlQmxvY2smMHgzKSk7CisKKyAgICAgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHBSZXMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKmxpbnQgLWU4MjYgKi8KKyAgICAgICAgICAgIGkzMiAqaW4zMiA9IChpMzIqKXRtcDsKKyAgICAgICAgICAgIGkzMiAqb3V0MzIgPSAoaTMyKilpbWFnZUJsb2NrOworCisgICAgICAgICAgICAvKiBSZXNpZHVhbCBpcyB6ZXJvID0+IGNvcHkgcHJlZGljdGlvbiBibG9jayB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gMjsKKyAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsgIGluMzIgKz0gMjsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAyOyBvdXQzMiArPSBwaWNXaWR0aC80OworICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSAyOworICAgICAgICAgICAgdG1wMiA9ICppbjMyOworICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisKKyAgICAgICAgICAgIFJBTkdFX0NIRUNLX0FSUkFZKHBSZXMsIC01MTIsIDUxMSwgMTYpOworCisgICAgICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wMSA9IHRtcFswXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzFdOworICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOworICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMF0gPSAodTgpdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKKyAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzJdOworICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMV0gPSAodTgpdG1wMzsKKyAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzNdOworICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMl0gPSAodTgpdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gODsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzNdID0gKHU4KXRtcDM7CisgICAgICAgICAgICAgICAgaW1hZ2VCbG9jayArPSBwaWNXaWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZDdjMThjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19JTUFHRV9ICisjZGVmaW5lIEgyNjRTV0RFQ19JTUFHRV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHU4ICpkYXRhOworICAgIHUzMiB3aWR0aDsKKyAgICB1MzIgaGVpZ2h0OworICAgIC8qIGN1cnJlbnQgTUIncyBjb21wb25lbnRzICovCisgICAgdTggKmx1bWE7CisgICAgdTggKmNiOworICAgIHU4ICpjcjsKK30gaW1hZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKTsKKworI2lmbmRlZiBIMjY0REVDX09NWERMCit2b2lkIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1OCAqZGF0YSwKKyAgICBpMzIgcmVzaWR1YWxbXVsxNl0pOworI2VuZGlmCisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0lNQUdFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmE4MWM0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKQEAgLTAsMCArMSwxMDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEludGVyUHJlZGljdGlvbgorICAgICAgICAgIE12UHJlZGljdGlvbjE2eDE2CisgICAgICAgICAgTXZQcmVkaWN0aW9uMTZ4OAorICAgICAgICAgIE12UHJlZGljdGlvbjh4MTYKKyAgICAgICAgICBNdlByZWRpY3Rpb244eDgKKyAgICAgICAgICBNdlByZWRpY3Rpb24KKyAgICAgICAgICBNZWRpYW5GaWx0ZXIKKyAgICAgICAgICBHZXRJbnRlck5laWdoYm91cgorICAgICAgICAgIEdldFByZWRpY3Rpb25NdgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9yZWNvbnN0cnVjdC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGF2YWlsYWJsZTsKKyAgICB1MzIgcmVmSW5kZXg7CisgICAgbXZfdCBtdjsKK30gaW50ZXJOZWlnaGJvdXJfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIE12UHJlZGljdGlvbjE2eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCisgICAgZHBiU3RvcmFnZV90ICpkcGIpOworc3RhdGljIHUzMiBNdlByZWRpY3Rpb24xNng4KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCisgICAgZHBiU3RvcmFnZV90ICpkcGIpOworc3RhdGljIHUzMiBNdlByZWRpY3Rpb244eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCisgICAgZHBiU3RvcmFnZV90ICpkcGIpOworc3RhdGljIHUzMiBNdlByZWRpY3Rpb244eDgobWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYik7CitzdGF0aWMgdTMyIE12UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLAorICAgIHUzMiBtYlBhcnRJZHgsIHUzMiBzdWJNYlBhcnRJZHgpOworc3RhdGljIGkzMiBNZWRpYW5GaWx0ZXIoaTMyIGEsIGkzMiBiLCBpMzIgYyk7CisKK3N0YXRpYyB2b2lkIEdldEludGVyTmVpZ2hib3VyKHUzMiBzbGljZUlkLCBtYlN0b3JhZ2VfdCAqbk1iLAorICAgIGludGVyTmVpZ2hib3VyX3QgKm4sIHUzMiBpbmRleCk7CitzdGF0aWMgdm9pZCBHZXRQcmVkaWN0aW9uTXYobXZfdCAqbXYsIGludGVyTmVpZ2hib3VyX3QgKmEsIHUzMiByZWZJbmRleCk7CisKK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0FfU1VCX1BBUlRbNF1bNF1bNF0gPSB7CisgICAgeyB7IHtNQl9BLDV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDV9LCB7TUJfQSw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsNX0sIHtNQl9DVVJSLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw1fSwge01CX0NVUlIsMH0sIHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsMX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsMX0sIHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9IH0gfSwKKworICAgIHsgeyB7TUJfQSwxM30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsMTN9LCB7TUJfQSwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDEzfSwge01CX0NVUlIsOH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDEzfSwge01CX0NVUlIsOH0sIHtNQl9BLDE1fSwge01CX0NVUlIsMTB9IH0gfSwKKworICAgIHsgeyB7TUJfQ1VSUiw5fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LCB7TUJfQ1VSUiwxMX0sIHtNQl9DVVJSLDE0fSB9IH0gfTsKKworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQl9TVUJfUEFSVFs0XVs0XVs0XSA9IHsKKyAgICB7IHsge01CX0IsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDEwfSwge01CX0NVUlIsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDEwfSwge01CX0IsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxMH0sIHtNQl9CLDExfSwge01CX0NVUlIsMH0sIHtNQl9DVVJSLDF9IH0gfSwKKworICAgIHsgeyB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfQ1VSUiw0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfQiwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDE0fSwge01CX0IsMTV9LCB7TUJfQ1VSUiw0fSwge01CX0NVUlIsNX0gfSB9LAorCisgICAgeyB7IHtNQl9DVVJSLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsMn0sIHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDh9LCB7TUJfQ1VSUiw5fSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDEyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDd9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9DVVJSLDEyfSwge01CX0NVUlIsMTN9IH0gfSB9OworCitzdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9DX1NVQl9QQVJUWzRdWzRdWzRdID0geworICAgIHsgeyB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfTkEsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX0NVUlIsMX0sIHtNQl9OQSw0fSB9IH0sCisKKyAgICB7IHsge01CX0MsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxNX0sIHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTV9LCB7TUJfQywxMH0sIHtNQl9DVVJSLDV9LCB7TUJfTkEsMH0gfSB9LAorCisgICAgeyB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9OQSwxMn0gfSB9LAorCisgICAgeyB7IHtNQl9OQSwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfTkEsMn0sIHtNQl9OQSw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsN30sIHtNQl9OQSwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsN30sIHtNQl9OQSwyfSwge01CX0NVUlIsMTN9LCB7TUJfTkEsOH0gfSB9IH07CisKK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0RfU1VCX1BBUlRbNF1bNF1bNF0gPSB7CisgICAgeyB7IHtNQl9ELDE1fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfRCwxNX0sIHtNQl9BLDV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfRCwxNX0sIHtNQl9CLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0QsMTV9LCB7TUJfQiwxMH0sIHtNQl9BLDV9LCB7TUJfQ1VSUiwwfSB9IH0sCisKKyAgICB7IHsge01CX0IsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0NVUlIsMX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9IH0gfSwKKworICAgIHsgeyB7TUJfQSw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw3fSwge01CX0EsMTN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw3fSwge01CX0NVUlIsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSwge01CX0EsMTN9LCB7TUJfQ1VSUiw4fSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsM30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSB9IH0gfTsKKworCisjaWZkZWYgSDI2NERFQ19PTVhETAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlclByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50ZXIgbWFjcm9ibG9jay4gUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCisgICAgICAgICAgYW5kIHJlY29uc3RydWN0cyBwcmVkaWN0aW9uIG1hY3JvYmxvY2suIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jaworICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoY3VyckltYWdlKQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICAgICAgICAgIHBNYkxheWVyICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQorICAgICAgICAgIGRwYiAgICAgICAgICAgcG9pbnRlciB0byBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyCisgICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCisgICAgICAgICAgY3VyckltYWdlICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQorICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB3aGVyZSBwcmVkaWN0ZWQgbWFjcm9ibG9jayB3aWxsIGJlIHN0b3JlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIGN1cnJJbWFnZSAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBpbWFnZQorICAgICAgICAgIGRhdGEgICAgICAgICAgcHJlZGljdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCisgICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1iTnVtLCBpbWFnZV90ICpjdXJySW1hZ2UsIHU4ICpkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiB4LCB5OworICAgIHUzMiBjb2xBbmRSb3c7CisgICAgc3ViTWJQYXJ0TW9kZV9lIHN1YlBhcnRNb2RlOworICAgIGltYWdlX3QgcmVmSW1hZ2U7CisgICAgdTggZmlsbEJ1ZmZbMzIqMjEgKyAxNSArIDMyXTsKKyAgICB1OCAqcEZpbGw7CisgICAgdTMyIHRtcDsKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKworICAgIC8qIDE2LWJ5dGUgYWxpZ25tZW50ICovCisgICAgcEZpbGwgPSBBTElHTihmaWxsQnVmZiwgMTYpOworCisgICAgLyogc2V0IHJvdyBiaXRzIDE1OjAgKi8KKyAgICBjb2xBbmRSb3cgPSBtYk51bSAvIGN1cnJJbWFnZS0+d2lkdGg7CisgICAgLypzZXQgY29sIHRvIGJpdHMgMzE6MTYgKi8KKyAgICBjb2xBbmRSb3cgKz0gKG1iTnVtIC0gY29sQW5kUm93ICogY3VyckltYWdlLT53aWR0aCkgPDwgMTY7CisgICAgY29sQW5kUm93IDw8PSA0OworCisgICAgcmVmSW1hZ2Uud2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOworICAgIHJlZkltYWdlLmhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OworCisgICAgc3dpdGNoIChwTWItPm1iVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgUF9Ta2lwOgorICAgICAgICBjYXNlIFBfTDBfMTZ4MTY6CisgICAgICAgICAgICBpZiAoTXZQcmVkaWN0aW9uMTZ4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKKyAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoMDw8MTYpICsgKDE2PDw4KSArIDE2OworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKKyAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uMTZ4OChwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoMTY8PDgpICsgODsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworCisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzJdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICg4PDwxNikgKyAoMTY8PDgpICsgODsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzgsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBfTDBfTDBfOHgxNjoKKyAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHgxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoODw8OCkgKyAxNjsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsxXTsKKyAgICAgICAgICAgIHRtcCA9ICg4PDwyNCkgKyAoMDw8MTYpICsgKDg8PDgpICsgMTY7CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogUF84eDggYW5kIFBfOHg4cmVmMCAqLworICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDgocE1iLCAmcE1iTGF5ZXItPnN1Yk1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyW2ldOworICAgICAgICAgICAgICAgIHN1YlBhcnRNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUocE1iTGF5ZXItPnN1Yk1iUHJlZC5zdWJNYlR5cGVbaV0pOworICAgICAgICAgICAgICAgIHggPSBpICYgMHgxID8gOCA6IDA7CisgICAgICAgICAgICAgICAgeSA9IGkgPCAyID8gMCA6IDg7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJQYXJ0TW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg4OgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoODw8OCkgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg0OgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoODw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoKHkrNCk8PDE2KSArICg4PDw4KSArIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzR4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICgoeSs0KTw8MTYpICsgKDQ8PDgpICsgNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgoeCs0KTw8MjQpICsgKCh5KzQpPDwxNikgKyAoNDw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzMsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLworICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQorICAgICAgICByZXR1cm4gSEFOVFJPX09LOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQcm9jZXNzZXMgb25lIGludGVyIG1hY3JvYmxvY2suIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgorICAgICAgICAgIGFuZCByZWNvbnN0cnVjdHMgcHJlZGljdGlvbiBtYWNyb2Jsb2NrLiBXcml0ZXMgdGhlIGZpbmFsIG1hY3JvYmxvY2sKKyAgICAgICAgICAocHJlZGljdGlvbiArIHJlc2lkdWFsKSBpbnRvIHRoZSBvdXRwdXQgaW1hZ2UgKGN1cnJJbWFnZSkKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAgICAgICAgICBwTWJMYXllciAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KKyAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgorICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgorICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgcHJlZGljdGVkIG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBjdXJySW1hZ2UgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKKyAgICAgICAgICBkYXRhICAgICAgICAgIHByZWRpY3Rpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIEhBTlRST19PSyAgICAgc3VjY2VzcworICAgICAgICAgIEhBTlRST19OT0sgICAgZXJyb3IgaW4gbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1OCAqZGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgeCwgeTsKKyAgICB1MzIgcm93LCBjb2w7CisgICAgc3ViTWJQYXJ0TW9kZV9lIHN1YlBhcnRNb2RlOworICAgIGltYWdlX3QgcmVmSW1hZ2U7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKworICAgIHJvdyA9IG1iTnVtIC8gY3VyckltYWdlLT53aWR0aDsKKyAgICBjb2wgPSBtYk51bSAtIHJvdyAqIGN1cnJJbWFnZS0+d2lkdGg7CisgICAgcm93ICo9IDE2OworICAgIGNvbCAqPSAxNjsKKworICAgIHJlZkltYWdlLndpZHRoID0gY3VyckltYWdlLT53aWR0aDsKKyAgICByZWZJbWFnZS5oZWlnaHQgPSBjdXJySW1hZ2UtPmhlaWdodDsKKworICAgIHN3aXRjaCAocE1iLT5tYlR5cGUpCisgICAgeworICAgICAgICBjYXNlIFBfU2tpcDoKKyAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgorICAgICAgICAgICAgaWYgKE12UHJlZGljdGlvbjE2eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKKyAgICAgICAgICAgICAgICAxNiwgMTYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQX0wwX0wwXzE2eDg6CisgICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjE2eDgocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCAwLAorICAgICAgICAgICAgICAgIDE2LCA4KTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMl07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis4LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCA4LAorICAgICAgICAgICAgICAgIDE2LCA4KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUF9MMF9MMF84eDE2OgorICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKKyAgICAgICAgICAgICAgICA4LCAxNik7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzFdOworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCwgJnJlZkltYWdlLCBjb2wsIHJvdywgOCwgMCwKKyAgICAgICAgICAgICAgICA4LCAxNik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiBQXzh4OCBhbmQgUF84eDhyZWYwICovCisgICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4OChwTWIsICZwTWJMYXllci0+c3ViTWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbaV07CisgICAgICAgICAgICAgICAgc3ViUGFydE1vZGUgPQorICAgICAgICAgICAgICAgICAgICBoMjY0YnNkU3ViTWJQYXJ0TW9kZShwTWJMYXllci0+c3ViTWJQcmVkLnN1Yk1iVHlwZVtpXSk7CisgICAgICAgICAgICAgICAgeCA9IGkgJiAweDEgPyA4IDogMDsKKyAgICAgICAgICAgICAgICB5ID0gaSA8IDIgPyAwIDogODsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YlBhcnRNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDg6CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgOCwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA4LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHkrNCwgOCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzR4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA0LCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgrNCwgeSwgNCwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDQsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCs0LCB5LCA0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHkrNCwgNCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMywgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4KzQsIHkrNCwgNCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCisgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCisgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCisgICAgICAgIHJldHVybiBIQU5UUk9fT0s7CisKKyAgICBpZiAocE1iLT5tYlR5cGUgIT0gUF9Ta2lwKQorICAgIHsKKyAgICAgICAgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzKGN1cnJJbWFnZSwgbWJOdW0sIGRhdGEsCisgICAgICAgICAgICBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjE2eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgMTZ4MTYgcGFydGl0aW9uIG1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE12UHJlZGljdGlvbjE2eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIG12X3QgbXY7CisgICAgbXZfdCBtdlByZWQ7CisgICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCisgICAgdTMyIHJlZkluZGV4OworICAgIHU4ICp0bXA7CisgICAgdTMyICp0bXBNdjEsICp0bXBNdjI7CisKKy8qIENvZGUgKi8KKworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDUpOworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOworICAgIC8qbGludCAtLWUoNzQwKSAgVW51c3VhbCBwb2ludGVyIGNhc3QgKGluY29tcGF0aWJsZSBpbmRpcmVjdCB0eXBlcykgKi8KKyAgICB0bXBNdjEgPSAodTMyKikoJmFbMF0ubXYpOyAvKiB3ZSB0ZXN0IGp1c3QgdGhhdCBib3RoIE1WcyBhcmUgemVybyAqLworICAgIC8qbGludCAtLWUoNzQwKSAqLworICAgIHRtcE12MiA9ICh1MzIqKSgmYVsxXS5tdik7IC8qIGkuZS4gYVswXS5tdi5ob3IgPT0gMCAmJiBhWzBdLm12LnZlciA9PSAwICovCisgICAgaWYgKHBNYi0+bWJUeXBlID09IFBfU2tpcCAmJgorICAgICAgICAoIWFbMF0uYXZhaWxhYmxlIHx8ICFhWzFdLmF2YWlsYWJsZSB8fAorICAgICAgICAgKCBhWzBdLnJlZkluZGV4ID09IDAgJiYgKCh1MzIpKCp0bXBNdjEpID09IDApICkgfHwKKyAgICAgICAgICggYVsxXS5yZWZJbmRleCA9PSAwICYmICgodTMyKSgqdG1wTXYyKSA9PSAwKSApKSkKKyAgICB7CisgICAgICAgICAgICBtdi5ob3IgPSBtdi52ZXIgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOworICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKKyAgICAgICAgfQorCisgICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICAgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgICAgIG12LnZlciArPSBtdlByZWQudmVyOworCisgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0KKyAgICAgICAgICogKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KKyAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0KKyAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPQorICAgIHBNYi0+bXZbMTJdID0gcE1iLT5tdlsxM10gPSBwTWItPm12WzE0XSA9IHBNYi0+bXZbMTVdID0gbXY7CisKKyAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbMl0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZlBpY1szXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmQWRkclswXSA9IHRtcDsKKyAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzJdID0gdG1wOworICAgIHBNYi0+cmVmQWRkclszXSA9IHRtcDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uMTZ4OAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDE2eDggcGFydGl0aW9uIG1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE12UHJlZGljdGlvbjE2eDgobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgbXZfdCBtdjsKKyAgICBtdl90IG12UHJlZDsKKyAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KKyAgICB1MzIgcmVmSW5kZXg7CisgICAgdTggKnRtcDsKKworLyogQ29kZSAqLworCisgICAgbXYgPSBtYlByZWQtPm12ZEwwWzBdOworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOworCisgICAgaWYgKGFbMV0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCisgICAgICAgIG12UHJlZCA9IGFbMV0ubXY7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOworICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKKyAgICAgICAgfQorCisgICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICB9CisgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLworICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLworICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcE1iLT5tdlswXSA9IHBNYi0+bXZbMV0gPSBwTWItPm12WzJdID0gcE1iLT5tdlszXSA9CisgICAgcE1iLT5tdls0XSA9IHBNYi0+bXZbNV0gPSBwTWItPm12WzZdID0gcE1iLT5tdls3XSA9IG12OworICAgIHBNYi0+cmVmUGljWzBdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbMV0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMF0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzFdID0gdG1wOworCisgICAgbXYgPSBtYlByZWQtPm12ZEwwWzFdOworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFsxXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDEzKTsKKyAgICBpZiAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkKKyAgICAgICAgbXZQcmVkID0gYVswXS5tdjsKKyAgICBlbHNlCisgICAgeworICAgICAgICBhWzFdLmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOworICAgICAgICBhWzFdLnJlZkluZGV4ID0gcE1iLT5yZWZQaWNbMF07CisgICAgICAgIGFbMV0ubXYgPSBwTWItPm12WzBdOworCisgICAgICAgIC8qIGMgaXMgbm90IGF2YWlsYWJsZSAqLworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhKzIsIDcpOworCisgICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICB9CisgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLworICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLworICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcE1iLT5tdls4XSA9IHBNYi0+bXZbOV0gPSBwTWItPm12WzEwXSA9IHBNYi0+bXZbMTFdID0KKyAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OworICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMl0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb244eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgOHgxNiBwYXJ0aXRpb24gbW9kZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTXZQcmVkaWN0aW9uOHgxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBtdl90IG12OworICAgIG12X3QgbXZQcmVkOworICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLworICAgIHUzMiByZWZJbmRleDsKKyAgICB1OCAqdG1wOworCisvKiBDb2RlICovCisKKyAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07CisgICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzBdOworCisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7CisKKyAgICBpZiAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkKKyAgICAgICAgbXZQcmVkID0gYVswXS5tdjsKKyAgICBlbHNlCisgICAgeworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDEwKTsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsyLCAxNCk7CisgICAgICAgIGlmICghYVsyXS5hdmFpbGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkQsIGErMiwgMTUpOworICAgICAgICB9CisKKyAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKKworICAgIH0KKyAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKKworICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KKyAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPSBtdjsKKyAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZBZGRyWzBdID0gdG1wOworICAgIHBNYi0+cmVmQWRkclsyXSA9IHRtcDsKKworICAgIG12ID0gbWJQcmVkLT5tdmRMMFsxXTsKKyAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMV07CisKKyAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJDLCBhKzIsIDEwKTsKKyAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQorICAgIHsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsyLCAxMSk7CisgICAgfQorICAgIGlmIChhWzJdLnJlZkluZGV4ID09IHJlZkluZGV4KQorICAgICAgICBtdlByZWQgPSBhWzJdLm12OworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFbMF0uYXZhaWxhYmxlID0gSEFOVFJPX1RSVUU7CisgICAgICAgIGFbMF0ucmVmSW5kZXggPSBwTWItPnJlZlBpY1swXTsKKyAgICAgICAgYVswXS5tdiA9IHBNYi0+bXZbMF07CisKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxNCk7CisKKyAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKKworICAgIH0KKyAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKKworICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0KKyAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OworICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb244eDgKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciA4eDggcGFydGl0aW9uIG1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE12UHJlZGljdGlvbjh4OChtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgajsKKyAgICB1MzIgbnVtU3ViTWJQYXJ0OworCisvKiBDb2RlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgbnVtU3ViTWJQYXJ0ID0gaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlByZWQtPnN1Yk1iVHlwZVtpXSk7CisgICAgICAgIHBNYi0+cmVmUGljW2ldID0gc3ViTWJQcmVkLT5yZWZJZHhMMFtpXTsKKyAgICAgICAgcE1iLT5yZWZBZGRyW2ldID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCBzdWJNYlByZWQtPnJlZklkeEwwW2ldKTsKKyAgICAgICAgaWYgKHBNYi0+cmVmQWRkcltpXSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtU3ViTWJQYXJ0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChNdlByZWRpY3Rpb24ocE1iLCBzdWJNYlByZWQsIGksIGopICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE12UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZXJmb3JtIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3Igc3ViLXBhcnRpdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTXZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsIHUzMiBtYlBhcnRJZHgsCisgICAgdTMyIHN1Yk1iUGFydElkeCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBtdl90IG12LCBtdlByZWQ7CisgICAgdTMyIHJlZkluZGV4OworICAgIHN1Yk1iUGFydE1vZGVfZSBzdWJNYlBhcnRNb2RlOworICAgIGNvbnN0IG5laWdoYm91cl90ICpuOworICAgIG1iU3RvcmFnZV90ICpuTWI7CisgICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCisKKy8qIENvZGUgKi8KKworICAgIG12ID0gc3ViTWJQcmVkLT5tdmRMMFttYlBhcnRJZHhdW3N1Yk1iUGFydElkeF07CisgICAgc3ViTWJQYXJ0TW9kZSA9IGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iUHJlZC0+c3ViTWJUeXBlW21iUGFydElkeF0pOworICAgIHJlZkluZGV4ID0gc3ViTWJQcmVkLT5yZWZJZHhMMFttYlBhcnRJZHhdOworCisgICAgbiA9IE5fQV9TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKKyAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7CisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGEsIG4tPmluZGV4KTsKKworICAgIG4gPSBOX0JfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzEsIG4tPmluZGV4KTsKKworICAgIG4gPSBOX0NfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzIsIG4tPmluZGV4KTsKKworICAgIGlmICghYVsyXS5hdmFpbGFibGUpCisgICAgeworICAgICAgICBuID0gTl9EX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OworICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzIsIG4tPmluZGV4KTsKKyAgICB9CisKKyAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOworCisgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLworICAgIGlmICgoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBzd2l0Y2ggKHN1Yk1iUGFydE1vZGUpCisgICAgeworICAgICAgICBjYXNlIE1CX1NQXzh4ODoKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHhdID0gbXY7CisgICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMV0gPSBtdjsKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyXSA9IG12OworICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDNdID0gbXY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1CX1NQXzh4NDoKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyKnN1Yk1iUGFydElkeF0gPSBtdjsKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyKnN1Yk1iUGFydElkeCArIDFdID0gbXY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1CX1NQXzR4ODoKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyBzdWJNYlBhcnRJZHhdID0gbXY7CisgICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgc3ViTWJQYXJ0SWR4ICsgMl0gPSBtdjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUJfU1BfNHg0OgorICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIHN1Yk1iUGFydElkeF0gPSBtdjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTWVkaWFuRmlsdGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1lZGlhbiBmaWx0ZXJpbmcgZm9yIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpMzIgTWVkaWFuRmlsdGVyKGkzMiBhLCBpMzIgYiwgaTMyIGMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIG1heCxtaW4sbWVkOworCisvKiBDb2RlICovCisKKyAgICBtYXggPSBtaW4gPSBtZWQgPSBhOworICAgIGlmIChiID4gbWF4KQorICAgIHsKKyAgICAgICAgbWF4ID0gYjsKKyAgICB9CisgICAgZWxzZSBpZiAoYiA8IG1pbikKKyAgICB7CisgICAgICAgIG1pbiA9IGI7CisgICAgfQorICAgIGlmIChjID4gbWF4KQorICAgIHsKKyAgICAgICAgbWVkID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChjIDwgbWluKQorICAgIHsKKyAgICAgICAgbWVkID0gbWluOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtZWQgPSBjOworICAgIH0KKworICAgIHJldHVybihtZWQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEludGVyTmVpZ2hib3VyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBhdmFpbGFiaWxpdHksIHJlZmVyZW5jZSBpbmRleCBhbmQgbW90aW9uIHZlY3RvciBvZiBhIG5laWdoYm91cgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEdldEludGVyTmVpZ2hib3VyKHUzMiBzbGljZUlkLCBtYlN0b3JhZ2VfdCAqbk1iLAorICAgIGludGVyTmVpZ2hib3VyX3QgKm4sIHUzMiBpbmRleCkKK3sKKworICAgIG4tPmF2YWlsYWJsZSA9IEhBTlRST19GQUxTRTsKKyAgICBuLT5yZWZJbmRleCA9IDB4RkZGRkZGRkY7CisgICAgbi0+bXYuaG9yID0gbi0+bXYudmVyID0gMDsKKworICAgIGlmIChuTWIgJiYgKHNsaWNlSWQgPT0gbk1iLT5zbGljZUlkKSkKKyAgICB7CisgICAgICAgIHUzMiB0bXA7CisgICAgICAgIG12X3QgdG1wTXY7CisKKyAgICAgICAgdG1wID0gbk1iLT5tYlR5cGU7CisgICAgICAgIG4tPmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOworICAgICAgICAvKiBNYlBhcnRQcmVkTW9kZSAiaW5saW5lZCIgKi8KKyAgICAgICAgaWYgKHRtcCA8PSBQXzh4OHJlZjApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcE12ID0gbk1iLT5tdltpbmRleF07CisgICAgICAgICAgICB0bXAgPSBuTWItPnJlZlBpY1tpbmRleD4+Ml07CisgICAgICAgICAgICBuLT5yZWZJbmRleCA9IHRtcDsKKyAgICAgICAgICAgIG4tPm12ID0gdG1wTXY7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBHZXRQcmVkaWN0aW9uTXYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcHV0ZSBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBiYXNlZCBvbiBuZWlnaGJvdXJzIEEsIEIgYW5kIEMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBHZXRQcmVkaWN0aW9uTXYobXZfdCAqbXYsIGludGVyTmVpZ2hib3VyX3QgKmEsIHUzMiByZWZJbmRleCkKK3sKKworICAgIGlmICggYVsxXS5hdmFpbGFibGUgfHwgYVsyXS5hdmFpbGFibGUgfHwgIWFbMF0uYXZhaWxhYmxlKQorICAgIHsKKyAgICAgICAgdTMyIGlzQSwgaXNCLCBpc0M7CisgICAgICAgIGlzQSA9IChhWzBdLnJlZkluZGV4ID09IHJlZkluZGV4KSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgICAgICBpc0IgPSAoYVsxXS5yZWZJbmRleCA9PSByZWZJbmRleCkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAgICAgaXNDID0gKGFbMl0ucmVmSW5kZXggPT0gcmVmSW5kZXgpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgaWYgKCgodTMyKWlzQSsodTMyKWlzQisodTMyKWlzQykgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgbXYtPmhvciA9IChpMTYpTWVkaWFuRmlsdGVyKGFbMF0ubXYuaG9yLCBhWzFdLm12LmhvciwgYVsyXS5tdi5ob3IpOworICAgICAgICAgICAgbXYtPnZlciA9IChpMTYpTWVkaWFuRmlsdGVyKGFbMF0ubXYudmVyLCBhWzFdLm12LnZlciwgYVsyXS5tdi52ZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzQSkKKyAgICAgICAgICAgICptdiA9IGFbMF0ubXY7CisgICAgICAgIGVsc2UgaWYgKGlzQikKKyAgICAgICAgICAgICptdiA9IGFbMV0ubXY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICptdiA9IGFbMl0ubXY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICptdiA9IGFbMF0ubXY7CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTRkZWUyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19JTlRFUl9QUkVESUNUSU9OX0gKKyNkZWZpbmUgSDI2NFNXREVDX0lOVEVSX1BSRURJQ1RJT05fSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU5URVJfUFJFRElDVElPTl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1ZWFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCkBAIC0wLDAgKzEsMTkzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RJbnRyYVByZWRpY3Rpb24KKyAgICAgICAgICBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscworICAgICAgICAgIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgorICAgICAgICAgIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KKyAgICAgICAgICBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uCisgICAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsCisgICAgICAgICAgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbgorICAgICAgICAgIEdldDR4NE5laWdoYm91clBlbHMKKyAgICAgICAgICBXcml0ZTR4NFRvMTZ4MTYKKyAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTR4NERjUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbgorICAgICAgICAgIERldGVybWluZUludHJhNHg0UHJlZE1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgorICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICovCisvKmxpbnQgLWU3MDIgKi8KKworCisvKiB4LSBhbmQgeS1jb29yZGluYXRlcyBmb3IgZWFjaCBibG9jayAqLworY29uc3QgdTMyIGgyNjRic2RCbG9ja1hbMTZdID0KKyAgICB7IDAsIDQsIDAsIDQsIDgsIDEyLCA4LCAxMiwgMCwgNCwgMCwgNCwgOCwgMTIsIDgsIDEyIH07Citjb25zdCB1MzIgaDI2NGJzZEJsb2NrWVsxNl0gPQorICAgIHsgMCwgMCwgNCwgNCwgMCwgMCwgNCwgNCwgOCwgOCwgMTIsIDEyLCA4LCA4LCAxMiwgMTIgfTsKKworY29uc3QgdTggaDI2NGJzZENsaXBbMTI4MF0gPQoreworICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LAorICAgIDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLAorICAgIDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LAorICAgIDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLAorICAgIDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LAorICAgIDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LAorICAgIDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLAorICAgIDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywKKyAgICAxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsCisgICAgMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LAorICAgIDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwKKyAgICAxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsCisgICAgMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LAorICAgIDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywKKyAgICAyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksCisgICAgMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUKK307CisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgR2V0NHg0TmVpZ2hib3VyUGVscyh1OCAqYSwgdTggKmwsIHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBibG9ja051bSk7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOworc3RhdGljIHZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBBLCB1MzIgQik7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBBLCB1MzIgQik7CitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKKworc3RhdGljIHZvaWQgSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NEhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NERjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIEEsIHUzMiBCKTsKK3N0YXRpYyB2b2lkIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKK3N0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpOwordm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSk7CisKK3N0YXRpYyB2b2lkIFdyaXRlNHg0VG8xNngxNih1OCAqZGF0YSwgdTggKmRhdGE0eDQsIHUzMiBibG9ja051bSk7CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCitzdGF0aWMgdTMyIERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAorICAgIHUzMiBhdmFpbGFibGUsIG5laWdoYm91cl90ICpuQSwgbmVpZ2hib3VyX3QgKm5CLCB1MzIgaW5kZXgsCisgICAgbWJTdG9yYWdlX3QgKm5NYkEsIG1iU3RvcmFnZV90ICpuTWJCKTsKKworCisjaWZkZWYgSDI2NERFQ19PTVhETAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQKKyAgICAgICAgICByZXNpZHVhbCBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlCisgICAgICAgICAgc3RvcmVkIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTggKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisgICAgT01YUmVzdWx0IG9teFJlczsKKworLyogQ29kZSAqLworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocHRyKTsKKyAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKKworICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7CisgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKKyAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOworICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworCisgICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoIChwdHItMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsgKGF2YWlsYWJsZUE8PDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkpICk7CisgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQgcmVzaWR1YWwKKyAgICAgICAgICBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlIHN0b3JlZCBpbgorICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLiBUaGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaAorICAgICAgICAgIGJsb2NrIGlzIHN0b3JlZCBpbiAncE1iJyBzdHJ1Y3R1cmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnB0ciwgdTMyIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLCB1MzIgYmxvY2spCit7CisKKy8qIFZhcmlhYmxlcyAqLworICAgIHUzMiBtb2RlOworICAgIG5laWdoYm91cl90IG5laWdoYm91ciwgbmVpZ2hib3VyQjsKKyAgICBtYlN0b3JhZ2VfdCAqbk1iLCAqbk1iMjsKKyAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlQywgYXZhaWxhYmxlRDsKKworICAgIE9NWFJlc3VsdCBvbXhSZXM7CisgICAgdTMyIHgsIHk7CisgICAgdTggKmwsICphLCAqYWw7CisvKiBDb2RlICovCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChtYkxheWVyKTsKKyAgICBBU1NFUlQocHRyKTsKKyAgICBBU1NFUlQocE1iLT5pbnRyYTR4NFByZWRNb2RlW2Jsb2NrXSA8IDkpOworCisgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EoYmxvY2spOworICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7CisgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgeworICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIG5laWdoYm91ckIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9jayk7CisgICAgbk1iMiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ckIubWIpOworICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKKyAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYjItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgeworICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCisgICAgICAgICh1MzIpKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQiksCisgICAgICAgICZuZWlnaGJvdXIsICZuZWlnaGJvdXJCLCBibG9jaywgbk1iLCBuTWIyKTsKKyAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7CisKKyAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyhibG9jayk7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKKyAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICBpZiAoYXZhaWxhYmxlQyAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICB7CisgICAgICAgIGF2YWlsYWJsZUMgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOworICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgeworICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrXTsKKyAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja107CisKKyAgICBpZiAoeSA9PSAwKQorICAgICAgICBhID0gcHRyIC0gd2lkdGggKyB4OworICAgIGVsc2UKKyAgICAgICAgYSA9IGRhdGEtMTY7CisKKyAgICBpZiAoeCA9PSAwKQorICAgICAgICBsID0gcHRyICsgeSAqIHdpZHRoIC0xOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGwgPSBkYXRhLTE7CisgICAgICAgIHdpZHRoID0gMTY7CisgICAgfQorCisgICAgaWYgKHggPT0gMCkKKyAgICAgICAgYWwgPSBsLXdpZHRoOworICAgIGVsc2UKKyAgICAgICAgYWwgPSBhLTE7CisKKyAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKW1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUM8PDYpKSApOworICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCisgICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGNocm9tYSBwaXhlbHMgYXJlIHN0b3JlZCBpbiAnZGF0YScuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisgICAgT01YUmVzdWx0IG9teFJlczsKKyAgICB1OCAqcHRyOworICAgIHUzMiB3aWR0aDsKKworLyogQ29kZSAqLworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOworCisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOworICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBwdHIgPSBpbWFnZS0+Y2I7CisgICAgd2lkdGggPSBpbWFnZS0+d2lkdGgqODsKKworICAgIG9teFJlcyA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCggKHB0ci0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGggLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlQTw8MSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSkgKTsKKyAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgIHJldHVybiBIQU5UUk9fTk9LOworCisgICAgLyogYWR2YW5jZSBwb2ludGVycyAqLworICAgIGRhdGEgKz0gNjQ7CisgICAgcHRyID0gaW1hZ2UtPmNyOworCisgICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KCAocHRyLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUQ8PDUpKSApOworICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYVByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50cmEgbWFjcm9ibG9jay4gUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiB1c2luZworICAgICAgICAgIHNwZWNpZmllZCBwcmVkaWN0aW9uIG1vZGUuIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jaworICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoaW1hZ2UpCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCisgICAgICAgICAgbWJMYXllciAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCisgICAgICAgICAgaW1hZ2UgICAgICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQorICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgorICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkICBmbGFnIHNwZWNpZnlpbmcgaWYgbmVpZ2hib3VyaW5nIGludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIGFyZSB1c2VkIGluIGludHJhIHByZWRpY3Rpb24KKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgb3V0cHV0IG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBpbWFnZSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKKyAgICAgICAgICBkYXRhICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCisgICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBpbnRyYSBwcmVkaWN0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIC8qIHBlbEFib3ZlIGFuZCBwZWxMZWZ0IGNvbnRhaW4gc2FtcGxlcyBhYm92ZSBhbmQgbGVmdCB0byB0aGUgY3VycmVudAorICAgICAqIG1hY3JvYmxvY2suIEFib3ZlIGFycmF5IGNvbnRhaW5zIGFsc28gc2FtcGxlIGFib3ZlLWxlZnQgdG8gdGhlIGN1cnJlbnQKKyAgICAgKiBtYiBhcyB3ZWxsIGFzIDQgc2FtcGxlcyBhYm92ZS1yaWdodCB0byB0aGUgY3VycmVudCBtYiAobGF0dGVyIG9ubHkgZm9yCisgICAgICogbHVtYSkgKi8KKyAgICAvKiBsdW1EICsgbHVtQiArIGx1bUMgKyBjYkQgKyBjYkIgKyBjckQgKyBjckIgKi8KKyAgICB1OCBwZWxBYm92ZVsxICsgMTYgKyA0ICsgMSArIDggKyAxICsgOF07CisgICAgLyogbHVtQSArIGNiQSArIGNyQSAqLworICAgIHU4IHBlbExlZnRbMTYgKyA4ICsgOF07CisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGltYWdlKTsKKyAgICBBU1NFUlQobWJOdW0gPCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0KTsKKyAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSAhPSBQUkVEX01PREVfSU5URVIpOworCisgICAgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2UsIHBlbEFib3ZlLCBwZWxMZWZ0LCBtYk51bSk7CisKKyAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsLAorICAgICAgICAgICAgcGVsQWJvdmUsIHBlbExlZnQsIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXIsCisgICAgICAgICAgICBwZWxBYm92ZSwgcGVsTGVmdCwgY29uc3RyYWluZWRJbnRyYVByZWQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24ocE1iLCBkYXRhICsgMjU2LAorICAgICAgICAgICAgbWJMYXllci0+cmVzaWR1YWwubGV2ZWwrMTYsIHBlbEFib3ZlICsgMjEsIHBlbExlZnQgKyAxNiwKKyAgICAgICAgICAgIG1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLCBjb25zdHJhaW5lZEludHJhUHJlZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLworICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQorICAgICAgICByZXR1cm4gSEFOVFJPX09LOworCisgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhpbWFnZSwgZGF0YSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RHZXROZWlnaGJvdXJQZWxzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBHZXQgcGl4ZWwgdmFsdWVzIGZyb20gbmVpZ2hib3VyaW5nIG1hY3JvYmxvY2tzIGludG8gJ2Fib3ZlJworICAgICAgICAgIGFuZCAnbGVmdCcgYXJyYXlzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RHZXROZWlnaGJvdXJQZWxzKGltYWdlX3QgKmltYWdlLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgbWJOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIHdpZHRoLCBwaWNTaXplOworICAgIHU4ICpwdHIsICp0bXA7CisgICAgdTMyIHJvdywgY29sOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOworCisgICAgaWYgKCFtYk51bSkKKyAgICAgICAgcmV0dXJuOworCisgICAgd2lkdGggPSBpbWFnZS0+d2lkdGg7CisgICAgcGljU2l6ZSA9IHdpZHRoICogaW1hZ2UtPmhlaWdodDsKKyAgICByb3cgPSBtYk51bSAvIHdpZHRoOworICAgIGNvbCA9IG1iTnVtIC0gcm93ICogd2lkdGg7CisKKyAgICB3aWR0aCAqPSAxNjsKKyAgICBwdHIgPSBpbWFnZS0+ZGF0YSArIHJvdyAqIDE2ICogd2lkdGggICsgY29sICogMTY7CisKKyAgICAvKiBub3RlIHRoYXQgbHVtYSBzYW1wbGVzIGFib3ZlLXJpZ2h0IHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkbyBub3QgbWFrZQorICAgICAqIHNlbnNlIHdoZW4gY3VycmVudCBtYiBpcyB0aGUgcmlnaHQtbW9zdCBtYiBpbiBhIHJvdy4gU2FtZSBhcHBsaWVzIHRvCisgICAgICogc2FtcGxlIGFib3ZlLWxlZnQgaWYgY29sIGlzIHplcm8uIEhvd2V2ZXIsIHVzYWdlIG9mIHBlbHMgaW4gcHJlZGljdGlvbgorICAgICAqIGlzIGNvbnRyb2xsZWQgYnkgbmVpZ2hib3VyIGF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbiBpbiBhY3R1YWwgcHJlZGljdGlvbgorICAgICAqIHByb2Nlc3MgKi8KKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7CisgICAgICAgIGZvciAoaSA9IDIxOyBpLS07KQorICAgICAgICAgICAgKmFib3ZlKysgPSAqdG1wKys7CisgICAgfQorCisgICAgaWYgKGNvbCkKKyAgICB7CisgICAgICAgIHB0ci0tOworICAgICAgICBmb3IgKGkgPSAxNjsgaS0tOyBwdHIrPXdpZHRoKQorICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7CisgICAgfQorCisgICAgd2lkdGggPj49IDE7CisgICAgcHRyID0gaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgcm93ICogOCAqIHdpZHRoICArIGNvbCAqIDg7CisKKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7CisgICAgICAgIGZvciAoaSA9IDk7IGktLTspCisgICAgICAgICAgICAqYWJvdmUrKyA9ICp0bXArKzsKKyAgICAgICAgdG1wICs9IChwaWNTaXplICogNjQpIC0gOTsKKyAgICAgICAgZm9yIChpID0gOTsgaS0tOykKKyAgICAgICAgICAgICphYm92ZSsrID0gKnRtcCsrOworICAgIH0KKworICAgIGlmIChjb2wpCisgICAgeworICAgICAgICBwdHItLTsKKyAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQorICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7CisgICAgICAgIHB0ciArPSAocGljU2l6ZSAqIDY0KSAtIDggKiB3aWR0aDsKKyAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQorICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhMTZ4MTZQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZAorICAgICAgICAgIHJlc2lkdWFsIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUKKyAgICAgICAgICBzdG9yZWQgaW4gbWFjcm9ibG9jayBhcnJheSAnZGF0YScuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVEOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKHJlc2lkdWFsKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKyAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKKworICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7CisgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKKyAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOworICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworCisgICAgc3dpdGNoKGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYocE1iLT5tYlR5cGUpKQorICAgIHsKKyAgICAgICAgY2FzZSAwOiAvKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLworICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6IC8qIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KKyAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24oZGF0YSwgbGVmdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6IC8qIEludHJhXzE2eDE2X0RDICovCisgICAgICAgICAgICBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogY2FzZSAzOiBJbnRyYV8xNngxNl9QbGFuZSAqLworICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyogYWRkIHJlc2lkdWFsICovCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGgyNjRic2RBZGRSZXNpZHVhbChkYXRhLCByZXNpZHVhbFtpXSwgaSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAorICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUgc3RvcmVkIGluCisgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAnZGF0YScuIFRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoCisgICAgICAgICAgYmxvY2sgaXMgc3RvcmVkIGluICdwTWInIHN0cnVjdHVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwgdTggKmFib3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgYmxvY2s7CisgICAgdTMyIG1vZGU7CisgICAgbmVpZ2hib3VyX3QgbmVpZ2hib3VyLCBuZWlnaGJvdXJCOworICAgIG1iU3RvcmFnZV90ICpuTWIsICpuTWIyOworICAgIHU4IGFbMSArIDQgKyA0XSwgbFsxICsgNF07CisgICAgdTMyIGRhdGE0eDRbNF07CisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUMsIGF2YWlsYWJsZUQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQobWJMYXllcik7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxNjsgYmxvY2srKykKKyAgICB7CisKKyAgICAgICAgQVNTRVJUKHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPCA5KTsKKworICAgICAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9jayk7CisgICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOworICAgICAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBuZWlnaGJvdXJCID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IoYmxvY2spOworICAgICAgICBuTWIyID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyQi5tYik7CisgICAgICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iMi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICAgICAgeworICAgICAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCisgICAgICAgICAgICAodTMyKShhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpLAorICAgICAgICAgICAgJm5laWdoYm91ciwgJm5laWdoYm91ckIsIGJsb2NrLCBuTWIsIG5NYjIpOworICAgICAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7CisKKyAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MoYmxvY2spOworICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOworICAgICAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUMgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQorICAgICAgICB7CisgICAgICAgICAgICBhdmFpbGFibGVDID0gSEFOVFJPX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOworICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOworICAgICAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQorICAgICAgICB7CisgICAgICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgR2V0NHg0TmVpZ2hib3VyUGVscyhhLCBsLCBkYXRhLCBhYm92ZSwgbGVmdCwgYmxvY2spOworCisgICAgICAgIHN3aXRjaChtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhXzR4NF9WZXJ0aWNhbCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBsICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIEludHJhXzR4NF9EQyAqLworICAgICAgICAgICAgICAgIEludHJhNHg0RGNQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVBLCBhdmFpbGFibGVCKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogLyogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFbNV0gPSBhWzZdID0gYVs3XSA9IGFbOF0gPSBhWzRdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiAvKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTogLyogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6IC8qIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IC8qIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVDKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGFbNl0gPSBhWzddID0gYVs4XSA9IGFbNF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgOCBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFdyaXRlNHg0VG8xNngxNihkYXRhLCAodTgqKWRhdGE0eDQsIGJsb2NrKTsKKyAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsKGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsW2Jsb2NrXSwgYmxvY2spOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAorICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBjaHJvbWEgcGl4ZWxzIGFyZSBzdG9yZWQgaW4gJ2RhdGEnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAorICAgICAgICAgICAgICAgICAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgY29tcCwgYmxvY2s7CisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocmVzaWR1YWwpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOworCisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOworICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBmb3IgKGNvbXAgPSAwLCBibG9jayA9IDE2OyBjb21wIDwgMjsgY29tcCsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHByZWRNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhX0Nocm9tYV9EQyAqLworICAgICAgICAgICAgICAgIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE6IC8qIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmFDaHJvbWFIb3Jpem9udGFsUHJlZGljdGlvbihkYXRhLCBsZWZ0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOiAvKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDM6IEludHJhX0Nocm9tYV9QbGFuZSAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGJsb2NrKyspCisgICAgICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwoZGF0YSwgcmVzaWR1YWxbaV0sIGJsb2NrKTsKKworICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXJzICovCisgICAgICAgIGRhdGEgKz0gNjQ7CisgICAgICAgIGFib3ZlICs9IDk7CisgICAgICAgIGxlZnQgKz0gODsKKyAgICAgICAgcmVzaWR1YWwgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RBZGRSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgQWRkIHJlc2lkdWFsIG9mIGEgYmxvY2sgaW50byBwcmVkaWN0aW9uIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgorICAgICAgICAgIFRoZSByZXN1bHQgKHJlc2lkdWFsICsgcHJlZGljdGlvbikgaXMgc3RvcmVkIGluICdkYXRhJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19PTVhETAordm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgeCwgeTsKKyAgICB1MzIgd2lkdGg7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisgICAgdTggKnRtcDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocmVzaWR1YWwpOworICAgIEFTU0VSVChibG9ja051bSA8IDE2ICsgNCArIDQpOworCisgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUkFOR0VfQ0hFQ0tfQVJSQVkocmVzaWR1YWwsIC01MTIsIDUxMSwgMTYpOworCisgICAgaWYgKGJsb2NrTnVtIDwgMTYpCisgICAgeworICAgICAgICB3aWR0aCA9IDE2OworICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bV07CisgICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2lkdGggPSA4OworICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bSAmIDB4M107CisgICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtICYgMHgzXTsKKyAgICB9CisKKyAgICB0bXAgPSBkYXRhICsgeSp3aWR0aCArIHg7CisgICAgZm9yIChpID0gNDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgdG1wMSA9ICpyZXNpZHVhbCsrOworICAgICAgICB0bXAyID0gdG1wWzBdOworICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDQgPSB0bXBbMV07CisKKyAgICAgICAgdG1wWzBdID0gY2xwW3RtcDEgKyB0bXAyXTsKKworICAgICAgICB0bXAxID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDIgPSB0bXBbMl07CisKKyAgICAgICAgdG1wWzFdID0gY2xwW3RtcDMgKyB0bXA0XTsKKworICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDQgPSB0bXBbM107CisKKyAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07CisgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOworICAgICAgICB0bXBbMl0gPSAodTgpdG1wMTsKKyAgICAgICAgdG1wWzNdID0gKHU4KXRtcDM7CisKKyAgICAgICAgdG1wICs9IHdpZHRoOworICAgIH0KKworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgajsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICAqZGF0YSsrID0gYWJvdmVbal07CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgaG9yaXpvbnRhbCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgajsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpkYXRhKysgPSBsZWZ0W2ldOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmExNngxNkRjUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBEQyBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmExNngxNkRjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCisgICAgdTMyIGF2YWlsYWJsZUIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgdG1wICs9IGFib3ZlW2ldICsgbGVmdFtpXTsKKyAgICAgICAgdG1wID0gKHRtcCArIDE2KSA+PiA1OworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVBKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICB0bXAgKz0gbGVmdFtpXTsKKyAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHRtcCArPSBhYm92ZVtpXTsKKyAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7CisgICAgfQorICAgIC8qIG5laXRoZXIgQSBub3IgQiBhdmFpbGFibGUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSAxMjg7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgZGF0YVtpXSA9ICh1OCl0bXA7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHBsYW5lIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIGkzMiBhLCBiLCBjOworICAgIGkzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGEgPSAxNiAqIChhYm92ZVsxNV0gKyBsZWZ0WzE1XSk7CisKKyAgICBmb3IgKGkgPSAwLCBiID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgYiArPSAoKGkzMilpICsgMSkgKiAoYWJvdmVbOCtpXSAtIGFib3ZlWzYtaV0pOworICAgIGIgPSAoNSAqIGIgKyAzMikgPj4gNjsKKworICAgIGZvciAoaSA9IDAsIGMgPSAwOyBpIDwgNzsgaSsrKQorICAgICAgICBjICs9ICgoaTMyKWkgKyAxKSAqIChsZWZ0WzgraV0gLSBsZWZ0WzYtaV0pOworICAgIC8qIHBbLTEsLTFdIGhhcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGFib3ZlIHBvaW50ZXIgKi8KKyAgICBjICs9ICgoaTMyKWkgKyAxKSAqIChsZWZ0WzgraV0gLSBhYm92ZVstMV0pOworICAgIGMgPSAoNSAqIGMgKyAzMikgPj4gNjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IChhICsgYiAqICgoaTMyKWogLSA3KSArIGMgKiAoKGkzMilpIC0gNykgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIGRhdGFbaSoxNitqXSA9ICh1OClDTElQMSh0bXApOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIERDIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYUNocm9tYURjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCisgICAgdTMyIGF2YWlsYWJsZUIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIHRtcDEsIHRtcDI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIC8qIHkgPSAwLi4zICovCisgICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIHRtcDEgPSBhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArCisgICAgICAgICAgICAgIGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM107CisgICAgICAgIHRtcDEgPSAodG1wMSArIDQpID4+IDM7CisgICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgdG1wMSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7CisgICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVBKQorICAgIHsKKyAgICAgICAgdG1wMSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKKyAgICAgICAgdG1wMiA9IHRtcDE7CisgICAgfQorICAgIC8qIG5laXRoZXIgQSBub3IgQiBhdmFpbGFibGUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAxID0gdG1wMiA9IDEyODsKKyAgICB9CisKKyAgICBBU1NFUlQodG1wMSA8IDI1NiAmJiB0bXAyIDwgMjU2KTsKKyAgICBmb3IgKGkgPSA0OyBpLS07KQorICAgIHsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgfQorCisgICAgLyogeSA9IDQuLi43ICovCisgICAgaWYgKGF2YWlsYWJsZUEpCisgICAgeworICAgICAgICB0bXAxID0gKGxlZnRbNF0gKyBsZWZ0WzVdICsgbGVmdFs2XSArIGxlZnRbN10gKyAyKSA+PiAyOworICAgICAgICBpZiAoYXZhaWxhYmxlQikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMiA9IGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsKKyAgICAgICAgICAgICAgICAgICBsZWZ0WzRdICsgbGVmdFs1XSArIGxlZnRbNl0gKyBsZWZ0WzddOworICAgICAgICAgICAgdG1wMiA9ICh0bXAyICsgNCkgPj4gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB0bXAyID0gdG1wMTsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIHRtcDEgPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgICAgICB0bXAyID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wMSA9IHRtcDIgPSAxMjg7CisgICAgfQorCisgICAgQVNTRVJUKHRtcDEgPCAyNTYgJiYgdG1wMiA8IDI1Nik7CisgICAgZm9yIChpID0gNDsgaS0tOykKKyAgICB7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSBob3Jpem9udGFsIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGZvciAoaSA9IDg7IGktLTspCisgICAgeworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdDsKKyAgICAgICAgKmRhdGErKyA9ICpsZWZ0OworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdDsKKyAgICAgICAgKmRhdGErKyA9ICpsZWZ0OworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdCsrOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSB2ZXJ0aWNhbCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICBmb3IgKGkgPSA4OyBpLS07ZGF0YSsrLyphYm92ZS09OCovKQorICAgIHsKKyAgICAgICAgZGF0YVswXSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVs4XSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVsxNl0gPSAqYWJvdmU7CisgICAgICAgIGRhdGFbMjRdID0gKmFib3ZlOworICAgICAgICBkYXRhWzMyXSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVs0MF0gPSAqYWJvdmU7CisgICAgICAgIGRhdGFbNDhdID0gKmFib3ZlOworICAgICAgICBkYXRhWzU2XSA9ICphYm92ZSsrOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSBwbGFuZSBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgaTMyIGEsIGIsIGM7CisgICAgaTMyIHRtcDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGEgPSAxNiAqIChhYm92ZVs3XSArIGxlZnRbN10pOworCisgICAgYiA9IChhYm92ZVs0XSAtIGFib3ZlWzJdKSArIDIgKiAoYWJvdmVbNV0gLSBhYm92ZVsxXSkKKyAgICAgICAgKyAzICogKGFib3ZlWzZdIC0gYWJvdmVbMF0pICsgNCAqIChhYm92ZVs3XSAtIGFib3ZlWy0xXSk7CisgICAgYiA9ICgxNyAqIGIgKyAxNikgPj4gNTsKKworICAgIC8qIHBbLTEsLTFdIGhhcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGFib3ZlIHBvaW50ZXIgKi8KKyAgICBjID0gKGxlZnRbNF0gLSBsZWZ0WzJdKSArIDIgKiAobGVmdFs1XSAtIGxlZnRbMV0pCisgICAgICAgICsgMyAqIChsZWZ0WzZdIC0gbGVmdFswXSkgKyA0ICogKGxlZnRbN10gLSBhYm92ZVstMV0pOworICAgIGMgPSAoMTcgKiBjICsgMTYpID4+IDU7CisKKyAgICAvKmEgKz0gMTY7Ki8KKyAgICBhID0gYSAtIDMgKiBjICsgMTY7CisgICAgZm9yIChpID0gODsgaS0tOyBhICs9IGMpCisgICAgeworICAgICAgICB0bXAgPSAoYSAtIDMgKiBiKTsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldDR4NE5laWdoYm91clBlbHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEdldCBuZWlnaGJvdXJpbmcgcGl4ZWxzIG9mIGEgNHg0IGJsb2NrIGludG8gJ2EnIGFuZCAnbCcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgR2V0NHg0TmVpZ2hib3VyUGVscyh1OCAqYSwgdTggKmwsIHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBibG9ja051bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgeCwgeTsKKyAgICB1OCB0MSwgdDI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChhKTsKKyAgICBBU1NFUlQobCk7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChibG9ja051bSA8IDE2KTsKKworICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKKyAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bV07CisKKyAgICAvKiBBIGFuZCBEICovCisgICAgaWYgKHggPT0gMCkKKyAgICB7CisgICAgICAgIHQxID0gbGVmdFt5ICAgIF07CisgICAgICAgIHQyID0gbGVmdFt5ICsgMV07CisgICAgICAgIGxbMV0gPSB0MTsKKyAgICAgICAgbFsyXSA9IHQyOworICAgICAgICB0MSA9IGxlZnRbeSArIDJdOworICAgICAgICB0MiA9IGxlZnRbeSArIDNdOworICAgICAgICBsWzNdID0gdDE7CisgICAgICAgIGxbNF0gPSB0MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdDEgPSBkYXRhW3kgKiAxNiArIHggLSAxICAgICBdOworICAgICAgICB0MiA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgKyAxNl07CisgICAgICAgIGxbMV0gPSB0MTsKKyAgICAgICAgbFsyXSA9IHQyOworICAgICAgICB0MSA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgKyAzMl07CisgICAgICAgIHQyID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDQ4XTsKKyAgICAgICAgbFszXSA9IHQxOworICAgICAgICBsWzRdID0gdDI7CisgICAgfQorCisgICAgLyogQiwgQyBhbmQgRCAqLworICAgIGlmICh5ID09IDApCisgICAgeworICAgICAgICB0MSA9IGFib3ZlW3ggICAgXTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICAgIF07CisgICAgICAgIGxbMF0gPSB0MTsKKyAgICAgICAgYVswXSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyAxXTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgMl07CisgICAgICAgIGFbMV0gPSB0MTsKKyAgICAgICAgYVsyXSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyAzXTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgNF07CisgICAgICAgIGFbM10gPSB0MTsKKyAgICAgICAgYVs0XSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyA1XTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgNl07CisgICAgICAgIGFbNV0gPSB0MTsKKyAgICAgICAgYVs2XSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyA3XTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgOF07CisgICAgICAgIGFbN10gPSB0MTsKKyAgICAgICAgYVs4XSA9IHQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCAgICBdOworICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDFdOworICAgICAgICBhWzFdID0gdDE7CisgICAgICAgIGFbMl0gPSB0MjsKKyAgICAgICAgdDEgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyAyXTsKKyAgICAgICAgdDIgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyAzXTsKKyAgICAgICAgYVszXSA9IHQxOworICAgICAgICBhWzRdID0gdDI7CisgICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNF07CisgICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNV07CisgICAgICAgIGFbNV0gPSB0MTsKKyAgICAgICAgYVs2XSA9IHQyOworICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDZdOworICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDddOworICAgICAgICBhWzddID0gdDE7CisgICAgICAgIGFbOF0gPSB0MjsKKworICAgICAgICBpZiAoeCA9PSAwKQorICAgICAgICAgICAgbFswXSA9IGFbMF0gPSBsZWZ0W3ktMV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxbMF0gPSBhWzBdID0gZGF0YVsoeSAtIDEpICogMTYgKyB4IC0gMV07CisgICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHZlcnRpY2FsIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHU4IHQxLCB0MjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICB0MSA9IGFib3ZlWzBdOworICAgIHQyID0gYWJvdmVbMV07CisgICAgZGF0YVswXSA9IGRhdGFbNF0gPSBkYXRhWzhdID0gZGF0YVsxMl0gPSB0MTsKKyAgICBkYXRhWzFdID0gZGF0YVs1XSA9IGRhdGFbOV0gPSBkYXRhWzEzXSA9IHQyOworICAgIHQxID0gYWJvdmVbMl07CisgICAgdDIgPSBhYm92ZVszXTsKKyAgICBkYXRhWzJdID0gZGF0YVs2XSA9IGRhdGFbMTBdID0gZGF0YVsxNF0gPSB0MTsKKyAgICBkYXRhWzNdID0gZGF0YVs3XSA9IGRhdGFbMTFdID0gZGF0YVsxNV0gPSB0MjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGhvcml6b250YWwgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHU4IHQxLCB0MjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIHQxID0gbGVmdFswXTsKKyAgICB0MiA9IGxlZnRbMV07CisgICAgZGF0YVswXSA9IGRhdGFbMV0gPSBkYXRhWzJdID0gZGF0YVszXSA9IHQxOworICAgIGRhdGFbNF0gPSBkYXRhWzVdID0gZGF0YVs2XSA9IGRhdGFbN10gPSB0MjsKKyAgICB0MSA9IGxlZnRbMl07CisgICAgdDIgPSBsZWZ0WzNdOworICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9IHQxOworICAgIGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gdDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NERjUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgREMgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhNHg0RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgYXZhaWxhYmxlQSwKKyAgICB1MzIgYXZhaWxhYmxlQikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworICAgIHU4IHQxLCB0MiwgdDMsIHQ0OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgdDEgPSBhYm92ZVswXTsgdDIgPSBhYm92ZVsxXTsgdDMgPSBhYm92ZVsyXTsgdDQgPSBhYm92ZVszXTsKKyAgICAgICAgdG1wID0gdDEgKyB0MiArIHQzICsgdDQ7CisgICAgICAgIHQxID0gbGVmdFswXTsgdDIgPSBsZWZ0WzFdOyB0MyA9IGxlZnRbMl07IHQ0ID0gbGVmdFszXTsKKyAgICAgICAgdG1wICs9IHQxICsgdDIgKyB0MyArIHQ0OworICAgICAgICB0bXAgPSAodG1wICsgNCkgPj4gMzsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQSkKKyAgICB7CisgICAgICAgIHQxID0gbGVmdFswXTsgdDIgPSBsZWZ0WzFdOyB0MyA9IGxlZnRbMl07IHQ0ID0gbGVmdFszXTsKKyAgICAgICAgdG1wID0gKHQxICsgdDIgKyB0MyArIHQ0ICsgMikgPj4gMjsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIHQxID0gYWJvdmVbMF07IHQyID0gYWJvdmVbMV07IHQzID0gYWJvdmVbMl07IHQ0ID0gYWJvdmVbM107CisgICAgICAgIHRtcCA9ICh0MSArIHQyICsgdDMgKyB0NCArIDIpID4+IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRtcCA9IDEyODsKKyAgICB9CisKKyAgICBBU1NFUlQodG1wIDwgMjU2KTsKKyAgICBkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0KKyAgICBkYXRhWzRdID0gZGF0YVs1XSA9IGRhdGFbNl0gPSBkYXRhWzddID0KKyAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPQorICAgIGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gKHU4KXRtcDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGRpYWdvbmFsIGRvd24tbGVmdCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICBkYXRhWyAwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKKyAgICBkYXRhWyA1XSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKKyAgICBkYXRhWyA4XSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKKyAgICBkYXRhWyAzXSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWyA2XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWyA5XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKKyAgICBkYXRhWzEwXSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKKyAgICBkYXRhWzEzXSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKKyAgICBkYXRhWzExXSA9IChhYm92ZVs1XSArIDIgKiBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKKyAgICBkYXRhWzE0XSA9IChhYm92ZVs1XSArIDIgKiBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChhYm92ZVs2XSArIDMgKiBhYm92ZVs3XSArIDIpID4+IDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgZGlhZ29uYWwgZG93bi1yaWdodCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDREaWFnb25hbERvd25SaWdodFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBkYXRhWyAwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyA1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWzEwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7CisgICAgZGF0YVsgNl0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTFdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAzXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7CisgICAgZGF0YVsgOV0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyA4XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzEzXSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCB2ZXJ0aWNhbCByaWdodCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGFib3ZlWy0xXSArIGFib3ZlWzBdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA5XSA9IChhYm92ZVstMV0gKyBhYm92ZVswXSArIDEpID4+IDE7CisgICAgZGF0YVsgNV0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWzEzXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWzEwXSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA2XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWzExXSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyAzXSA9IChhYm92ZVsyXSArIGFib3ZlWzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA4XSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0Wy0xXSArIDIpID4+IDI7CisgICAgZGF0YVsxMl0gPSAobGVmdFsyXSArIDIgKiBsZWZ0WzFdICsgbGVmdFswXSArIDIpID4+IDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgaG9yaXpvbnRhbCBkb3duIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGxlZnRbLTFdICsgbGVmdFswXSArIDEpID4+IDE7CisgICAgZGF0YVsgNl0gPSAobGVmdFstMV0gKyBsZWZ0WzBdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA1XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7CisgICAgZGF0YVsxMV0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDRdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWzEwXSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIDEpID4+IDE7CisgICAgZGF0YVsgOV0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7CisgICAgZGF0YVsxNV0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7CisgICAgZGF0YVsgOF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbMTRdID0gKGxlZnRbMV0gKyBsZWZ0WzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWzEzXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChsZWZ0WzJdICsgbGVmdFszXSArIDEpID4+IDE7CisgICAgZGF0YVsgMV0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7CisgICAgZGF0YVsgN10gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7CisgICAgZGF0YVsgMl0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVstMV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDNdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMF0gKyAyKSA+PiAyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgdmVydGljYWwgbGVmdCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKworICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOworICAgIGRhdGFbIDFdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDJdID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOworICAgIGRhdGFbIDNdID0gKGFib3ZlWzNdICsgYWJvdmVbNF0gKyAxKSA+PiAxOworICAgIGRhdGFbIDRdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbIDVdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDZdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOworICAgIGRhdGFbIDddID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDhdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDldID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOworICAgIGRhdGFbMTBdID0gKGFib3ZlWzNdICsgYWJvdmVbNF0gKyAxKSA+PiAxOworICAgIGRhdGFbMTFdID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyAxKSA+PiAxOworICAgIGRhdGFbMTJdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbMTNdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTVdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBob3Jpem9udGFsIHVwIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWyAxXSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7CisgICAgZGF0YVsgM10gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7CisgICAgZGF0YVsgNF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDVdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDZdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA3XSA9IChsZWZ0WzJdICsgMyAqIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDhdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA5XSA9IChsZWZ0WzJdICsgMyAqIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbMTBdID0gbGVmdFszXTsKKyAgICBkYXRhWzExXSA9IGxlZnRbM107CisgICAgZGF0YVsxMl0gPSBsZWZ0WzNdOworICAgIGRhdGFbMTNdID0gbGVmdFszXTsKKyAgICBkYXRhWzE0XSA9IGxlZnRbM107CisgICAgZGF0YVsxNV0gPSBsZWZ0WzNdOworCit9CisKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogV3JpdGU0eDRUbzE2eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBXcml0ZSBhIDR4NCBibG9jayAoZGF0YTR4NCkgaW50byBjb3JyZWN0IHBvc2l0aW9uCisgICAgICAgICAgaW4gMTZ4MTYgbWFjcm9ibG9jayAoZGF0YSkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgV3JpdGU0eDRUbzE2eDE2KHU4ICpkYXRhLCB1OCAqZGF0YTR4NCwgdTMyIGJsb2NrTnVtKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4LCB5OworICAgIHUzMiAqaW4zMiwgKm91dDMyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGRhdGE0eDQpOworICAgIEFTU0VSVChibG9ja051bSA8IDE2KTsKKworICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKKyAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bV07CisKKyAgICBkYXRhICs9IHkqMTYreDsKKworICAgIEFTU0VSVCgoKHUzMilkYXRhJjB4MykgPT0gMCk7CisKKyAgICAvKmxpbnQgLS1lKDgyNikgKi8KKyAgICBvdXQzMiA9ICh1MzIgKilkYXRhOworICAgIC8qbGludCAtLWUoODI2KSAqLworICAgIGluMzIgPSAodTMyICopZGF0YTR4NDsKKworICAgIG91dDMyWzBdID0gKmluMzIrKzsKKyAgICBvdXQzMls0XSA9ICppbjMyKys7CisgICAgb3V0MzJbOF0gPSAqaW4zMisrOworICAgIG91dDMyWzEyXSA9ICppbjMyKys7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBvZiBhIGJsb2NrIGJhc2VkIG9uIHRoZQorICAgICAgICAgIG5laWdoYm91cmluZyBtYWNyb2Jsb2NrcyBhbmQgaW5mb3JtYXRpb24gcGFyc2VkIGZyb20gc3RyZWFtLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZShtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgdTMyIGF2YWlsYWJsZSwgbmVpZ2hib3VyX3QgKm5BLCBuZWlnaGJvdXJfdCAqbkIsIHUzMiBpbmRleCwKKyAgICBtYlN0b3JhZ2VfdCAqbk1iQSwgbWJTdG9yYWdlX3QgKm5NYkIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIG1vZGUxLCBtb2RlMjsKKyAgICBtYlN0b3JhZ2VfdCAqcE1iOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocE1iTGF5ZXIpOworCisgICAgLyogZGMgb25seSBwcmVkaWN0aW9uPyAqLworICAgIGlmICghYXZhaWxhYmxlKQorICAgICAgICBtb2RlMSA9IDI7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcE1iID0gbk1iQTsKKyAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlMSA9IHBNYi0+aW50cmE0eDRQcmVkTW9kZVtuQS0+aW5kZXhdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1vZGUxID0gMjsKKworICAgICAgICBwTWIgPSBuTWJCOworICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkE0eDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGUyID0gcE1iLT5pbnRyYTR4NFByZWRNb2RlW25CLT5pbmRleF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbW9kZTIgPSAyOworCisgICAgICAgIG1vZGUxID0gTUlOKG1vZGUxLCBtb2RlMik7CisgICAgfQorCisgICAgaWYgKCFwTWJMYXllci0+bWJQcmVkLnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpbmRleF0pCisgICAgeworICAgICAgICBpZiAocE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XSA8IG1vZGUxKQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlMSA9IHBNYkxheWVyLT5tYlByZWQucmVtSW50cmE0eDRQcmVkTW9kZVtpbmRleF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlMSA9IHBNYkxheWVyLT5tYlByZWQucmVtSW50cmE0eDRQcmVkTW9kZVtpbmRleF0gKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKG1vZGUxKTsKK30KKworCisvKmxpbnQgK2U3MDIgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NjUyYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0lOVFJBX1BSRURJQ1RJT05fSAorI2RlZmluZSBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX09NWERMCit1MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKTsKKwordTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Cit1MzIgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpMzIgcmVzaWR1YWxbXVsxNl0sCisgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKKwordTMyIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKKyAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7CisKK3ZvaWQgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2VfdCAqaW1hZ2UsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBtYk51bSk7CisKKyNlbHNlCisKK3UzMiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcEltYWdlLCB1MzIgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHUzMiBibG9jayk7CisKK3UzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHU4ICpwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOworCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOworCisjZW5kaWYKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiM2U3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCkBAIC0wLDAgKzEsMTQ0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIKKyAgICAgICAgICBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUKKyAgICAgICAgICBoMjY0YnNkTnVtTWJQYXJ0CisgICAgICAgICAgaDI2NGJzZE51bVN1Yk1iUGFydAorICAgICAgICAgIERlY29kZU1iUHJlZAorICAgICAgICAgIERlY29kZVN1Yk1iUHJlZAorICAgICAgICAgIERlY29kZVJlc2lkdWFsCisgICAgICAgICAgRGV0ZXJtaW5lTmMKKyAgICAgICAgICBDYnBJbnRyYTE2eDE2CisgICAgICAgICAgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNgorICAgICAgICAgIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrCisgICAgICAgICAgUHJvY2Vzc1Jlc2lkdWFsCisgICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jYXZsYy5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2RfdHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgiCisKKyNpZmRlZiBIMjY0REVDX09NWERMCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybVZDLmgiCisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEgyNjRERUNfT01YREwKK3N0YXRpYyBjb25zdCB1MzIgY2hyb21hSW5kZXhbOF0gPSB7IDI1NiwgMjYwLCAyODgsIDI5MiwgMzIwLCAzMjQsIDM1MiwgMzU2IH07CitzdGF0aWMgY29uc3QgdTMyIGx1bWFJbmRleFsxNl0gPSB7ICAgMCwgICA0LCAgNjQsICA2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgMTIsICA3MiwgIDc2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIDEzMiwgMTkyLCAxOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNiwgMTQwLCAyMDAsIDIwNCB9OworI2VuZGlmCisvKiBtYXBwaW5nIG9mIGRjIGNvZWZmaWNpZW50cyBhcnJheSB0byBsdW1hIGJsb2NrcyAqLworc3RhdGljIGNvbnN0IHUzMiBkY0NvZWZmSW5kZXhbMTZdID0KKyAgICB7MCwgMSwgNCwgNSwgMiwgMywgNiwgNywgOCwgOSwgMTIsIDEzLCAxMCwgMTEsIDE0LCAxNX07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBtYlByZWRfdCAqcE1iUHJlZCwKKyAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpOworc3RhdGljIHUzMiBEZWNvZGVTdWJNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdWJNYlByZWRfdCAqcFN1Yk1iUHJlZCwKKyAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpOworc3RhdGljIHUzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKKyAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybik7CisKKyNpZmRlZiBIMjY0REVDX09NWERMCitzdGF0aWMgdTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCB1OCAqcFRvdGFsQ29lZmYpOworI2Vsc2UKK3N0YXRpYyB1MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIGkxNiAqcFRvdGFsQ29lZmYpOworI2VuZGlmCisKK3N0YXRpYyB1MzIgQ2JwSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpOworI2lmZGVmIEgyNjRERUNfT01YREwKK3N0YXRpYyB1MzIgUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsIGNvbnN0IHU4ICoqcFNyYywgaW1hZ2VfdCAqaW1hZ2UpOworc3RhdGljIHUzMiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGNvbnN0IHU4ICoqcFNyYyApOworc3RhdGljIHUzMiBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCisgICAgICAgICAgICAgICAgICAgIHUzMiBpbnRyYUNocm9tYVByZWRNb2RlLCBjb25zdCB1OCAqKnBTcmMsIGltYWdlX3QgKmltYWdlKTsKKworCisjZWxzZQorc3RhdGljIHUzMiBQcm9jZXNzUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgaTMyIHJlc2lkdWFsTGV2ZWxbXVsxNl0sIHUzMiAqKTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGFyc2UgbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHBTdHJtRGF0YSAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgcE1iICAgICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgc2xpY2VUeXBlICAgICAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBzbGljZQorICAgICAgICAgIG51bVJlZklkeEFjdGl2ZSAgIG1heGltdW0gcmVmZXJlbmNlIGluZGV4CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBwTWJMYXllciAgICAgICAgICBzdG9yZXMgdGhlIG1hY3JvYmxvY2sgZGF0YSBwYXJzZWQgZnJvbSBzdHJlYW0KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIEhBTlRST19PSyAgICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICBIQU5UUk9fTk9LICAgICAgICBlbmQgb2Ygc3RyZWFtIG9yIGVycm9yIGluIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLCBtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgc2xpY2VUeXBlLAorICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgdmFsdWU7CisgICAgaTMyIGl0bXA7CisgICAgbWJQYXJ0UHJlZE1vZGVfZSBwYXJ0TW9kZTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKworI2lmZGVmIEgyNjRERUNfTkVPTgorICAgIGgyNjRic2RDbGVhck1iTGF5ZXIocE1iTGF5ZXIsICgoc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSArIDYzKSAmIH4weDNGKSk7CisjZWxzZQorICAgIEgyNjRTd0RlY01lbXNldChwTWJMYXllciwgMCwgc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSk7CisjZW5kaWYKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisKKyAgICBpZiAoSVNfSV9TTElDRShzbGljZVR5cGUpKQorICAgIHsKKyAgICAgICAgaWYgKCh2YWx1ZSArIDYpID4gMzEgfHwgdG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSA9IChtYlR5cGVfZSkodmFsdWUgKyA2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCh2YWx1ZSArIDEpID4gMzEgfHwgdG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSA9IChtYlR5cGVfZSkodmFsdWUgKyAxKTsKKyAgICB9CisKKyAgICBpZiAocE1iTGF5ZXItPm1iVHlwZSA9PSBJX1BDTSkKKyAgICB7CisgICAgICAgIGkzMiAqbGV2ZWw7CisgICAgICAgIHdoaWxlKCAhaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHBjbV9hbGlnbm1lbnRfemVyb19iaXQgKi8KKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICBpZiAodG1wKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldmVsID0gcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsWzBdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzg0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICpsZXZlbCsrID0gKGkzMil2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYXJ0TW9kZSA9IGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWJMYXllci0+bWJUeXBlKTsKKyAgICAgICAgaWYgKCAocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVEVSKSAmJgorICAgICAgICAgICAgIChoMjY0YnNkTnVtTWJQYXJ0KHBNYkxheWVyLT5tYlR5cGUpID09IDQpICkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gRGVjb2RlU3ViTWJQcmVkKHBTdHJtRGF0YSwgJnBNYkxheWVyLT5zdWJNYlByZWQsCisgICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSwgbnVtUmVmSWR4QWN0aXZlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IERlY29kZU1iUHJlZChwU3RybURhdGEsICZwTWJMYXllci0+bWJQcmVkLAorICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlR5cGUsIG51bVJlZklkeEFjdGl2ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICBpZiAocGFydE1vZGUgIT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQocFN0cm1EYXRhLCAmdmFsdWUsCisgICAgICAgICAgICAgICAgKHUzMikocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybiA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuID0gQ2JwSW50cmExNngxNihwTWJMYXllci0+bWJUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuIHx8CisgICAgICAgICAgICAgKHBhcnRNb2RlID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCAoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkgKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBNYkxheWVyLT5tYlFwRGVsdGEgPSBpdG1wOworCisgICAgICAgICAgICB0bXAgPSBEZWNvZGVSZXNpZHVhbChwU3RybURhdGEsICZwTWJMYXllci0+cmVzaWR1YWwsIHBNYiwKKyAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJUeXBlLCBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4pOworCisgICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgPQorICAgICAgICAgICAgICAgICh1MzIpKHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zIC0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCkgKiA4ICsKKyAgICAgICAgICAgICAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKKworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RNYlBhcnRQcmVkTW9kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgcHJlZGljdGlvbiBtb2RlIG9mIGEgbWFjcm9ibG9jayB0eXBlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK21iUGFydFByZWRNb2RlX2UgaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZV9lIG1iVHlwZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iVHlwZSA8PSAzMSk7CisKKyAgICBpZiAoKG1iVHlwZSA8PSBQXzh4OHJlZjApKQorICAgICAgICByZXR1cm4oUFJFRF9NT0RFX0lOVEVSKTsKKyAgICBlbHNlIGlmIChtYlR5cGUgPT0gSV80eDQpCisgICAgICAgIHJldHVybihQUkVEX01PREVfSU5UUkE0eDQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKFBSRURfTU9ERV9JTlRSQTE2eDE2KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROdW1NYlBhcnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIGFtb3VudCBvZiBtYWNyb2Jsb2NrIHBhcnRpdGlvbnMgaW4gYSBtYWNyb2Jsb2NrIHR5cGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2ROdW1NYlBhcnQobWJUeXBlX2UgbWJUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKKworICAgIHN3aXRjaCAobWJUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgorICAgICAgICBjYXNlIFBfU2tpcDoKKyAgICAgICAgICAgIHJldHVybigxKTsKKworICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKKyAgICAgICAgY2FzZSBQX0wwX0wwXzh4MTY6CisgICAgICAgICAgICByZXR1cm4oMik7CisKKyAgICAgICAgLyogUF84eDggb3IgUF84eDhyZWYwICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oNCk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE51bVN1Yk1iUGFydAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgYW1vdW50IG9mIHN1Yi1wYXJ0aXRpb25zIGluIGEgc3ViLW1hY3JvYmxvY2sgdHlwZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlR5cGVfZSBzdWJNYlR5cGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChzdWJNYlR5cGUgPD0gUF9MMF80eDQpOworCisgICAgc3dpdGNoIChzdWJNYlR5cGUpCisgICAgeworICAgICAgICBjYXNlIFBfTDBfOHg4OgorICAgICAgICAgICAgcmV0dXJuKDEpOworCisgICAgICAgIGNhc2UgUF9MMF84eDQ6CisgICAgICAgIGNhc2UgUF9MMF80eDg6CisgICAgICAgICAgICByZXR1cm4oMik7CisKKyAgICAgICAgLyogUF9MMF80eDQgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybig0KTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVNYlByZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBhcnNlIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kIHN0b3JlCisgICAgICAgICAgaW4gJ3BNYlByZWQnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgbWJQcmVkX3QgKnBNYlByZWQsIG1iVHlwZV9lIG1iVHlwZSwKKyAgICB1MzIgbnVtUmVmSWR4QWN0aXZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGksIGosIHZhbHVlOworICAgIGkzMiBpdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocE1iUHJlZCk7CisKKyAgICBzd2l0Y2ggKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpKQorICAgIHsKKyAgICAgICAgY2FzZSBQUkVEX01PREVfSU5URVI6IC8qIFBSRURfTU9ERV9JTlRFUiAqLworICAgICAgICAgICAgaWYgKG51bVJlZklkeEFjdGl2ZSA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gaDI2NGJzZE51bU1iUGFydChtYlR5cGUpLCBqID0gMDsgaS0tOyAgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZChwU3RybURhdGEsICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKG51bVJlZklkeEFjdGl2ZSA+IDIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPj0gbnVtUmVmSWR4QWN0aXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnJlZklkeEwwW2pdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZSksIGogPSAwOyBpLS07ICBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcE1iUHJlZC0+bXZkTDBbal0uaG9yID0gKGkxNilpdG1wOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcE1iUHJlZC0+bXZkTDBbal0udmVyID0gKGkxNilpdG1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQUkVEX01PREVfSU5UUkE0eDQ6CisgICAgICAgICAgICBmb3IgKGl0bXAgPSAwLCBpID0gMDsgaXRtcCA8IDI7IGl0bXArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgICAgICAgICAgdG1wID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA4OyBqLS07IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAmIDB4ODAwMDAwMDAgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICghcE1iUHJlZC0+cHJldkludHJhNHg0UHJlZE1vZGVGbGFnW2ldKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWJQcmVkLT5yZW1JbnRyYTR4NFByZWRNb2RlW2ldID0gdmFsdWU+PjI5OworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDggKyAzKnRtcCkgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisKKyAgICAgICAgY2FzZSBQUkVEX01PREVfSU5UUkExNngxNjoKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+IDMpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcE1iUHJlZC0+aW50cmFDaHJvbWFQcmVkTW9kZSA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJNYlByZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBhcnNlIHN1Yi1tYWNyb2Jsb2NrIHByZWRpY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZAorICAgICAgICAgIHN0b3JlIGluICdwTWJQcmVkJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVN1Yk1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHN1Yk1iUHJlZF90ICpwU3ViTWJQcmVkLAorICAgIG1iVHlwZV9lIG1iVHlwZSwgdTMyIG51bVJlZklkeEFjdGl2ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCBqLCB2YWx1ZTsKKyAgICBpMzIgaXRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdWJNYlByZWQpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID4gMykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1Yk1iUHJlZC0+c3ViTWJUeXBlW2ldID0gKHN1Yk1iVHlwZV9lKXZhbHVlOworICAgIH0KKworICAgIGlmICggKG51bVJlZklkeEFjdGl2ZSA+IDEpICYmIChtYlR5cGUgIT0gUF84eDhyZWYwKSApCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKHBTdHJtRGF0YSwgJnZhbHVlLAorICAgICAgICAgICAgICAgICh1MzIpKG51bVJlZklkeEFjdGl2ZSA+IDIpKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID49IG51bVJlZklkeEFjdGl2ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwU3ViTWJQcmVkLT5yZWZJZHhMMFtpXSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGogPSAwOworICAgICAgICBmb3IgKHZhbHVlID0gaDI2NGJzZE51bVN1Yk1iUGFydChwU3ViTWJQcmVkLT5zdWJNYlR5cGVbaV0pOworICAgICAgICAgICAgIHZhbHVlLS07IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFN1Yk1iUHJlZC0+bXZkTDBbaV1bal0uaG9yID0gKGkxNilpdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBwU3ViTWJQcmVkLT5tdmRMMFtpXVtqXS52ZXIgPSAoaTE2KWl0bXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisjaWZkZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGFyc2UgcmVzaWR1YWwgaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZCBzdG9yZSBpbiAncFJlc2lkdWFsJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVJlc2lkdWFsKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcmVzaWR1YWxfdCAqcFJlc2lkdWFsLAorICAgIG1iU3RvcmFnZV90ICpwTWIsIG1iVHlwZV9lIG1iVHlwZSwgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIHUzMiBibG9ja0NvZGVkOworICAgIHUzMiBibG9ja0luZGV4OworICAgIHUzMiBpczE2eDE2OworICAgIE9NWF9JTlQgbmM7CisgICAgT01YUmVzdWx0IG9teFJlczsKKyAgICBPTVhfVTggKnBQb3NDb2VmQnVmOworCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUmVzaWR1YWwpOworCisgICAgcFBvc0NvZWZCdWYgPSBwUmVzaWR1YWwtPnBvc0NvZWZCdWY7CisKKyAgICAvKiBsdW1hIERDIGlzIGF0IGluZGV4IDI0ICovCisgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQorICAgIHsKKyAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsIDAsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAxNik7CisjZWxzZQorICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAxNik7CisjZW5kaWYKKyAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBpczE2eDE2ID0gSEFOVFJPX1RSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaXMxNngxNiA9IEhBTlRST19GQUxTRTsKKworICAgIGZvciAoaSA9IDQsIGJsb2NrSW5kZXggPSAwOyBpLS07KQorICAgIHsKKyAgICAgICAgLyogbHVtYSBjYnAgaW4gYml0cyAwLTMgKi8KKyAgICAgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgxOworICAgICAgICBjb2RlZEJsb2NrUGF0dGVybiA+Pj0gMTsKKyAgICAgICAgaWYgKGJsb2NrQ29kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDQ7IGotLTsgYmxvY2tJbmRleCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5jID0gKE9NWF9JTlQpRGV0ZXJtaW5lTmMocE1iLGJsb2NrSW5kZXgscFJlc2lkdWFsLT50b3RhbENvZWZmKTsKKyAgICAgICAgICAgICAgICBpZiAoaXMxNngxNikKKyAgICAgICAgICAgICAgICB7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIG9teFJlcyA9ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworI2lmbmRlZiBIMjY0REVDX05FT04KKyAgICAgICAgICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBibG9ja0luZGV4ICs9IDQ7CisgICAgfQorCisgICAgLyogY2hyb21hIERDIGJsb2NrIGFyZSBhdCBpbmRpY2VzIDI1IGFuZCAyNiAqLworICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MzsKKyAgICBpZiAoYmxvY2tDb2RlZCkKKyAgICB7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDKAorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI1XSwKKyAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYpOworI2Vsc2UKKyAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjVdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAxNywKKyAgICAgICAgICAgICAgICA0KTsKKyNlbmRpZgorICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDKAorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSwKKyAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYpOworI2Vsc2UKKyAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjZdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAxNywKKyAgICAgICAgICAgICAgICA0KTsKKyNlbmRpZgorICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogY2hyb21hIEFDICovCisgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgyOworICAgIGlmIChibG9ja0NvZGVkKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gODsgaS0tO2Jsb2NrSW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCisgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAxNSk7CisjZWxzZQorICAgICAgICAgICAgb214UmVzID0gIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAgICAgMTUpOworI2VuZGlmCisgICAgICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBhcnNlIHJlc2lkdWFsIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQgc3RvcmUgaW4gJ3BSZXNpZHVhbCcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKKyAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaiwgdG1wOworICAgIGkzMiBuYzsKKyAgICB1MzIgYmxvY2tDb2RlZDsKKyAgICB1MzIgYmxvY2tJbmRleDsKKyAgICB1MzIgaXMxNngxNjsKKyAgICBpMzIgKCpsZXZlbClbMTZdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFJlc2lkdWFsKTsKKworICAgIGxldmVsID0gcFJlc2lkdWFsLT5sZXZlbDsKKworICAgIC8qIGx1bWEgREMgaXMgYXQgaW5kZXggMjQgKi8KKyAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgeworICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCAwLCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwgbGV2ZWxbMjRdLCBuYywgMTYpOworICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNF0gPSAodG1wID4+IDQpICYgMHhGRjsKKyAgICAgICAgaXMxNngxNiA9IEhBTlRST19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBmb3IgKGkgPSA0LCBibG9ja0luZGV4ID0gMDsgaS0tOykKKyAgICB7CisgICAgICAgIC8qIGx1bWEgY2JwIGluIGJpdHMgMC0zICovCisgICAgICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MTsKKyAgICAgICAgY29kZWRCbG9ja1BhdHRlcm4gPj49IDE7CisgICAgICAgIGlmIChibG9ja0NvZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSA0OyBqLS07IGJsb2NrSW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCBibG9ja0luZGV4LCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOworICAgICAgICAgICAgICAgIGlmIChpczE2eDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSArIDEsIG5jLCAxNSk7CisgICAgICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSB0bXAgPj4gMTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxbYmxvY2tJbmRleF0sIG5jLCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSB0bXAgPj4gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSA9ICh0bXAgPj4gNCkgJiAweEZGOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJsb2NrSW5kZXggKz0gNDsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgREMgYmxvY2sgYXJlIGF0IGluZGljZXMgMjUgYW5kIDI2ICovCisgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgzOworICAgIGlmIChibG9ja0NvZGVkKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI1XSwgLTEsIDQpOworICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNV0gPSAodG1wID4+IDQpICYgMHhGRjsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI1XSs0LCAtMSwgNCk7CisgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSA9ICh0bXAgPj4gNCkgJiAweEZGOworICAgIH0KKworICAgIC8qIGNocm9tYSBBQyAqLworICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MjsKKyAgICBpZiAoYmxvY2tDb2RlZCkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDg7IGktLTtibG9ja0luZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jID0gKGkzMilEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSArIDEsIG5jLCAxNSk7CisgICAgICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiA0KSAmIDB4RkY7CisgICAgICAgICAgICBwUmVzaWR1YWwtPmNvZWZmTWFwW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiAxNSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGV0ZXJtaW5lTmMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIG5DIG9mIGEgYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgSDI2NERFQ19PTVhETAordTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCB1OCAqcFRvdGFsQ29lZmYpCisjZWxzZQordTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCBpMTYgKnBUb3RhbENvZWZmKQorI2VuZGlmCit7CisvKmxpbnQgLWU3MDIgKi8KKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKyAgICBpMzIgbjsKKyAgICBjb25zdCBuZWlnaGJvdXJfdCAqbmVpZ2hib3VyQSwgKm5laWdoYm91ckI7CisgICAgdTggbmVpZ2hib3VyQWluZGV4LCBuZWlnaGJvdXJCaW5kZXg7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOworCisgICAgLyogaWYgbmVpZ2hib3VyIGJsb2NrIGJlbG9uZ3MgdG8gY3VycmVudCBtYWNyb2Jsb2NrIHRvdGFsQ29lZmYgYXJyYXkKKyAgICAgKiBtYlN0b3JhZ2UgaGFzIG5vdCBiZWVuIHNldC91cGRhdGVkIHlldCAtPiB1c2UgcFRvdGFsQ29lZmYgKi8KKyAgICBuZWlnaGJvdXJBID0gaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9ja0luZGV4KTsKKyAgICBuZWlnaGJvdXJCID0gaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9ja0luZGV4KTsKKyAgICBuZWlnaGJvdXJBaW5kZXggPSBuZWlnaGJvdXJBLT5pbmRleDsKKyAgICBuZWlnaGJvdXJCaW5kZXggPSBuZWlnaGJvdXJCLT5pbmRleDsKKyAgICBpZiAobmVpZ2hib3VyQS0+bWIgPT0gTUJfQ1VSUiAmJiBuZWlnaGJvdXJCLT5tYiA9PSBNQl9DVVJSKQorICAgIHsKKyAgICAgICAgbiA9IChwVG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdICsKKyAgICAgICAgICAgICBwVG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdICsgMSk+PjE7CisgICAgfQorICAgIGVsc2UgaWYgKG5laWdoYm91ckEtPm1iID09IE1CX0NVUlIpCisgICAgeworICAgICAgICBuID0gcFRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XTsKKyAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKSkKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpID4+IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAobmVpZ2hib3VyQi0+bWIgPT0gTUJfQ1VSUikKKyAgICB7CisgICAgICAgIG4gPSBwVG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdOworICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gKG4gKyBwTWItPm1iQS0+dG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdICsgMSkgPj4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuID0gdG1wID0gMDsKKyAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKSkKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IHBNYi0+bWJBLT50b3RhbENvZWZmW25laWdoYm91ckFpbmRleF07CisgICAgICAgICAgICB0bXAgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpID4+IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbiA9IHBNYi0+bWJCLT50b3RhbENvZWZmW25laWdoYm91ckJpbmRleF07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKCh1MzIpbik7CisvKmxpbnQgK2U3MDIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBDYnBJbnRyYTE2eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBSZXR1cm5zIHRoZSBjb2RlZCBibG9jayBwYXR0ZXJuIGZvciBpbnRyYSAxNngxNiBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgQ2JwSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGNicDsKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWJUeXBlID49IElfMTZ4MTZfMF8wXzAgJiYgbWJUeXBlIDw9IElfMTZ4MTZfM18yXzEpOworCisgICAgaWYgKG1iVHlwZSA+PSBJXzE2eDE2XzBfMF8xKQorICAgICAgICBjYnAgPSAxNTsKKyAgICBlbHNlCisgICAgICAgIGNicCA9IDA7CisKKyAgICAvKiB0bXAgaXMgMCBmb3IgSV8xNngxNl8wXzBfMCBtYiB0eXBlICovCisgICAgLyogaWdub3JlIGxpbnQgd2FybmluZyBvbiBhcml0aG1ldGljIG9uIGVudW0ncyAqLworICAgIHRtcCA9IC8qbGludCAtZSg2NTYpKi8obWJUeXBlIC0gSV8xNngxNl8wXzBfMCkgPj4gMjsKKyAgICBpZiAodG1wID4gMikKKyAgICAgICAgdG1wIC09IDM7CisKKyAgICBjYnAgKz0gdG1wIDw8IDQ7CisKKyAgICByZXR1cm4oY2JwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIHByZWRpY3Rpb24gbW9kZSBmb3IgaW50cmEgMTZ4MTYgbWFjcm9ibG9jay4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYlR5cGUgPj0gSV8xNngxNl8wXzBfMCAmJiBtYlR5cGUgPD0gSV8xNngxNl8zXzJfMSk7CisKKyAgICAvKiB0bXAgaXMgMCBmb3IgSV8xNngxNl8wXzBfMCBtYiB0eXBlICovCisgICAgLyogaWdub3JlIGxpbnQgd2FybmluZyBvbiBhcml0aG1ldGljIG9uIGVudW0ncyAqLworICAgIHRtcCA9IC8qbGludCAtZSg2NTYpKi8obWJUeXBlIC0gSV8xNngxNl8wXzBfMCk7CisKKyAgICByZXR1cm4odG1wICYgMHgzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBEZWNvZGUgb25lIG1hY3JvYmxvY2sgYW5kIHdyaXRlIGludG8gb3V0cHV0IGltYWdlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICAgICAgICAgIG1iTGF5ZXIgICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQorICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKKyAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgorICAgICAgICAgIHFwWSAgICAgICAgICAgcG9pbnRlciB0byBzbGljZSBRUAorICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgorICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkICBmbGFnIHNwZWNpZnlpbmcgaWYgbmVpZ2hib3VyaW5nIGludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIGFyZSB1c2VkIGluIGludHJhIHByZWRpY3Rpb24KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBjdXJySW1hZ2UgICAgIGRlY29kZWQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gb3V0cHV0IGltYWdlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKKyAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIG1hY3JvYmxvY2sgZGVjb2RpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICBpbWFnZV90ICpjdXJySW1hZ2UsIGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgKnFwWSwgdTMyIG1iTnVtLAorICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIHU4KiBkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXA7CisgICAgbWJUeXBlX2UgbWJUeXBlOworI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICBjb25zdCB1OCAqcFNyYzsKKyNlbmRpZgorLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKyAgICBBU1NFUlQoY3VyckltYWdlKTsKKyAgICBBU1NFUlQocXBZICYmICpxcFkgPCA1Mik7CisgICAgQVNTRVJUKG1iTnVtIDwgY3VyckltYWdlLT53aWR0aCpjdXJySW1hZ2UtPmhlaWdodCk7CisKKyAgICBtYlR5cGUgPSBwTWJMYXllci0+bWJUeXBlOworICAgIHBNYi0+bWJUeXBlID0gbWJUeXBlOworCisgICAgcE1iLT5kZWNvZGVkKys7CisKKyAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhjdXJySW1hZ2UsIG1iTnVtKTsKKworICAgIGlmIChtYlR5cGUgPT0gSV9QQ00pCisgICAgeworICAgICAgICB1OCAqcERhdGEgPSAodTgqKWRhdGE7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICB1OCAqdG90ID0gcE1iLT50b3RhbENvZWZmOworI2Vsc2UKKyAgICAgICAgaTE2ICp0b3QgPSBwTWItPnRvdGFsQ29lZmY7CisjZW5kaWYKKyAgICAgICAgaTMyICpsZXYgPSBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWxbMF07CisKKyAgICAgICAgcE1iLT5xcFkgPSAwOworCisgICAgICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKKyAgICAgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCisgICAgICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAyNDsgaS0tOykKKyAgICAgICAgICAgICAgICAqdG90KysgPSAxNjsKKyAgICAgICAgICAgIHJldHVybiBIQU5UUk9fT0s7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAyNDsgaS0tOykKKyAgICAgICAgeworICAgICAgICAgICAgKnRvdCsrID0gMTY7CisgICAgICAgICAgICBmb3IgKHRtcCA9IDE2OyB0bXAtLTspCisgICAgICAgICAgICAgICAgKnBEYXRhKysgPSAodTgpKCpsZXYrKyk7CisgICAgICAgIH0KKyAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsICh1OCopZGF0YSk7CisKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKHBNYiwgcE1iTGF5ZXIsIGRwYiwgbWJOdW0sCisgICAgICAgICAgICAgICAgY3VyckltYWdlLCAodTgqKWRhdGEpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChtYlR5cGUgIT0gUF9Ta2lwKQorICAgICAgICB7CisgICAgICAgICAgICBIMjY0U3dEZWNNZW1jcHkocE1iLT50b3RhbENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC50b3RhbENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3KnNpemVvZigqcE1iLT50b3RhbENvZWZmKSk7CisKKyAgICAgICAgICAgIC8qIHVwZGF0ZSBxcFkgKi8KKyAgICAgICAgICAgIGlmIChwTWJMYXllci0+bWJRcERlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpxcFkgPSAqcXBZICsgcE1iTGF5ZXItPm1iUXBEZWx0YTsKKyAgICAgICAgICAgICAgICBpZiAoKnFwWSA8IDApICpxcFkgKz0gNTI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKnFwWSA+PSA1MikgKnFwWSAtPSA1MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBNYi0+cXBZID0gKHUzMikqcXBZOworCisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICAgICAgcFNyYyA9IHBNYkxheWVyLT5yZXNpZHVhbC5wb3NDb2VmQnVmOworCisgICAgICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9NWFJlc3VsdCByZXM7CisgICAgICAgICAgICAgICAgdTggKnA7CisgICAgICAgICAgICAgICAgdTggKnRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgdG90YWxDb2VmZisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGRhdGEgKyBsdW1hSW5kZXhbaV07CisgICAgICAgICAgICAgICAgICAgIGlmICgqdG90YWxDb2VmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsIHAsIDAsIHAsIDE2LCAxNiwgKnFwWSwgKnRvdGFsQ29lZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTR4NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbChwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyckltYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJJbWFnZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKHBNYiwgZGF0YSwgJnBTcmMpOworCisjZWxzZQorICAgICAgICAgICAgdG1wID0gUHJvY2Vzc1Jlc2lkdWFsKHBNYiwgcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsLAorICAgICAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC5jb2VmZk1hcCk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEgyNjRTd0RlY01lbXNldChwTWItPnRvdGFsQ29lZmYsIDAsIDI3KnNpemVvZigqcE1iLT50b3RhbENvZWZmKSk7CisgICAgICAgICAgICBwTWItPnFwWSA9ICh1MzIpKnFwWTsKKyAgICAgICAgfQorI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICAgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KKyAgICAgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCisgICAgICAgICAgICByZXR1cm4gSEFOVFJPX09LOworCisgICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKKyNlbHNlCisgICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSAhPSBQUkVEX01PREVfSU5URVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYVByZWRpY3Rpb24ocE1iLCBwTWJMYXllciwgY3VyckltYWdlLCBtYk51bSwKKyAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsICh1OCopZGF0YSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykgcmV0dXJuICh0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEludGVyUHJlZGljdGlvbihwTWIsIHBNYkxheWVyLCBkcGIsIG1iTnVtLAorICAgICAgICAgICAgICAgIGN1cnJJbWFnZSwgKHU4KilkYXRhKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKSByZXR1cm4gKHRtcCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKworI2lmZGVmIEgyNjRERUNfT01YREwKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgY2hyb21hIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBjb25zdCB1OCAqKnBTcmMgKQoreworICAgIHUzMiBpOworICAgIHUzMiBjaHJvbWFRcDsKKyAgICBpMTYgKnBEYzsKKyAgICBpMTYgZGNbNCArIDRdID0gezAsMCwwLDAsMCwwLDAsMH07CisgICAgdTggKnRvdGFsQ29lZmY7CisgICAgT01YUmVzdWx0IHJlc3VsdDsKKyAgICB1OCAqcDsKKworICAgIC8qIGNocm9tYSBEQyBwcm9jZXNzaW5nLiBGaXJzdCBjaHJvbWEgZGMgYmxvY2sgaXMgYmxvY2sgd2l0aCBpbmRleCAyNSAqLworICAgIGNocm9tYVFwID0KKyAgICAgICAgaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilwTWItPnFwWSArIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCldOworCisgICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNV0pCisgICAgeworICAgICAgICBwRGMgPSBkYzsKKyAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcigKKyAgICAgICAgICAgICAgICBwU3JjLAorICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAoaTMyKWNocm9tYVFwKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNl0pCisgICAgeworICAgICAgICBwRGMgPSBkYys0OworICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAorICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgcERjLAorICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXApOworICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgIH0KKworICAgIHBEYyA9IGRjOworICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmYgKyAxNjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBwRGMrKywgdG90YWxDb2VmZisrKQorICAgIHsKKyAgICAgICAgLyogY2hyb21hIHByZWRpY3Rpb24gKi8KKyAgICAgICAgaWYgKCp0b3RhbENvZWZmIHx8ICpwRGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSBkYXRhICsgY2hyb21hSW5kZXhbaV07CisgICAgICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAorICAgICAgICAgICAgICAgICAgICBwU3JjLAorICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICBwRGMsCisgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXAsCisgICAgICAgICAgICAgICAgICAgICp0b3RhbENvZWZmKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBsdW1hIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgaW50cmFDaHJvbWFQcmVkTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4KiogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3QgKmltYWdlKQoreworICAgIHUzMiBpOworICAgIGkxNiAqcERjOworICAgIGkxNiBkY1sxNl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTggKnRvdGFsQ29lZmY7CisgICAgT01YUmVzdWx0IHJlc3VsdDsKKyAgICB1OCAqcDsKKworICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7CisKKyAgICBpZiAodG90YWxDb2VmZlsyNF0pCisgICAgeworICAgICAgICBwRGMgPSBkYzsKKyAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIoCisgICAgICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAgICAgKGkzMilwTWItPnFwWSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgfQorICAgIC8qIEludHJhIDE2eDE2IHByZWQgKi8KKyAgICBpZiAoaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKHBNYiwgZGF0YSwgaW1hZ2UtPmx1bWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPndpZHRoKjE2LCBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIHRvdGFsQ29lZmYrKykKKyAgICB7CisgICAgICAgIHAgPSBkYXRhICsgbHVtYUluZGV4W2ldOworICAgICAgICBwRGMgPSAmZGNbZGNDb2VmZkluZGV4W2ldXTsKKyAgICAgICAgaWYgKCp0b3RhbENvZWZmIHx8ICpwRGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCisgICAgICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZLAorICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKHBNYiwgZGF0YSArIDI1NiwKKyAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICAgICAgICAgICAgICBpbnRyYUNocm9tYVByZWRNb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkKSAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgbHVtYSB3aXRoCisgICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICoqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV90ICppbWFnZSkKK3sKKyAgICB1MzIgaTsKKyAgICB1OCAqdG90YWxDb2VmZjsKKyAgICBPTVhSZXN1bHQgcmVzdWx0OworICAgIHU4ICpwOworCisgICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCB0b3RhbENvZWZmKyspCisgICAgeworICAgICAgICBwID0gZGF0YSArIGx1bWFJbmRleFtpXTsKKyAgICAgICAgaWYgKGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24ocE1iLCBwLCBtYkxheWVyLCBpbWFnZS0+bHVtYSwKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPndpZHRoKjE2LCBjb25zdHJhaW5lZEludHJhUHJlZCwgaSkgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmICgqdG90YWxDb2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKKyAgICAgICAgICAgICAgICAgICAgcFNyYywKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZLAorICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKHBNYiwgZGF0YSArIDI1NiwKKyAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICAgICAgICAgICAgICBtYkxheWVyLT5tYlByZWQuaW50cmFDaHJvbWFQcmVkTW9kZSwKKyAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICByZXR1cm4gSEFOVFJPX09LOworfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJvY2Vzc1Jlc2lkdWFsCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIG9uZSBtYWNyb2Jsb2NrIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBQcm9jZXNzUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgaTMyIHJlc2lkdWFsTGV2ZWxbXVsxNl0sIHUzMiAqY29lZmZNYXApCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIGNocm9tYVFwOworICAgIGkzMiAoKmJsb2NrRGF0YSlbMTZdOworICAgIGkzMiAoKmJsb2NrRGMpWzE2XTsKKyAgICBpMTYgKnRvdGFsQ29lZmY7CisgICAgaTMyICpjaHJvbWFEYzsKKyAgICBjb25zdCB1MzIgKmRjQ29lZmZJZHg7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChyZXNpZHVhbExldmVsKTsKKworICAgIC8qIHNldCBwb2ludGVycyB0byBEQyBjb2VmZmljaWVudCBibG9ja3MgKi8KKyAgICBibG9ja0RjID0gcmVzaWR1YWxMZXZlbCArIDI0OworCisgICAgYmxvY2tEYXRhID0gcmVzaWR1YWxMZXZlbDsKKyAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOworICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQorICAgIHsKKyAgICAgICAgaWYgKHRvdGFsQ29lZmZbMjRdKQorICAgICAgICB7CisgICAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0x1bWFEYygqYmxvY2tEYywgcE1iLT5xcFkpOworICAgICAgICB9CisgICAgICAgIGRjQ29lZmZJZHggPSBkY0NvZWZmSW5kZXg7CisKKyAgICAgICAgZm9yIChpID0gMTY7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2V0IGRjIGNvZWZmaWNpZW50IG9mIGx1bWEgYmxvY2sgKi8KKyAgICAgICAgICAgICgqYmxvY2tEYXRhKVswXSA9ICgqYmxvY2tEYylbKmRjQ29lZmZJZHgrK107CisgICAgICAgICAgICBpZiAoKCpibG9ja0RhdGEpWzBdIHx8ICp0b3RhbENvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIHBNYi0+cXBZLCAxLCAqY29lZmZNYXApICE9CisgICAgICAgICAgICAgICAgICAgIEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMTY7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCp0b3RhbENvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIHBNYi0+cXBZLCAwLCAqY29lZmZNYXApICE9CisgICAgICAgICAgICAgICAgICAgIEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaHJvbWEgREMgcHJvY2Vzc2luZy4gRmlyc3QgY2hyb21hIGRjIGJsb2NrIGlzIGJsb2NrIHdpdGggaW5kZXggMjUgKi8KKyAgICBjaHJvbWFRcCA9CisgICAgICAgIGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcE1iLT5xcFkgKyBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICBpZiAocE1iLT50b3RhbENvZWZmWzI1XSB8fCBwTWItPnRvdGFsQ29lZmZbMjZdKQorICAgICAgICBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKHJlc2lkdWFsTGV2ZWxbMjVdLCBjaHJvbWFRcCk7CisgICAgY2hyb21hRGMgPSByZXNpZHVhbExldmVsWzI1XTsKKyAgICBmb3IgKGkgPSA4OyBpLS07IGJsb2NrRGF0YSsrLCB0b3RhbENvZWZmKyssIGNvZWZmTWFwKyspCisgICAgeworICAgICAgICAvKiBzZXQgZGMgY29lZmZpY2llbnQgb2YgY2hyb21hIGJsb2NrICovCisgICAgICAgICgqYmxvY2tEYXRhKVswXSA9ICpjaHJvbWFEYysrOworICAgICAgICBpZiAoKCpibG9ja0RhdGEpWzBdIHx8ICp0b3RhbENvZWZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaDI2NGJzZFByb2Nlc3NCbG9jaygqYmxvY2tEYXRhLCBjaHJvbWFRcCwgMSwqY29lZmZNYXApICE9CisgICAgICAgICAgICAgICAgSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBNQVJLX1JFU0lEVUFMX0VNUFRZKCpibG9ja0RhdGEpOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworfQorI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3ViTWJQYXJ0TW9kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgbWFjcm9ibG9jaydzIHN1Yi1wYXJ0aXRpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3ViTWJQYXJ0TW9kZV9lIGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHN1Yk1iVHlwZSA8IDQpOworCisgICAgcmV0dXJuKChzdWJNYlBhcnRNb2RlX2Upc3ViTWJUeXBlKTsKKworfQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyYmMzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX01BQ1JPQkxPQ0tfTEFZRVJfSAorI2RlZmluZSBIMjY0U1dERUNfTUFDUk9CTE9DS19MQVlFUl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBNYWNybyB0byBkZXRlcm1pbmUgaWYgYSBtYiBpcyBhbiBpbnRyYSBtYiAqLworI2RlZmluZSBJU19JTlRSQV9NQihhKSAoKGEpLm1iVHlwZSA+IDUpCisKKy8qIE1hY3JvIHRvIGRldGVybWluZSBpZiBhIG1iIGlzIGFuIElfUENNIG1iICovCisjZGVmaW5lIElTX0lfUENNX01CKGEpICgoYSkubWJUeXBlID09IDMxKQorCit0eXBlZGVmIGVudW0geworICAgIFBfU2tpcCAgICAgICAgICA9IDAsCisgICAgUF9MMF8xNngxNiAgICAgID0gMSwKKyAgICBQX0wwX0wwXzE2eDggICAgPSAyLAorICAgIFBfTDBfTDBfOHgxNiAgICA9IDMsCisgICAgUF84eDggICAgICAgICAgID0gNCwKKyAgICBQXzh4OHJlZjAgICAgICAgPSA1LAorICAgIElfNHg0ICAgICAgICAgICA9IDYsCisgICAgSV8xNngxNl8wXzBfMCAgID0gNywKKyAgICBJXzE2eDE2XzFfMF8wICAgPSA4LAorICAgIElfMTZ4MTZfMl8wXzAgICA9IDksCisgICAgSV8xNngxNl8zXzBfMCAgID0gMTAsCisgICAgSV8xNngxNl8wXzFfMCAgID0gMTEsCisgICAgSV8xNngxNl8xXzFfMCAgID0gMTIsCisgICAgSV8xNngxNl8yXzFfMCAgID0gMTMsCisgICAgSV8xNngxNl8zXzFfMCAgID0gMTQsCisgICAgSV8xNngxNl8wXzJfMCAgID0gMTUsCisgICAgSV8xNngxNl8xXzJfMCAgID0gMTYsCisgICAgSV8xNngxNl8yXzJfMCAgID0gMTcsCisgICAgSV8xNngxNl8zXzJfMCAgID0gMTgsCisgICAgSV8xNngxNl8wXzBfMSAgID0gMTksCisgICAgSV8xNngxNl8xXzBfMSAgID0gMjAsCisgICAgSV8xNngxNl8yXzBfMSAgID0gMjEsCisgICAgSV8xNngxNl8zXzBfMSAgID0gMjIsCisgICAgSV8xNngxNl8wXzFfMSAgID0gMjMsCisgICAgSV8xNngxNl8xXzFfMSAgID0gMjQsCisgICAgSV8xNngxNl8yXzFfMSAgID0gMjUsCisgICAgSV8xNngxNl8zXzFfMSAgID0gMjYsCisgICAgSV8xNngxNl8wXzJfMSAgID0gMjcsCisgICAgSV8xNngxNl8xXzJfMSAgID0gMjgsCisgICAgSV8xNngxNl8yXzJfMSAgID0gMjksCisgICAgSV8xNngxNl8zXzJfMSAgID0gMzAsCisgICAgSV9QQ00gICAgICAgICAgID0gMzEKK30gbWJUeXBlX2U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUF9MMF84eDggPSAwLAorICAgIFBfTDBfOHg0ID0gMSwKKyAgICBQX0wwXzR4OCA9IDIsCisgICAgUF9MMF80eDQgPSAzCit9IHN1Yk1iVHlwZV9lOworCit0eXBlZGVmIGVudW0geworICAgIE1CX1BfMTZ4MTYgPSAwLAorICAgIE1CX1BfMTZ4OCwKKyAgICBNQl9QXzh4MTYsCisgICAgTUJfUF84eDgKK30gbWJQYXJ0TW9kZV9lOworCit0eXBlZGVmIGVudW0geworICAgIE1CX1NQXzh4OCA9IDAsCisgICAgTUJfU1BfOHg0LAorICAgIE1CX1NQXzR4OCwKKyAgICBNQl9TUF80eDQKK30gc3ViTWJQYXJ0TW9kZV9lOworCit0eXBlZGVmIGVudW0geworICAgIFBSRURfTU9ERV9JTlRSQTR4NCA9IDAsCisgICAgUFJFRF9NT0RFX0lOVFJBMTZ4MTYgICwKKyAgICBQUkVEX01PREVfSU5URVIKK30gbWJQYXJ0UHJlZE1vZGVfZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIE12UHJlZGljdGlvbjE2eDE2IGFzc3VtZXMgdGhhdCBNVnMgYXJlIDE2Yml0cyAqLworICAgIGkxNiBob3I7CisgICAgaTE2IHZlcjsKK30gbXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcHJldkludHJhNHg0UHJlZE1vZGVGbGFnWzE2XTsKKyAgICB1MzIgcmVtSW50cmE0eDRQcmVkTW9kZVsxNl07CisgICAgdTMyIGludHJhQ2hyb21hUHJlZE1vZGU7CisgICAgdTMyIHJlZklkeEwwWzRdOworICAgIG12X3QgbXZkTDBbNF07Cit9IG1iUHJlZF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZVs0XTsKKyAgICB1MzIgcmVmSWR4TDBbNF07CisgICAgbXZfdCBtdmRMMFs0XVs0XTsKK30gc3ViTWJQcmVkX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgIHU4IHBvc0NvZWZCdWZbMjcqMTYqM107CisgICAgdTggdG90YWxDb2VmZlsyN107CisjZWxzZQorICAgIGkxNiB0b3RhbENvZWZmWzI3XTsKKyNlbmRpZgorICAgIGkzMiBsZXZlbFsyNl1bMTZdOworICAgIHUzMiBjb2VmZk1hcFsyNF07Cit9IHJlc2lkdWFsX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbWJUeXBlX2UgbWJUeXBlOworICAgIHUzMiBjb2RlZEJsb2NrUGF0dGVybjsKKyAgICBpMzIgbWJRcERlbHRhOworICAgIG1iUHJlZF90IG1iUHJlZDsKKyAgICBzdWJNYlByZWRfdCBzdWJNYlByZWQ7CisgICAgcmVzaWR1YWxfdCByZXNpZHVhbDsKK30gbWFjcm9ibG9ja0xheWVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1iU3RvcmFnZQoreworICAgIG1iVHlwZV9lIG1iVHlwZTsKKyAgICB1MzIgc2xpY2VJZDsKKyAgICB1MzIgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7CisgICAgaTMyIGZpbHRlck9mZnNldEE7CisgICAgaTMyIGZpbHRlck9mZnNldEI7CisgICAgdTMyIHFwWTsKKyAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldDsKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgdTggdG90YWxDb2VmZlsyN107CisjZWxzZQorICAgIGkxNiB0b3RhbENvZWZmWzI3XTsKKyNlbmRpZgorICAgIHU4IGludHJhNHg0UHJlZE1vZGVbMTZdOworICAgIHUzMiByZWZQaWNbNF07CisgICAgdTgqIHJlZkFkZHJbNF07CisgICAgbXZfdCBtdlsxNl07CisgICAgdTMyIGRlY29kZWQ7CisgICAgc3RydWN0IG1iU3RvcmFnZSAqbWJBOworICAgIHN0cnVjdCBtYlN0b3JhZ2UgKm1iQjsKKyAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkM7CisgICAgc3RydWN0IG1iU3RvcmFnZSAqbWJEOworfSBtYlN0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLCBtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgc2xpY2VUeXBlLAorICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpOworCit1MzIgaDI2NGJzZE51bU1iUGFydChtYlR5cGVfZSBtYlR5cGUpOwordTMyIGgyNjRic2ROdW1TdWJNYlBhcnQoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKTsKKworc3ViTWJQYXJ0TW9kZV9lIGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSk7CisKK3UzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayhtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgaW1hZ2VfdCAqY3VyckltYWdlLCBkcGJTdG9yYWdlX3QgKmRwYiwgaTMyICpxcFksIHUzMiBtYk51bSwKKyAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCB1OCogZGF0YSk7CisKK3UzMiBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSk7CisKK21iUGFydFByZWRNb2RlX2UgaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZV9lIG1iVHlwZSk7CisjaWZkZWYgSDI2NERFQ19ORU9OCit1MzIgaDI2NGJzZENsZWFyTWJMYXllcihtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsIHUzMiBzaXplKTsKKyNlbmRpZgorCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19NQUNST0JMT0NLX0xBWUVSX0ggKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NGM0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVOYWxVbml0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlTmFsVW5pdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgTkFMIHVuaXQgaGVhZGVyIGluZm9ybWF0aW9uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBOYWxVbml0ICAgICAgICBOQUwgdW5pdCBoZWFkZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU5hbFVuaXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBuYWxVbml0X3QgKnBOYWxVbml0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwTmFsVW5pdCk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09IDApOworCisgICAgLyogZm9yYmlkZGVuX3plcm9fYml0IChub3QgY2hlY2tlZCB0byBiZSB6ZXJvLCBlcnJvcnMgaWdub3JlZCkgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIC8qIEFzc3VtaW5nIHRoYXQgTkFMIHVuaXQgc3RhcnRzIGZyb20gYnl0ZSBib3VuZGFyeSCtPiBkb24ndCBoYXZlIHRvIGNoZWNrCisgICAgICogZm9sbG93aW5nIDcgYml0cyBmb3IgRU5EX09GX1NUUkVBTSAqLworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKKyAgICBwTmFsVW5pdC0+bmFsUmVmSWRjID0gdG1wOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPSAobmFsVW5pdFR5cGVfZSl0bXA7CisKKyAgICAvKiBkYXRhIHBhcnRpdGlvbmluZyBOQUwgdW5pdHMgbm90IHN1cHBvcnRlZCAqLworICAgIGlmICggKHRtcCA9PSAyKSB8fCAodG1wID09IDMpIHx8ICh0bXAgPT0gNCkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIG5hbF9yZWZfaWRjIHNoYWxsIG5vdCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLworICAgIGlmICggKCAodG1wID09IE5BTF9TRVFfUEFSQU1fU0VUKSB8fCAodG1wID09IE5BTF9QSUNfUEFSQU1fU0VUKSB8fAorICAgICAgICAgICAodG1wID09IE5BTF9DT0RFRF9TTElDRV9JRFIpICkgJiYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICAvKiBuYWxfcmVmX2lkYyBzaGFsbCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLworICAgIGVsc2UgaWYgKCAoICh0bXAgPT0gTkFMX1NFSSkgfHwgKHRtcCA9PSBOQUxfQUNDRVNTX1VOSVRfREVMSU1JVEVSKSB8fAorICAgICAgICAgICAgICAgICh0bXAgPT0gTkFMX0VORF9PRl9TRVFVRU5DRSkgfHwgKHRtcCA9PSBOQUxfRU5EX09GX1NUUkVBTSkgfHwKKyAgICAgICAgICAgICAgICAodG1wID09IE5BTF9GSUxMRVJfREFUQSkgKSAmJiAocE5hbFVuaXQtPm5hbFJlZklkYyAhPSAwKSApCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODk1N2JmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19OQUxfVU5JVF9ICisjZGVmaW5lIEgyNjRTV0RFQ19OQUxfVU5JVF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgTkFMIHVuaXQgcG9pbnRlZCBieSBwTmFsVW5pdCBjb250YWlucyBhbiBJRFIgc2xpY2UgKi8KKyNkZWZpbmUgSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSBcCisgICAgKChwTmFsVW5pdCktPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBOQUxfQ09ERURfU0xJQ0UgPSAxLAorICAgIE5BTF9DT0RFRF9TTElDRV9JRFIgPSA1LAorICAgIE5BTF9TRUkgPSA2LAorICAgIE5BTF9TRVFfUEFSQU1fU0VUID0gNywKKyAgICBOQUxfUElDX1BBUkFNX1NFVCA9IDgsCisgICAgTkFMX0FDQ0VTU19VTklUX0RFTElNSVRFUiA9IDksCisgICAgTkFMX0VORF9PRl9TRVFVRU5DRSA9IDEwLAorICAgIE5BTF9FTkRfT0ZfU1RSRUFNID0gMTEsCisgICAgTkFMX0ZJTExFUl9EQVRBID0gMTIsCisgICAgTkFMX01BWF9UWVBFX1ZBTFVFID0gMzEKK30gbmFsVW5pdFR5cGVfZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlOworICAgIHUzMiBuYWxSZWZJZGM7Cit9IG5hbFVuaXRfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU5hbFVuaXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBuYWxVbml0X3QgKnBOYWxVbml0KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTkFMX1VOSVRfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2U1ZWVmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzCisgICAgICAgICAgaDI2NGJzZEdldE5laWdoYm91ck1iCisgICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQQorICAgICAgICAgIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IKKyAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDCisgICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZvbGxvd2luZyBmb3VyIHRhYmxlcyBpbmRpY2F0ZSBuZWlnaGJvdXJzIG9mIGVhY2ggYmxvY2sgb2YgYSBtYWNyb2Jsb2NrLgorICogRmlyc3QgMTYgdmFsdWVzIGFyZSBmb3IgbHVtYSBibG9ja3MsIG5leHQgNCB2YWx1ZXMgZm9yIENiIGFuZCBsYXN0IDQKKyAqIHZhbHVlcyBmb3IgQ3IuIEVsZW1lbnRzIG9mIHRoZSB0YWJsZSBpbmRpY2F0ZSB0byB3aGljaCBtYWNyb2Jsb2NrIHRoZQorICogbmVpZ2hib3VyIGJsb2NrIGJlbG9uZ3MgYW5kIHRoZSBpbmRleCBvZiB0aGUgbmVpZ2hib3VyIGJsb2NrIGluIHF1ZXN0aW9uLgorICogSW5kZXhpbmcgb2YgdGhlIGJsb2NrcyBnb2VzIGFzIGZvbGxvd3MKKyAqCisgKiAgICAgICAgICBZICAgICAgICAgICAgIENiICAgICAgIENyCisgKiAgICAgIDAgIDEgIDQgIDUgICAgICAxNiAxNyAgICAyMCAyMQorICogICAgICAyICAzICA2ICA3ICAgICAgMTggMTkgICAgMjIgMjMKKyAqICAgICAgOCAgOSAxMiAxMworICogICAgIDEwIDExIDE0IDE1CisgKi8KKworLyogbGVmdCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0FfNHg0QlsyNF0gPSB7CisgICAge01CX0EsNX0sICAgIHtNQl9DVVJSLDB9LCB7TUJfQSw3fSwgICAge01CX0NVUlIsMn0sCisgICAge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sCisgICAge01CX0EsMTN9LCAgIHtNQl9DVVJSLDh9LCB7TUJfQSwxNX0sICAge01CX0NVUlIsMTB9LAorICAgIHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0se01CX0NVUlIsMTF9LHtNQl9DVVJSLDE0fSwKKyAgICB7TUJfQSwxN30sICAge01CX0NVUlIsMTZ9LHtNQl9BLDE5fSwgICB7TUJfQ1VSUiwxOH0sCisgICAge01CX0EsMjF9LCAgIHtNQl9DVVJSLDIwfSx7TUJfQSwyM30sICAge01CX0NVUlIsMjJ9IH07CisKKy8qIGFib3ZlIG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQl80eDRCWzI0XSA9IHsKKyAgICB7TUJfQiwxMH0sICAge01CX0IsMTF9LCAgIHtNQl9DVVJSLDB9LCB7TUJfQ1VSUiwxfSwKKyAgICB7TUJfQiwxNH0sICAge01CX0IsMTV9LCAgIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiw1fSwKKyAgICB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDh9LCB7TUJfQ1VSUiw5fSwKKyAgICB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9DVVJSLDEyfSx7TUJfQ1VSUiwxM30sCisgICAge01CX0IsMTh9LCAgIHtNQl9CLDE5fSwgICB7TUJfQ1VSUiwxNn0se01CX0NVUlIsMTd9LAorICAgIHtNQl9CLDIyfSwgICB7TUJfQiwyM30sICAge01CX0NVUlIsMjB9LHtNQl9DVVJSLDIxfSB9OworCisvKiBhYm92ZS1yaWdodCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0NfNHg0QlsyNF0gPSB7CisgICAge01CX0IsMTF9LCAgIHtNQl9CLDE0fSwgICB7TUJfQ1VSUiwxfSwge01CX05BLDR9LAorICAgIHtNQl9CLDE1fSwgICB7TUJfQywxMH0sICAge01CX0NVUlIsNX0sIHtNQl9OQSwwfSwKKyAgICB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMTJ9LAorICAgIHtNQl9DVVJSLDd9LCB7TUJfTkEsMn0sICAge01CX0NVUlIsMTN9LHtNQl9OQSw4fSwKKyAgICB7TUJfQiwxOX0sICAge01CX0MsMTh9LCAgIHtNQl9DVVJSLDE3fSx7TUJfTkEsMTZ9LAorICAgIHtNQl9CLDIzfSwgICB7TUJfQywyMn0sICAge01CX0NVUlIsMjF9LHtNQl9OQSwyMH0gfTsKKworLyogYWJvdmUtbGVmdCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0RfNHg0QlsyNF0gPSB7CisgICAge01CX0QsMTV9LCAgIHtNQl9CLDEwfSwgICB7TUJfQSw1fSwgICAge01CX0NVUlIsMH0sCisgICAge01CX0IsMTF9LCAgIHtNQl9CLDE0fSwgICB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sCisgICAge01CX0EsN30sICAgIHtNQl9DVVJSLDJ9LCB7TUJfQSwxM30sICAge01CX0NVUlIsOH0sCisgICAge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LAorICAgIHtNQl9ELDE5fSwgICB7TUJfQiwxOH0sICAge01CX0EsMTd9LCAgIHtNQl9DVVJSLDE2fSwKKyAgICB7TUJfRCwyM30sICAge01CX0IsMjJ9LCAgIHtNQl9BLDIxfSwgICB7TUJfQ1VSUiwyMH0gfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbml0TWJOZWlnaGJvdXJzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEluaXRpYWxpemUgbWFjcm9ibG9jayBuZWlnaGJvdXJzLiBGdW5jdGlvbiBzZXRzIG5laWdoYm91cgorICAgICAgICAgICAgbWFjcm9ibG9jayBwb2ludGVycyBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgdG8gcG9pbnQgdG8KKyAgICAgICAgICAgIG1hY3JvYmxvY2tzIG9uIHRoZSBsZWZ0LCBhYm92ZSwgYWJvdmUtcmlnaHQgYW5kIGFib3ZlLWxlZnQuCisgICAgICAgICAgICBQb2ludGVycyBhcmUgc2V0IE5VTEwgaWYgdGhlIG5laWdoYm91ciBkb2VzIG5vdCBmaXQgaW50byB0aGUKKyAgICAgICAgICAgIHBpY3R1cmUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcGljV2lkdGggICAgICAgIHdpZHRoIG9mIHRoZSBwaWN0dXJlIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgbm8gbmVlZCB0byBjbGFyaWZ5CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBNYlN0b3JhZ2UgICAgICBuZWlnaGJvdXIgcG9pbnRlcnMgb2YgZWFjaCBtYlN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzKG1iU3RvcmFnZV90ICpwTWJTdG9yYWdlLCB1MzIgcGljV2lkdGgsCisgICAgdTMyIHBpY1NpemVJbk1icykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgcm93LCBjb2w7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWJTdG9yYWdlKTsKKyAgICBBU1NFUlQocGljV2lkdGgpOworICAgIEFTU0VSVChwaWNXaWR0aCA8PSBwaWNTaXplSW5NYnMpOworICAgIEFTU0VSVCgoKHBpY1NpemVJbk1icyAvIHBpY1dpZHRoKSAqIHBpY1dpZHRoKSA9PSBwaWNTaXplSW5NYnMpOworCisgICAgcm93ID0gY29sID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplSW5NYnM7IGkrKykKKyAgICB7CisKKyAgICAgICAgaWYgKGNvbCkKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJBID0gcE1iU3RvcmFnZSArIGkgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQSA9IE5VTEw7CisKKyAgICAgICAgaWYgKHJvdykKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJCID0gcE1iU3RvcmFnZSArIGkgLSBwaWNXaWR0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkIgPSBOVUxMOworCisgICAgICAgIGlmIChyb3cgJiYgKGNvbCA8IHBpY1dpZHRoIC0gMSkpCisgICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQyA9IHBNYlN0b3JhZ2UgKyBpIC0gKHBpY1dpZHRoIC0gMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJDID0gTlVMTDsKKworICAgICAgICBpZiAocm93ICYmIGNvbCkKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJEID0gcE1iU3RvcmFnZSArIGkgLSAocGljV2lkdGggKyAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkQgPSBOVUxMOworCisgICAgICAgIGNvbCsrOworICAgICAgICBpZiAoY29sID09IHBpY1dpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICBjb2wgPSAwOworICAgICAgICAgICAgcm93Kys7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0TmVpZ2hib3VyTWIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHBvaW50ZXIgdG8gbmVpZ2hib3VyIG1hY3JvYmxvY2suCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0cnVjdHVyZSBvZiB0aGUgbWFjcm9ibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgbmVpZ2hib3VyIGlzIHdhbnRlZAorICAgICAgICAgICAgbmVpZ2hib3VyICAgaW5kaWNhdGVzIHdoaWNoIG5laWdoYm91ciBpcyB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBtYWNyb2Jsb2NrCisgICAgICAgICAgICBOVUxMIGlmIG5vdCBhdmFpbGFibGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworbWJTdG9yYWdlX3QqIGgyNjRic2RHZXROZWlnaGJvdXJNYihtYlN0b3JhZ2VfdCAqcE1iLCBuZWlnaGJvdXJNYl9lIG5laWdoYm91cikKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKChuZWlnaGJvdXIgPD0gTUJfQ1VSUikgfHwgKG5laWdoYm91ciA9PSBNQl9OQSkpOworCisgICAgaWYgKG5laWdoYm91ciA9PSBNQl9BKQorICAgICAgICByZXR1cm4ocE1iLT5tYkEpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9CKQorICAgICAgICByZXR1cm4ocE1iLT5tYkIpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9DKQorICAgICAgICByZXR1cm4ocE1iLT5tYkMpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9EKQorICAgICAgICByZXR1cm4ocE1iLT5tYkQpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9DVVJSKQorICAgICAgICByZXR1cm4ocE1iKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVUxMKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGxlZnQgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvCisgICAgICAgICAgICB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKHUzMiBibG9ja0luZGV4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7CisKKyAgICByZXR1cm4oTl9BXzR4NEIrYmxvY2tJbmRleCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBhYm92ZSBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KKyAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IodTMyIGJsb2NrSW5kZXgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKKworICAgIHJldHVybihOX0JfNHg0QitibG9ja0luZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFib3ZlLXJpZ2h0ICBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIKKyAgICAgICAgICAgIHRvIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0ModTMyIGJsb2NrSW5kZXgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKKworICAgIHJldHVybihOX0NfNHg0QitibG9ja0luZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFib3ZlLWxlZnQgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvCisgICAgICAgICAgICB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKHUzMiBibG9ja0luZGV4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7CisKKyAgICByZXR1cm4oTl9EXzR4NEIrYmxvY2tJbmRleCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgaWYgbmVpZ2hib3VyIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlLiBOZWlnaGJvdXIgbWFjcm9ibG9jaworICAgICAgICAgICAgaXMgY29uc2lkZXJlZCBhdmFpbGFibGUgaWYgaXQgaXMgd2l0aGluIHRoZSBwaWN0dXJlIGFuZCBiZWxvbmdzCisgICAgICAgICAgICB0byB0aGUgc2FtZSBzbGljZSBhcyB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBNYiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgICAgcE5laWdoYm91ciAgcG9pbnRlciB0byB0aGUgbmVpZ2hib3VyIG1hY3JvYmxvY2sKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBUUlVFICAgIG5laWdoYm91ciBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIEZBTFNFICAgbmVpZ2hib3VyIGlzIG5vdCBhdmFpbGFibGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShtYlN0b3JhZ2VfdCAqcE1iLCBtYlN0b3JhZ2VfdCAqcE5laWdoYm91cikKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIGlmICggKHBOZWlnaGJvdXIgPT0gTlVMTCkgfHwgKHBNYi0+c2xpY2VJZCAhPSBwTmVpZ2hib3VyLT5zbGljZUlkKSApCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmNlMGFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX05FSUdIQk9VUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19ORUlHSEJPVVJfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisgICAgTUJfQSA9IDAsCisgICAgTUJfQiwKKyAgICBNQl9DLAorICAgIE1CX0QsCisgICAgTUJfQ1VSUiwKKyAgICBNQl9OQSA9IDB4RkYKK30gbmVpZ2hib3VyTWJfZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIG5laWdoYm91ck1iX2UgICBtYjsKKyAgICB1OCAgICAgICAgICAgICBpbmRleDsKK30gbmVpZ2hib3VyX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycyhtYlN0b3JhZ2VfdCAqcE1iU3RvcmFnZSwgdTMyIHBpY1dpZHRoLAorICAgIHUzMiBwaWNTaXplSW5NYnMpOworCittYlN0b3JhZ2VfdCogaDI2NGJzZEdldE5laWdoYm91ck1iKG1iU3RvcmFnZV90ICpwTWIsIG5laWdoYm91ck1iX2UgbmVpZ2hib3VyKTsKKwordTMyIGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShtYlN0b3JhZ2VfdCAqcE1iLCBtYlN0b3JhZ2VfdCAqcE5laWdoYm91cik7CisKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKHUzMiBibG9ja0luZGV4KTsKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKHUzMiBibG9ja0luZGV4KTsKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDKHUzMiBibG9ja0luZGV4KTsKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKHUzMiBibG9ja0luZGV4KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTkVJR0hCT1VSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmIyMzM1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19vcmRlcl9jbnQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVQaWNPcmRlckNudAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIHBpY3R1cmUgb3JkZXIgY291bnQgZm9yIGEgcGljdHVyZS4gRnVuY3Rpb24gaW1wbGVtZW50cworICAgICAgICAgICAgY29tcHV0YXRpb24gb2YgYWxsIFBPQyB0eXBlcyAoMCwgMSBhbmQgMiksIHR5cGUgaXMgb2J0YWluZWQgZnJvbQorICAgICAgICAgICAgc3BzLiBTZWUgc3RhbmRhcmQgZm9yIGRlc2NyaXB0aW9uIG9mIHRoZSBQT0MgdHlwZXMgYW5kIGhvdyBQT0MgaXMKKyAgICAgICAgICAgIGNvbXB1dGVkIGZvciBlYWNoIHR5cGUuCisKKyAgICAgICAgICAgIEZ1bmN0aW9uIHJldHVybnMgdGhlIG1pbmltdW0gb2YgdG9wIGZpZWxkIGFuZCBib3R0b20gZmllbGQgcGljCisgICAgICAgICAgICBvcmRlciBjb3VudHMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcG9jICAgICAgICAgcG9pbnRlciB0byBwcmV2aW91cyByZXN1bHRzCisgICAgICAgICAgICBzcHMgICAgICAgICBwb2ludGVyIHRvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKyAgICAgICAgICAgIHNsaWNIZWFkZXIgIHBvaW50ZXIgdG8gY3VycmVudCBzbGljZSBoZWFkZXIsIGZyYW1lIG51bWJlciBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHBhcmFtcyBuZWVkZWQgZm9yIFBPQyBjb21wdXRhdGlvbgorICAgICAgICAgICAgcE5hbFVuaXQgICAgcG9pbnRlciB0byBjdXJyZW50IE5BTCB1bml0IHN0cnVjdHJ1ZSwgZnVuY3Rpb24gbmVlZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIGtub3cgaWYgdGhpcyBpcyBhbiBJRFIgcGljdHVyZSBhbmQgYWxzbyBpZiB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICBhIHJlZmVyZW5jZSBwaWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBvYyAgICAgICAgIHJlc3VsdHMgc3RvcmVkIGhlcmUgZm9yIGNvbXB1dGF0aW9uIG9mIG5leHQgUE9DCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBpY3R1cmUgb3JkZXIgY291bnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaTMyIGgyNjRic2REZWNvZGVQaWNPcmRlckNudChwb2NTdG9yYWdlX3QgKnBvYywgc2VxUGFyYW1TZXRfdCAqc3BzLAorICAgIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlciwgbmFsVW5pdF90ICpwTmFsVW5pdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICBpMzIgcGljT3JkZXJDbnQ7CisgICAgdTMyIGZyYW1lTnVtT2Zmc2V0LCBhYnNGcmFtZU51bSwgcGljT3JkZXJDbnRDeWNsZUNudDsKKyAgICB1MzIgZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGU7CisgICAgaTMyIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlOworICAgIHUzMiBjb250YWluc01tY281OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocG9jKTsKKyAgICBBU1NFUlQoc3BzKTsKKyAgICBBU1NFUlQocFNsaWNlSGVhZGVyKTsKKyAgICBBU1NFUlQocE5hbFVuaXQpOworICAgIEFTU0VSVChzcHMtPnBpY09yZGVyQ250VHlwZSA8PSAyKTsKKworI2lmIDAKKyAgICAvKiBKYW5TYTogSSBkb24ndCB0aGluayB0aGlzIGlzIG5lY2Vzc2FyeSwgZG9uJ3Qgc2VlIGFueSByZWFzb24gdG8KKyAgICAgKiBpbmNyZW1lbnQgcHJldkZyYW1lTnVtIG9uZSBieSBvbmUgaW5zdGVhZCBvZiBvbmUgYmlnIGluY3JlbWVudC4KKyAgICAgKiBIb3dldmVyLCBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCB0aGlzIHNob3VsZCBiZSBkb25lIC0+IGlmIHNvbWVvbmUKKyAgICAgKiBmaWd1cmVzIG91dCBhbnkgY2FzZSB3aGVuIHRoZSBvdXRjb21lIHdvdWxkIGJlIGRpZmZlcmVudCBmb3Igc3RlcCBieQorICAgICAqIHN0ZXAgaW5jcmVtZW50LCB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgc2hvdWxkIGJlIGVuYWJsZWQgKi8KKworICAgIC8qIGlmIHRoZXJlIHdhcyBhIGdhcCBpbiBmcmFtZSBudW1iZXJpbmcgYW5kIHBpY09yZGVyQ250VHlwZSBpcyAxIG9yIDIgLT4KKyAgICAgKiAiY29tcHV0ZSIgcGljIG9yZGVyIGNvdW50cyBmb3Igbm9uLWV4aXN0aW5nIGZyYW1lcy4gVGhlc2UgYXJlIG5vdAorICAgICAqIGFjdHVhbGx5IGNvbXB1dGVkLCBidXQgcHJvY2VzcyBuZWVkcyB0byBiZSBkb25lIHRvIHVwZGF0ZSB0aGUKKyAgICAgKiBwcmV2RnJhbWVOdW0gYW5kIHByZXZGcmFtZU51bU9mZnNldCAqLworICAgIGlmICggc3BzLT5waWNPcmRlckNudFR5cGUgPiAwICYmCisgICAgICAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtICE9IHBvYy0+cHJldkZyYW1lTnVtICYmCisgICAgICAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtICE9ICgocG9jLT5wcmV2RnJhbWVOdW0gKyAxKSAlIHNwcy0+bWF4RnJhbWVOdW0pKQorICAgIHsKKworICAgICAgICAvKiB1c2UgdmFyaWFibGUgaSBmb3IgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gKi8KKyAgICAgICAgaSA9IChwb2MtPnByZXZGcmFtZU51bSArIDEpICUgc3BzLT5tYXhGcmFtZU51bTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9jLT5wcmV2RnJhbWVOdW0gPiBpKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyBzcHMtPm1heEZyYW1lTnVtOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQ7CisKKyAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IGk7CisKKyAgICAgICAgICAgIGkgPSAoaSArIDEpICUgc3BzLT5tYXhGcmFtZU51bTsKKworICAgICAgICB9IHdoaWxlIChpICE9IHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pOworICAgIH0KKyNlbmRpZgorCisgICAgLyogY2hlY2sgaWYgY3VycmVudCBzbGljZSBpbmNsdWRlcyBtbWNvIGVxdWFsIHRvIDUgKi8KKyAgICBjb250YWluc01tY281ID0gSEFOVFJPX0ZBTFNFOworICAgIGlmIChwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcuYWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcpCisgICAgeworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5vcGVyYXRpb25baV0uCisgICAgICAgICAgICBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5vcGVyYXRpb25baV0uCisgICAgICAgICAgICAgICAgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24gPT0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250YWluc01tY281ID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChzcHMtPnBpY09yZGVyQ250VHlwZSkKKyAgICB7CisKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLyogc2V0IHByZXZQaWNPcmRlckNudCB2YWx1ZXMgZm9yIElEUiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOworICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY29tcHV0ZSBwaWNPcmRlckNudE1zYiAoc3RvcmVkIGluIHBpY09yZGVyQ250IHZhcmlhYmxlKSAqLworICAgICAgICAgICAgaWYgKCAocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA8IHBvYy0+cHJldlBpY09yZGVyQ250THNiKSAmJgorICAgICAgICAgICAgICAgICgocG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgLSBwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiKSA+PQorICAgICAgICAgICAgICAgICBzcHMtPm1heFBpY09yZGVyQ250THNiLzIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiICsKKyAgICAgICAgICAgICAgICAgICAgKGkzMilzcHMtPm1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPiBwb2MtPnByZXZQaWNPcmRlckNudExzYikgJiYKKyAgICAgICAgICAgICAgICAoKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgLSBwb2MtPnByZXZQaWNPcmRlckNudExzYikgPgorICAgICAgICAgICAgICAgICBzcHMtPm1heFBpY09yZGVyQ250THNiLzIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiIC0KKyAgICAgICAgICAgICAgICAgICAgKGkzMilzcHMtPm1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gcG9jLT5wcmV2UGljT3JkZXJDbnRNc2I7CisKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHByZXZQaWNPcmRlckNudE1zYiBpcyBmcm9tIHByZXZpb3VzCisgICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgLT4gcmVwbGFjZSBvbGQgdmFsdWUgb25seSBpZiBjdXJyZW50IGZyYW1lIGlzCisgICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjKQorICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250TXNiID0gcGljT3JkZXJDbnQ7CisKKyAgICAgICAgICAgIC8qIGNvbXB1dGUgdG9wIGZpZWxkIG9yZGVyIGNudCAoc3RvcmVkIGluIHBpY09yZGVyQ250KSAqLworICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gKGkzMilwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiOworCisgICAgICAgICAgICAvKiBpZiBkZWx0YSBmb3IgYm90dG9tIGZpZWxkIGlzIG5lZ2F0aXZlIC0+IGJvdHRvbSB3aWxsIGJlIHRoZQorICAgICAgICAgICAgICogbWluaW11bSBwaWMgb3JkZXIgY291bnQgKi8KKyAgICAgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20gPCAwKQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbTsKKworICAgICAgICAgICAgLyogc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgcHJldlBpY09yZGVyQ250THNiIGlzIGZyb20gcHJldmlvdXMKKyAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAtPiByZXBsYWNlIG9sZCB2YWx1ZSBvbmx5IGlmIGN1cnJlbnQgZnJhbWUgaXMKKyAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaWYgY3VycmVudCBmcmFtZSBjb250YWlucyBtbWNvNSAtPiBtb2RpZnkgdmFsdWVzIHRvIGJlCisgICAgICAgICAgICAgICAgICogc3RvcmVkICovCisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zTW1jbzUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudE1zYiA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8qIHByZXZQaWNPcmRlckNudExzYiBzaG91bGQgYmUgdGhlIHRvcCBmaWVsZCBwaWNPcmRlckNudAorICAgICAgICAgICAgICAgICAgICAgKiBpZiBwcmV2aW91cyBmcmFtZSBpbmNsdWRlZCBtbWNvNS4gVG9wIGZpZWxkIHBpY09yZGVyQ250CisgICAgICAgICAgICAgICAgICAgICAqIGZvciBmcmFtZXMgY29udGFpbmluZyBtbWNvNSBpcyBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZworICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcGljT3JkZXJDbnQgZnJvbSBvcmlnaW5hbCB0b3AgZmllbGQgb3JkZXIgY291bnQgLT4KKyAgICAgICAgICAgICAgICAgICAgICogdmFsdWUgaXMgemVybyBpZiB0b3AgZmllbGQgd2FzIHRoZSBtaW5pbXVtLCBpLmUuIGRlbHRhCisgICAgICAgICAgICAgICAgICAgICAqIGZvciBib3R0b20gd2FzIHBvc2l0aXZlLCBvdGhlcndpc2UgdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgICAgICogLWRlbHRhUGljT3JkZXJDbnRCb3R0b20gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoLXBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9IHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6CisKKyAgICAgICAgICAgIC8qIHN0ZXAgMSAoaW4gdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBzdGFuZGFyZCkgKi8KKyAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OworCisgICAgICAgICAgICAvKiBzdGVwIDIgKi8KKyAgICAgICAgICAgIGlmIChzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSkKKyAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSA9IGZyYW1lTnVtT2Zmc2V0ICsgcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSA9IDA7CisKKyAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDAgJiYgYWJzRnJhbWVOdW0gPiAwKQorICAgICAgICAgICAgICAgIGFic0ZyYW1lTnVtIC09IDE7CisKKyAgICAgICAgICAgIC8qIHN0ZXAgMyAqLworICAgICAgICAgICAgaWYgKGFic0ZyYW1lTnVtID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudEN5Y2xlQ250ID0KKyAgICAgICAgICAgICAgICAgICAgKGFic0ZyYW1lTnVtIC0gMSkvc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7CisgICAgICAgICAgICAgICAgZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGUgPQorICAgICAgICAgICAgICAgICAgICAoYWJzRnJhbWVOdW0gLSAxKSVzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3RlcCA0ICovCisgICAgICAgICAgICBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKKyAgICAgICAgICAgICAgICBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZSArPSBzcHMtPm9mZnNldEZvclJlZkZyYW1lW2ldOworCisgICAgICAgICAgICAvKiBzdGVwIDUgKHBpY09yZGVyQ250IHVzZWQgdG8gc3RvcmUgZXhwZWN0ZWRQaWNPcmRlckNudCkgKi8KKyAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQscGljT3JkZXJDbnRDeWNsZUNudCkgYWx3YXlzIGluaXRpYWxpemVkICovCisgICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlKSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgICAgIGlmIChhYnNGcmFtZU51bSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQorICAgICAgICAgICAgICAgICAgICAoaTMyKXBpY09yZGVyQ250Q3ljbGVDbnQgKiBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworCisgICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwKQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yTm9uUmVmUGljOworCisgICAgICAgICAgICAvKiBzdGVwIDYgKHBpY09yZGVyQ250IGlzIHRvcCBmaWVsZCBvcmRlciBjbnQgaWYgZGVsdGEgZm9yIGJvdHRvbQorICAgICAgICAgICAgICogaXMgcG9zaXRpdmUsIG90aGVyd2lzZSBpdCBpcyBib3R0b20gZmllbGQgb3JkZXIgY250KSAqLworICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdOworCisgICAgICAgICAgICBpZiAoIChzcHMtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgKworICAgICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV0pIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gc3BzLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICsKKyAgICAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpZiBjdXJyZW50IHBpY3R1cmUgY29udGFpbnMgbW1jbzUgLT4gc2V0IHByZXZGcmFtZU51bU9mZnNldCBhbmQKKyAgICAgICAgICAgICAqIHByZXZGcmFtZU51bSB0byAwIGZvciBjb21wdXRhdGlvbiBvZiBwaWNPcmRlckNudCBvZiBuZXh0CisgICAgICAgICAgICAgKiBmcmFtZSwgb3RoZXJ3aXNlIHN0b3JlIGZyYW1lTnVtIGFuZCBmcmFtZU51bU9mZnNldCB0byBwb2MKKyAgICAgICAgICAgICAqIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgaWYgKCFjb250YWluc01tY281KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSBwU2xpY2VIZWFkZXItPmZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IDA7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogY2FzZSAyICovCisgICAgICAgICAgICAvKiBkZXJpdmUgZnJhbWVOdW1PZmZzZXQgKi8KKyAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OworCisgICAgICAgICAgICAvKiBkZXJpdmUgcGljT3JkZXJDbnQgKHR5cGUgMiBoYXMgc2FtZSB2YWx1ZSBmb3IgdG9wIGFuZCBib3R0b20KKyAgICAgICAgICAgICAqIGZpZWxkIG9yZGVyIGNudHMpICovCisgICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDApCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQorICAgICAgICAgICAgICAgICAgICAyICogKGkzMikoZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKSAtIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQorICAgICAgICAgICAgICAgICAgICAyICogKGkzMikoZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKTsKKworICAgICAgICAgICAgLyogaWYgY3VycmVudCBwaWN0dXJlIGNvbnRhaW5zIG1tY281IC0+IHNldCBwcmV2RnJhbWVOdW1PZmZzZXQgYW5kCisgICAgICAgICAgICAgKiBwcmV2RnJhbWVOdW0gdG8gMCBmb3IgY29tcHV0YXRpb24gb2YgcGljT3JkZXJDbnQgb2YgbmV4dAorICAgICAgICAgICAgICogZnJhbWUsIG90aGVyd2lzZSBzdG9yZSBmcmFtZU51bSBhbmQgZnJhbWVOdW1PZmZzZXQgdG8gcG9jCisgICAgICAgICAgICAgKiBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIGlmICghY29udGFpbnNNbWNvNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IGZyYW1lTnVtT2Zmc2V0OworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSAwOworICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgLypsaW50IC1lc3ltKDY0NCxwaWNPcmRlckNudCkgYWx3YXlzIGluaXRpYWxpemVkICovCisgICAgcmV0dXJuKHBpY09yZGVyQ250KTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTc0MWViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1BJQ19PUkRFUl9DTlRfSAorI2RlZmluZSBIMjY0U1dERUNfUElDX09SREVSX0NOVF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBpbmZvcm1hdGlvbiBjb21wdXRlZCBmb3IgcHJldmlvdXMgcGljdHVyZSwgbmVlZGVkIGZvcgorICogUE9DIGNvbXB1dGF0aW9uIG9mIGEgcGljdHVyZS4gVHdvIGZpcnN0IGZpZWxkcyBmb3IgUE9DIHR5cGUgMCwgbGFzdCB0d28KKyAqIGZvciB0eXBlcyAxIGFuZCAyICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwcmV2UGljT3JkZXJDbnRMc2I7CisgICAgaTMyIHByZXZQaWNPcmRlckNudE1zYjsKKyAgICB1MzIgcHJldkZyYW1lTnVtOworICAgIHUzMiBwcmV2RnJhbWVOdW1PZmZzZXQ7Cit9IHBvY1N0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpMzIgaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBvY1N0b3JhZ2VfdCAqcG9jLCBzZXFQYXJhbVNldF90ICpzcHMsCisgICAgc2xpY2VIZWFkZXJfdCAqc2xpY2VIZWFkZXIsIG5hbFVuaXRfdCAqcE5hbFVuaXQpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19QSUNfT1JERVJfQ05UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTA0ZGVhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBsb29rdXAgdGFibGUgZm9yIGNlaWwobG9nMihudW1TbGljZUdyb3VwcykpLCBpLmUuIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0bworICogcmVwcmVzZW50IHJhbmdlIFswLCBudW1TbGljZUdyb3VwcykKKyAqCisgKiBOT1RFOiBpZiBNQVhfTlVNX1NMSUNFX0dST1VQUyBpcyBoaWdoZXIgdGhhbiA4IHRoaXMgdGFibGUgaGFzIHRvIGJlIHJlc2l6ZWQKKyAqIGFjY29yZGluZ2x5ICovCitzdGF0aWMgY29uc3QgdTMyIENlaWxMb2cyTnVtU2xpY2VHcm91cHNbOF0gPSB7MSwgMSwgMiwgMiwgMywgMywgMywgM307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVQaWNQYXJhbVNldAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIHN0cmVhbS4KKworICAgICAgICAgICAgRnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IKKyAgICAgICAgICAgICAgICAtIHJ1biBsZW5ndGhzIGlmIHNsaWNlIGdyb3VwIG1hcCB0eXBlIGlzIDAKKyAgICAgICAgICAgICAgICAtIHRvcC1sZWZ0IGFuZCBib3R0b20tcmlnaHQgYXJyYXlzIGlmIG1hcCB0eXBlIGlzIDIKKyAgICAgICAgICAgICAgICAtIGZvciBzbGljZSBncm91cCBpZHMgaWYgbWFwIHR5cGUgaXMgNgorCisgICAgICAgICAgICBWYWxpZGl0eSBvZiBzb21lIG9mIHRoZSBzbGljZSBncm91cCBtYXBwaW5nIGluZm9ybWF0aW9uIGRlcGVuZHMKKyAgICAgICAgICAgIG9uIHRoZSBpbWFnZSBkaW1lbnNpb25zIHdoaWNoIGFyZSBub3Qga25vd24gaGVyZS4gVGhlcmVmb3JlIHRoZQorICAgICAgICAgICAgdmFsaWRpdHkgaGFzIHRvIGJlIGNoZWNrZWQgYWZ0ZXJ3YXJkcywgY3VycmVudGx5IGluIHRoZSBwYXJhbWV0ZXIKKyAgICAgICAgICAgIHNldCBhY3RpdmF0aW9uIHBoYXNlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIGludmFsaWQgaW5mb3JtYXRpb24gb3IgZW5kIG9mIHN0cmVhbQorICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGksIHZhbHVlOworICAgIGkzMiBpdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKKworCisgICAgSDI2NFN3RGVjTWVtc2V0KHBQaWNQYXJhbVNldCwgMCwgc2l6ZW9mKHBpY1BhcmFtU2V0X3QpKTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQgPj0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUykKKyAgICB7CisgICAgICAgIEVQUklOVCgicGljX3BhcmFtZXRlcl9zZXRfaWQiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgPj0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUykKKyAgICB7CisgICAgICAgIEVQUklOVCgic2VxX3BhcmFtX3NldF9pZCIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnLCBzaGFsbCBiZSAwIGZvciBiYXNlbGluZSBwcm9maWxlICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWciKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgLyogbnVtX3NsaWNlX2dyb3Vwc19taW51czEgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzID0gdmFsdWUgKyAxOworICAgIGlmIChwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzID4gTUFYX05VTV9TTElDRV9HUk9VUFMpCisgICAgeworICAgICAgICBFUFJJTlQoIm51bV9zbGljZV9ncm91cHNfbWludXMxIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgc2xpY2UgZ3JvdXAgbWFwcGluZyBpbmZvcm1hdGlvbiBpZiBtb3JlIHRoYW4gb25lIHNsaWNlIGdyb3VwcyAqLworICAgIGlmIChwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzID4gMSkKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID4gNikKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9ncm91cF9tYXBfdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQUxMT0NBVEUocFBpY1BhcmFtU2V0LT5ydW5MZW5ndGgsCisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcywgdTMyKTsKKyAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnJ1bkxlbmd0aCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cnVuTGVuZ3RoW2ldID0gdmFsdWUrMTsKKyAgICAgICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZXMgY2hlY2tlZCBpbiBDaGVja1BwcygpICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPnRvcExlZnQsCisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyAtIDEsIHUzMik7CisgICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPmJvdHRvbVJpZ2h0LAorICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgLSAxLCB1MzIpOworICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+dG9wTGVmdCA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5ib3R0b21SaWdodCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyAtIDE7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnRvcExlZnRbaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPmJvdHRvbVJpZ2h0W2ldID0gdmFsdWU7CisgICAgICAgICAgICAgICAgLyogcGFyYW0gdmFsdWVzIGNoZWNrZWQgaW4gQ2hlY2tQcHMoKSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSAzKSB8fAorICAgICAgICAgICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNCkgfHwKKyAgICAgICAgICAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDUpICkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnID0KKyAgICAgICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlID0gdmFsdWUgKyAxOworICAgICAgICAgICAgLyogcGFyYW0gdmFsdWUgY2hlY2tlZCBpbiBDaGVja1BwcygpICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSA2KQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnBpY1NpemVJbk1hcFVuaXRzID0gdmFsdWUgKyAxOworCisgICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBJZCwKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnBpY1NpemVJbk1hcFVuaXRzLCB1MzIpOworICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgcmFuZ2UKKyAgICAgICAgICAgICAqIFswLCBudW1TbGljZUdyb3VwcykgKi8KKyAgICAgICAgICAgIHRtcCA9IENlaWxMb2cyTnVtU2xpY2VHcm91cHNbcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3Vwcy0xXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBJZFtpXSA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgdG1wKTsKKyAgICAgICAgICAgICAgICBpZiAoIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkW2ldID49CisgICAgICAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgic2xpY2VfZ3JvdXBfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAodmFsdWUgPiAzMSkKKyAgICB7CisgICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorICAgIHBQaWNQYXJhbVNldC0+bnVtUmVmSWR4TDBBY3RpdmUgPSB2YWx1ZSArIDE7CisKKyAgICAvKiBudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHZhbHVlID4gMzEpCisgICAgeworICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIHdlaWdodGVkX3ByZWRfZmxhZywgdGhpcyBzaGFsbCBiZSAwIGZvciBiYXNlbGluZSBwcm9maWxlICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJ3ZWlnaHRlZF9wcmVkX2ZsYWciKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIHdlaWdodGVkX2JpcHJlZF9pZGMgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOworICAgIGlmICh0bXAgPiAyKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJ3ZWlnaHRlZF9iaXByZWRfaWRjIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBwaWNfaW5pdF9xcF9taW51czI2ICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKChpdG1wIDwgLTI2KSB8fCAoaXRtcCA+IDI1KSkKKyAgICB7CisgICAgICAgIEVQUklOVCgicGljX2luaXRfcXBfbWludXMyNiIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorICAgIHBQaWNQYXJhbVNldC0+cGljSW5pdFFwID0gKHUzMikoaXRtcCArIDI2KTsKKworICAgIC8qIHBpY19pbml0X3FzX21pbnVzMjYgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAoKGl0bXAgPCAtMjYpIHx8IChpdG1wID4gMjUpKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJwaWNfaW5pdF9xc19taW51czI2Iik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAoKGl0bXAgPCAtMTIpIHx8IChpdG1wID4gMTIpKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0Iik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgcFBpY1BhcmFtU2V0LT5jaHJvbWFRcEluZGV4T2Zmc2V0ID0gaXRtcDsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFBpY1BhcmFtU2V0LT5kZWJsb2NraW5nRmlsdGVyQ29udHJvbFByZXNlbnRGbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUGljUGFyYW1TZXQtPmNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMocFN0cm1EYXRhKTsKKworICAgIC8qIGlnbm9yZSBwb3NzaWJsZSBlcnJvcnMgaW4gdHJhaWxpbmcgYml0cyBvZiBwYXJhbWV0ZXJzIHNldHMgKi8KKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MzI4NjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1BJQ19QQVJBTV9TRVRfSAorI2RlZmluZSBIMjY0U1dERUNfUElDX1BBUkFNX1NFVF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGRhdGEgc3RydWN0dXJlIHRvIHN0b3JlIFBQUyBpbmZvcm1hdGlvbiBkZWNvZGVkIGZyb20gdGhlIHN0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcGljUGFyYW1ldGVyU2V0SWQ7CisgICAgdTMyIHNlcVBhcmFtZXRlclNldElkOworICAgIHUzMiBwaWNPcmRlclByZXNlbnRGbGFnOworICAgIHUzMiBudW1TbGljZUdyb3VwczsKKyAgICB1MzIgc2xpY2VHcm91cE1hcFR5cGU7CisgICAgdTMyICpydW5MZW5ndGg7CisgICAgdTMyICp0b3BMZWZ0OworICAgIHUzMiAqYm90dG9tUmlnaHQ7CisgICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlUmF0ZTsKKyAgICB1MzIgcGljU2l6ZUluTWFwVW5pdHM7CisgICAgdTMyICpzbGljZUdyb3VwSWQ7CisgICAgdTMyIG51bVJlZklkeEwwQWN0aXZlOworICAgIHUzMiBwaWNJbml0UXA7CisgICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQ7CisgICAgdTMyIGRlYmxvY2tpbmdGaWx0ZXJDb250cm9sUHJlc2VudEZsYWc7CisgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZzsKKyAgICB1MzIgcmVkdW5kYW50UGljQ250UHJlc2VudEZsYWc7Cit9IHBpY1BhcmFtU2V0X3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVQaWNQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfUElDX1BBUkFNX1NFVF9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzk0ODc3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jCkBAIC0wLDAgKzEsMjMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9yZWNvbnN0cnVjdC5oIgorI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6CisgKiBJbmZvIDcwMTogU2hpZnQgbGVmdCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqLworLypsaW50IC1lNzAxIC1lNzAyICovCisKKy8qIEx1bWEgZnJhY3Rpb25hbC1zYW1wbGUgcG9zaXRpb25zCisgKgorICogIEcgYSBiIGMgSAorICogIGQgZSBmIGcKKyAqICBoIGkgaiBrIG0KKyAqICBuIHAgcSByCisgKiAgTSAgIHMgICBOCisgKgorICogIEcsIEgsIE0gYW5kIE4gYXJlIGludGVnZXIgc2FtcGxlIHBvc2l0aW9ucworICogIGEtcyBhcmUgZnJhY3Rpb25hbCBzYW1wbGVzIHRoYXQgbmVlZCB0byBiZSBpbnRlcnBvbGF0ZWQuCisgKi8KKyNpZm5kZWYgSDI2NERFQ19PTVhETAorc3RhdGljIGNvbnN0IHUzMiBsdW1hRnJhY1Bvc1s0XVs0XSA9IHsKKyAgLyogRyAgZCAgaCAgbiAgICBhICBlICBpICBwICAgIGIgIGYgIGogICBxICAgICBjICAgZyAgIGsgICByICovCisgICAgezAsIDEsIDIsIDN9LCB7NCwgNSwgNiwgN30sIHs4LCA5LCAxMCwgMTF9LCB7MTIsIDEzLCAxNCwgMTV9fTsKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qIGNsaXBwaW5nIHRhYmxlLCBkZWZpbmVkIGluIGgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jICovCitleHRlcm4gY29uc3QgdTggaDI2NGJzZENsaXBbXTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRERUNfT01YREwKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2hyb21hIGludGVycG9sYXRpb24gaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24uCisgICAgICAgICAgT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlIGltYWdlIChwUmVmKSBpcworICAgICAgICAgIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4gdG8KKyAgICAgICAgICBtYWNyb2Jsb2NrJ3MgY2hyb21pbmFuY2UgKHByZWRQYXJ0Q2hyb21hKQorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcFJlZiAgICAgICAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUgQ2IgdG9wLWxlZnQgY29ybmVyCisgICAgICAgICAgeDAgICAgICAgICAgICAgICAgaW50ZWdlciB4LWNvb3JkaW5hdGUgZm9yIHByZWRpY3Rpb24KKyAgICAgICAgICB5MCAgICAgICAgICAgICAgICBpbnRlZ2VyIHktY29vcmRpbmF0ZSBmb3IgcHJlZGljdGlvbgorICAgICAgICAgIHdpZHRoICAgICAgICAgICAgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgZnJhbWUgY2hyb21pbmFuY2UgaW4gcGl4ZWxzCisgICAgICAgICAgaGVpZ2h0ICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSByZWZlcmVuY2UgZnJhbWUgY2hyb21pbmFuY2UgaW4gcGl4ZWxzCisgICAgICAgICAgeEZyYWMgICAgICAgICAgICAgaG9yaXpvbnRhbCBmcmFjdGlvbiBmb3IgcHJlZGljdGlvbiBpbiAxLzggcGl4ZWxzCisgICAgICAgICAgY2hyb21hUGFydFdpZHRoICAgd2lkdGggb2YgdGhlIHByZWRpY3RlZCBwYXJ0IGluIHBpeGVscworICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgIGhlaWdodCBvZiB0aGUgcHJlZGljdGVkIHBhcnQgaW4gcGl4ZWxzCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgcHJlZFBhcnRDaHJvbWEgICAgcG9pbnRlciB3aGVyZSBwcmVkaWN0ZWQgcGFydCBpcyB3cml0dGVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfQVJNMTEKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yKAorICB1OCAqcFJlZiwKKyAgdTggKnByZWRQYXJ0Q2hyb21hLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgeEZyYWMsCisgIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCisgIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4LCB5LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCBjLCB2YWw7CisgICAgdTggKnB0ckEsICpjYnI7CisgICAgdTMyIGNvbXA7CisgICAgdTggYmxvY2tbOSo4KjJdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKKyAgICBBU1NFUlQoeEZyYWMgPCA4KTsKKyAgICBBU1NFUlQocFJlZik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArY2hyb21hUGFydEhlaWdodCA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggKyAxLCBjaHJvbWFQYXJ0SGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKKyAgICAgICAgcFJlZiArPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhwUmVmLCBibG9jayArIChjaHJvbWFQYXJ0V2lkdGgrMSkqY2hyb21hUGFydEhlaWdodCwKKyAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSwKKyAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEpOworCisgICAgICAgIHBSZWYgPSBibG9jazsKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHdpZHRoID0gY2hyb21hUGFydFdpZHRoKzE7CisgICAgICAgIGhlaWdodCA9IGNocm9tYVBhcnRIZWlnaHQ7CisgICAgfQorCisgICAgdmFsID0gOCAtIHhGcmFjOworCisgICAgZm9yIChjb21wID0gMDsgY29tcCA8PSAxOyBjb21wKyspCisgICAgeworCisgICAgICAgIHB0ckEgPSBwUmVmICsgKGNvbXAgKiBoZWlnaHQgKyAodTMyKXkwKSAqIHdpZHRoICsgeDA7CisgICAgICAgIGNiciA9IHByZWRQYXJ0Q2hyb21hICsgY29tcCAqIDggKiA4OworCisgICAgICAgIC8qIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KKyAgICAgICAgICogYmlsaW5lYXIgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCisgICAgICAgIGZvciAoeSA9IChjaHJvbWFQYXJ0SGVpZ2h0ID4+IDEpOyB5OyB5LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeCA9IChjaHJvbWFQYXJ0V2lkdGggPj4gMSk7IHg7IHgtLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAxID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICAgICAgdG1wMiA9ICpwdHJBKys7CisgICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgICAgIHRtcDQgPSAqcHRyQSsrOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDEgKyB4RnJhYyAqIHRtcDMpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeEZyYWMgKiB0bXA0KSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7CisgICAgICAgICAgICAgICAgdG1wMSA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgICAgIHRtcDIgPSAqcHRyQTsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAzICsgeEZyYWMgKiB0bXAxKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wNCArIHhGcmFjICogdG1wMikgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2JyICs9IDIqOCAtIGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgICAgIHB0ckEgKz0gMip3aWR0aCAtIGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24uCisgICAgICAgICAgT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlIGltYWdlIChwUmVmKSBpcworICAgICAgICAgIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4gdG8KKyAgICAgICAgICBtYWNyb2Jsb2NrJ3MgY2hyb21pbmFuY2UgKHByZWRQYXJ0Q2hyb21hKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcigKKyAgdTggKnBSZWYsCisgIHU4ICpwcmVkUGFydENocm9tYSwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHlGcmFjLAorICB1MzIgY2hyb21hUGFydFdpZHRoLAorICB1MzIgY2hyb21hUGFydEhlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgeCwgeSwgdG1wMSwgdG1wMiwgdG1wMywgYywgdmFsOworICAgIHU4ICpwdHJBLCAqY2JyOworICAgIHUzMiBjb21wOworICAgIHU4IGJsb2NrWzkqOCoyXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHByZWRQYXJ0Q2hyb21hKTsKKyAgICBBU1NFUlQoY2hyb21hUGFydFdpZHRoKTsKKyAgICBBU1NFUlQoY2hyb21hUGFydEhlaWdodCk7CisgICAgQVNTRVJUKHlGcmFjIDwgOCk7CisgICAgQVNTRVJUKHBSZWYpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2Nocm9tYVBhcnRXaWR0aCA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0KzEgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhwUmVmLCBibG9jaywgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGgsCisgICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoKTsKKyAgICAgICAgcFJlZiArPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhwUmVmLCBibG9jayArIGNocm9tYVBhcnRXaWR0aCooY2hyb21hUGFydEhlaWdodCsxKSwKKyAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoLAorICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCArIDEsIGNocm9tYVBhcnRXaWR0aCk7CisKKyAgICAgICAgcFJlZiA9IGJsb2NrOworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgd2lkdGggPSBjaHJvbWFQYXJ0V2lkdGg7CisgICAgICAgIGhlaWdodCA9IGNocm9tYVBhcnRIZWlnaHQrMTsKKyAgICB9CisKKyAgICB2YWwgPSA4IC0geUZyYWM7CisKKyAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKKyAgICB7CisKKyAgICAgICAgcHRyQSA9IHBSZWYgKyAoY29tcCAqIGhlaWdodCArICh1MzIpeTApICogd2lkdGggKyB4MDsKKyAgICAgICAgY2JyID0gcHJlZFBhcnRDaHJvbWEgKyBjb21wICogOCAqIDg7CisKKyAgICAgICAgLyogMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgICAgICAgKiBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCisgICAgICAgIGZvciAoeSA9IChjaHJvbWFQYXJ0SGVpZ2h0ID4+IDEpOyB5OyB5LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeCA9IChjaHJvbWFQYXJ0V2lkdGggPj4gMSk7IHg7IHgtLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aCoyXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICAgICAgdG1wMSA9ICpwdHJBKys7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMiArIHlGcmFjICogdG1wMykgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDEgKyB5RnJhYyAqIHRtcDIpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKKyAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aCoyXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICAgICAgdG1wMSA9ICpwdHJBKys7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMiArIHlGcmFjICogdG1wMykgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDEgKyB5RnJhYyAqIHRtcDIpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNiciArPSAyKjggLSBjaHJvbWFQYXJ0V2lkdGg7CisgICAgICAgICAgICBwdHJBICs9IDIqd2lkdGggLSBjaHJvbWFQYXJ0V2lkdGg7CisgICAgICAgIH0KKyAgICB9CisKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2hyb21hIGludGVycG9sYXRpb24gaW4gaG9yaXpvbnRhbCBhbmQKKyAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb24uIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQorICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0CisgICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrJ3MgY2hyb21pbmFuY2UgKHByZWRQYXJ0Q2hyb21hKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcigKKyAgdTggKnJlZiwKKyAgdTggKnByZWRQYXJ0Q2hyb21hLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgeEZyYWMsCisgIHUzMiB5RnJhYywKKyAgdTMyIGNocm9tYVBhcnRXaWR0aCwKKyAgdTMyIGNocm9tYVBhcnRIZWlnaHQpCit7CisgICAgdTggYmxvY2tbOSo5KjJdOworICAgIHUzMiB4LCB5LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB2YWxYLCB2YWxZLCBwbHVzMzIgPSAzMjsKKyAgICB1MzIgY29tcDsKKyAgICB1OCAqcHRyQSwgKmNicjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHByZWRQYXJ0Q2hyb21hKTsKKyAgICBBU1NFUlQoY2hyb21hUGFydFdpZHRoKTsKKyAgICBBU1NFUlQoY2hyb21hUGFydEhlaWdodCk7CisgICAgQVNTRVJUKHhGcmFjIDwgOCk7CisgICAgQVNTRVJUKHlGcmFjIDwgOCk7CisgICAgQVNTRVJUKHJlZik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArY2hyb21hUGFydEhlaWdodCsxID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBibG9jaywgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgY2hyb21hUGFydFdpZHRoICsgMSwgY2hyb21hUGFydEhlaWdodCArIDEsIGNocm9tYVBhcnRXaWR0aCArIDEpOworICAgICAgICByZWYgKz0gd2lkdGggKiBoZWlnaHQ7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBibG9jayArIChjaHJvbWFQYXJ0V2lkdGgrMSkqKGNocm9tYVBhcnRIZWlnaHQrMSksCisgICAgICAgICAgICB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEsCisgICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoICsgMSk7CisKKyAgICAgICAgcmVmID0gYmxvY2s7CisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICB3aWR0aCA9IGNocm9tYVBhcnRXaWR0aCsxOworICAgICAgICBoZWlnaHQgPSBjaHJvbWFQYXJ0SGVpZ2h0KzE7CisgICAgfQorCisgICAgdmFsWCA9IDggLSB4RnJhYzsKKyAgICB2YWxZID0gOCAtIHlGcmFjOworCisgICAgZm9yIChjb21wID0gMDsgY29tcCA8PSAxOyBjb21wKyspCisgICAgeworCisgICAgICAgIHB0ckEgPSByZWYgKyAoY29tcCAqIGhlaWdodCArICh1MzIpeTApICogd2lkdGggKyB4MDsKKyAgICAgICAgY2JyID0gcHJlZFBhcnRDaHJvbWEgKyBjb21wICogOCAqIDg7CisKKyAgICAgICAgLyogMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgICAgICAgKiBiaWxpbmVhciB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCisgICAgICAgIGZvciAoeSA9IChjaHJvbWFQYXJ0SGVpZ2h0ID4+IDEpOyB5OyB5LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRyQTsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJBW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wMSAqPSB2YWxZOworICAgICAgICAgICAgdG1wMSArPSB0bXAzICogeUZyYWM7CisgICAgICAgICAgICB0bXAzICo9IHZhbFk7CisgICAgICAgICAgICB0bXAzICs9IHRtcDUgKiB5RnJhYzsKKyAgICAgICAgICAgIGZvciAoeCA9IChjaHJvbWFQYXJ0V2lkdGggPj4gMSk7IHg7IHgtLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAyID0gKisrcHRyQTsKKyAgICAgICAgICAgICAgICB0bXA0ID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICAgICAgdG1wNiA9IHB0ckFbd2lkdGgqMl07CisgICAgICAgICAgICAgICAgdG1wMiAqPSB2YWxZOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wNCAqIHlGcmFjOworICAgICAgICAgICAgICAgIHRtcDQgKj0gdmFsWTsKKyAgICAgICAgICAgICAgICB0bXA0ICs9IHRtcDYgKiB5RnJhYzsKKyAgICAgICAgICAgICAgICB0bXAxID0gdG1wMSAqIHZhbFggKyBwbHVzMzI7CisgICAgICAgICAgICAgICAgdG1wMyA9IHRtcDMgKiB2YWxYICsgcGx1czMyOworICAgICAgICAgICAgICAgIHRtcDEgKz0gdG1wMiAqIHhGcmFjOworICAgICAgICAgICAgICAgIHRtcDEgPj49IDY7CisgICAgICAgICAgICAgICAgdG1wMyArPSB0bXA0ICogeEZyYWM7CisgICAgICAgICAgICAgICAgdG1wMyA+Pj0gNjsKKyAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpdG1wMzsKKyAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpdG1wMTsKKworICAgICAgICAgICAgICAgIHRtcDEgPSAqKytwdHJBOworICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXA1ID0gcHRyQVt3aWR0aCoyXTsKKyAgICAgICAgICAgICAgICB0bXAxICo9IHZhbFk7CisgICAgICAgICAgICAgICAgdG1wMSArPSB0bXAzICogeUZyYWM7CisgICAgICAgICAgICAgICAgdG1wMyAqPSB2YWxZOworICAgICAgICAgICAgICAgIHRtcDMgKz0gdG1wNSAqIHlGcmFjOworICAgICAgICAgICAgICAgIHRtcDIgPSB0bXAyICogdmFsWCArIHBsdXMzMjsKKyAgICAgICAgICAgICAgICB0bXA0ID0gdG1wNCAqIHZhbFggKyBwbHVzMzI7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXAxICogeEZyYWM7CisgICAgICAgICAgICAgICAgdG1wMiA+Pj0gNjsKKyAgICAgICAgICAgICAgICB0bXA0ICs9IHRtcDMgKiB4RnJhYzsKKyAgICAgICAgICAgICAgICB0bXA0ID4+PSA2OworICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCl0bXA0OworICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCl0bXAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2JyICs9IDIqOCAtIGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgICAgIHB0ckEgKz0gMip3aWR0aCAtIGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IFByZWRpY3RDaHJvbWEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRvcCBsZXZlbCBjaHJvbWEgcHJlZGljdGlvbiBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgIGludGVycG9sYXRpb24gZnVuY3Rpb24uIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBQcmVkaWN0Q2hyb21hKAorICB1OCAqbWJQYXJ0Q2hyb21hLAorICB1MzIgeEFMLAorICB1MzIgeUFMLAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgbXZfdCAqbXYsCisgIGltYWdlX3QgKnJlZlBpYykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgeEZyYWMsIHlGcmFjLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQ7CisgICAgaTMyIHhJbnQsIHlJbnQ7CisgICAgdTggKnJlZjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG12KTsKKyAgICBBU1NFUlQocmVmUGljKTsKKyAgICBBU1NFUlQocmVmUGljLT5kYXRhKTsKKyAgICBBU1NFUlQocmVmUGljLT53aWR0aCk7CisgICAgQVNTRVJUKHJlZlBpYy0+aGVpZ2h0KTsKKworICAgIHdpZHRoICA9IDggKiByZWZQaWMtPndpZHRoOworICAgIGhlaWdodCA9IDggKiByZWZQaWMtPmhlaWdodDsKKworICAgIHhJbnQgPSAoeEFMID4+IDEpICsgKG12LT5ob3IgPj4gMyk7CisgICAgeUludCA9ICh5QUwgPj4gMSkgKyAobXYtPnZlciA+PiAzKTsKKyAgICB4RnJhYyA9IG12LT5ob3IgJiAweDc7CisgICAgeUZyYWMgPSBtdi0+dmVyICYgMHg3OworCisgICAgY2hyb21hUGFydFdpZHRoICA9IHBhcnRXaWR0aCA+PiAxOworICAgIGNocm9tYVBhcnRIZWlnaHQgPSBwYXJ0SGVpZ2h0ID4+IDE7CisgICAgcmVmID0gcmVmUGljLT5kYXRhICsgMjU2ICogcmVmUGljLT53aWR0aCAqIHJlZlBpYy0+aGVpZ2h0OworCisgICAgaWYgKHhGcmFjICYmIHlGcmFjKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyKHJlZiwgbWJQYXJ0Q2hyb21hLCB4SW50LCB5SW50LCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsIHhGcmFjLCB5RnJhYywgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoeEZyYWMpCisgICAgeworICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwgeEZyYWMsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCk7CisgICAgfQorICAgIGVsc2UgaWYgKHlGcmFjKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyKHJlZiwgbWJQYXJ0Q2hyb21hLCB4SW50LCB5SW50LCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsIHlGcmFjLCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgbWJQYXJ0Q2hyb21hLCB4SW50LCB5SW50LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0LCA4KTsKKyAgICAgICAgcmVmICs9IHdpZHRoICogaGVpZ2h0OworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgbWJQYXJ0Q2hyb21hICsgOCo4LCB4SW50LCB5SW50LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0LCA4KTsKKyAgICB9CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnaCcKKyAgICAgICAgICBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCisgICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKKyAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX0FSTTExCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQpCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTMyIGksIGo7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgdTggKnB0ckMsICpwdHJWOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aDsKKyAgICB9CisKKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKKyAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7CisKKyAgICAvKiA0IHBpeGVscyBwZXIgaXRlcmF0aW9uLCBpbnRlcnBvbGF0ZSB1c2luZyA1IHZlcnRpY2FsIHNhbXBsZXMgKi8KKyAgICBmb3IgKGkgPSAocGFydEhlaWdodCA+PiAyKTsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgLyogaDEgPSAoMTYgKyBBICsgMTYoRytNKSArIDQoRytNKSAtIDQoQytSKSAtIChDK1IpICsgVCkgPj4gNSAqLworICAgICAgICBmb3IgKGogPSBwYXJ0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpd2lkdGgqMl07CisgICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXAxID0gcHRyVlt3aWR0aF07CisgICAgICAgICAgICB0bXAyID0gcHRyVlt3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOworCisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7CisgICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiAtPSB0bXA3OworICAgICAgICAgICAgdG1wMiArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJDW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyICs9IHRtcDM7CisgICAgICAgICAgICB0bXAyID0gY2xwW3RtcDI+PjVdOworICAgICAgICAgICAgdG1wMSArPSAxNjsKKyAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCl0bXAyOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxICs9IHRtcDI7CisgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDE+PjVdOworICAgICAgICAgICAgdG1wNiArPSAxNjsKKyAgICAgICAgICAgIG1iWzMyXSA9ICh1OCl0bXAxOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOworICAgICAgICAgICAgdG1wMSA9ICpwdHJDOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgdG1wNSArPSAxNjsKKyAgICAgICAgICAgIG1iWzE2XSA9ICh1OCl0bXA2OworCisgICAgICAgICAgICB0bXAxICs9IHRtcDQ7CisgICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXAxOworICAgICAgICAgICAgdG1wMyArPSB0bXAyOworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKKyAgICAgICAgICAgIHB0ckMrKzsKKyAgICAgICAgfQorICAgICAgICBwdHJDICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIHB0clYgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwgcG9zaXRpb24gJ2QnCisgICAgICAgICAgb3IgJ24nIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKKyAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAorICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIHZlck9mZnNldCkgICAgLyogMCBmb3IgcGl4ZWwgZCwgMSBmb3IgcGl4ZWwgbiAqLworeworICAgIHUzMiBwMVsyMSoyMS80KzFdOworICAgIHUzMiBpLCBqOworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIHU4ICpwdHJDLCAqcHRyViwgKnB0ckludDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGg7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBwdHJDID0gcmVmICsgd2lkdGg7CisgICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOworCisgICAgLyogUG9pbnRlciB0byBpbnRlZ2VyIHNhbXBsZSBwb3NpdGlvbiwgZWl0aGVyIE0gb3IgUiAqLworICAgIHB0ckludCA9IHB0ckMgKyAoMit2ZXJPZmZzZXQpKndpZHRoOworCisgICAgLyogNCBwaXhlbHMgcGVyIGl0ZXJhdGlvbgorICAgICAqIGludGVycG9sYXRlIHVzaW5nIDUgdmVydGljYWwgc2FtcGxlcyBhbmQgYXZlcmFnZSBiZXR3ZWVuCisgICAgICogaW50ZXJwb2xhdGVkIHZhbHVlIGFuZCBpbnRlZ2VyIHNhbXBsZSB2YWx1ZSAqLworICAgIGZvciAoaSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyBpOyBpLS0pCisgICAgeworICAgICAgICAvKiBoMSA9ICgxNiArIEEgKyAxNihHK00pICsgNChHK00pIC0gNChDK1IpIC0gKEMrUikgKyBUKSA+PiA1ICovCisgICAgICAgIGZvciAoaiA9IHBhcnRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyIC09IHRtcDc7CisgICAgICAgICAgICB0bXAyICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OworICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKKyAgICAgICAgICAgIHRtcDIgPSBjbHBbdG1wMj4+NV07CisgICAgICAgICAgICB0bXA3ID0gcHRySW50W3dpZHRoKjJdOworICAgICAgICAgICAgdG1wMSArPSAxNjsKKyAgICAgICAgICAgIHRtcDIrKzsKKyAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCkoKHRtcDIgKyB0bXA3KSA+PiAxKTsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OworICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJDW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSArPSB0bXAyOworICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxPj41XTsKKyAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbd2lkdGhdOworICAgICAgICAgICAgdG1wNiArPSAxNjsKKyAgICAgICAgICAgIHRtcDErKzsKKyAgICAgICAgICAgIG1iWzMyXSA9ICh1OCkoKHRtcDEgKyB0bXA3KSA+PiAxKTsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKKyAgICAgICAgICAgIHRtcDcgPSAqcHRySW50OworICAgICAgICAgICAgdG1wNSArPSAxNjsKKyAgICAgICAgICAgIHRtcDYrKzsKKyAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDYgKyB0bXA3KSA+PiAxKTsKKworICAgICAgICAgICAgdG1wMSArPSB0bXA0OworICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKKyAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wNSsrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA1ICsgdG1wNykgPj4gMSk7CisgICAgICAgICAgICBwdHJDKys7CisgICAgICAgICAgICBwdHJJbnQrKzsKKyAgICAgICAgfQorICAgICAgICBwdHJDICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIHB0clYgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRySW50ICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGludGVycG9sYXRpb24gb2YgcGl4ZWwgcG9zaXRpb24gJ2InCisgICAgICAgICAgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQorICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0CisgICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KQoreworICAgIHUzMiBwMVsyMSoyMS80KzFdOworICAgIHU4ICpwdHJKOworICAgIHUzMiB4LCB5OworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKChwYXJ0V2lkdGgmMHgzKSA9PSAwKTsKKyAgICBBU1NFUlQoKHBhcnRIZWlnaHQmMHgzKSA9PSAwKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQsIHBhcnRXaWR0aCs1KTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGggKyA1OworICAgIH0KKworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgcHRySiA9IHJlZiArIDU7CisKKyAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCisgICAgeworICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7CisgICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKKyAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOworICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7CisgICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKKworICAgICAgICAvKiBjYWxjdWxhdGUgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KKyAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNiArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKKyAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNSArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDY7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07CisgICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNCArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDU7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKKyAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wND4+NV07CisgICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDMgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA0OworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAzIC09IHRtcDc7CisgICAgICAgICAgICB0bXAzICs9IHRtcDQ7CisgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDM+PjVdOworICAgICAgICAgICAgdG1wNyA9IHRtcDQ7CisgICAgICAgICAgICB0bXA0ID0gdG1wNjsKKyAgICAgICAgICAgIHRtcDYgPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IHRtcDc7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXAzOworICAgICAgICAgICAgdG1wMyA9IHRtcDU7CisgICAgICAgICAgICB0bXA1ID0gdG1wMTsKKyAgICAgICAgfQorICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBtYiArPSAxNiAtIHBhcnRXaWR0aDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnYScKKyAgICAgICAgICBvciAnYycgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQorICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0CisgICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgaG9yT2Zmc2V0KSAvKiAwIGZvciBwaXhlbCBhLCAxIGZvciBwaXhlbCBjICovCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTggKnB0cko7CisgICAgdTMyIHgsIHk7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQsIHBhcnRXaWR0aCs1KTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGggKyA1OworICAgIH0KKworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgcHRySiA9IHJlZiArIDU7CisKKyAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCisgICAgeworICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7CisgICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKKyAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOworICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7CisgICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKKworICAgICAgICAvKiBjYWxjdWxhdGUgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KKyAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNiArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKKyAgICAgICAgICAgIHRtcDUgKz0gMTY7CisgICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKKyAgICAgICAgICAgICAgICB0bXA2ICs9IHRtcDQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG1wNiArPSB0bXAzOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA2ICsgMSkgPj4gMSk7CisgICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKKyAgICAgICAgICAgIHRtcDQgKz0gMTY7CisgICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKKyAgICAgICAgICAgICAgICB0bXA1ICs9IHRtcDM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG1wNSArPSB0bXAyOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA1ICsgMSkgPj4gMSk7CisgICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA0IC09IHRtcDc7CisgICAgICAgICAgICB0bXA0ICs9IHRtcDU7CisgICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQ+PjVdOworICAgICAgICAgICAgdG1wMyArPSAxNjsKKyAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQorICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXA0ICs9IHRtcDE7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDQgKyAxKSA+PiAxKTsKKyAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAzIC09IHRtcDc7CisgICAgICAgICAgICB0bXAzICs9IHRtcDQ7CisgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDM+PjVdOworICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCisgICAgICAgICAgICAgICAgdG1wMyArPSB0bXAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRtcDMgKz0gdG1wNjsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wMyArIDEpID4+IDEpOworICAgICAgICAgICAgdG1wMyA9IHRtcDU7CisgICAgICAgICAgICB0bXA1ID0gdG1wMTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0OworICAgICAgICAgICAgdG1wNCA9IHRtcDY7CisgICAgICAgICAgICB0bXA2ID0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSB0bXA3OworICAgICAgICB9CisgICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAorICAgICAgICAgIHBvc2l0aW9uICdlJywgJ2cnLCAncCcgb3IgJ3InIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkKKyAgICAgICAgICBpZiBuZWVkZWQuIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kCisgICAgICAgICAgdGhlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIGhvclZlck9mZnNldCkgLyogMCBmb3IgcGl4ZWwgZSwgMSBmb3IgcGl4ZWwgZywKKyAgICAgICAgICAgICAgICAgICAgICAgMiBmb3IgcGl4ZWwgcCwgMyBmb3IgcGl4ZWwgciAqLworeworICAgIHUzMiBwMVsyMSoyMS80KzFdOworICAgIHU4ICpwdHJDLCAqcHRySiwgKnB0clY7CisgICAgdTMyIHgsIHk7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7CisgICAgfQorCisgICAgLyogUmVmIHBvaW50cyB0byBHICsgKC0yLCAtMikgKi8KKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIC8qIHB0ckogcG9pbnRzIHRvIGVpdGhlciBKIG9yIFEsIGRlcGVuZGluZyBvbiB2ZXJ0aWNhbCBvZmZzZXQgKi8KKyAgICBwdHJKID0gcmVmICsgKCgoaG9yVmVyT2Zmc2V0ICYgMHgyKSA+PiAxKSArIDIpICogd2lkdGggKyA1OworCisgICAgLyogcHRyQyBwb2ludHMgdG8gZWl0aGVyIEMgb3IgRCwgZGVwZW5kaW5nIG9uIGhvcml6b250YWwgb2Zmc2V0ICovCisgICAgcHRyQyA9IHJlZiArIHdpZHRoICsgMiArIChob3JWZXJPZmZzZXQgJiAweDEpOworCisgICAgZm9yICh5ID0gcGFydEhlaWdodDsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOworICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7CisgICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKKyAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOworICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7CisKKyAgICAgICAgLyogSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uLCBjYWxjdWxhdGUgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KKyAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNiArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKKyAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNSArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDY7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07CisgICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNCArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDU7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKKyAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wND4+NV07CisgICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDMgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA0OworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAzIC09IHRtcDc7CisgICAgICAgICAgICB0bXAzICs9IHRtcDQ7CisgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDM+PjVdOworICAgICAgICAgICAgdG1wNyA9IHRtcDQ7CisgICAgICAgICAgICB0bXA0ID0gdG1wNjsKKyAgICAgICAgICAgIHRtcDYgPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IHRtcDc7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXAzOworICAgICAgICAgICAgdG1wMyA9IHRtcDU7CisgICAgICAgICAgICB0bXA1ID0gdG1wMTsKKyAgICAgICAgfQorICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBtYiArPSAxNiAtIHBhcnRXaWR0aDsKKyAgICB9CisKKyAgICBtYiAtPSAxNipwYXJ0SGVpZ2h0OworICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKKworICAgIGZvciAoeSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyB5OyB5LS0pCisgICAgeworICAgICAgICAvKiBWZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGFuZCBhdmVyYWdpbmcsIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCisgICAgICAgIGZvciAoeCA9IHBhcnRXaWR0aDsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyIC09IHRtcDc7CisgICAgICAgICAgICB0bXAyICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OworICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wMj4+NV07CisgICAgICAgICAgICB0bXAyID0gbWJbNDhdOworICAgICAgICAgICAgdG1wMSArPSAxNjsKKyAgICAgICAgICAgIHRtcDcrKzsKKyAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCkoKHRtcDIgKyB0bXA3KSA+PiAxKTsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OworICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJDW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSArPSB0bXAyOworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAxPj41XTsKKyAgICAgICAgICAgIHRtcDEgPSBtYlszMl07CisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgdG1wNysrOworICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wMSArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXAxID0gKnB0ckM7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgdG1wNiA9IG1iWzE2XTsKKyAgICAgICAgICAgIHRtcDUgKz0gMTY7CisgICAgICAgICAgICB0bXA3Kys7CisgICAgICAgICAgICBtYlsxNl0gPSAodTgpKCh0bXA2ICsgdG1wNykgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDE7CisgICAgICAgICAgICB0bXAzICs9IHRtcDI7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNT4+NV07CisgICAgICAgICAgICB0bXA1ID0gKm1iOworICAgICAgICAgICAgdG1wNysrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA1ICsgdG1wNykgPj4gMSk7CisgICAgICAgICAgICBwdHJDKys7CisKKyAgICAgICAgfQorICAgICAgICBwdHJDICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIHB0clYgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKKyAgICB9CisKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhhbGYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAorICAgICAgICAgIHBvc2l0aW9uICdqJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4KKyAgICAgICAgICBSZWZlcmVuY2UgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkCisgICAgICAgICAgcGFydCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhhbGYoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQpCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTMyIHgsIHk7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgaTMyICpwdHJDLCAqcHRyViwgKmIxOworICAgIHU4ICAqcHRySjsKKyAgICBpMzIgdGFibGVbMjEqMTZdOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OworICAgIH0KKworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgYjEgPSB0YWJsZTsKKyAgICBwdHJKID0gcmVmICsgNTsKKworICAgIC8qIEZpcnN0IHN0ZXA6IGNhbGN1bGF0ZSBpbnRlcm1lZGlhdGUgdmFsdWVzIGZvcgorICAgICAqIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQgKyA1OyB5OyB5LS0pCisgICAgeworICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7CisgICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKKyAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOworICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7CisgICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKKworICAgICAgICAvKiA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgICpiMSsrID0gdG1wNjsKKyAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDc7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICAqYjErKyA9IHRtcDU7CisgICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA0IC09IHRtcDc7CisgICAgICAgICAgICB0bXA0ICs9IHRtcDU7CisgICAgICAgICAgICAqYjErKyA9IHRtcDQ7CisgICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOworICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMyAtPSB0bXA3OworICAgICAgICAgICAgdG1wMyArPSB0bXA0OworICAgICAgICAgICAgKmIxKysgPSB0bXAzOworICAgICAgICAgICAgdG1wNyA9IHRtcDQ7CisgICAgICAgICAgICB0bXA0ID0gdG1wNjsKKyAgICAgICAgICAgIHRtcDYgPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IHRtcDc7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICB9CisgICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgfQorCisgICAgLyogU2Vjb25kIHN0ZXA6IGNhbGN1bGF0ZSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCisgICAgcHRyQyA9IHRhYmxlICsgcGFydFdpZHRoOworICAgIHB0clYgPSBwdHJDICsgNSpwYXJ0V2lkdGg7CisgICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKKyAgICB7CisgICAgICAgIC8qIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCisgICAgICAgIGZvciAoeCA9IHBhcnRXaWR0aDsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMilwYXJ0V2lkdGgqMl07CisgICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMilwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMSA9IHB0clZbcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJWW3BhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOworCisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7CisgICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiAtPSB0bXA3OworICAgICAgICAgICAgdG1wMiArPSA1MTI7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1twYXJ0V2lkdGgqMl07CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wMj4+MTBdOworICAgICAgICAgICAgdG1wMSArPSA1MTI7CisgICAgICAgICAgICBtYls0OF0gPSAodTgpdG1wNzsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OworICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJDW3BhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wMT4+MTBdOworICAgICAgICAgICAgdG1wNiArPSA1MTI7CisgICAgICAgICAgICBtYlszMl0gPSAodTgpdG1wNzsKKworICAgICAgICAgICAgdG1wMSA9ICpwdHJDOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA2Pj4xMF07CisgICAgICAgICAgICB0bXA1ICs9IDUxMjsKKyAgICAgICAgICAgIG1iWzE2XSA9ICh1OCl0bXA3OworCisgICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMilwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSB0bXA0OworICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA1Pj4xMF07CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA3OworICAgICAgICAgICAgcHRyQysrOworICAgICAgICB9CisgICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7CisgICAgICAgIHB0ckMgKz0gMypwYXJ0V2lkdGg7CisgICAgICAgIHB0clYgKz0gMypwYXJ0V2lkdGg7CisgICAgfQorCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwKKyAgICAgICAgICBwb3NpdGlvbiAnZicgb3IgJ3EnIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLgorICAgICAgICAgIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQKKyAgICAgICAgICBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIHZlck9mZnNldCkgICAgLyogMCBmb3IgcGl4ZWwgZiwgMSBmb3IgcGl4ZWwgcSAqLworeworICAgIHUzMiBwMVsyMSoyMS80KzFdOworICAgIHUzMiB4LCB5OworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIGkzMiAqcHRyQywgKnB0clYsICpwdHJJbnQsICpiMTsKKyAgICB1OCAgKnB0cko7CisgICAgaTMyIHRhYmxlWzIxKjE2XTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKKyAgICB9CisKKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIGIxID0gdGFibGU7CisgICAgcHRySiA9IHJlZiArIDU7CisKKyAgICAvKiBGaXJzdCBzdGVwOiBjYWxjdWxhdGUgaW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IKKyAgICAgKiBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KKyAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0ICsgNTsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOworICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7CisgICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKKyAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOworICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7CisgICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgKmIxKysgPSB0bXA2OworICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgICpiMSsrID0gdG1wNTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKKyAgICAgICAgICAgICpiMSsrID0gdG1wNDsKKyAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAzIC09IHRtcDc7CisgICAgICAgICAgICB0bXAzICs9IHRtcDQ7CisgICAgICAgICAgICAqYjErKyA9IHRtcDM7CisgICAgICAgICAgICB0bXA3ID0gdG1wNDsKKyAgICAgICAgICAgIHRtcDQgPSB0bXA2OworICAgICAgICAgICAgdG1wNiA9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgPSB0bXA1OworICAgICAgICAgICAgdG1wNSA9IHRtcDE7CisgICAgICAgIH0KKyAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICB9CisKKyAgICAvKiBTZWNvbmQgc3RlcDogY2FsY3VsYXRlIHZlcnRpY2FsIGludGVycG9sYXRpb24gYW5kIGF2ZXJhZ2UgKi8KKyAgICBwdHJDID0gdGFibGUgKyBwYXJ0V2lkdGg7CisgICAgcHRyViA9IHB0ckMgKyA1KnBhcnRXaWR0aDsKKyAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgTSBvciBSICovCisgICAgcHRySW50ID0gcHRyQyArICgyK3Zlck9mZnNldCkqcGFydFdpZHRoOworICAgIGZvciAoeSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyB5OyB5LS0pCisgICAgeworICAgICAgICBmb3IgKHggPSBwYXJ0V2lkdGg7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpcGFydFdpZHRoKjJdOworICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJWW3BhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAyID0gcHRyVltwYXJ0V2lkdGgqMl07CisgICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOworICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDIgKz0gNTEyOworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OworICAgICAgICAgICAgdG1wMyA9IHB0ckNbcGFydFdpZHRoKjJdOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gcHRySW50W3BhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKKyAgICAgICAgICAgIHRtcDIgPSBjbHBbdG1wMj4+MTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07CisgICAgICAgICAgICB0bXAxICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDIrKzsKKyAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCkoKHRtcDcgKyB0bXAyKSA+PiAxKTsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OworICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJDW3BhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMT4+MTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07CisgICAgICAgICAgICB0bXA2ICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDErKzsKKyAgICAgICAgICAgIG1iWzMyXSA9ICh1OCkoKHRtcDcgKyB0bXAxKSA+PiAxKTsKKworICAgICAgICAgICAgdG1wMSA9ICpwdHJDOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQ7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjEwXTsKKyAgICAgICAgICAgIHRtcDcgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDc+PjVdOworICAgICAgICAgICAgdG1wNSArPSA1MTI7CisgICAgICAgICAgICB0bXA2Kys7CisgICAgICAgICAgICBtYlsxNl0gPSAodTgpKCh0bXA3ICsgdG1wNikgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXBhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAxICs9IHRtcDQ7CisgICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXAxOworICAgICAgICAgICAgdG1wMyArPSB0bXAyOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gcHRySW50Wy0oaTMyKXBhcnRXaWR0aF07CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjEwXTsKKyAgICAgICAgICAgIHRtcDcgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDc+PjVdOworICAgICAgICAgICAgdG1wNSsrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA3ICsgdG1wNSkgPj4gMSk7CisgICAgICAgICAgICBwdHJDKys7CisgICAgICAgICAgICBwdHJJbnQrKzsKKyAgICAgICAgfQorICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOworICAgICAgICBwdHJDICs9IDMqcGFydFdpZHRoOworICAgICAgICBwdHJWICs9IDMqcGFydFdpZHRoOworICAgICAgICBwdHJJbnQgKz0gMypwYXJ0V2lkdGg7CisgICAgfQorCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwKKyAgICAgICAgICBwb3NpdGlvbiAnaScgb3IgJ2snIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLgorICAgICAgICAgIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQKKyAgICAgICAgICBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIGhvck9mZnNldCkgICAgLyogMCBmb3IgcGl4ZWwgaSwgMSBmb3IgcGl4ZWwgayAqLworeworICAgIHUzMiBwMVsyMSoyMS80KzFdOworICAgIHUzMiB4LCB5OworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIGkzMiAqcHRySiwgKnB0ckludCwgKmgxOworICAgIHU4ICAqcHRyQywgKnB0clY7CisgICAgaTMyIHRhYmxlWzIxKjE2XTsKKyAgICBpMzIgdGFibGVXaWR0aCA9IChpMzIpcGFydFdpZHRoKzU7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBoMSA9IHRhYmxlICsgdGFibGVXaWR0aDsKKyAgICBwdHJDID0gcmVmICsgd2lkdGg7CisgICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOworCisgICAgLyogRmlyc3Qgc3RlcDogY2FsY3VsYXRlIGludGVybWVkaWF0ZSB2YWx1ZXMgZm9yCisgICAgICogdmVydGljYWwgaW50ZXJwb2xhdGlvbiAqLworICAgIGZvciAoeSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyB5OyB5LS0pCisgICAgeworICAgICAgICBmb3IgKHggPSAodTMyKXRhYmxlV2lkdGg7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpd2lkdGgqMl07CisgICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXAxID0gcHRyVlt3aWR0aF07CisgICAgICAgICAgICB0bXAyID0gcHRyVlt3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOworCisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7CisgICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OworICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKKyAgICAgICAgICAgIGgxW3RhYmxlV2lkdGgqMl0gPSB0bXAyOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxICs9IHRtcDI7CisgICAgICAgICAgICBoMVt0YWJsZVdpZHRoXSA9IHRtcDE7CisKKyAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgICpoMSA9IHRtcDY7CisKKyAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDE7CisgICAgICAgICAgICB0bXAzICs9IHRtcDI7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIGgxWy10YWJsZVdpZHRoXSA9IHRtcDU7CisgICAgICAgICAgICBoMSsrOworICAgICAgICAgICAgcHRyQysrOworICAgICAgICB9CisgICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aCAtIDU7CisgICAgICAgIHB0clYgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aCAtIDU7CisgICAgICAgIGgxICs9IDMqdGFibGVXaWR0aDsKKyAgICB9CisKKyAgICAvKiBTZWNvbmQgc3RlcDogY2FsY3VsYXRlIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBhbmQgYXZlcmFnZSAqLworICAgIHB0ckogPSB0YWJsZSArIDU7CisgICAgLyogUG9pbnRlciB0byBpbnRlZ2VyIHNhbXBsZSBwb3NpdGlvbiwgZWl0aGVyIEcgb3IgSCAqLworICAgIHB0ckludCA9IHRhYmxlICsgMiArIGhvck9mZnNldDsKKyAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCisgICAgeworICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7CisgICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKKyAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOworICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7CisgICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKKyAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aD4+Mik7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDYgKz0gNTEyOworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gKnB0ckludCsrOworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2ID4+IDEwXTsKKyAgICAgICAgICAgIHRtcDcgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDcgPj4gNV07CisgICAgICAgICAgICB0bXA1ICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDYrKzsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNiArIHRtcDcpID4+IDEpOworICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDUgPj4gMTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKKyAgICAgICAgICAgIHRtcDQgKz0gNTEyOworICAgICAgICAgICAgdG1wNSsrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA1ICsgdG1wNykgPj4gMSk7CisgICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA0IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gKnB0ckludCsrOworICAgICAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0ID4+IDEwXTsKKyAgICAgICAgICAgIHRtcDcgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDcgPj4gNV07CisgICAgICAgICAgICB0bXAzICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDQrKzsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNCArIHRtcDcpID4+IDEpOworICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7CisgICAgICAgICAgICB0bXAzICs9IHRtcDQ7CisgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgPj4gMTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKKyAgICAgICAgICAgIHRtcDMrKzsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wMyArIHRtcDcpID4+IDEpOworICAgICAgICAgICAgdG1wMyA9IHRtcDU7CisgICAgICAgICAgICB0bXA1ID0gdG1wMTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0OworICAgICAgICAgICAgdG1wNCA9IHRtcDY7CisgICAgICAgICAgICB0bXA2ID0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSB0bXA3OworICAgICAgICB9CisgICAgICAgIHB0ckogKz0gNTsKKyAgICAgICAgcHRySW50ICs9IDU7CisgICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOworICAgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFByZWRpY3RTYW1wbGVzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlY29uc3RydWN0cyBhIHByZWRpY3Rpb24gZm9yIGEgbWFjcm9ibG9jayBwYXJ0aXRpb24uCisgICAgICAgICAgVGhlIHByZWRpY3Rpb24gaXMgZWl0aGVyIGNvcGllZCBvciBpbnRlcnBvbGF0ZWQgdXNpbmcgdGhlIHJlZmVyZW5jZQorICAgICAgICAgIGZyYW1lIGFuZCB0aGUgbW90aW9uIHZlY3Rvci4gQm90aCBsdW1pbmFuY2UgYW5kIGNocm9taW5hbmNlIHBhcnRzIGFyZQorICAgICAgICAgIHByZWRpY3RlZC4gVGhlIHByZWRpY3Rpb24gaXMgc3RvcmVkIGluIGdpdmVuIG1hY3JvYmxvY2sgYXJyYXkgKGRhdGEpLgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgZGF0YSAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgYXJyYXkgKDM4NCBieXRlcykgZm9yIG91dHB1dAorICAgICAgICAgIG12ICAgICAgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIHVzZWQgZm9yIHByZWRpY3Rpb24KKyAgICAgICAgICByZWZQaWMgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIHBpY3R1cmUgc3RydWN0dXJlCisgICAgICAgICAgeEEgICAgICAgICAgICB4LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIHlBICAgICAgICAgICAgeS1jb29yZGluYXRlIGZvciBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBwYXJ0WCAgICAgICAgIHgtb2Zmc2V0IGZvciBwYXJ0aXRpb24gaW4gbWFjcm9ibG9jaworICAgICAgICAgIHBhcnRZICAgICAgICAgeS1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCisgICAgICAgICAgcGFydFdpZHRoICAgICB3aWR0aCBvZiBwYXJ0aXRpb24KKyAgICAgICAgICBwYXJ0SGVpZ2h0ICAgIGhlaWdodCBvZiBwYXJ0aXRpb24KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBkYXRhICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgKDE2eDE2Kzh4OCs4eDgpIHdoZXJlIHByZWRpY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uIGlzIHN0b3JlZCBhdCBjb3JyZWN0IHBvc2l0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZFByZWRpY3RTYW1wbGVzKAorICB1OCAqZGF0YSwKKyAgbXZfdCAqbXYsCisgIGltYWdlX3QgKnJlZlBpYywKKyAgdTMyIHhBLAorICB1MzIgeUEsCisgIHUzMiBwYXJ0WCwKKyAgdTMyIHBhcnRZLAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCkKKworeworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4RnJhYywgeUZyYWMsIHdpZHRoLCBoZWlnaHQ7CisgICAgaTMyIHhJbnQsIHlJbnQ7CisgICAgdTggKmx1bWFQYXJ0RGF0YTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChtdik7CisgICAgQVNTRVJUKHBhcnRXaWR0aCk7CisgICAgQVNTRVJUKHBhcnRIZWlnaHQpOworICAgIEFTU0VSVChyZWZQaWMpOworICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOworICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKKyAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOworCisgICAgLyogbHVtYSAqLworICAgIGx1bWFQYXJ0RGF0YSA9IGRhdGEgKyAxNipwYXJ0WSArIHBhcnRYOworCisgICAgeEZyYWMgPSBtdi0+aG9yICYgMHgzOworICAgIHlGcmFjID0gbXYtPnZlciAmIDB4MzsKKworICAgIHdpZHRoID0gMTYgKiByZWZQaWMtPndpZHRoOworICAgIGhlaWdodCA9IDE2ICogcmVmUGljLT5oZWlnaHQ7CisKKyAgICB4SW50ID0gKGkzMil4QSArIChpMzIpcGFydFggKyAobXYtPmhvciA+PiAyKTsKKyAgICB5SW50ID0gKGkzMil5QSArIChpMzIpcGFydFkgKyAobXYtPnZlciA+PiAyKTsKKworICAgIEFTU0VSVChsdW1hRnJhY1Bvc1t4RnJhY11beUZyYWNdIDwgMTYpOworCisgICAgc3dpdGNoIChsdW1hRnJhY1Bvc1t4RnJhY11beUZyYWNdKQorICAgIHsKKyAgICAgICAgY2FzZSAwOiAvKiBHICovCisgICAgICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LHlJbnQsd2lkdGgsaGVpZ2h0LHBhcnRXaWR0aCxwYXJ0SGVpZ2h0LDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIGQgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8qIGggKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8qIG4gKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6IC8qIGEgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludCwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6IC8qIGUgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjogLyogaSAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OiAvKiBwICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6IC8qIGIgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludCwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6IC8qIGYgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8qIGogKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhhbGYocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTE6IC8qIHEgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6IC8qIGMgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludCwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvKiBnICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0OiAvKiBrICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDE1LCByICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGNocm9tYSAqLworICAgIFByZWRpY3RDaHJvbWEoCisgICAgICBkYXRhICsgMTYqMTYgKyAocGFydFk+PjEpKjggKyAocGFydFg+PjEpLAorICAgICAgeEEgKyBwYXJ0WCwKKyAgICAgIHlBICsgcGFydFksCisgICAgICBwYXJ0V2lkdGgsCisgICAgICBwYXJ0SGVpZ2h0LAorICAgICAgbXYsCisgICAgICByZWZQaWMpOworCit9CisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFByZWRpY3RTYW1wbGVzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlY29uc3RydWN0cyBhIHByZWRpY3Rpb24gZm9yIGEgbWFjcm9ibG9jayBwYXJ0aXRpb24uCisgICAgICAgICAgVGhlIHByZWRpY3Rpb24gaXMgZWl0aGVyIGNvcGllZCBvciBpbnRlcnBvbGF0ZWQgdXNpbmcgdGhlIHJlZmVyZW5jZQorICAgICAgICAgIGZyYW1lIGFuZCB0aGUgbW90aW9uIHZlY3Rvci4gQm90aCBsdW1pbmFuY2UgYW5kIGNocm9taW5hbmNlIHBhcnRzIGFyZQorICAgICAgICAgIHByZWRpY3RlZC4gVGhlIHByZWRpY3Rpb24gaXMgc3RvcmVkIGluIGdpdmVuIG1hY3JvYmxvY2sgYXJyYXkgKGRhdGEpLgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgZGF0YSAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgYXJyYXkgKDM4NCBieXRlcykgZm9yIG91dHB1dAorICAgICAgICAgIG12ICAgICAgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIHVzZWQgZm9yIHByZWRpY3Rpb24KKyAgICAgICAgICByZWZQaWMgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIHBpY3R1cmUgc3RydWN0dXJlCisgICAgICAgICAgeEEgICAgICAgICAgICB4LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIHlBICAgICAgICAgICAgeS1jb29yZGluYXRlIGZvciBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBwYXJ0WCAgICAgICAgIHgtb2Zmc2V0IGZvciBwYXJ0aXRpb24gaW4gbWFjcm9ibG9jaworICAgICAgICAgIHBhcnRZICAgICAgICAgeS1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCisgICAgICAgICAgcGFydFdpZHRoICAgICB3aWR0aCBvZiBwYXJ0aXRpb24KKyAgICAgICAgICBwYXJ0SGVpZ2h0ICAgIGhlaWdodCBvZiBwYXJ0aXRpb24KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBkYXRhICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgKDE2eDE2Kzh4OCs4eDgpIHdoZXJlIHByZWRpY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uIGlzIHN0b3JlZCBhdCBjb3JyZWN0IHBvc2l0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qbGludCAtZXs1NTB9IFN5bWJvbCAncmVzJyBub3QgYWNjZXNzZWQgKi8KK3ZvaWQgaDI2NGJzZFByZWRpY3RTYW1wbGVzKAorICB1OCAqZGF0YSwKKyAgbXZfdCAqbXYsCisgIGltYWdlX3QgKnJlZlBpYywKKyAgdTMyIGNvbEFuZFJvdywKKyAgdTMyIHBhcnQsCisgIHU4ICpwRmlsbCkKKworeworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4RnJhYywgeUZyYWM7CisgICAgdTMyIHdpZHRoLCBoZWlnaHQ7CisgICAgaTMyIHhJbnQsIHlJbnQsIHgwLCB5MDsKKyAgICB1OCAqcGFydERhdGEsICpyZWY7CisgICAgT01YU2l6ZSByb2k7CisgICAgdTMyIGZpbGxXaWR0aDsKKyAgICB1MzIgZmlsbEhlaWdodDsKKyAgICBPTVhSZXN1bHQgcmVzOworICAgIHUzMiB4QSwgeUE7CisgICAgdTMyIHBhcnRYLCBwYXJ0WTsKKyAgICB1MzIgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKG12KTsKKyAgICBBU1NFUlQocmVmUGljKTsKKyAgICBBU1NFUlQocmVmUGljLT5kYXRhKTsKKyAgICBBU1NFUlQocmVmUGljLT53aWR0aCk7CisgICAgQVNTRVJUKHJlZlBpYy0+aGVpZ2h0KTsKKworICAgIHhBID0gKGNvbEFuZFJvdyAmIDB4RkZGRjAwMDApID4+IDE2OworICAgIHlBID0gKGNvbEFuZFJvdyAmIDB4MDAwMEZGRkYpOworCisgICAgcGFydFggPSAocGFydCAmIDB4RkYwMDAwMDApID4+IDI0OworICAgIHBhcnRZID0gKHBhcnQgJiAweDAwRkYwMDAwKSA+PiAxNjsKKyAgICBwYXJ0V2lkdGggPSAocGFydCAmIDB4MDAwMEZGMDApID4+IDg7CisgICAgcGFydEhlaWdodCA9IChwYXJ0ICYgMHgwMDAwMDBGRik7CisKKyAgICBBU1NFUlQocGFydFdpZHRoKTsKKyAgICBBU1NFUlQocGFydEhlaWdodCk7CisKKyAgICAvKiBsdW1hICovCisgICAgcGFydERhdGEgPSBkYXRhICsgMTYqcGFydFkgKyBwYXJ0WDsKKworICAgIHhGcmFjID0gbXYtPmhvciAmIDB4MzsKKyAgICB5RnJhYyA9IG12LT52ZXIgJiAweDM7CisKKyAgICB3aWR0aCA9IDE2ICogcmVmUGljLT53aWR0aDsKKyAgICBoZWlnaHQgPSAxNiAqIHJlZlBpYy0+aGVpZ2h0OworCisgICAgeEludCA9IChpMzIpeEEgKyAoaTMyKXBhcnRYICsgKG12LT5ob3IgPj4gMik7CisgICAgeUludCA9IChpMzIpeUEgKyAoaTMyKXBhcnRZICsgKG12LT52ZXIgPj4gMik7CisKKyAgICB4MCA9ICh4RnJhYykgPyB4SW50LTIgOiB4SW50OworICAgIHkwID0gKHlGcmFjKSA/IHlJbnQtMiA6IHlJbnQ7CisKKyAgICBpZiAoeEZyYWMpCisgICAgeworICAgICAgICBpZiAocGFydFdpZHRoID09IDE2KQorICAgICAgICAgICAgZmlsbFdpZHRoID0gMzI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpbGxXaWR0aCA9IDE2OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGZpbGxXaWR0aCA9IChwYXJ0V2lkdGgqMik7CisgICAgaWYgKHlGcmFjKQorICAgICAgICBmaWxsSGVpZ2h0ID0gcGFydEhlaWdodCs1OworICAgIGVsc2UKKyAgICAgICAgZmlsbEhlaWdodCA9IHBhcnRIZWlnaHQ7CisKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtmaWxsV2lkdGggPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArZmlsbEhlaWdodCA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZlBpYy0+ZGF0YSwgKHU4KilwRmlsbCwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGZpbGxXaWR0aCwgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gcEZpbGw7CisgICAgICAgIHdpZHRoID0gZmlsbFdpZHRoOworICAgICAgICBpZiAoeUZyYWMpCisgICAgICAgICAgICByZWYgKz0gMip3aWR0aDsKKyAgICAgICAgaWYgKHhGcmFjKQorICAgICAgICAgICAgcmVmICs9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qbGludCAtLWUoNzM3KSBMb3NzIG9mIHNpZ24gKi8KKyAgICAgICAgcmVmID0gcmVmUGljLT5kYXRhICsgeUludCp3aWR0aCArIHhJbnQ7CisgICAgfQorICAgIC8qIEx1bWEgaW50ZXJwb2xhdGlvbiAqLworICAgIHJvaS53aWR0aCA9IChpMzIpcGFydFdpZHRoOworICAgIHJvaS5oZWlnaHQgPSAoaTMyKXBhcnRIZWlnaHQ7CisKKyAgICByZXMgPSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYShyZWYsIChpMzIpd2lkdGgsIHBhcnREYXRhLCAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKXhGcmFjLCAoaTMyKXlGcmFjLCByb2kpOworICAgIEFTU0VSVChyZXMgPT0gMCk7CisKKyAgICAvKiBDaHJvbWEgKi8KKyAgICB3aWR0aCAgPSA4ICogcmVmUGljLT53aWR0aDsKKyAgICBoZWlnaHQgPSA4ICogcmVmUGljLT5oZWlnaHQ7CisKKyAgICB4MCA9ICgoeEEgKyBwYXJ0WCkgPj4gMSkgKyAobXYtPmhvciA+PiAzKTsKKyAgICB5MCA9ICgoeUEgKyBwYXJ0WSkgPj4gMSkgKyAobXYtPnZlciA+PiAzKTsKKyAgICB4RnJhYyA9IG12LT5ob3IgJiAweDc7CisgICAgeUZyYWMgPSBtdi0+dmVyICYgMHg3OworCisgICAgcmVmID0gcmVmUGljLT5kYXRhICsgMjU2ICogcmVmUGljLT53aWR0aCAqIHJlZlBpYy0+aGVpZ2h0OworCisgICAgcm9pLndpZHRoID0gKGkzMikocGFydFdpZHRoID4+IDEpOworICAgIGZpbGxXaWR0aCA9ICgocGFydFdpZHRoID4+IDEpICsgOCkgJiB+MHg3OworICAgIHJvaS5oZWlnaHQgPSAoaTMyKShwYXJ0SGVpZ2h0ID4+IDEpOworICAgIGZpbGxIZWlnaHQgPSAocGFydEhlaWdodCA+PiAxKSArIDE7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArZmlsbFdpZHRoID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2ZpbGxIZWlnaHQgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIHBGaWxsLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBmaWxsV2lkdGgsIGZpbGxIZWlnaHQsIGZpbGxXaWR0aCk7CisgICAgICAgIHJlZiArPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIHBGaWxsICsgZmlsbFdpZHRoKmZpbGxIZWlnaHQsCisgICAgICAgICAgICB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGZpbGxXaWR0aCwKKyAgICAgICAgICAgIGZpbGxIZWlnaHQsIGZpbGxXaWR0aCk7CisKKyAgICAgICAgcmVmID0gcEZpbGw7CisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICB3aWR0aCA9IGZpbGxXaWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gZmlsbEhlaWdodDsKKyAgICB9CisKKyAgICBwYXJ0RGF0YSA9IGRhdGEgKyAxNioxNiArIChwYXJ0WT4+MSkqOCArIChwYXJ0WD4+MSk7CisKKyAgICAvKiBDaHJvbWEgaW50ZXJwb2xhdGlvbiAqLworICAgIC8qbGludCAtLWUoNzM3KSBMb3NzIG9mIHNpZ24gKi8KKyAgICByZWYgKz0geTAgKiB3aWR0aCArIHgwOworICAgIHJlcyA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKHJlZiwgd2lkdGgsIHBhcnREYXRhLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpcm9pLndpZHRoLCAodTMyKXJvaS5oZWlnaHQsIHhGcmFjLCB5RnJhYyk7CisgICAgQVNTRVJUKHJlcyA9PSAwKTsKKyAgICBwYXJ0RGF0YSArPSA4ICogODsKKyAgICByZWYgKz0gaGVpZ2h0ICogd2lkdGg7CisgICAgcmVzID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEocmVmLCB3aWR0aCwgcGFydERhdGEsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMilyb2kud2lkdGgsICh1MzIpcm9pLmhlaWdodCwgeEZyYWMsIHlGcmFjKTsKKyAgICBBU1NFUlQocmVzID09IDApOworCit9CisKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWxsUm93MQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgcm93IG9mIHJlZmVyZW5jZSBwZWxzIGluIGEgJ25vcm1hbCcgY2FzZSB3aGVuIG5vCisgICAgICAgICAgb3ZlcmZpbGxpbmcgaXMgbmVjZXNzYXJ5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBGaWxsUm93MSgKKyAgdTggKnJlZiwKKyAgdTggKmZpbGwsCisgIGkzMiBsZWZ0LAorICBpMzIgY2VudGVyLAorICBpMzIgcmlnaHQpCit7CisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQoZmlsbCk7CisKKyAgICBIMjY0U3dEZWNNZW1jcHkoZmlsbCwgcmVmLCAodTMyKWNlbnRlcik7CisKKyAgICAvKmxpbnQgLWUoNzE1KSAqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZpbGxSb3c3CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSByb3cgb2YgcmVmZXJlbmNlIHBlbHMgd2hlbiBob3Jpem9udGFsIGNvb3JkaW5hdGUKKyAgICAgICAgICBpcyBwYXJ0bHkgbmVnYXRpdmUgb3IgcGFydGx5IGdyZWF0ZXIgdGhhbiByZWZlcmVuY2UgcGljdHVyZSB3aWR0aAorICAgICAgICAgIChvdmVyZmlsbGluZyBzb21lIHBlbHMgb24gbGVmdCBhbmQvb3IgcmlnaHQgZWRnZSkuCisgICAgICAgIElucHV0czoKKyAgICAgICAgICByZWYgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2Ugc2FtcGxlcworICAgICAgICAgIGxlZnQgICAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIG92ZXJmaWxsIG9uIGxlZnQtZWRnZQorICAgICAgICAgIGNlbnRlciAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIGNvcHkKKyAgICAgICAgICByaWdodCAgICAgYW1vdW50IG9mIHBpeGVscyB0byBvdmVyZmlsbCBvbiByaWdodC1lZGdlCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgZmlsbCAgICAgIHBvaW50ZXIgd2hlcmUgc2FtcGxlcyBhcmUgc3RvcmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfTkVPTgordm9pZCBoMjY0YnNkRmlsbFJvdzcoCisgIHU4ICpyZWYsCisgIHU4ICpmaWxsLAorICBpMzIgbGVmdCwKKyAgaTMyIGNlbnRlciwKKyAgaTMyIHJpZ2h0KQoreworICAgIHU4IHRtcDsKKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChmaWxsKTsKKworICAgIGlmIChsZWZ0KQorICAgICAgICB0bXAgPSAqcmVmOworCisgICAgZm9yICggOyBsZWZ0OyBsZWZ0LS0pCisgICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wKSAgdG1wIGlzIGluaXRpYWxpemVkIGlmIHVzZWQgKi8KKyAgICAgICAgKmZpbGwrKyA9IHRtcDsKKworICAgIGZvciAoIDsgY2VudGVyOyBjZW50ZXItLSkKKyAgICAgICAgKmZpbGwrKyA9ICpyZWYrKzsKKworICAgIGlmIChyaWdodCkKKyAgICAgICAgdG1wID0gcmVmWy0xXTsKKworICAgIGZvciAoIDsgcmlnaHQ7IHJpZ2h0LS0pCisgICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wKSAgdG1wIGlzIGluaXRpYWxpemVkIGlmIHVzZWQgKi8KKyAgICAgICAgKmZpbGwrKyA9IHRtcDsKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBibG9jayBvZiByZWZlcmVuY2UgcGVscy4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCisgICAgICAgICAgb3ZlcmZpbGxpbmcgaXMgbmVlZGVkIG9yIG5vdCBhbmQgcmVwZWF0ZWRseSBjYWxscyBhbiBhcHByb3ByaWF0ZQorICAgICAgICAgIGZ1bmN0aW9uIChieSB1c2luZyBhIGZ1bmN0aW9uIHBvaW50ZXIpIHRoYXQgZmlsbHMgb25lIHJvdyB0aGUgYmxvY2suCisgICAgICAgIElucHV0czoKKyAgICAgICAgICByZWYgICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZQorICAgICAgICAgIHgwICAgICAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgYmxvY2sKKyAgICAgICAgICB5MCAgICAgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGJsb2NrCisgICAgICAgICAgd2lkdGggICAgICAgICAgICAgd2lkdGggb2YgcmVmZXJlbmNlIGZyYW1lCisgICAgICAgICAgaGVpZ2h0ICAgICAgICAgICAgaGVpZ2h0IG9mIHJlZmVyZW5jZSBmcmFtZQorICAgICAgICAgIGJsb2NrV2lkdGggICAgICAgIHdpZHRoIG9mIGJsb2NrCisgICAgICAgICAgYmxvY2tIZWlnaHQgICAgICAgaGVpZ2h0IG9mIGJsb2NrCisgICAgICAgICAgZmlsbFNjYW5MZW5ndGggICAgbGVuZ3RoIG9mIGEgbGluZSBpbiBvdXRwdXQgYXJyYXkgKHBpeGVscykKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBmaWxsICAgICAgICAgICAgICBwb2ludGVyIHRvIGFycmF5IHdoZXJlIG91dHB1dCBibG9jayBpcyB3cml0dGVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEZpbGxCbG9jaygKKyAgdTggKnJlZiwKKyAgdTggKmZpbGwsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBibG9ja1dpZHRoLAorICB1MzIgYmxvY2tIZWlnaHQsCisgIHUzMiBmaWxsU2Nhbkxlbmd0aCkKKworeworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiB4c3RvcCwgeXN0b3A7CisgICAgdm9pZCAoKmZwKSh1OCosIHU4KiwgaTMyLCBpMzIsIGkzMik7CisgICAgaTMyIGxlZnQsIHgsIHJpZ2h0OworICAgIGkzMiB0b3AsIHksIGJvdHRvbTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKGZpbGwpOworICAgIEFTU0VSVCh3aWR0aCk7CisgICAgQVNTRVJUKGhlaWdodCk7CisgICAgQVNTRVJUKGZpbGwpOworICAgIEFTU0VSVChibG9ja1dpZHRoKTsKKyAgICBBU1NFUlQoYmxvY2tIZWlnaHQpOworCisgICAgeHN0b3AgPSB4MCArIChpMzIpYmxvY2tXaWR0aDsKKyAgICB5c3RvcCA9IHkwICsgKGkzMilibG9ja0hlaWdodDsKKworICAgIC8qIENob29zZSBjb3JyZWN0IGZ1bmN0aW9uIHdoZXRoZXIgb3ZlcmZpbGxpbmcgb24gbGVmdC1lZGdlIG9yIHJpZ2h0LWVkZ2UKKyAgICAgKiBpcyBuZWVkZWQgb3Igbm90ICovCisgICAgaWYgKHgwID49IDAgJiYgeHN0b3AgPD0gKGkzMil3aWR0aCkKKyAgICAgICAgZnAgPSBGaWxsUm93MTsKKyAgICBlbHNlCisgICAgICAgIGZwID0gaDI2NGJzZEZpbGxSb3c3OworCisgICAgaWYgKHlzdG9wIDwgMCkKKyAgICAgICAgeTAgPSAtKGkzMilibG9ja0hlaWdodDsKKworICAgIGlmICh4c3RvcCA8IDApCisgICAgICAgIHgwID0gLShpMzIpYmxvY2tXaWR0aDsKKworICAgIGlmICh5MCA+IChpMzIpaGVpZ2h0KQorICAgICAgICB5MCA9IChpMzIpaGVpZ2h0OworCisgICAgaWYgKHgwID4gKGkzMil3aWR0aCkKKyAgICAgICAgeDAgPSAoaTMyKXdpZHRoOworCisgICAgeHN0b3AgPSB4MCArIChpMzIpYmxvY2tXaWR0aDsKKyAgICB5c3RvcCA9IHkwICsgKGkzMilibG9ja0hlaWdodDsKKworICAgIGlmICh4MCA+IDApCisgICAgICAgIHJlZiArPSB4MDsKKworICAgIGlmICh5MCA+IDApCisgICAgICAgIHJlZiArPSB5MCAqIChpMzIpd2lkdGg7CisKKyAgICBsZWZ0ID0geDAgPCAwID8gLXgwIDogMDsKKyAgICByaWdodCA9IHhzdG9wID4gKGkzMil3aWR0aCA/IHhzdG9wIC0gKGkzMil3aWR0aCA6IDA7CisgICAgeCA9IChpMzIpYmxvY2tXaWR0aCAtIGxlZnQgLSByaWdodDsKKworICAgIHRvcCA9IHkwIDwgMCA/IC15MCA6IDA7CisgICAgYm90dG9tID0geXN0b3AgPiAoaTMyKWhlaWdodCA/IHlzdG9wIC0gKGkzMiloZWlnaHQgOiAwOworICAgIHkgPSAoaTMyKWJsb2NrSGVpZ2h0IC0gdG9wIC0gYm90dG9tOworCisgICAgLyogVG9wLW92ZXJmaWxsaW5nICovCisgICAgZm9yICggOyB0b3A7IHRvcC0tICkKKyAgICB7CisgICAgICAgICgqZnApKHJlZiwgZmlsbCwgbGVmdCwgeCwgcmlnaHQpOworICAgICAgICBmaWxsICs9IGZpbGxTY2FuTGVuZ3RoOworICAgIH0KKworICAgIC8qIExpbmVzIGluc2lkZSByZWZlcmVuY2UgaW1hZ2UgKi8KKyAgICBmb3IgKCA7IHk7IHktLSApCisgICAgeworICAgICAgICAoKmZwKShyZWYsIGZpbGwsIGxlZnQsIHgsIHJpZ2h0KTsKKyAgICAgICAgcmVmICs9IHdpZHRoOworICAgICAgICBmaWxsICs9IGZpbGxTY2FuTGVuZ3RoOworICAgIH0KKworICAgIHJlZiAtPSB3aWR0aDsKKworICAgIC8qIEJvdHRvbS1vdmVyZmlsbGluZyAqLworICAgIGZvciAoIDsgYm90dG9tOyBib3R0b20tLSApCisgICAgeworICAgICAgICAoKmZwKShyZWYsIGZpbGwsIGxlZnQsIHgsIHJpZ2h0KTsKKyAgICAgICAgZmlsbCArPSBmaWxsU2Nhbkxlbmd0aDsKKyAgICB9Cit9CisKKy8qbGludCArZTcwMSArZTcwMiAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWExYTE0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1JFQ09OU1RSVUNUX0gKKyNkZWZpbmUgSDI2NFNXREVDX1JFQ09OU1RSVUNUX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfT01YREwKK3ZvaWQgaDI2NGJzZFByZWRpY3RTYW1wbGVzKAorICB1OCAqZGF0YSwKKyAgbXZfdCAqbXYsCisgIGltYWdlX3QgKnJlZlBpYywKKyAgdTMyIHhBLAorICB1MzIgeUEsCisgIHUzMiBwYXJ0WCwKKyAgdTMyIHBhcnRZLAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCk7CisjZWxzZQordm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCisgIHU4ICpkYXRhLAorICBtdl90ICptdiwKKyAgaW1hZ2VfdCAqcmVmUGljLAorICB1MzIgY29sQW5kUm93LC8qIHBhY2thZ2VkIGRhdGEgfCBjb2x1bW4gICAgfCByb3cgICAgICAgICAgICAgICAgfCovCisgIHUzMiBwYXJ0LCAgICAgLyogcGFja2FnZWQgZGF0YSB8cGFydFh8cGFydFl8cGFydFdpZHRofHBhcnRIZWlnaHR8Ki8KKyAgdTggKnBGaWxsKTsKKyNlbmRpZgorCit2b2lkIGgyNjRic2RGaWxsQmxvY2soCisgIHU4ICogcmVmLAorICB1OCAqIGZpbGwsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBibG9ja1dpZHRoLAorICB1MzIgYmxvY2tIZWlnaHQsCisgIHUzMiBmaWxsU2Nhbkxlbmd0aCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yKAorICB1OCAqcFJlZiwKKyAgdTggKnByZWRQYXJ0Q2hyb21hLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgeEZyYWMsCisgIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCisgIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIoCisgIHU4ICpwUmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB5RnJhYywKKyAgdTMyIGNocm9tYVBhcnRXaWR0aCwKKyAgdTMyIGNocm9tYVBhcnRIZWlnaHQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcigKKyAgdTggKnJlZiwKKyAgdTggKnByZWRQYXJ0Q2hyb21hLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgeEZyYWMsCisgIHUzMiB5RnJhYywKKyAgdTMyIGNocm9tYVBhcnRXaWR0aCwKKyAgdTMyIGNocm9tYVBhcnRIZWlnaHQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiB2ZXJPZmZzZXQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiBob3JPZmZzZXQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiBob3JWZXJPZmZzZXQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhhbGYoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiB2ZXJPZmZzZXQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiBob3JPZmZzZXQpOworCisKK3ZvaWQgaDI2NGJzZEZpbGxSb3c3KAorICB1OCAqcmVmLAorICB1OCAqZmlsbCwKKyAgaTMyIGxlZnQsCisgIGkzMiBjZW50ZXIsCisgIGkzMiByaWdodCk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1JFQ09OU1RSVUNUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3NTZjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMKQEAgLTAsMCArMSwxNjkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZERlY29kZVNlaU1lc3NhZ2UKKyAgICAgICAgICBEZWNvZGVCdWZmZXJpbmdQZXJpb2QKKyAgICAgICAgICBEZWNvZGVQaWN0dXJlVGltaW5nCisgICAgICAgICAgRGVjb2RlUGFuU2NhblJlY3RhbmdsZQorICAgICAgICAgIERlY29kZUZpbGxlclBheWxvYWQKKyAgICAgICAgICBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1CisgICAgICAgICAgRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQKKyAgICAgICAgICBEZWNvZGVSZWNvdmVyeVBvaW50CisgICAgICAgICAgRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24KKyAgICAgICAgICBEZWNvZGVTcGFyZVBpYworICAgICAgICAgIERlY29kZVNjZW5lSW5mbworICAgICAgICAgIERlY29kZVN1YlNlcUluZm8KKyAgICAgICAgICBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcworICAgICAgICAgIERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcworICAgICAgICAgIERlY29kZUZ1bGxGcmFtZUZyZWV6ZQorICAgICAgICAgIERlY29kZUZ1bGxGcmFtZVNuYXBzaG90CisgICAgICAgICAgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0CisgICAgICAgICAgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZAorICAgICAgICAgIERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldAorICAgICAgICAgIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2Rfc2VpLmgiCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHUzMiBudW1DbG9ja1RTWzldID0gezEsMSwxLDIsMiwzLDMsMiwzfTsKK3N0YXRpYyBjb25zdCB1MzIgY2VpbExvZzJOdW1TbGljZUdyb3Vwc1s5XSA9IHswLDEsMSwyLDIsMywzLDMsM307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVCdWZmZXJpbmdQZXJpb2QoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpQnVmZmVyaW5nUGVyaW9kX3QgKnBCdWZmZXJpbmdQZXJpb2QsCisgIHUzMiBjcGJDbnQsCisgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAorICB1MzIgbmFsSHJkQnBQcmVzZW50RmxhZywKKyAgdTMyIHZjbEhyZEJwUHJlc2VudEZsYWcpOworCitzdGF0aWMgdTMyIERlY29kZVBpY3R1cmVUaW1pbmcoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUGljVGltaW5nX3QgKnBQaWNUaW1pbmcsCisgIHUzMiBjcGJSZW1vdmFsRGVsYXlMZW5ndGgsCisgIHUzMiBkcGJPdXRwdXREZWxheUxlbmd0aCwKKyAgdTMyIHRpbWVPZmZzZXRMZW5ndGgsCisgIHUzMiBjcGJEcGJEZWxheXNQcmVzZW50RmxhZywKKyAgdTMyIHBpY1N0cnVjdFByZXNlbnRGbGFnKTsKKworc3RhdGljIHUzMiBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVBhblNjYW5SZWN0X3QgKnBQYW5TY2FuUmVjdGFuZ2xlKTsKKworc3RhdGljIHUzMiBEZWNvZGVGaWxsZXJQYXlsb2FkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIHBheWxvYWRTaXplKTsKKworc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdCAqcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUsCisgIHUzMiBwYXlsb2FkU2l6ZSk7CisKK3N0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdCAqcFVzZXJEYXRhVW5yZWdpc3RlcmVkLAorICB1MzIgcGF5bG9hZFNpemUpOworCitzdGF0aWMgdTMyIERlY29kZVJlY292ZXJ5UG9pbnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUmVjb3ZlcnlQb2ludF90ICpwUmVjb3ZlcnlQb2ludCk7CisKK3N0YXRpYyB1MzIgRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdCAqcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLAorICB1MzIgbnVtUmVmRnJhbWVzKTsKKworc3RhdGljIHUzMiBEZWNvZGVTcGFyZVBpYygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTcGFyZVBpY190ICpwU3BhcmVQaWMsCisgIHUzMiBwaWNTaXplSW5NYXBVbml0cyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlU2NlbmVJbmZvKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVNjZW5lSW5mb190ICpwU2NlbmVJbmZvKTsKKworc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFJbmZvKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVN1YlNlcUluZm9fdCAqcFN1YlNlcUluZm8pOworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190ICpwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKTsKKworc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpRnVsbEZyYW1lRnJlZXplX3QgKnBGdWxsRnJhbWVGcmVlemUpOworCitzdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZVNuYXBzaG90KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaUZ1bGxGcmFtZVNuYXBzaG90X3QgKnBGdWxsRnJhbWVTbmFwc2hvdCk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KTsKKworc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpOworCitzdGF0aWMgdTMyIERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdCAqcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzKTsKKworc3RhdGljIHUzMiBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUmVzZXJ2ZWRTZWlNZXNzYWdlX3QgKnBSZXNlcnZlZFNlaU1lc3NhZ2UsCisgIHUzMiBwYXlsb2FkU2l6ZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZVNlaU1lc3NhZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIHNlaU1lc3NhZ2VfdCAqcFNlaU1lc3NhZ2UsCisgIHUzMiBudW1TbGljZUdyb3VwcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBwYXlsb2FkVHlwZSwgcGF5bG9hZFNpemUsIHN0YXR1czsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZWlNZXNzYWdlKTsKKworCisgICAgSDI2NFN3RGVjTWVtc2V0KHBTZWlNZXNzYWdlLCAwLCBzaXplb2Yoc2VpTWVzc2FnZV90KSk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgcGF5bG9hZFR5cGUgPSAwOworICAgICAgICB3aGlsZSgodG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KSkgPT0gMHhGRikKKyAgICAgICAgeworICAgICAgICAgICAgcGF5bG9hZFR5cGUgKz0gMjU1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcGF5bG9hZFR5cGUgKz0gdG1wOworCisgICAgICAgIHBheWxvYWRTaXplID0gMDsKKyAgICAgICAgd2hpbGUoKHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCkpID09IDB4RkYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBheWxvYWRTaXplICs9IDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBheWxvYWRTaXplICs9IHRtcDsKKworICAgICAgICBwU2VpTWVzc2FnZS0+cGF5bG9hZFR5cGUgPSBwYXlsb2FkVHlwZTsKKworICAgICAgICBzd2l0Y2ggKHBheWxvYWRUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlQnVmZmVyaW5nUGVyaW9kKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5idWZmZXJpbmdQZXJpb2QsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiQ250LAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgICAgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQaWN0dXJlVGltaW5nKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5waWNUaW1pbmcsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgICAgICAgIGRwYk91dHB1dERlbGF5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgICAgICB0aW1lT2Zmc2V0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgfHwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnID8KKyAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5waWNTdHJ1Y3RQcmVzZW50RmxhZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5wYW5TY2FuUmVjdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGaWxsZXJQYXlsb2FkKHBTdHJtRGF0YSwgcGF5bG9hZFNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNSgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+dXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSwKKyAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT51c2VyRGF0YVVucmVnaXN0ZXJlZCwKKyAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVJlY292ZXJ5UG9pbnQoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnJlY292ZXJ5UG9pbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24oCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmRlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU3BhcmVQaWMoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnNwYXJlUGljLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzICogcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1icyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTY2VuZUluZm8oCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnNjZW5lSW5mbyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU3ViU2VxSW5mbygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxSW5mbyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnN1YlNlcUNoYXJhY3RlcmlzdGljcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRnVsbEZyYW1lRnJlZXplKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5mdWxsRnJhbWVGcmVlemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE0OiAvKiBUaGlzIFNFSSBkb2VzIG5vdCBjb250YWluIGRhdGEsIHdoYXQgdG8gZG8gPz8/ICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX09LOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZ1bGxGcmFtZVNuYXBzaG90KAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5mdWxsRnJhbWVTbmFwc2hvdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgIEFTU0VSVChudW1TbGljZUdyb3Vwcyk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5tb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQsCisgICAgICAgICAgICAgICAgICBudW1TbGljZUdyb3Vwcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdHVzICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihzdGF0dXMpOworCisgICAgICAgIHdoaWxlICghaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSkgIT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB3aGlsZSAoIWgyNjRic2RJc0J5dGVBbGlnbmVkKHBTdHJtRGF0YSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoaDI2NGJzZE1vcmVSYnNwRGF0YShwU3RybURhdGEpKTsKKworICAgIHJldHVybihoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhwU3RybURhdGEpKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUJ1ZmZlcmluZ1BlcmlvZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVCdWZmZXJpbmdQZXJpb2QoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpQnVmZmVyaW5nUGVyaW9kX3QgKnBCdWZmZXJpbmdQZXJpb2QsCisgIHUzMiBjcGJDbnQsCisgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAorICB1MzIgbmFsSHJkQnBQcmVzZW50RmxhZywKKyAgdTMyIHZjbEhyZEJwUHJlc2VudEZsYWcpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBCdWZmZXJpbmdQZXJpb2QpOworICAgIEFTU0VSVChjcGJDbnQpOworICAgIEFTU0VSVChpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwQnVmZmVyaW5nUGVyaW9kLT5zZXFQYXJhbWV0ZXJTZXRJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwQnVmZmVyaW5nUGVyaW9kLT5zZXFQYXJhbWV0ZXJTZXRJZCA+IDMxKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBpZiAobmFsSHJkQnBQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGJDbnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBpZiAodG1wID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcEJ1ZmZlcmluZ1BlcmlvZC0+aW5pdGlhbENwYlJlbW92YWxEZWxheVtpXSA9IHRtcDsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5T2Zmc2V0W2ldID0gdG1wOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZjbEhyZEJwUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3BiQ250OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcEJ1ZmZlcmluZ1BlcmlvZC0+aW5pdGlhbENwYlJlbW92YWxEZWxheVtpXSA9IHRtcDsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5T2Zmc2V0W2ldID0gdG1wOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVQaWN0dXJlVGltaW5nCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVBpY3R1cmVUaW1pbmcoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUGljVGltaW5nX3QgKnBQaWNUaW1pbmcsCisgIHUzMiBjcGJSZW1vdmFsRGVsYXlMZW5ndGgsCisgIHUzMiBkcGJPdXRwdXREZWxheUxlbmd0aCwKKyAgdTMyIHRpbWVPZmZzZXRMZW5ndGgsCisgIHUzMiBjcGJEcGJEZWxheXNQcmVzZW50RmxhZywKKyAgdTMyIHBpY1N0cnVjdFByZXNlbnRGbGFnKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGk7CisgICAgaTMyIGl0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUGljVGltaW5nKTsKKworCisgICAgaWYgKGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBjcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBQaWNUaW1pbmctPmNwYlJlbW92YWxEZWxheSA9IHRtcDsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGRwYk91dHB1dERlbGF5TGVuZ3RoKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwUGljVGltaW5nLT5kcGJPdXRwdXREZWxheSA9IHRtcDsKKyAgICB9CisKKyAgICBpZiAocGljU3RydWN0UHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDQpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIGlmICh0bXAgPiA4KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwUGljVGltaW5nLT5waWNTdHJ1Y3QgPSB0bXA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNsb2NrVFNbcFBpY1RpbWluZy0+cGljU3RydWN0XTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBQaWNUaW1pbmctPmNsb2NrVGltZVN0YW1wRmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+Y2xvY2tUaW1lU3RhbXBGbGFnW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMik7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+Y3RUeXBlW2ldID0gdG1wOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5udWl0RmllbGRCYXNlZEZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5jb3VudGluZ1R5cGVbaV0gPSB0bXA7CisKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmZ1bGxUaW1lU3RhbXBGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmRpc2NvbnRpbnVpdHlGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmNudERyb3BwZWRGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm5GcmFtZXNbaV0gPSB0bXA7CisKKyAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+ZnVsbFRpbWVTdGFtcEZsYWdbaV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+c2Vjb25kc1ZhbHVlW2ldID0gdG1wOworCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5taW51dGVzVmFsdWVbaV0gPSB0bXA7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gMjMpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmhvdXJzVmFsdWVbaV0gPSB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+c2Vjb25kc0ZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+c2Vjb25kc0ZsYWdbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnNlY29uZHNWYWx1ZVtpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5taW51dGVzRmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+bWludXRlc0ZsYWdbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5taW51dGVzVmFsdWVbaV0gPSB0bXA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmhvdXJzRmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPmhvdXJzRmxhZ1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDIzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5ob3Vyc1ZhbHVlW2ldID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGltZU9mZnNldExlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgdGltZU9mZnNldExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgaXRtcCA9IChpMzIpdG1wOworICAgICAgICAgICAgICAgICAgICAvKiBmb2xsb3dpbmcgImNvbnZlcnRzIiB0aW1lT2Zmc2V0TGVuZ3RoLWJpdCBzaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICogaW50ZWdlciBpbnRvIGkzMiAqLworICAgICAgICAgICAgICAgICAgICAvKmxpbnQgLXNhdmUgLWU3MDEgLWU3MDIgKi8KKyAgICAgICAgICAgICAgICAgICAgaXRtcCA8PD0gKDMyIC0gdGltZU9mZnNldExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGl0bXAgPj49ICgzMiAtIHRpbWVPZmZzZXRMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAvKmxpbnQgLXJlc3RvcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+dGltZU9mZnNldFtpXSA9IGl0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT50aW1lT2Zmc2V0W2ldID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUGFuU2NhblJlY3RhbmdsZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVBhblNjYW5SZWN0X3QgKnBQYW5TY2FuUmVjdGFuZ2xlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUGFuU2NhblJlY3RhbmdsZSk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0Q2FuY2VsRmxhZyA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAoIXBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdENhbmNlbEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCA+IDIpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250Kys7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0TGVmdE9mZnNldFtpXSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSaWdodE9mZnNldFtpXSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RUb3BPZmZzZXRbaV0pOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0Qm90dG9tT2Zmc2V0W2ldKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB9CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJlcGV0aXRpb25QZXJpb2QpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZCA+IDE2Mzg0KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBpZiAocFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQgPiAxICYmCisgICAgICAgICAgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZCA+IDEpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlRmlsbGVyUGF5bG9hZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVGaWxsZXJQYXlsb2FkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIHBheWxvYWRTaXplKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisKKworICAgIGlmIChwYXlsb2FkU2l6ZSkKKyAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCA4ICogcGF5bG9hZFNpemUpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1X3QgKnBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LAorICB1MzIgcGF5bG9hZFNpemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgajsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1KTsKKyAgICBBU1NFUlQocGF5bG9hZFNpemUpOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVDb3VudHJ5Q29kZSA9IHRtcDsKKworICAgIGlmIChwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlICE9IDB4RkYpCisgICAgICAgIGkgPSAxOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVDb3VudHJ5Q29kZUV4dGVuc2lvbkJ5dGUgPSB0bXA7CisgICAgICAgIGkgPSAyOworICAgIH0KKworICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLworICAgIEFMTE9DQVRFKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1UGF5bG9hZEJ5dGUscGF5bG9hZFNpemUtaSx1OCk7CisgICAgcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPm51bVBheWxvYWRCeXRlcyA9IHBheWxvYWRTaXplIC0gaTsKKyAgICBpZiAocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVQYXlsb2FkQnl0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgaiA9IDA7CisgICAgZG8KKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVQYXlsb2FkQnl0ZVtqXSA9ICh1OCl0bXA7CisgICAgICAgIGkrKzsKKyAgICAgICAgaisrOworICAgIH0gd2hpbGUgKGkgPCBwYXlsb2FkU2l6ZSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3QgKnBVc2VyRGF0YVVucmVnaXN0ZXJlZCwKKyAgdTMyIHBheWxvYWRTaXplKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwVXNlckRhdGFVbnJlZ2lzdGVyZWQpOworCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgcFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51dWlkSXNvSWVjMTE1NzhbaV0gPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzIpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCisgICAgQUxMT0NBVEUocFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51c2VyRGF0YVBheWxvYWRCeXRlLCBwYXlsb2FkU2l6ZSAtIDE2LCB1OCk7CisgICAgaWYgKHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+dXNlckRhdGFQYXlsb2FkQnl0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgcFVzZXJEYXRhVW5yZWdpc3RlcmVkLT5udW1QYXlsb2FkQnl0ZXMgPSBwYXlsb2FkU2l6ZSAtIDE2OworCisgICAgZm9yIChpID0gMDsgaSA8IHBheWxvYWRTaXplIC0gMTY7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51c2VyRGF0YVBheWxvYWRCeXRlW2ldID0gKHU4KXRtcDsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVJlY292ZXJ5UG9pbnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlUmVjb3ZlcnlQb2ludCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlSZWNvdmVyeVBvaW50X3QgKnBSZWNvdmVyeVBvaW50KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUmVjb3ZlcnlQb2ludCk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwUmVjb3ZlcnlQb2ludC0+cmVjb3ZlcnlGcmFtZUNudCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUmVjb3ZlcnlQb2ludC0+ZXhhY3RNYXRjaEZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUmVjb3ZlcnlQb2ludC0+YnJva2VuTGlua0ZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBpZiAodG1wID4gMikKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBSZWNvdmVyeVBvaW50LT5jaGFuZ2luZ1NsaWNlR3JvdXBJZGMgPSB0bXA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uX3QgKnBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbiwKKyAgdTMyIG51bVJlZkZyYW1lcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uKTsKKworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24tPm9yaWdpbmFsSWRyRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbi0+b3JpZ2luYWxGcmFtZU51bSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogZnJhbWVfbWJzX29ubHlfZmxhZyBhc3N1bWVkIGFsd2F5cyB0cnVlIHNvIHNvbWUgZmllbGQgcmVsYXRlZCBzeW50YXgKKyAgICAgKiBlbGVtZW50cyBhcmUgc2tpcHBlZCwgc2VlIEguMjY0IHN0YW5kYXJkICovCisgICAgdG1wID0gaDI2NGJzZERlY1JlZlBpY01hcmtpbmcocFN0cm1EYXRhLAorICAgICAgJnBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbi0+ZGVjUmVmUGljTWFya2luZywgTkFMX1NFSSwgbnVtUmVmRnJhbWVzKTsKKworICAgIHJldHVybih0bXApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlU3BhcmVQaWMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlU3BhcmVQaWMoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3BhcmVQaWNfdCAqcFNwYXJlUGljLAorICB1MzIgcGljU2l6ZUluTWFwVW5pdHMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgaiwgbWFwVW5pdENudDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTcGFyZVBpYyk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwU3BhcmVQaWMtPnRhcmdldEZyYW1lTnVtKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTcGFyZVBpYy0+c3BhcmVGaWVsZEZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgIC8qIGRvIG5vdCBhY2NlcHQgZmllbGRzICovCisgICAgaWYgKHBTcGFyZVBpYy0+c3BhcmVGaWVsZEZsYWcpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZwU3BhcmVQaWMtPm51bVNwYXJlUGljcyk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzKys7CisgICAgaWYgKHBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzID4gTUFYX05VTV9TUEFSRV9QSUNTKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNwYXJlUGljLT5udW1TcGFyZVBpY3M7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBTcGFyZVBpYy0+ZGVsdGFTcGFyZUZyYW1lTnVtW2ldKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTcGFyZVBpYy0+c3BhcmVBcmVhSWRjW2ldKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBTcGFyZVBpYy0+c3BhcmVBcmVhSWRjW2ldID4gMikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCisgICAgICAgICAgICBBTExPQ0FURShwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0sIHBpY1NpemVJbk1hcFVuaXRzLCB1MzIpOworICAgICAgICAgICAgaWYgKHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgICAgICAgICBwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0gPSBOVUxMOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGljU2l6ZUluTWFwVW5pdHM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXVtqXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBTcGFyZVBpYy0+c3BhcmVBcmVhSWRjW2ldID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLworICAgICAgICAgICAgQUxMT0NBVEUocFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldLCBwaWNTaXplSW5NYXBVbml0cywgdTMyKTsKKyAgICAgICAgICAgIGlmIChwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgICAgICAgICAgcFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldID0gTlVMTDsKKworICAgICAgICAgICAgZm9yIChqID0gMCwgbWFwVW5pdENudCA9IDA7IG1hcFVuaXRDbnQgPCBwaWNTaXplSW5NYXBVbml0czsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldW2pdKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgbWFwVW5pdENudCArPSBwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV1bal0gKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogc2V0IHJlc3QgdG8gbnVsbCAqLworICAgIGZvciAoaSA9IHBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzOyBpIDwgTUFYX05VTV9TUEFSRV9QSUNTOyBpKyspCisgICAgeworICAgICAgICBwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0gPSBOVUxMOworICAgICAgICBwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0gPSBOVUxMOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlU2NlbmVJbmZvCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVNjZW5lSW5mbygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTY2VuZUluZm9fdCAqcFNjZW5lSW5mbykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNjZW5lSW5mbyk7CisKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFNjZW5lSW5mby0+c2NlbmVJbmZvUHJlc2VudEZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBTY2VuZUluZm8tPnNjZW5lSW5mb1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTY2VuZUluZm8tPnNjZW5lSWQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBTY2VuZUluZm8tPnNjZW5lVHJhbnNpdGlvblR5cGUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSA+IDYpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgaWYgKHBTY2VuZUluZm8tPnNjZW5lVHJhbnNpdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICZwU2NlbmVJbmZvLT5zZWNvbmRTY2VuZUlkKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVN1YlNlcUluZm8KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFJbmZvKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVN1YlNlcUluZm9fdCAqcFN1YlNlcUluZm8pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdWJTZXFJbmZvKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBTdWJTZXFJbmZvLT5zdWJTZXFMYXllck51bSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU3ViU2VxSW5mby0+c3ViU2VxTGF5ZXJOdW0gPiAyNTUpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZwU3ViU2VxSW5mby0+c3ViU2VxSWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFN1YlNlcUluZm8tPnN1YlNlcUlkID4gNjU1MzUpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFN1YlNlcUluZm8tPmZpcnN0UmVmUGljRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTdWJTZXFJbmZvLT5sZWFkaW5nTm9uUmVmUGljRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTdWJTZXFJbmZvLT5sYXN0UGljRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTdWJTZXFJbmZvLT5zdWJTZXFGcmFtZU51bUZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBTdWJTZXFJbmZvLT5zdWJTZXFGcmFtZU51bUZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTdWJTZXFJbmZvLT5zdWJTZXFGcmFtZU51bSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljc190ICpwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcyk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5udW1TdWJTZXFMYXllcnMpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVycysrOworICAgIGlmIChwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVycyA+IE1BWF9OVU1fU1VCX1NFUV9MQVlFUlMpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVyczsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPmFjY3VyYXRlU3RhdGlzdGljc0ZsYWdbaV0gPQorICAgICAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VCaXRSYXRlW2ldID0gdG1wOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUZyYW1lUmF0ZVtpXSA9IHRtcDsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUxheWVyTnVtKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUxheWVyTnVtID4gTUFYX05VTV9TVUJfU0VRX0xBWUVSUy0xKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxSWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxSWQgPiA2NTUzNSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5kdXJhdGlvbkZsYWcgPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+ZHVyYXRpb25GbGFnKQorICAgIHsKKyAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxRHVyYXRpb24gPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzIpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlUmF0ZUZsYWcgPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZVJhdGVGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hY2N1cmF0ZVN0YXRpc3RpY3NGbGFnID0KKyAgICAgICAgICAgIHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUJpdFJhdGUgPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUZyYW1lUmF0ZSA9IHRtcDsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPm51bVJlZmVyZW5jZWRTdWJzZXFzKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPm51bVJlZmVyZW5jZWRTdWJzZXFzID4gTUFYX05VTV9TVUJfU0VRX0xBWUVSUy0xKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXM7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcUxheWVyTnVtW2ldKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5yZWZTdWJTZXFJZFtpXSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5yZWZTdWJTZXFEaXJlY3Rpb25baV0gPSB0bXA7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVGdWxsRnJhbWVGcmVlemUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lRnJlZXplKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaUZ1bGxGcmFtZUZyZWV6ZV90ICpwRnVsbEZyYW1lRnJlZXplKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwRnVsbEZyYW1lRnJlZXplKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwRnVsbEZyYW1lRnJlZXplLT5mdWxsRnJhbWVGcmVlemVSZXBldGl0aW9uUGVyaW9kKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBGdWxsRnJhbWVGcmVlemUtPmZ1bGxGcmFtZUZyZWV6ZVJlcGV0aXRpb25QZXJpb2QgPiAxNjM4NCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlGdWxsRnJhbWVTbmFwc2hvdF90ICpwRnVsbEZyYW1lU25hcHNob3QpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBGdWxsRnJhbWVTbmFwc2hvdCk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwRnVsbEZyYW1lU25hcHNob3QtPnNuYXBTaG90SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydC0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydC0+bnVtUmVmaW5lbWVudFN0ZXBzKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydC0+bnVtUmVmaW5lbWVudFN0ZXBzKys7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQtPnByb2dyZXNzaXZlUmVmaW5lbWVudElkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3QgKnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQsCisgIHUzMiBudW1TbGljZUdyb3VwcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KTsKKyAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMgPCBNQVhfTlVNX1NMSUNFX0dST1VQUyk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQrKzsKKyAgICBpZiAocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldCA+IG51bVNsaWNlR3JvdXBzKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldDsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLAorICAgICAgICAgICAgY2VpbExvZzJOdW1TbGljZUdyb3Vwc1tudW1TbGljZUdyb3Vwc10pOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnNsaWNlR3JvdXBJZFtpXSA9IHRtcDsKKyAgICAgICAgaWYgKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnNsaWNlR3JvdXBJZFtpXSA+CisgICAgICAgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldC0xKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+ZXhhY3RTYW1wbGVWYWx1ZU1hdGNoRmxhZyA9CisgICAgICAgIHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0RmxhZyA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5wYW5TY2FuUmVjdEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5wYW5TY2FuUmVjdElkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVJlc2VydmVkU2VpTWVzc2FnZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUmVzZXJ2ZWRTZWlNZXNzYWdlX3QgKnBSZXNlcnZlZFNlaU1lc3NhZ2UsCisgIHUzMiBwYXlsb2FkU2l6ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFJlc2VydmVkU2VpTWVzc2FnZSk7CisKKworICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLworICAgIEFMTE9DQVRFKHBSZXNlcnZlZFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZVBheWxvYWRCeXRlLHBheWxvYWRTaXplLHU4KTsKKyAgICBpZiAocFJlc2VydmVkU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKworICAgIHBSZXNlcnZlZFNlaU1lc3NhZ2UtPm51bVBheWxvYWRCeXRlcyA9IHBheWxvYWRTaXplOworCisgICAgZm9yIChpID0gMDsgaSA8IHBheWxvYWRTaXplOyBpKyspCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsOCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFJlc2VydmVkU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGVbaV0gPSAodTgpdG1wOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZmU1NDNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1NFSV9ICisjZGVmaW5lIEgyNjRTV0RFQ19TRUlfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTUFYX1BBTl9TQ0FOX0NOVCAzMgorI2RlZmluZSBNQVhfTlVNX1NQQVJFX1BJQ1MgMTYKKyNkZWZpbmUgTUFYX05VTV9DTE9DS19UUyAzCisjZGVmaW5lIE1BWF9OVU1fU1VCX1NFUV9MQVlFUlMgMjU2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgc2VxUGFyYW1ldGVyU2V0SWQ7CisgICAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlbTUFYX0NQQl9DTlRdOworICAgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5T2Zmc2V0W01BWF9DUEJfQ05UXTsKK30gc2VpQnVmZmVyaW5nUGVyaW9kX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGNwYlJlbW92YWxEZWxheTsKKyAgICB1MzIgZHBiT3V0cHV0RGVsYXk7CisgICAgdTMyIHBpY1N0cnVjdDsKKyAgICB1MzIgY2xvY2tUaW1lU3RhbXBGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBjbG9ja1RpbWVTdGFtcFtNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgY3RUeXBlW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBudWl0RmllbGRCYXNlZEZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGNvdW50aW5nVHlwZVtNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgZnVsbFRpbWVTdGFtcEZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGRpc2NvbnRpbnVpdHlGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBjbnREcm9wcGVkRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgbkZyYW1lc1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgc2Vjb25kc0ZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIHNlY29uZHNWYWx1ZVtNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgbWludXRlc0ZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIG1pbnV0ZXNWYWx1ZVtNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgaG91cnNGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBob3Vyc1ZhbHVlW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIGkzMiB0aW1lT2Zmc2V0W01BWF9OVU1fQ0xPQ0tfVFNdOworfSBzZWlQaWNUaW1pbmdfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcGFuU2NhblJlY3RJZDsKKyAgICB1MzIgcGFuU2NhblJlY3RDYW5jZWxGbGFnOworICAgIHUzMiBwYW5TY2FuQ250OworICAgIGkzMiBwYW5TY2FuUmVjdExlZnRPZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07CisgICAgaTMyIHBhblNjYW5SZWN0UmlnaHRPZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07CisgICAgaTMyIHBhblNjYW5SZWN0VG9wT2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOworICAgIGkzMiBwYW5TY2FuUmVjdEJvdHRvbU9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKKyAgICB1MzIgcGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kOworfSBzZWlQYW5TY2FuUmVjdF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBpdHVUVDM1Q291bnRyeUNvZGU7CisgICAgdTMyIGl0dVRUMzVDb3VudHJ5Q29kZUV4dGVuc2lvbkJ5dGU7CisgICAgdTggKml0dVRUMzVQYXlsb2FkQnl0ZTsKKyAgICB1MzIgbnVtUGF5bG9hZEJ5dGVzOworfSBzZWlVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHV1aWRJc29JZWMxMTU3OFs0XTsKKyAgICB1OCAqdXNlckRhdGFQYXlsb2FkQnl0ZTsKKyAgICB1MzIgbnVtUGF5bG9hZEJ5dGVzOworfSBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiByZWNvdmVyeUZyYW1lQ250OworICAgIHUzMiBleGFjdE1hdGNoRmxhZzsKKyAgICB1MzIgYnJva2VuTGlua0ZsYWc7CisgICAgdTMyIGNoYW5naW5nU2xpY2VHcm91cElkYzsKK30gc2VpUmVjb3ZlcnlQb2ludF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBvcmlnaW5hbElkckZsYWc7CisgICAgdTMyIG9yaWdpbmFsRnJhbWVOdW07CisgICAgZGVjUmVmUGljTWFya2luZ190IGRlY1JlZlBpY01hcmtpbmc7Cit9IHNlaURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHRhcmdldEZyYW1lTnVtOworICAgIHUzMiBzcGFyZUZpZWxkRmxhZzsKKyAgICB1MzIgdGFyZ2V0Qm90dG9tRmllbGRGbGFnOworICAgIHUzMiBudW1TcGFyZVBpY3M7CisgICAgdTMyIGRlbHRhU3BhcmVGcmFtZU51bVtNQVhfTlVNX1NQQVJFX1BJQ1NdOworICAgIHUzMiBzcGFyZUJvdHRvbUZpZWxkRmxhZ1tNQVhfTlVNX1NQQVJFX1BJQ1NdOworICAgIHUzMiBzcGFyZUFyZWFJZGNbTUFYX05VTV9TUEFSRV9QSUNTXTsKKyAgICB1MzIgKnNwYXJlVW5pdEZsYWdbTUFYX05VTV9TUEFSRV9QSUNTXTsKKyAgICB1MzIgKnplcm9SdW5MZW5ndGhbTUFYX05VTV9TUEFSRV9QSUNTXTsKK30gc2VpU3BhcmVQaWNfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgc2NlbmVJbmZvUHJlc2VudEZsYWc7CisgICAgdTMyIHNjZW5lSWQ7CisgICAgdTMyIHNjZW5lVHJhbnNpdGlvblR5cGU7CisgICAgdTMyIHNlY29uZFNjZW5lSWQ7Cit9IHNlaVNjZW5lSW5mb190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBzdWJTZXFMYXllck51bTsKKyAgICB1MzIgc3ViU2VxSWQ7CisgICAgdTMyIGZpcnN0UmVmUGljRmxhZzsKKyAgICB1MzIgbGVhZGluZ05vblJlZlBpY0ZsYWc7CisgICAgdTMyIGxhc3RQaWNGbGFnOworICAgIHUzMiBzdWJTZXFGcmFtZU51bUZsYWc7CisgICAgdTMyIHN1YlNlcUZyYW1lTnVtOworfSBzZWlTdWJTZXFJbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIG51bVN1YlNlcUxheWVyczsKKyAgICB1MzIgYWNjdXJhdGVTdGF0aXN0aWNzRmxhZ1tNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKKyAgICB1MzIgYXZlcmFnZUJpdFJhdGVbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107CisgICAgdTMyIGF2ZXJhZ2VGcmFtZVJhdGVbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Cit9IHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHN1YlNlcUxheWVyTnVtOworICAgIHUzMiBzdWJTZXFJZDsKKyAgICB1MzIgZHVyYXRpb25GbGFnOworICAgIHUzMiBzdWJTZXFEdXJhdGlvbjsKKyAgICB1MzIgYXZlcmFnZVJhdGVGbGFnOworICAgIHUzMiBhY2N1cmF0ZVN0YXRpc3RpY3NGbGFnOworICAgIHUzMiBhdmVyYWdlQml0UmF0ZTsKKyAgICB1MzIgYXZlcmFnZUZyYW1lUmF0ZTsKKyAgICB1MzIgbnVtUmVmZXJlbmNlZFN1YnNlcXM7CisgICAgdTMyIHJlZlN1YlNlcUxheWVyTnVtW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOworICAgIHUzMiByZWZTdWJTZXFJZFtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKKyAgICB1MzIgcmVmU3ViU2VxRGlyZWN0aW9uW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOworfSBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgZnVsbEZyYW1lRnJlZXplUmVwZXRpdGlvblBlcmlvZDsKK30gc2VpRnVsbEZyYW1lRnJlZXplX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHNuYXBTaG90SWQ7Cit9IHNlaUZ1bGxGcmFtZVNuYXBzaG90X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHByb2dyZXNzaXZlUmVmaW5lbWVudElkOworICAgIHUzMiBudW1SZWZpbmVtZW50U3RlcHM7Cit9IHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwcm9ncmVzc2l2ZVJlZmluZW1lbnRJZDsKK30gc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBudW1TbGljZUdyb3Vwc0luU2V0OworICAgIHUzMiBzbGljZUdyb3VwSWRbTUFYX05VTV9TTElDRV9HUk9VUFNdOworICAgIHUzMiBleGFjdFNhbXBsZVZhbHVlTWF0Y2hGbGFnOworICAgIHUzMiBwYW5TY2FuUmVjdEZsYWc7CisgICAgdTMyIHBhblNjYW5SZWN0SWQ7Cit9IHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHU4ICpyZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZTsKKyAgICB1MzIgbnVtUGF5bG9hZEJ5dGVzOworfSBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcGF5bG9hZFR5cGU7CisgICAgc2VpQnVmZmVyaW5nUGVyaW9kX3QgYnVmZmVyaW5nUGVyaW9kOworICAgIHNlaVBpY1RpbWluZ190IHBpY1RpbWluZzsKKyAgICBzZWlQYW5TY2FuUmVjdF90IHBhblNjYW5SZWN0OworICAgIHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdCB1c2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1OworICAgIHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3QgdXNlckRhdGFVbnJlZ2lzdGVyZWQ7CisgICAgc2VpUmVjb3ZlcnlQb2ludF90IHJlY292ZXJ5UG9pbnQ7CisgICAgc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdCBkZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbjsKKyAgICBzZWlTcGFyZVBpY190IHNwYXJlUGljOworICAgIHNlaVNjZW5lSW5mb190IHNjZW5lSW5mbzsKKyAgICBzZWlTdWJTZXFJbmZvX3Qgc3ViU2VxSW5mbzsKKyAgICBzZWlTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljc190IHN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzOworICAgIHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190IHN1YlNlcUNoYXJhY3RlcmlzdGljczsKKyAgICBzZWlGdWxsRnJhbWVGcmVlemVfdCBmdWxsRnJhbWVGcmVlemU7CisgICAgc2VpRnVsbEZyYW1lU25hcHNob3RfdCBmdWxsRnJhbWVTbmFwc2hvdDsKKyAgICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnRfdCBwcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQ7CisgICAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90IHByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQ7CisgICAgc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3QgbW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0OworICAgIHNlaVJlc2VydmVkU2VpTWVzc2FnZV90IHJlc2VydmVkU2VpTWVzc2FnZTsKK30gc2VpTWVzc2FnZV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIHNlaU1lc3NhZ2VfdCAqcFNlaU1lc3NhZ2UsCisgIHUzMiBudW1TbGljZUdyb3Vwcyk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NFSV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTA1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jCkBAIC0wLDAgKzEsNTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0CisgICAgICAgICAgR2V0RHBiU2l6ZQorICAgICAgICAgIGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3Z1aS5oIgorI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGVudW1lcmF0aW9uIHRvIGluZGljYXRlIGludmFsaWQgcmV0dXJuIHZhbHVlIGZyb20gdGhlIEdldERwYlNpemUgZnVuY3Rpb24gKi8KK2VudW0ge0lOVkFMSURfRFBCX1NJWkUgPSAweDdGRkZGRkZGfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIEdldERwYlNpemUodTMyIHBpY1NpemVJbk1icywgdTMyIGxldmVsSWRjKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVTZXFQYXJhbVNldAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgICAgIEZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yIG9mZnNldEZvclJlZkZyYW1lIGFycmF5IGlmCisgICAgICAgICAgICBwaWN0dXJlIG9yZGVyIGNvdW50IHR5cGUgaXMgMSBhbmQgbnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlCisgICAgICAgICAgICBpcyBncmVhdGVyIHRoYW4gemVyby4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIGRlY29kZWQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBpbnZhbGlkIGluZm9ybWF0aW9uIG9yIGVuZCBvZiBzdHJlYW0KKyAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgdmFsdWU7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworCisgICAgSDI2NFN3RGVjTWVtc2V0KHBTZXFQYXJhbVNldCwgMCwgc2l6ZW9mKHNlcVBhcmFtU2V0X3QpKTsKKworICAgIC8qIHByb2ZpbGVfaWRjICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBpZiAodG1wICE9IDY2KQorICAgIHsKKyAgICAgICAgREVCVUcoKCJOT1QgQkFTRUxJTkUgUFJPRklMRSAlZFxuIiwgdG1wKSk7CisgICAgfQorICAgIHBTZXFQYXJhbVNldC0+cHJvZmlsZUlkYyA9IHRtcDsKKworICAgIC8qIGNvbnN0cmFpbmVkX3NldDBfZmxhZyAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgLyogY29uc3RyYWluZWRfc2V0MV9mbGFnICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAvKiBjb25zdHJhaW5lZF9zZXQyX2ZsYWcgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworCisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiByZXNlcnZlZF96ZXJvXzViaXRzLCB2YWx1ZXMgb2YgdGhlc2UgYml0cyBzaGFsbCBiZSBpZ25vcmVkICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFNlcVBhcmFtU2V0LT5sZXZlbElkYyA9IHRtcDsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgPj0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUykKKyAgICB7CisgICAgICAgIEVQUklOVCgic2VxX3BhcmFtX3NldF9pZCIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICh2YWx1ZSA+IDEyKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJsb2cyX21heF9mcmFtZV9udW1fbWludXM0Iik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgLyogbWF4RnJhbWVOdW0gPSAyXihsb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCkgKi8KKyAgICBwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID0gMSA8PCAodmFsdWUrNCk7CisKKyAgICAvKiB2YWxpZCBQT0MgdHlwZXMgYXJlIDAsIDEgYW5kIDIgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAodmFsdWUgPiAyKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJwaWNfb3JkZXJfY250X3R5cGUiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICBwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9IHZhbHVlOworCisgICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCisgICAgeworICAgICAgICAvKiBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHZhbHVlID4gMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgibG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0Iik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICAgICAgLyogbWF4UGljT3JkZXJDbnRMc2IgPSAyXihsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KSAqLworICAgICAgICBwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID0gMSA8PCAodmFsdWUrNCk7CisgICAgfQorICAgIGVsc2UgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JOb25SZWZQaWMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSA+IDI1NSkKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5PVEU6IFRoaXMgaGFzIHRvIGJlIGZyZWVkIHNvbWV3aGVyZSEgKi8KKyAgICAgICAgICAgIEFMTE9DQVRFKHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSwgaTMyKTsKKyAgICAgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lICsgaSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgPiBNQVhfTlVNX1JFRl9QSUNTKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJudW1fcmVmX2ZyYW1lcyIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU2VxUGFyYW1TZXQtPmdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzID0gdmFsdWUgKyAxOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1icyA9IHZhbHVlICsgMTsKKworICAgIC8qIGZyYW1lX21ic19vbmx5X2ZsYWcsIHNoYWxsIGJlIDEgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGlmICghdG1wKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJmcmFtZV9tYnNfb25seV9mbGFnIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BwaW5nRmxhZyA9ICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcHBpbmdGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcExlZnRPZmZzZXQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wVG9wT2Zmc2V0KTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgLyogY2hlY2sgdGhhdCBmcmFtZSBjcm9wcGluZyBwYXJhbXMgYXJlIHZhbGlkLCBwYXJhbWV0ZXJzIHNoYWxsCisgICAgICAgICAqIHNwZWNpZnkgbm9uLW5lZ2F0aXZlIGFyZWEgd2l0aGluIHRoZSBvcmlnaW5hbCBwaWN0dXJlICovCisgICAgICAgIGlmICggKCAoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wTGVmdE9mZnNldCA+CisgICAgICAgICAgICAgICAoIDggKiAoaTMyKXBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyAtCisgICAgICAgICAgICAgICAgICgoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQgKyAxKSApICkgfHwKKyAgICAgICAgICAgICAoIChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BUb3BPZmZzZXQgPgorICAgICAgICAgICAgICAgKCA4ICogKGkzMilwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzIC0KKyAgICAgICAgICAgICAgICAgKChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BCb3R0b21PZmZzZXQgKyAxKSApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoImZyYW1lX2Nyb3BwaW5nIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGF0IGltYWdlIGRpbWVuc2lvbnMgYW5kIGxldmVsSWRjIG1hdGNoICovCisgICAgdG1wID0gcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzICogcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1iczsKKyAgICB2YWx1ZSA9IEdldERwYlNpemUodG1wLCBwU2VxUGFyYW1TZXQtPmxldmVsSWRjKTsKKyAgICBpZiAodmFsdWUgPT0gSU5WQUxJRF9EUEJfU0laRSB8fCBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyA+IHZhbHVlKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJXQVJOSU5HISBJbnZhbGlkIERQQiBzaXplIGJhc2VkIG9uIFNQUyBMZXZlbCFcbiIpKTsKKyAgICAgICAgREVCVUcoKCJXQVJOSU5HISBVc2luZyBudW1fcmVmX2ZyYW1lcyA9JWQgZm9yIERQQiBzaXplIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzKSk7CisgICAgICAgIHZhbHVlID0gcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXM7CisgICAgfQorICAgIHBTZXFQYXJhbVNldC0+bWF4RHBiU2l6ZSA9IHZhbHVlOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIC8qIFZVSSAqLworICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIEFMTE9DQVRFKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycywgMSwgdnVpUGFyYW1ldGVyc190KTsKKyAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMocFN0cm1EYXRhLAorICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgLyogY2hlY2sgbnVtUmVvcmRlckZyYW1lcyBhbmQgbWF4RGVjRnJhbWVCdWZmZXJpbmcgKi8KKyAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+Yml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzID4KKyAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyB8fAorICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgPAorICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyB8fAorICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgPgorICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heERwYlNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzdGFuZGFyZCBzYXlzIHRoYXQgInRoZSBzZXF1ZW5jZSBzaGFsbCBub3QgcmVxdWlyZSBhIERQQiB3aXRoCisgICAgICAgICAgICAgKiBzaXplIG9mIG1vcmUgdGhhbiBtYXgoMSwgbWF4RGVjRnJhbWVCdWZmZXJpbmcpICovCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heERwYlNpemUgPQorICAgICAgICAgICAgICAgIE1BWCgxLCBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHBTdHJtRGF0YSk7CisKKyAgICAvKiBpZ25vcmUgcG9zc2libGUgZXJyb3JzIGluIHRyYWlsaW5nIGJpdHMgb2YgcGFyYW1ldGVycyBzZXRzICovCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBHZXREcGJTaXplCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBzaXplIG9mIHRoZSBEUEIgaW4gZnJhbWVzLiBTaXplIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlCisgICAgICAgICAgICBwaWN0dXJlIHNpemUgYW5kIE1heERQQiBmb3IgdGhlIHNwZWNpZmllZCBsZXZlbC4gVGhlc2UgZGV0ZXJtaW5lCisgICAgICAgICAgICBob3cgbWFueSBwaWN0dXJlcyBtYXkgZml0IGludG8gdG8gdGhlIGJ1ZmZlci4gSG93ZXZlciwgdGhlIHNpemUKKyAgICAgICAgICAgIGlzIGFsc28gbGltaXRlZCB0byBhIG1heGltdW0gb2YgMTYgZnJhbWVzIGFuZCB0aGVyZWZvcmUgZnVuY3Rpb24KKyAgICAgICAgICAgIHJldHVybnMgdGhlIG1pbmltdW0gb2YgdGhlIGRldGVybWluZWQgc2l6ZSBhbmQgMTYuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBpbiB0aGUgcGljdHVyZQorICAgICAgICAgICAgbGV2ZWxJZGMgICAgICAgIGluZGljYXRlcyB0aGUgbGV2ZWwKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBzaXplIG9mIHRoZSBEUEIgaW4gZnJhbWVzCisgICAgICAgICAgICBJTlZBTElEX0RQQl9TSVpFIHdoZW4gaW52YWxpZCBsZXZlbElkYyBzcGVjaWZpZWQgb3IgcGljU2l6ZUluTWJzCisgICAgICAgICAgICBpcyBoaWdoZXIgdGhhbiBzdXBwb3J0ZWQgYnkgdGhlIGxldmVsIGluIHF1ZXN0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBHZXREcGJTaXplKHUzMiBwaWNTaXplSW5NYnMsIHUzMiBsZXZlbElkYykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworICAgIHUzMiBtYXhQaWNTaXplSW5NYnM7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOworCisgICAgLyogdXNlIHRtcCBhcyB0aGUgc2l6ZSBvZiB0aGUgRFBCIGluIGJ5dGVzLCBjb21wdXRlcyBhcyAxMDI0ICogTWF4RFBCCisgICAgICogKGZyb20gdGFibGUgQS0xIGluIEFubmV4IEEpICovCisgICAgc3dpdGNoIChsZXZlbElkYykKKyAgICB7CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICB0bXAgPSAxNTIwNjQ7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA5OTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICB0bXAgPSAzNDU2MDA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgdG1wID0gOTEyMzg0OworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIHRtcCA9IDkxMjM4NDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICB0bXAgPSA5MTIzODQ7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgdG1wID0gMTgyNDc2ODsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDc5MjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICB0bXAgPSAzMTEwNDAwOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMTYyMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICB0bXAgPSAzMTEwNDAwOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMTYyMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICB0bXAgPSA2OTEyMDAwOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzYwMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICB0bXAgPSA3ODY0MzIwOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gNTEyMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDA6CisgICAgICAgICAgICB0bXAgPSAxMjU4MjkxMjsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDgxOTI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgdG1wID0gMTI1ODI5MTI7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA4MTkyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0MjoKKyAgICAgICAgICAgIHRtcCA9IDM0ODE2KjM4NDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDg3MDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDUwOgorICAgICAgICAgICAgLyogc3RhbmRhcmQgc2F5cyA0MjMwMTQ0MCBoZXJlLCBidXQgY29ycmlnZW5kdW0gImNvcnJlY3RzIiB0aGlzIHRvCisgICAgICAgICAgICAgKiA0MjM5MzYwMCAqLworICAgICAgICAgICAgdG1wID0gNDIzOTM2MDA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAyMjA4MDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICB0bXAgPSA3MDc3ODg4MDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM2ODY0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybihJTlZBTElEX0RQQl9TSVpFKTsKKyAgICB9CisKKyAgICAvKiB0aGlzIGlzIG5vdCAiY29ycmVjdCIgcmV0dXJuIHZhbHVlISBIb3dldmVyLCBpdCByZXN1bHRzIGluIGVycm9yIGluCisgICAgICogZGVjb2RpbmcgYW5kIHRoaXMgd2FzIGVhc2llc3QgcGxhY2UgdG8gY2hlY2sgcGljdHVyZSBzaXplICovCisgICAgaWYgKHBpY1NpemVJbk1icyA+IG1heFBpY1NpemVJbk1icykKKyAgICAgICAgcmV0dXJuKElOVkFMSURfRFBCX1NJWkUpOworCisgICAgdG1wIC89IChwaWNTaXplSW5NYnMqMzg0KTsKKworICAgIHJldHVybihNSU4odG1wLCAxNikpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wYXJlIHR3byBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3BzMSAgIHBvaW50ZXIgdG8gYSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0CisgICAgICAgICAgICBwU3BzMiAgIHBvaW50ZXIgdG8gYW5vdGhlciBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIDAgICAgICAgc2VxdWVuY2UgcGFyYW1ldGVyIHNldHMgYXJlIGVxdWFsCisgICAgICAgICAgICAxICAgICAgIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMoc2VxUGFyYW1TZXRfdCAqcFNwczEsIHNlcVBhcmFtU2V0X3QgKnBTcHMyKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFNwczEpOworICAgIEFTU0VSVChwU3BzMik7CisKKyAgICAvKiBmaXJzdCBjb21wYXJlIHBhcmFtZXRlcnMgd2hvc2UgZXhpc3RlbmNlIGRvZXMgbm90IGRlcGVuZCBvbiBvdGhlcgorICAgICAqIHBhcmFtZXRlcnMgYW5kIG9ubHkgY29tcGFyZSB0aGUgcmVzdCBvZiB0aGUgcGFyYW1zIGlmIHRoZXNlIGFyZSBlcXVhbCAqLworICAgIGlmIChwU3BzMS0+cHJvZmlsZUlkYyAgICAgICAgPT0gcFNwczItPnByb2ZpbGVJZGMgJiYKKyAgICAgICAgcFNwczEtPmxldmVsSWRjICAgICAgICAgID09IHBTcHMyLT5sZXZlbElkYyAmJgorICAgICAgICBwU3BzMS0+bWF4RnJhbWVOdW0gICAgICAgPT0gcFNwczItPm1heEZyYW1lTnVtICYmCisgICAgICAgIHBTcHMxLT5waWNPcmRlckNudFR5cGUgICA9PSBwU3BzMi0+cGljT3JkZXJDbnRUeXBlICYmCisgICAgICAgIHBTcHMxLT5udW1SZWZGcmFtZXMgICAgICA9PSBwU3BzMi0+bnVtUmVmRnJhbWVzICYmCisgICAgICAgIHBTcHMxLT5nYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcgPT0KKyAgICAgICAgICAgIHBTcHMyLT5nYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcgJiYKKyAgICAgICAgcFNwczEtPnBpY1dpZHRoSW5NYnMgICAgID09IHBTcHMyLT5waWNXaWR0aEluTWJzICYmCisgICAgICAgIHBTcHMxLT5waWNIZWlnaHRJbk1icyAgICA9PSBwU3BzMi0+cGljSGVpZ2h0SW5NYnMgJiYKKyAgICAgICAgcFNwczEtPmZyYW1lQ3JvcHBpbmdGbGFnID09IHBTcHMyLT5mcmFtZUNyb3BwaW5nRmxhZyAmJgorICAgICAgICBwU3BzMS0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnID09IHBTcHMyLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICBpZiAocFNwczEtPnBpY09yZGVyQ250VHlwZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFNwczEtPm1heFBpY09yZGVyQ250THNiICE9IHBTcHMyLT5tYXhQaWNPcmRlckNudExzYikKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwU3BzMS0+cGljT3JkZXJDbnRUeXBlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwU3BzMS0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnICE9CisgICAgICAgICAgICAgICAgICAgIHBTcHMyLT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgfHwKKyAgICAgICAgICAgICAgICBwU3BzMS0+b2Zmc2V0Rm9yTm9uUmVmUGljICE9IHBTcHMyLT5vZmZzZXRGb3JOb25SZWZQaWMgfHwKKyAgICAgICAgICAgICAgICBwU3BzMS0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCAhPQorICAgICAgICAgICAgICAgICAgICBwU3BzMi0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCB8fAorICAgICAgICAgICAgICAgIHBTcHMxLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUgIT0KKyAgICAgICAgICAgICAgICAgICAgcFNwczItPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNwczEtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAocFNwczEtPm9mZnNldEZvclJlZkZyYW1lW2ldICE9CisgICAgICAgICAgICAgICAgICAgICAgICBwU3BzMi0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBTcHMxLT5mcmFtZUNyb3BwaW5nRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTcHMxLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ICAgIT0gcFNwczItPmZyYW1lQ3JvcExlZnRPZmZzZXQgfHwKKyAgICAgICAgICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQgICE9IHBTcHMyLT5mcmFtZUNyb3BSaWdodE9mZnNldCB8fAorICAgICAgICAgICAgICAgIHBTcHMxLT5mcmFtZUNyb3BUb3BPZmZzZXQgICAgIT0gcFNwczItPmZyYW1lQ3JvcFRvcE9mZnNldCB8fAorICAgICAgICAgICAgICAgIHBTcHMxLT5mcmFtZUNyb3BCb3R0b21PZmZzZXQgIT0gcFNwczItPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMThkZjk0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1NFUV9QQVJBTV9TRVRfSAorI2RlZmluZSBIMjY0U1dERUNfU0VRX1BBUkFNX1NFVF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogc3RydWN0dXJlIHRvIHN0b3JlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24gZGVjb2RlZCBmcm9tIHRoZQorICogc3RyZWFtICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwcm9maWxlSWRjOworICAgIHUzMiBsZXZlbElkYzsKKyAgICB1MzIgc2VxUGFyYW1ldGVyU2V0SWQ7CisgICAgdTMyIG1heEZyYW1lTnVtOworICAgIHUzMiBwaWNPcmRlckNudFR5cGU7CisgICAgdTMyIG1heFBpY09yZGVyQ250THNiOworICAgIHUzMiBkZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWc7CisgICAgaTMyIG9mZnNldEZvck5vblJlZlBpYzsKKyAgICBpMzIgb2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZDsKKyAgICB1MzIgbnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOworICAgIGkzMiAqb2Zmc2V0Rm9yUmVmRnJhbWU7CisgICAgdTMyIG51bVJlZkZyYW1lczsKKyAgICB1MzIgZ2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnOworICAgIHUzMiBwaWNXaWR0aEluTWJzOworICAgIHUzMiBwaWNIZWlnaHRJbk1iczsKKyAgICB1MzIgZnJhbWVDcm9wcGluZ0ZsYWc7CisgICAgdTMyIGZyYW1lQ3JvcExlZnRPZmZzZXQ7CisgICAgdTMyIGZyYW1lQ3JvcFJpZ2h0T2Zmc2V0OworICAgIHUzMiBmcmFtZUNyb3BUb3BPZmZzZXQ7CisgICAgdTMyIGZyYW1lQ3JvcEJvdHRvbU9mZnNldDsKKyAgICB1MzIgdnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnOworICAgIHZ1aVBhcmFtZXRlcnNfdCAqdnVpUGFyYW1ldGVyczsKKyAgICB1MzIgbWF4RHBiU2l6ZTsKK30gc2VxUGFyYW1TZXRfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpOworCit1MzIgaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMoc2VxUGFyYW1TZXRfdCAqcFNwczEsIHNlcVBhcmFtU2V0X3QgKnBTcHMyKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0VRX1BBUkFNX1NFVF9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyODhkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlRGF0YQorICAgICAgICAgIFNldE1iUGFyYW1zCisgICAgICAgICAgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZGF0YS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgU2V0TWJQYXJhbXMobWJTdG9yYWdlX3QgKnBNYiwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlLCB1MzIgc2xpY2VJZCwKKyAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMSAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNsaWNlRGF0YQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgb25lIHNsaWNlLiBGdW5jdGlvbiBkZWNvZGVzIHN0cmVhbSBkYXRhLCBpLmUuIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBhbmQgcG9zc2libGUgc2tpcF9ydW4gZmllbGRzLiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayBmdW5jdGlvbiBpcworICAgICAgICAgICAgY2FsbGVkIHRvIGhhbmRsZSBhbGwgb3RoZXIgbWFjcm9ibG9jayByZWxhdGVkIHByb2Nlc3NpbmcuCisgICAgICAgICAgICBNYWNyb2Jsb2NrIHRvIHNsaWNlIGdyb3VwIG1hcHBpbmcgaXMgY29uc2lkZXJlZCB3aGVuIG5leHQKKyAgICAgICAgICAgIG1hY3JvYmxvY2sgdG8gcHJvY2VzcyBpcyBkZXRlcm1pbmVkIChoMjY0YnNkTmV4dE1iQWRkcmVzcyBmdW5jdGlvbikKKyAgICAgICAgICAgIG1hcAorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGN1cnJJbWFnZSAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgcHJvY2Vzc2VkIHBpY3R1cmUsIG5lZWRlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYSBwcmVkaWN0aW9uIG9mIHRoZSBtYWNyb2Jsb2NrcworICAgICAgICAgICAgcFNsaWNlSGVhZGVyICAgIHBvaW50ZXIgdG8gc2xpY2UgaGVhZGVyIG9mIHRoZSBjdXJyZW50IHNsaWNlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGN1cnJJbWFnZSAgICAgICBwcm9jZXNzZWQgbWFjcm9ibG9ja3MgYXJlIHdyaXR0ZW4gdG8gY3VycmVudCBpbWFnZQorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIG1iU3RvcmFnZSBzdHJ1Y3R1cmUgb2YgZWFjaCBwcm9jZXNzZWQgbWFjcm9ibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVwZGF0ZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTbGljZURhdGEoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdG9yYWdlX3QgKnBTdG9yYWdlLAorICAgIGltYWdlX3QgKmN1cnJJbWFnZSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHU4IG1iRGF0YVszODQgKyAxNSArIDMyXTsKKyAgICB1OCAqZGF0YTsKKyAgICB1MzIgdG1wOworICAgIHUzMiBza2lwUnVuOworICAgIHUzMiBwcmV2U2tpcHBlZDsKKyAgICB1MzIgY3Vyck1iQWRkcjsKKyAgICB1MzIgbW9yZU1iczsKKyAgICB1MzIgbWJDb3VudDsKKyAgICBpMzIgcXBZOworICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNsaWNlSGVhZGVyKTsKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworICAgIEFTU0VSVChwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyk7CisKKyAgICAvKiBlbnN1cmUgMTYtYnl0ZSBhbGlnbm1lbnQgKi8KKyAgICBkYXRhID0gKHU4KilBTElHTihtYkRhdGEsIDE2KTsKKworICAgIG1iTGF5ZXIgPSBwU3RvcmFnZS0+bWJMYXllcjsKKworICAgIGN1cnJNYkFkZHIgPSBwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlOworICAgIHNraXBSdW4gPSAwOworICAgIHByZXZTa2lwcGVkID0gSEFOVFJPX0ZBTFNFOworCisgICAgLyogaW5jcmVtZW50IHNsaWNlIGluZGV4LCB3aWxsIGJlIG9uZSBmb3IgZGVjb2Rpbmcgb2YgdGhlIGZpcnN0IHNsaWNlIG9mCisgICAgICogdGhlIHBpY3R1cmUgKi8KKyAgICBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQrKzsKKworICAgIC8qIGxhc3RNYkFkZHIgc3RvcmVzIGFkZHJlc3Mgb2YgdGhlIG1hY3JvYmxvY2sgdGhhdCB3YXMgbGFzdCBzdWNjZXNzZnVsbHkKKyAgICAgKiBkZWNvZGVkLCBuZWVkZWQgZm9yIGVycm9yIGhhbmRsaW5nICovCisgICAgcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyID0gMDsKKworICAgIG1iQ291bnQgPSAwOworICAgIC8qIGluaXRpYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgdGhlIHNsaWNlIGlzIG9idGFpbmVkIGFzIHRoZSBzdW0gb2YKKyAgICAgKiBpbml0aWFsIFFQIGZvciB0aGUgcGljdHVyZSBhbmQgc2xpY2VRcERlbHRhIGZvciB0aGUgY3VycmVudCBzbGljZSAqLworICAgIHFwWSA9IChpMzIpcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+cGljSW5pdFFwICsgcFNsaWNlSGVhZGVyLT5zbGljZVFwRGVsdGE7CisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIHByaW1hcnkgcGljdHVyZSBhbmQgYWxyZWFkeSBkZWNvZGVkIG1hY3JvYmxvY2sgLT4gZXJyb3IgKi8KKyAgICAgICAgaWYgKCFwU2xpY2VIZWFkZXItPnJlZHVuZGFudFBpY0NudCAmJiBwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJQcmltYXJ5IGFuZCBhbHJlYWR5IGRlY29kZWQiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgICAgIFNldE1iUGFyYW1zKHBTdG9yYWdlLT5tYiArIGN1cnJNYkFkZHIsIHBTbGljZUhlYWRlciwKKyAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCwgcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+Y2hyb21hUXBJbmRleE9mZnNldCk7CisKKyAgICAgICAgaWYgKCFJU19JX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwcmV2U2tpcHBlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmc2tpcFJ1bik7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIC8qIHNraXBfcnVuIHNoYWxsIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgKiBtYWNyb2Jsb2NrcyBsZWZ0ICovCisgICAgICAgICAgICAgICAgaWYgKHNraXBSdW4gPiAocFN0b3JhZ2UtPnBpY1NpemVJbk1icyAtIGN1cnJNYkFkZHIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJza2lwX3J1biIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChza2lwUnVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldlNraXBwZWQgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KCZtYkxheWVyLT5tYlByZWQsIDAsIHNpemVvZihtYlByZWRfdCkpOworICAgICAgICAgICAgICAgICAgICAvKiBtYXJrIGN1cnJlbnQgbWFjcm9ibG9jayBza2lwcGVkICovCisgICAgICAgICAgICAgICAgICAgIG1iTGF5ZXItPm1iVHlwZSA9IFBfU2tpcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2tpcFJ1bikKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoKCJTa2lwcGluZyBtYWNyb2Jsb2NrICVkXG4iLCBjdXJyTWJBZGRyKSk7CisgICAgICAgICAgICBza2lwUnVuLS07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmV2U2tpcHBlZCA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIocFN0cm1EYXRhLCBtYkxheWVyLAorICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5tYiArIGN1cnJNYkFkZHIsIHBTbGljZUhlYWRlci0+c2xpY2VUeXBlLAorICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVBSSU5UKCJtYWNyb2Jsb2NrX2xheWVyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayhwU3RvcmFnZS0+bWIgKyBjdXJyTWJBZGRyLCBtYkxheWVyLAorICAgICAgICAgICAgY3VyckltYWdlLCBwU3RvcmFnZS0+ZHBiLCAmcXBZLCBjdXJyTWJBZGRyLAorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+Y29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCBkYXRhKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgiTUFDUk9fQkxPQ0siKTsKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB9CisKKyAgICAgICAgLyogaW5jcmVtZW50IG1hY3JvYmxvY2sgY291bnQgb25seSBmb3IgbWFjcm9ibG9ja3MgdGhhdCB3ZXJlIGRlY29kZWQKKyAgICAgICAgICogZm9yIHRoZSBmaXJzdCB0aW1lIChyZWR1bmRhbnQgc2xpY2VzKSAqLworICAgICAgICBpZiAocFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQgPT0gMSkKKyAgICAgICAgICAgIG1iQ291bnQrKzsKKworICAgICAgICAvKiBrZWVwIG9uIHByb2Nlc3NpbmcgYXMgbG9uZyBhcyB0aGVyZSBpcyBzdHJlYW0gZGF0YSBsZWZ0IG9yCisgICAgICAgICAqIHByb2Nlc3Npbmcgb2YgbWFjcm9ibG9ja3MgdG8gYmUgc2tpcHBlZCBiYXNlZCBvbiB0aGUgbGFzdCBza2lwUnVuIGlzCisgICAgICAgICAqIG5vdCBmaW5pc2hlZCAqLworICAgICAgICBtb3JlTWJzID0gKGgyNjRic2RNb3JlUmJzcERhdGEocFN0cm1EYXRhKSB8fCBza2lwUnVuKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgLyogbGFzdE1iQWRkciBpcyBvbmx5IHVwZGF0ZWQgZm9yIGludHJhIHNsaWNlcyAoYWxsIG1hY3JvYmxvY2tzIG9mCisgICAgICAgICAqIGludGVyIHNsaWNlcyB3aWxsIGJlIGxvc3QgaW4gY2FzZSBvZiBhbiBlcnJvcikgKi8KKyAgICAgICAgaWYgKElTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQorICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyID0gY3Vyck1iQWRkcjsKKworICAgICAgICBjdXJyTWJBZGRyID0gaDI2NGJzZE5leHRNYkFkZHJlc3MocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsCisgICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzLCBjdXJyTWJBZGRyKTsKKyAgICAgICAgLyogZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIgYnV0IG5vIG1vcmUgbWFjcm9ibG9ja3MgZm9yIGN1cnJlbnQgc2xpY2UKKyAgICAgICAgICogZ3JvdXAgLT4gZXJyb3IgKi8KKyAgICAgICAgaWYgKG1vcmVNYnMgJiYgIWN1cnJNYkFkZHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgiTmV4dCBtYiBhZGRyZXNzIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKworICAgIH0gd2hpbGUgKG1vcmVNYnMpOworCisgICAgaWYgKChwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgKyBtYkNvdW50KSA+IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpCisgICAgeworICAgICAgICBFUFJJTlQoIk51bSBkZWNvZGVkIG1icyIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgcFN0b3JhZ2UtPnNsaWNlLT5udW1EZWNvZGVkTWJzICs9IG1iQ291bnQ7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjIgIEZ1bmN0aW9uOiBTZXRNYlBhcmFtcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBTZXQgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIHRoYXQgcmVtYWluIGNvbnN0YW50IGZvciB0aGlzIHNsaWNlCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFNsaWNlICAgICAgcG9pbnRlciB0byBjdXJyZW50IHNsaWNlIGhlYWRlcgorICAgICAgICAgICAgc2xpY2VJZCAgICAgaWQgb2YgdGhlIGN1cnJlbnQgc2xpY2UKKyAgICAgICAgICAgIGNocm9tYVFwSW5kZXhPZmZzZXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0cnVjdHVyZSB3aGljaCBpcyB1cGRhdGVkCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBTZXRNYlBhcmFtcyhtYlN0b3JhZ2VfdCAqcE1iLCBzbGljZUhlYWRlcl90ICpwU2xpY2UsIHUzMiBzbGljZUlkLAorICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKyAgICB1MzIgdG1wMTsKKyAgICBpMzIgdG1wMiwgdG1wMzsKKworLyogQ29kZSAqLworCisgICAgdG1wMSA9IHBTbGljZS0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7CisgICAgdG1wMiA9IHBTbGljZS0+c2xpY2VBbHBoYUMwT2Zmc2V0OworICAgIHRtcDMgPSBwU2xpY2UtPnNsaWNlQmV0YU9mZnNldDsKKyAgICBwTWItPnNsaWNlSWQgPSBzbGljZUlkOworICAgIHBNYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSB0bXAxOworICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QSA9IHRtcDI7CisgICAgcE1iLT5maWx0ZXJPZmZzZXRCID0gdG1wMzsKKyAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQgPSBjaHJvbWFRcEluZGV4T2Zmc2V0OworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMyAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBNYXJrIG1hY3JvYmxvY2tzIG9mIHRoZSBzbGljZSBjb3JydXB0ZWQuIElmIGxhc3RNYkFkZHIgaW4gdGhlIHNsaWNlCisgICAgICAgICAgICBzdG9yYWdlIGlzIHNldCAtPiBwaWNXaWRodEluTWJzIChvciBhdCBsZWFzdCAxMCkgbWFjcm9ibG9ja3MgYmFjaworICAgICAgICAgICAgZnJvbSAgdGhlIGxhc3RNYkFkZHIgYXJlIG1hcmtlZCBjb3JydXB0ZWQuIEhvd2V2ZXIsIGlmIGxhc3RNYkFkZHIKKyAgICAgICAgICAgIGlzIG5vdCBzZXQgLT4gYWxsIG1hY3JvYmxvY2tzIG9mIHRoZSBzbGljZSBhcmUgbWFya2VkLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICBmaXJzdE1iSW5TbGljZSAgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayBpbiB0aGUgc2xpY2UsIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVzIHRoZSBzbGljZSB0byBiZSBtYXJrZWQgY29ycnVwdGVkCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBtYlN0b3JhZ2UgZm9yIHRoZSBjb3JydXB0ZWQgbWFjcm9ibG9ja3MgdXBkYXRlZAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgZmlyc3RNYkluU2xpY2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKyAgICB1MzIgc2xpY2VJZDsKKyAgICB1MzIgY3Vyck1iQWRkcjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKyAgICBBU1NFUlQoZmlyc3RNYkluU2xpY2UgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKTsKKworICAgIGN1cnJNYkFkZHIgPSBmaXJzdE1iSW5TbGljZTsKKworICAgIHNsaWNlSWQgPSBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQ7CisKKyAgICAvKiBEZWNvZGVTbGljZURhdGEgc2V0cyBsYXN0TWJBZGRyIGZvciBJIHNsaWNlcyAtPiBpZiBpdCB3YXMgc2V0LCBnbyBiYWNrCisgICAgICogTUFYKHBpY1dpZHRoSW5NYnMsIDEwKSBtYWNyb2Jsb2NrcyBhbmQgc3RhcnQgbWFya2luZyBmcm9tIHRoZXJlICovCisgICAgaWYgKHBTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkcikKKyAgICB7CisgICAgICAgIEFTU0VSVChwU3RvcmFnZS0+bWJbcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyXS5zbGljZUlkID09IHNsaWNlSWQpOworICAgICAgICBpID0gcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyIC0gMTsKKyAgICAgICAgdG1wID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPiBjdXJyTWJBZGRyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFN0b3JhZ2UtPm1iW2ldLnNsaWNlSWQgPT0gc2xpY2VJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICBpZiAodG1wID49IE1BWChwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzLCAxMCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaS0tOworICAgICAgICB9CisgICAgICAgIGN1cnJNYkFkZHIgPSBpOworICAgIH0KKworICAgIGRvCisgICAgeworCisgICAgICAgIGlmICggKHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5zbGljZUlkID09IHNsaWNlSWQpICYmCisgICAgICAgICAgICAgKHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkLS07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJNYkFkZHIgPSBoMjY0YnNkTmV4dE1iQWRkcmVzcyhwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwKKyAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIGN1cnJNYkFkZHIpOworCisgICAgfSB3aGlsZSAoY3Vyck1iQWRkcik7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjIzZDQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TTElDRV9EQVRBX0gKKyNkZWZpbmUgSDI2NFNXREVDX1NMSUNFX0RBVEFfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNsaWNlRGF0YShzdHJtRGF0YV90ICpwU3RybURhdGEsIHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCisgICAgaW1hZ2VfdCAqY3VyckltYWdlLCBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIpOworCit2b2lkIGgyNjRic2RNYXJrU2xpY2VDb3JydXB0ZWQoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIGZpcnN0TWJJblNsaWNlKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0xJQ0VfREFUQV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2JiNTM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jCkBAIC0wLDAgKzEsNTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgRGVjb2RlSW50ZXJsZWF2ZWRNYXAKKyAgICAgICAgICBEZWNvZGVEaXNwZXJzZWRNYXAKKyAgICAgICAgICBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAKKyAgICAgICAgICBEZWNvZGVCb3hPdXRNYXAKKyAgICAgICAgICBEZWNvZGVSYXN0ZXJTY2FuTWFwCisgICAgICAgICAgRGVjb2RlV2lwZU1hcAorICAgICAgICAgIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oIgorI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgRGVjb2RlSW50ZXJsZWF2ZWRNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiAqcnVuTGVuZ3RoLAorICB1MzIgcGljU2l6ZSk7CisKK3N0YXRpYyB2b2lkIERlY29kZURpc3BlcnNlZE1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBudW1TbGljZUdyb3VwcywKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KTsKKworc3RhdGljIHZvaWQgRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzLAorICB1MzIgKnRvcExlZnQsCisgIHUzMiAqYm90dG9tUmlnaHQsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCk7CisKK3N0YXRpYyB2b2lkIERlY29kZUJveE91dE1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgdTMyIHVuaXRzSW5TbGljZUdyb3VwMCwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KTsKKworc3RhdGljIHZvaWQgRGVjb2RlUmFzdGVyU2Nhbk1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAorICB1MzIgcGljU2l6ZSk7CisKK3N0YXRpYyB2b2lkIERlY29kZVdpcGVNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCisgIHUzMiBzaXplT2ZVcHBlckxlZnRHcm91cCwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVJbnRlcmxlYXZlZE1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgaW50ZXJsZWF2ZWQgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UKKyAgICAgICAgICAgIGdyb3VwIG1hcCB0eXBlIDAuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAorICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgIG51bWJlciBvZiBzbGljZSBncm91cHMKKyAgICAgICAgICAgIHJ1bkxlbmd0aCAgICAgICBydW5fbGVuZ3RoW10gdmFsdWVzIGZvciBlYWNoIHNsaWNlIGdyb3VwCisgICAgICAgICAgICBwaWNTaXplICAgICAgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIERlY29kZUludGVybGVhdmVkTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzLAorICB1MzIgKnJ1bkxlbmd0aCwKKyAgdTMyIHBpY1NpemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksaiwgZ3JvdXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYXApOworICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA+PSAxICYmIG51bVNsaWNlR3JvdXBzIDw9IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKKyAgICBBU1NFUlQocnVuTGVuZ3RoKTsKKworICAgIGkgPSAwOworCisgICAgZG8geworICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBudW1TbGljZUdyb3VwcyAmJiBpIDwgcGljU2l6ZTsKKyAgICAgICAgICBpICs9IHJ1bkxlbmd0aFtncm91cCsrXSkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKHJ1bkxlbmd0aFtncm91cF0gPD0gcGljU2l6ZSk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcnVuTGVuZ3RoW2dyb3VwXSAmJiBpICsgaiA8IHBpY1NpemU7IGorKykKKyAgICAgICAgICAgICAgICBtYXBbaStqXSA9IGdyb3VwOworICAgICAgICB9CisgICAgfSB3aGlsZSAoaSA8IHBpY1NpemUpOworCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVEaXNwZXJzZWRNYXAKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGRpc3BlcnNlZCBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZQorICAgICAgICAgICAgZ3JvdXAgbWFwIHR5cGUgMS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKKyAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzICAgIG51bWJlciBvZiBzbGljZSBncm91cHMKKyAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgRGVjb2RlRGlzcGVyc2VkTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHBpY1NpemU7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYXApOworICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA+PSAxICYmIG51bVNsaWNlR3JvdXBzIDw9IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKKyAgICBBU1NFUlQocGljV2lkdGgpOworICAgIEFTU0VSVChwaWNIZWlnaHQpOworCisgICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OworCisgICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKKyAgICAgICAgbWFwW2ldID0gKChpICUgcGljV2lkdGgpICsgKCgoaSAvIHBpY1dpZHRoKSAqIG51bVNsaWNlR3JvdXBzKSA+PiAxKSkgJQorICAgICAgICAgICAgbnVtU2xpY2VHcm91cHM7CisKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgZm9yZWdyb3VuZCB3aXRoIGxlZnQtb3ZlciBzbGljZSBncm91cCBtYXAgdHlwZSwKKyAgICAgICAgICAgIGkuZS4gc2xpY2UgZ3JvdXAgbWFwIHR5cGUgMi4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKKyAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzICAgIG51bWJlciBvZiBzbGljZSBncm91cHMKKyAgICAgICAgICAgIHRvcExlZnQgICAgICAgICAgIHRvcF9sZWZ0W10gdmFsdWVzCisgICAgICAgICAgICBib3R0b21SaWdodCAgICAgICBib3R0b21fcmlnaHRbXSB2YWx1ZXMKKyAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzLAorICB1MzIgKnRvcExlZnQsCisgIHUzMiAqYm90dG9tUmlnaHQsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSx5LHgseVRvcExlZnQseUJvdHRvbVJpZ2h0LHhUb3BMZWZ0LHhCb3R0b21SaWdodCwgcGljU2l6ZTsKKyAgICB1MzIgZ3JvdXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYXApOworICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA+PSAxICYmIG51bVNsaWNlR3JvdXBzIDw9IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKKyAgICBBU1NFUlQodG9wTGVmdCk7CisgICAgQVNTRVJUKGJvdHRvbVJpZ2h0KTsKKyAgICBBU1NFUlQocGljV2lkdGgpOworICAgIEFTU0VSVChwaWNIZWlnaHQpOworCisgICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OworCisgICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKKyAgICAgICAgbWFwW2ldID0gbnVtU2xpY2VHcm91cHMgLSAxOworCisgICAgZm9yIChncm91cCA9IG51bVNsaWNlR3JvdXBzIC0gMTsgZ3JvdXAtLTsgKQorICAgIHsKKyAgICAgICAgQVNTRVJUKCB0b3BMZWZ0W2dyb3VwXSA8PSBib3R0b21SaWdodFtncm91cF0gJiYKKyAgICAgICAgICAgICAgICBib3R0b21SaWdodFtncm91cF0gPCBwaWNTaXplICk7CisgICAgICAgIHlUb3BMZWZ0ID0gdG9wTGVmdFtncm91cF0gLyBwaWNXaWR0aDsKKyAgICAgICAgeFRvcExlZnQgPSB0b3BMZWZ0W2dyb3VwXSAlIHBpY1dpZHRoOworICAgICAgICB5Qm90dG9tUmlnaHQgPSBib3R0b21SaWdodFtncm91cF0gLyBwaWNXaWR0aDsKKyAgICAgICAgeEJvdHRvbVJpZ2h0ID0gYm90dG9tUmlnaHRbZ3JvdXBdICUgcGljV2lkdGg7CisgICAgICAgIEFTU0VSVCh4VG9wTGVmdCA8PSB4Qm90dG9tUmlnaHQpOworCisgICAgICAgIGZvciAoeSA9IHlUb3BMZWZ0OyB5IDw9IHlCb3R0b21SaWdodDsgeSsrKQorICAgICAgICAgICAgZm9yICh4ID0geFRvcExlZnQ7IHggPD0geEJvdHRvbVJpZ2h0OyB4KyspCisgICAgICAgICAgICAgICAgbWFwWyB5ICogcGljV2lkdGggKyB4IF0gPSBncm91cDsKKyAgICB9CisKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUJveE91dE1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgYm94LW91dCBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZSBncm91cAorICAgICAgICAgICAgbWFwIHR5cGUgMy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCisgICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnCisgICAgICAgICAgICB1bml0c0luU2xpY2VHcm91cDAgICAgICAgICAgICAgICAgbWJzIG9uIHNsaWNlIGdyb3VwIDAKKyAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgRGVjb2RlQm94T3V0TWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICB1MzIgdW5pdHNJblNsaWNlR3JvdXAwLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIGssIHBpY1NpemU7CisgICAgaTMyIHgsIHksIHhEaXIsIHlEaXIsIGxlZnRCb3VuZCwgdG9wQm91bmQsIHJpZ2h0Qm91bmQsIGJvdHRvbUJvdW5kOworICAgIHUzMiBtYXBVbml0VmFjYW50OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWFwKTsKKyAgICBBU1NFUlQocGljV2lkdGgpOworICAgIEFTU0VSVChwaWNIZWlnaHQpOworCisgICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OworICAgIEFTU0VSVCh1bml0c0luU2xpY2VHcm91cDAgPD0gcGljU2l6ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQorICAgICAgICBtYXBbaV0gPSAxOworCisgICAgeCA9IChwaWNXaWR0aCAtICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcpID4+IDE7CisgICAgeSA9IChwaWNIZWlnaHQgLSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnKSA+PiAxOworCisgICAgbGVmdEJvdW5kID0geDsKKyAgICB0b3BCb3VuZCA9IHk7CisKKyAgICByaWdodEJvdW5kID0geDsKKyAgICBib3R0b21Cb3VuZCA9IHk7CisKKyAgICB4RGlyID0gKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAtIDE7CisgICAgeURpciA9IChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgdW5pdHNJblNsaWNlR3JvdXAwOyBrICs9IG1hcFVuaXRWYWNhbnQgPyAxIDogMCkKKyAgICB7CisgICAgICAgIG1hcFVuaXRWYWNhbnQgPSAobWFwWyAodTMyKXkgKiBwaWNXaWR0aCArICh1MzIpeCBdID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICBpZiAobWFwVW5pdFZhY2FudCkKKyAgICAgICAgICAgIG1hcFsgKHUzMil5ICogcGljV2lkdGggKyAodTMyKXggXSA9IDA7CisKKyAgICAgICAgaWYgKHhEaXIgPT0gLTEgJiYgeCA9PSBsZWZ0Qm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlZnRCb3VuZCA9IE1BWChsZWZ0Qm91bmQgLSAxLCAwKTsKKyAgICAgICAgICAgIHggPSBsZWZ0Qm91bmQ7CisgICAgICAgICAgICB4RGlyID0gMDsKKyAgICAgICAgICAgIHlEaXIgPSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoeERpciA9PSAxICYmIHggPT0gcmlnaHRCb3VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmlnaHRCb3VuZCA9IE1JTihyaWdodEJvdW5kICsgMSwgKGkzMilwaWNXaWR0aCAtIDEpOworICAgICAgICAgICAgeCA9IHJpZ2h0Qm91bmQ7CisgICAgICAgICAgICB4RGlyID0gMDsKKyAgICAgICAgICAgIHlEaXIgPSAxIC0gMiAqIChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoeURpciA9PSAtMSAmJiB5ID09IHRvcEJvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICB0b3BCb3VuZCA9IE1BWCh0b3BCb3VuZCAtIDEsIDApOworICAgICAgICAgICAgeSA9IHRvcEJvdW5kOworICAgICAgICAgICAgeERpciA9IDEgLSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKyAgICAgICAgICAgIHlEaXIgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHlEaXIgPT0gMSAmJiB5ID09IGJvdHRvbUJvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICBib3R0b21Cb3VuZCA9IE1JTihib3R0b21Cb3VuZCArIDEsIChpMzIpcGljSGVpZ2h0IC0gMSk7CisgICAgICAgICAgICB5ID0gYm90dG9tQm91bmQ7CisgICAgICAgICAgICB4RGlyID0gMiAqIChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgLSAxOworICAgICAgICAgICAgeURpciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB4ICs9IHhEaXI7CisgICAgICAgICAgICB5ICs9IHlEaXI7CisgICAgICAgIH0KKyAgICB9CisKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVJhc3RlclNjYW5NYXAKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIHJhc3RlciBzY2FuIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlCisgICAgICAgICAgICBncm91cCBtYXAgdHlwZSA0LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKKyAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKKyAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwICAgICAgICAgICAgICBtYnMgaW4gdXBwZXJMZWZ0R3JvdXAKKyAgICAgICAgICAgIHBpY1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgRGVjb2RlUmFzdGVyU2Nhbk1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAorICB1MzIgcGljU2l6ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKHBpY1NpemUpOworICAgIEFTU0VSVChzaXplT2ZVcHBlckxlZnRHcm91cCA8PSBwaWNTaXplKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCisgICAgICAgIGlmIChpIDwgc2l6ZU9mVXBwZXJMZWZ0R3JvdXApCisgICAgICAgICAgICBtYXBbaV0gPSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXBbaV0gPSAxIC0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlV2lwZU1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgd2lwZSBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZSBncm91cCBtYXAKKyAgICAgICAgICAgIHR5cGUgNS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnCisgICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCAgICAgICAgICAgICAgbWJzIGluIHVwcGVyTGVmdEdyb3VwCisgICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcworICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIERlY29kZVdpcGVNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCisgIHUzMiBzaXplT2ZVcHBlckxlZnRHcm91cCwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLGosazsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKHBpY1dpZHRoKTsKKyAgICBBU1NFUlQocGljSGVpZ2h0KTsKKyAgICBBU1NFUlQoc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPD0gcGljV2lkdGggKiBwaWNIZWlnaHQpOworCisgICAgayA9IDA7CisgICAgZm9yIChqID0gMDsgaiA8IHBpY1dpZHRoOyBqKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWNIZWlnaHQ7IGkrKykKKyAgICAgICAgICAgIGlmIChrKysgPCBzaXplT2ZVcHBlckxlZnRHcm91cCkKKyAgICAgICAgICAgICAgICBtYXBbIGkgKiBwaWNXaWR0aCArIGogXSA9ICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWFwWyBpICogcGljV2lkdGggKyBqIF0gPSAxIC0KKyAgICAgICAgICAgICAgICAgICAgKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIG1hY3JvYmxvY2sgdG8gc2xpY2UgZ3JvdXAgbWFwLiBDb25zdHJ1Y3Rpb24KKyAgICAgICAgICAgIG9mIGRpZmZlcmVudCBzbGljZSBncm91cCBtYXAgdHlwZXMgaXMgaGFuZGxlZCBieSBzZXBhcmF0ZQorICAgICAgICAgICAgZnVuY3Rpb25zIGRlZmluZWQgYWJvdmUuIFNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscyBob3cgc2xpY2UgZ3JvdXAKKyAgICAgICAgICAgIG1hcHMgYXJlIGNvbXB1dGVkLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBwcyAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQKKyAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZQorICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcworICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcCgKKyAgdTMyICptYXAsCisgIHBpY1BhcmFtU2V0X3QgKnBwcywKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBwaWNTaXplLCB1bml0c0luU2xpY2VHcm91cDAgPSAwLCBzaXplT2ZVcHBlckxlZnRHcm91cCA9IDA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYXApOworICAgIEFTU0VSVChwcHMpOworICAgIEFTU0VSVChwaWNXaWR0aCk7CisgICAgQVNTRVJUKHBpY0hlaWdodCk7CisgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPCA3KTsKKworICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIHBpY0hlaWdodDsKKworICAgIC8qIGp1c3Qgb25lIHNsaWNlIGdyb3VwIC0+IGFsbCBtYWNyb2Jsb2NrcyBiZWxvbmcgdG8gZ3JvdXAgMCAqLworICAgIGlmIChwcHMtPm51bVNsaWNlR3JvdXBzID09IDEpCisgICAgeworICAgICAgICBIMjY0U3dEZWNNZW1zZXQobWFwLCAwLCBwaWNTaXplICogc2l6ZW9mKHUzMikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPiAyICYmIHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPCA2KQorICAgIHsKKyAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUgJiYKKyAgICAgICAgICAgICAgIHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUgPD0gcGljU2l6ZSk7CisKKyAgICAgICAgdW5pdHNJblNsaWNlR3JvdXAwID0KKyAgICAgICAgICAgIE1JTihzbGljZUdyb3VwQ2hhbmdlQ3ljbGUgKiBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlLCBwaWNTaXplKTsKKworICAgICAgICBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSA0IHx8IHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNSkKKyAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwID0gcHBzLT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyA/CisgICAgICAgICAgICAgICAgKHBpY1NpemUgLSB1bml0c0luU2xpY2VHcm91cDApIDogdW5pdHNJblNsaWNlR3JvdXAwOworICAgIH0KKworICAgIHN3aXRjaCAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIERlY29kZUludGVybGVhdmVkTWFwKG1hcCwgcHBzLT5udW1TbGljZUdyb3VwcywKKyAgICAgICAgICAgICAgcHBzLT5ydW5MZW5ndGgsIHBpY1NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgRGVjb2RlRGlzcGVyc2VkTWFwKG1hcCwgcHBzLT5udW1TbGljZUdyb3VwcywgcGljV2lkdGgsCisgICAgICAgICAgICAgIHBpY0hlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLAorICAgICAgICAgICAgICBwcHMtPnRvcExlZnQsIHBwcy0+Ym90dG9tUmlnaHQsIHBpY1dpZHRoLCBwaWNIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgRGVjb2RlQm94T3V0TWFwKG1hcCwgcHBzLT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgICAgICAgICAgICAgdW5pdHNJblNsaWNlR3JvdXAwLCBwaWNXaWR0aCwgcGljSGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIERlY29kZVJhc3RlclNjYW5NYXAobWFwLAorICAgICAgICAgICAgICBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLCBzaXplT2ZVcHBlckxlZnRHcm91cCwKKyAgICAgICAgICAgICAgcGljU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBEZWNvZGVXaXBlTWFwKG1hcCwgcHBzLT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsIHBpY1dpZHRoLCBwaWNIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVChwcHMtPnNsaWNlR3JvdXBJZCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFTU0VSVChwcHMtPnNsaWNlR3JvdXBJZFtpXSA8IHBwcy0+bnVtU2xpY2VHcm91cHMpOworICAgICAgICAgICAgICAgIG1hcFtpXSA9IHBwcy0+c2xpY2VHcm91cElkW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YmNiNmYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfU0xJQ0VfR1JPVVBfTUFQX0gKKyNkZWZpbmUgSDI2NFNXREVDX1NMSUNFX0dST1VQX01BUF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwKAorICB1MzIgKm1hcCwKKyAgcGljUGFyYW1TZXRfdCAqcHBzLAorICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TTElDRV9HUk9VUF9NQVBfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTdjNmY2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYwpAQCAtMCwwICsxLDE1MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlU2xpY2VIZWFkZXIKKyAgICAgICAgICBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzCisgICAgICAgICAgUmVmUGljTGlzdFJlb3JkZXJpbmcKKyAgICAgICAgICBEZWNSZWZQaWNNYXJraW5nCisgICAgICAgICAgQ2hlY2tQcHNJZAorICAgICAgICAgIENoZWNrRnJhbWVOdW0KKyAgICAgICAgICBDaGVja0lkclBpY0lkCisgICAgICAgICAgQ2hlY2tQaWNPcmRlckNudExzYgorICAgICAgICAgIENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbQorICAgICAgICAgIENoZWNrRGVsdGFQaWNPcmRlckNudAorICAgICAgICAgIENoZWNrUmVkdW5kYW50UGljQ250CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgUmVmUGljTGlzdFJlb3JkZXJpbmcoc3RybURhdGFfdCAqLCByZWZQaWNMaXN0UmVvcmRlcmluZ190ICosCisgICAgdTMyLCB1MzIpOworCitzdGF0aWMgdTMyIE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHModTMyIHBpY1NpemVJbk1icywKKyAgICB1MzIgc2xpY2VHcm91cENoYW5nZVJhdGUpOworCitzdGF0aWMgdTMyIERlY1JlZlBpY01hcmtpbmcoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIGRlY1JlZlBpY01hcmtpbmdfdCAqcERlY1JlZlBpY01hcmtpbmcsIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgICAgdTMyIG51bVJlZkZyYW1lcyk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVTbGljZUhlYWRlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgc2xpY2UgaGVhZGVyIGRhdGEgZnJvbSB0aGUgc3RyZWFtLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQKKyAgICAgICAgICAgIHBOYWxVbml0ICAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgTkFMIHVuaXQgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBTbGljZUhlYWRlciAgICBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhIG9yIGVuZCBvZiBzdHJlYW0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTbGljZUhlYWRlcihzdHJtRGF0YV90ICpwU3RybURhdGEsIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlciwKKyAgICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKKyAgICBuYWxVbml0X3QgKnBOYWxVbml0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGksIHZhbHVlOworICAgIGkzMiBpdG1wOworICAgIHUzMiBwaWNTaXplSW5NYnM7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2xpY2VIZWFkZXIpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOworICAgIEFTU0VSVCggcE5hbFVuaXQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRSB8fAorICAgICAgICAgICAgcE5hbFVuaXQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgKTsKKworCisgICAgSDI2NFN3RGVjTWVtc2V0KHBTbGljZUhlYWRlciwgMCwgc2l6ZW9mKHNsaWNlSGVhZGVyX3QpKTsKKworICAgIHBpY1NpemVJbk1icyA9IHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyAqIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnM7CisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNsaWNlSGVhZGVyLT5maXJzdE1iSW5TbGljZSA9IHZhbHVlOworICAgIGlmICh2YWx1ZSA+PSBwaWNTaXplSW5NYnMpCisgICAgeworICAgICAgICBFUFJJTlQoImZpcnN0X21iX2luX3NsaWNlIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSA9IHZhbHVlOworICAgIC8qIHNsaWNlIHR5cGUgaGFzIHRvIGJlIGVpdGhlciBJIG9yIFAgc2xpY2UuIFAgc2xpY2UgaXMgbm90IGFsbG93ZWQgd2hlbgorICAgICAqIGN1cnJlbnQgTkFMIHVuaXQgaXMgYW4gSURSIE5BTCB1bml0IG9yIG51bV9yZWZfZnJhbWVzIGlzIDAgKi8KKyAgICBpZiAoICFJU19JX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSAmJgorICAgICAgICAgKCAhSVNfUF9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkgfHwKKyAgICAgICAgICAgSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSB8fAorICAgICAgICAgICAhcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgKSApCisgICAgeworICAgICAgICBFUFJJTlQoInNsaWNlX3R5cGUiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTbGljZUhlYWRlci0+cGljUGFyYW1ldGVyU2V0SWQgPSB2YWx1ZTsKKyAgICBpZiAocFNsaWNlSGVhZGVyLT5waWNQYXJhbWV0ZXJTZXRJZCAhPSBwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJwaWNfcGFyYW1ldGVyX3NldF9pZCIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpICYmIHRtcCAhPSAwKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJmcmFtZV9udW0iKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtID0gdG1wOworCisgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBwU2xpY2VIZWFkZXItPmlkclBpY0lkID0gdmFsdWU7CisgICAgICAgIGlmICh2YWx1ZSA+IDY1NTM1KQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoImlkcl9waWNfaWQiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQorICAgICAgICAgICAgaSsrOworICAgICAgICBpLS07CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiID0gdG1wOworCisgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSA9IGl0bXA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayB0aGF0IHBpY09yZGVyQ250IGZvciBJRFIgcGljdHVyZSB3aWxsIGJlIHplcm8uIFNlZQorICAgICAgICAgKiBEZWNvZGVQaWNPcmRlckNudCBmdW5jdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBoZXJlICovCisgICAgICAgIGlmICggSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSAmJgorICAgICAgICAgICAgICggKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPgorICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IvMikgfHwKKyAgICAgICAgICAgICAgICBNSU4oKGkzMilwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiLAorICAgICAgICAgICAgICAgICAgICAoaTMyKXBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgKworICAgICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20pICE9IDAgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEpICYmCisgICAgICAgICAhcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdID0gaXRtcDsKKworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV0gPSBpdG1wOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgdGhhdCBwaWNPcmRlckNudCBmb3IgSURSIHBpY3R1cmUgd2lsbCBiZSB6ZXJvLiBTZWUKKyAgICAgICAgICogRGVjb2RlUGljT3JkZXJDbnQgZnVuY3Rpb24gdG8gdW5kZXJzdGFuZCB0aGUgbG9naWMgaGVyZSAqLworICAgICAgICBpZiAoIElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgJiYKKyAgICAgICAgICAgICBNSU4ocFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdLAorICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0gKworICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgKworICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV0pICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgcFNsaWNlSGVhZGVyLT5yZWR1bmRhbnRQaWNDbnQgPSB2YWx1ZTsKKyAgICAgICAgaWYgKHZhbHVlID4gMTI3KQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoInJlZHVuZGFudF9waWNfY250Iik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoSVNfUF9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4QWN0aXZlT3ZlcnJpZGVGbGFnID0gdG1wOworCisgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPm51bVJlZklkeEFjdGl2ZU92ZXJyaWRlRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgaWYgKHZhbHVlID4gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSA9IHZhbHVlICsgMTsKKyAgICAgICAgfQorICAgICAgICAvKiBzZXQgbnVtUmVmSWR4TDBBY3RpdmUgZnJvbSBwaWMgcGFyYW0gc2V0ICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogaWYgdmFsdWUgKG1pbnVzMSkgaW4gcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGV4Y2VlZHMgMTUgaXQgc2hvdWxkCisgICAgICAgICAgICAgKiBoYXZlIGJlZW4gb3ZlcnJpZGRlbiBoZXJlICovCisgICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5udW1SZWZJZHhMMEFjdGl2ZSA+IDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlID0gcFBpY1BhcmFtU2V0LT5udW1SZWZJZHhMMEFjdGl2ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKKyAgICB7CisgICAgICAgIHRtcCA9IFJlZlBpY0xpc3RSZW9yZGVyaW5nKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU2xpY2VIZWFkZXItPnJlZlBpY0xpc3RSZW9yZGVyaW5nLAorICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSwKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjICE9IDApCisgICAgeworICAgICAgICB0bXAgPSBEZWNSZWZQaWNNYXJraW5nKHBTdHJtRGF0YSwgJnBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZywKKyAgICAgICAgICAgIHBOYWxVbml0LT5uYWxVbml0VHlwZSwgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIC8qIGRlY29kZSBzbGljZVFwRGVsdGEgYW5kIGNoZWNrIHRoYXQgaW5pdGlhbCBRUCBmb3IgdGhlIHNsaWNlIHdpbGwgYmUgb24KKyAgICAgKiB0aGUgcmFuZ2UgWzAsIDUxXSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTbGljZUhlYWRlci0+c2xpY2VRcERlbHRhID0gaXRtcDsKKyAgICBpdG1wICs9IChpMzIpcFBpY1BhcmFtU2V0LT5waWNJbml0UXA7CisgICAgaWYgKCAoaXRtcCA8IDApIHx8IChpdG1wID4gNTEpICkKKyAgICB7CisgICAgICAgIEVQUklOVCgic2xpY2VfcXBfZGVsdGEiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIGlmIChwUGljUGFyYW1TZXQtPmRlYmxvY2tpbmdGaWx0ZXJDb250cm9sUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBwU2xpY2VIZWFkZXItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID0gdmFsdWU7CisgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID4gMikKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJkaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2lkYyIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgaWYgKCAoaXRtcCA8IC02KSB8fCAoaXRtcCA+IDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIEVQUklOVCgic2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIiKTsKKyAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTbGljZUhlYWRlci0+c2xpY2VBbHBoYUMwT2Zmc2V0ID0gaXRtcCAqIDI7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIGlmICggKGl0bXAgPCAtNikgfHwgKGl0bXAgPiA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBFUFJJTlQoInNsaWNlX2JldGFfb2Zmc2V0X2RpdjIiKTsKKyAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTbGljZUhlYWRlci0+c2xpY2VCZXRhT2Zmc2V0ID0gaXRtcCAqIDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIChwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzID4gMSkgJiYKKyAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID49IDMpICYmCisgICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA8PSA1KSApCisgICAgeworICAgICAgICAvKiBzZXQgdG1wIHRvIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gcmVwcmVzZW50IHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZQorICAgICAgICAgKiBpbiB0aGUgc3RyZWFtICovCisgICAgICAgIHRtcCA9IE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHMocGljU2l6ZUluTWJzLAorICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSk7CisgICAgICAgIHZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0bXApOworICAgICAgICBpZiAodmFsdWUgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUgPSB2YWx1ZTsKKworICAgICAgICAvKiBjb3JyZXNwb25kcyB0byB0bXAgPSBDZWlsKHBpY1NpemVJbk1icyAvIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKSAqLworICAgICAgICB0bXAgPSAocGljU2l6ZUluTWJzICsgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSAtIDEpIC8KKyAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlUmF0ZTsKKyAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+c2xpY2VHcm91cENoYW5nZUN5Y2xlID4gdG1wKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoInNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERldGVybWluZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50CisgICAgICAgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgaW4gdGhlIHN0cmVhbS4gVGhlIHN0YW5kYXJkIHN0YXRlcyB0aGF0CisgICAgICAgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgaXMgcmVwcmVzZW50ZWQgYnkKKyAgICAgICAgICAgICAgICBDZWlsKCBMb2cyKCAocGljU2l6ZUluTWJzIC8gc2xpY2VHcm91cENoYW5nZVJhdGUpICsgMSkgKQorCisgICAgICAgICAgICBiaXRzLiBEaXZpc2lvbiAiLyIgaW4gdGhlIGVxdWF0aW9uIGlzIG5vbi10cnVuY2F0aW5nIGRpdmlzaW9uLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICAgICAgICAgIHBpY3R1cmUgc2l6ZSBpbiBtYWNyb2Jsb2NrcworICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZVJhdGUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBudW1iZXIgb2YgYml0cyBuZWVkZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHModTMyIHBpY1NpemVJbk1icywgdTMyIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsbnVtQml0cyxtYXNrOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKKyAgICBBU1NFUlQoc2xpY2VHcm91cENoYW5nZVJhdGUpOworICAgIEFTU0VSVChzbGljZUdyb3VwQ2hhbmdlUmF0ZSA8PSBwaWNTaXplSW5NYnMpOworCisgICAgLyogY29tcHV0ZSAocGljU2l6ZUluTWJzIC8gc2xpY2VHcm91cENoYW5nZVJhdGUgKyAxKSwgcm91bmRlZCB1cCAqLworICAgIGlmIChwaWNTaXplSW5NYnMgJSBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkKKyAgICAgICAgdG1wID0gMiArIHBpY1NpemVJbk1icy9zbGljZUdyb3VwQ2hhbmdlUmF0ZTsKKyAgICBlbHNlCisgICAgICAgIHRtcCA9IDEgKyBwaWNTaXplSW5NYnMvc2xpY2VHcm91cENoYW5nZVJhdGU7CisKKyAgICBudW1CaXRzID0gMDsKKyAgICBtYXNrID0gfjBVOworCisgICAgLyogc2V0IG51bUJpdHMgdG8gcG9zaXRpb24gb2YgcmlnaHQtbW9zdCBub24temVybyBiaXQgKi8KKyAgICB3aGlsZSAodG1wICYgKG1hc2s8PCsrbnVtQml0cykpCisgICAgICAgIDsKKyAgICBudW1CaXRzLS07CisKKyAgICAvKiBhZGQgb25lIG1vcmUgYml0IGlmIHZhbHVlIGdyZWF0ZXIgdGhhbiAyXm51bUJpdHMgKi8KKyAgICBpZiAodG1wICYgKCgxPDxudW1CaXRzKS0xKSkKKyAgICAgICAgbnVtQml0cysrOworCisgICAgcmV0dXJuKG51bUJpdHMpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUmVmUGljTGlzdFJlb3JkZXJpbmcKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBzeW50YXggZWxlbWVudHMgZnJvbQorICAgICAgICAgICAgdGhlIHN0cmVhbS4gTWF4IG51bWJlciBvZiByZW9yZGVyaW5nIGNvbW1hbmRzIGlzIG51bVJlZklkeEFjdGl2ZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIG51bVJlZklkeEFjdGl2ZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZSBpbmRpY2VzIHRvIGJlIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBzbGljZQorICAgICAgICAgICAgbWF4UGljTnVtICAgICAgIG1heEZyYW1lTnVtIGZyb20gdGhlIGFjdGl2ZSBTUFMKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nICAgZGVjb2RlZCBkYXRhIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgUmVmUGljTGlzdFJlb3JkZXJpbmcoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKnBSZWZQaWNMaXN0UmVvcmRlcmluZywgdTMyIG51bVJlZklkeEFjdGl2ZSwKKyAgICB1MzIgbWF4UGljTnVtKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIHUzMiBjb21tYW5kOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFJlZlBpY0xpc3RSZW9yZGVyaW5nKTsKKyAgICBBU1NFUlQobnVtUmVmSWR4QWN0aXZlKTsKKyAgICBBU1NFUlQobWF4UGljTnVtKTsKKworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+cmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDAgPSB0bXA7CisKKyAgICBpZiAocFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCkKKyAgICB7CisgICAgICAgIGkgPSAwOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpID4gbnVtUmVmSWR4QWN0aXZlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVQUklOVCgiVG9vIG1hbnkgcmVvcmRlcmluZyBjb21tYW5kcyIpOworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJmNvbW1hbmQpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBpZiAoY29tbWFuZCA+IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVBSSU5UKCJyZW9yZGVyaW5nX29mX3BpY19udW1zX2lkYyIpOworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPSBjb21tYW5kOworCisgICAgICAgICAgICBpZiAoKGNvbW1hbmQgPT0gMCkgfHwgKGNvbW1hbmQgPT0gMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID49IG1heFBpY051bSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgiYWJzX2RpZmZfcGljX251bV9taW51czEiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0uYWJzRGlmZlBpY051bSA9IHZhbHVlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjb21tYW5kID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5jb21tYW5kW2ldLmxvbmdUZXJtUGljTnVtID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICB9IHdoaWxlIChjb21tYW5kICE9IDMpOworCisgICAgICAgIC8qIHRoZXJlIHNoYWxsIGJlIGF0IGxlYXN0IG9uZSByZW9yZGVyaW5nIGNvbW1hbmQgaWYKKyAgICAgICAgICogcmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDAgd2FzIHNldCAqLworICAgICAgICBpZiAoaSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoInJlZl9waWNfbGlzdF9yZW9yZGVyaW5nIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY1JlZlBpY01hcmtpbmcKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIGRlY29kZWQgcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyBzeW50YXggZWxlbWVudHMgZnJvbQorICAgICAgICAgICAgdGhlIHN0cmVhbS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisgICAgICAgICAgICBudW1SZWZGcmFtZXMgICAgbWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzIGZyb20gdGhlIGFjdGl2ZSBTUFMKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmcgICBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZWNSZWZQaWNNYXJraW5nKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICBkZWNSZWZQaWNNYXJraW5nX3QgKnBEZWNSZWZQaWNNYXJraW5nLCBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICAgIHUzMiBudW1SZWZGcmFtZXMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWU7CisgICAgdTMyIGk7CisgICAgdTMyIG9wZXJhdGlvbjsKKyAgICAvKiB2YXJpYWJsZXMgZm9yIGVycm9yIGNoZWNraW5nIHB1cnBvc2VzLCBzdG9yZSBudW1iZXIgb2YgbWVtb3J5CisgICAgICogbWFuYWdlbWVudCBvcGVyYXRpb25zIG9mIGNlcnRhaW4gdHlwZSAqLworICAgIHUzMiBudW00ID0gMCwgbnVtNSA9IDAsIG51bTYgPSAwLCBudW0xdG8zID0gMDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKCBuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSIHx8CisgICAgICAgICAgICBuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0UgfHwKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlID09IE5BTF9TRUkgKTsKKworCisgICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5ub091dHB1dE9mUHJpb3JQaWNzRmxhZyA9IHRtcDsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5sb25nVGVybVJlZmVyZW5jZUZsYWcgPSB0bXA7CisgICAgICAgIGlmICghbnVtUmVmRnJhbWVzICYmIHBEZWNSZWZQaWNNYXJraW5nLT5sb25nVGVybVJlZmVyZW5jZUZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgibG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+YWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcgPSB0bXA7CisgICAgICAgIGlmIChwRGVjUmVmUGljTWFya2luZy0+YWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzZWUgZXhwbGFuYXRpb24gb2YgdGhlIE1BWF9OVU1fTU1DX09QRVJBVElPTlMgaW4KKyAgICAgICAgICAgICAgICAgKiBzbGljZV9oZWFkZXIuaCAqLworICAgICAgICAgICAgICAgIGlmIChpID4gKDIgKiBudW1SZWZGcmFtZXMgKyAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgiVG9vIG1hbnkgbWFuYWdlbWVudCBvcGVyYXRpb25zIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmb3BlcmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA+IDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLgorICAgICAgICAgICAgICAgICAgICBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoKG9wZXJhdGlvbiA9PSAxKSB8fCAob3BlcmF0aW9uID09IDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS5kaWZmZXJlbmNlT2ZQaWNOdW1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS5sb25nVGVybVBpY051bSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG9wZXJhdGlvbiA9PSAzKSB8fCAob3BlcmF0aW9uID09IDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS5sb25nVGVybUZyYW1lSWR4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSBzaGFsbCBiZSBpbiByYW5nZSBbMCwgbnVtUmVmRnJhbWVzXSAqLworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiBudW1SZWZGcmFtZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVCgibWF4X2xvbmdfdGVybV9mcmFtZV9pZHhfcGx1czEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMb25nVGVybUZyYW1lSWR4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IHZhbHVlIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBudW00Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG51bTUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiAmJiBvcGVyYXRpb24gPD0gMykKKyAgICAgICAgICAgICAgICAgICAgbnVtMXRvMysrOworICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gNikKKyAgICAgICAgICAgICAgICAgICAgbnVtNisrOworCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfSB3aGlsZSAob3BlcmF0aW9uICE9IDApOworCisgICAgICAgICAgICAvKiBlcnJvciBjaGVja2luZyAqLworICAgICAgICAgICAgaWYgKG51bTQgPiAxIHx8IG51bTUgPiAxIHx8IG51bTYgPiAxIHx8IChudW0xdG8zICYmIG51bTUpKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkQ2hlY2tQcHNJZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIHBpY19wYXJhbWV0ZXJfc2V0X2lkIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24KKyAgICAgICAgICAgIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtCisgICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nCisgICAgICAgICAgICBzdHJlYW0gZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcGljUGFyYW1TZXRJZCAgIHZhbHVlIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrUHBzSWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnBpY1BhcmFtU2V0SWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWU7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAodmFsdWUgPj0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgKnBpY1BhcmFtU2V0SWQgPSB2YWx1ZTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrRnJhbWVOdW0KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBmcmFtZV9udW0gZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0gZGF0YQorICAgICAgICAgICAgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3Npbmcgc3RyZWFtCisgICAgICAgICAgICBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbWF4RnJhbWVOdW0KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZnJhbWVOdW0gICAgICAgIHZhbHVlIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrRnJhbWVOdW0oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgdTMyIG1heEZyYW1lTnVtLAorICB1MzIgKmZyYW1lTnVtKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChtYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKGZyYW1lTnVtKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKG1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBmcmFtZV9udW0gKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgKmZyYW1lTnVtID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tJZHJQaWNJZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIGlkcl9waWNfaWQgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0gZGF0YQorICAgICAgICAgICAgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3Npbmcgc3RyZWFtCisgICAgICAgICAgICBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbWF4RnJhbWVOdW0gICAgIG1heCBmcmFtZSBudW1iZXIgZnJvbSBhY3RpdmUgU1BTCisgICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBpZHJQaWNJZCAgICAgICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tJZHJQaWNJZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiAqaWRyUGljSWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKG1heEZyYW1lTnVtKTsKKyAgICBBU1NFUlQoaWRyUGljSWQpOworCisgICAgLyogbmFsVW5pdFR5cGUgbXVzdCBiZSBlcXVhbCB0byA1IGJlY2F1c2Ugb3RoZXJ3aXNlIGlkclBpY0lkIGlzIG5vdAorICAgICAqIHByZXNlbnQgKi8KKyAgICBpZiAobmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAobWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgZnJhbWVfbnVtICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogaWRyX3BpY19pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgaWRyUGljSWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2IKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBwaWNfb3JkZXJfY250X2xzYiBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uCisgICAgICAgICAgICBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbQorICAgICAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZworICAgICAgICAgICAgc3RyZWFtIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCisgICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwaWNPcmRlckNudExzYiAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYigKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiAqcGljT3JkZXJDbnRMc2IpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKHBpY09yZGVyQ250THNiKTsKKworICAgIC8qIHBpY09yZGVyQ250VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDAgKi8KKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgZnJhbWVfbnVtICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCisgICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICpwaWNPcmRlckNudExzYiA9IHRtcDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tIGZyb20gdGhlIHNsaWNlIGhlYWRlci4KKyAgICAgICAgICAgIEZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUKKyAgICAgICAgICAgIHN0cmVhbSBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUKKyAgICAgICAgICAgIGFjY2Vzc2luZyBzdHJlYW0gZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnRCb3R0b20gIHZhbHVlIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIGkzMiAqZGVsdGFQaWNPcmRlckNudEJvdHRvbSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQoZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7CisKKyAgICAvKiBwaWNPcmRlckNudFR5cGUgbXVzdCBiZSBlcXVhbCB0byAwIGFuZCBwaWNPcmRlclByZXNlbnRGbGFnIG11c3QgYmUgVFJVRQorICAgICAqICovCisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYik7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBza2lwIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLworICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBza2lwIHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCBkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVlayB2YWx1ZXMgZGVsdGFfcGljX29yZGVyX2NudFswXSBhbmQgZGVsdGFfcGljX29yZGVyX2NudFsxXQorICAgICAgICAgICAgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0KKyAgICAgICAgICAgIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZQorICAgICAgICAgICAgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3Npbmcgc3RyZWFtIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgICAgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICAgICAgICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUworICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgICAgICAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAorICAgICAgICAgICAgcGljT3JkZXJQcmVzZW50RmxhZyAgICAgZmxhZyBpbmRpY2F0aW5nIGlmIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHByZXNlbnQgaW4gdGhlIHN0cmVhbQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250ICAgICAgICB2YWx1ZXMgYXJlIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICB1MzIgcGljT3JkZXJQcmVzZW50RmxhZywKKyAgaTMyICpkZWx0YVBpY09yZGVyQ250KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgIEFTU0VSVChkZWx0YVBpY09yZGVyQ250KTsKKworICAgIC8qIHBpY09yZGVyQ250VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDEgYW5kIGRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyBtdXN0CisgICAgICogYmUgRkFMU0UgKi8KKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSk7CisgICAgQVNTRVJUKCFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogc2tpcCBmcmFtZV9udW0gKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250WzBdICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJmRlbHRhUGljT3JkZXJDbnRbMF0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0gaWYgcHJlc2VudCAqLworICAgIGlmIChwaWNPcmRlclByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJmRlbHRhUGljT3JkZXJDbnRbMV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrUmVkdW5kYW50UGljQ250CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgcmVkdW5kYW50X3BpY19jbnQgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbgorICAgICAgICAgICAgZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0KKyAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3NpbmcKKyAgICAgICAgICAgIHN0cmVhbSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUworICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFBQUworICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcmVkdW5kYW50UGljQ250IHZhbHVlIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrUmVkdW5kYW50UGljQ250KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICB1MzIgKnJlZHVuZGFudFBpY0NudCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICBpMzIgaXZhbHVlOworICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOworICAgIEFTU0VSVChyZWR1bmRhbnRQaWNDbnQpOworCisgICAgLyogcmVkdW5kYW50X3BpY19jbnRfZmxhZyBtdXN0IGJlIFRSVUUgKi8KKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZyk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA+IDAgfHwKKyAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYik7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBza2lwIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLworICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQorICAgICAgICAgICAgaSsrOworICAgICAgICBpLS07CisKKyAgICAgICAgLyogcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAqLworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxICYmCisgICAgICAhcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpCisgICAgeworICAgICAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250WzBdICovCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0gaWYgcHJlc2VudCAqLworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVkdW5kYW50X3BpY19jbnQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsIHJlZHVuZGFudFBpY0NudCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1ByaW9yUGljc0ZsYWcKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnIGZyb20gdGhlIHNsaWNlIGhlYWRlci4KKyAgICAgICAgICAgIEZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcworICAgICAgICAgICAgdGhlIHN0cmVhbSBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUKKyAgICAgICAgICAgIGFjY2Vzc2luZyBzdHJlYW0gZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBQUFMKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnIHZhbHVlIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLypsaW50IC1lNzE1IGRpc2FibGUgbGludCBpbmZvIG5hbFVuaXRUeXBlIG5vdCByZWZlcmVuY2VkICovCit1MzIgaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZyh1MzIgKiBub091dHB1dE9mUHJpb3JQaWNzRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cm1EYXRhX3QgKiBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXFQYXJhbVNldF90ICogcFNlcVBhcmFtU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGljUGFyYW1TZXRfdCAqIHBQaWNQYXJhbVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUpCit7CisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIGkzMiBpdmFsdWU7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7CisgICAgQVNTRVJUKG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnKTsKKworICAgIC8qIG11c3QgYmUgSURSIGxzaWNlICovCisgICAgQVNTRVJUKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybiAodG1wKTsKKworICAgIC8qIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuICh0bXApOworCisgICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4gKHRtcCk7CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogc2tpcCBmcmFtZV9udW0gKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisKKyAgICAvKiBza2lwIGlkcl9waWNfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuICh0bXApOworCisgICAgaWYocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQorICAgICAgICAgICAgaSsrOworICAgICAgICBpLS07CisKKyAgICAgICAgLyogc2tpcCBwaWNfb3JkZXJfY250X2xzYiAqLworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgICAgIGlmKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKworICAgICAgICBpZihwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNraXAgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gKi8KKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOworICAgICAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxICYmCisgICAgICAgIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKQorICAgIHsKKyAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250WzBdICovCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOworICAgICAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuICh0bXApOworCisgICAgICAgIC8qIHNraXAgZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCisgICAgICAgIGlmKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7CisgICAgICAgICAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNraXAgcmVkdW5kYW50X3BpY19jbnQgKi8KKyAgICBpZihwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuICh0bXApOworICAgIH0KKworICAgICpub091dHB1dE9mUHJpb3JQaWNzRmxhZyA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCAxKTsKKyAgICBpZigqbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKworICAgIHJldHVybiAoSEFOVFJPX09LKTsKKworfQorLypsaW50ICtlNzE1ICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5ODg5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0gKKyNkZWZpbmUgSDI2NFNXREVDX1NMSUNFX0hFQURFUl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitlbnVtIHsKKyAgICBQX1NMSUNFID0gMCwKKyAgICBJX1NMSUNFID0gMgorfTsKKworZW51bSB7Tk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMgPSAweEZGRkZ9OworCisvKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgc2xpY2UgaXMgYW4gaW50ZXIgc2xpY2UsIHNsaWNlVHlwZXMgMCBhbmQgNSAqLworI2RlZmluZSBJU19QX1NMSUNFKHNsaWNlVHlwZSkgKCgoc2xpY2VUeXBlKSA9PSBQX1NMSUNFKSB8fCBcCisgICAgKChzbGljZVR5cGUpID09IFBfU0xJQ0UgKyA1KSkKKworLyogbWFjcm8gdG8gZGV0ZXJtaW5lIGlmIHNsaWNlIGlzIGFuIGludHJhIHNsaWNlLCBzbGljZVR5cGVzIDIgYW5kIDcgKi8KKyNkZWZpbmUgSVNfSV9TTElDRShzbGljZVR5cGUpICgoKHNsaWNlVHlwZSkgPT0gSV9TTElDRSkgfHwgXAorICAgICgoc2xpY2VUeXBlKSA9PSBJX1NMSUNFICsgNSkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogc3RydWN0dXJlIHRvIHN0b3JlIGRhdGEgb2Ygb25lIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBvcGVyYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHJlb3JkZXJpbmdPZlBpY051bXNJZGM7CisgICAgdTMyIGFic0RpZmZQaWNOdW07CisgICAgdTMyIGxvbmdUZXJtUGljTnVtOworfSByZWZQaWNMaXN0UmVvcmRlcmluZ09wZXJhdGlvbl90OworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIG9wZXJhdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwOworICAgIHJlZlBpY0xpc3RSZW9yZGVyaW5nT3BlcmF0aW9uX3QgY29tbWFuZFtNQVhfTlVNX1JFRl9QSUNTKzFdOworfSByZWZQaWNMaXN0UmVvcmRlcmluZ190OworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgZGF0YSBvZiBvbmUgRFBCIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbjsKKyAgICB1MzIgZGlmZmVyZW5jZU9mUGljTnVtczsKKyAgICB1MzIgbG9uZ1Rlcm1QaWNOdW07CisgICAgdTMyIGxvbmdUZXJtRnJhbWVJZHg7CisgICAgdTMyIG1heExvbmdUZXJtRnJhbWVJZHg7Cit9IG1lbW9yeU1hbmFnZW1lbnRPcGVyYXRpb25fdDsKKworLyogd29yc3QgY2FzZSBzY2VuYXJpbzogYWxsIE1BWF9OVU1fUkVGX1BJQ1MgcGljdHVyZXMgaW4gdGhlIGJ1ZmZlciBhcmUKKyAqIHNob3J0IHRlcm0gcGljdHVyZXMsIGVhY2ggb25lIG9mIHRoZW0gaXMgZmlyc3QgbWFya2VkIGFzIGxvbmcgdGVybQorICogcmVmZXJlbmNlIHBpY3R1cmUgd2hpY2ggaXMgdGhlbiBtYXJrZWQgYXMgdW51c2VkIGZvciByZWZlcmVuY2UuCisgKiBBZGRpdGlvbmFsbHksIG1heCBsb25nLXRlcm0gZnJhbWUgaW5kZXggaXMgc2V0IGFuZCBjdXJyZW50IHBpY3R1cmUgaXMKKyAqIG1hcmtlZCBhcyBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmUuIExhc3QgcG9zaXRpb24gcmVzZXJ2ZWQgZm9yCisgKiBlbmQgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gY29tbWFuZCAqLworI2RlZmluZSBNQVhfTlVNX01NQ19PUEVSQVRJT05TICgyKk1BWF9OVU1fUkVGX1BJQ1MrMisxKQorCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgZGVjb2RlZCByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnOworICAgIHUzMiBsb25nVGVybVJlZmVyZW5jZUZsYWc7CisgICAgdTMyIGFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnOworICAgIG1lbW9yeU1hbmFnZW1lbnRPcGVyYXRpb25fdCBvcGVyYXRpb25bTUFYX05VTV9NTUNfT1BFUkFUSU9OU107Cit9IGRlY1JlZlBpY01hcmtpbmdfdDsKKworLyogc3RydWN0dXJlIHRvIHN0b3JlIHNsaWNlIGhlYWRlciBkYXRhIGRlY29kZWQgZnJvbSB0aGUgc3RyZWFtICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBmaXJzdE1iSW5TbGljZTsKKyAgICB1MzIgc2xpY2VUeXBlOworICAgIHUzMiBwaWNQYXJhbWV0ZXJTZXRJZDsKKyAgICB1MzIgZnJhbWVOdW07CisgICAgdTMyIGlkclBpY0lkOworICAgIHUzMiBwaWNPcmRlckNudExzYjsKKyAgICBpMzIgZGVsdGFQaWNPcmRlckNudEJvdHRvbTsKKyAgICBpMzIgZGVsdGFQaWNPcmRlckNudFsyXTsKKyAgICB1MzIgcmVkdW5kYW50UGljQ250OworICAgIHUzMiBudW1SZWZJZHhBY3RpdmVPdmVycmlkZUZsYWc7CisgICAgdTMyIG51bVJlZklkeEwwQWN0aXZlOworICAgIGkzMiBzbGljZVFwRGVsdGE7CisgICAgdTMyIGRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjOworICAgIGkzMiBzbGljZUFscGhhQzBPZmZzZXQ7CisgICAgaTMyIHNsaWNlQmV0YU9mZnNldDsKKyAgICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlOworICAgIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgcmVmUGljTGlzdFJlb3JkZXJpbmc7CisgICAgZGVjUmVmUGljTWFya2luZ190IGRlY1JlZlBpY01hcmtpbmc7Cit9IHNsaWNlSGVhZGVyX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTbGljZUhlYWRlcihzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlciwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCisgIG5hbFVuaXRfdCAqcE5hbFVuaXQpOworCit1MzIgaDI2NGJzZENoZWNrUHBzSWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnBwc0lkKTsKKwordTMyIGgyNjRic2RDaGVja0ZyYW1lTnVtKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgdTMyICpmcmFtZU51bSk7CisKK3UzMiBoMjY0YnNkQ2hlY2tJZHJQaWNJZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiAqaWRyUGljSWQpOworCit1MzIgaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2IoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICB1MzIgKnBpY09yZGVyQ250THNiKTsKKwordTMyIGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICBpMzIgKmRlbHRhUGljT3JkZXJDbnRCb3R0b20pOworCit1MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiBwaWNPcmRlclByZXNlbnRGbGFnLAorICBpMzIgKmRlbHRhUGljT3JkZXJDbnQpOworCit1MzIgaDI2NGJzZENoZWNrUmVkdW5kYW50UGljQ250KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICB1MzIgKnJlZHVuZGFudFBpY0NudCk7CisKK3UzMiBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnKHUzMiAqIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RybURhdGFfdCAqIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcVBhcmFtU2V0X3QgKiBwU2VxUGFyYW1TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWNQYXJhbVNldF90ICogcFBpY1BhcmFtU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NMSUNFX0hFQURFUl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyMzQ3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jCkBAIC0wLDAgKzEsODg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEluaXRTdG9yYWdlCisgICAgICAgICAgaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQKKyAgICAgICAgICBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldAorICAgICAgICAgIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cworICAgICAgICAgIGgyNjRic2RSZXNldFN0b3JhZ2UKKyAgICAgICAgICBoMjY0YnNkSXNTdGFydE9mUGljdHVyZQorICAgICAgICAgIGgyNjRic2RJc0VuZE9mUGljdHVyZQorICAgICAgICAgIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcAorICAgICAgICAgIGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeQorICAgICAgICAgIENoZWNrUHBzCisgICAgICAgICAgaDI2NGJzZFZhbGlkUGFyYW1TZXRzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBDaGVja1BwcyhwaWNQYXJhbVNldF90ICpwcHMsIHNlcVBhcmFtU2V0X3QgKnNwcyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkSW5pdFN0b3JhZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgSW5pdGlhbGl6ZSBzdG9yYWdlIHN0cnVjdHVyZS4gU2V0cyBjb250ZW50cyBvZiB0aGUgc3RvcmFnZSB0byAnMCcKKyAgICAgICAgICAgIGV4Y2VwdCBmb3IgdGhlIGFjdGl2ZSBwYXJhbWV0ZXIgc2V0IGlkcywgd2hpY2ggYXJlIGluaXRpYWxpemVkCisgICAgICAgICAgICB0byBpbnZhbGlkIHZhbHVlcy4KKworICAgICAgICBJbnB1dHM6CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIGluaXRpYWxpemVkIGRhdGEgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbml0U3RvcmFnZShzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIEgyNjRTd0RlY01lbXNldChwU3RvcmFnZSwgMCwgc2l6ZW9mKHN0b3JhZ2VfdCkpOworCisgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUzsKKyAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOworCisgICAgcFN0b3JhZ2UtPmF1Yi0+Zmlyc3RDYWxsRmxhZyA9IEhBTlRST19UUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFN0b3JlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgaW50byB0aGUgc3RvcmFnZS4gSWYgYWN0aXZlIFNQUyBpcworICAgICAgICAgICAgb3ZlcndyaXR0ZW4gLT4gY2hlY2sgaWYgY29udGVudHMgY2hhbmdlcyBhbmQgaWYgaXQgZG9lcywgc2V0CisgICAgICAgICAgICBwYXJhbWV0ZXJzIHRvIGZvcmNlIHJlYWN0aXZhdGlvbiBvZiBwYXJhbWV0ZXIgc2V0cworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBwYXJhbSBzZXQgdG8gYmUgc3RvcmVkCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SICBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaWQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKTsKKworICAgIGlkID0gcFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZDsKKworICAgIC8qIHNlcSBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgbm90IHVzZWQgYmVmb3JlIC0+IGFsbG9jYXRlIG1lbW9yeSAqLworICAgIGlmIChwU3RvcmFnZS0+c3BzW2lkXSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQUxMT0NBVEUocFN0b3JhZ2UtPnNwc1tpZF0sIDEsIHNlcVBhcmFtU2V0X3QpOworICAgICAgICBpZiAocFN0b3JhZ2UtPnNwc1tpZF0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgfQorICAgIC8qIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBlcXVhbCB0byBpZCBvZiBhY3RpdmUgc3BzICovCisgICAgZWxzZSBpZiAoaWQgPT0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkKQorICAgIHsKKyAgICAgICAgLyogaWYgc2VxIHBhcmFtZXRlciBzZXQgY29udGVudHMgY2hhbmdlcworICAgICAgICAgKiAgICAtPiBvdmVyd3JpdGUgYW5kIHJlLWFjdGl2YXRlIHdoZW4gbmV4dCBJRFIgcGljdHVyZSBkZWNvZGVkCisgICAgICAgICAqICAgIGlkcyBvZiBhY3RpdmUgcGFyYW0gc2V0cyBzZXQgdG8gaW52YWxpZCB2YWx1ZXMgdG8gZm9yY2UKKyAgICAgICAgICogICAgcmUtYWN0aXZhdGlvbi4gTWVtb3JpZXMgYWxsb2NhdGVkIGZvciBvbGQgc3BzIGZyZWVkCisgICAgICAgICAqIG90aGVyd2lzZSBmcmVlIG1lbWVyaWVzIGFsbG9jYXRlZCBmb3IganVzdCBkZWNvZGVkIHNwcyBhbmQKKyAgICAgICAgICogY29udGludWUgKi8KKyAgICAgICAgaWYgKGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzKHBTZXFQYXJhbVNldCwgcFN0b3JhZ2UtPmFjdGl2ZVNwcykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2lkXS0+b2Zmc2V0Rm9yUmVmRnJhbWUpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2lkXS0+dnVpUGFyYW1ldGVycyk7CisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTICsgMTsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMgKyAxOworICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IE5VTEw7CisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSRUUocFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgICAgICBGUkVFKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycyk7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBvdmVyd3JpdGUgc2VxIHBhcmFtIHNldCBvdGhlciB0aGFuIGFjdGl2ZSBvbmUgLT4gZnJlZSBtZW1vcmllcworICAgICAqIGFsbG9jYXRlZCBmb3Igb2xkIHBhcmFtIHNldCAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPm9mZnNldEZvclJlZkZyYW1lKTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2lkXS0+dnVpUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgKnBTdG9yYWdlLT5zcHNbaWRdID0gKnBTZXFQYXJhbVNldDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU3RvcmUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGludG8gdGhlIHN0b3JhZ2UuIElmIGFjdGl2ZSBQUFMgaXMKKyAgICAgICAgICAgIG92ZXJ3cml0dGVuIC0+IGNoZWNrIGlmIGFjdGl2ZSBTUFMgY2hhbmdlcyBhbmQgaWYgaXQgZG9lcyAtPiBzZXQKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgdG8gZm9yY2UgcmVhY3RpdmF0aW9uIG9mIHBhcmFtZXRlciBzZXRzCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBwb2ludGVyIHRvIHBhcmFtIHNldCB0byBiZSBzdG9yZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgICAgICAgc3VjY2VzcworICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaWQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7CisgICAgQVNTRVJUKHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA8IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpOworCisgICAgaWQgPSBwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkOworCisgICAgLyogcGljIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBub3QgdXNlZCBiZWZvcmUgLT4gYWxsb2NhdGUgbWVtb3J5ICovCisgICAgaWYgKHBTdG9yYWdlLT5wcHNbaWRdID09IE5VTEwpCisgICAgeworICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+cHBzW2lkXSwgMSwgcGljUGFyYW1TZXRfdCk7CisgICAgICAgIGlmIChwU3RvcmFnZS0+cHBzW2lkXSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICB9CisgICAgLyogcGljdHVyZSBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgZXF1YWwgdG8gaWQgb2YgYWN0aXZlIHBwcyAqLworICAgIGVsc2UgaWYgKGlkID09IHBTdG9yYWdlLT5hY3RpdmVQcHNJZCkKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgc2VxIHBhcmFtIHNldCBjaGFuZ2VzLCBmb3JjZSByZS1hY3RpdmF0aW9uIG9mCisgICAgICAgICAqIHBhcmFtIHNldCBpZiBpdCBkb2VzLiBTZXQgYWN0aXZlU3BzSWQgdG8gaW52YWxpZCB2YWx1ZSB0bworICAgICAgICAgKiBhY2NvbXBsaXNoIHRoaXMgKi8KKyAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgIT0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkKQorICAgICAgICB7CisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTICsgMTsKKyAgICAgICAgfQorICAgICAgICAvKiBmcmVlIG1lbW9yaWVzIGFsbG9jYXRlZCBmb3Igb2xkIHBhcmFtIHNldCAqLworICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ydW5MZW5ndGgpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT50b3BMZWZ0KTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+Ym90dG9tUmlnaHQpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5zbGljZUdyb3VwSWQpOworICAgIH0KKyAgICAvKiBvdmVyd3JpdGUgcGljIHBhcmFtIHNldCBvdGhlciB0aGFuIGFjdGl2ZSBvbmUgLT4gZnJlZSBtZW1vcmllcworICAgICAqIGFsbG9jYXRlZCBmb3Igb2xkIHBhcmFtIHNldCAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnJ1bkxlbmd0aCk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnRvcExlZnQpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ib3R0b21SaWdodCk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnNsaWNlR3JvdXBJZCk7CisgICAgfQorCisgICAgKnBTdG9yYWdlLT5wcHNbaWRdID0gKnBQaWNQYXJhbVNldDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEFjdGl2YXRlIGNlcnRhaW4gU1BTL1BQUyBjb21iaW5hdGlvbi4gVGhpcyBmdW5jdGlvbiBzaGFsbCBiZQorICAgICAgICAgICAgY2FsbGVkIGluIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwaWN0dXJlLiBQaWN0dXJlIHBhcmFtZXRlciBzZXQKKyAgICAgICAgICAgIGNhbiBiZSBjaGFuZ2VkIGFzIHdhbnRlZCwgYnV0IHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgbWF5IG9ubHkgYmUKKyAgICAgICAgICAgIGNoYW5nZWQgd2hlbiB0aGUgc3RhcnRpbmcgcGljdHVyZSBpcyBhbiBJRFIgcGljdHVyZS4KKworICAgICAgICAgICAgV2hlbiBuZXcgU1BTIGlzIGFjdGl2YXRlZCB0aGUgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IKKyAgICAgICAgICAgIG1hY3JvYmxvY2sgc3RvcmFnZXMgYW5kIHNsaWNlIGdyb3VwIG1hcCBhbmQgKHJlLSlpbml0aWFsaXplcyB0aGUKKyAgICAgICAgICAgIGRlY29kZWQgcGljdHVyZSBidWZmZXIuIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBhY3RpdmF0aW9uIHRoZSBvbGQKKyAgICAgICAgICAgIGFsbG9jYXRpb25zIGFyZSBmcmVlZCBhbmQgRnJlZURwYiBjYWxsZWQgYmVmb3JlIG5ldyBhbGxvY2F0aW9ucy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwcHNJZCAgICAgICAgICAgaWRlbnRpZmllcyB0aGUgUFBTIHRvIGJlIGFjdGl2YXRlZCwgU1BTIGlkIG9idGFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgUFBTCisgICAgICAgICAgICBpc0lkciAgICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgcGljdHVyZSBpcyBhbiBJRFIgcGljdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgbm9uLWV4aXN0aW5nIG9yIGludmFsaWQgcGFyYW0gc2V0IGNvbWJpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeWluZyB0byBjaGFuZ2UgU1BTIHdpdGggbm9uLUlEUiBwaWN0dXJlCisgICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAgICAgZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBwcHNJZCwgdTMyIGlzSWRyKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisgICAgdTMyIGZsYWc7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKHBwc0lkIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUyk7CisKKyAgICAvKiBjaGVjayB0aGF0IHBwcyBhbmQgY29ycmVzcG9uZGluZyBzcHMgZXhpc3QgKi8KKyAgICBpZiAoIChwU3RvcmFnZS0+cHBzW3Bwc0lkXSA9PSBOVUxMKSB8fAorICAgICAgICAgKHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1twcHNJZF0tPnNlcVBhcmFtZXRlclNldElkXSA9PSBOVUxMKSApCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogY2hlY2sgdGhhdCBwcHMgcGFyYW1ldGVycyBkbyBub3QgdmlvbGF0ZSBwaWN0dXJlIHNpemUgY29uc3RyYWludHMgKi8KKyAgICB0bXAgPSBDaGVja1BwcyhwU3RvcmFnZS0+cHBzW3Bwc0lkXSwKKyAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5wcHNbcHBzSWRdLT5zZXFQYXJhbWV0ZXJTZXRJZF0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGZpcnN0IGFjdGl2YXRpb24gcGFydDEgKi8KKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID09IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpCisgICAgeworICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBwcHNJZDsKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOworICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBwU3RvcmFnZS0+YWN0aXZlUHBzLT5zZXFQYXJhbWV0ZXJTZXRJZDsKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkXTsKKyAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyA9CisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzICoKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzOworCisgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPndpZHRoID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1iczsKKyAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+aGVpZ2h0ID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnM7CisKKyAgICAgICAgcFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uID0gSEFOVFJPX1RSVUU7CisgICAgfQorICAgIC8qIGZpcnN0IGFjdGl2YXRpb24gcGFydDIgKi8KKyAgICBlbHNlIGlmIChwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24pCisgICAgeworICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+bWIpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwKTsKKworICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+bWIsIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIG1iU3RvcmFnZV90KTsKKyAgICAgICAgQUxMT0NBVEUocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIHUzMik7CisgICAgICAgIGlmIChwU3RvcmFnZS0+bWIgPT0gTlVMTCB8fCBwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKworICAgICAgICBIMjY0U3dEZWNNZW1zZXQocFN0b3JhZ2UtPm1iLCAwLAorICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyAqIHNpemVvZihtYlN0b3JhZ2VfdCkpOworCisgICAgICAgIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzKHBTdG9yYWdlLT5tYiwKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMsCisgICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKTsKKworICAgICAgICAvKiBkcGIgb3V0cHV0IHJlb3JkZXJpbmcgZGlzYWJsZWQgaWYKKyAgICAgICAgICogMSkgYXBwbGljYXRpb24gc2V0IG5vUmVvcmRlcmluZyBmbGFnCisgICAgICAgICAqIDIpIFBPQyB0eXBlIGVxdWFsIHRvIDIKKyAgICAgICAgICogMykgbnVtX3Jlb3JkZXJfZnJhbWVzIGluIHZ1aSBlcXVhbCB0byAwICovCisgICAgICAgIGlmICggcFN0b3JhZ2UtPm5vUmVvcmRlcmluZyB8fAorICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY09yZGVyQ250VHlwZSA9PSAyIHx8CisgICAgICAgICAgICAgKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgorICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcgJiYKKyAgICAgICAgICAgICAgIXBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMpICkKKyAgICAgICAgICAgIGZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhZyA9IEhBTlRST19GQUxTRTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkUmVzZXREcGIocFN0b3JhZ2UtPmRwYiwKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5tYXhEcGJTaXplLAorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+bnVtUmVmRnJhbWVzLAorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+bWF4RnJhbWVOdW0sCisgICAgICAgICAgICBmbGFnKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAocHBzSWQgIT0gcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkKQorICAgIHsKKyAgICAgICAgLyogc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBzaGFsbCBub3QgY2hhbmdlIGJ1dCBiZWZvcmUgYW4gSURSIHBpY3R1cmUgKi8KKyAgICAgICAgaWYgKHBTdG9yYWdlLT5wcHNbcHBzSWRdLT5zZXFQYXJhbWV0ZXJTZXRJZCAhPSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiU0VRIFBBUkFNIFNFVCBDSEFOR0lORy4uLlxuIikpOworICAgICAgICAgICAgaWYgKGlzSWRyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IHBwc0lkOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBwU3RvcmFnZS0+cHBzW3Bwc0lkXTsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBwU3RvcmFnZS0+YWN0aXZlUHBzLT5zZXFQYXJhbWV0ZXJTZXRJZDsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+YWN0aXZlU3BzSWRdOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMgPQorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzICoKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnM7CisKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT53aWR0aCA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnM7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+aGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnM7CisKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERUJVRygoIlRSWUlORyBUTyBDSEFOR0UgU1BTIElOIE5PTi1JRFIgU0xJQ0VcbiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBwcHNJZDsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBwU3RvcmFnZS0+cHBzW3Bwc0lkXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFJlc2V0U3RvcmFnZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBSZXNldCBjb250ZW50cyBvZiB0aGUgc3RvcmFnZS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZQorICAgICAgICAgICAgcHJvY2Vzc2luZyBvZiBuZXcgaW1hZ2UgaXMgc3RhcnRlZC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZFJlc2V0U3RvcmFnZShzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgcFN0b3JhZ2UtPnNsaWNlLT5udW1EZWNvZGVkTWJzID0gMDsKKyAgICBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7IGkrKykKKyAgICB7CisgICAgICAgIHBTdG9yYWdlLT5tYltpXS5zbGljZUlkID0gMDsKKyAgICAgICAgcFN0b3JhZ2UtPm1iW2ldLmRlY29kZWQgPSAwOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERldGVybWluZSBpZiB0aGUgZGVjb2RlciBpcyBpbiB0aGUgc3RhcnQgb2YgYSBwaWN0dXJlLiBUaGlzCisgICAgICAgICAgICBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgdG8gZGVjaWRlIGlmIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cyBhbmQKKyAgICAgICAgICAgIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2FsbGVkLiBGdW5jdGlvbgorICAgICAgICAgICAgY29uc2lkZXJzIHRoYXQgbmV3IHBpY3R1cmUgaXMgc3RhcnRpbmcgaWYgbm8gc2xpY2UgaGVhZGVycworICAgICAgICAgICAgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGZvciB0aGUgY3VycmVudCBhY2Nlc3MgdW5pdC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX1RSVUUgICAgICAgIG5ldyBwaWN0dXJlIGlzIHN0YXJ0aW5nCisgICAgICAgICAgICBIQU5UUk9fRkFMU0UgICAgICAgbm90IHN0YXJ0aW5nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSXNTdGFydE9mUGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworCisvKiBDb2RlICovCisKKyAgICBpZiAocFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPT0gSEFOVFJPX0ZBTFNFKQorICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNFbmRPZlBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBkZWNvZGVyIGlzIGluIHRoZSBlbmQgb2YgYSBwaWN0dXJlLiBUaGlzCisgICAgICAgICAgICBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGVibG9ja2luZyBmaWx0ZXJpbmcKKyAgICAgICAgICAgIGFuZCByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3NlcyBzaG91bGQgYmUgcGVyZm9ybWVkLgorCisgICAgICAgICAgICBJZiB0aGUgZGVjb2RlciBpcyBwcm9jZXNzaW5nIHByaW1hcnkgc2xpY2VzIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgIGlzIGRldGVybWluZWQgYnkgY2hlY2tpbmcgdGhlIHZhbHVlIG9mIG51bURlY29kZWRNYnMgaW4gdGhlCisgICAgICAgICAgICBzdG9yYWdlLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGRlY29kZXIgaXMgcHJvY2Vzc2luZworICAgICAgICAgICAgcmVkdW5kYW50IHNsaWNlcyB0aGUgbnVtRGVjb2RlZE1icyBtYXkgbm90IGNvbnRhaW4gdmFsaWQKKyAgICAgICAgICAgIGluZm9ybWF0aW9uYSBhbmQgZWFjaCBtYWNyb2Jsb2NrIGhhcyB0byBiZSBjaGVja2VkIHNlcGFyYXRlbHkuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19UUlVFICAgICAgICBlbmQgb2YgcGljdHVyZQorICAgICAgICAgICAgSEFOVFJPX0ZBTFNFICAgICAgIG5vdXAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJc0VuZE9mUGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIC8qIHByaW1hcnkgcGljdHVyZSAqLworICAgIGlmICghcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzBdLnJlZHVuZGFudFBpY0NudCkKKyAgICB7CisgICAgICAgIGlmIChwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgPT0gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOyBpKyspCisgICAgICAgICAgICB0bXAgKz0gcFN0b3JhZ2UtPm1iW2ldLmRlY29kZWQgPyAxIDogMDsKKworICAgICAgICBpZiAodG1wID09IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvbXB1dGUgc2xpY2UgZ3JvdXAgbWFwLiBKdXN0IGNhbGwgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAgd2l0aAorICAgICAgICAgICAgYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisKKy8qIENvZGUgKi8KKworICAgIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcywgc2xpY2VHcm91cENoYW5nZUN5Y2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDaGVjayBpZiBuZXh0IE5BTCB1bml0IHN0YXJ0cyBhIG5ldyBhY2Nlc3MgdW5pdC4gRm9sbG93aW5nCisgICAgICAgICAgICBjb25kaXRpb25zIHNwZWNpZnkgc3RhcnQgb2YgYSBuZXcgYWNjZXNzIHVuaXQ6CisKKyAgICAgICAgICAgICAgICAtTkFMIHVuaXQgdHlwZXMgNi0xMSwgMTMtMTggKGUuZy4gU1BTLCBQUFMpCisKKyAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgY2hlY2tlZCBvbmx5IGZvciBzbGljZSBOQUwgdW5pdHMsIHZhbHVlcworICAgICAgICAgICBjb21wYXJlZCB0byBvbmVzIG9idGFpbmVkIGZyb20gcHJldmlvdXMgc2xpY2U6CisKKyAgICAgICAgICAgICAgICAtTkFMIHVuaXQgdHlwZSBkaWZmZXJzIChzbGljZSAvIElEUiBzbGljZSkKKyAgICAgICAgICAgICAgICAtZnJhbWVfbnVtIGRpZmZlcnMKKyAgICAgICAgICAgICAgICAtbmFsX3JlZl9pZGMgZGlmZmVycyBhbmQgb25lIG9mIHRoZSB2YWx1ZXMgaXMgMAorICAgICAgICAgICAgICAgIC1QT0MgaW5mb3JtYXRpb24gZGlmZmVycworICAgICAgICAgICAgICAgIC1ib3RoIGFyZSBJRFIgc2xpY2VzIGFuZCBpZHJfcGljX2lkIGRpZmZlcnMKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBzdHJtICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbnVOZXh0ICAgICAgcG9pbnRlciB0byBOQUwgdW5pdCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHN0b3JhZ2UgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyAgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaGVyZSwgVFJVRSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB1bml0IGJvdW5kYXJ5LCBGQUxTRSBvdGhlcndpc2UKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgICAgIGZhaWx1cmUsIGludmFsaWQgc3RyZWFtIGRhdGEKKyAgICAgICAgICAgIFBBUkFNX1NFVF9FUlJPUiAgICAgaW52YWxpZCBwYXJhbSBzZXQgdXNhZ2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKKyAgc3RybURhdGFfdCAqc3RybSwKKyAgbmFsVW5pdF90ICpudU5leHQsCisgIHN0b3JhZ2VfdCAqc3RvcmFnZSwKKyAgdTMyICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHBwc0lkLCBmcmFtZU51bSwgaWRyUGljSWQsIHBpY09yZGVyQ250THNiOworICAgIGkzMiBkZWx0YVBpY09yZGVyQ250Qm90dG9tLCBkZWx0YVBpY09yZGVyQ250WzJdOworICAgIHNlcVBhcmFtU2V0X3QgKnNwczsKKyAgICBwaWNQYXJhbVNldF90ICpwcHM7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChzdHJtKTsKKyAgICBBU1NFUlQobnVOZXh0KTsKKyAgICBBU1NFUlQoc3RvcmFnZSk7CisgICAgQVNTRVJUKHN0b3JhZ2UtPnNwcyk7CisgICAgQVNTRVJUKHN0b3JhZ2UtPnBwcyk7CisKKyAgICAvKiBpbml0aWFsaXplIGRlZmF1bHQgb3V0cHV0IHRvIEZBTFNFICovCisgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAoICggKG51TmV4dC0+bmFsVW5pdFR5cGUgPiA1KSAmJiAobnVOZXh0LT5uYWxVbml0VHlwZSA8IDEyKSApIHx8CisgICAgICAgICAoIChudU5leHQtPm5hbFVuaXRUeXBlID4gMTIpICYmIChudU5leHQtPm5hbFVuaXRUeXBlIDw9IDE4KSApICkKKyAgICB7CisgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICBlbHNlIGlmICggbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0UgJiYKKyAgICAgICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSICkKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKworICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIHZlcnkgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uICovCisgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+Zmlyc3RDYWxsRmxhZykKKyAgICB7CisgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHN0b3JhZ2UtPmF1Yi0+Zmlyc3RDYWxsRmxhZyA9IEhBTlRST19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBnZXQgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGlkICovCisgICAgdG1wID0gaDI2NGJzZENoZWNrUHBzSWQoc3RybSwgJnBwc0lkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBzdG9yZSBzcHMgYW5kIHBwcyBpbiBzZXBhcmF0ZSBwb2ludGVycyBqdXN0IHRvIG1ha2UgbmFtZXMgc2hvcnRlciAqLworICAgIHBwcyA9IHN0b3JhZ2UtPnBwc1twcHNJZF07CisgICAgaWYgKCBwcHMgPT0gTlVMTCB8fCBzdG9yYWdlLT5zcHNbcHBzLT5zZXFQYXJhbWV0ZXJTZXRJZF0gPT0gTlVMTCAgfHwKKyAgICAgICAgIChzdG9yYWdlLT5hY3RpdmVTcHNJZCAhPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTICYmCisgICAgICAgICAgcHBzLT5zZXFQYXJhbWV0ZXJTZXRJZCAhPSBzdG9yYWdlLT5hY3RpdmVTcHNJZCAmJgorICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUikgKQorICAgICAgICByZXR1cm4oUEFSQU1fU0VUX0VSUk9SKTsKKyAgICBzcHMgPSBzdG9yYWdlLT5zcHNbcHBzLT5zZXFQYXJhbWV0ZXJTZXRJZF07CisKKyAgICBpZiAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFJlZklkYyAhPSBudU5leHQtPm5hbFJlZklkYyAmJgorICAgICAgKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxSZWZJZGMgPT0gMCB8fCBudU5leHQtPm5hbFJlZklkYyA9PSAwKSkKKyAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKworICAgIGlmICgoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgJiYKKyAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIpIHx8CisgICAgICAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIgJiYKKyAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpKQorICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworCisgICAgdG1wID0gaDI2NGJzZENoZWNrRnJhbWVOdW0oc3RybSwgc3BzLT5tYXhGcmFtZU51bSwgJmZyYW1lTnVtKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkZyYW1lTnVtICE9IGZyYW1lTnVtKQorICAgIHsKKyAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2RnJhbWVOdW0gPSBmcmFtZU51bTsKKyAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisKKyAgICBpZiAobnVOZXh0LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrSWRyUGljSWQoc3RybSwgc3BzLT5tYXhGcmFtZU51bSwgbnVOZXh0LT5uYWxVbml0VHlwZSwKKyAgICAgICAgICAmaWRyUGljSWQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgJiYKKyAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZJZHJQaWNJZCAhPSBpZHJQaWNJZCkKKyAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisKKyAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2SWRyUGljSWQgPSBpZHJQaWNJZDsKKyAgICB9CisKKyAgICBpZiAoc3BzLT5waWNPcmRlckNudFR5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiKHN0cm0sIHNwcywgbnVOZXh0LT5uYWxVbml0VHlwZSwKKyAgICAgICAgICAmcGljT3JkZXJDbnRMc2IpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2UGljT3JkZXJDbnRMc2IgIT0gcGljT3JkZXJDbnRMc2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldlBpY09yZGVyQ250THNiID0gcGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBwcy0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbShzdHJtLCBzcHMsCisgICAgICAgICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSwgJmRlbHRhUGljT3JkZXJDbnRCb3R0b20pOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250Qm90dG9tICE9CisgICAgICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudEJvdHRvbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250Qm90dG9tID0KKyAgICAgICAgICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudEJvdHRvbTsKKyAgICAgICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHNwcy0+cGljT3JkZXJDbnRUeXBlID09IDEgJiYgIXNwcy0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudChzdHJtLCBzcHMsIG51TmV4dC0+bmFsVW5pdFR5cGUsCisgICAgICAgICAgcHBzLT5waWNPcmRlclByZXNlbnRGbGFnLCBkZWx0YVBpY09yZGVyQ250KTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFswXSAhPSBkZWx0YVBpY09yZGVyQ250WzBdKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzBdID0gZGVsdGFQaWNPcmRlckNudFswXTsKKyAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHBzLT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMV0gIT0gZGVsdGFQaWNPcmRlckNudFsxXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzFdID0gZGVsdGFQaWNPcmRlckNudFsxXTsKKyAgICAgICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgfQorICAgIH0KKworICAgICpzdG9yYWdlLT5hdWItPm51UHJldiA9ICpudU5leHQ7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IENoZWNrUHBzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIHBpY3R1cmUgcGFyYW1ldGVyIHNldC4gQ29udGVudHMgb2YgdGhlIHBpY3R1cmUgcGFyYW1ldGVyCisgICAgICAgICAgICBzZXQgaW5mb3JtYXRpb24gdGhhdCBkZXBlbmRzIG9uIHRoZSBpbWFnZSBkaW1lbnNpb25zIGlzIGNoZWNrZWQKKyAgICAgICAgICAgIGFnYWluc3QgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIHNwcy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwcHMgICAgIHBvaW50ZXIgdG8gcGljdHVyZSBwYXJhbXRlciBzZXQKKyAgICAgICAgICAgIHNwcyAgICAgcG9pbnRlciB0byBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgZXZlcnl0aGluZyBvaworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgaW52YWxpZCBkYXRhIGluIHBpY3R1cmUgcGFyYW1ldGVyIHNldAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIENoZWNrUHBzKHBpY1BhcmFtU2V0X3QgKnBwcywgc2VxUGFyYW1TZXRfdCAqc3BzKQoreworCisgICAgdTMyIGk7CisgICAgdTMyIHBpY1NpemU7CisKKyAgICBwaWNTaXplID0gc3BzLT5waWNXaWR0aEluTWJzICogc3BzLT5waWNIZWlnaHRJbk1iczsKKworICAgIC8qIGNoZWNrIHNsaWNlIGdyb3VwIHBhcmFtcyAqLworICAgIGlmIChwcHMtPm51bVNsaWNlR3JvdXBzID4gMSkKKyAgICB7CisgICAgICAgIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChwcHMtPnJ1bkxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1TbGljZUdyb3VwczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwcHMtPnJ1bkxlbmd0aFtpXSA+IHBpY1NpemUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChwcHMtPnRvcExlZnQpOworICAgICAgICAgICAgQVNTRVJUKHBwcy0+Ym90dG9tUmlnaHQpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcy0+bnVtU2xpY2VHcm91cHMtMTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwcHMtPnRvcExlZnRbaV0gPiBwcHMtPmJvdHRvbVJpZ2h0W2ldIHx8CisgICAgICAgICAgICAgICAgICAgIHBwcy0+Ym90dG9tUmlnaHRbaV0gPj0gcGljU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgICAgICAgICAgaWYgKCAocHBzLT50b3BMZWZ0W2ldICUgc3BzLT5waWNXaWR0aEluTWJzKSA+CisgICAgICAgICAgICAgICAgICAgICAocHBzLT5ib3R0b21SaWdodFtpXSAlIHNwcy0+cGljV2lkdGhJbk1icykgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA+IDIgJiYgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwcHMtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlID4gcGljU2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSA2ICYmCisgICAgICAgICAgICAgICAgIHBwcy0+cGljU2l6ZUluTWFwVW5pdHMgPCBwaWNTaXplKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RWYWxpZFBhcmFtU2V0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDaGVjayBpZiBhbnkgdmFsaWQgU1BTL1BQUyBjb21iaW5hdGlvbiBleGlzdHMgaW4gdGhlIHN0b3JhZ2UuCisgICAgICAgICAgICBGdW5jdGlvbiB0cmllcyBlYWNoIFBQUyBpbiB0aGUgYnVmZmVyIGFuZCBjaGVja3MgaWYgY29ycmVzcG9uZGluZworICAgICAgICAgICAgU1BTIGV4aXN0cyBhbmQgY2FsbHMgQ2hlY2tQcHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBQUFMgY29uZm9ybXMKKyAgICAgICAgICAgIHRvIGltYWdlIGRpbWVuc2lvbnMgb2YgdGhlIFNQUy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIEhBTlRST19PSyAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB2YWxpZCBjb21iaW5hdGlvbgorICAgICAgICAgICAgSEFOVFJPX05PSyAgbm8gdmFsaWQgY29tYmluYXRpb25zIGZvdW5kCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFM7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggcFN0b3JhZ2UtPnBwc1tpXSAmJgorICAgICAgICAgICAgIHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1tpXS0+c2VxUGFyYW1ldGVyU2V0SWRdICYmCisgICAgICAgICAgICAgQ2hlY2tQcHMocFN0b3JhZ2UtPnBwc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5wcHNbaV0tPnNlcVBhcmFtZXRlclNldElkXSkgPT0KKyAgICAgICAgICAgICAgICAgSEFOVFJPX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTNiMmRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TVE9SQUdFX0gKKyNkZWZpbmUgSDI2NFNXREVDX1NUT1JBR0VfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgorI2luY2x1ZGUgImgyNjRic2RfcGljX29yZGVyX2NudC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHNsaWNlSWQ7CisgICAgdTMyIG51bURlY29kZWRNYnM7CisgICAgdTMyIGxhc3RNYkFkZHI7Cit9IHNsaWNlU3RvcmFnZV90OworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGFjY2VzcyB1bml0IGJvdW5kYXJ5IGNoZWNraW5nICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIG5hbFVuaXRfdCBudVByZXZbMV07CisgICAgdTMyIHByZXZGcmFtZU51bTsKKyAgICB1MzIgcHJldklkclBpY0lkOworICAgIHUzMiBwcmV2UGljT3JkZXJDbnRMc2I7CisgICAgaTMyIHByZXZEZWx0YVBpY09yZGVyQ250Qm90dG9tOworICAgIGkzMiBwcmV2RGVsdGFQaWNPcmRlckNudFsyXTsKKyAgICB1MzIgZmlyc3RDYWxsRmxhZzsKK30gYXViQ2hlY2tfdDsKKworLyogc3RvcmFnZSBkYXRhIHN0cnVjdHVyZSwgaG9sZHMgYWxsIGRhdGEgb2YgYSBkZWNvZGVyIGluc3RhbmNlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIGFjdGl2ZSBwYXJhbWV0IHNldCBpZHMgYW5kIHBvaW50ZXJzICovCisgICAgdTMyIG9sZFNwc0lkOworICAgIHUzMiBhY3RpdmVQcHNJZDsKKyAgICB1MzIgYWN0aXZlU3BzSWQ7CisgICAgcGljUGFyYW1TZXRfdCAqYWN0aXZlUHBzOworICAgIHNlcVBhcmFtU2V0X3QgKmFjdGl2ZVNwczsKKyAgICBzZXFQYXJhbVNldF90ICpzcHNbTUFYX05VTV9TRVFfUEFSQU1fU0VUU107CisgICAgcGljUGFyYW1TZXRfdCAqcHBzW01BWF9OVU1fUElDX1BBUkFNX1NFVFNdOworCisgICAgLyogY3VycmVudCBzbGljZSBncm91cCBtYXAsIHJlY29tcHV0ZWQgZm9yIGVhY2ggc2xpY2UgKi8KKyAgICB1MzIgKnNsaWNlR3JvdXBNYXA7CisKKyAgICB1MzIgcGljU2l6ZUluTWJzOworCisgICAgLyogdGhpcyBmbGFnIGlzIHNldCBhZnRlciBhbGwgbWFjcm9ibG9ja3Mgb2YgYSBwaWN0dXJlIHN1Y2Nlc3NmdWxseQorICAgICAqIGRlY29kZWQgLT4gcmVkdW5kYW50IHNsaWNlcyBub3QgZGVjb2RlZCAqLworICAgIHUzMiBza2lwUmVkdW5kYW50U2xpY2VzOworICAgIHUzMiBwaWNTdGFydGVkOworCisgICAgLyogZmxhZyB0byBpbmRpY2F0ZSBpZiBjdXJyZW50IGFjY2VzcyB1bml0IGNvbnRhaW5zIGFueSB2YWxpZCBzbGljZXMgKi8KKyAgICB1MzIgdmFsaWRTbGljZUluQWNjZXNzVW5pdDsKKworICAgIC8qIHN0b3JlIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgaGFuZGxpbmcgb2Ygc2xpY2UgZGVjb2RpbmcgKi8KKyAgICBzbGljZVN0b3JhZ2VfdCBzbGljZVsxXTsKKworICAgIC8qIG51bWJlciBvZiBjb25jZWFsZWQgbWFjcm9ibG9ja3MgaW4gdGhlIGN1cnJlbnQgaW1hZ2UgKi8KKyAgICB1MzIgbnVtQ29uY2VhbGVkTWJzOworCisgICAgLyogcGljSWQgZ2l2ZW4gYnkgYXBwbGljYXRpb24gKi8KKyAgICB1MzIgY3VycmVudFBpY0lkOworCisgICAgLyogbWFjcm9ibG9jayBzcGVjaWZpYyBzdG9yYWdlcywgc2l6ZSBkZXRlcm1pbmVkIGJ5IGltYWdlIGRpbWVuc2lvbnMgKi8KKyAgICBtYlN0b3JhZ2VfdCAqbWI7CisKKyAgICAvKiBmbGFnIHRvIHN0b3JlIG5vT3V0cHV0UmVvcmRlcmluZyBmbGFnIHNldCBieSB0aGUgYXBwbGljYXRpb24gKi8KKyAgICB1MzIgbm9SZW9yZGVyaW5nOworCisgICAgLyogRFBCICovCisgICAgZHBiU3RvcmFnZV90IGRwYlsxXTsKKworICAgIC8qIHN0cnVjdHVyZSB0byBzdG9yZSBwaWN0dXJlIG9yZGVyIGNvdW50IHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KKyAgICBwb2NTdG9yYWdlX3QgcG9jWzFdOworCisgICAgLyogYWNjZXNzIHVuaXQgYm91bmRhcnkgY2hlY2tpbmcgcmVsYXRlZCBkYXRhICovCisgICAgYXViQ2hlY2tfdCBhdWJbMV07CisKKyAgICAvKiBjdXJyZW50IHByb2Nlc3NlZCBpbWFnZSAqLworICAgIGltYWdlX3QgY3VyckltYWdlWzFdOworCisgICAgLyogbGFzdCB2YWxpZCBOQUwgdW5pdCBoZWFkZXIgaXMgc3RvcmVkIGhlcmUgKi8KKyAgICBuYWxVbml0X3QgcHJldk5hbFVuaXRbMV07CisKKyAgICAvKiBzbGljZSBoZWFkZXIsIHNlY29uZCBzdHJ1Y3R1cmUgdXNlZCBhcyBhIHRlbXBvcmFyeSBzdG9yYWdlIHdoaWxlCisgICAgICogZGVjb2Rpbmcgc2xpY2UgaGVhZGVyLCBmaXJzdCBvbmUgc3RvcmVzIGxhc3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQKKyAgICAgKiBzbGljZSBoZWFkZXIgKi8KKyAgICBzbGljZUhlYWRlcl90IHNsaWNlSGVhZGVyWzJdOworCisgICAgLyogZmllbGRzIHRvIHN0b3JlIG9sZCBzdHJlYW0gYnVmZmVyIHBvaW50ZXJzLCBuZWVkZWQgd2hlbiBvbmx5IHBhcnQgb2YKKyAgICAgKiBhIHN0cmVhbSBidWZmZXIgaXMgcHJvY2Vzc2VkIGJ5IGgyNjRic2REZWNvZGUgZnVuY3Rpb24gKi8KKyAgICB1MzIgcHJldkJ1Zk5vdEZpbmlzaGVkOworICAgIHU4ICpwcmV2QnVmUG9pbnRlcjsKKyAgICB1MzIgcHJldkJ5dGVzQ29uc3VtZWQ7CisgICAgc3RybURhdGFfdCBzdHJtWzFdOworCisgICAgLyogbWFjcm9ibG9jayBsYXllciBzdHJ1Y3R1cmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3RvcmUgdGhpcyBidXQgaXQKKyAgICAgKiB3b3VsZCBoYXZlIGluY3JlYXNlZCB0aGUgc3RhY2sgc2l6ZSBleGNlc3NpdmVseSBhbmQgbmVlZGVkIHRvIGJlCisgICAgICogYWxsb2NhdGVkIGZyb20gaGVhZCAtPiBlYXNpZXN0IHRvIHB1dCBpdCBoZXJlICovCisgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXI7CisKKyAgICB1MzIgcGVuZGluZ0FjdGl2YXRpb247IC8qIEFjdGl2YXRlIHBhcmFtZXRlciBzZXRzIGFmdGVyIHJldHVybmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBREVSU19SRFkgdG8gdGhlIHVzZXIgKi8KKyAgICB1MzIgaW50cmFDb25jZWFsbWVudEZsYWc7IC8qIDAgZ3JheSBwaWN0dXJlIGZvciBjb3JydXB0ZWQgaW50cmEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgcHJldmlvdXMgZnJhbWUgdXNlZCBpZiBhdmFpbGFibGUgKi8KK30gc3RvcmFnZV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEluaXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordm9pZCBoMjY0YnNkUmVzZXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordTMyIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordTMyIGgyNjRic2RJc0VuZE9mUGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpOwordTMyIGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCk7Cit1MzIgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBwcHNJZCwgdTMyIGlzSWRyKTsKK3ZvaWQgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCisgICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSk7CisKK3UzMiBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkoCisgIHN0cm1EYXRhX3QgKnN0cm0sCisgIG5hbFVuaXRfdCAqbnVOZXh0LAorICBzdG9yYWdlX3QgKnN0b3JhZ2UsCisgIHUzMiAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyk7CisKK3UzMiBoMjY0YnNkVmFsaWRQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NUT1JBR0VfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjBkMTA4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYwpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RHZXRCaXRzCisgICAgICAgICAgaDI2NGJzZFNob3dCaXRzMzIKKyAgICAgICAgICBoMjY0YnNkRmx1c2hCaXRzCisgICAgICAgICAgaDI2NGJzZElzQnl0ZUFsaWduZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEdldEJpdHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUmVhZCBhbmQgcmVtb3ZlIGJpdHMgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlci4KKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBudW1CaXRzICAgICBudW1iZXIgb2YgYml0cyB0byByZWFkCisKKyAgICAgICAgT3V0cHV0OgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBiaXRzIHJlYWQgZnJvbSBzdHJlYW0KKyAgICAgICAgICAgIEVORF9PRl9TVFJFQU0gaWYgbm90IGVub3VnaCBiaXRzIGxlZnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RHZXRCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpCit7CisKKyAgICB1MzIgb3V0OworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKG51bUJpdHMgPCAzMik7CisKKyAgICBvdXQgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpID4+ICgzMiAtIG51bUJpdHMpOworCisgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCBudW1CaXRzKSA9PSBIQU5UUk9fT0spCisgICAgeworICAgICAgICByZXR1cm4ob3V0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuKEVORF9PRl9TVFJFQU0pOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RTaG93Qml0czMyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFJlYWQgMzIgYml0cyBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyLiBCdWZmZXIgaXMgbGVmdCBhcyBpdCBpcywgaS5lLgorICAgICAgICAgICAgbm8gYml0cyBhcmUgcmVtb3ZlZC4gRmlyc3QgYml0IHJlYWQgZnJvbSB0aGUgc3RyZWFtIGlzIHRoZSBNU0Igb2YKKyAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggYml0cyBpbiB0aGUgYnVmZmVyIC0+CisgICAgICAgICAgICBiaXRzIGJleW9uZyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gYXJlIHNldCB0byAnMCcgaW4gdGhlIHJldHVybgorICAgICAgICAgICAgdmFsdWUuCisKKyAgICAgICAgSW5wdXQ6CisgICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dDoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgYml0cyByZWFkIGZyb20gc3RyZWFtCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkU2hvd0JpdHMzMihzdHJtRGF0YV90ICpwU3RybURhdGEpCit7CisKKyAgICBpMzIgYml0cywgc2hpZnQ7CisgICAgdTMyIG91dDsKKyAgICB1OCAqcFN0cm07CisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpOworICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA8IDgpOworICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA9PQorICAgICAgICAgICAocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICYgMHg3KSk7CisKKyAgICBwU3RybSA9IHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zOworCisgICAgLyogbnVtYmVyIG9mIGJpdHMgbGVmdCBpbiB0aGUgYnVmZmVyICovCisgICAgYml0cyA9IChpMzIpcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUqOCAtIChpMzIpcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzOworCisgICAgLyogYXQgbGVhc3QgMzItYml0cyBpbiB0aGUgYnVmZmVyICovCisgICAgaWYgKGJpdHMgPj0gMzIpCisgICAgeworICAgICAgICB1MzIgYml0UG9zSW5Xb3JkID0gcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQ7CisgICAgICAgIG91dCA9ICgodTMyKXBTdHJtWzBdIDw8IDI0KSB8ICgodTMyKXBTdHJtWzFdIDw8IDE2KSB8CisgICAgICAgICAgICAgICgodTMyKXBTdHJtWzJdIDw8ICA4KSB8ICgodTMyKXBTdHJtWzNdKTsKKworICAgICAgICBpZiAoYml0UG9zSW5Xb3JkKQorICAgICAgICB7CisgICAgICAgICAgICB1MzIgYnl0ZSA9ICh1MzIpcFN0cm1bNF07CisgICAgICAgICAgICB1MzIgdG1wID0gKDgtYml0UG9zSW5Xb3JkKTsKKyAgICAgICAgICAgIG91dCA8PD0gYml0UG9zSW5Xb3JkOworICAgICAgICAgICAgb3V0IHw9IGJ5dGU+PnRtcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG91dCk7CisgICAgfQorICAgIC8qIGF0IGxlYXN0IG9uZSBiaXQgaW4gdGhlIGJ1ZmZlciAqLworICAgIGVsc2UgaWYgKGJpdHMgPiAwKQorICAgIHsKKyAgICAgICAgc2hpZnQgPSAoaTMyKSgyNCArIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKTsKKyAgICAgICAgb3V0ID0gKHUzMikoKnBTdHJtKyspIDw8IHNoaWZ0OworICAgICAgICBiaXRzIC09IChpMzIpKDggLSBwU3RybURhdGEtPmJpdFBvc0luV29yZCk7CisgICAgICAgIHdoaWxlIChiaXRzID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2hpZnQgLT0gODsKKyAgICAgICAgICAgIG91dCB8PSAodTMyKSgqcFN0cm0rKykgPDwgc2hpZnQ7CisgICAgICAgICAgICBiaXRzIC09IDg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChvdXQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAoMCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCaXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFJlbW92ZSBiaXRzIGZyb20gdGhlIHN0cmVhbSBidWZmZXIKKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbnVtQml0cyAgICAgICAgIG51bWJlciBvZiBiaXRzIHRvIHJlbW92ZQorCisgICAgICAgIE91dHB1dDoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEVORF9PRl9TVFJFQU0gICBub3QgZW5vdWdoIGJpdHMgbGVmdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX05FT04KK3UzMiBoMjY0YnNkRmx1c2hCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpCit7CisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPCA4KTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPT0gKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAmIDB4NykpOworCisgICAgcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICs9IG51bUJpdHM7CisgICAgcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPSBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgJiAweDc7CisgICAgaWYgKCAocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICkgPD0gKDgqcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUpICkKKyAgICB7CisgICAgICAgIHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCArCisgICAgICAgICAgICAocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzID4+IDMpOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4oRU5EX09GX1NUUkVBTSk7CisKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNCeXRlQWxpZ25lZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDaGVjayBpZiBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiBpcyBieXRlIGFsaWduZWQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBUUlVFICAgICAgICBzdHJlYW0gaXMgYnl0ZSBhbGlnbmVkCisgICAgICAgICAgICBGQUxTRSAgICAgICBzdHJlYW0gaXMgbm90IGJ5dGUgYWxpZ25lZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZElzQnl0ZUFsaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgaWYgKCFwU3RybURhdGEtPmJpdFBvc0luV29yZCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NDA0YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfU1RSRUFNX0gKKyNkZWZpbmUgSDI2NFNXREVDX1NUUkVBTV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHU4ICAqcFN0cm1CdWZmU3RhcnQ7ICAgIC8qIHBvaW50ZXIgdG8gc3RhcnQgb2Ygc3RyZWFtIGJ1ZmZlciAqLworICAgIHU4ICAqcFN0cm1DdXJyUG9zOyAgICAgIC8qIGN1cnJlbnQgcmVhZCBhZGRyZXNzIGluIHN0cmVhbSBidWZmZXIgKi8KKyAgICB1MzIgIGJpdFBvc0luV29yZDsgICAgICAvKiBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIGJ1ZmZlciBieXRlICovCisgICAgdTMyICBzdHJtQnVmZlNpemU7ICAgICAgLyogc2l6ZSBvZiBzdHJlYW0gYnVmZmVyIChieXRlcykgKi8KKyAgICB1MzIgIHN0cm1CdWZmUmVhZEJpdHM7ICAvKiBudW1iZXIgb2YgYml0cyByZWFkIGZyb20gc3RyZWFtIGJ1ZmZlciAqLworfSBzdHJtRGF0YV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkR2V0Qml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKTsKKwordTMyIGgyNjRic2RTaG93Qml0czMyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSk7CisKK3UzMiBoMjY0YnNkRmx1c2hCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpOworCit1MzIgaDI2NGJzZElzQnl0ZUFsaWduZWQoc3RybURhdGFfdCAqKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU1RSRUFNX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlYjZkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0Jsb2NrCisgICAgICAgICAgaDI2NGJzZFByb2Nlc3NMdW1hRGMKKyAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3RyYW5zZm9ybS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgorICogSW5mbyA3MDE6IFNoaWZ0IGxlZnQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCisgKiBJbmZvIDcwMjogU2hpZnQgcmlnaHQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCisgKi8KKy8qbGludCAtZTcwMSAtZTcwMiAqLworCisvKiBMZXZlbFNjYWxlIGZ1bmN0aW9uICovCitzdGF0aWMgY29uc3QgaTMyIGxldmVsU2NhbGVbNl1bM10gPSB7CisgICAgezEwLDEzLDE2fSwgezExLDE0LDE4fSwgezEzLDE2LDIwfSwgezE0LDE4LDIzfSwgezE2LDIwLDI1fSwgezE4LDIzLDI5fX07CisKKy8qIHFwICUgNiBhcyBhIGZ1bmN0aW9uIG9mIHFwICovCitzdGF0aWMgY29uc3QgdTggcXBNb2Q2WzUyXSA9IHswLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwKKyAgICAwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzfTsKKworLyogcXAgLyA2IGFzIGEgZnVuY3Rpb24gb2YgcXAgKi8KK3N0YXRpYyBjb25zdCB1OCBxcERpdjZbNTJdID0gezAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDIsMiwyLDIsMiwyLDMsMywzLDMsMywzLAorICAgIDQsNCw0LDQsNCw0LDUsNSw1LDUsNSw1LDYsNiw2LDYsNiw2LDcsNyw3LDcsNyw3LDgsOCw4LDh9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFByb2Nlc3NCbG9jaworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIHppZy16YWcgc2NhbiwgaW52ZXJzZSBzY2FsaW5nIGFuZAorICAgICAgICAgICAgaW52ZXJzZSB0cmFuc2Zvcm0gZm9yIGEgbHVtYSBvciBhIGNocm9tYSByZXNpZHVhbCBibG9jaworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgICAgICBxcCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlcgorICAgICAgICAgICAgc2tpcCAgICAgICAgICAgIHNraXAgcHJvY2Vzc2luZyBvZiBkYXRhWzBdLCBzZXQgdG8gbm9uLXplcm8gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYyBjb2VmZiBoYW5sZWQgc2VwYXJhdGVseQorICAgICAgICAgICAgY29lZmZNYXAgICAgICAgIDE2IGxzYidzIGluZGljYXRlIHdoaWNoIGNvZWZmcyBhcmUgbm9uLXplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDAgKGxzYikgZm9yIGNvZWZmIDAsIGJpdCAxIGZvciBjb2VmZiAxIGV0Yy4KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHByb2Nlc3NlZCBkYXRhCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgcHJvY2Vzc2VkIGRhdGEgbm90IGluIHZhbGlkIHJhbmdlIFstNTEyLCA1MTFdCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZFByb2Nlc3NCbG9jayhpMzIgKmRhdGEsIHUzMiBxcCwgdTMyIHNraXAsIHUzMiBjb2VmZk1hcCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICBpMzIgZDEsIGQyLCBkMzsKKyAgICB1MzIgcm93LGNvbDsKKyAgICB1MzIgcXBEaXY7CisgICAgaTMyICpwdHI7CisKKy8qIENvZGUgKi8KKworICAgIHFwRGl2ID0gcXBEaXY2W3FwXTsKKyAgICB0bXAxID0gbGV2ZWxTY2FsZVtxcE1vZDZbcXBdXVswXSA8PCBxcERpdjsKKyAgICB0bXAyID0gbGV2ZWxTY2FsZVtxcE1vZDZbcXBdXVsxXSA8PCBxcERpdjsKKyAgICB0bXAzID0gbGV2ZWxTY2FsZVtxcE1vZDZbcXBdXVsyXSA8PCBxcERpdjsKKworICAgIGlmICghc2tpcCkKKyAgICAgICAgZGF0YVswXSA9IChkYXRhWzBdICogdG1wMSk7CisKKyAgICAvKiBhdCBsZWFzdCBvbmUgb2YgdGhlIHJvd3MgMSwgMiBvciAzIGNvbnRhaW4gbm9uLXplcm8gY29lZmZzLCBtYXNrIHRha2VzCisgICAgICogdGhlIHNjYW5uaW5nIG9yZGVyIGludG8gYWNjb3VudCAqLworICAgIGlmIChjb2VmZk1hcCAmIDB4RkY5QykKKyAgICB7CisgICAgICAgIC8qIGRvIHRoZSB6aWctemFnIHNjYW4gYW5kIGludmVyc2UgcXVhbnRpemF0aW9uICovCisgICAgICAgIGQxID0gZGF0YVsxXTsKKyAgICAgICAgZDIgPSBkYXRhWzE0XTsKKyAgICAgICAgZDMgPSBkYXRhWzE1XTsKKyAgICAgICAgZGF0YVsxXSA9IChkMSAqIHRtcDIpOworICAgICAgICBkYXRhWzE0XSA9IChkMiAqIHRtcDIpOworICAgICAgICBkYXRhWzE1XSA9IChkMyAqIHRtcDMpOworCisgICAgICAgIGQxID0gZGF0YVsyXTsKKyAgICAgICAgZDIgPSBkYXRhWzVdOworICAgICAgICBkMyA9IGRhdGFbNF07CisgICAgICAgIGRhdGFbNF0gPSAoZDEgKiB0bXAyKTsKKyAgICAgICAgZGF0YVsyXSAgPSAoZDIgKiB0bXAxKTsKKyAgICAgICAgZGF0YVs1XSA9IChkMyAqIHRtcDMpOworCisgICAgICAgIGQxID0gZGF0YVs4XTsKKyAgICAgICAgZDIgPSBkYXRhWzNdOworICAgICAgICBkMyA9IGRhdGFbNl07CisgICAgICAgIHRtcDAgPSAoZDEgKiB0bXAyKTsKKyAgICAgICAgZGF0YVs4XSA9IChkMiAqIHRtcDEpOworICAgICAgICBkYXRhWzNdICA9IChkMyAqIHRtcDIpOworICAgICAgICBkMSA9IGRhdGFbN107CisgICAgICAgIGQyID0gZGF0YVsxMl07CisgICAgICAgIGQzID0gZGF0YVs5XTsKKyAgICAgICAgZGF0YVs2XSAgPSAoZDEgKiB0bXAyKTsKKyAgICAgICAgZGF0YVs3XSAgPSAoZDIgKiB0bXAzKTsKKyAgICAgICAgZGF0YVsxMl0gPSAoZDMgKiB0bXAyKTsKKyAgICAgICAgZGF0YVs5XSAgPSB0bXAwOworCisgICAgICAgIGQxID0gZGF0YVsxMF07CisgICAgICAgIGQyID0gZGF0YVsxMV07CisgICAgICAgIGQzID0gZGF0YVsxM107CisgICAgICAgIGRhdGFbMTNdID0gKGQxICogdG1wMyk7CisgICAgICAgIGRhdGFbMTBdID0gKGQyICogdG1wMSk7CisgICAgICAgIGRhdGFbMTFdID0gKGQzICogdG1wMik7CisKKyAgICAgICAgLyogaG9yaXpvbnRhbCB0cmFuc2Zvcm0gKi8KKyAgICAgICAgZm9yIChyb3cgPSA0LCBwdHIgPSBkYXRhOyByb3ctLTsgcHRyICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDAgPSBwdHJbMF0gKyBwdHJbMl07CisgICAgICAgICAgICB0bXAxID0gcHRyWzBdIC0gcHRyWzJdOworICAgICAgICAgICAgdG1wMiA9IChwdHJbMV0gPj4gMSkgLSBwdHJbM107CisgICAgICAgICAgICB0bXAzID0gcHRyWzFdICsgKHB0clszXSA+PiAxKTsKKyAgICAgICAgICAgIHB0clswXSA9IHRtcDAgKyB0bXAzOworICAgICAgICAgICAgcHRyWzFdID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICBwdHJbMl0gPSB0bXAxIC0gdG1wMjsKKyAgICAgICAgICAgIHB0clszXSA9IHRtcDAgLSB0bXAzOworICAgICAgICB9CisKKyAgICAgICAgLypsaW50ICtlNjYxICtlNjYyKi8KKyAgICAgICAgLyogdGhlbiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gKi8KKyAgICAgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbOF07CisgICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbOF07CisgICAgICAgICAgICB0bXAyID0gKGRhdGFbNF0gPj4gMSkgLSBkYXRhWzEyXTsKKyAgICAgICAgICAgIHRtcDMgPSBkYXRhWzRdICsgKGRhdGFbMTJdID4+IDEpOworICAgICAgICAgICAgZGF0YVswIF0gPSAodG1wMCArIHRtcDMgKyAzMik+PjY7CisgICAgICAgICAgICBkYXRhWzQgXSA9ICh0bXAxICsgdG1wMiArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbOCBdID0gKHRtcDEgLSB0bXAyICsgMzIpPj42OworICAgICAgICAgICAgZGF0YVsxMl0gPSAodG1wMCAtIHRtcDMgKyAzMik+PjY7CisgICAgICAgICAgICAvKiBjaGVjayB0aGF0IGVhY2ggdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFstNTEyLDUxMV0gKi8KKyAgICAgICAgICAgIGlmICgoKHUzMikoZGF0YVswXSArIDUxMikgPiAxMDIzKSB8fAorICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzRdICsgNTEyKSA+IDEwMjMpIHx8CisgICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbOF0gKyA1MTIpID4gMTAyMykgfHwKKyAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVsxMl0gKyA1MTIpID4gMTAyMykgKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIHJvd3MgMSwgMiBhbmQgMyBhcmUgemVybyAqLworICAgIHsKKyAgICAgICAgLyogb25seSBkYy1jb2VmZiBpcyBub24temVybywgaS5lLiBjb2VmZnMgYXQgb3JpZ2luYWwgcG9zaXRpb25zCisgICAgICAgICAqIDEsIDUgYW5kIDYgYXJlIHplcm8gKi8KKyAgICAgICAgaWYgKChjb2VmZk1hcCAmIDB4NjIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDAgPSAoZGF0YVswXSArIDMyKSA+PiA2OworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWy01MTIsNTExXSAqLworICAgICAgICAgICAgaWYgKCh1MzIpKHRtcDAgKyA1MTIpID4gMTAyMykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBkYXRhWzBdID0gZGF0YVsxXSAgPSBkYXRhWzJdICA9IGRhdGFbM10gID0gZGF0YVs0XSAgPSBkYXRhWzVdICA9CisgICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAgPSBkYXRhWzddICA9IGRhdGFbOF0gID0gZGF0YVs5XSAgPSBkYXRhWzEwXSA9CisgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxMV0gPSBkYXRhWzEyXSA9IGRhdGFbMTNdID0gZGF0YVsxNF0gPSBkYXRhWzE1XSA9CisgICAgICAgICAgICAgICAgICAgICAgdG1wMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGF0IGxlYXN0IG9uZSBvZiB0aGUgY29lZmZzIDEsIDUgb3IgNiBpcyBub24temVybyAqLworICAgICAgICB7CisgICAgICAgICAgICBkYXRhWzFdID0gKGRhdGFbMV0gKiB0bXAyKTsKKyAgICAgICAgICAgIGRhdGFbMl0gPSAoZGF0YVs1XSAqIHRtcDEpOworICAgICAgICAgICAgZGF0YVszXSA9IChkYXRhWzZdICogdG1wMik7CisgICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbMl07CisgICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbMl07CisgICAgICAgICAgICB0bXAyID0gKGRhdGFbMV0gPj4gMSkgLSBkYXRhWzNdOworICAgICAgICAgICAgdG1wMyA9IGRhdGFbMV0gKyAoZGF0YVszXSA+PiAxKTsKKyAgICAgICAgICAgIGRhdGFbMF0gPSAodG1wMCArIHRtcDMgKyAzMik+PjY7CisgICAgICAgICAgICBkYXRhWzFdID0gKHRtcDEgKyB0bXAyICsgMzIpPj42OworICAgICAgICAgICAgZGF0YVsyXSA9ICh0bXAxIC0gdG1wMiArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbM10gPSAodG1wMCAtIHRtcDMgKyAzMik+PjY7CisgICAgICAgICAgICBkYXRhWzRdID0gZGF0YVs4XSA9IGRhdGFbMTJdID0gZGF0YVswXTsKKyAgICAgICAgICAgIGRhdGFbNV0gPSBkYXRhWzldID0gZGF0YVsxM10gPSBkYXRhWzFdOworICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbMTBdID0gZGF0YVsxNF0gPSBkYXRhWzJdOworICAgICAgICAgICAgZGF0YVs3XSA9IGRhdGFbMTFdID0gZGF0YVsxNV0gPSBkYXRhWzNdOworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCBlYWNoIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbLTUxMiw1MTFdICovCisgICAgICAgICAgICBpZiAoKCh1MzIpKGRhdGFbMF0gKyA1MTIpID4gMTAyMykgfHwKKyAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVsxXSArIDUxMikgPiAxMDIzKSB8fAorICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzJdICsgNTEyKSA+IDEwMjMpIHx8CisgICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbM10gKyA1MTIpID4gMTAyMykgKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFByb2Nlc3NMdW1hRGMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSB6aWctemFnIHNjYW4sIGludmVyc2UgdHJhbnNmb3JtIGFuZAorICAgICAgICAgICAgaW52ZXJzZSBzY2FsaW5nIGZvciBhIGx1bWEgREMgY29lZmZpY2llbnRzIGJsb2NrCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBwcm9jZXNzZWQKKyAgICAgICAgICAgIHFwICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwcm9jZXNzZWQgZGF0YQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGgyNjRic2RQcm9jZXNzTHVtYURjKGkzMiAqZGF0YSwgdTMyIHFwKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHUzMiByb3csY29sOworICAgIHUzMiBxcE1vZCwgcXBEaXY7CisgICAgaTMyIGxldlNjYWxlOworICAgIGkzMiAqcHRyOworCisvKiBDb2RlICovCisKKyAgICBxcE1vZCA9IHFwTW9kNltxcF07CisgICAgcXBEaXYgPSBxcERpdjZbcXBdOworCisgICAgLyogemlnLXphZyBzY2FuICovCisgICAgdG1wMCA9IGRhdGFbMl07CisgICAgZGF0YVsyXSAgPSBkYXRhWzVdOworICAgIGRhdGFbNV0gPSBkYXRhWzRdOworICAgIGRhdGFbNF0gPSB0bXAwOworCisgICAgdG1wMCA9IGRhdGFbOF07CisgICAgZGF0YVs4XSA9IGRhdGFbM107CisgICAgZGF0YVszXSAgPSBkYXRhWzZdOworICAgIGRhdGFbNl0gID0gZGF0YVs3XTsKKyAgICBkYXRhWzddICA9IGRhdGFbMTJdOworICAgIGRhdGFbMTJdID0gZGF0YVs5XTsKKyAgICBkYXRhWzldICA9IHRtcDA7CisKKyAgICB0bXAwID0gZGF0YVsxMF07CisgICAgZGF0YVsxMF0gPSBkYXRhWzExXTsKKyAgICBkYXRhWzExXSA9IGRhdGFbMTNdOworICAgIGRhdGFbMTNdID0gdG1wMDsKKworICAgIC8qIGhvcml6b250YWwgdHJhbnNmb3JtICovCisgICAgZm9yIChyb3cgPSA0LCBwdHIgPSBkYXRhOyByb3ctLTsgcHRyICs9IDQpCisgICAgeworICAgICAgICB0bXAwID0gcHRyWzBdICsgcHRyWzJdOworICAgICAgICB0bXAxID0gcHRyWzBdIC0gcHRyWzJdOworICAgICAgICB0bXAyID0gcHRyWzFdIC0gcHRyWzNdOworICAgICAgICB0bXAzID0gcHRyWzFdICsgcHRyWzNdOworICAgICAgICBwdHJbMF0gPSB0bXAwICsgdG1wMzsKKyAgICAgICAgcHRyWzFdID0gdG1wMSArIHRtcDI7CisgICAgICAgIHB0clsyXSA9IHRtcDEgLSB0bXAyOworICAgICAgICBwdHJbM10gPSB0bXAwIC0gdG1wMzsKKyAgICB9CisKKyAgICAvKmxpbnQgK2U2NjEgK2U2NjIqLworICAgIC8qIHRoZW4gdmVydGljYWwgdHJhbnNmb3JtIGFuZCBpbnZlcnNlIHNjYWxpbmcgKi8KKyAgICBsZXZTY2FsZSA9IGxldmVsU2NhbGVbIHFwTW9kIF1bMF07CisgICAgaWYgKHFwID49IDEyKQorICAgIHsKKyAgICAgICAgbGV2U2NhbGUgPDw9IChxcERpdi0yKTsKKyAgICAgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbOCBdOworICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzggXTsKKyAgICAgICAgICAgIHRtcDIgPSBkYXRhWzRdIC0gZGF0YVsxMl07CisgICAgICAgICAgICB0bXAzID0gZGF0YVs0XSArIGRhdGFbMTJdOworICAgICAgICAgICAgZGF0YVswIF0gPSAoKHRtcDAgKyB0bXAzKSpsZXZTY2FsZSk7CisgICAgICAgICAgICBkYXRhWzQgXSA9ICgodG1wMSArIHRtcDIpKmxldlNjYWxlKTsKKyAgICAgICAgICAgIGRhdGFbOCBdID0gKCh0bXAxIC0gdG1wMikqbGV2U2NhbGUpOworICAgICAgICAgICAgZGF0YVsxMl0gPSAoKHRtcDAgLSB0bXAzKSpsZXZTY2FsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaTMyIHRtcDsKKyAgICAgICAgdG1wID0gKCgxIC0gcXBEaXYpID09IDApID8gMSA6IDI7CisgICAgICAgIGZvciAoY29sID0gNDsgY29sLS07IGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzggXTsKKyAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVs4IF07CisgICAgICAgICAgICB0bXAyID0gZGF0YVs0XSAtIGRhdGFbMTJdOworICAgICAgICAgICAgdG1wMyA9IGRhdGFbNF0gKyBkYXRhWzEyXTsKKyAgICAgICAgICAgIGRhdGFbMCBdID0gKCh0bXAwICsgdG1wMykqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7CisgICAgICAgICAgICBkYXRhWzQgXSA9ICgodG1wMSArIHRtcDIpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOworICAgICAgICAgICAgZGF0YVs4IF0gPSAoKHRtcDEgLSB0bXAyKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKKyAgICAgICAgICAgIGRhdGFbMTJdID0gKCh0bXAwIC0gdG1wMykqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgdHJhbnNmb3JtIGFuZCBpbnZlcnNlIHNjYWxpbmcgZm9yIGEKKyAgICAgICAgICAgIGNocm9tYSBEQyBjb2VmZmljaWVudHMgYmxvY2sKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICAgICAgcG9pbnRlciB0byBkYXRhIHRvIGJlIHByb2Nlc3NlZAorICAgICAgICAgICAgcXAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHByb2Nlc3NlZCBkYXRhCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYyhpMzIgKmRhdGEsIHUzMiBxcCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB1MzIgcXBEaXY7CisgICAgaTMyIGxldlNjYWxlOworICAgIHUzMiBsZXZTaGlmdDsKKworLyogQ29kZSAqLworCisgICAgcXBEaXYgPSBxcERpdjZbcXBdOworICAgIGxldlNjYWxlID0gbGV2ZWxTY2FsZVsgcXBNb2Q2W3FwXSBdWzBdOworCisgICAgaWYgKHFwID49IDYpCisgICAgeworICAgICAgICBsZXZTY2FsZSA8PD0gKHFwRGl2LTEpOworICAgICAgICBsZXZTaGlmdCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxldlNoaWZ0ID0gMTsKKyAgICB9CisKKyAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbMl07CisgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzJdOworICAgIHRtcDIgPSBkYXRhWzFdIC0gZGF0YVszXTsKKyAgICB0bXAzID0gZGF0YVsxXSArIGRhdGFbM107CisgICAgZGF0YVswXSA9ICgodG1wMCArIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworICAgIGRhdGFbMV0gPSAoKHRtcDAgLSB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKyAgICBkYXRhWzJdID0gKCh0bXAxICsgdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgZGF0YVszXSA9ICgodG1wMSAtIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworICAgIHRtcDAgPSBkYXRhWzRdICsgZGF0YVs2XTsKKyAgICB0bXAxID0gZGF0YVs0XSAtIGRhdGFbNl07CisgICAgdG1wMiA9IGRhdGFbNV0gLSBkYXRhWzddOworICAgIHRtcDMgPSBkYXRhWzVdICsgZGF0YVs3XTsKKyAgICBkYXRhWzRdID0gKCh0bXAwICsgdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgZGF0YVs1XSA9ICgodG1wMCAtIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworICAgIGRhdGFbNl0gPSAoKHRtcDEgKyB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKyAgICBkYXRhWzddID0gKCh0bXAxIC0gdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisKK30KKworLypsaW50ICtlNzAxICtlNzAyICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmNDFhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19UUkFOU0ZPUk1fSAorI2RlZmluZSBIMjY0U1dERUNfVFJBTlNGT1JNX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RQcm9jZXNzQmxvY2soaTMyICpkYXRhLCB1MzIgcXAsIHUzMiBza2lwLCB1MzIgY29lZmZNYXApOwordm9pZCBoMjY0YnNkUHJvY2Vzc0x1bWFEYyhpMzIgKmRhdGEsIHUzMiBxcCk7Cit2b2lkIGgyNjRic2RQcm9jZXNzQ2hyb21hRGMoaTMyICpkYXRhLCB1MzIgcXApOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19UUkFOU0ZPUk1fSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41M2IyZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcworICAgICAgICAgIGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzCisgICAgICAgICAgaDI2NGJzZE1vcmVSYnNwRGF0YQorICAgICAgICAgIGgyNjRic2ROZXh0TWJBZGRyZXNzCisgICAgICAgICAgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogbG9vay11cCB0YWJsZSBmb3IgZXhwZWN0ZWQgdmFsdWVzIG9mIHN0dWZmaW5nIGJpdHMgKi8KK3N0YXRpYyBjb25zdCB1MzIgc3R1ZmZpbmdUYWJsZVs4XSA9IHsweDEsMHgyLDB4NCwweDgsMHgxMCwweDIwLDB4NDAsMHg4MH07CisKKy8qIGxvb2stdXAgdGFibGUgZm9yIGNocm9tYSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzIGEgZnVuY3Rpb24gb2YgbHVtYSBRUCAqLworY29uc3QgdTMyIGgyNjRic2RRcENbNTJdID0gezAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksCisgICAgMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMjksMzAsMzEsMzIsMzIsMzMsMzQsMzQsMzUsMzUsMzYsMzYsMzcsMzcsMzcsCisgICAgMzgsMzgsMzgsMzksMzksMzksMzl9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMSAgRnVuY3Rpb246IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb3VudCBsZWFkaW5nIHplcm9zIGluIGEgY29kZSB3b3JkLiBDb2RlIHdvcmQgaXMgYXNzdW1lZCB0byBiZQorICAgICAgICAgICAgcmlnaHQtYWxpZ25lZCwgbGFzdCBiaXQgb2YgdGhlIGNvZGUgd29yZCBpbiB0aGUgbHNiIG9mIHRoZSB2YWx1ZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICB2YWx1ZSAgIGNvZGUgd29yZAorICAgICAgICAgICAgbGVuZ3RoICBudW1iZXIgb2YgYml0cyBpbiB0aGUgY29kZSB3b3JkCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MgaW4gdGhlIGNvZGUgd29yZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX05FT04KK3UzMiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3ModTMyIHZhbHVlLCB1MzIgbGVuZ3RoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB6ZXJvcyA9IDA7CisgICAgdTMyIG1hc2sgPSAxIDw8IChsZW5ndGggLSAxKTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGxlbmd0aCA8PSAzMik7CisKKyAgICB3aGlsZSAobWFzayAmJiAhKHZhbHVlICYgbWFzaykpCisgICAgeworICAgICAgICB6ZXJvcysrOworICAgICAgICBtYXNrID4+PSAxOworICAgIH0KKyAgICByZXR1cm4oemVyb3MpOworCit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMiAgRnVuY3Rpb246IGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIFJhdyBCeXRlIFN0cmVhbSBQYXlsb2FkIChSQlNQKSB0cmFpbGluZyBiaXRzLCBpLmUuIHN0dWZmaW5nLgorICAgICAgICAgICAgUmVzdCBvZiB0aGUgY3VycmVudCBieXRlICh3aG9sZSBieXRlIGlmIGFsbHJlYWR5IGJ5dGUgYWxpZ25lZCkKKyAgICAgICAgICAgIGluIHRoZSBzdHJlYW0gYnVmZmVyIHNoYWxsIGNvbnRhaW4gYSAnMScgYml0IGZvbGxvd2VkIGJ5IHplcm8gb3IKKyAgICAgICAgICAgIG1vcmUgJzAnIGJpdHMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBSQlNQIHRyYWlsaW5nIGJpdHMgZm91bmQKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBzdHVmZmluZzsKKyAgICB1MzIgc3R1ZmZpbmdMZW5ndGg7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA8IDgpOworCisgICAgc3R1ZmZpbmdMZW5ndGggPSA4IC0gcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQ7CisKKyAgICBzdHVmZmluZyA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgc3R1ZmZpbmdMZW5ndGgpOworICAgIGlmIChzdHVmZmluZyA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBpZiAoc3R1ZmZpbmcgIT0gc3R1ZmZpbmdUYWJsZVtzdHVmZmluZ0xlbmd0aCAtIDFdKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjMgIEZ1bmN0aW9uOiBoMjY0YnNkTW9yZVJic3BEYXRhCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSBpbiB0aGUgY3VycmVudCBSQlNQLiBUaGUgc3RhbmRhcmQKKyAgICAgICAgICAgIGRlZmluZXMgdGhpcyBmdW5jdGlvbiBzbyB0aGF0IHRoZXJlIGlzIG1vcmUgZGF0YSBpZgorICAgICAgICAgICAgICAgIC1tb3JlIHRoYW4gOCBiaXRzIGxlZnQgb3IKKyAgICAgICAgICAgICAgICAtbGFzdCBiaXRzIGFyZSBub3QgUkJTUCB0cmFpbGluZyBiaXRzCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fVFJVRSAgICB0aGVyZSBpcyBtb3JlIGRhdGEKKyAgICAgICAgICAgIEhBTlRST19GQUxTRSAgIG5vIG1vcmUgZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE1vcmVSYnNwRGF0YShzdHJtRGF0YV90ICpwU3RybURhdGEpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGJpdHM7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgPD0gOCAqIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplKTsKKworICAgIGJpdHMgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSAqIDggLSBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHM7CisKKyAgICBpZiAoYml0cyA9PSAwKQorICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworICAgIGlmICggKGJpdHMgPiA4KSB8fAorICAgICAgICAgKChoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpPj4oMzItYml0cykpICE9ICgxIDw8IChiaXRzLTEpKSkgKQorICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS40ICBGdW5jdGlvbjogaDI2NGJzZE5leHRNYkFkZHJlc3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFkZHJlc3Mgb2YgdGhlIG5leHQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBzbGljZSBncm91cC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU2xpY2VHcm91cE1hcCAgICAgIHNsaWNlIGdyb3VwIGZvciBlYWNoIG1hY3JvYmxvY2sKKyAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICAgICAgc2l6ZSBvZiB0aGUgcGljdHVyZQorICAgICAgICAgICAgY3Vyck1iQWRkciAgICAgICAgICB3aGVyZSB0byBzdGFydAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIG5leHQgbWFjcm9ibG9jaworICAgICAgICAgICAgMCAgIGlmIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBtYWNyb2Jsb2NrcyBiZWxvbmcgdG8gc2FtZSBzbGljZQorICAgICAgICAgICAgICAgIGdyb3VwIGFzIGN1cnJNYkFkZHIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2ROZXh0TWJBZGRyZXNzKHUzMiAqcFNsaWNlR3JvdXBNYXAsIHUzMiBwaWNTaXplSW5NYnMsIHUzMiBjdXJyTWJBZGRyKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBzbGljZUdyb3VwLCB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU2xpY2VHcm91cE1hcCk7CisgICAgQVNTRVJUKHBpY1NpemVJbk1icyk7CisgICAgQVNTRVJUKGN1cnJNYkFkZHIgPCBwaWNTaXplSW5NYnMpOworCisgICAgc2xpY2VHcm91cCA9IHBTbGljZUdyb3VwTWFwW2N1cnJNYkFkZHJdOworCisgICAgaSA9IGN1cnJNYkFkZHIgKyAxOworICAgIHRtcCA9IHBTbGljZUdyb3VwTWFwW2ldOworICAgIHdoaWxlICgoaSA8IHBpY1NpemVJbk1icykgJiYgKHRtcCAhPSBzbGljZUdyb3VwKSkKKyAgICB7CisgICAgICAgIGkrKzsKKyAgICAgICAgdG1wID0gcFNsaWNlR3JvdXBNYXBbaV07CisgICAgfQorCisgICAgaWYgKGkgPT0gcGljU2l6ZUluTWJzKQorICAgICAgICBpID0gMDsKKworICAgIHJldHVybihpKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuNSAgRnVuY3Rpb246IGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFNldCBsdW1hIGFuZCBjaHJvbWEgcG9pbnRlcnMgaW4gaW1hZ2VfdCBmb3IgY3VycmVudCBNQgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGltYWdlICAgICAgIEN1cnJlbnQgaW1hZ2UKKyAgICAgICAgICAgIG1iTnVtICAgICAgIG51bWJlciBvZiBjdXJyZW50IE1CCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSkKK3sKKyAgICB1MzIgd2lkdGgsIGhlaWdodDsKKyAgICB1MzIgcGljU2l6ZTsKKyAgICB1MzIgcm93LCBjb2w7CisgICAgdTMyIHRtcDsKKworICAgIHdpZHRoID0gaW1hZ2UtPndpZHRoOworICAgIGhlaWdodCA9IGltYWdlLT5oZWlnaHQ7CisgICAgcm93ID0gbWJOdW0gLyB3aWR0aDsKKyAgICBjb2wgPSBtYk51bSAlIHdpZHRoOworCisgICAgdG1wID0gcm93ICogd2lkdGg7CisgICAgcGljU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworCisgICAgaW1hZ2UtPmx1bWEgPSAodTgqKShpbWFnZS0+ZGF0YSArIGNvbCAqIDE2ICsgdG1wICogMjU2KTsKKyAgICBpbWFnZS0+Y2IgPSAodTgqKShpbWFnZS0+ZGF0YSArIHBpY1NpemUgKiAyNTYgKyB0bXAgKiA2NCArIGNvbCAqIDgpOworICAgIGltYWdlLT5jciA9ICh1OCopKGltYWdlLT5jYiArIHBpY1NpemUgKiA2NCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2IzYWRkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfVVRJTF9ICisjZGVmaW5lIEgyNjRTV0RFQ19VVElMX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBfQVNTRVJUX1VTRUQKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCisKKyNpZiBkZWZpbmVkKF9SQU5HRV9DSEVDSykgfHwgZGVmaW5lZChfREVCVUdfUFJJTlQpIHx8IGRlZmluZWQoX0VSUk9SX1BSSU5UKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgSEFOVFJPX09LICAgMAorI2RlZmluZSBIQU5UUk9fTk9LICAxCisKKyNkZWZpbmUgSEFOVFJPX1RSVUUgICAgICgxKQorI2RlZmluZSBIQU5UUk9fRkFMU0UgICAgKDApCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMIDAKKyNlbmRpZgorCisjZGVmaW5lIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SIDB4RkZGRgorI2RlZmluZSBQQVJBTV9TRVRfRVJST1IgMHhGRkYwCisKKy8qIHZhbHVlIHRvIGJlIHJldHVybmVkIGJ5IEdldEJpdHMgaWYgc3RyZWFtIGJ1ZmZlciBpcyBlbXB0eSAqLworI2RlZmluZSBFTkRfT0ZfU1RSRUFNIDB4RkZGRkZGRkZVCisKKyNkZWZpbmUgRU1QVFlfUkVTSURVQUxfSU5ESUNBVE9SIDB4RkZGRkZGCisKKy8qIG1hY3JvIHRvIG1hcmsgYSByZXNpZHVhbCBibG9jayBlbXB0eSwgaS5lLiBjb250YWluIHplcm8gY29lZmZpY2llbnRzICovCisjZGVmaW5lIE1BUktfUkVTSURVQUxfRU1QVFkocmVzaWR1YWwpICgocmVzaWR1YWwpWzBdID0gRU1QVFlfUkVTSURVQUxfSU5ESUNBVE9SKQorLyogbWFjcm8gdG8gY2hlY2sgaWYgcmVzaWR1YWwgYmxvY2sgaXMgZW1wdHkgKi8KKyNkZWZpbmUgSVNfUkVTSURVQUxfRU1QVFkocmVzaWR1YWwpICgocmVzaWR1YWwpWzBdID09IEVNUFRZX1JFU0lEVUFMX0lORElDQVRPUikKKworLyogbWFjcm8gZm9yIGFzc2VydGlvbiwgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX0FTU0VSVF9VU0VEIGlzIGRlZmluZWQgKi8KKyNpZmRlZiBfQVNTRVJUX1VTRUQKKyNkZWZpbmUgQVNTRVJUKGV4cHIpIGFzc2VydChleHByKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKGV4cHIpCisjZW5kaWYKKworLyogbWFjcm8gZm9yIHJhbmdlIGNoZWNraW5nIGFuIHZhbHVlLCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfUkFOR0VfQ0hFQ0sKKyAqIGlzIGRlZmluZWQgKi8KKyNpZmRlZiBfUkFOR0VfQ0hFQ0sKKyNkZWZpbmUgUkFOR0VfQ0hFQ0sodmFsdWUsIG1pbkJvdW5kLCBtYXhCb3VuZCkgXAoreyBcCisgICAgaWYgKCh2YWx1ZSkgPCAobWluQm91bmQpIHx8ICh2YWx1ZSkgPiAobWF4Qm91bmQpKSBcCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogVmFsdWUgZXhjZWVkcyBnaXZlbiBsaW1pdChzKSFcbiIpOyBcCit9CisjZWxzZQorI2RlZmluZSBSQU5HRV9DSEVDSyh2YWx1ZSwgbWluQm91bmQsIG1heEJvdW5kKQorI2VuZGlmCisKKy8qIG1hY3JvIGZvciByYW5nZSBjaGVja2luZyBhbiBhcnJheSwgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX1JBTkdFX0NIRUNLCisgKiBpcyBkZWZpbmVkICovCisjaWZkZWYgX1JBTkdFX0NIRUNLCisjZGVmaW5lIFJBTkdFX0NIRUNLX0FSUkFZKGFycmF5LCBtaW5Cb3VuZCwgbWF4Qm91bmQsIGxlbmd0aCkgXAoreyBcCisgICAgaTMyIGk7IFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGxlbmd0aCk7IGkrKykgXAorICAgICAgICBpZiAoKGFycmF5KVtpXSA8IChtaW5Cb3VuZCkgfHwgKGFycmF5KVtpXSA+IChtYXhCb3VuZCkpIFwKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJXYXJuaW5nOiBWYWx1ZSBbJWRdIGV4Y2VlZHMgZ2l2ZW4gbGltaXQocykhXG4iLGkpOyBcCit9CisjZWxzZQorI2RlZmluZSBSQU5HRV9DSEVDS19BUlJBWShhcnJheSwgbWluQm91bmQsIG1heEJvdW5kLCBsZW5ndGgpCisjZW5kaWYKKworLyogbWFjcm8gZm9yIGRlYnVnIHByaW50aW5nLCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfREVCVUdfUFJJTlQgaXMKKyAqIGRlZmluZWQgKi8KKyNpZmRlZiBfREVCVUdfUFJJTlQKKyNkZWZpbmUgREVCVUcoYXJncykgcHJpbnRmIGFyZ3MKKyNlbHNlCisjZGVmaW5lIERFQlVHKGFyZ3MpCisjZW5kaWYKKworLyogbWFjcm8gZm9yIGVycm9yIHByaW50aW5nLCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfRVJST1JfUFJJTlQgaXMKKyAqIGRlZmluZWQgKi8KKyNpZmRlZiBfRVJST1JfUFJJTlQKKyNkZWZpbmUgRVBSSU5UKG1zZykgZnByaW50ZihzdGRlcnIsIkVSUk9SOiAlc1xuIixtc2cpCisjZWxzZQorI2RlZmluZSBFUFJJTlQobXNnKQorI2VuZGlmCisKKy8qIG1hY3JvIHRvIGdldCBzbWFsbGVyIG9mIHR3byB2YWx1ZXMgKi8KKyNkZWZpbmUgTUlOKGEsIGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworLyogbWFjcm8gdG8gZ2V0IGdyZWF0ZXIgb2YgdHdvIHZhbHVlcyAqLworI2RlZmluZSBNQVgoYSwgYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorCisvKiBtYWNybyB0byBnZXQgYWJzb2x1dGUgdmFsdWUgKi8KKyNkZWZpbmUgQUJTKGEpICgoKGEpIDwgMCkgPyAtKGEpIDogKGEpKQorCisvKiBtYWNybyB0byBjbGlwIGEgdmFsdWUgeiwgc28gdGhhdCB4IDw9IHogPTwgeSAqLworI2RlZmluZSBDTElQMyh4LHkseikgKCgoeikgPCAoeCkpID8gKHgpIDogKCgoeikgPiAoeSkpID8gKHkpIDogKHopKSkKKworLyogbWFjcm8gdG8gY2xpcCBhIHZhbHVlIHosIHNvIHRoYXQgMCA8PSB6ID08IDI1NSAqLworI2RlZmluZSBDTElQMSh6KSAoKCh6KSA8IDApID8gMCA6ICgoKHopID4gMjU1KSA/IDI1NSA6ICh6KSkpCisKKy8qIG1hY3JvIHRvIGFsbG9jYXRlIG1lbW9yeSAqLworI2RlZmluZSBBTExPQ0FURShwdHIsIGNvdW50LCB0eXBlKSBcCit7IFwKKyAgICAocHRyKSA9IEgyNjRTd0RlY01hbGxvYygoY291bnQpICogc2l6ZW9mKHR5cGUpKTsgXAorfQorCisvKiBtYWNybyB0byBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyNkZWZpbmUgRlJFRShwdHIpIFwKK3sgXAorICAgIEgyNjRTd0RlY0ZyZWUoKHB0cikpOyAocHRyKSA9IE5VTEw7IFwKK30KKworI2RlZmluZSBBTElHTihwdHIsIGJ5dGVQb3MpIFwKKyAgICAgICAgKHB0ciArICggKChieXRlUG9zIC0gKGludClwdHIpICYgKGJ5dGVQb3MgLSAxKSkgLyBzaXplb2YoKnB0cikgKSkKKworZXh0ZXJuIGNvbnN0IHUzMiBoMjY0YnNkUXBDWzUyXTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfTkVPTgordTMyIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyh1MzIgdmFsdWUsIHUzMiBsZW5ndGgpOworI2Vsc2UKK3UzMiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3ModTMyIHZhbHVlKTsKKyNlbmRpZgordTMyIGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHN0cm1EYXRhX3QgKnN0cm1EYXRhKTsKKwordTMyIGgyNjRic2RNb3JlUmJzcERhdGEoc3RybURhdGFfdCAqc3RybURhdGEpOworCit1MzIgaDI2NGJzZE5leHRNYkFkZHJlc3ModTMyICpwU2xpY2VHcm91cE1hcCwgdTMyIHBpY1NpemVJbk1icywgdTMyIGN1cnJNYkFkZHIpOworCit2b2lkIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0pOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19VVElMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA2MGYzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkCisgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZAorICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZGVmaW5pdGlvbiBvZiBzcGVjaWFsIGNvZGUgbnVtLCB0aGlzIGFsb25nIHdpdGggdGhlIHJldHVybiB2YWx1ZSBpcyB1c2VkCisgKiB0byBoYW5kbGUgY29kZSBudW0gaW4gdGhlIHJhbmdlIFswLCAyXjMyXSBpbiB0aGUgRGVjb2RlRXhwR29sb21iVW5zaWduZWQKKyAqIGZ1bmN0aW9uICovCisjZGVmaW5lIEJJR19DT0RFX05VTSAweEZGRkZGRkZGVQorCisvKiBNYXBwaW5nIHRhYmxlcyBmb3IgY29kZWRfYmxvY2tfcGF0dGVybiwgdXNlZCBmb3IgZGVjb2Rpbmcgb2YgbWFwcGVkCisgKiBFeHAtR29sb21iIGNvZGVzICovCitzdGF0aWMgY29uc3QgdTggY29kZWRCbG9ja1BhdHRlcm5JbnRyYTR4NFs0OF0gPSB7CisgICAgNDcsMzEsMTUsMCwyMywyNywyOSwzMCw3LDExLDEzLDE0LDM5LDQzLDQ1LDQ2LDE2LDMsNSwxMCwxMiwxOSwyMSwyNiwyOCwzNSwKKyAgICAzNyw0Miw0NCwxLDIsNCw4LDE3LDE4LDIwLDI0LDYsOSwyMiwyNSwzMiwzMywzNCwzNiw0MCwzOCw0MX07CisKK3N0YXRpYyBjb25zdCB1OCBjb2RlZEJsb2NrUGF0dGVybkludGVyWzQ4XSA9IHsKKyAgICAwLDE2LDEsMiw0LDgsMzIsMyw1LDEwLDEyLDE1LDQ3LDcsMTEsMTMsMTQsNiw5LDMxLDM1LDM3LDQyLDQ0LDMzLDM0LDM2LDQwLAorICAgIDM5LDQzLDQ1LDQ2LDE3LDE4LDIwLDI0LDE5LDIxLDI2LDI4LDIzLDI3LDI5LDMwLDIyLDI1LDM4LDQxfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjEgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIHVuc2lnbmVkIEV4cC1Hb2xvbWIgY29kZS4gVGhpcyBpcyB0aGUgc2FtZSBhcyBjb2RlTnVtIHVzZWQKKyAgICAgICAgICAgIGluIG90aGVyIEV4cC1Hb2xvbWIgY29kZSBtYXBwaW5ncy4gQ29kZSBudW0gKGkuZS4gdGhlIGRlY29kZWQKKyAgICAgICAgICAgIHN5bWJvbCkgaXMgZGV0ZXJtaW5lZCBhcworCisgICAgICAgICAgICAgICAgY29kZU51bSA9IDJebGVhZGluZ1plcm9zIC0gMSArIEdldEJpdHMobGVhZGluZ1plcm9zKQorCisgICAgICAgICAgICBOb3JtYWwgZGVjb2RlZCBzeW1ib2xzIGFyZSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzIgLSAyXS4gU3ltYm9sCisgICAgICAgICAgICAyXjMyLTEgaXMgaW5kaWNhdGVkIGJ5IEJJR19DT0RFX05VTSB3aXRoIHJldHVybiB2YWx1ZSBIQU5UUk9fT0sKKyAgICAgICAgICAgIHdoaWxlIHN5bWJvbCAyXjMyICBpcyBpbmRpY2F0ZWQgYnkgQklHX0NPREVfTlVNIHdpdGggcmV0dXJuIHZhbHVlCisgICAgICAgICAgICBIQU5UUk9fTk9LLiAgVGhlc2UgdHdvIHN5bWJvbHMgYXJlIHNwZWNpYWwgY2FzZXMgd2l0aCBjb2RlIGxlbmd0aAorICAgICAgICAgICAgb2YgNjUsIGkuZS4gIDMyICcwJyBiaXRzLCBhICcxJyBiaXQsIGFuZCBlaXRoZXIgMCBvciAxIHJlcHJlc2VudGVkCisgICAgICAgICAgICBieSAzMiBiaXRzLgorCisgICAgICAgICAgICBTeW1ib2wgMl4zMiBpcyBvdXQgb2YgdW5zaWduZWQgMzItYml0IHJhbmdlIGJ1dCBpcyBuZWVkZWQgZm9yCisgICAgICAgICAgICBEZWNvZGVFeHBHb2xvbWJTaWduZWQgdG8gZXhwcmVzcyB2YWx1ZSAtMl4zMS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgY29kZU51bSAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kLCBub3RlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQklHX0NPREVfTlVNCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKmNvZGVOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGJpdHMsIG51bVplcm9zOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQoY29kZU51bSk7CisKKyAgICBiaXRzID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKKworICAgIC8qIGZpcnN0IGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDEgKi8KKyAgICBpZiAoYml0cyA+PSAweDgwMDAwMDAwKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAqY29kZU51bSA9IDA7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICAvKiBzZWNvbmQgYml0IGlzIDEgLT4gY29kZSBsZW5ndGggMyAqLworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg0MDAwMDAwMCkKKyAgICB7CisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMykgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgKmNvZGVOdW0gPSAxICsgKChiaXRzID4+IDI5KSAmIDB4MSk7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICAvKiB0aGlyZCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCA1ICovCisgICAgZWxzZSBpZiAoYml0cyA+PSAweDIwMDAwMDAwKQorICAgIHsKKyAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCA1KSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAqY29kZU51bSA9IDMgKyAoKGJpdHMgPj4gMjcpICYgMHgzKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIC8qIGZvdXJ0aCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCA3ICovCisgICAgZWxzZSBpZiAoYml0cyA+PSAweDEwMDAwMDAwKQorICAgIHsKKyAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCA3KSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAqY29kZU51bSA9IDcgKyAoKGJpdHMgPj4gMjUpICYgMHg3KTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIC8qIG90aGVyIGNvZGUgbGVuZ3RocyAqLworICAgIGVsc2UKKyAgICB7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBudW1aZXJvcyA9IDQgKyBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MoYml0cywgMjgpOworI2Vsc2UKKyAgICAgICAgbnVtWmVyb3MgPSBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MoYml0cyk7CisjZW5kaWYKKyAgICAgICAgLyogYWxsIDMyIGJpdHMgYXJlIHplcm8gKi8KKyAgICAgICAgaWYgKG51bVplcm9zID09IDMyKQorICAgICAgICB7CisgICAgICAgICAgICAqY29kZU51bSA9IDA7CisgICAgICAgICAgICBoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMik7CisgICAgICAgICAgICBiaXRzID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgIC8qIGNoZWNrIDMzcmQgYml0LCBtdXN0IGJlIDEgKi8KKyAgICAgICAgICAgIGlmIChiaXRzID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogY2Fubm90IHVzZSBoMjY0YnNkR2V0Qml0cywgbGltaXRlZCB0byAzMSBiaXRzICovCisgICAgICAgICAgICAgICAgYml0cyA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzMikgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIC8qIGNvZGUgbnVtIDJeMzIgLSAxLCBuZWVkZWQgZm9yIHVuc2lnbmVkIG1hcHBpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoYml0cyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKmNvZGVOdW0gPSBCSUdfQ09ERV9OVU07CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBjb2RlIG51bSAyXjMyLCBuZWVkZWQgZm9yIHVuc2lnbmVkIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgKiAocmVzdWx0cyBpbiAtMl4zMSkgKi8KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChiaXRzID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqY29kZU51bSA9IEJJR19DT0RFX05VTTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGlmIG1vcmUgemVyb3MgdGhhbiAzMiwgaXQgaXMgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSxudW1aZXJvcysxKTsKKworICAgICAgICBiaXRzID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBudW1aZXJvcyk7CisgICAgICAgIGlmIChiaXRzID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgKmNvZGVOdW0gPSAoMSA8PCBudW1aZXJvcykgLSAxICsgYml0czsKKworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMiAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIHNpZ25lZCBFeHAtR29sb21iIGNvZGUuIENvZGUgbnVtIGlzIGRldGVybWluZWQgYnkKKyAgICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCBhbmQgdGhlbiBtYXBwZWQgdG8gc2lnbmVkCisgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBhcworCisgICAgICAgICAgICAgICAgc3ltYm9sID0gKC0xKV4oY29kZU51bSsxKSAqIChjb2RlTnVtKzEpLzIKKworICAgICAgICAgICAgU2lnbmVkIHN5bWJvbHMgc2hhbGwgYmUgaW4gdGhlIHJhbmdlIFstMl4zMSwgMl4zMSAtIDFdLiBTeW1ib2wKKyAgICAgICAgICAgIC0yXjMxIGlzIG9idGFpbmVkIHdoZW4gY29kZU51bSBpcyAyXjMyLCB3aGljaCBjYW5ub3QgYmUgZXhwcmVzc2VkCisgICAgICAgICAgICBieSB1bnNpZ25lZCAzMi1iaXQgdmFsdWUuIFRoaXMgaXMgc2lnbmFsZWQgYXMgYSBzcGVjaWFsIGNhc2UgZnJvbQorICAgICAgICAgICAgdGhlIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCBieSBzZXR0aW5nIGNvZGVOdW0gdG8KKyAgICAgICAgICAgIEJJR19DT0RFX05VTSBhbmQgcmV0dXJuaW5nIEhBTlRST19OT0sgc3RhdHVzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBpMzIgKnZhbHVlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBzdGF0dXMsIGNvZGVOdW0gPSAwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQodmFsdWUpOworCisgICAgc3RhdHVzID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJmNvZGVOdW0pOworCisgICAgaWYgKGNvZGVOdW0gPT0gQklHX0NPREVfTlVNKQorICAgIHsKKyAgICAgICAgLyogQklHX0NPREVfTlVNIGFuZCBIQU5UUk9fT0sgc3RhdHVzIG1lYW5zIGNvZGVOdW0gMl4zMi0xIHdoaWNoIHdvdWxkCisgICAgICAgICAqIHJlc3VsdCBpbiBzaWduZWQgaW50ZWdlciB2YWx1ZWQgMl4zMSAoaS5lLiBvdXQgb2YgMzItYml0IHNpZ25lZAorICAgICAgICAgKiBpbnRlZ2VyIHJhbmdlKSAqLworICAgICAgICBpZiAoc3RhdHVzID09IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgLyogQklHX0NPREVfTlVNIGFuZCBIQU5UUk9fTk9LIHN0YXR1cyBtZWFucyBjb2RlTnVtIDJeMzIgd2hpY2ggcmVzdWx0cworICAgICAgICAgKiBpbiBzaWduZWQgaW50ZWdlciB2YWx1ZWQgLTJeMzEgKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqdmFsdWUgPSAoaTMyKSgyMTQ3NDgzNjQ4VSk7CisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19PSyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoc3RhdHVzID09IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIC8qICgtMSleKGNvZGVOdW0rMSkgcmVzdWx0cyBpbiBwb3NpdGl2ZSBzaWduIGlmIGNvZGVOdW0gaXMgb2RkLAorICAgICAgICAgKiBuZWdhdGl2ZSB3aGVuIGl0IGlzIGV2ZW4uIChjb2RlTnVtKzEpLzIgaXMgb2J0YWluZWQgYXMKKyAgICAgICAgICogKGNvZGVOdW0rMSk+PjEgd2hlbiB2YWx1ZSBpcyBwb3NpdGl2ZSBhbmQgYXMgKC1jb2RlTnVtKT4+MSBmb3IKKyAgICAgICAgICogbmVnYXRpdmUgdmFsdWUgKi8KKyAgICAgICAgLypsaW50IC1lNzAyICovCisgICAgICAgICp2YWx1ZSA9IChjb2RlTnVtICYgMHgxKSA/IChpMzIpKChjb2RlTnVtICsgMSkgPj4gMSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oaTMyKSgoY29kZU51bSArIDEpID4+IDEpOworICAgICAgICAvKmxpbnQgK2U3MDIgKi8KKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19OT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMyAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIG1hcHBlZCBFeHAtR29sb21iIGNvZGUuIENvZGUgbnVtIGlzIGRldGVybWluZWQgYnkKKyAgICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCBhbmQgdGhlbiBtYXBwZWQgdG8gY29kZWRCbG9ja1BhdHRlcm4KKyAgICAgICAgICAgIGVpdGhlciBmb3IgaW50cmEgb3IgaW50ZXIgbWFjcm9ibG9jay4gVGhlIG1hcHBpbmcgaXMgaW1wbGVtZW50ZWQgYnkKKyAgICAgICAgICAgIGxvb2stdXAgdGFibGVzIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGlzSW50cmEgICAgICAgICBmbGFnIHRvIGluZGljYXRlIGlmIGludHJhIG9yIGludGVyIG1hcHBpbmcgaXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHZhbHVlICAgICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUsCisgICAgdTMyIGlzSW50cmEpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHN0YXR1cywgY29kZU51bTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHZhbHVlKTsKKworICAgIHN0YXR1cyA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZjb2RlTnVtKTsKKworICAgIGlmIChzdGF0dXMgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIHJhbmdlIG9mIHZhbGlkIGNvZGVOdW1zIFswLDQ3XSAqLworICAgICAgICBpZiAoY29kZU51bSA+IDQ3KQorICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICAgICAgaWYgKGlzSW50cmEpCisgICAgICAgICAgICAqdmFsdWUgPSBjb2RlZEJsb2NrUGF0dGVybkludHJhNHg0W2NvZGVOdW1dOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqdmFsdWUgPSBjb2RlZEJsb2NrUGF0dGVybkludGVyW2NvZGVOdW1dOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS40ICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgdHJ1bmNhdGVkIEV4cC1Hb2xvbWIgY29kZS4gZ3JlYXRlclRoYW5PbmUgZmxhZyBpbmRpY2F0ZXMKKyAgICAgICAgICAgIHRoZSByYW5nZSBvZiB0aGUgc3ltYm9sIHRvIGJlIGRlY29kZWQgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICBGQUxTRSAgIC0+ICBbMCwxXQorICAgICAgICAgICAgICAgIFRSVUUgICAgLT4gIFswLDJeMzItMV0KKworICAgICAgICAgICAgSWYgZmxhZyBpcyBmYWxzZSB0aGUgZGVjb2RpbmcgaXMgcGVyZm9ybWVkIGJ5IHJlYWRpbmcgb25lIGJpdAorICAgICAgICAgICAgZnJvbSB0aGUgc3RyZWFtIHdpdGggaDI2NGJzZEdldEJpdHMgYW5kIG1hcHBpbmcgdGhpcyB0byBkZWNvZGVkCisgICAgICAgICAgICBzeW1ib2wgYXMKKyAgICAgICAgICAgICAgICBzeW1ib2wgPSBiaXQgPyAwIDogMQorCisgICAgICAgICAgICBPdGhlcndpc2UsIGkuZS4gd2hlbiBmbGFnIGlzIFRSVUUsIGNvZGUgbnVtIGlzIGRldGVybWluZWQgYnkKKyAgICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCBhbmQgdGhpcyBpcyB1c2VkIGFzIHRoZSBkZWNvZGVkCisgICAgICAgICAgICBzeW1ib2wuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBncmVhdGVyVGhhbk9uZSAgZmxhZyB0byBpbmRpY2F0ZSBpZiByYW5nZSBpcyB3aWRlciB0aGFuIFswLDFdCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHZhbHVlICAgICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICB1MzIgKnZhbHVlLAorICB1MzIgZ3JlYXRlclRoYW5PbmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQodmFsdWUpOworCisgICAgaWYgKGdyZWF0ZXJUaGFuT25lKQorICAgIHsKKyAgICAgICAgcmV0dXJuKGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsIHZhbHVlKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICp2YWx1ZSA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwxKTsKKyAgICAgICAgaWYgKCp2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICAgICAgKnZhbHVlIF49IDB4MTsKKyAgICB9CisKKyAgICByZXR1cm4gKEhBTlRST19PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjMTY3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19WTENfSAorI2RlZmluZSBIMjY0U1dERUNfVkxDX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF90cmFuc2Zvcm0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUpOworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIGkzMiAqdmFsdWUpOworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUsCisgICAgdTMyIGlzSW50cmEpOworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUsCisgICAgdTMyIGdyZWF0ZXJUaGFuT25lKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVkxDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRhOTMzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycworICAgICAgICAgIERlY29kZUhyZFBhcmFtZXRlcnMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3Z1aS5oIgorI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWF9EUEJfU0laRSAxNgorI2RlZmluZSBNQVhfQlIgICAgICAgMjQwMDAwIC8qIGZvciBsZXZlbCA1LjEgKi8KKyNkZWZpbmUgTUFYX0NQQiAgICAgIDI0MDAwMCAvKiBmb3IgbGV2ZWwgNS4xICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVIcmRQYXJhbWV0ZXJzKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIGhyZFBhcmFtZXRlcnNfdCAqcEhyZFBhcmFtZXRlcnMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBWVUkgcGFyYW1ldGVycyBmcm9tIHRoZSBzdHJlYW0uIFNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMgIGRlY29kZWQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhIG9yIGVuZCBvZiBzdHJlYW0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICB2dWlQYXJhbWV0ZXJzX3QgKnBWdWlQYXJhbWV0ZXJzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwVnVpUGFyYW1ldGVycyk7CisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFZ1aVBhcmFtZXRlcnMsIDAsIHNpemVvZih2dWlQYXJhbWV0ZXJzX3QpKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb0lkYyA9IHRtcDsKKworICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjID09IEFTUEVDVF9SQVRJT19FWFRFTkRFRF9TQVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5zYXJXaWR0aCA9IHRtcDsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnNhckhlaWdodCA9IHRtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPm92ZXJzY2FuSW5mb1ByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5vdmVyc2NhbkluZm9QcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm92ZXJzY2FuQXBwcm9wcmlhdGVGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMyk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZpZGVvRm9ybWF0ID0gdG1wOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZpZGVvRnVsbFJhbmdlRmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnID0KKyAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91clByaW1hcmllcyA9IHRtcDsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+dHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgPSB0bXA7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1hdHJpeENvZWZmaWNpZW50cyA9IHRtcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJQcmltYXJpZXMgICAgICAgICA9IDI7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+dHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgPSAyOworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1hdHJpeENvZWZmaWNpZW50cyAgICAgID0gMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9Gb3JtYXQgICAgICAgICAgICAgPSA1OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyUHJpbWFyaWVzICAgICAgICAgPSAyOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgPSAyOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzICAgICAgPSAyOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPmNocm9tYUxvY0luZm9QcmVzZW50RmxhZyA9CisgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y2hyb21hTG9jSW5mb1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVUb3BGaWVsZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZVRvcEZpZWxkID4gNSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZUJvdHRvbUZpZWxkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlQm90dG9tRmllbGQgPiA1KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPnRpbWluZ0luZm9QcmVzZW50RmxhZyA9CisgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+dGltaW5nSW5mb1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKKyAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzMikgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgaWYgKHRtcCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bnVtVW5pdHNJblRpY2sgPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKKyAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzMikgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgaWYgKHRtcCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dGltZVNjYWxlID0gdG1wOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmZpeGVkRnJhbWVSYXRlRmxhZyA9CisgICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBEZWNvZGVIcmRQYXJhbWV0ZXJzKHBTdHJtRGF0YSwgJnBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuY3BiQ250ICAgICAgICAgID0gMTsKKyAgICAgICAgLyogTWF4QlIgYW5kIE1heENQQiBzaG91bGQgYmUgdGhlIHZhbHVlcyBjb3JyZXNwb25kaWcgdG8gdGhlIGxldmVsSWRjCisgICAgICAgICAqIGluIHRoZSBTUFMgY29udGFpbmluZyB0aGVzZSBWVUkgcGFyYW1ldGVycy4gSG93ZXZlciwgdGhlc2UgdmFsdWVzCisgICAgICAgICAqIGFyZSBub3QgdXNlZCBhbnl3aGVyZSBhbmQgbWF4aW11bSBmb3IgYW55IGxldmVsIHdpbGwgYmUgdXNlZCBoZXJlICovCisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmJpdFJhdGVWYWx1ZVswXSA9IDEyMDAgKiBNQVhfQlIgKyAxOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5jcGJTaXplVmFsdWVbMF0gPSAxMjAwICogTUFYX0NQQiArIDE7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGggPSAyNDsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuY3BiUmVtb3ZhbERlbGF5TGVuZ3RoICAgICAgICA9IDI0OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5kcGJPdXRwdXREZWxheUxlbmd0aCAgICAgICAgID0gMjQ7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLnRpbWVPZmZzZXRMZW5ndGggICAgICAgICAgICAgPSAyNDsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPQorICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IERlY29kZUhyZFBhcmFtZXRlcnMocFN0cm1EYXRhLCAmcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJDbnQgICAgICAgICAgPSAxOworICAgICAgICAvKiBNYXhCUiBhbmQgTWF4Q1BCIHNob3VsZCBiZSB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpZyB0byB0aGUgbGV2ZWxJZGMKKyAgICAgICAgICogaW4gdGhlIFNQUyBjb250YWluaW5nIHRoZXNlIFZVSSBwYXJhbWV0ZXJzLiBIb3dldmVyLCB0aGVzZSB2YWx1ZXMKKyAgICAgICAgICogYXJlIG5vdCB1c2VkIGFueXdoZXJlIGFuZCBtYXhpbXVtIGZvciBhbnkgbGV2ZWwgd2lsbCBiZSB1c2VkIGhlcmUgKi8KKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuYml0UmF0ZVZhbHVlWzBdID0gMTAwMCAqIE1BWF9CUiArIDE7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYlNpemVWYWx1ZVswXSA9IDEwMDAgKiBNQVhfQ1BCICsgMTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCA9IDI0OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJSZW1vdmFsRGVsYXlMZW5ndGggICAgICAgID0gMjQ7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmRwYk91dHB1dERlbGF5TGVuZ3RoICAgICAgICAgPSAyNDsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMudGltZU9mZnNldExlbmd0aCAgICAgICAgICAgICA9IDI0OworICAgIH0KKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnIHx8CisgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bG93RGVsYXlIcmRGbGFnID0KKyAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT5waWNTdHJ1Y3RQcmVzZW50RmxhZyA9CisgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZyA9CisgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Yml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bW90aW9uVmVjdG9yc092ZXJQaWNCb3VuZGFyaWVzRmxhZyA9CisgICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm1heEJ5dGVzUGVyUGljRGVub20pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm1heEJ5dGVzUGVyUGljRGVub20gPiAxNikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bWF4Qml0c1Blck1iRGVub20pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm1heEJpdHNQZXJNYkRlbm9tID4gMTYpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aEhvcml6b250YWwpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aEhvcml6b250YWwgPiAxNikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoVmVydGljYWwpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsID4gMTYpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tb3Rpb25WZWN0b3JzT3ZlclBpY0JvdW5kYXJpZXNGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXhCeXRlc1BlclBpY0Rlbm9tICAgICAgID0gMjsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1heEJpdHNQZXJNYkRlbm9tICAgICAgICAgPSAxOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbCA9IDE2OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoVmVydGljYWwgICA9IDE2OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcyAgICAgICAgICA9IE1BWF9EUEJfU0laRTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nICAgICAgPSBNQVhfRFBCX1NJWkU7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVIcmRQYXJhbWV0ZXJzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBIUkQgcGFyYW1ldGVycyBmcm9tIHRoZSBzdHJlYW0uIFNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcEhyZFBhcmFtZXRlcnMgIGRlY29kZWQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlSHJkUGFyYW1ldGVycygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBocmRQYXJhbWV0ZXJzX3QgKnBIcmRQYXJhbWV0ZXJzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwSHJkUGFyYW1ldGVycyk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZwSHJkUGFyYW1ldGVycy0+Y3BiQ250KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgLyogY3BiQ291bnQgPSBjcGJfY250X21pbnVzMSArIDEgKi8KKyAgICBwSHJkUGFyYW1ldGVycy0+Y3BiQ250Kys7CisgICAgaWYgKHBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQgPiBNQVhfQ1BCX0NOVCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA0KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVNjYWxlID0gdG1wOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA0KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVNjYWxlID0gdG1wOworCisgICAgZm9yIChpID0gMDsgaSA8IHBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIC8qIGJpdF9yYXRlX3ZhbHVlX21pbnVzMSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzIgLSAyXSAqLworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0gPiA0Mjk0OTY3Mjk0VSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSsrOworICAgICAgICAvKiB0aGlzIG1heSByZXN1bHQgaW4gb3ZlcmZsb3csIGJ1dCB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIGZvcgorICAgICAgICAgKiBhbnl0aGluZyAqLworICAgICAgICBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldICo9CisgICAgICAgICAgICAxIDw8ICg2ICsgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVTY2FsZSk7CisKKyAgICAgICAgLyogY3BiX3NpemVfdmFsdWVfbWludXMxIGluIHRoZSByYW5nZSBbMCwgMl4zMiAtIDJdICovCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSA+IDQyOTQ5NjcyOTRVKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldKys7CisgICAgICAgIC8qIHRoaXMgbWF5IHJlc3VsdCBpbiBvdmVyZmxvdywgYnV0IHRoaXMgdmFsdWUgaXMgbm90IHVzZWQgZm9yCisgICAgICAgICAqIGFueXRoaW5nICovCisgICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0gKj0KKyAgICAgICAgICAgIDEgPDwgKDQgKyBwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVNjYWxlKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5jYnJGbGFnW2ldID0gKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcEhyZFBhcmFtZXRlcnMtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGggPSB0bXAgKyAxOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwSHJkUGFyYW1ldGVycy0+Y3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gdG1wICsgMTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcEhyZFBhcmFtZXRlcnMtPmRwYk91dHB1dERlbGF5TGVuZ3RoID0gdG1wICsgMTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcEhyZFBhcmFtZXRlcnMtPnRpbWVPZmZzZXRMZW5ndGggPSB0bXA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDVkNTJhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19WVUlfSAorI2RlZmluZSBIMjY0U1dERUNfVlVJX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTUFYX0NQQl9DTlQgMzIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnVtZXJhdGVkIHNhbXBsZSBhc3BlY3QgcmF0aW9zLCBBU1BFQ1RfUkFUSU9fTV9OIG1lYW5zIE06TiAqLworZW51bQoreworICAgIEFTUEVDVF9SQVRJT19VTlNQRUNJRklFRCA9IDAsCisgICAgQVNQRUNUX1JBVElPXzFfMSwKKyAgICBBU1BFQ1RfUkFUSU9fMTJfMTEsCisgICAgQVNQRUNUX1JBVElPXzEwXzExLAorICAgIEFTUEVDVF9SQVRJT18xNl8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fNDBfMzMsCisgICAgQVNQRUNUX1JBVElPXzI0XzExLAorICAgIEFTUEVDVF9SQVRJT18yMF8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fMzJfMTEsCisgICAgQVNQRUNUX1JBVElPXzgwXzMzLAorICAgIEFTUEVDVF9SQVRJT18xOF8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fMTVfMTEsCisgICAgQVNQRUNUX1JBVElPXzY0XzMzLAorICAgIEFTUEVDVF9SQVRJT18xNjBfOTksCisgICAgQVNQRUNUX1JBVElPX0VYVEVOREVEX1NBUiA9IDI1NQorfTsKKworLyogc3RydWN0dXJlIHRvIHN0b3JlIEh5cG90aGV0aWNhbCBSZWZlcmVuY2UgRGVjb2RlciAoSFJEKSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBjcGJDbnQ7CisgICAgdTMyIGJpdFJhdGVTY2FsZTsKKyAgICB1MzIgY3BiU2l6ZVNjYWxlOworICAgIHUzMiBiaXRSYXRlVmFsdWVbTUFYX0NQQl9DTlRdOworICAgIHUzMiBjcGJTaXplVmFsdWVbTUFYX0NQQl9DTlRdOworICAgIHUzMiBjYnJGbGFnW01BWF9DUEJfQ05UXTsKKyAgICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aDsKKyAgICB1MzIgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoOworICAgIHUzMiBkcGJPdXRwdXREZWxheUxlbmd0aDsKKyAgICB1MzIgdGltZU9mZnNldExlbmd0aDsKK30gaHJkUGFyYW1ldGVyc190OworCisvKiBzdG9yYWdlIGZvciBWVUkgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgYXNwZWN0UmF0aW9QcmVzZW50RmxhZzsKKyAgICB1MzIgYXNwZWN0UmF0aW9JZGM7CisgICAgdTMyIHNhcldpZHRoOworICAgIHUzMiBzYXJIZWlnaHQ7CisgICAgdTMyIG92ZXJzY2FuSW5mb1ByZXNlbnRGbGFnOworICAgIHUzMiBvdmVyc2NhbkFwcHJvcHJpYXRlRmxhZzsKKyAgICB1MzIgdmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWc7CisgICAgdTMyIHZpZGVvRm9ybWF0OworICAgIHUzMiB2aWRlb0Z1bGxSYW5nZUZsYWc7CisgICAgdTMyIGNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWc7CisgICAgdTMyIGNvbG91clByaW1hcmllczsKKyAgICB1MzIgdHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3M7CisgICAgdTMyIG1hdHJpeENvZWZmaWNpZW50czsKKyAgICB1MzIgY2hyb21hTG9jSW5mb1ByZXNlbnRGbGFnOworICAgIHUzMiBjaHJvbWFTYW1wbGVMb2NUeXBlVG9wRmllbGQ7CisgICAgdTMyIGNocm9tYVNhbXBsZUxvY1R5cGVCb3R0b21GaWVsZDsKKyAgICB1MzIgdGltaW5nSW5mb1ByZXNlbnRGbGFnOworICAgIHUzMiBudW1Vbml0c0luVGljazsKKyAgICB1MzIgdGltZVNjYWxlOworICAgIHUzMiBmaXhlZEZyYW1lUmF0ZUZsYWc7CisgICAgdTMyIG5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZzsKKyAgICBocmRQYXJhbWV0ZXJzX3QgbmFsSHJkUGFyYW1ldGVyczsKKyAgICB1MzIgdmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnOworICAgIGhyZFBhcmFtZXRlcnNfdCB2Y2xIcmRQYXJhbWV0ZXJzOworICAgIHUzMiBsb3dEZWxheUhyZEZsYWc7CisgICAgdTMyIHBpY1N0cnVjdFByZXNlbnRGbGFnOworICAgIHUzMiBiaXRzdHJlYW1SZXN0cmljdGlvbkZsYWc7CisgICAgdTMyIG1vdGlvblZlY3RvcnNPdmVyUGljQm91bmRhcmllc0ZsYWc7CisgICAgdTMyIG1heEJ5dGVzUGVyUGljRGVub207CisgICAgdTMyIG1heEJpdHNQZXJNYkRlbm9tOworICAgIHUzMiBsb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsOworICAgIHUzMiBsb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbDsKKyAgICB1MzIgbnVtUmVvcmRlckZyYW1lczsKKyAgICB1MzIgbWF4RGVjRnJhbWVCdWZmZXJpbmc7Cit9IHZ1aVBhcmFtZXRlcnNfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIHZ1aVBhcmFtZXRlcnNfdCAqcFZ1aVBhcmFtZXRlcnMpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19WVUlfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAppbmRleCA0YjcyYTUzLi5iMjhkOTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKQEAgLTIwLDggKzIwLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgaW50IE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwOwotCiBDb2xvckNvbnZlcnRlcjo6Q29sb3JDb252ZXJ0ZXIoCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZyb20sIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHRvKQogICAgIDogbVNyY0Zvcm1hdChmcm9tKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKaW5kZXggYTllOGU5NS4uYWViY2RkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKQEAgLTkzLDYgKzkzLDcgQEAKIAogICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOwogICAgIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKKyAgICBzdGF0dXNfdCBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShjb25zdCBQYXJjZWwgJnJlcXVlc3QpOwogCiAgICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgdGltZVVzKTsKIApAQCAtMjkxLDYgKzI5Miw3IEBACiAgICAgdm9pZCBzZXROYXRpdmVXaW5kb3dfbChjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlKTsKIAogICAgIGJvb2wgaXNTdHJlYW1pbmdIVFRQKCkgY29uc3Q7CisgICAgdm9pZCBzZW5kQ2FjaGVTdGF0cygpOwogCiAgICAgQXdlc29tZVBsYXllcihjb25zdCBBd2Vzb21lUGxheWVyICYpOwogICAgIEF3ZXNvbWVQbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBBd2Vzb21lUGxheWVyICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaAppbmRleCAwZTI5MjdkLi5kODMzZTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaApAQCAtNDMsOCArNDMsNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAKLSAgICB2aXJ0dWFsIGJvb2wgZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2Jwcyk7Ci0KICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKQEAgLTY3LDExICs2NSw2IEBACiAgICAgICAgIERJU0NPTk5FQ1RJTkcKICAgICB9OwogCi0gICAgc3RydWN0IEJhbmR3aWR0aEVudHJ5IHsKLSAgICAgICAgaW50NjRfdCBtRGVsYXlVczsKLSAgICAgICAgc2l6ZV90IG1OdW1CeXRlczsKLSAgICB9OwotCiAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKQEAgLTk0LDExICs4Nyw2IEBACiAKICAgICBTdHJpbmc4IG1Db250ZW50VHlwZTsKIAotICAgIExpc3Q8QmFuZHdpZHRoRW50cnk+IG1CYW5kd2lkdGhIaXN0b3J5OwotICAgIHNpemVfdCBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOwotICAgIGludDY0X3QgbVRvdGFsVHJhbnNmZXJUaW1lVXM7Ci0gICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyQnl0ZXM7Ci0KICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKIApAQCAtMTIxLDggKzEwOSw2IEBACiAgICAgdm9pZCBvblJlYWRDb21wbGV0ZWQoc3NpemVfdCBzaXplKTsKICAgICB2b2lkIG9uRGlzY29ubmVjdENvbXBsZXRlKCk7CiAKLSAgICB2b2lkIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50X2woc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpOwotCiAgICAgdm9pZCBjbGVhckRSTVN0YXRlX2woKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENocm9taXVtSFRUUERhdGFTb3VyY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCmluZGV4IDZjZWMzOTAuLjNhN2ZiYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKQEAgLTIwLDYgKzIwLDggQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDAsMTEgKzQyLDQxIEBACiAKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgYmFuZHdpZHRoIGNvdWxkIHN1Y2Nlc3NmdWxseSBiZSBlc3RpbWF0ZWQsCiAgICAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgotICAgIHZpcnR1YWwgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSA9IDA7CisgICAgdmlydHVhbCBib29sIGVzdGltYXRlQmFuZHdpZHRoKGludDMyX3QgKmJhbmR3aWR0aF9icHMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKGludDMyX3QgKmticHMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCYW5kd2lkdGhTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpOwogCiAgICAgc3RhdGljIHNwPEhUVFBCYXNlPiBDcmVhdGUodWludDMyX3QgZmxhZ3MgPSAwKTsKIAorcHJvdGVjdGVkOgorICAgIHZvaWQgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpOworCiBwcml2YXRlOgorCisgICAgc3RydWN0IEJhbmR3aWR0aEVudHJ5IHsKKyAgICAgICAgaW50NjRfdCBtRGVsYXlVczsKKyAgICAgICAgc2l6ZV90IG1OdW1CeXRlczsKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisKKyAgICBMaXN0PEJhbmR3aWR0aEVudHJ5PiBtQmFuZHdpZHRoSGlzdG9yeTsKKyAgICBzaXplX3QgbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtczsKKyAgICBpbnQ2NF90IG1Ub3RhbFRyYW5zZmVyVGltZVVzOworICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlckJ5dGVzOworCisgICAgZW51bSB7CisgICAgICAgIGtNaW5CYW5kd2lkdGhDb2xsZWN0RnJlcU1zID0gMTAwMCwgICAvLyAxIHNlY29uZAorICAgICAgICBrTWF4QmFuZHdpZHRoQ29sbGVjdEZyZXFNcyA9IDYwMDAwLCAgLy8gb25lIG1pbnV0ZQorICAgIH07CisKKyAgICBpbnQ2NF90IG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVczsKKyAgICBpbnQzMl90IG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwczsKKyAgICBpbnQzMl90IG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zOworCisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhIVFRQQmFzZSk7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAppbmRleCBlZDNlMjY1Yy4uMmQ2Y2I4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC01MCw2ICs1MCwxMiBAQAogCiAgICAgdm9pZCByZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7CiAKKyAgICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHN1cHBvcnRlZCBvbmx5IGlmIHRoZQorICAgIC8vIGRhdGEgc291cmNlIGlzIEhUVFAtYmFzZWQ7IG90aGVyd2lzZSwgRVJST1JfVU5TVVBQT1JURUQKKyAgICAvLyBpcyByZXR1cm5lZC4KKyAgICBzdGF0dXNfdCBnZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKGludDMyX3QgKmticHMpOworICAgIHN0YXR1c190IHNldENhY2hlU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51Q2FjaGVkU291cmNlMigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCmluZGV4IDJhYjFmMTkuLmMyNjViM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCkBAIC00MywxMCArNDMsNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAKLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgYmFuZHdpZHRoIGNvdWxkIHN1Y2Nlc3NmdWxseSBiZSBlc3RpbWF0ZWQsCi0gICAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgotICAgIHZpcnR1YWwgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKTsKLQogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oKTsKICAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CkBAIC02MywxMSArNTksNiBAQAogICAgICAgICBDT05ORUNURUQKICAgICB9OwogCi0gICAgc3RydWN0IEJhbmR3aWR0aEVudHJ5IHsKLSAgICAgICAgaW50NjRfdCBtRGVsYXlVczsKLSAgICAgICAgc2l6ZV90IG1OdW1CeXRlczsKLSAgICB9OwotCiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICB1aW50MzJfdCBtRmxhZ3M7CkBAIC05MywxMSArODQsNiBAQAogICAgIC8vIGNodW5rIGhlYWRlciAob3IgLTEgaWYgbm8gbW9yZSBjaHVua3MpLgogICAgIHNzaXplX3QgbUNodW5rRGF0YUJ5dGVzTGVmdDsKIAotICAgIExpc3Q8QmFuZHdpZHRoRW50cnk+IG1CYW5kd2lkdGhIaXN0b3J5OwotICAgIHNpemVfdCBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOwotICAgIGludDY0X3QgbVRvdGFsVHJhbnNmZXJUaW1lVXM7Ci0gICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyQnl0ZXM7Ci0KICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKIApAQCAtMTE0LDcgKzEwMCw2IEBACiAgICAgc3NpemVfdCBpbnRlcm5hbFJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgdm9pZCBhcHBseVRpbWVvdXRSZXNwb25zZSgpOwotICAgIHZvaWQgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7CiAKICAgICBzdGF0aWMgdm9pZCBNYWtlRnVsbEhlYWRlcnMoCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqb3ZlcnJpZGVzLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCmluZGV4IDA0Y2EzOWUuLjAyYjFjOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKICAgICB7ICJPTVguZ29vZ2xlLmFhYy5kZWNvZGVyIiwgImFhY2RlYyIsICJhdWRpb19kZWNvZGVyLmFhYyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmFtcm5iLmRlY29kZXIiLCAiYW1yZGVjIiwgImF1ZGlvX2RlY29kZXIuYW1ybmIiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIiwgImFtcmRlYyIsICJhdWRpb19kZWNvZGVyLmFtcndiIiB9LAorICAgIHsgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiwgImgyNjRkZWMiLCAidmlkZW9fZGVjb2Rlci5hdmMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5hdmMuZGVjb2RlciIsICJhdmNkZWMiLCAidmlkZW9fZGVjb2Rlci5hdmMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIsICJnNzExZGVjIiwgImF1ZGlvX2RlY29kZXIuZzcxMWFsYXciIH0sCiAgICAgeyAiT01YLmdvb2dsZS5nNzExLm1sYXcuZGVjb2RlciIsICJnNzExZGVjIiwgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciIH0sCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9wZXJmb3JtYW5jZS9WaWRlb0VkaXRvclBlcmZvcm1hbmNlLmphdmEgYi9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9wZXJmb3JtYW5jZS9WaWRlb0VkaXRvclBlcmZvcm1hbmNlLmphdmEKaW5kZXggNGM2NmEyZC4uN2ViNmQyMiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvcGVyZm9ybWFuY2UvVmlkZW9FZGl0b3JQZXJmb3JtYW5jZS5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L3BlcmZvcm1hbmNlL1ZpZGVvRWRpdG9yUGVyZm9ybWFuY2UuamF2YQpAQCAtMTEyLDEyICsxMTIsMTEgQEAKIAogICAgIHByaXZhdGUgZmluYWwgaW50IE5VTV9PRl9JVEVSQVRJT05TPTIwOwogCi0gICAgcHJpdmF0ZSBmbG9hdCBjYWxjdWxhdGVUaW1lVGFrZW4obG9uZyBiZWdpblRpbWUsIGludCBudW1JdGVyYXRpb25zKQorICAgIHByaXZhdGUgaW50IGNhbGN1bGF0ZVRpbWVUYWtlbihsb25nIGJlZ2luVGltZSwgaW50IG51bUl0ZXJhdGlvbnMpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBsb25nIGR1cmF0aW9uMiA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICBmaW5hbCBsb25nIGR1cmF0aW9uVG9DcmVhdGVNZWRpYUl0ZW0gPSAoZHVyYXRpb24yIC0gYmVnaW5UaW1lKTsKLSAgICAgICAgZmluYWwgZmxvYXQgdGltZVRha2VuMSA9IChmbG9hdClkdXJhdGlvblRvQ3JlYXRlTWVkaWFJdGVtICoKLSAgICAgICAgICAgIDEuMGYvKGZsb2F0KW51bUl0ZXJhdGlvbnM7CisgICAgICAgIGZpbmFsIGludCB0aW1lVGFrZW4xID0gKGludCkoZHVyYXRpb25Ub0NyZWF0ZU1lZGlhSXRlbSAvIG51bUl0ZXJhdGlvbnMpOwogICAgICAgICByZXR1cm4gKHRpbWVUYWtlbjEpOwogICAgIH0KIApAQCAtMjA4LDcgKzIwNyw3IEBACiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxvZ2dpbmdJbmZvID0gbmV3IFN0cmluZ1szXTsKICAgICAgICAgZmluYWwgTWVkaWFWaWRlb0l0ZW1bXSBtZWRpYVZpZGVvSXRlbSA9CiAgICAgICAgICAgICBuZXcgTWVkaWFWaWRlb0l0ZW1bTlVNX09GX0lURVJBVElPTlNdOwotICAgICAgICBmbG9hdCB0aW1lVGFrZW4gPSAwLjBmOworICAgICAgICBpbnQgdGltZVRha2VuID0gMDsKICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSAwOwogCiAgICAgICAgIC8qKiBUaW1lIFRha2UgZm9yIGNyZWF0aW9uIG9mIE1lZGlhIFZpZGVvIEl0ZW0gKi8KQEAgLTI1MSw3ICsyNTAsNyBAQAogICAgICAgICBmaW5hbCBTdHJpbmdbXSBsb2dnaW5nSW5mbyA9IG5ldyBTdHJpbmdbM107CiAgICAgICAgIGZpbmFsIE1lZGlhSW1hZ2VJdGVtW10gbWVkaWFJbWFnZUl0ZW0gPQogICAgICAgICAgICAgbmV3IE1lZGlhSW1hZ2VJdGVtW05VTV9PRl9JVEVSQVRJT05TXTsKLSAgICAgICAgZmxvYXQgdGltZVRha2VuID0gMC4wZjsKKyAgICAgICAgaW50IHRpbWVUYWtlbiA9IDA7CiAKICAgICAgICAgbG9uZyBiZWdpblRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgY3JlYXRlSW1hZ2VJdGVtcyhtZWRpYUltYWdlSXRlbSwgaW1hZ2VJdGVtRmlsZU5hbWUsIHJlbmRlcmluZ01vZGUsCkBAIC0yOTYsNyArMjk1LDcgQEAKICAgICAgICAgZmluYWwgaW50IHRyYW5zaXRpb25EdXJhdGlvbiA9IDUwMDA7CiAgICAgICAgIGZpbmFsIGludCB0cmFuc2l0aW9uQmVoYXZpb3IgPSBUcmFuc2l0aW9uLkJFSEFWSU9SX01JRERMRV9GQVNUOwogICAgICAgICBmaW5hbCBTdHJpbmdbXSBsb2dnaW5nSW5mbyA9IG5ldyBTdHJpbmdbM107Ci0gICAgICAgIGZsb2F0IHRpbWVUYWtlbiA9IDAuMGY7CisgICAgICAgIGludCB0aW1lVGFrZW4gPSAwOwogCiAgICAgICAgIGZpbmFsIE1lZGlhVmlkZW9JdGVtW10gbWVkaWFWaWRlb0l0ZW0gPQogICAgICAgICAgICAgbmV3IE1lZGlhVmlkZW9JdGVtWyhOVU1fT0ZfSVRFUkFUSU9OUyAqMTApICsgMV07CkBAIC01MTQsNyArNTEzLDcgQEAKICAgICAgICAgLyoqIDE4LkVuYWJsZSBMb29waW5nIGZvciBBdWRpbyBUcmFjay4KICAgICAgICAgICogKi8KICAgICAgICAgYXVkaW9UcmFjay5lbmFibGVMb29wKCk7Ci0gICAgICAgIGZsb2F0IHRpbWVUYWtlbiA9IDAuMGY7CisgICAgICAgIGludCB0aW1lVGFrZW4gPSAwOwogICAgICAgICBmaW5hbCBsb25nIGJlZ2luVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBtVmlkZW9FZGl0b3IuZXhwb3J0KG91dEZpbGVuYW1lLCBvdXRIZWlnaHQsIG91dEJpdHJhdGUsCkBAIC01NTcsNyArNTU2LDcgQEAKICAgICAgICAgbWVkaWFWaWRlb0l0ZW0uc2V0RXh0cmFjdEJvdW5kYXJpZXModmlkZW9JdGVtU3RhcnRUaW1lLAogICAgICAgICAgICAgdmlkZW9JdGVtRW5kVGltZSk7CiAKLSAgICAgICAgZmxvYXQgdGltZVRha2VuID0gMC4wZjsKKyAgICAgICAgaW50IHRpbWVUYWtlbiA9IDA7CiAgICAgICAgIGxvbmcgYmVnaW5UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX09GX0lURVJBVElPTlM7IGkrKykgewogICAgICAgICAgICAgbWVkaWFWaWRlb0l0ZW0uZ2V0VGh1bWJuYWlsKG1lZGlhVmlkZW9JdGVtLmdldFdpZHRoKCkgLyAyLApAQCAtNjAzLDcgKzYwMiw3IEBACiAgICAgICAgIGZpbmFsIE92ZXJsYXlGcmFtZSBvdmVybGF5RnJhbWVbXSA9IG5ldyBPdmVybGF5RnJhbWVbTlVNX09GX0lURVJBVElPTlNdOwogICAgICAgICBmaW5hbCBCaXRtYXAgbUJpdG1hcCA9ICBtVmlkZW9FZGl0b3JIZWxwZXIuZ2V0Qml0bWFwKG92ZXJsYXlGaWxlbmFtZSwKICAgICAgICAgICAgIDY0MCwgNDgwKTsKLSAgICAgICAgZmxvYXQgdGltZVRha2VuID0gMC4wZjsKKyAgICAgICAgaW50IHRpbWVUYWtlbiA9IDA7CiAgICAgICAgIGxvbmcgYmVnaW5UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX09GX0lURVJBVElPTlM7IGkrKykgewogICAgICAgICAgICAgb3ZlcmxheUZyYW1lW2ldID0gbmV3IE92ZXJsYXlGcmFtZShtZWRpYVZpZGVvSXRlbSwgIm92ZXJsYXkiICsgaSwKQEAgLTY0Nyw3ICs2NDYsNyBAQAogICAgICAgICBmaW5hbCBpbnQgdmlkZW9Qcm9maWxlID0gTWVkaWFQcm9wZXJ0aWVzLkgyNjRfUFJPRklMRV8wX0xFVkVMXzFfMzsKICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gMTA4MDsKICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1lZGlhUHJvcGVydGllcy5IRUlHSFRfNzIwOwotICAgICAgICBmbG9hdCB0aW1lVGFrZW4gPSAwLjBmOworICAgICAgICBpbnQgdGltZVRha2VuID0gMDsKICAgICAgICAgZmluYWwgU3RyaW5nW10gbG9nZ2luZ0luZm8gPSBuZXcgU3RyaW5nWzFdOwogICAgICAgICBmaW5hbCBNZWRpYVZpZGVvSXRlbSBtZWRpYVZpZGVvSXRlbSA9IG5ldyBNZWRpYVZpZGVvSXRlbShtVmlkZW9FZGl0b3IsCiAgICAgICAgICAgICAibTAiLCB2aWRlb0l0ZW1GaWxlTmFtZTEsIHJlbmRlcmluZ01vZGUpOwpAQCAtMTAwNiw3ICsxMDA1LDcgQEAKICAgICAgICAgZmluYWwgaW50IHJlbmRlcmluZ01vZGUgPSBNZWRpYUl0ZW0uUkVOREVSSU5HX01PREVfQkxBQ0tfQk9SREVSOwogICAgICAgICBmaW5hbCBpbnQgYXVkaW9Wb2x1bWUgPSA1MDsKICAgICAgICAgZmluYWwgU3RyaW5nW10gbG9nZ2luZ0luZm8gPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICBmbG9hdCB0aW1lVGFrZW4gPSAwLjBmOworICAgICAgICBpbnQgdGltZVRha2VuID0gMDsKIAogICAgICAgICBmaW5hbCBNZWRpYVZpZGVvSXRlbSBtZWRpYVZpZGVvSXRlbSA9IG5ldyBNZWRpYVZpZGVvSXRlbShtVmlkZW9FZGl0b3IsCiAgICAgICAgICAgICAibWVkaWFJdGVtMSIsIHZpZGVvSXRlbUZpbGVOYW1lMSwgcmVuZGVyaW5nTW9kZSk7CkBAIC0xMDU3LDcgKzEwNTYsNyBAQAogICAgICAgICBmaW5hbCBpbnQgcmVuZGVyaW5nTW9kZSA9IE1lZGlhSXRlbS5SRU5ERVJJTkdfTU9ERV9CTEFDS19CT1JERVI7CiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxvZ2dpbmdJbmZvID0gbmV3IFN0cmluZ1szXTsKIAotICAgICAgICBmbG9hdCB0aW1lVGFrZW4gPSAwLjBmOworICAgICAgICBpbnQgdGltZVRha2VuID0gMDsKIAogICAgICAgICBmaW5hbCBNZWRpYUltYWdlSXRlbVtdIG1lZGlhSW1hZ2VJdGVtID0KICAgICAgICAgICAgIG5ldyBNZWRpYUltYWdlSXRlbVtOVU1fT0ZfSVRFUkFUSU9OU107CmRpZmYgLS1naXQgYS9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL2NvbmZpZ3VyYXRpb24uaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvY29uZmlndXJhdGlvbi5oCmluZGV4IDM5ZmVmMjEuLjI0NDRjNGIgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvY29uZmlndXJhdGlvbi5oCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvY29uZmlndXJhdGlvbi5oCkBAIC00MCw2ICs0MCw3IEBACiAgICAgQUNPTkZJR1VSQVRJT05fREVOU0lUWV9ERUZBVUxUID0gMCwKICAgICBBQ09ORklHVVJBVElPTl9ERU5TSVRZX0xPVyA9IDEyMCwKICAgICBBQ09ORklHVVJBVElPTl9ERU5TSVRZX01FRElVTSA9IDE2MCwKKyAgICBBQ09ORklHVVJBVElPTl9ERU5TSVRZX1RWID0gMjEzLAogICAgIEFDT05GSUdVUkFUSU9OX0RFTlNJVFlfSElHSCA9IDI0MCwKICAgICBBQ09ORklHVVJBVElPTl9ERU5TSVRZX05PTkUgPSAweGZmZmYsCiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBlZDlhNTE5Li4xOTg0OGY2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CQUNLVVAiIC8+CiAKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDphbGxvd0NsZWFyVXNlckRhdGE9ImZhbHNlIgotICAgICAgICAgICAgICAgICBhbmRyb2lkOmtpbGxBZnRlclJlc3RvcmU9ImZhbHNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSIKICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQ09ORklSTV9GVUxMX0JBQ0tVUCIgPgogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uIiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vcmVzL2xheW91dC9jb25maXJtX2JhY2t1cC54bWwgYi9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL3Jlcy9sYXlvdXQvY29uZmlybV9iYWNrdXAueG1sCmluZGV4IDEwOWNmZmYuLmE0NTY0ZTYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vcmVzL2xheW91dC9jb25maXJtX2JhY2t1cC54bWwKKysrIGIvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9yZXMvbGF5b3V0L2NvbmZpcm1fYmFja3VwLnhtbApAQCAtMzcsNiArMzcsNyBAQAogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjMwZHAiIC8+CiAKICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uX2FsbG93IgorICAgICAgICAgICAgYW5kcm9pZDpmaWx0ZXJUb3VjaGVzV2hlbk9ic2N1cmVkPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FsbG93X2JhY2t1cF9idXR0b25fbGFiZWwiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3BhY2thZ2VfbmFtZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9yZXMvbGF5b3V0L2NvbmZpcm1fcmVzdG9yZS54bWwgYi9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL3Jlcy9sYXlvdXQvY29uZmlybV9yZXN0b3JlLnhtbAppbmRleCBhMWY5YTRhLi5jYTk5YWUxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL3Jlcy9sYXlvdXQvY29uZmlybV9yZXN0b3JlLnhtbAorKysgYi9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL3Jlcy9sYXlvdXQvY29uZmlybV9yZXN0b3JlLnhtbApAQCAtMzcsNiArMzcsNyBAQAogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjMwZHAiIC8+CiAKICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uX2FsbG93IgorICAgICAgICAgICAgYW5kcm9pZDpmaWx0ZXJUb3VjaGVzV2hlbk9ic2N1cmVkPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FsbG93X3Jlc3RvcmVfYnV0dG9uX2xhYmVsIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9wYWNrYWdlX25hbWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vc3JjL2NvbS9hbmRyb2lkL2JhY2t1cGNvbmZpcm0vQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi5qYXZhIGIvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9zcmMvY29tL2FuZHJvaWQvYmFja3VwY29uZmlybS9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uLmphdmEKaW5kZXggNGI0MjA2Ny4uNTJiZmMyOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9zcmMvY29tL2FuZHJvaWQvYmFja3VwY29uZmlybS9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uLmphdmEKKysrIGIvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9zcmMvY29tL2FuZHJvaWQvYmFja3VwY29uZmlybS9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uLmphdmEKQEAgLTk4LDYgKzk4LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JFU1RPUkVfUEFDS0FHRTogeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFRleHQobmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMvZGVmYXVsdHMueG1sIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbAppbmRleCBiZjA2Zjk0Ny4uMmUyNzY4ZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMvZGVmYXVsdHMueG1sCkBAIC0xMjUsNCArMTI1LDcgQEAKICAgICA8IS0tIERlZmF1bHQgZm9yIFNldHRpbmdzLlNlY3VyZS5MT05HX1BSRVNTX1RJTUVPVVRfTUlMTElTIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImRlZl9sb25nX3ByZXNzX3RpbWVvdXRfbWlsbGlzIj41MDA8L2ludGVnZXI+CiAKKyAgICA8IS0tIERlZmF1bHQgZm9yIFNldHRpbmdzLlN5c3RlbS5QT0lOVEVSX1NQRUVEIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImRlZl9wb2ludGVyX3NwZWVkIj4wPC9pbnRlZ2VyPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9EYXRhYmFzZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKaW5kZXggYjk5YzhiMC4uMGY1ZjA5NSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKQEAgLTEyMTQsNiArMTIxNCw5IEBACiAgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLk5PVElGSUNBVElPTlNfVVNFX1JJTkdfVk9MVU1FLAogICAgICAgICAgICAgICAgICAgICBSLmJvb2wuZGVmX25vdGlmaWNhdGlvbnNfdXNlX3Jpbmdfdm9sdW1lKTsKIAorICAgICAgICAgICAgbG9hZEludGVnZXJTZXR0aW5nKHN0bXQsIFNldHRpbmdzLlN5c3RlbS5QT0lOVEVSX1NQRUVELAorICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuZGVmX3BvaW50ZXJfc3BlZWQpOworCiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc0JhY2t1cEFnZW50LmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NCYWNrdXBBZ2VudC5qYXZhCmluZGV4IDQ1YmIyYjYuLjBjNGVmN2QgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc0JhY2t1cEFnZW50LmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzQmFja3VwQWdlbnQuamF2YQpAQCAtNTUsNiArNTUsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU2V0dGluZ3NCYWNrdXBBZ2VudCBleHRlbmRzIEJhY2t1cEFnZW50SGVscGVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19CQUNLVVAgPSBERUJVRyB8fCB0cnVlOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TWVNURU0gPSAic3lzdGVtIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFQ1VSRSA9ICJzZWN1cmUiOwpAQCAtNzUsNiArNzYsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9XSUZJX0NPTkZJRyAgICAgPSA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TSVpFICAgICAgICAgICAgPSA1OyAvLyBUaGUgbnVtYmVyIG9mIHN0YXRlIGl0ZW1zCiAKKyAgICAvLyBWZXJzaW9uaW5nIG9mIHRoZSAnZnVsbCBiYWNrdXAnIGZvcm1hdAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVUxMX0JBQ0tVUF9WRVJTSU9OID0gMTsKKwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNvcnRlZFN5c3RlbUtleXMgPSBudWxsOwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNvcnRlZFNlY3VyZUtleXMgPSBudWxsOwogCkBAIC0xMDksNiArMTEzLDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbVdpZmlDb25maWdGaWxlOwogCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIGlmIChERUJVR19CQUNLVVApIExvZy5kKFRBRywgIm9uQ3JlYXRlKCkgaW52b2tlZCIpOworCiAgICAgICAgIG1TZXR0aW5nc0hlbHBlciA9IG5ldyBTZXR0aW5nc0hlbHBlcih0aGlzKTsKICAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKIApAQCAtMTUxLDI2ICsxNTcsMzIgQEAKICAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiYWNrZWQtdXAgc2V0dGluZ3MuCiAgICAgICAgICAgICBTdHJpbmcgcm9vdCA9IGdldEZpbGVzRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgICBGaWxlIHN0YWdlID0gbmV3IEZpbGUocm9vdCwgU1RBR0VfRklMRSk7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZpbGVzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzdGFnZSk7Ci0gICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBidWZzdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZmlsZXN0cmVhbSk7Ci0gICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJ1ZnN0cmVhbSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmlsZXN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHN0YWdlKTsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBidWZzdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZmlsZXN0cmVhbSk7CisgICAgICAgICAgICAgICAgRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShidWZzdHJlYW0pOwogCi0gICAgICAgICAgICBvdXQud3JpdGVJbnQoc3lzdGVtU2V0dGluZ3NEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoc3lzdGVtU2V0dGluZ3NEYXRhKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludChzZWN1cmVTZXR0aW5nc0RhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIG91dC53cml0ZShzZWN1cmVTZXR0aW5nc0RhdGEpOwotICAgICAgICAgICAgb3V0LndyaXRlSW50KGxvY2FsZS5sZW5ndGgpOwotICAgICAgICAgICAgb3V0LndyaXRlKGxvY2FsZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQod2lmaVN1cHBsaWNhbnREYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUod2lmaVN1cHBsaWNhbnREYXRhKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludCh3aWZpQ29uZmlnRGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgb3V0LndyaXRlKHdpZmlDb25maWdEYXRhKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQoRlVMTF9CQUNLVVBfVkVSU0lPTik7CiAKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOyAgICAvLyBhbHNvIGZsdXNoZXMgZG93bnN0cmVhbQorICAgICAgICAgICAgICAgIG91dC53cml0ZUludChzeXN0ZW1TZXR0aW5nc0RhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoc3lzdGVtU2V0dGluZ3NEYXRhKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQoc2VjdXJlU2V0dGluZ3NEYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKHNlY3VyZVNldHRpbmdzRGF0YSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KGxvY2FsZS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG91dC53cml0ZShsb2NhbGUpOworICAgICAgICAgICAgICAgIG91dC53cml0ZUludCh3aWZpU3VwcGxpY2FudERhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUod2lmaVN1cHBsaWNhbnREYXRhKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQod2lmaUNvbmZpZ0RhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUod2lmaUNvbmZpZ0RhdGEpOwogCi0gICAgICAgICAgICAvLyBub3cgd2UncmUgc2V0IHRvIGVtaXQgdGhlIHRhciBzdHJlYW0KLSAgICAgICAgICAgIEZ1bGxCYWNrdXAuYmFja3VwVG9UYXIoZ2V0UGFja2FnZU5hbWUoKSwgRnVsbEJhY2t1cC5EQVRBX1RSRUVfVE9LRU4sIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIHJvb3QsIHN0YWdlLmdldEFic29sdXRlUGF0aCgpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsgICAgLy8gYWxzbyBmbHVzaGVzIGRvd25zdHJlYW0KKworICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSdyZSBzZXQgdG8gZW1pdCB0aGUgdGFyIHN0cmVhbQorICAgICAgICAgICAgICAgIEZ1bGxCYWNrdXAuYmFja3VwVG9UYXIoZ2V0UGFja2FnZU5hbWUoKSwgRnVsbEJhY2t1cC5EQVRBX1RSRUVfVE9LRU4sIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICByb290LCBzdGFnZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGF0YSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHN0YWdlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTksNyArMjExLDcgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoS0VZX0xPQ0FMRS5lcXVhbHMoa2V5KSkgewogICAgICAgICAgICAgICAgIGJ5dGVbXSBsb2NhbGVEYXRhID0gbmV3IGJ5dGVbc2l6ZV07CiAgICAgICAgICAgICAgICAgZGF0YS5yZWFkRW50aXR5RGF0YShsb2NhbGVEYXRhLCAwLCBzaXplKTsKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NIZWxwZXIuc2V0TG9jYWxlRGF0YShsb2NhbGVEYXRhKTsKKyAgICAgICAgICAgICAgICBtU2V0dGluZ3NIZWxwZXIuc2V0TG9jYWxlRGF0YShsb2NhbGVEYXRhLCBzaXplKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoS0VZX1dJRklfQ09ORklHLmVxdWFscyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgcmVzdG9yZUZpbGVEYXRhKG1XaWZpQ29uZmlnRmlsZSwgZGF0YSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTIwOCw2ICsyMjAsNzAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUZpbGUoUGFyY2VsRmlsZURlc2NyaXB0b3IgZGF0YSwgbG9uZyBzaXplLAorICAgICAgICAgICAgaW50IHR5cGUsIFN0cmluZyBkb21haW4sIFN0cmluZyByZWxwYXRoLCBsb25nIG1vZGUsIGxvbmcgbXRpbWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoREVCVUdfQkFDS1VQKSBMb2cuZChUQUcsICJvblJlc3RvcmVGaWxlKCkgaW52b2tlZCIpOworICAgICAgICAvLyBPdXIgZGF0YSBpcyBhY3R1YWxseSBhIGJsb2Igb2YgZmxhdHRlbmVkIHNldHRpbmdzIGRhdGEgaWRlbnRpY2FsIHRvIHRoYXQKKyAgICAgICAgLy8gcHJvZHVjZWQgZHVyaW5nIGluY3JlbWVudGFsIGJhY2t1cHMuICBKdXN0IHVucGFjayBhbmQgYXBwbHkgaXQgYWxsIGluCisgICAgICAgIC8vIHR1cm4uCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZGF0YS5nZXRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbnN0cmVhbSk7CisKKyAgICAgICAgaW50IHZlcnNpb24gPSBpbi5yZWFkSW50KCk7CisgICAgICAgIGlmIChERUJVR19CQUNLVVApIExvZy5kKFRBRywgIkZsYXR0ZW5lZCBkYXRhIHZlcnNpb24gIiArIHZlcnNpb24pOworICAgICAgICBpZiAodmVyc2lvbiA9PSBGVUxMX0JBQ0tVUF9WRVJTSU9OKSB7CisgICAgICAgICAgICAvLyBzeXN0ZW0gc2V0dGluZ3MgZGF0YSBmaXJzdAorICAgICAgICAgICAgaW50IG5CeXRlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChERUJVR19CQUNLVVApIExvZy5kKFRBRywgbkJ5dGVzICsgIiBieXRlcyBvZiBzZXR0aW5ncyBkYXRhIik7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbbkJ5dGVzXTsKKyAgICAgICAgICAgIGluLnJlYWQoYnVmZmVyLCAwLCBuQnl0ZXMpOworICAgICAgICAgICAgcmVzdG9yZVNldHRpbmdzKGJ1ZmZlciwgbkJ5dGVzLCBTZXR0aW5ncy5TeXN0ZW0uQ09OVEVOVF9VUkkpOworCisgICAgICAgICAgICAvLyBzZWN1cmUgc2V0dGluZ3MKKyAgICAgICAgICAgIG5CeXRlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChERUJVR19CQUNLVVApIExvZy5kKFRBRywgbkJ5dGVzICsgIiBieXRlcyBvZiBzZWN1cmUgc2V0dGluZ3MgZGF0YSIpOworICAgICAgICAgICAgaWYgKG5CeXRlcyA+IGJ1ZmZlci5sZW5ndGgpIGJ1ZmZlciA9IG5ldyBieXRlW25CeXRlc107CisgICAgICAgICAgICBpbi5yZWFkKGJ1ZmZlciwgMCwgbkJ5dGVzKTsKKyAgICAgICAgICAgIHJlc3RvcmVTZXR0aW5ncyhidWZmZXIsIG5CeXRlcywgU2V0dGluZ3MuU2VjdXJlLkNPTlRFTlRfVVJJKTsKKworICAgICAgICAgICAgLy8gbG9jYWxlCisgICAgICAgICAgICBuQnl0ZXMgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBpZiAoREVCVUdfQkFDS1VQKSBMb2cuZChUQUcsIG5CeXRlcyArICIgYnl0ZXMgb2YgbG9jYWxlIGRhdGEiKTsKKyAgICAgICAgICAgIGlmIChuQnl0ZXMgPiBidWZmZXIubGVuZ3RoKSBidWZmZXIgPSBuZXcgYnl0ZVtuQnl0ZXNdOworICAgICAgICAgICAgaW4ucmVhZChidWZmZXIsIDAsIG5CeXRlcyk7CisgICAgICAgICAgICBtU2V0dGluZ3NIZWxwZXIuc2V0TG9jYWxlRGF0YShidWZmZXIsIG5CeXRlcyk7CisKKyAgICAgICAgICAgIC8vIHdpZmkgc3VwcGxpY2FudAorICAgICAgICAgICAgbkJ5dGVzID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaWYgKERFQlVHX0JBQ0tVUCkgTG9nLmQoVEFHLCBuQnl0ZXMgKyAiIGJ5dGVzIG9mIHdpZmkgc3VwcGxpY2FudCBkYXRhIik7CisgICAgICAgICAgICBpZiAobkJ5dGVzID4gYnVmZmVyLmxlbmd0aCkgYnVmZmVyID0gbmV3IGJ5dGVbbkJ5dGVzXTsKKyAgICAgICAgICAgIGluLnJlYWQoYnVmZmVyLCAwLCBuQnl0ZXMpOworICAgICAgICAgICAgaW50IHJldGFpbmVkV2lmaVN0YXRlID0gZW5hYmxlV2lmaShmYWxzZSk7CisgICAgICAgICAgICByZXN0b3JlV2lmaVN1cHBsaWNhbnQoRklMRV9XSUZJX1NVUFBMSUNBTlQsIGJ1ZmZlciwgbkJ5dGVzKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5zZXRQZXJtaXNzaW9ucyhGSUxFX1dJRklfU1VQUExJQ0FOVCwKKyAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLlNfSVJVU1IgfCBGaWxlVXRpbHMuU19JV1VTUiB8CisgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5TX0lSR1JQIHwgRmlsZVV0aWxzLlNfSVdHUlAsCisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSwgUHJvY2Vzcy5XSUZJX1VJRCk7CisgICAgICAgICAgICAvLyByZXRhaW4gdGhlIHByZXZpb3VzIFdJRkkgc3RhdGUuCisgICAgICAgICAgICBlbmFibGVXaWZpKHJldGFpbmVkV2lmaVN0YXRlID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRCB8fAorICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFdpZmlTdGF0ZSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HKTsKKworICAgICAgICAgICAgLy8gd2lmaSBjb25maWcKKyAgICAgICAgICAgIG5CeXRlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChERUJVR19CQUNLVVApIExvZy5kKFRBRywgbkJ5dGVzICsgIiBieXRlcyBvZiB3aWZpIGNvbmZpZyBkYXRhIik7CisgICAgICAgICAgICBpZiAobkJ5dGVzID4gYnVmZmVyLmxlbmd0aCkgYnVmZmVyID0gbmV3IGJ5dGVbbkJ5dGVzXTsKKyAgICAgICAgICAgIGluLnJlYWQoYnVmZmVyLCAwLCBuQnl0ZXMpOworICAgICAgICAgICAgcmVzdG9yZUZpbGVEYXRhKG1XaWZpQ29uZmlnRmlsZSwgYnVmZmVyLCBuQnl0ZXMpOworCisgICAgICAgICAgICBpZiAoREVCVUdfQkFDS1VQKSBMb2cuZChUQUcsICJGdWxsIHJlc3RvcmUgY29tcGxldGUuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLmNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludmFsaWQgZmlsZSBzY2hlbWEiKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgbG9uZ1tdIHJlYWRPbGRDaGVja3N1bXMoUGFyY2VsRmlsZURlc2NyaXB0b3Igb2xkU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGxvbmdbXSBzdGF0ZUNoZWNrc3VtcyA9IG5ldyBsb25nW1NUQVRFX1NJWkVdOwogCkBAIC0yODcsNiArMzYzLDE3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTZXR0aW5ncyhCYWNrdXBEYXRhSW5wdXQgZGF0YSwgVXJpIGNvbnRlbnRVcmkpIHsKKyAgICAgICAgYnl0ZVtdIHNldHRpbmdzID0gbmV3IGJ5dGVbZGF0YS5nZXREYXRhU2l6ZSgpXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRhdGEucmVhZEVudGl0eURhdGEoc2V0dGluZ3MsIDAsIHNldHRpbmdzLmxlbmd0aCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGRuJ3QgcmVhZCBlbnRpdHkgZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJlc3RvcmVTZXR0aW5ncyhzZXR0aW5ncywgc2V0dGluZ3MubGVuZ3RoLCBjb250ZW50VXJpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVNldHRpbmdzKGJ5dGVbXSBzZXR0aW5ncywgaW50IGJ5dGVzLCBVcmkgY29udGVudFVyaSkgewogICAgICAgICBpZiAoREVCVUcpIExvZy5pKFRBRywgInJlc3RvcmVTZXR0aW5nczogIiArIGNvbnRlbnRVcmkpOwogICAgICAgICBTdHJpbmdbXSB3aGl0ZWxpc3QgPSBudWxsOwogICAgICAgICBpZiAoY29udGVudFVyaS5lcXVhbHMoU2V0dGluZ3MuU2VjdXJlLkNPTlRFTlRfVVJJKSkgewpAQCAtMjk2LDE1ICszODMsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQ29udGVudFZhbHVlcyBjdiA9IG5ldyBDb250ZW50VmFsdWVzKDIpOwotICAgICAgICBieXRlW10gc2V0dGluZ3MgPSBuZXcgYnl0ZVtkYXRhLmdldERhdGFTaXplKCldOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGF0YS5yZWFkRW50aXR5RGF0YShzZXR0aW5ncywgMCwgc2V0dGluZ3MubGVuZ3RoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCByZWFkIGVudGl0eSBkYXRhIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KICAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgIHdoaWxlIChwb3MgPCBzZXR0aW5ncy5sZW5ndGgpIHsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGJ5dGVzKSB7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVhZEludChzZXR0aW5ncywgcG9zKTsKICAgICAgICAgICAgIHBvcyArPSA0OwogICAgICAgICAgICAgU3RyaW5nIHNldHRpbmdOYW1lID0gbGVuZ3RoID4gMD8gbmV3IFN0cmluZyhzZXR0aW5ncywgcG9zLCBsZW5ndGgpIDogbnVsbDsKQEAgLTQ1MSwxMyArNTMxLDE2IEBACiAgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVGaWxlRGF0YShTdHJpbmcgZmlsZW5hbWUsIEJhY2t1cERhdGFJbnB1dCBkYXRhKSB7CiAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2RhdGEuZ2V0RGF0YVNpemUoKV07CiAgICAgICAgIGlmIChieXRlcy5sZW5ndGggPD0gMCkgcmV0dXJuOworICAgICAgICByZXN0b3JlRmlsZURhdGEoZmlsZW5hbWUsIGJ5dGVzLCBieXRlcy5sZW5ndGgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlRmlsZURhdGEoU3RyaW5nIGZpbGVuYW1lLCBieXRlW10gYnl0ZXMsIGludCBzaXplKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYXRhLnJlYWRFbnRpdHlEYXRhKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwogICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIGZpbGUuZGVsZXRlKCk7CiAKICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSwgdHJ1ZSkpOwotICAgICAgICAgICAgb3Mud3JpdGUoYnl0ZXMpOworICAgICAgICAgICAgb3Mud3JpdGUoYnl0ZXMsIDAsIHNpemUpOwogICAgICAgICAgICAgb3MuY2xvc2UoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZG4ndCByZXN0b3JlICIgKyBmaWxlbmFtZSk7CkBAIC01MDYsMTUgKzU4OSwxOCBAQAogICAgIHByaXZhdGUgdm9pZCByZXN0b3JlV2lmaVN1cHBsaWNhbnQoU3RyaW5nIGZpbGVuYW1lLCBCYWNrdXBEYXRhSW5wdXQgZGF0YSkgewogICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtkYXRhLmdldERhdGFTaXplKCldOwogICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoIDw9IDApIHJldHVybjsKKyAgICAgICAgcmVzdG9yZVdpZmlTdXBwbGljYW50KGZpbGVuYW1lLCBieXRlcywgYnl0ZXMubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVdpZmlTdXBwbGljYW50KFN0cmluZyBmaWxlbmFtZSwgYnl0ZVtdIGJ5dGVzLCBpbnQgc2l6ZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgZGF0YS5yZWFkRW50aXR5RGF0YShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKICAgICAgICAgICAgIEZpbGUgc3VwcGxpY2FudEZpbGUgPSBuZXcgRmlsZShGSUxFX1dJRklfU1VQUExJQ0FOVCk7CiAgICAgICAgICAgICBpZiAoc3VwcGxpY2FudEZpbGUuZXhpc3RzKCkpIHN1cHBsaWNhbnRGaWxlLmRlbGV0ZSgpOwogICAgICAgICAgICAgY29weVdpZmlTdXBwbGljYW50VGVtcGxhdGUoKTsKIAogICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lLCB0cnVlKSk7CiAgICAgICAgICAgICBvcy53cml0ZSgiXG4iLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgb3Mud3JpdGUoYnl0ZXMpOworICAgICAgICAgICAgb3Mud3JpdGUoYnl0ZXMsIDAsIHNpemUpOwogICAgICAgICAgICAgb3MuY2xvc2UoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZG4ndCByZXN0b3JlICIgKyBmaWxlbmFtZSk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NIZWxwZXIuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc0hlbHBlci5qYXZhCmluZGV4IDBlNzVmYmMuLjNlN2Q4NmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc0hlbHBlci5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc0hlbHBlci5qYXZhCkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgKiAibGwiIGlzIHRoZSBsYW5ndWFnZSBjb2RlIGFuZCAiY2MiIGlzIHRoZSBjb3VudHJ5IGNvZGUuCiAgICAgICogQHBhcmFtIGRhdGEgdGhlIGxvY2FsZSBzdHJpbmcgaW4gYnl0ZXMuCiAgICAgICovCi0gICAgdm9pZCBzZXRMb2NhbGVEYXRhKGJ5dGVbXSBkYXRhKSB7CisgICAgdm9pZCBzZXRMb2NhbGVEYXRhKGJ5dGVbXSBkYXRhLCBpbnQgc2l6ZSkgewogICAgICAgICAvLyBDaGVjayBpZiBsb2NhbGUgd2FzIHNldCBieSB0aGUgdXNlcjoKICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25mID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpOwogICAgICAgICBMb2NhbGUgbG9jID0gY29uZi5sb2NhbGU7CkBAIC0xNTcsOSArMTU3LDkgQEAKICAgICAgICAgaWYgKGNvbmYudXNlclNldExvY2FsZSkgcmV0dXJuOyAvLyBEb24ndCBjaGFuZ2UgaWYgdXNlciBzZXQgaXQgaW4gdGhlIFNldHVwV2l6YXJkCiAKICAgICAgICAgZmluYWwgU3RyaW5nW10gYXZhaWxhYmxlTG9jYWxlcyA9IG1Db250ZXh0LmdldEFzc2V0cygpLmdldExvY2FsZXMoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsZUNvZGUgPSBuZXcgU3RyaW5nKGRhdGEpOworICAgICAgICBTdHJpbmcgbG9jYWxlQ29kZSA9IG5ldyBTdHJpbmcoZGF0YSwgMCwgc2l6ZSk7CiAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IG5ldyBTdHJpbmcoZGF0YSwgMCwgMik7Ci0gICAgICAgIFN0cmluZyBjb3VudHJ5ID0gZGF0YS5sZW5ndGggPiA0ID8gbmV3IFN0cmluZyhkYXRhLCAzLCAyKSA6ICIiOworICAgICAgICBTdHJpbmcgY291bnRyeSA9IHNpemUgPiA0ID8gbmV3IFN0cmluZyhkYXRhLCAzLCAyKSA6ICIiOwogICAgICAgICBsb2MgPSBudWxsOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZUxvY2FsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGlmIChhdmFpbGFibGVMb2NhbGVzW2ldLmVxdWFscyhsb2NhbGVDb2RlKSkgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL2FwcF9pY29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvYXBwX2ljb24ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvYXBwX2ljb24ucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL2FwcF9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvcmVjZW50c19iZ19wcm90ZWN0X3RpbGUucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvcmVjZW50c19iZ19wcm90ZWN0X3RpbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzF4LnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfM2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfNGcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfNGcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9lLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzF4LnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fM2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fNGcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fNGcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9lLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzF4LnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfM2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfNGcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfNGcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9lLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzF4LnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfM2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfNGcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfNGcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9lLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfaC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9yb2FtLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfcm9hbS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9yb2FtLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9yb2FtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvYXBwX2ljb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9hcHBfaWNvbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9hcHBfaWNvbi5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvYXBwX2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfYmdfcHJvdGVjdF90aWxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfYmdfcHJvdGVjdF90aWxlLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfYmx1ZV9nbG93LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9yZWNlbnRzX2JsdWVfZ2xvdy45LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfYmx1ZV9nbG93LjkucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfYmx1ZV9nbG93LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9yZWNlbnRzX2NhbGxvdXRfbGluZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfY2FsbG91dF9saW5lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfY2FsbG91dF9saW5lLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9yZWNlbnRzX2NhbGxvdXRfbGluZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvcmVjZW50c190aHVtYm5haWxfYmcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvcmVjZW50c190aHVtYm5haWxfYmcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvcmVjZW50c190aHVtYm5haWxfYmdfcHJlc3MucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZ19wcmVzcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZ19wcmVzcy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvcmVjZW50c190aHVtYm5haWxfYmdfcHJlc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzF4LnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfM2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfNGcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfNGcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9lLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzF4LnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fM2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fNGcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fNGcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9lLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzF4LnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfM2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfNGcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfNGcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9lLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzF4LnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfM2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfNGcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfNGcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9lLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfaC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9yb2FtLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfcm9hbS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9yb2FtLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9yb2FtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfM2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF80Zy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9oLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWZyLWxhcmdlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1mci1sYXJnZS9zdHJpbmdzLnhtbAppbmRleCA0NDdiMTc0Li5mOGRkNTVlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWZyLWxhcmdlL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtZnItbGFyZ2Uvc3RyaW5ncy54bWwKQEAgLTIxLDcgKzIxLDcgQEAKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CiAgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iIG1zZ2lkPSI0NjYxNTgzODk2ODAzMzQ5NzMyIj4iVG91dCBlZmZhY2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9zZXR0aW5nc19zaWduYWxfbWV0ZXJfZGlzY29ubmVjdGVkIiBtc2dpZD0iMzgzMTQ1MTc4NzU1MzI5MDY3Ij4iQXVjdW5lIGNvbm5leGlvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3Nfc2lnbmFsX21ldGVyX3dpZmlfbm9zc2lkIiBtc2dpZD0iMjUzNTQ2NTI5NDQzNzU4NjUyOCI+IkNvbm5lY3TDqSBhdSBXaS1GaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3NldHRpbmdzX3NpZ25hbF9tZXRlcl93aWZpX25vc3NpZCIgbXNnaWQ9IjI1MzU0NjUyOTQ0Mzc1ODY1MjgiPiJDb25uZWN0w6kgYXUgV2ktRmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJncHNfbm90aWZpY2F0aW9uX3NlYXJjaGluZ190ZXh0IiBtc2dpZD0iNDQ2NzkzNTE4Njg2NDIwODI0OSI+IlJlY2hlcmNoZSBkZSBHUFMgZW4gY291cnMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJncHNfbm90aWZpY2F0aW9uX2ZvdW5kX3RleHQiIG1zZ2lkPSI2MjcwNjI4Mzg4OTE4ODIyOTU2Ij4iUG9zaXRpb24gZMOpZmluaWUgcGFyIEdQUyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vdGlmaWNhdGlvbnNfb2ZmX3RpdGxlIiBtc2dpZD0iMTg2MDExNzY5NjAzNDc3NTg1MSI+Ik5vdGlmaWNhdGlvbnMgZMOpc2FjdGl2w6llcyI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaXQtbGFyZ2Uvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWl0LWxhcmdlL3N0cmluZ3MueG1sCmluZGV4IDNjZGU1MjkuLjE4Y2NkMDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaXQtbGFyZ2Uvc3RyaW5ncy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1pdC1sYXJnZS9zdHJpbmdzLnhtbApAQCAtMTksOCArMTksOCBAQAogCiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iIG1zZ2lkPSI0NjYxNTgzODk2ODAzMzQ5NzMyIj4iQ2FuY2VsbGEgdHV0dG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3NldHRpbmdzX3NpZ25hbF9tZXRlcl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSIzODMxNDUxNzg3NTUzMjkwNjciPiJOZXNzdW5hIGNvbm5lc3MuIEludGVybmV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uIiBtc2dpZD0iNDY2MTU4Mzg5NjgwMzM0OTczMiI+IkNhbmNlbGxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9zZXR0aW5nc19zaWduYWxfbWV0ZXJfZGlzY29ubmVjdGVkIiBtc2dpZD0iMzgzMTQ1MTc4NzU1MzI5MDY3Ij4iTmVzc3VuYSBjb25uZXNzaW9uZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3Nfc2lnbmFsX21ldGVyX3dpZmlfbm9zc2lkIiBtc2dpZD0iMjUzNTQ2NTI5NDQzNzU4NjUyOCI+IldpLUZpIGNvbm5lc3NvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZ3BzX25vdGlmaWNhdGlvbl9zZWFyY2hpbmdfdGV4dCIgbXNnaWQ9IjQ0Njc5MzUxODY4NjQyMDgyNDkiPiJSaWNlcmNhIGRlbCBHUFMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJncHNfbm90aWZpY2F0aW9uX2ZvdW5kX3RleHQiIG1zZ2lkPSI2MjcwNjI4Mzg4OTE4ODIyOTU2Ij4iUG9zaXppb25lIHN0YWJpbGl0YSBkYWwgR1BTIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1sYXJnZS9jb25maWcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1sYXJnZS9jb25maWcueG1sCmluZGV4IDI5OWFiOTcuLjQwMTRmOGQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtbGFyZ2UvY29uZmlnLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWxhcmdlL2NvbmZpZy54bWwKQEAgLTIwLDE0ICsyMCw3IEBACiA8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKICAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgogPHJlc291cmNlcz4KLSAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbiI+MTwvaW50ZWdlcj4KLQotICAgIDwhLS0gQ29tcG9uZW50IHRvIGJlIHVzZWQgYXMgdGhlIHN0YXR1cyBiYXIgc2VydmljZS4gIE11c3QgaW1wbGVtZW50IHRoZSBJU3RhdHVzQmFyCi0gICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj5jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0Jhcjwvc3RyaW5nPgotCiAgICAgPCEtLSBXaGV0aGVyIG9yIG5vdCB3ZSBzaG93IHRoZSBudW1iZXIgaW4gdGhlIGJhci4gLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX3N0YXR1c0JhclNob3dOdW1iZXIiPmZhbHNlPC9ib29sPgotCiA8L3Jlc291cmNlcz4KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1ydS1sYXJnZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtcnUtbGFyZ2Uvc3RyaW5ncy54bWwKaW5kZXggYzQ4MzIxZS4uYmFmYjk3ZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1ydS1sYXJnZS9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXJ1LWxhcmdlL3N0cmluZ3MueG1sCkBAIC0xOSwxMSArMTksMTEgQEAKIAogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uIiBtc2dpZD0iNDY2MTU4Mzg5NjgwMzM0OTczMiI+ItCe0YfQuNGB0YLQuNGC0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iIG1zZ2lkPSI0NjYxNTgzODk2ODAzMzQ5NzMyIj4i0J7Rh9C40YHRgtC40YLRjCDQstGB0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3NldHRpbmdzX3NpZ25hbF9tZXRlcl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSIzODMxNDUxNzg3NTUzMjkwNjciPiLQndC10YIg0L/QvtC00LrQu9GO0YfQtdC90LjRjyDQuiDQmNC90YLQtdGA0L3QtdGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3NldHRpbmdzX3NpZ25hbF9tZXRlcl93aWZpX25vc3NpZCIgbXNnaWQ9IjI1MzU0NjUyOTQ0Mzc1ODY1MjgiPiJXaS1GaTog0L/QvtC00LrQu9GO0YfQtdC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJncHNfbm90aWZpY2F0aW9uX3NlYXJjaGluZ190ZXh0IiBtc2dpZD0iNDQ2NzkzNTE4Njg2NDIwODI0OSI+ItCS0YvQv9C+0LvQvdGP0LXRgtGB0Y8g0L/QvtC40YHQuiDQv9GA0Lgg0L/QvtC80L7RidC4IEdQUyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3Nfc2lnbmFsX21ldGVyX3dpZmlfbm9zc2lkIiBtc2dpZD0iMjUzNTQ2NTI5NDQzNzU4NjUyOCI+IldpLUZpINC/0L7QtNC60LvRjtGH0LXQvdC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ3BzX25vdGlmaWNhdGlvbl9zZWFyY2hpbmdfdGV4dCIgbXNnaWQ9IjQ0Njc5MzUxODY4NjQyMDgyNDkiPiLQn9C+0LjRgdC6IEdQUyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imdwc19ub3RpZmljYXRpb25fZm91bmRfdGV4dCIgbXNnaWQ9IjYyNzA2MjgzODg5MTg4MjI5NTYiPiLQnNC10YHRgtC+0L/QvtC70L7QttC10L3QuNC1INGD0YHRgtCw0L3QvtCy0LvQtdC90L4g0YEg0L/QvtC80L7RidGM0Y4gR1BTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibm90aWZpY2F0aW9uc19vZmZfdGl0bGUiIG1zZ2lkPSIxODYwMTE3Njk2MDM0Nzc1ODUxIj4i0J/QvtC60LDQtyDRg9Cy0LXQtNC+0LzQu9C10L3QuNC5INC+0YLQutC70Y7Rh9C10L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJub3RpZmljYXRpb25zX29mZl90ZXh0IiBtc2dpZD0iMTQzOTE1MjgwNjMyMDc4NjkxMiI+ItCd0LDQttC80LjRgtC1INC30LTQtdGB0YwsINGH0YLQvtCx0Ysg0YHQvdC+0LLQsCDRgNCw0LfRgNC10YjQuNGC0Ywg0L/QvtC60LDQtyDRg9Cy0LXQtNC+0LzQu9C10L3QuNC5LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vdGlmaWNhdGlvbnNfb2ZmX3RpdGxlIiBtc2dpZD0iMTg2MDExNzY5NjAzNDc3NTg1MSI+ItCj0LLQtdC00L7QvNC70LXQvdC40Y8g0L7RgtC60LvRjtGH0LXQvdGLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm90aWZpY2F0aW9uc19vZmZfdGV4dCIgbXNnaWQ9IjE0MzkxNTI4MDYzMjA3ODY5MTIiPiLQndCw0LbQvNC40YLQtSDQt9C00LXRgdGMLCDRh9GC0L7QsdGLINGB0L3QvtCy0LAg0LLQutC70Y7Rh9C40YLRjCDRg9Cy0LXQtNC+0LzQu9C10L3QuNGPLiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzYwMGRwLXBvcnQvY29uZmlnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c2MDBkcC1wb3J0L2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI3NjYxYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c2MDBkcC1wb3J0L2NvbmZpZy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcz4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbWF4Tm90aWZpY2F0aW9uSWNvbnMiPjM8L2ludGVnZXI+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzYwMGRwLXBvcnQvZGltZW5zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c2MDBkcC1wb3J0L2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhNmNmZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c2MDBkcC1wb3J0L2RpbWVucy54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzPgorICAgIDwhLS0gZ2FwIG9uIGVpdGhlciBzaWRlIG9mIHN0YXR1cyBiYXIgbm90aWZpY2F0aW9uIGljb25zIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fcGFkZGluZyI+MGRwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb2xvcnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzYwMGRwL2NvbG9ycy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbG9ycy54bWwKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c2MDBkcC9jb2xvcnMueG1sCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYzhiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisgICAgPCEtLSBUaGUgd2lkdGggb2YgdGhlIHRpY2tlciwgaW5jbHVkaW5nIHRoZSBpY29uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJub3RpZmljYXRpb25fdGlja2VyX3dpZHRoIj4zNjBkcDwvZGltZW4+CisgICAgPCEtLSBTdGF0dXMgYmFyIHBhbmVsIGJvdHRvbSBvZmZzZXQgKGhlaWdodCBvZiBzdGF0dXMgYmFyIC0gb3ZlcmxhcCkgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcGFuZWxfYm90dG9tX29mZnNldCI+MzZkcDwvZGltZW4+CisgICAgPCEtLSBnYXAgb24gZWl0aGVyIHNpZGUgb2Ygc3RhdHVzIGJhciBub3RpZmljYXRpb24gaWNvbnMgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaWNvbl9wYWRkaW5nIj44ZHA8L2RpbWVuPgorICAgIDwhLS0gVGhlIHdpZHRoIG9mIHRoZSBub3RpZmljYXRpb24gcGFuZWwgd2luZG93IC0tPgorICAgIDxkaW1lbiBuYW1lPSJub3RpZmljYXRpb25fcGFuZWxfd2lkdGgiPjUxMmRwPC9kaW1lbj4KKyAgICA8IS0tIFRoZSBtaW5pbXVtIGhlaWdodCBvZiB0aGUgbm90aWZpY2F0aW9uIHBhbmVsIHdpbmRvdyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ibm90aWZpY2F0aW9uX3BhbmVsX21pbl9oZWlnaHQiPjc3MGRwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXN3NzIwZHAtcG9ydC9kaW1lbnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzcyMGRwLXBvcnQvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGIyNjZkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzcyMGRwLXBvcnQvZGltZW5zLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzPgorICAgIDwhLS0gZ2FwIG9uIGVpdGhlciBzaWRlIG9mIHN0YXR1cyBiYXIgbm90aWZpY2F0aW9uIGljb25zIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fcGFkZGluZyI+MmRwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXN3NzIwZHAvY29uZmlnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c3MjBkcC9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjhlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXN3NzIwZHAvY29uZmlnLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAorICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+Cis8cmVzb3VyY2VzPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19tYXhOb3RpZmljYXRpb25JY29ucyI+NTwvaW50ZWdlcj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS1wb3J0L2RpbWVucy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS1wb3J0L2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWZmYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UtcG9ydC9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLS0+Ci08cmVzb3VyY2VzPgotICAgIDwhLS0gZ2FwIG9uIGVpdGhlciBzaWRlIG9mIHN0YXR1cyBiYXIgbm90aWZpY2F0aW9uIGljb25zIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fcGFkZGluZyI+MmRwPC9kaW1lbj4KLTwvcmVzb3VyY2VzPgotCi0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODllMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSB3aWR0aCBvZiB0aGUgdGlja2VyLCBpbmNsdWRpbmcgdGhlIGljb24gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im5vdGlmaWNhdGlvbl90aWNrZXJfd2lkdGgiPjM2MGRwPC9kaW1lbj4KLSAgICA8IS0tIFN0YXR1cyBiYXIgcGFuZWwgYm90dG9tIG9mZnNldCAoaGVpZ2h0IG9mIHN0YXR1cyBiYXIgLSBvdmVybGFwKSAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9wYW5lbF9ib3R0b21fb2Zmc2V0Ij4zNmRwPC9kaW1lbj4KLSAgICA8IS0tIGdhcCBvbiBlaXRoZXIgc2lkZSBvZiBzdGF0dXMgYmFyIG5vdGlmaWNhdGlvbiBpY29ucyAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3BhZGRpbmciPjhkcDwvZGltZW4+Ci08L3Jlc291cmNlcz4KLQotCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggOTU0YTg3MS4uN2E0YWM1ZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtMjUsMTYgKzI1LDE0IEBACiAgICAgZGF0YSBpY29uIG9uIGRldmljZXMgLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2hzcGFfZGF0YV9kaXN0aW5ndWlzaGFibGUiPmZhbHNlPC9ib29sPgogCi0gICAgPCEtLSBUaGUgbG9jYXRpb24gb2YgdGhlIHN0YXR1cyBiYXIuCi0gICAgICAgIDAgLSB0b3AKLSAgICAgICAgMSAtIGJvdHRvbQotICAgIC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19zdGF0dXNfYmFyX3Bvc2l0aW9uIj4wPC9pbnRlZ2VyPgotCiAgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKICAgICAgaW50ZXJmYWNlLiAgVGhpcyBuYW1lIGlzIGluIHRoZSBDb21wb25lbnROYW1lIGZsYXR0ZW5lZCBmb3JtYXQgKHBhY2thZ2UvY2xhc3MpICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDb21wb25lbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPmNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waG9uZS5QaG9uZVN0YXR1c0Jhcjwvc3RyaW5nPgogCisgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3lzdGVtIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKKyAgICAgaW50ZXJmYWNlLiAgVGhpcyBuYW1lIGlzIGluIHRoZSBDb21wb25lbnROYW1lIGZsYXR0ZW5lZCBmb3JtYXQgKHBhY2thZ2UvY2xhc3MpICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ19zeXN0ZW1CYXJDb21wb25lbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPmNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuVGFibGV0U3RhdHVzQmFyPC9zdHJpbmc+CisKICAgICA8IS0tIFdoZXRoZXIgb3Igbm90IHdlIHNob3cgdGhlIG51bWJlciBpbiB0aGUgYmFyLiAtLT4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfc3RhdHVzQmFyU2hvd051bWJlciI+dHJ1ZTwvYm9vbD4KIApAQCAtNDIsNSArNDAsOCBAQAogICAgICAgICAgYXV0b2RldGVjdGVkIGZyb20gdGhlIENvbmZpZ3VyYXRpb24uIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19zaG93TmF2aWdhdGlvbkJhciI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIEhvdyBtYW55IGljb25zIG1heSBiZSBzaG93biBhdCBvbmNlIGluIHRoZSBzeXN0ZW0gYmFyLiBJbmNsdWRlcyBhbnkKKyAgICAgICAgIHNsb3RzIHRoYXQgbWF5IGJlIHJldXNlZCBmb3IgdGhpbmdzIGxpa2UgSU1FIGNvbnRyb2wuIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19tYXhOb3RpZmljYXRpb25JY29ucyI+NTwvaW50ZWdlcj4KIDwvcmVzb3VyY2VzPgogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvU3lzdGVtVUlTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvU3lzdGVtVUlTZXJ2aWNlLmphdmEKaW5kZXggODcwYWNkMy4uZDdhNTA1NiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL1N5c3RlbVVJU2VydmljZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9TeXN0ZW1VSVNlcnZpY2UuamF2YQpAQCAtMjcsNyArMjcsMTAgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyOwogCiBwdWJsaWMgY2xhc3MgU3lzdGVtVUlTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtVUlTZXJ2aWNlIjsKQEAgLTM2LDcgKzM5LDcgQEAKICAgICAgKiBUaGUgY2xhc3MgbmFtZXMgb2YgdGhlIHN0dWZmIHRvIHN0YXJ0LgogICAgICAqLwogICAgIGZpbmFsIE9iamVjdFtdIFNFUlZJQ0VTID0gbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgIFIuc3RyaW5nLmNvbmZpZ19zdGF0dXNCYXJDb21wb25lbnQsCisgICAgICAgICAgICAwLCAvLyBzeXN0ZW0gYmFyIG9yIHN0YXR1cyBiYXIsIGZpbGxlZCBpbiBiZWxvdy4KICAgICAgICAgICAgIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBvd2VyLlBvd2VyVUkuY2xhc3MsCiAgICAgICAgIH07CiAKQEAgLTYyLDYgKzY1LDE3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgLy8gUGljayBzdGF0dXMgYmFyIG9yIHN5c3RlbSBiYXIuCisgICAgICAgIElXaW5kb3dNYW5hZ2VyIHdtID0gSVdpbmRvd01hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNFUlZJQ0VTWzBdID0gd20uY2FuU3RhdHVzQmFySGlkZSgpCisgICAgICAgICAgICAgICAgICAgID8gUi5zdHJpbmcuY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICA6IFIuc3RyaW5nLmNvbmZpZ19zeXN0ZW1CYXJDb21wb25lbnQ7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGluZyBjaGVja2luZyB3aGV0aGVyIHN0YXR1cyBiYXIgY2FuIGhpZGUiLCBlKTsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIGludCBOID0gU0VSVklDRVMubGVuZ3RoOwogICAgICAgICBtU2VydmljZXMgPSBuZXcgU3lzdGVtVUlbTl07CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvTmF2aWdhdGlvbkJhclZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvTmF2aWdhdGlvbkJhclZpZXcuamF2YQppbmRleCA3ZDZjNTdiLi43ZGFmYjg5MiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9OYXZpZ2F0aW9uQmFyVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvTmF2aWdhdGlvbkJhclZpZXcuamF2YQpAQCAtMzYsNiArMzYsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CiAKIHB1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uQmFyVmlldyBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgZmluYWwgc3RhdGljIGJvb2xlYW4gTkFWQkFSX0FMV0FZU19BVF9SSUdIVCA9IHRydWU7CisKICAgICBwcm90ZWN0ZWQgSVN0YXR1c0JhclNlcnZpY2UgbUJhclNlcnZpY2U7CiAgICAgZmluYWwgRGlzcGxheSBtRGlzcGxheTsKICAgICBWaWV3W10gbVJvdGF0ZWRWaWV3cyA9IG5ldyBWaWV3WzRdOwpAQCAtODgsNyArOTAsOSBAQAogCiAgICAgICAgIG1Sb3RhdGVkVmlld3NbU3VyZmFjZS5ST1RBVElPTl85MF0gPSBmaW5kVmlld0J5SWQoUi5pZC5yb3Q5MCk7CiAgICAgICAgIAotICAgICAgICBtUm90YXRlZFZpZXdzW1N1cmZhY2UuUk9UQVRJT05fMjcwXSA9IGZpbmRWaWV3QnlJZChSLmlkLnJvdDI3MCk7CisgICAgICAgIG1Sb3RhdGVkVmlld3NbU3VyZmFjZS5ST1RBVElPTl8yNzBdID0gTkFWQkFSX0FMV0FZU19BVF9SSUdIVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaW5kVmlld0J5SWQoUi5pZC5yb3Q5MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmluZFZpZXdCeUlkKFIuaWQucm90MjcwKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvUGhvbmVTdGF0dXNCYXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvUGhvbmVTdGF0dXNCYXIuamF2YQppbmRleCBlNjZhMWEyLi4wMGRlOTIwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL1Bob25lU3RhdHVzQmFyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9QaG9uZVN0YXR1c0Jhci5qYXZhCkBAIC0zNjAsNyArMzYwLDkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU3VyZmFjZS5ST1RBVElPTl8yNzA6CiAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGhhcyBiZWVuIHR1cm5lZCA5MGRlZyBjbG9ja3dpc2UKLSAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5MRUZUIHwgR3Jhdml0eS5GSUxMX1ZFUlRJQ0FMOworICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPSAoTmF2aWdhdGlvbkJhclZpZXcuTkFWQkFSX0FMV0FZU19BVF9SSUdIVCA/IEdyYXZpdHkuUklHSFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHcmF2aXR5LkxFRlQpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdyYXZpdHkuRklMTF9WRVJUSUNBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9JbnB1dE1ldGhvZHNQYW5lbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvSW5wdXRNZXRob2RzUGFuZWwuamF2YQppbmRleCBlOWRiOTk4Li4zMzllM2YzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9JbnB1dE1ldGhvZHNQYW5lbC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L0lucHV0TWV0aG9kc1BhbmVsLmphdmEKQEAgLTQyMiw5ICs0MjIsOCBAQAogICAgICAgICAgICAgTG9nLmQoVEFHLCAiR2V0IHRleHQgZnJvbTogIiArIGltaS5nZXRQYWNrYWdlTmFtZSgpICsgc3VidHlwZS5nZXROYW1lUmVzSWQoKQogICAgICAgICAgICAgICAgICAgICArIGltaS5nZXRTZXJ2aWNlSW5mbygpLmFwcGxpY2F0aW9uSW5mbyk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQ2hhbmdlIHRoZSBsYW5ndWFnZSBvZiBzdWJ0eXBlIG5hbWUgYWNjb3JkaW5nIHRvIHN1YnR5cGUncyBsb2NhbGUuCi0gICAgICAgIHJldHVybiBtUGFja2FnZU1hbmFnZXIuZ2V0VGV4dCgKLSAgICAgICAgICAgICAgICBpbWkuZ2V0UGFja2FnZU5hbWUoKSwgc3VidHlwZS5nZXROYW1lUmVzSWQoKSwgaW1pLmdldFNlcnZpY2VJbmZvKCkuYXBwbGljYXRpb25JbmZvKTsKKyAgICAgICAgcmV0dXJuIHN1YnR5cGUuZ2V0RGlzcGxheU5hbWUoCisgICAgICAgICAgICAgICAgbUNvbnRleHQsIGltaS5nZXRQYWNrYWdlTmFtZSgpLCBpbWkuZ2V0U2VydmljZUluZm8oKS5hcHBsaWNhdGlvbkluZm8pOwogICAgIH0KIAogICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0U3VidHlwZUljb24oSW5wdXRNZXRob2RJbmZvIGltaSwgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUpIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0Jhci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyLmphdmEKaW5kZXggOTFjM2NjMS4uNWI1ODAxZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyLmphdmEKQEAgLTQzLDYgKzQzLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwpAQCAtODAsOSArODEsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUYWJsZXRTdGF0dXNCYXIiOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05PVElGSUNBVElPTl9JQ09OUyA9IDU7Ci0gICAgLy8gSU1FIHN3aXRjaGVyIGljb24gaXMgYmlnIGFuZCBvY2N1cHkgd2lkdGggb2YgdHdvIGljb25zCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05PVElGSUNBVElPTl9JQ09OU19JTUVfQlVUVE9OX1ZJU0lCTEUgPSBNQVhfTk9USUZJQ0FUSU9OX0lDT05TIC0gMTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCA9IDEwMDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCA9IDEwMDE7CkBAIC0xMDQsNiArMTAyLDcgQEAKICAgICBpbnQgbU5hdHVyYWxCYXJIZWlnaHQgPSAtMTsKICAgICBpbnQgbUljb25TaXplID0gLTE7CiAgICAgaW50IG1JY29uSFBhZGRpbmcgPSAtMTsKKyAgICBwcml2YXRlIGludCBtTWF4Tm90aWZpY2F0aW9uSWNvbnMgPSA1OwogCiAgICAgSCBtSGFuZGxlciA9IG5ldyBIKCk7CiAKQEAgLTEzMCw2ICsxMjksNyBAQAogICAgIElucHV0TWV0aG9kQnV0dG9uIG1JbnB1dE1ldGhvZFN3aXRjaEJ1dHRvbjsKIAogICAgIE5vdGlmaWNhdGlvblBhbmVsIG1Ob3RpZmljYXRpb25QYW5lbDsKKyAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtTm90aWZpY2F0aW9uUGFuZWxQYXJhbXM7CiAgICAgTm90aWZpY2F0aW9uUGVla1BhbmVsIG1Ob3RpZmljYXRpb25QZWVrV2luZG93OwogICAgIFZpZXdHcm91cCBtTm90aWZpY2F0aW9uUGVla1JvdzsKICAgICBpbnQgbU5vdGlmaWNhdGlvblBlZWtJbmRleDsKQEAgLTE3MCw2ICsxNzAsNyBAQAogCiAgICAgcHJvdGVjdGVkIHZvaWQgYWRkUGFuZWxXaW5kb3dzKCkgewogICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dDsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOwogCiAgICAgICAgIC8vIE5vdGlmaWNhdGlvbiBQYW5lbAogICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwgPSAoTm90aWZpY2F0aW9uUGFuZWwpVmlldy5pbmZsYXRlKGNvbnRleHQsCkBAIC0xOTcsMTEgKzE5OCwxMiBAQAogCiAgICAgICAgIG1TdGF0dXNCYXJWaWV3LnNldElnbm9yZUNoaWxkcmVuKDAsIG1Ob3RpZmljYXRpb25UcmlnZ2VyLCBtTm90aWZpY2F0aW9uUGFuZWwpOwogCi0gICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgIDUxMiwgLy8gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbU5vdGlmaWNhdGlvblBhbmVsUGFyYW1zID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5ub3RpZmljYXRpb25fcGFuZWxfd2lkdGgpLAorICAgICAgICAgICAgICAgIGdldE5vdGlmaWNhdGlvblBhbmVsSGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAogICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUwogICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTQogICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfU1BMSVRfVE9VQ0gKICAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVELApAQCAtMzAzLDYgKzMwNSwxMyBAQAogICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtSW5wdXRNZXRob2RzUGFuZWwsIGxwKTsKICAgICB9CiAKKyAgICBwcml2YXRlIGludCBnZXROb3RpZmljYXRpb25QYW5lbEhlaWdodCgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBEaXNwbGF5IGQgPSBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdERpc3BsYXkoKTsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5ub3RpZmljYXRpb25fcGFuZWxfbWluX2hlaWdodCksCisgICAgICAgICAgICAgICAgZC5nZXRSZWFsSGVpZ2h0KCkpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewogICAgICAgICBzdXBlci5zdGFydCgpOyAvLyB3aWxsIGFkZCB0aGUgbWFpbiBiYXIgdmlldwpAQCAtMzExLDE2ICszMjAsMTkgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CiAgICAgICAgIGxvYWREaW1lbnMoKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsUGFyYW1zLmhlaWdodCA9IGdldE5vdGlmaWNhdGlvblBhbmVsSGVpZ2h0KCk7CisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1Ob3RpZmljYXRpb25QYW5lbCwKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWxQYXJhbXMpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGxvYWREaW1lbnMoKSB7CiAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKIAogICAgICAgICBtTmF0dXJhbEJhckhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2hlaWdodCk7CisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zeXN0ZW1fYmFyX2hlaWdodCk7CiAKICAgICAgICAgaW50IG5ld0ljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9pY29uX3NpemUpOworICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zeXN0ZW1fYmFyX2ljb25fc2l6ZSk7CiAgICAgICAgIGludCBuZXdJY29uSFBhZGRpbmcgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAogICAgICAgICAgICAgUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fcGFkZGluZyk7CiAKQEAgLTMzMCw2ICszNDIsMTMgQEAKICAgICAgICAgICAgIG1JY29uU2l6ZSA9IG5ld0ljb25TaXplOwogICAgICAgICAgICAgcmVsb2FkQWxsTm90aWZpY2F0aW9uSWNvbnMoKTsgLy8gcmVsb2FkIHRoZSB0cmF5CiAgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgbnVtSWNvbnMgPSByZXMuZ2V0SW50ZWdlcihSLmludGVnZXIuY29uZmlnX21heE5vdGlmaWNhdGlvbkljb25zKTsKKyAgICAgICAgaWYgKG51bUljb25zICE9IG1NYXhOb3RpZmljYXRpb25JY29ucykgeworICAgICAgICAgICAgbU1heE5vdGlmaWNhdGlvbkljb25zID0gbnVtSWNvbnM7CisgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJtYXggbm90aWZpY2F0aW9uIGljb25zOiAiICsgbU1heE5vdGlmaWNhdGlvbkljb25zKTsKKyAgICAgICAgICAgIHJlbG9hZEFsbE5vdGlmaWNhdGlvbkljb25zKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcm90ZWN0ZWQgVmlldyBtYWtlU3RhdHVzQmFyVmlldygpIHsKQEAgLTE0MTYsOSArMTQzNSwxMSBAQAogCiAgICAgICAgIC8vIFdoZW4gSU1FIGJ1dHRvbiBpcyB2aXNpYmxlLCB0aGUgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbiBpY29ucyBzaG91bGQgYmUgZGVjcmVtZW50ZWQKICAgICAgICAgLy8gdG8gZml0IHRoZSB1cHBlciBsaW1pdC4KKyAgICAgICAgLy8gSU1FIHN3aXRjaGVyIGljb24gaXMgYmlnIGFuZCBvY2N1cHkgd2lkdGggb2Ygb25lIGljb24KKyAgICAgICAgZmluYWwgaW50IG1heE5vdGlmaWNhdGlvbkljb25zSW1lQnV0dG9uVmlzaWJsZSA9IG1NYXhOb3RpZmljYXRpb25JY29ucyAtIDE7CiAgICAgICAgIGZpbmFsIGludCBtYXhOb3RpZmljYXRpb25JY29uc0NvdW50ID0KICAgICAgICAgICAgICAgICAobUlucHV0TWV0aG9kU3dpdGNoQnV0dG9uLmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9OT1RJRklDQVRJT05fSUNPTlNfSU1FX0JVVFRPTl9WSVNJQkxFIDogTUFYX05PVElGSUNBVElPTl9JQ09OUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkljb25zSW1lQnV0dG9uVmlzaWJsZSA6IG1NYXhOb3RpZmljYXRpb25JY29uczsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPCBtYXhOb3RpZmljYXRpb25JY29uc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlmIChpPj1OKSBicmVhazsKICAgICAgICAgICAgIHRvU2hvdy5hZGQobU5vdGlmaWNhdGlvbkRhdGEuZ2V0KE4taS0xKS5pY29uKTsKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKaW5kZXggYWUyM2RmNi4uNzk4MzI3OCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtOTQsNiArOTUsOCBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzaG93KCkgewogICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNob3coKTsgbUtleWd1YXJkVmlldz09IiArIG1LZXlndWFyZFZpZXcpOwogCisgICAgICAgIFJlc291cmNlcyByZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgYm9vbGVhbiBlbmFibGVTY3JlZW5Sb3RhdGlvbiA9IHJlcy5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfZW5hYmxlTG9ja1NjcmVlblJvdGF0aW9uKTsKICAgICAgICAgaWYgKG1LZXlndWFyZEhvc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJrZXlndWFyZCBob3N0IGlzIG51bGwsIGNyZWF0aW5nIGl0Li4uIik7CiAKQEAgLTExNiwxOCArMTE5LDIyIEBACiAgICAgICAgICAgICBscC5zb2Z0SW5wdXRNb2RlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfUEFOOwogICAgICAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX0xvY2tTY3JlZW47CiAKLSAgICAgICAgICAgIC8vIFRPRE86IFNvbWV0aW1lcyB3ZSBnZXQgdGhlIHdyb25nIHZhbHVlIGZvciB0aGUgc2Vuc29yIHJlc291cmNlIHdlIHVzZSB0byBjb25maWd1cmUKLSAgICAgICAgICAgIC8vIHRoaXMuICBIb3dldmVyLCB0aGUgY3VycmVudCBVSSBkZXNpZ24gaGFzIExvY2tTY3JlZW4gYWx3YXlzIHJlc3BvbmQgdG8gb3JpZW50YXRpb24gc28KLSAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdGhpcyBmb3IgdGhlIHRpbWUtYmVpbmcuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gRm9yIHJlZmVyZW5jZSwgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgUi5ib29sLmNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24KLSAgICAgICAgICAgIGxwLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9TRU5TT1I7CiAgICAgICAgICAgICBscC5zZXRUaXRsZSgiS2V5Z3VhcmQiKTsKICAgICAgICAgICAgIG1XaW5kb3dMYXlvdXRQYXJhbXMgPSBscDsKIAogICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLmFkZFZpZXcobUtleWd1YXJkSG9zdCwgbHApOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGVuYWJsZVNjcmVlblJvdGF0aW9uKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJSb3RhdGlvbiBzZW5zb3IgZm9yIGxvY2sgc2NyZWVuIE9uISIpOworICAgICAgICAgICAgbVdpbmRvd0xheW91dFBhcmFtcy5zY3JlZW5PcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fU0VOU09SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm90YXRpb24gc2Vuc29yIGZvciBsb2NrIHNjcmVlbiBPZmYhIik7CisgICAgICAgICAgICBtV2luZG93TGF5b3V0UGFyYW1zLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9OT1NFTlNPUjsKKyAgICAgICAgfQorCisgICAgICAgIG1WaWV3TWFuYWdlci51cGRhdGVWaWV3TGF5b3V0KG1LZXlndWFyZEhvc3QsIG1XaW5kb3dMYXlvdXRQYXJhbXMpOworCiAgICAgICAgIGlmIChtS2V5Z3VhcmRWaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAia2V5Z3VhcmQgdmlldyBpcyBudWxsLCBjcmVhdGluZyBpdC4uLiIpOwogICAgICAgICAgICAgbUtleWd1YXJkVmlldyA9IG1LZXlndWFyZFZpZXdQcm9wZXJ0aWVzLmNyZWF0ZUtleWd1YXJkVmlldyhtQ29udGV4dCwgbVVwZGF0ZU1vbml0b3IsIHRoaXMpOwpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCmluZGV4IGNhNTZjNGYuLjY3MzQwMDUgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuQ291bnREb3duVGltZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LktleVN0b3JlOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LklucHV0VHlwZTsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkRpZ2l0c0tleUxpc3RlbmVyOwpAQCAtMTI0LDcgKzEyNSw4IEBACiAgICAgICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRJbnB1dFR5cGUoSW5wdXRUeXBlLlRZUEVfQ0xBU1NfTlVNQkVSCiAgICAgICAgICAgICAgICAgICAgIHwgSW5wdXRUeXBlLlRZUEVfTlVNQkVSX1ZBUklBVElPTl9QQVNTV09SRCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRJbnB1dFR5cGUoSW5wdXRUeXBlLlRZUEVfVEVYVF9WQVJJQVRJT05fUEFTU1dPUkQpOworICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0SW5wdXRUeXBlKElucHV0VHlwZS5UWVBFX0NMQVNTX1RFWFQKKyAgICAgICAgICAgICAgICAgICAgfCBJbnB1dFR5cGUuVFlQRV9URVhUX1ZBUklBVElPTl9QQVNTV09SRCk7CiAgICAgICAgIH0KIAogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeUNhbGwpOwpAQCAtMjMxLDYgKzIzMyw3IEBACiAgICAgICAgICAgICBtQ2FsbGJhY2sua2V5Z3VhcmREb25lKHRydWUpOwogICAgICAgICAgICAgbUNhbGxiYWNrLnJlcG9ydFN1Y2Nlc3NmdWxVbmxvY2tBdHRlbXB0KCk7CiAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQobnVsbCk7CisgICAgICAgICAgICBLZXlTdG9yZS5nZXRJbnN0YW5jZSgpLnBhc3N3b3JkKGVudHJ5KTsKICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5sZW5ndGgoKSA+IE1JTklNVU1fUEFTU1dPUkRfTEVOR1RIX0JFRk9SRV9SRVBPUlQgKSB7CiAgICAgICAgICAgICAvLyB0byBhdm9pZCBhY2NpZGVudGFsIGxvY2tvdXQsIG9ubHkgY291bnQgYXR0ZW1wdHMgdGhhdCBhcmUgbG9uZyBlbm91Z2ggdG8gYmUgYQogICAgICAgICAgICAgLy8gcmVhbCBwYXNzd29yZC4gVGhpcyBtYXkgcmVxdWlyZSBzb21lIHR3ZWFraW5nLgpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YQppbmRleCAwMThmZTBjLi5hNjg1NDk3IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkNvdW50RG93blRpbWVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKQEAgLTQwNyw2ICs0MDgsNyBAQAogICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKHRydWUpOwogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5rZXlndWFyZERvbmUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlcG9ydFN1Y2Nlc3NmdWxVbmxvY2tBdHRlbXB0KCk7CisgICAgICAgICAgICAgICAgS2V5U3RvcmUuZ2V0SW5zdGFuY2UoKS5wYXNzd29yZChMb2NrUGF0dGVyblV0aWxzLnBhdHRlcm5Ub1N0cmluZyhwYXR0ZXJuKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwb3J0RmFpbGVkQXR0ZW1wdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLnNpemUoKSA+IE1JTl9QQVRURVJOX0JFRk9SRV9QT0tFX1dBS0VMT0NLKSB7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKaW5kZXggZDk5NzEwOS4uNzVmNDY2YSAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQpAQCAtMTQ0Niw3ICsxNDQ2LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dFN0YXRlLnB1dEJvb2xlYW4oQUNUSU9OX0JBUl9UQUcsIG1BY3Rpb25CYXIuaXNPdmVyZmxvd01lbnVTaG93aW5nKCkpOworICAgICAgICAgICAgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4gYWN0aW9uQmFyU3RhdGVzID0gbmV3IFNwYXJzZUFycmF5PFBhcmNlbGFibGU+KCk7CisgICAgICAgICAgICBtQWN0aW9uQmFyLnNhdmVIaWVyYXJjaHlTdGF0ZShhY3Rpb25CYXJTdGF0ZXMpOworICAgICAgICAgICAgb3V0U3RhdGUucHV0U3BhcnNlUGFyY2VsYWJsZUFycmF5KEFDVElPTl9CQVJfVEFHLCBhY3Rpb25CYXJTdGF0ZXMpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG91dFN0YXRlOwpAQCAtMTQ4NCw4ICsxNDg2LDEwIEBACiAgICAgICAgICAgICByZXN0b3JlUGFuZWxTdGF0ZShwYW5lbFN0YXRlcyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsICYmIHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCb29sZWFuKEFDVElPTl9CQVJfVEFHKSkgewotICAgICAgICAgICAgbUFjdGlvbkJhci5wb3N0U2hvd092ZXJmbG93TWVudSgpOworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPiBhY3Rpb25CYXJTdGF0ZXMgPQorICAgICAgICAgICAgICAgICAgICBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0U3BhcnNlUGFyY2VsYWJsZUFycmF5KEFDVElPTl9CQVJfVEFHKTsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGFjdGlvbkJhclN0YXRlcyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCmluZGV4IGU0OGRiZTkuLjg1MjAyMTkgMTAwNzU1Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db21wYXRpYmlsaXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CkBAIC01Niw2ICs1Nyw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5CYXNlSW5wdXRIYW5kbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Qb2ludGVyTG9jYXRpb25WaWV3OwogCitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwpAQCAtNzQ1LDE1ICs3NDcsMTQgQEAKICAgICAgICAgbVNhZmVNb2RlRW5hYmxlZFZpYmVQYXR0ZXJuID0gZ2V0TG9uZ0ludEFycmF5KG1Db250ZXh0LmdldFJlc291cmNlcygpLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3NhZmVNb2RlRW5hYmxlZFZpYmVQYXR0ZXJuKTsKIAotICAgICAgICAvLyBOb3RlOiB0aGUgQ29uZmlndXJhdGlvbiBpcyBub3Qgc3RhYmxlIGhlcmUsIHNvIHdlIGNhbm5vdCBsb2FkIG1TdGF0dXNCYXJDYW5IaWRlIGZyb20KLSAgICAgICAgLy8gY29uZmlnX3N0YXR1c0JhckNhbkhpZGUgYmVjYXVzZSB0aGUgbGF0dGVyIGRlcGVuZHMgb24gdGhlIHNjcmVlbiBzaXplCi0KICAgICAgICAgLy8gQ29udHJvbHMgcm90YXRpb24gYW5kIHRoZSBsaWtlLgogICAgICAgICBpbml0aWFsaXplSGRtaVN0YXRlKCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbERpc3BsYXlTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBpbnQgc2hvcnRTaXplOwogICAgICAgICBpZiAod2lkdGggPiBoZWlnaHQpIHsKKyAgICAgICAgICAgIHNob3J0U2l6ZSA9IGhlaWdodDsKICAgICAgICAgICAgIG1MYW5kc2NhcGVSb3RhdGlvbiA9IFN1cmZhY2UuUk9UQVRJT05fMDsKICAgICAgICAgICAgIG1TZWFzY2FwZVJvdGF0aW9uID0gU3VyZmFjZS5ST1RBVElPTl8xODA7CiAgICAgICAgICAgICBpZiAobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKQEAgLTc2NSw2ICs3NjYsNyBAQAogICAgICAgICAgICAgICAgIG1VcHNpZGVEb3duUm90YXRpb24gPSBTdXJmYWNlLlJPVEFUSU9OXzkwOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hvcnRTaXplID0gd2lkdGg7CiAgICAgICAgICAgICBtUG9ydHJhaXRSb3RhdGlvbiA9IFN1cmZhY2UuUk9UQVRJT05fMDsKICAgICAgICAgICAgIG1VcHNpZGVEb3duUm90YXRpb24gPSBTdXJmYWNlLlJPVEFUSU9OXzE4MDsKICAgICAgICAgICAgIGlmIChtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKApAQCAtNzc2LDYgKzc3OCwxOCBAQAogICAgICAgICAgICAgICAgIG1TZWFzY2FwZVJvdGF0aW9uID0gU3VyZmFjZS5ST1RBVElPTl8yNzA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3RhdHVzIGJhciBjYW4gaGlkZSBiYXNlZCBvbiB0aGUgc2l6ZQorICAgICAgICAvLyBvZiB0aGUgc2NyZWVuLiAgV2UgYXNzdW1lIHNpemVzID4gNjAwZHAgYXJlIHRhYmxldHMgd2hlcmUgd2UKKyAgICAgICAgLy8gd2lsbCB1c2UgdGhlIHN5c3RlbSBiYXIuCisgICAgICAgIGludCBzaG9ydFNpemVEcCA9IHNob3J0U2l6ZQorICAgICAgICAgICAgICAgICogRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERUZBVUxUCisgICAgICAgICAgICAgICAgLyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRTsKKyAgICAgICAgbVN0YXR1c0JhckNhbkhpZGUgPSBzaG9ydFNpemVEcCA8IDYwMDsKKyAgICAgICAgbVN0YXR1c0JhckhlaWdodCA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBtU3RhdHVzQmFyQ2FuSGlkZQorICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2hlaWdodAorICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zeXN0ZW1fYmFyX2hlaWdodCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdXBkYXRlU2V0dGluZ3MoKSB7CkBAIC0xMDgzLDYgKzEwOTcsMTAgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19CQVJfTEFZRVI7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gY2FuU3RhdHVzQmFySGlkZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGF0dXNCYXJDYW5IaWRlOworICAgIH0KKwogICAgIHB1YmxpYyBpbnQgZ2V0Tm9uRGVjb3JEaXNwbGF5V2lkdGgoaW50IHJvdGF0aW9uLCBpbnQgZnVsbFdpZHRoKSB7CiAgICAgICAgIHJldHVybiBmdWxsV2lkdGg7CiAgICAgfQpAQCAtMTEwOSw5ICsxMTI3LDkgQEAKICAgICB9CiAgICAgCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBwdWJsaWMgVmlldyBhZGRTdGFydGluZ1dpbmRvdyhJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRoZW1lLCBDaGFyU2VxdWVuY2Ugbm9uTG9jYWxpemVkTGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhYmVsUmVzLCBpbnQgaWNvbiwgaW50IHdpbmRvd0ZsYWdzKSB7CisgICAgcHVibGljIFZpZXcgYWRkU3RhcnRpbmdXaW5kb3coSUJpbmRlciBhcHBUb2tlbiwgU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgdGhlbWUsCisgICAgICAgICAgICBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXRJbmZvLCBDaGFyU2VxdWVuY2Ugbm9uTG9jYWxpemVkTGFiZWwsIGludCBsYWJlbFJlcywKKyAgICAgICAgICAgIGludCBpY29uLCBpbnQgd2luZG93RmxhZ3MpIHsKICAgICAgICAgaWYgKCFTSE9XX1NUQVJUSU5HX0FOSU1BVElPTlMpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CkBAIC0xMTU3LDggKzExNzUsMTIgQEAKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEV8CiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNKTsKICAgICAKKyAgICAgICAgICAgIGlmICghY29tcGF0SW5mby5zdXBwb3J0c1NjcmVlbigpKSB7CisgICAgICAgICAgICAgICAgd2luLmFkZEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQ09NUEFUSUJMRV9XSU5ET1cpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB3aW4uc2V0TGF5b3V0KFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKICAgICAKICAgICAgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IHdpbi5nZXRBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgICBwYXJhbXMudG9rZW4gPSBhcHBUb2tlbjsKQEAgLTEyNDQsMTMgKzEyNjYsNiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2luZG93TWFuYWdlckltcGwuQUREX01VTFRJUExFX1NJTkdMRVRPTjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVN0YXR1c0JhciA9IHdpbjsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBDb25maWd1cmF0aW9uIHdpbGwgYmUgc3RhYmxlIGJ5IG5vdywgc28gd2UgY2FuIGxvYWQgdGhpcwotICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJDYW5IaWRlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfc3RhdHVzQmFyQ2FuSGlkZSk7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0JhckhlaWdodCA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9oZWlnaHQpOwotCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRZUEVfTkFWSUdBVElPTl9CQVI6CiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKApAQCAtMTkzOCwyOCArMTk1Myw0MSBAQAogICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJsYXlvdXRXaW5kb3dMdygiICsgYXR0cnMuZ2V0VGl0bGUoKSArICIpOiBub3JtYWwgd2luZG93Iik7CiAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBhIG5vcm1hbCB3aW5kb3cgbXVzdCBiZSBwbGFjZWQgaW5zaWRlIHRoZSBjb250ZW50CiAgICAgICAgICAgICAgICAgLy8gb2YgYWxsIHNjcmVlbiBkZWNvcmF0aW9ucy4KLSAgICAgICAgICAgICAgICBwZi5sZWZ0ID0gbUNvbnRlbnRMZWZ0OwotICAgICAgICAgICAgICAgIHBmLnRvcCA9IG1Db250ZW50VG9wOwotICAgICAgICAgICAgICAgIHBmLnJpZ2h0ID0gbUNvbnRlbnRSaWdodDsKLSAgICAgICAgICAgICAgICBwZi5ib3R0b20gPSBtQ29udGVudEJvdHRvbTsKLSAgICAgICAgICAgICAgICBpZiAoYWRqdXN0ICE9IFNPRlRfSU5QVVRfQURKVVNUX1JFU0laRSkgewotICAgICAgICAgICAgICAgICAgICBkZi5sZWZ0ID0gY2YubGVmdCA9IG1Eb2NrTGVmdDsKLSAgICAgICAgICAgICAgICAgICAgZGYudG9wID0gY2YudG9wID0gbURvY2tUb3A7Ci0gICAgICAgICAgICAgICAgICAgIGRmLnJpZ2h0ID0gY2YucmlnaHQgPSBtRG9ja1JpZ2h0OwotICAgICAgICAgICAgICAgICAgICBkZi5ib3R0b20gPSBjZi5ib3R0b20gPSBtRG9ja0JvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cnMudHlwZSA9PSBUWVBFX1NUQVRVU19CQVJfUEFORUwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhdHVzIGJhciBwYW5lbHMgYXJlIHRoZSBvbmx5IHdpbmRvd3Mgd2hvIGNhbiBnbyBvbiB0b3Agb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXR1cyBiYXIuICBUaGV5IGFyZSBwcm90ZWN0ZWQgYnkgdGhlIFNUQVRVU19CQVJfU0VSVklDRQorICAgICAgICAgICAgICAgICAgICAvLyBwZXJtaXNzaW9uLCBzbyB0aGV5IGhhdmUgdGhlIHNhbWUgcHJpdmlsZWdlcyBhcyB0aGUgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgIC8vIGJhciBpdHNlbGYuCisgICAgICAgICAgICAgICAgICAgIHBmLmxlZnQgPSBkZi5sZWZ0ID0gY2YubGVmdCA9IHZmLmxlZnQgPSBtVW5yZXN0cmljdGVkU2NyZWVuTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgcGYudG9wID0gZGYudG9wID0gY2YudG9wID0gdmYudG9wID0gbVVucmVzdHJpY3RlZFNjcmVlblRvcDsKKyAgICAgICAgICAgICAgICAgICAgcGYucmlnaHQgPSBkZi5yaWdodCA9IGNmLnJpZ2h0ID0gdmYucmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG1VbnJlc3RyaWN0ZWRTY3JlZW5MZWZ0K21VbnJlc3RyaWN0ZWRTY3JlZW5XaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgcGYuYm90dG9tID0gZGYuYm90dG9tID0gY2YuYm90dG9tID0gdmYuYm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBtVW5yZXN0cmljdGVkU2NyZWVuVG9wK21VbnJlc3RyaWN0ZWRTY3JlZW5IZWlnaHQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGYubGVmdCA9IGNmLmxlZnQgPSBtQ29udGVudExlZnQ7Ci0gICAgICAgICAgICAgICAgICAgIGRmLnRvcCA9IGNmLnRvcCA9IG1Db250ZW50VG9wOwotICAgICAgICAgICAgICAgICAgICBkZi5yaWdodCA9IGNmLnJpZ2h0ID0gbUNvbnRlbnRSaWdodDsKLSAgICAgICAgICAgICAgICAgICAgZGYuYm90dG9tID0gY2YuYm90dG9tID0gbUNvbnRlbnRCb3R0b207Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGp1c3QgIT0gU09GVF9JTlBVVF9BREpVU1RfTk9USElORykgewotICAgICAgICAgICAgICAgICAgICB2Zi5sZWZ0ID0gbUN1ckxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgIHZmLnRvcCA9IG1DdXJUb3A7Ci0gICAgICAgICAgICAgICAgICAgIHZmLnJpZ2h0ID0gbUN1clJpZ2h0OwotICAgICAgICAgICAgICAgICAgICB2Zi5ib3R0b20gPSBtQ3VyQm90dG9tOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZmLnNldChjZik7CisgICAgICAgICAgICAgICAgICAgIHBmLmxlZnQgPSBtQ29udGVudExlZnQ7CisgICAgICAgICAgICAgICAgICAgIHBmLnRvcCA9IG1Db250ZW50VG9wOworICAgICAgICAgICAgICAgICAgICBwZi5yaWdodCA9IG1Db250ZW50UmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHBmLmJvdHRvbSA9IG1Db250ZW50Qm90dG9tOworICAgICAgICAgICAgICAgICAgICBpZiAoYWRqdXN0ICE9IFNPRlRfSU5QVVRfQURKVVNUX1JFU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGYubGVmdCA9IGNmLmxlZnQgPSBtRG9ja0xlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZi50b3AgPSBjZi50b3AgPSBtRG9ja1RvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRmLnJpZ2h0ID0gY2YucmlnaHQgPSBtRG9ja1JpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgZGYuYm90dG9tID0gY2YuYm90dG9tID0gbURvY2tCb3R0b207CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZi5sZWZ0ID0gY2YubGVmdCA9IG1Db250ZW50TGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRmLnRvcCA9IGNmLnRvcCA9IG1Db250ZW50VG9wOworICAgICAgICAgICAgICAgICAgICAgICAgZGYucmlnaHQgPSBjZi5yaWdodCA9IG1Db250ZW50UmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZi5ib3R0b20gPSBjZi5ib3R0b20gPSBtQ29udGVudEJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYWRqdXN0ICE9IFNPRlRfSU5QVVRfQURKVVNUX05PVEhJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZmLmxlZnQgPSBtQ3VyTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZmLnRvcCA9IG1DdXJUb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB2Zi5yaWdodCA9IG1DdXJSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZmLmJvdHRvbSA9IG1DdXJCb3R0b207CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2Zi5zZXQoY2YpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDhlODZlZGEuLmQ0YThkZGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC01MywxNSArNTMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdGhlIHNpbSBidWlsZCBkb2Vzbid0IGhhdmUgZ2V0dGlkCiAKLSNpZm5kZWYgSEFWRV9HRVRUSUQKLSMgZGVmaW5lIGdldHRpZCBnZXRwaWQKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWV4dGVybiBjb25zdCBjaGFyICogY29uc3QgZ0VmZmVjdExpYlBhdGg7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzYxLDggKzM1Myw4IEBACiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTQzMCw3ICs0MjIsNyBAQAogICAgICAgICBMT0dWKCJjcmVhdGVUcmFjaygpIGxTZXNzaW9uSWQ6ICVkIiwgbFNlc3Npb25JZCk7CiAKICAgICAgICAgdHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVRyYWNrX2woY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIGxTZXNzaW9uSWQsICZsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBsU2Vzc2lvbklkLCAmbFN0YXR1cyk7CiAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZApAQCAtNDc4LDcgKzQ3MCw3IEBACiAgICAgcmV0dXJuIHRocmVhZC0+Y2hhbm5lbENvdW50KCk7CiB9CiAKLWludCBBdWRpb0ZsaW5nZXI6OmZvcm1hdChpbnQgb3V0cHV0KSBjb25zdAordWludDMyX3QgQXVkaW9GbGluZ2VyOjpmb3JtYXQoaW50IG91dHB1dCkgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKQEAgLTkxNyw3ICs5MDksNyBAQAogICAgIHJldHVybiAoaW50KW1DaGFubmVsQ291bnQ7CiB9CiAKLWludCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmZvcm1hdCgpIGNvbnN0Cit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmZvcm1hdCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1Gb3JtYXQ7CiB9CkBAIC0xMDAzLDYgKzk5NSw4IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNoYW5uZWwgQ291bnQ6ICVkXG4iLCBtQ2hhbm5lbENvdW50KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2hhbm5lbCBNYXNrOiAweCUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJGcmFtZSBzaXplOiAlZFxuIiwgbUZyYW1lU2l6ZSk7CkBAIC0xMDc2LDcgKzEwNzAsNyBAQAogCiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0cHV0IHRocmVhZCAlcCB0cmFja3NcbiIsIHRoaXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgIENsaWVuIFR5cCBGbXQgQ2huIG1hc2sgICBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtMTA4Nyw3ICsxMDgxLDcgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgYWN0aXZlIHRyYWNrc1xuIiwgdGhpcyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgIENsaWVuIFR5cCBGbXQgQ2huIFNlc3Npb24gQnVmICBTIE0gRiBTUmF0ZSBMZWZ0ViBSaWdoViAgU2VydiAgICAgICBVc2VyICAgICAgIE1haW4gYnVmICAgQXV4IEJ1ZlxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSAgQ2xpZW4gVHlwIEZtdCBDaG4gbWFzayAgIFNlc3Npb24gQnVmICBTIE0gRiBTUmF0ZSBMZWZ0ViBSaWdoViAgU2VydiAgICAgICBVc2VyICAgICAgIE1haW4gYnVmICAgQXV4IEJ1ZlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQWN0aXZlVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHdwPFRyYWNrPiB3VHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICBpZiAod1RyYWNrICE9IDApIHsKQEAgLTExNzMsOCArMTE2Nyw4IEBACiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCkBAIC0xMTg0LDExICsxMTc4LDE0IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIAogICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbENvdW50ICE9IChpbnQpbUNoYW5uZWxDb3VudCkgewotICAgICAgICAgICAgTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6ICBzYW1wbGVSYXRlICVkIGZvcm1hdCAlZCwgY2hhbm5lbENvdW50ICVkIGZvciBvdXRwdXQgJXAiLAotICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgbU91dHB1dCk7Ci0gICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICBpZiAoKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spID09IEFVRElPX0ZPUk1BVF9QQ00pIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlIHx8IGZvcm1hdCAhPSBtRm9ybWF0IHx8IGNoYW5uZWxNYXNrICE9IG1DaGFubmVsTWFzaykgeworICAgICAgICAgICAgICAgIExPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICVkIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgMHglMDh4IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgbU91dHB1dCwgbUZvcm1hdCk7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBSZXNhbXBsZXIgaW1wbGVtZW50YXRpb24gbGltaXRzIGlucHV0IHNhbXBsaW5nIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGluZyByYXRlLgpAQCAtMTIyNSw3ICsxMjIyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCk7CiAgICAgICAgIGlmICh0cmFjay0+Z2V0Q2JsaygpID09IE5VTEwgfHwgdHJhY2stPm5hbWUoKSA8IDApIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CkBAIC0xMzc0LDcgKzEzNzEsNyBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEOgogICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsczsKKyAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsTWFzazsKICAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKQEAgLTEzOTQsOCArMTM5MSw4IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkKIHsKICAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1DaGFubmVscyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpcG9wY291bnQobUNoYW5uZWxzKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KXBvcGNvdW50KG1DaGFubmVsTWFzayk7CiAgICAgbUZvcm1hdCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtRnJhbWVTaXplID0gKHVpbnQxNl90KWF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUZyYW1lQ291bnQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKSAvIG1GcmFtZVNpemU7CkBAIC0xODA1LDcgKzE4MDIsNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgKHZvaWQgKil0cmFjay0+Zm9ybWF0KCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX0NPVU5ULCAodm9pZCAqKXRyYWNrLT5jaGFubmVsQ291bnQoKSk7CisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKXRyYWNrLT5jaGFubmVsTWFzaygpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCkBAIC0yNjg0LDcgKzI2ODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKICAgICBpZiAob3V0cHV0VHJhY2stPmNibGsoKSAhPSBOVUxMKSB7CiAgICAgICAgIHRocmVhZC0+c2V0U3RyZWFtVm9sdW1lKEFVRElPX1NUUkVBTV9DTlQsIDEuMGYpOwpAQCAtMjc1Miw4ICsyNzQ5LDggQEAKICAgICAgICAgICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtMjc3Myw2ICsyNzcwLDcgQEAKIAogICAgIC8vIExPR0QoIkNyZWF0aW5nIHRyYWNrIHdpdGggJWQgYnVmZmVycyBAICVkIGJ5dGVzIiwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwogICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgIHVpbnQ4X3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwogICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCk7CiAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICBzaXplICs9IGJ1ZmZlclNpemU7CkBAIC0yNzg3LDcgKzI3ODUsOCBAQAogICAgICAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBidWZmZXJzCiAgICAgICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50ID0gKHVpbnQ4X3QpY2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGZyYW1lQ291bnQqY2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KSk7CkBAIC0yODExLDcgKzI4MTAsOCBAQAogICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwogICAgICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgbUNibGstPmNoYW5uZWxDb3VudCA9ICh1aW50OF90KWNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGZyYW1lQ291bnQqY2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KSk7CiAgICAgICAgICAgIC8vIEZvcmNlIHVuZGVycnVuIGNvbmRpdGlvbiB0byBhdm9pZCBmYWxzZSB1bmRlcnJ1biBjYWxsYmFjayB1bnRpbCBmaXJzdCBkYXRhIGlzCkBAIC0yODc4LDcgKzI4NzgsMTEgQEAKIH0KIAogaW50IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpjaGFubmVsQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChpbnQpbUNibGstPmNoYW5uZWxDb3VudDsKKyAgICByZXR1cm4gKGNvbnN0IGludCltQ2hhbm5lbENvdW50OworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6Y2hhbm5lbE1hc2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1DaGFubmVsTWFzazsKIH0KIAogdm9pZCogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OmdldEJ1ZmZlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGZyYW1lcykgY29uc3QgewpAQCAtMjg5MCw5ICsyODk0LDkgQEAKICAgICBpZiAoYnVmZmVyU3RhcnQgPCBtQnVmZmVyIHx8IGJ1ZmZlclN0YXJ0ID4gYnVmZmVyRW5kIHx8IGJ1ZmZlckVuZCA+IG1CdWZmZXJFbmQgfHwKICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1ZmZlclN0YXJ0ICYgKHVuc2lnbmVkIGxvbmcpKGNibGstPmZyYW1lU2l6ZSAtIDEpKSkgewogICAgICAgICBMT0dFKCJUcmFja0Jhc2U6OmdldEJ1ZmZlciBidWZmZXIgb3V0IG9mIHJhbmdlOlxuICAgIHN0YXJ0OiAlcCwgZW5kICVwICwgbUJ1ZmZlciAlcCBtQnVmZmVyRW5kICVwXG4gICAgXAotICAgICAgICAgICAgICAgIHNlcnZlciAlZCwgc2VydmVyQmFzZSAlZCwgdXNlciAlZCwgdXNlckJhc2UgJWQsIGNoYW5uZWxDb3VudCAlZCIsCisgICAgICAgICAgICAgICAgc2VydmVyICVkLCBzZXJ2ZXJCYXNlICVkLCB1c2VyICVkLCB1c2VyQmFzZSAlZCIsCiAgICAgICAgICAgICAgICAgYnVmZmVyU3RhcnQsIGJ1ZmZlckVuZCwgbUJ1ZmZlciwgbUJ1ZmZlckVuZCwKLSAgICAgICAgICAgICAgICBjYmxrLT5zZXJ2ZXIsIGNibGstPnNlcnZlckJhc2UsIGNibGstPnVzZXIsIGNibGstPnVzZXJCYXNlLCBjYmxrLT5jaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIGNibGstPnNlcnZlciwgY2Jsay0+c2VydmVyQmFzZSwgY2Jsay0+dXNlciwgY2Jsay0+dXNlckJhc2UpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTI5MDcsMTIgKzI5MTEsMTIgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQotICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCAwLCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCksCisgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgMCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpLAogICAgIG1NdXRlKGZhbHNlKSwgbVNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIpLCBtTmFtZSgtMSksIG1NYWluQnVmZmVyKE5VTEwpLCBtQXV4QnVmZmVyKE5VTEwpLAogICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpCiB7CkBAIC0yOTMyLDcgKzI5MzYsNyBAQAogICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CiAgICAgICAgIC8vIE5PVEU6IGF1ZGlvX3RyYWNrX2NibGtfdDo6ZnJhbWVTaXplIGZvciA4IGJpdCBQQ00gZGF0YSBpcyBiYXNlZCBvbiBhIHNhbXBsZSBzaXplIG9mCiAgICAgICAgIC8vIDE2IGJpdCBiZWNhdXNlIGRhdGEgaXMgY29udmVydGVkIHRvIDE2IGJpdCBiZWZvcmUgYmVpbmcgc3RvcmVkIGluIGJ1ZmZlciBieSBBdWRpb1RyYWNrCi0gICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgPyBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkgOiBzaXplb2YoaW50OF90KTsKKyAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSA/IG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkgOiBzaXplb2YoaW50OF90KTsKICAgICB9CiB9CiAKQEAgLTI5ODAsMTIgKzI5ODQsMTIgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTA1ZCAlMDN1ICUwM3UgJTAzdSAlMDV1ICAgJTA0dSAlMWQgJTFkICUxZCAlMDV1ICUwNXUgJTA1dSAgMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTA1ZCAlMDN1ICUwM3UgMHglMDh4ICUwNXUgICAlMDR1ICUxZCAlMWQgJTFkICUwNXUgJTA1dSAlMDV1ICAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCiAgICAgICAgICAgICBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCwKICAgICAgICAgICAgIChtQ2xpZW50ID09IE5VTEwpID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgIG1DYmxrLT5jaGFubmVsQ291bnQsCisgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtU3RhdGUsCkBAIC0zMjIwLDIxICszMjI0LDIxIEBACiAgICAgICAgICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIGZsYWdzLCAwLCBzZXNzaW9uSWQpLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCAwLCBzZXNzaW9uSWQpLAogICAgICAgICBtT3ZlcmZsb3coZmFsc2UpCiB7CiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKICAgICAgICBMT0dWKCJSZWNvcmRUcmFjayBjb25zdHJ1Y3Rvciwgc2l6ZSAlZCIsIChpbnQpbUJ1ZmZlckVuZCAtIChpbnQpbUJ1ZmZlcik7CiAgICAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUKSB7Ci0gICAgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50OF90KTsKKyAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50OF90KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gc2l6ZW9mKGludDhfdCk7CiAgICAgICAgfQpAQCAtMzMxNCwxMCArMzMxOCwxMCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTAzdSAlMDN1ICUwNWQgICAlMDR1ICUwMWQgJTA1dSAgJTA4eCAlMDh4XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTAzdSAweCUwOHggJTA1ZCAgICUwNHUgJTAxZCAlMDV1ICAlMDh4ICUwOHhcbiIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSBOVUxMKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgbUNibGstPmNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwKICAgICAgICAgICAgIG1TdGF0ZSwKQEAgLTMzMzMsMTAgKzMzMzcsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICBEdXBsaWNhdGluZ1RocmVhZCAqc291cmNlVGhyZWFkLAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkKLSAgICA6ICAgVHJhY2sodGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fQ05ULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgTlVMTCwgMCksCisgICAgOiAgIFRyYWNrKHRocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX0NOVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgMCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKQogewogCkBAIC0zMzQ3LDggKzMzNTEsMTAgQEAKICAgICAgICAgbUNibGstPnZvbHVtZVswXSA9IG1DYmxrLT52b2x1bWVbMV0gPSAweDEwMDA7CiAgICAgICAgIG1PdXRCdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tVHJhY2tzLmFkZCh0aGlzKTsKLSAgICAgICAgTE9HVigiT3V0cHV0VHJhY2sgY29uc3RydWN0b3IgbUNibGsgJXAsIG1CdWZmZXIgJXAsIG1DYmxrLT5idWZmZXJzICVwLCBtQ2Jsay0+ZnJhbWVDb3VudCAlZCwgbUNibGstPnNhbXBsZVJhdGUgJWQsIG1DYmxrLT5jaGFubmVsQ291bnQgJWQgbUJ1ZmZlckVuZCAlcCIsCi0gICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsIG1DYmxrLT5idWZmZXJzLCBtQ2Jsay0+ZnJhbWVDb3VudCwgbUNibGstPnNhbXBsZVJhdGUsIG1DYmxrLT5jaGFubmVsQ291bnQsIG1CdWZmZXJFbmQpOworICAgICAgICBMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgbUNibGstPmJ1ZmZlcnMgJXAsICIgXAorICAgICAgICAgICAgICAgICJtQ2Jsay0+ZnJhbWVDb3VudCAlZCwgbUNibGstPnNhbXBsZVJhdGUgJWQsIG1DaGFubmVsTWFzayAweCUwOHggbUJ1ZmZlckVuZCAlcCIsCisgICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsIG1DYmxrLT5idWZmZXJzLAorICAgICAgICAgICAgICAgIG1DYmxrLT5mcmFtZUNvdW50LCBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUNoYW5uZWxNYXNrLCBtQnVmZmVyRW5kKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dXKCJFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVwIiwgcGxheWJhY2tUaHJlYWQpOwogICAgIH0KQEAgLTMzODMsNyArMzM4OSw3IEBACiB7CiAgICAgQnVmZmVyICpwSW5CdWZmZXI7CiAgICAgQnVmZmVyIGluQnVmZmVyOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1DYmxrLT5jaGFubmVsQ291bnQ7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUNoYW5uZWxDb3VudDsKICAgICBib29sIG91dHB1dEJ1ZmZlckZ1bGwgPSBmYWxzZTsKICAgICBpbkJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOwogICAgIGluQnVmZmVyLmkxNiA9IGRhdGE7CkBAIC0zNjY4LDggKzM2NzQsOCBAQAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGludCBpbnB1dCwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBpbnQgKnNlc3Npb25JZCwKQEAgLTM3MTgsNyArMzcyNCw3IEBACiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlIG5ldyByZWNvcmQgdHJhY2suIFRoZSByZWNvcmQgdHJhY2sgdXNlcyBvbmUgdHJhY2sgaW4gbUhhcmR3YXJlTWl4ZXJUaHJlYWQgYnkgY29udmVudGlvbi4KICAgICAgICAgcmVjb3JkVHJhY2sgPSBuZXcgUmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjayh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBmbGFncywgbFNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgbFNlc3Npb25JZCk7CiAgICAgfQogICAgIGlmIChyZWNvcmRUcmFjay0+Z2V0Q2JsaygpID09IE5VTEwpIHsKICAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgUmVjb3JkVHJhY2sgc28gdGhhdCB0aGUgQ2xpZW50CkBAIC00MDY2LDcgKzQwNzIsNyBAQAogCiAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIkFjdGl2ZSBUcmFjazpcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgICBDbGllbiBGbXQgQ2huIFNlc3Npb24gQnVmICBTIFNSYXRlICBTZXJ2ICAgICBVc2VyXG4iKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgQ2xpZW4gRm10IENobiBtYXNrICAgU2Vzc2lvbiBCdWYgIFMgU1JhdGUgIFNlcnYgICAgIFVzZXJcbiIpOwogICAgICAgICBtQWN0aXZlVHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCkBAIC00MjIwLDcgKzQyMjYsNyBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQ6CiAgICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGRlc2MuY2hhbm5lbHMgPSBtQ2hhbm5lbHM7CisgICAgICAgIGRlc2MuY2hhbm5lbHMgPSBtQ2hhbm5lbE1hc2s7CiAgICAgICAgIGRlc2Muc2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgIGRlc2MuZm9ybWF0ID0gbUZvcm1hdDsKICAgICAgICAgZGVzYy5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CkBAIC00MjQzLDggKzQyNDksOCBAQAogICAgIG1SZXNhbXBsZXIgPSAwOwogCiAgICAgbVNhbXBsZVJhdGUgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUNoYW5uZWxzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpcG9wY291bnQobUNoYW5uZWxzKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUNoYW5uZWxDb3VudCA9ICh1aW50MTZfdClwb3Bjb3VudChtQ2hhbm5lbE1hc2spOwogICAgIG1Gb3JtYXQgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1GcmFtZVNpemUgPSAodWludDE2X3QpYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1JbnB1dEJ5dGVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwpAQCAtNDYxNiwzMiArNDYyMiw2IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkKLXsKLSAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCi0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIC8vIG9ubHkgYWxsb3cgbGlicmFyaWVzIGxvYWRlZCBmcm9tIC9zeXN0ZW0vbGliL3NvdW5kZnggZm9yIG5vdwotICAgIGlmIChzdHJuY21wKGdFZmZlY3RMaWJQYXRoLCBsaWJQYXRoLCBzdHJsZW4oZ0VmZmVjdExpYlBhdGgpKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBFZmZlY3RMb2FkTGlicmFyeShsaWJQYXRoLCBoYW5kbGUpOwotfQotCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSkKLXsKLSAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCi0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gRWZmZWN0VW5sb2FkTGlicmFyeShoYW5kbGUpOwotfQotCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqbnVtRWZmZWN0cykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNDY3Nyw3ICs0NjU3LDYgQEAKIHsKICAgICBzdGF0dXNfdCBsU3RhdHVzID0gTk9fRVJST1I7CiAgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGU7Ci0gICAgZWZmZWN0X2ludGVyZmFjZV90IGl0ZmU7CiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOwogICAgIHNwPENsaWVudD4gY2xpZW50OwogICAgIHdwPENsaWVudD4gd2NsaWVudDsKQEAgLTU1MTUsMTkgKzU0OTQsMTkgQEAKIAogICAgIC8vIFRPRE86IGhhbmRsZSBjb25maWd1cmF0aW9uIG9mIGVmZmVjdHMgcmVwbGFjaW5nIHRyYWNrIHByb2Nlc3MKICAgICBpZiAodGhyZWFkLT5jaGFubmVsQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgIGNoYW5uZWxzID0gQ0hBTk5FTF9NT05POworICAgICAgICBjaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKKyAgICAgICAgY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQogCiAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfTU9OTzsKKyAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGNoYW5uZWxzOwogICAgIH0KICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IGNoYW5uZWxzOwotICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OwotICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGU7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwpAQCAtNTc3MiwxMSArNTc1MSw2IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0spID09IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpIHsKLSAgICAgICAgLy8gY29udmVydCBkZXZpY2UgYml0IGZpZWxkIGZyb20gQXVkaW9TeXN0ZW0gdG8gRWZmZWN0QXBpIGZvcm1hdC4KLSAgICAgICAgZGV2aWNlID0gZGV2aWNlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaShkZXZpY2UpOwotICAgICAgICBpZiAoZGV2aWNlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KICAgICAgICAgc3RhdHVzX3QgY21kU3RhdHVzOwogICAgICAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKICAgICAgICAgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLApAQCAtNTc5NywxNyArNTc3MSwxMiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQpIHsKLSAgICAgICAgLy8gY29udmVydCBhdWRpbyBtb2RlIGZyb20gQXVkaW9TeXN0ZW0gdG8gRWZmZWN0QXBpIGZvcm1hdC4KLSAgICAgICAgaW50IGVmZmVjdE1vZGUgPSBtb2RlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaShtb2RlKTsKLSAgICAgICAgaWYgKGVmZmVjdE1vZGUgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9CiAgICAgICAgIHN0YXR1c190IGNtZFN0YXR1czsKICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihzdGF0dXNfdCk7CiAgICAgICAgIHN0YXR1cyA9ICgqbUVmZmVjdEludGVyZmFjZSktPmNvbW1hbmQobUVmZmVjdEludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZmZlY3RNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRTdGF0dXMpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC01ODE3LDUzICs1Nzg2LDYgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi0vLyB1cGRhdGUgdGhpcyB0YWJsZSB3aGVuIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIG9yIGF1ZGlvX2RldmljZV9lIChpbiBFZmZlY3RBcGkuaCkgYXJlIG1vZGlmaWVkCi1jb25zdCB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c0RldmljZUNvbnZUYWJsZVtdID0gewotICAgIERFVklDRV9FQVJQSUVDRSwgLy8gQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRQotICAgIERFVklDRV9TUEVBS0VSLCAvLyBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKLSAgICBERVZJQ0VfV0lSRURfSEVBRFNFVCwgLy8gY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQKLSAgICBERVZJQ0VfV0lSRURfSEVBRFBIT05FLCAvLyBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORQotICAgIERFVklDRV9CTFVFVE9PVEhfU0NPLCAvLyBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08KLSAgICBERVZJQ0VfQkxVRVRPT1RIX1NDT19IRUFEU0VULCAvLyBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVAotICAgIERFVklDRV9CTFVFVE9PVEhfU0NPX0NBUktJVCwgLy8gIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQKLSAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFAsIC8vICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQCi0gICAgREVWSUNFX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMsIC8vIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUwotICAgIERFVklDRV9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSLCAvLyBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIKLSAgICBERVZJQ0VfQVVYX0RJR0lUQUwgLy8gQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTAotfTsKLQotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmRldmljZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgZGV2aWNlKQotewotICAgIHVpbnQzMl90IGRldmljZU91dCA9IDA7Ci0gICAgd2hpbGUgKGRldmljZSkgewotICAgICAgICBjb25zdCB1aW50MzJfdCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGRldmljZSk7Ci0gICAgICAgIGRldmljZSAmPSB+KDEgPDwgaSk7Ci0gICAgICAgIGlmIChpID49IHNpemVvZihzRGV2aWNlQ29udlRhYmxlKS9zaXplb2YodWludDMyX3QpKSB7Ci0gICAgICAgICAgICBMT0dFKCJkZXZpY2UgY29udmVyc2lvbiBlcnJvciBmb3IgQXVkaW9TeXN0ZW0gZGV2aWNlIDB4JTA4eCIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBkZXZpY2VPdXQgfD0gKHVpbnQzMl90KXNEZXZpY2VDb252VGFibGVbaV07Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VPdXQ7Ci19Ci0KLS8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX21vZGUgb3IgYXVkaW9fbW9kZV9lIChpbiBFZmZlY3RBcGkuaCkgYXJlIG1vZGlmaWVkCi1jb25zdCB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c01vZGVDb252VGFibGVbXSA9IHsKLSAgICBBVURJT19FRkZFQ1RfTU9ERV9OT1JNQUwsICAgLy8gQVVESU9fTU9ERV9OT1JNQUwKLSAgICBBVURJT19FRkZFQ1RfTU9ERV9SSU5HVE9ORSwgLy8gQVVESU9fTU9ERV9SSU5HVE9ORQotICAgIEFVRElPX0VGRkVDVF9NT0RFX0lOX0NBTEwsICAvLyBBVURJT19NT0RFX0lOX0NBTEwKLSAgICBBVURJT19FRkZFQ1RfTU9ERV9JTl9DQUxMICAgLy8gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OLCBzYW1lIGNvbnZlcnNpb24gYXMgZm9yIEFVRElPX01PREVfSU5fQ0FMTAotfTsKLQotaW50IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjptb2RlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaSh1aW50MzJfdCBtb2RlKQotewotICAgIGludCBtb2RlT3V0ID0gLTE7Ci0gICAgaWYgKG1vZGUgPCBzaXplb2Yoc01vZGVDb252VGFibGUpIC8gc2l6ZW9mKHVpbnQzMl90KSkgewotICAgICAgICBtb2RlT3V0ID0gKGludClzTW9kZUNvbnZUYWJsZVttb2RlXTsKLSAgICB9Ci0gICAgcmV0dXJuIG1vZGVPdXQ7Ci19Ci0KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKQEAgLTU4OTUsNyArNTgxNyw3IEBACiAgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5jbG9ja1NlcSwgbURlc2NyaXB0b3IudHlwZS5ub2RlWzBdLCBtRGVzY3JpcHRvci50eXBlLm5vZGVbMV0sbURlc2NyaXB0b3IudHlwZS5ub2RlWzJdLAogICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVszXSxtRGVzY3JpcHRvci50eXBlLm5vZGVbNF0sbURlc2NyaXB0b3IudHlwZS5ub2RlWzVdKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gYXBpVmVyc2lvbjogJTA0WFxuXHRcdC0gZmxhZ3M6ICUwOFhcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gYXBpVmVyc2lvbjogJTA4WFxuXHRcdC0gZmxhZ3M6ICUwOFhcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5hcGlWZXJzaW9uLAogICAgICAgICAgICAgbURlc2NyaXB0b3IuZmxhZ3MpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCAzOTMxNGFkLi5mMzM3MWJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC03Niw4ICs3Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTg3LDcgKzg3LDcgQEAKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoaW50IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGludCBvdXRwdXQpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGZvcm1hdChpbnQgb3V0cHV0KSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBmb3JtYXQoaW50IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudChpbnQgb3V0cHV0KSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBsYXRlbmN5KGludCBvdXRwdXQpIGNvbnN0OwogCkBAIC0xNDcsMTAgKzE0Nyw2IEBACiAKICAgICB2aXJ0dWFsIGludCBuZXdBdWRpb1Nlc3Npb25JZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqbnVtRWZmZWN0cyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKQEAgLTE5Myw4ICsxODksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKQEAgLTMwNSw4ICszMDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC0zMzMsMTIgKzMyOSwxNCBAQAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIGludCBmb3JtYXQoKSBjb25zdCB7CisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQoKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQoKSBjb25zdCA7CiAKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrKCkgY29uc3Q7CisKICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlKCkgY29uc3Q7CiAKICAgICAgICAgICAgIHZvaWQqIGdldEJ1ZmZlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGZyYW1lcykgY29uc3Q7CkBAIC0zNjQsOSArMzYyLDExIEBACiAgICAgICAgICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCiAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1TdGF0ZTsKICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUNsaWVudFRpZDsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgbUZvcm1hdDsKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZvcm1hdDsKICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZsYWdzOwogICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOworICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OworICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBtQ2hhbm5lbE1hc2s7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgQ29uZmlnRXZlbnQgewpAQCAtMzc5LDcgKzM3OSw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQoKSBjb25zdDsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGZvcm1hdCgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHdha2VVcCgpICAgIHsgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7IH0KICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwpAQCAtNDEwLDEwICs0MTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyPiAgICAgICAgbUF1ZGlvRmxpbmdlcjsKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgbVBhcmFtQ29uZDsKICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICAgICAgICAgbU5ld1BhcmFtZXRlcnM7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1QYXJhbVN0YXR1czsKQEAgLTQ0Niw4ICs0NDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKTsKQEAgLTUzNCw4ICs1MzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRUcmFjayggIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVwbGljYXRpbmdUaHJlYWQgKnNvdXJjZVRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+T3V0cHV0VHJhY2soKTsKIApAQCAtNTg3LDggKzU4Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLApAQCAtODMzLDggKzgzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFRyYWNrKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKTsKQEAgLTEwMDIsMTQgKzEwMDIsNiBAQAogICAgICAgICBzdGF0dXNfdCBzdGFydF9sKCk7CiAgICAgICAgIHN0YXR1c190IHN0b3BfbCgpOwogCi0gICAgICAgIC8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgb3IgYXVkaW9fZGV2aWNlX2UgKGluIEVmZmVjdEFwaS5oKSBhcmUgbW9kaWZpZWQKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHNEZXZpY2VDb252VGFibGVbXTsKLSAgICAgICAgc3RhdGljIHVpbnQzMl90IGRldmljZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgZGV2aWNlKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhpcyB0YWJsZSB3aGVuIEF1ZGlvU3lzdGVtOjphdWRpb19tb2RlIG9yIGF1ZGlvX21vZGVfZSAoaW4gRWZmZWN0QXBpLmgpIGFyZSBtb2RpZmllZAotICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qgc01vZGVDb252VGFibGVbXTsKLSAgICAgICAgc3RhdGljIGludCBtb2RlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaSh1aW50MzJfdCBtb2RlKTsKLQogICAgICAgICBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgIC8vIG11dGV4IGZvciBwcm9jZXNzLCBjb21tYW5kcyBhbmQgaGFuZGxlcyBsaXN0IHByb3RlY3Rpb24KICAgICAgICAgd3A8VGhyZWFkQmFzZT4gICAgICBtVGhyZWFkOyAgICAvLyBwYXJlbnQgdGhyZWFkCiAgICAgICAgIHdwPEVmZmVjdENoYWluPiAgICAgbUNoYWluOyAgICAgLy8gcGFyZW50IGVmZmVjdCBjaGFpbgpAQCAtMTAxNyw3ICsxMDA5LDcgQEAKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOyAvLyBhdWRpbyBzZXNzaW9uIElECiAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2NyaXB0b3I7Ly8gZWZmZWN0IGRlc2NyaXB0b3IgcmVjZWl2ZWQgZnJvbSBlZmZlY3QgZW5naW5lCiAgICAgICAgIGVmZmVjdF9jb25maWdfdCAgICAgbUNvbmZpZzsgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBhdWRpbyBjb25maWd1cmF0aW9uCi0gICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAgbUVmZmVjdEludGVyZmFjZTsgLy8gRWZmZWN0IG1vZHVsZSBDIEFQSQorICAgICAgICBlZmZlY3RfaGFuZGxlX3QgIG1FZmZlY3RJbnRlcmZhY2U7IC8vIEVmZmVjdCBtb2R1bGUgQyBBUEkKICAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsgICAgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBzdGF0dXMKICAgICAgICAgdWludDMyX3QgbVN0YXRlOyAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGFjdGl2YXRpb24gc3RhdGUgKGVmZmVjdF9zdGF0ZSkKICAgICAgICAgVmVjdG9yPCB3cDxFZmZlY3RIYW5kbGU+ID4gbUhhbmRsZXM7ICAgIC8vIGxpc3Qgb2YgY2xpZW50IGhhbmRsZXMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAppbmRleCA1MGRjZGE3Li42ZTkzMTlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCkBAIC0yNiw2ICsyNiwxMCBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTYxLDYgKzY1LDcgQEAKICAgICAgICAgdC0+Y2hhbm5lbENvdW50ID0gMjsKICAgICAgICAgdC0+ZW5hYmxlZCA9IDA7CiAgICAgICAgIHQtPmZvcm1hdCA9IDE2OworICAgICAgICB0LT5jaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKICAgICAgICAgdC0+YnVmZmVyLnJhdyA9IDA7CiAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyID0gMDsKICAgICAgICAgdC0+aG9vayA9IDA7CkBAIC0xODAsMTMgKzE4NSwxOCBAQAogCiAgICAgc3dpdGNoICh0YXJnZXQpIHsKICAgICBjYXNlIFRSQUNLOgotICAgICAgICBpZiAobmFtZSA9PSBDSEFOTkVMX0NPVU5UKSB7Ci0gICAgICAgICAgICBpZiAoKHVpbnQzMl90KHZhbHVlSW50KSA8PSBNQVhfTlVNX0NIQU5ORUxTKSAmJiAodmFsdWVJbnQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmNoYW5uZWxDb3VudCAhPSB2YWx1ZUludCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsQ291bnQgPSB2YWx1ZUludDsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBDSEFOTkVMX0NPVU5ULCAlZCkiLCB2YWx1ZUludCk7CisgICAgICAgIGlmIChuYW1lID09IENIQU5ORUxfTUFTSykgeworICAgICAgICAgICAgdWludDMyX3QgbWFzayA9ICh1aW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIGlmIChtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsTWFzayAhPSBtYXNrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChtYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNoYW5uZWxDb3VudCA8PSBNQVhfTlVNX0NIQU5ORUxTKSAmJiAoY2hhbm5lbENvdW50KSkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsTWFzayA9IG1hc2s7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBDSEFOTkVMX01BU0ssICV4KSIsIG1hc2spOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMTw8bUFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAppbmRleCA4ODQwOGE3Li43NWM5MTcwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKQEAgLTYxLDcgKzYxLDcgQEAKIAogICAgICAgICAvLyBzZXQgUGFyYW1ldGVyIG5hbWVzCiAgICAgICAgIC8vIGZvciB0YXJnZXQgVFJBQ0sKLSAgICAgICAgQ0hBTk5FTF9DT1VOVCAgID0gMHg0MDAwLAorICAgICAgICBDSEFOTkVMX01BU0sgICAgPSAweDQwMDAsCiAgICAgICAgIEZPUk1BVCAgICAgICAgICA9IDB4NDAwMSwKICAgICAgICAgTUFJTl9CVUZGRVIgICAgID0gMHg0MDAyLAogICAgICAgICBBVVhfQlVGRkVSICAgICAgPSAweDQwMDMsCkBAIC0xNTAsNiArMTUwLDcgQEAKICAgICAgICAgdWludDhfdCAgICAgZW5hYmxlZCAgICAgIDogMTsKICAgICAgICAgdWludDhfdCAgICAgcmVzZXJ2ZWQwICAgIDogMzsKICAgICAgICAgdWludDhfdCAgICAgZm9ybWF0OworICAgICAgICB1aW50MzJfdCAgICBjaGFubmVsTWFzazsKIAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgICAgICAgICAgICBidWZmZXJQcm92aWRlcjsKICAgICAgICAgbXV0YWJsZSBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBlZjhkOTU3Li5kZDkxNzg4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMzksMTMgKzM5LDYgQEAKICNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3lfaGFsLmg+CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHRoZSBzaW0gYnVpbGQgZG9lc24ndCBoYXZlIGdldHRpZAotCi0jaWZuZGVmIEhBVkVfR0VUVElECi0jIGRlZmluZSBnZXR0aWQgZ2V0cGlkCi0jZW5kaWYKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgY2hhciAqa0RlYWRsb2NrZWRTdHJpbmcgPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvaW5wdXQvRXZlbnRIdWIuY3BwIGIvc2VydmljZXMvaW5wdXQvRXZlbnRIdWIuY3BwCmluZGV4IGFmMzA4ODcuLjI5YWRkNTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2lucHV0L0V2ZW50SHViLmNwcAorKysgYi9zZXJ2aWNlcy9pbnB1dC9FdmVudEh1Yi5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CkBAIC0xMjgsNiArMTI5LDcgQEAKICAgICAgICAgbUVycm9yKE5PX0lOSVQpLCBtQnVpbHRJbktleWJvYXJkSWQoLTEpLCBtTmV4dERldmljZUlkKDEpLAogICAgICAgICBtT3BlbmluZ0RldmljZXMoMCksIG1DbG9zaW5nRGV2aWNlcygwKSwKICAgICAgICAgbU9wZW5lZChmYWxzZSksIG1OZWVkVG9TZW5kRmluaXNoZWREZXZpY2VTY2FuKGZhbHNlKSwKKyAgICAgICAgbU5lZWRUb1Jlb3BlbkRldmljZXMoMCksIG1OZWVkVG9TY2FuRGV2aWNlcyhmYWxzZSksCiAgICAgICAgIG1JbnB1dEZkSW5kZXgoMSkgewogICAgIGFjcXVpcmVfd2FrZV9sb2NrKFBBUlRJQUxfV0FLRV9MT0NLLCBXQUtFX0xPQ0tfSUQpOwogCkBAIC0zOTMsMTIgKzM5NSwxMCBAQAogICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKIH0KIAotdm9pZCBFdmVudEh1Yjo6YWRkRXhjbHVkZWREZXZpY2UoY29uc3QgY2hhciogZGV2aWNlTmFtZSkKLXsKK3ZvaWQgRXZlbnRIdWI6OnNldEV4Y2x1ZGVkRGV2aWNlcyhjb25zdCBWZWN0b3I8U3RyaW5nOD4mIGRldmljZXMpIHsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogCi0gICAgU3RyaW5nOCBuYW1lKGRldmljZU5hbWUpOwotICAgIG1FeGNsdWRlZERldmljZXMucHVzaF9iYWNrKG5hbWUpOworICAgIG1FeGNsdWRlZERldmljZXMgPSBkZXZpY2VzOwogfQogCiBib29sIEV2ZW50SHViOjpoYXNMZWQoaW50MzJfdCBkZXZpY2VJZCwgaW50MzJfdCBsZWQpIGNvbnN0IHsKQEAgLTQ2Niw5ICs0NjYsMTEgQEAKICAgICBMT0dfQVNTRVJUKGJ1ZmZlclNpemUgPj0gMSk7CiAKICAgICBpZiAoIW1PcGVuZWQpIHsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9zdG9yZSgwLCAmbU5lZWRUb1Jlb3BlbkRldmljZXMpOworCiAgICAgICAgIG1FcnJvciA9IG9wZW5QbGF0Zm9ybUlucHV0KCkgPyBOT19FUlJPUiA6IFVOS05PV05fRVJST1I7CiAgICAgICAgIG1PcGVuZWQgPSB0cnVlOwotICAgICAgICBtTmVlZFRvU2VuZEZpbmlzaGVkRGV2aWNlU2NhbiA9IHRydWU7CisgICAgICAgIG1OZWVkVG9TY2FuRGV2aWNlcyA9IHRydWU7CiAgICAgfQogCiAgICAgc3RydWN0IGlucHV0X2V2ZW50IHJlYWRCdWZmZXJbYnVmZmVyU2l6ZV07CkBAIC00NzgsNiArNDgwLDIwIEBACiAgICAgZm9yICg7OykgewogICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKIAorICAgICAgICAvLyBSZW9wZW4gaW5wdXQgZGV2aWNlcyBpZiBuZWVkZWQuCisgICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1OZWVkVG9SZW9wZW5EZXZpY2VzKSkgeworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9zdG9yZSgwLCAmbU5lZWRUb1Jlb3BlbkRldmljZXMpOworCisgICAgICAgICAgICBMT0dJKCJSZW9wZW5pbmcgYWxsIGlucHV0IGRldmljZXMgZHVlIHRvIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UuIik7CisKKyAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgICAgICAgICB3aGlsZSAobURldmljZXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgIGNsb3NlRGV2aWNlQXRJbmRleExvY2tlZChtRGV2aWNlcy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OZWVkVG9TY2FuRGV2aWNlcyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsgLy8gcmV0dXJuIHRvIHRoZSBjYWxsZXIgYmVmb3JlIHdlIGFjdHVhbGx5IHJlc2NhbgorICAgICAgICB9CisKICAgICAgICAgLy8gUmVwb3J0IGFueSBkZXZpY2VzIHRoYXQgaGFkIGxhc3QgYmVlbiBhZGRlZC9yZW1vdmVkLgogICAgICAgICB3aGlsZSAobUNsb3NpbmdEZXZpY2VzKSB7CiAgICAgICAgICAgICBEZXZpY2UqIGRldmljZSA9IG1DbG9zaW5nRGV2aWNlczsKQEAgLTQ5NSw2ICs1MTEsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChtTmVlZFRvU2NhbkRldmljZXMpIHsKKyAgICAgICAgICAgIG1OZWVkVG9TY2FuRGV2aWNlcyA9IGZhbHNlOworICAgICAgICAgICAgc2NhbkRldmljZXMoKTsKKyAgICAgICAgICAgIG1OZWVkVG9TZW5kRmluaXNoZWREZXZpY2VTY2FuID0gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIHdoaWxlIChtT3BlbmluZ0RldmljZXMgIT0gTlVMTCkgewogICAgICAgICAgICAgRGV2aWNlKiBkZXZpY2UgPSBtT3BlbmluZ0RldmljZXM7CiAgICAgICAgICAgICBMT0dWKCJSZXBvcnRpbmcgZGV2aWNlIG9wZW5lZDogaWQ9JWQsIG5hbWU9JXNcbiIsCkBAIC02OTYsMTMgKzcxOCwxNCBAQAogICAgIHBvbGxmZC5yZXZlbnRzID0gMDsKICAgICBtRmRzLnB1c2gocG9sbGZkKTsKICAgICBtRGV2aWNlcy5wdXNoKE5VTEwpOworICAgIHJldHVybiB0cnVlOworfQogCi0gICAgcmVzID0gc2NhbkRpcihERVZJQ0VfUEFUSCk7Cit2b2lkIEV2ZW50SHViOjpzY2FuRGV2aWNlcygpIHsKKyAgICBpbnQgcmVzID0gc2NhbkRpcihERVZJQ0VfUEFUSCk7CiAgICAgaWYocmVzIDwgMCkgewogICAgICAgICBMT0dFKCJzY2FuIGRpciBmYWlsZWQgZm9yICVzXG4iLCBERVZJQ0VfUEFUSCk7CiAgICAgfQotCi0gICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc1NSwxMiArNzc4LDEwIEBACiAgICAgfQogCiAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaXMgb24gb3VyIGV4Y2x1ZGVkIGxpc3QKLSAgICBMaXN0PFN0cmluZzg+OjppdGVyYXRvciBpdGVyID0gbUV4Y2x1ZGVkRGV2aWNlcy5iZWdpbigpOwotICAgIExpc3Q8U3RyaW5nOD46Oml0ZXJhdG9yIGVuZCA9IG1FeGNsdWRlZERldmljZXMuZW5kKCk7Ci0gICAgZm9yICggOyBpdGVyICE9IGVuZDsgaXRlcisrKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHRlc3QgPSAqaXRlcjsKLSAgICAgICAgaWYgKGlkZW50aWZpZXIubmFtZSA9PSB0ZXN0KSB7Ci0gICAgICAgICAgICBMT0dJKCJpZ25vcmluZyBldmVudCBpZCAlcyBkcml2ZXIgJXNcbiIsIGRldmljZVBhdGgsIHRlc3QpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUV4Y2x1ZGVkRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBTdHJpbmc4JiBpdGVtID0gbUV4Y2x1ZGVkRGV2aWNlcy5pdGVtQXQoaSk7CisgICAgICAgIGlmIChpZGVudGlmaWVyLm5hbWUgPT0gaXRlbSkgeworICAgICAgICAgICAgTE9HSSgiaWdub3JpbmcgZXZlbnQgaWQgJXMgZHJpdmVyICVzXG4iLCBkZXZpY2VQYXRoLCBpdGVtLnN0cmluZygpKTsKICAgICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpAQCAtMTIyMyw2ICsxMjQ0LDEwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgRXZlbnRIdWI6OnJlb3BlbkRldmljZXMoKSB7CisgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSgxLCAmbU5lZWRUb1Jlb3BlbkRldmljZXMpOworfQorCiB2b2lkIEV2ZW50SHViOjpkdW1wKFN0cmluZzgmIGR1bXApIHsKICAgICBkdW1wLmFwcGVuZCgiRXZlbnQgSHViIFN0YXRlOlxuIik7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2lucHV0L0V2ZW50SHViLmggYi9zZXJ2aWNlcy9pbnB1dC9FdmVudEh1Yi5oCmluZGV4IGNhMzM2MTkuLjU1ODk1OWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2lucHV0L0V2ZW50SHViLmgKKysrIGIvc2VydmljZXMvaW5wdXQvRXZlbnRIdWIuaApAQCAtMTkzLDkgKzE5Myw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBtYXBBeGlzKGludDMyX3QgZGV2aWNlSWQsIGludCBzY2FuY29kZSwKICAgICAgICAgICAgIEF4aXNJbmZvKiBvdXRBeGlzSW5mbykgY29uc3QgPSAwOwogCi0gICAgLy8gZXhjbHVkZSBhIHBhcnRpY3VsYXIgZGV2aWNlIGZyb20gb3BlbmluZwotICAgIC8vIHRoaXMgY2FuIGJlIHVzZWQgdG8gaWdub3JlIGlucHV0IGRldmljZXMgZm9yIHNlbnNvcnMKLSAgICB2aXJ0dWFsIHZvaWQgYWRkRXhjbHVkZWREZXZpY2UoY29uc3QgY2hhciogZGV2aWNlTmFtZSkgPSAwOworICAgIC8vIFNldHMgZGV2aWNlcyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIG9wZW5pbmcuCisgICAgLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBpZ25vcmUgaW5wdXQgZGV2aWNlcyBmb3Igc2Vuc29ycy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXhjbHVkZWREZXZpY2VzKGNvbnN0IFZlY3RvcjxTdHJpbmc4PiYgZGV2aWNlcykgPSAwOwogCiAgICAgLyoKICAgICAgKiBXYWl0IGZvciBldmVudHMgdG8gYmVjb21lIGF2YWlsYWJsZSBhbmQgcmV0dXJucyB0aGVtLgpAQCAtMjMwLDYgKzIzMCw4IEBACiAgICAgdmlydHVhbCB2b2lkIGdldFZpcnR1YWxLZXlEZWZpbml0aW9ucyhpbnQzMl90IGRldmljZUlkLAogICAgICAgICAgICAgVmVjdG9yPFZpcnR1YWxLZXlEZWZpbml0aW9uPiYgb3V0VmlydHVhbEtleXMpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgdm9pZCByZW9wZW5EZXZpY2VzKCkgPSAwOworCiAgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCYgZHVtcCkgPSAwOwogfTsKIApAQCAtMjU5LDcgKzI2MSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBtYXBBeGlzKGludDMyX3QgZGV2aWNlSWQsIGludCBzY2FuY29kZSwKICAgICAgICAgICAgIEF4aXNJbmZvKiBvdXRBeGlzSW5mbykgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWRkRXhjbHVkZWREZXZpY2UoY29uc3QgY2hhciogZGV2aWNlTmFtZSk7CisgICAgdmlydHVhbCB2b2lkIHNldEV4Y2x1ZGVkRGV2aWNlcyhjb25zdCBWZWN0b3I8U3RyaW5nOD4mIGRldmljZXMpOwogCiAgICAgdmlydHVhbCBpbnQzMl90IGdldFNjYW5Db2RlU3RhdGUoaW50MzJfdCBkZXZpY2VJZCwgaW50MzJfdCBzY2FuQ29kZSkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQzMl90IGdldEtleUNvZGVTdGF0ZShpbnQzMl90IGRldmljZUlkLCBpbnQzMl90IGtleUNvZGUpIGNvbnN0OwpAQCAtMjc2LDYgKzI3OCw4IEBACiAgICAgdmlydHVhbCB2b2lkIGdldFZpcnR1YWxLZXlEZWZpbml0aW9ucyhpbnQzMl90IGRldmljZUlkLAogICAgICAgICAgICAgVmVjdG9yPFZpcnR1YWxLZXlEZWZpbml0aW9uPiYgb3V0VmlydHVhbEtleXMpIGNvbnN0OwogCisgICAgdmlydHVhbCB2b2lkIHJlb3BlbkRldmljZXMoKTsKKwogICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIGR1bXApOwogCiBwcm90ZWN0ZWQ6CkBAIC0yODgsNiArMjkyLDcgQEAKICAgICBpbnQgY2xvc2VEZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlUGF0aCk7CiAgICAgaW50IGNsb3NlRGV2aWNlQXRJbmRleExvY2tlZChpbnQgaW5kZXgpOwogICAgIGludCBzY2FuRGlyKGNvbnN0IGNoYXIgKmRpcm5hbWUpOworICAgIHZvaWQgc2NhbkRldmljZXMoKTsKICAgICBpbnQgcmVhZE5vdGlmeShpbnQgbmZkKTsKIAogICAgIHN0YXR1c190IG1FcnJvcjsKQEAgLTM1MSw3ICszNTYsOSBAQAogCiAgICAgYm9vbCBtT3BlbmVkOwogICAgIGJvb2wgbU5lZWRUb1NlbmRGaW5pc2hlZERldmljZVNjYW47Ci0gICAgTGlzdDxTdHJpbmc4PiBtRXhjbHVkZWREZXZpY2VzOworICAgIHZvbGF0aWxlIGludDMyX3QgbU5lZWRUb1Jlb3BlbkRldmljZXM7IC8vIG11c3QgYmUgbW9kaWZpZWQgYXRvbWljYWxseQorICAgIGJvb2wgbU5lZWRUb1NjYW5EZXZpY2VzOworICAgIFZlY3RvcjxTdHJpbmc4PiBtRXhjbHVkZWREZXZpY2VzOwogCiAgICAgLy8gZGV2aWNlIGlkcyB0aGF0IHJlcG9ydCBwYXJ0aWN1bGFyIHN3aXRjaGVzLgogICAgIGludDMyX3QgbVN3aXRjaGVzW1NXX01BWCArIDFdOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvaW5wdXQvSW5wdXREaXNwYXRjaGVyLmNwcCBiL3NlcnZpY2VzL2lucHV0L0lucHV0RGlzcGF0Y2hlci5jcHAKaW5kZXggOGM1MzVkNi4uNGM2MDk4ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvaW5wdXQvSW5wdXREaXNwYXRjaGVyLmNwcAorKysgYi9zZXJ2aWNlcy9pbnB1dC9JbnB1dERpc3BhdGNoZXIuY3BwCkBAIC0yMjgsMTMgKzIyOCwxNCBAQAogCiAgICAgbUtleVJlcGVhdFN0YXRlLmxhc3RLZXlFbnRyeSA9IE5VTEw7CiAKLSAgICBpbnQzMl90IG1heEV2ZW50c1BlclNlY29uZCA9IHBvbGljeS0+Z2V0TWF4RXZlbnRzUGVyU2Vjb25kKCk7Ci0gICAgbVRocm90dGxlU3RhdGUubWluVGltZUJldHdlZW5FdmVudHMgPSAxMDAwMDAwMDAwTEwgLyBtYXhFdmVudHNQZXJTZWNvbmQ7CisgICAgcG9saWN5LT5nZXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbigmbUNvbmZpZyk7CisKKyAgICBtVGhyb3R0bGVTdGF0ZS5taW5UaW1lQmV0d2VlbkV2ZW50cyA9IDEwMDAwMDAwMDBMTCAvIG1Db25maWcubWF4RXZlbnRzUGVyU2Vjb25kOwogICAgIG1UaHJvdHRsZVN0YXRlLmxhc3REZXZpY2VJZCA9IC0xOwogCiAjaWYgREVCVUdfVEhST1RUTElORwogICAgIG1UaHJvdHRsZVN0YXRlLm9yaWdpbmFsU2FtcGxlQ291bnQgPSAwOwotICAgIExPR0QoIlRocm90dGxpbmcgLSBNYXggZXZlbnRzIHBlciBzZWNvbmQgPSAlZCIsIG1heEV2ZW50c1BlclNlY29uZCk7CisgICAgTE9HRCgiVGhyb3R0bGluZyAtIE1heCBldmVudHMgcGVyIHNlY29uZCA9ICVkIiwgbUNvbmZpZy5tYXhFdmVudHNQZXJTZWNvbmQpOwogI2VuZGlmCiB9CiAKQEAgLTI1MywxMyArMjU0LDEwIEBACiB9CiAKIHZvaWQgSW5wdXREaXNwYXRjaGVyOjpkaXNwYXRjaE9uY2UoKSB7Ci0gICAgbnNlY3NfdCBrZXlSZXBlYXRUaW1lb3V0ID0gbVBvbGljeS0+Z2V0S2V5UmVwZWF0VGltZW91dCgpOwotICAgIG5zZWNzX3Qga2V5UmVwZWF0RGVsYXkgPSBtUG9saWN5LT5nZXRLZXlSZXBlYXREZWxheSgpOwotCiAgICAgbnNlY3NfdCBuZXh0V2FrZXVwVGltZSA9IExPTkdfTE9OR19NQVg7CiAgICAgeyAvLyBhY3F1aXJlIGxvY2sKICAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICAgICAgZGlzcGF0Y2hPbmNlSW5uZXJMb2NrZWQoa2V5UmVwZWF0VGltZW91dCwga2V5UmVwZWF0RGVsYXksICYgbmV4dFdha2V1cFRpbWUpOworICAgICAgICBkaXNwYXRjaE9uY2VJbm5lckxvY2tlZCgmbmV4dFdha2V1cFRpbWUpOwogCiAgICAgICAgIGlmIChydW5Db21tYW5kc0xvY2tlZEludGVycnVwdGlibGUoKSkgewogICAgICAgICAgICAgbmV4dFdha2V1cFRpbWUgPSBMT05HX0xPTkdfTUlOOyAgLy8gZm9yY2UgbmV4dCBwb2xsIHRvIHdha2UgdXAgaW1tZWRpYXRlbHkKQEAgLTI3MiwxNCArMjcwLDEzIEBACiAgICAgbUxvb3Blci0+cG9sbE9uY2UodGltZW91dE1pbGxpcyk7CiB9CiAKLXZvaWQgSW5wdXREaXNwYXRjaGVyOjpkaXNwYXRjaE9uY2VJbm5lckxvY2tlZChuc2Vjc190IGtleVJlcGVhdFRpbWVvdXQsCi0gICAgICAgIG5zZWNzX3Qga2V5UmVwZWF0RGVsYXksIG5zZWNzX3QqIG5leHRXYWtldXBUaW1lKSB7Cit2b2lkIElucHV0RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hPbmNlSW5uZXJMb2NrZWQobnNlY3NfdCogbmV4dFdha2V1cFRpbWUpIHsKICAgICBuc2Vjc190IGN1cnJlbnRUaW1lID0gbm93KCk7CiAKICAgICAvLyBSZXNldCB0aGUga2V5IHJlcGVhdCB0aW1lciB3aGVuZXZlciB3ZSBkaXNhbGxvdyBrZXkgZXZlbnRzLCBldmVuIGlmIHRoZSBuZXh0IGV2ZW50CiAgICAgLy8gaXMgbm90IGEga2V5LiAgVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB3ZSBhYm9ydCBhIGtleSByZXBlYXQgaWYgdGhlIGRldmljZSBpcyBqdXN0IGNvbWluZwogICAgIC8vIG91dCBvZiBzbGVlcC4KLSAgICBpZiAoa2V5UmVwZWF0VGltZW91dCA8IDApIHsKKyAgICBpZiAoIW1Qb2xpY3ktPmlzS2V5UmVwZWF0RW5hYmxlZCgpKSB7CiAgICAgICAgIHJlc2V0S2V5UmVwZWF0TG9ja2VkKCk7CiAgICAgfQogCkBAIC0zMTMsNyArMzEwLDcgQEAKICAgICAgICAgICAgIC8vIFN5bnRoZXNpemUgYSBrZXkgcmVwZWF0IGlmIGFwcHJvcHJpYXRlLgogICAgICAgICAgICAgaWYgKG1LZXlSZXBlYXRTdGF0ZS5sYXN0S2V5RW50cnkpIHsKICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWUgPj0gbUtleVJlcGVhdFN0YXRlLm5leHRSZXBlYXRUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nRXZlbnQgPSBzeW50aGVzaXplS2V5UmVwZWF0TG9ja2VkKGN1cnJlbnRUaW1lLCBrZXlSZXBlYXREZWxheSk7CisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nRXZlbnQgPSBzeW50aGVzaXplS2V5UmVwZWF0TG9ja2VkKGN1cnJlbnRUaW1lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAobUtleVJlcGVhdFN0YXRlLm5leHRSZXBlYXRUaW1lIDwgKm5leHRXYWtldXBUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAqbmV4dFdha2V1cFRpbWUgPSBtS2V5UmVwZWF0U3RhdGUubmV4dFJlcGVhdFRpbWU7CkBAIC00MzIsOCArNDI5LDcgQEAKICAgICAgICAgaWYgKGRyb3BSZWFzb24gPT0gRFJPUF9SRUFTT05fTk9UX0RST1BQRUQgJiYgbU5leHRVbmJsb2NrZWRFdmVudCkgewogICAgICAgICAgICAgZHJvcFJlYXNvbiA9IERST1BfUkVBU09OX0JMT0NLRUQ7CiAgICAgICAgIH0KLSAgICAgICAgZG9uZSA9IGRpc3BhdGNoS2V5TG9ja2VkKGN1cnJlbnRUaW1lLCB0eXBlZEVudHJ5LCBrZXlSZXBlYXRUaW1lb3V0LAotICAgICAgICAgICAgICAgICZkcm9wUmVhc29uLCBuZXh0V2FrZXVwVGltZSk7CisgICAgICAgIGRvbmUgPSBkaXNwYXRjaEtleUxvY2tlZChjdXJyZW50VGltZSwgdHlwZWRFbnRyeSwgJmRyb3BSZWFzb24sIG5leHRXYWtldXBUaW1lKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC02OTIsOCArNjg4LDcgQEAKICAgICB9CiB9CiAKLUlucHV0RGlzcGF0Y2hlcjo6S2V5RW50cnkqIElucHV0RGlzcGF0Y2hlcjo6c3ludGhlc2l6ZUtleVJlcGVhdExvY2tlZCgKLSAgICAgICAgbnNlY3NfdCBjdXJyZW50VGltZSwgbnNlY3NfdCBrZXlSZXBlYXREZWxheSkgeworSW5wdXREaXNwYXRjaGVyOjpLZXlFbnRyeSogSW5wdXREaXNwYXRjaGVyOjpzeW50aGVzaXplS2V5UmVwZWF0TG9ja2VkKG5zZWNzX3QgY3VycmVudFRpbWUpIHsKICAgICBLZXlFbnRyeSogZW50cnkgPSBtS2V5UmVwZWF0U3RhdGUubGFzdEtleUVudHJ5OwogCiAgICAgLy8gUmV1c2UgdGhlIHJlcGVhdGVkIGtleSBlbnRyeSBpZiBpdCBpcyBvdGhlcndpc2UgdW5yZWZlcmVuY2VkLgpAQCAtNzIxLDcgKzcxNiw3IEBACiAgICAgLy8gbUtleVJlcGVhdFN0YXRlLmxhc3RLZXlFbnRyeSBpbiBhZGRpdGlvbiB0byB0aGUgb25lIHdlIHJldHVybi4KICAgICBlbnRyeS0+cmVmQ291bnQgKz0gMTsKIAotICAgIG1LZXlSZXBlYXRTdGF0ZS5uZXh0UmVwZWF0VGltZSA9IGN1cnJlbnRUaW1lICsga2V5UmVwZWF0RGVsYXk7CisgICAgbUtleVJlcGVhdFN0YXRlLm5leHRSZXBlYXRUaW1lID0gY3VycmVudFRpbWUgKyBtQ29uZmlnLmtleVJlcGVhdERlbGF5OwogICAgIHJldHVybiBlbnRyeTsKIH0KIApAQCAtNzQxLDggKzczNiw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSW5wdXREaXNwYXRjaGVyOjpkaXNwYXRjaEtleUxvY2tlZCgKLSAgICAgICAgbnNlY3NfdCBjdXJyZW50VGltZSwgS2V5RW50cnkqIGVudHJ5LCBuc2Vjc190IGtleVJlcGVhdFRpbWVvdXQsCitib29sIElucHV0RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hLZXlMb2NrZWQobnNlY3NfdCBjdXJyZW50VGltZSwgS2V5RW50cnkqIGVudHJ5LAogICAgICAgICBEcm9wUmVhc29uKiBkcm9wUmVhc29uLCBuc2Vjc190KiBuZXh0V2FrZXVwVGltZSkgewogICAgIC8vIFByZXByb2Nlc3NpbmcuCiAgICAgaWYgKCEgZW50cnktPmRpc3BhdGNoSW5Qcm9ncmVzcykgewpAQCAtNzYyLDcgKzc1Niw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vdCBhIHJlcGVhdC4gIFNhdmUga2V5IGRvd24gc3RhdGUgaW4gY2FzZSB3ZSBkbyBzZWUgYSByZXBlYXQgbGF0ZXIuCiAgICAgICAgICAgICAgICAgcmVzZXRLZXlSZXBlYXRMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICBtS2V5UmVwZWF0U3RhdGUubmV4dFJlcGVhdFRpbWUgPSBlbnRyeS0+ZXZlbnRUaW1lICsga2V5UmVwZWF0VGltZW91dDsKKyAgICAgICAgICAgICAgICBtS2V5UmVwZWF0U3RhdGUubmV4dFJlcGVhdFRpbWUgPSBlbnRyeS0+ZXZlbnRUaW1lICsgbUNvbmZpZy5rZXlSZXBlYXRUaW1lb3V0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUtleVJlcGVhdFN0YXRlLmxhc3RLZXlFbnRyeSA9IGVudHJ5OwogICAgICAgICAgICAgZW50cnktPnJlZkNvdW50ICs9IDE7CkBAIC0zNzc3LDYgKzM3NzEsMTEgQEAKIHZvaWQgSW5wdXREaXNwYXRjaGVyOjpkdW1wKFN0cmluZzgmIGR1bXApIHsKICAgICBkdW1wLmFwcGVuZCgiSW5wdXQgRGlzcGF0Y2hlciBTdGF0ZTpcbiIpOwogICAgIGR1bXBEaXNwYXRjaFN0YXRlTG9ja2VkKGR1bXApOworCisgICAgZHVtcC5hcHBlbmQoSU5ERU5UICJDb25maWd1cmF0aW9uOlxuIik7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMiAiTWF4RXZlbnRzUGVyU2Vjb25kOiAlZFxuIiwgbUNvbmZpZy5tYXhFdmVudHNQZXJTZWNvbmQpOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDIgIktleVJlcGVhdERlbGF5OiAlMC4xZm1zXG4iLCBtQ29uZmlnLmtleVJlcGVhdERlbGF5ICogMC4wMDAwMDFmKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQyICJLZXlSZXBlYXRUaW1lb3V0OiAlMC4xZm1zXG4iLCBtQ29uZmlnLmtleVJlcGVhdFRpbWVvdXQgKiAwLjAwMDAwMWYpOwogfQogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2lucHV0L0lucHV0RGlzcGF0Y2hlci5oIGIvc2VydmljZXMvaW5wdXQvSW5wdXREaXNwYXRjaGVyLmgKaW5kZXggOWFjNWI3NS4uMzdjZWY5MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvaW5wdXQvSW5wdXREaXNwYXRjaGVyLmgKKysrIGIvc2VydmljZXMvaW5wdXQvSW5wdXREaXNwYXRjaGVyLmgKQEAgLTE0Myw2ICsxNDMsMzAgQEAKIAogCiAvKgorICogSW5wdXQgZGlzcGF0Y2hlciBjb25maWd1cmF0aW9uLgorICoKKyAqIFNwZWNpZmllcyB2YXJpb3VzIG9wdGlvbnMgdGhhdCBtb2RpZnkgdGhlIGJlaGF2aW9yIG9mIHRoZSBpbnB1dCBkaXNwYXRjaGVyLgorICovCitzdHJ1Y3QgSW5wdXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbiB7CisgICAgLy8gVGhlIGtleSByZXBlYXQgaW5pdGlhbCB0aW1lb3V0LgorICAgIG5zZWNzX3Qga2V5UmVwZWF0VGltZW91dDsKKworICAgIC8vIFRoZSBrZXkgcmVwZWF0IGludGVyLWtleSBkZWxheS4KKyAgICBuc2Vjc190IGtleVJlcGVhdERlbGF5OworCisgICAgLy8gVGhlIG1heGltdW0gc3VnZ2VzdGVkIGV2ZW50IGRlbGl2ZXJ5IHJhdGUgcGVyIHNlY29uZC4KKyAgICAvLyBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gdGhyb3R0bGUgbW90aW9uIGV2ZW50IG1vdmVtZW50IGFjdGlvbnMgb24gYSBwZXItZGV2aWNlCisgICAgLy8gYmFzaXMuICBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYSBoYXJkIGxpbWl0LgorICAgIGludDMyX3QgbWF4RXZlbnRzUGVyU2Vjb25kOworCisgICAgSW5wdXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbigpIDoKKyAgICAgICAgICAgIGtleVJlcGVhdFRpbWVvdXQoNTAwICogMTAwMDAwMExMKSwKKyAgICAgICAgICAgIGtleVJlcGVhdERlbGF5KDUwICogMTAwMDAwMExMKSwKKyAgICAgICAgICAgIG1heEV2ZW50c1BlclNlY29uZCg2MCkgeyB9Cit9OworCisKKy8qCiAgKiBJbnB1dCBkaXNwYXRjaGVyIHBvbGljeSBpbnRlcmZhY2UuCiAgKgogICogVGhlIGlucHV0IHJlYWRlciBwb2xpY3kgaXMgdXNlZCBieSB0aGUgaW5wdXQgcmVhZGVyIHRvIGludGVyYWN0IHdpdGggdGhlIFdpbmRvdyBNYW5hZ2VyCkBAIC0xNjgsMTcgKzE5MiwxMSBAQAogICAgIC8qIE5vdGlmaWVzIHRoZSBzeXN0ZW0gdGhhdCBhbiBpbnB1dCBjaGFubmVsIGlzIHVucmVjb3ZlcmFibHkgYnJva2VuLiAqLwogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlJbnB1dENoYW5uZWxCcm9rZW4oY29uc3Qgc3A8SW5wdXRXaW5kb3dIYW5kbGU+JiBpbnB1dFdpbmRvd0hhbmRsZSkgPSAwOwogCi0gICAgLyogR2V0cyB0aGUga2V5IHJlcGVhdCBpbml0aWFsIHRpbWVvdXQgb3IgLTEgaWYgYXV0b21hdGljIGtleSByZXBlYXRpbmcgaXMgZGlzYWJsZWQuICovCi0gICAgdmlydHVhbCBuc2Vjc190IGdldEtleVJlcGVhdFRpbWVvdXQoKSA9IDA7CisgICAgLyogR2V0cyB0aGUgaW5wdXQgZGlzcGF0Y2hlciBjb25maWd1cmF0aW9uLiAqLworICAgIHZpcnR1YWwgdm9pZCBnZXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbihJbnB1dERpc3BhdGNoZXJDb25maWd1cmF0aW9uKiBvdXRDb25maWcpID0gMDsKIAotICAgIC8qIEdldHMgdGhlIGtleSByZXBlYXQgaW50ZXIta2V5IGRlbGF5LiAqLwotICAgIHZpcnR1YWwgbnNlY3NfdCBnZXRLZXlSZXBlYXREZWxheSgpID0gMDsKLQotICAgIC8qIEdldHMgdGhlIG1heGltdW0gc3VnZ2VzdGVkIGV2ZW50IGRlbGl2ZXJ5IHJhdGUgcGVyIHNlY29uZC4KLSAgICAgKiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gdGhyb3R0bGUgbW90aW9uIGV2ZW50IG1vdmVtZW50IGFjdGlvbnMgb24gYSBwZXItZGV2aWNlCi0gICAgICogYmFzaXMuICBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYSBoYXJkIGxpbWl0LgotICAgICAqLwotICAgIHZpcnR1YWwgaW50MzJfdCBnZXRNYXhFdmVudHNQZXJTZWNvbmQoKSA9IDA7CisgICAgLyogUmV0dXJucyB0cnVlIGlmIGF1dG9tYXRpYyBrZXkgcmVwZWF0aW5nIGlzIGVuYWJsZWQuICovCisgICAgdmlydHVhbCBib29sIGlzS2V5UmVwZWF0RW5hYmxlZCgpID0gMDsKIAogICAgIC8qIEZpbHRlcnMgYW4gaW5wdXQgZXZlbnQuCiAgICAgICogUmV0dXJuIHRydWUgdG8gZGlzcGF0Y2ggdGhlIGV2ZW50IHVubW9kaWZpZWQsIGZhbHNlIHRvIGNvbnN1bWUgdGhlIGV2ZW50LgpAQCAtODAwLDYgKzgxOCw3IEBACiAgICAgfTsKIAogICAgIHNwPElucHV0RGlzcGF0Y2hlclBvbGljeUludGVyZmFjZT4gbVBvbGljeTsKKyAgICBJbnB1dERpc3BhdGNoZXJDb25maWd1cmF0aW9uIG1Db25maWc7CiAKICAgICBNdXRleCBtTG9jazsKIApAQCAtODEyLDggKzgzMSw3IEBACiAKICAgICBWZWN0b3I8RXZlbnRFbnRyeSo+IG1UZW1wQ2FuY2VsYXRpb25FdmVudHM7CiAKLSAgICB2b2lkIGRpc3BhdGNoT25jZUlubmVyTG9ja2VkKG5zZWNzX3Qga2V5UmVwZWF0VGltZW91dCwgbnNlY3NfdCBrZXlSZXBlYXREZWxheSwKLSAgICAgICAgICAgIG5zZWNzX3QqIG5leHRXYWtldXBUaW1lKTsKKyAgICB2b2lkIGRpc3BhdGNoT25jZUlubmVyTG9ja2VkKG5zZWNzX3QqIG5leHRXYWtldXBUaW1lKTsKIAogICAgIC8vIEJhdGNoZXMgYSBuZXcgc2FtcGxlIG9udG8gYSBtb3Rpb24gZW50cnkuCiAgICAgLy8gQXNzdW1lcyB0aGF0IHRoZSB3ZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHdlIGNhbiBhcHBlbmQgc2FtcGxlcy4KQEAgLTg4NSw3ICs5MDMsNyBAQAogICAgIH0gbUtleVJlcGVhdFN0YXRlOwogCiAgICAgdm9pZCByZXNldEtleVJlcGVhdExvY2tlZCgpOwotICAgIEtleUVudHJ5KiBzeW50aGVzaXplS2V5UmVwZWF0TG9ja2VkKG5zZWNzX3QgY3VycmVudFRpbWUsIG5zZWNzX3Qga2V5UmVwZWF0VGltZW91dCk7CisgICAgS2V5RW50cnkqIHN5bnRoZXNpemVLZXlSZXBlYXRMb2NrZWQobnNlY3NfdCBjdXJyZW50VGltZSk7CiAKICAgICAvLyBEZWZlcnJlZCBjb21tYW5kIHByb2Nlc3NpbmcuCiAgICAgYm9vbCBydW5Db21tYW5kc0xvY2tlZEludGVycnVwdGlibGUoKTsKQEAgLTk0Myw3ICs5NjEsNyBAQAogICAgIGJvb2wgZGlzcGF0Y2hDb25maWd1cmF0aW9uQ2hhbmdlZExvY2tlZCgKICAgICAgICAgICAgIG5zZWNzX3QgY3VycmVudFRpbWUsIENvbmZpZ3VyYXRpb25DaGFuZ2VkRW50cnkqIGVudHJ5KTsKICAgICBib29sIGRpc3BhdGNoS2V5TG9ja2VkKAotICAgICAgICAgICAgbnNlY3NfdCBjdXJyZW50VGltZSwgS2V5RW50cnkqIGVudHJ5LCBuc2Vjc190IGtleVJlcGVhdFRpbWVvdXQsCisgICAgICAgICAgICBuc2Vjc190IGN1cnJlbnRUaW1lLCBLZXlFbnRyeSogZW50cnksCiAgICAgICAgICAgICBEcm9wUmVhc29uKiBkcm9wUmVhc29uLCBuc2Vjc190KiBuZXh0V2FrZXVwVGltZSk7CiAgICAgYm9vbCBkaXNwYXRjaE1vdGlvbkxvY2tlZCgKICAgICAgICAgICAgIG5zZWNzX3QgY3VycmVudFRpbWUsIE1vdGlvbkVudHJ5KiBlbnRyeSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2lucHV0L0lucHV0UmVhZGVyLmNwcCBiL3NlcnZpY2VzL2lucHV0L0lucHV0UmVhZGVyLmNwcAppbmRleCAyNWEyYzc4Li5jNDJlM2FiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9pbnB1dC9JbnB1dFJlYWRlci5jcHAKKysrIGIvc2VydmljZXMvaW5wdXQvSW5wdXRSZWFkZXIuY3BwCkBAIC0zOCw2ICszOCw3IEBACiAKICNpbmNsdWRlICJJbnB1dFJlYWRlci5oIgogCisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDx1aS9LZXlib2FyZC5oPgogI2luY2x1ZGUgPHVpL1ZpcnR1YWxLZXlNYXAuaD4KQEAgLTYxLDY1ICs2Miw2IEBACiAvLyBNYXhpbXVtIG51bWJlciBvZiBzbG90cyBzdXBwb3J0ZWQgd2hlbiB1c2luZyB0aGUgc2xvdC1iYXNlZCBNdWx0aXRvdWNoIFByb3RvY29sIEIuCiBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9TTE9UUyA9IDMyOwogCi0vLyBRdWlldCB0aW1lIGJldHdlZW4gY2VydGFpbiBnZXN0dXJlIHRyYW5zaXRpb25zLgotLy8gVGltZSB0byBhbGxvdyBmb3IgYWxsIGZpbmdlcnMgb3IgYnV0dG9ucyB0byBzZXR0bGUgaW50byBhIHN0YWJsZSBzdGF0ZSBiZWZvcmUKLS8vIHN0YXJ0aW5nIGEgbmV3IGdlc3R1cmUuCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBRVUlFVF9JTlRFUlZBTCA9IDEwMCAqIDEwMDAwMDA7IC8vIDEwMCBtcwotCi0vLyBUaGUgbWluaW11bSBzcGVlZCB0aGF0IGEgcG9pbnRlciBtdXN0IHRyYXZlbCBmb3IgdXMgdG8gY29uc2lkZXIgc3dpdGNoaW5nIHRoZSBhY3RpdmUKLS8vIHRvdWNoIHBvaW50ZXIgdG8gaXQgZHVyaW5nIGEgZHJhZy4gIFRoaXMgdGhyZXNob2xkIGlzIHNldCB0byBhdm9pZCBzd2l0Y2hpbmcgZHVlCi0vLyB0byBub2lzZSBmcm9tIGEgZmluZ2VyIHJlc3Rpbmcgb24gdGhlIHRvdWNoIHBhZCAocGVyaGFwcyBqdXN0IHByZXNzaW5nIGl0IGRvd24pLgotc3RhdGljIGNvbnN0IGZsb2F0IERSQUdfTUlOX1NXSVRDSF9TUEVFRCA9IDUwLjBmOyAvLyBwaXhlbHMgcGVyIHNlY29uZAotCi0vLyBUYXAgZ2VzdHVyZSBkZWxheSB0aW1lLgotLy8gVGhlIHRpbWUgYmV0d2VlbiBkb3duIGFuZCB1cCBtdXN0IGJlIGxlc3MgdGhhbiB0aGlzIHRvIGJlIGNvbnNpZGVyZWQgYSB0YXAuCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBUQVBfSU5URVJWQUwgPSAxNTAgKiAxMDAwMDAwOyAvLyAxNTAgbXMKLQotLy8gVGFwIGRyYWcgZ2VzdHVyZSBkZWxheSB0aW1lLgotLy8gVGhlIHRpbWUgYmV0d2VlbiB1cCBhbmQgdGhlIG5leHQgdXAgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhpcyB0byBiZSBjb25zaWRlcmVkIGEKLS8vIGRyYWcuICBPdGhlcndpc2UsIHRoZSBwcmV2aW91cyB0YXAgaXMgZmluaXNoZWQgYW5kIGEgbmV3IHRhcCBiZWdpbnMuCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBUQVBfRFJBR19JTlRFUlZBTCA9IDE1MCAqIDEwMDAwMDA7IC8vIDE1MCBtcwotCi0vLyBUaGUgZGlzdGFuY2UgaW4gcGl4ZWxzIHRoYXQgdGhlIHBvaW50ZXIgaXMgYWxsb3dlZCB0byBtb3ZlIGZyb20gaW5pdGlhbCBkb3duCi0vLyB0byB1cCBhbmQgc3RpbGwgYmUgY2FsbGVkIGEgdGFwLgotc3RhdGljIGNvbnN0IGZsb2F0IFRBUF9TTE9QID0gMTAuMGY7IC8vIDEwIHBpeGVscwotCi0vLyBUaW1lIGFmdGVyIHRoZSBmaXJzdCB0b3VjaCBwb2ludHMgZ28gZG93biB0byBzZXR0bGUgb24gYW4gaW5pdGlhbCBjZW50cm9pZC4KLS8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgZW5vdWdoIHRpbWUgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIHRoZSB1c2VyIHB1dHMgZG93biB0d28KLS8vIGZpbmdlcnMgYXQgYWxtb3N0IGJ1dCBub3QgcXVpdGUgZXhhY3RseSB0aGUgc2FtZSB0aW1lLgotc3RhdGljIGNvbnN0IG5zZWNzX3QgTVVMVElUT1VDSF9TRVRUTEVfSU5URVJWQUwgPSAxMDAgKiAxMDAwMDAwOyAvLyAxMDBtcwotCi0vLyBUaGUgdHJhbnNpdGlvbiBmcm9tIFBSRVNTIHRvIFNXSVBFIG9yIEZSRUVGT1JNIGdlc3R1cmUgbW9kZSBpcyBtYWRlIHdoZW4KLS8vIGJvdGggb2YgdGhlIHBvaW50ZXJzIGFyZSBtb3ZpbmcgYXQgbGVhc3QgdGhpcyBmYXN0Lgotc3RhdGljIGNvbnN0IGZsb2F0IE1VTFRJVE9VQ0hfTUlOX1NQRUVEID0gMTUwLjBmOyAvLyBwaXhlbHMgcGVyIHNlY29uZAotCi0vLyBUaGUgdHJhbnNpdGlvbiBmcm9tIFBSRVNTIHRvIFNXSVBFIGdlc3R1cmUgbW9kZSBjYW4gb25seSBvY2N1ciB3aGVuIHRoZQotLy8gY29zaW5lIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSB0d28gdmVjdG9ycyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhhbiB0aGlzIHZhbHVlCi0vLyB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmVjdG9ycyBhcmUgb3JpZW50ZWQgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLgotLy8gV2hlbiB0aGUgdmVjdG9ycyBhcmUgb3JpZW50ZWQgaW4gdGhlIGV4YWN0bHkgc2FtZSBkaXJlY3Rpb24sIHRoZSBjb3NpbmUgaXMgMS4wLgotLy8gKEluIGV4YWN0bHkgb3Bwb3NpdGUgZGlyZWN0aW9ucywgdGhlIGNvc2luZSBpcyAtMS4wLikKLXN0YXRpYyBjb25zdCBmbG9hdCBTV0lQRV9UUkFOU0lUSU9OX0FOR0xFX0NPU0lORSA9IDAuNWY7IC8vIGNvc2luZSBvZiA0NSBkZWdyZWVzCi0KLS8vIFRoZSB0cmFuc2l0aW9uIGZyb20gUFJFU1MgdG8gU1dJUEUgZ2VzdHVyZSBtb2RlIGNhbiBvbmx5IG9jY3VyIHdoZW4gdGhlCi0vLyBmaW5nZXJzIGFyZSBubyBtb3JlIHRoYW4gdGhpcyBmYXIgYXBhcnQgcmVsYXRpdmUgdG8gdGhlIGRpYWdvbmFsIHNpemUgb2YKLS8vIHRoZSB0b3VjaCBwYWQuICBGb3IgZXhhbXBsZSwgYSByYXRpbyBvZiAwLjUgbWVhbnMgdGhhdCB0aGUgZmluZ2VycyBtdXN0IGJlCi0vLyBubyBtb3JlIHRoYW4gaGFsZiB0aGUgZGlhZ29uYWwgc2l6ZSBvZiB0aGUgdG91Y2ggcGFkIGFwYXJ0Lgotc3RhdGljIGNvbnN0IGZsb2F0IFNXSVBFX01BWF9XSURUSF9SQVRJTyA9IDAuMzMzZjsgLy8gMS8zCi0KLS8vIFRoZSBnZXN0dXJlIG1vdmVtZW50IHNwZWVkIGZhY3RvciByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgZGlzcGxheS4KLS8vIE1vdmVtZW50IHNwZWVkIGFwcGxpZXMgd2hlbiB0aGUgZmluZ2VycyBhcmUgbW92aW5nIGluIHRoZSBzYW1lIGRpcmVjdGlvbi4KLS8vIFdpdGhvdXQgYWNjZWxlcmF0aW9uLCBhIGZ1bGwgc3dpcGUgb2YgdGhlIHRvdWNoIHBhZCBkaWFnb25hbCBpbiBtb3ZlbWVudCBtb2RlCi0vLyB3aWxsIGNvdmVyIHRoaXMgcG9ydGlvbiBvZiB0aGUgZGlzcGxheSBkaWFnb25hbC4KLXN0YXRpYyBjb25zdCBmbG9hdCBHRVNUVVJFX01PVkVNRU5UX1NQRUVEX1JBVElPID0gMC44ZjsKLQotLy8gVGhlIGdlc3R1cmUgem9vbSBzcGVlZCBmYWN0b3IgcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIGRpc3BsYXkuCi0vLyBab29tIHNwZWVkIGFwcGxpZXMgd2hlbiB0aGUgZmluZ2VycyBhcmUgbW9zdGx5IG1vdmluZyByZWxhdGl2ZSB0byBlYWNoIG90aGVyCi0vLyB0byBleGVjdXRlIGEgc2NhbGUgZ2VzdHVyZSBvciBzaW1pbGFyLgotLy8gV2l0aG91dCBhY2NlbGVyYXRpb24sIGEgZnVsbCBzd2lwZSBvZiB0aGUgdG91Y2ggcGFkIGRpYWdvbmFsIGluIHpvb20gbW9kZQotLy8gd2lsbCBjb3ZlciB0aGlzIHBvcnRpb24gb2YgdGhlIGRpc3BsYXkgZGlhZ29uYWwuCi1zdGF0aWMgY29uc3QgZmxvYXQgR0VTVFVSRV9aT09NX1NQRUVEX1JBVElPID0gMC4zZjsKLQotCiAvLyAtLS0gU3RhdGljIEZ1bmN0aW9ucyAtLS0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KQEAgLTMxOSw4ICsyNjEsOSBAQAogICAgICAgICBjb25zdCBzcDxJbnB1dFJlYWRlclBvbGljeUludGVyZmFjZT4mIHBvbGljeSwKICAgICAgICAgY29uc3Qgc3A8SW5wdXREaXNwYXRjaGVySW50ZXJmYWNlPiYgZGlzcGF0Y2hlcikgOgogICAgICAgICBtRXZlbnRIdWIoZXZlbnRIdWIpLCBtUG9saWN5KHBvbGljeSksIG1EaXNwYXRjaGVyKGRpc3BhdGNoZXIpLAotICAgICAgICBtR2xvYmFsTWV0YVN0YXRlKDApLCBtRGlzYWJsZVZpcnR1YWxLZXlzVGltZW91dChMTE9OR19NSU4pLCBtTmV4dFRpbWVvdXQoTExPTkdfTUFYKSB7Ci0gICAgY29uZmlndXJlRXhjbHVkZWREZXZpY2VzKCk7CisgICAgICAgIG1HbG9iYWxNZXRhU3RhdGUoMCksIG1EaXNhYmxlVmlydHVhbEtleXNUaW1lb3V0KExMT05HX01JTiksIG1OZXh0VGltZW91dChMTE9OR19NQVgpLAorICAgICAgICBtUmVmcmVzaENvbmZpZ3VyYXRpb24oMCkgeworICAgIGNvbmZpZ3VyZSh0cnVlIC8qZmlyc3RUaW1lKi8pOwogICAgIHVwZGF0ZUdsb2JhbE1ldGFTdGF0ZSgpOwogICAgIHVwZGF0ZUlucHV0Q29uZmlndXJhdGlvbigpOwogfQpAQCAtMzMyLDYgKzI3NSwxMSBAQAogfQogCiB2b2lkIElucHV0UmVhZGVyOjpsb29wT25jZSgpIHsKKyAgICBpZiAoYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtUmVmcmVzaENvbmZpZ3VyYXRpb24pKSB7CisgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoMCwgJm1SZWZyZXNoQ29uZmlndXJhdGlvbik7CisgICAgICAgIGNvbmZpZ3VyZShmYWxzZSAvKmZpcnN0VGltZSovKTsKKyAgICB9CisKICAgICBpbnQzMl90IHRpbWVvdXRNaWxsaXMgPSAtMTsKICAgICBpZiAobU5leHRUaW1lb3V0ICE9IExMT05HX01BWCkgewogICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKQEAgLTU1MiwxMiArNTAwLDEyIEBACiAgICAgbURpc3BhdGNoZXItPm5vdGlmeUNvbmZpZ3VyYXRpb25DaGFuZ2VkKHdoZW4pOwogfQogCi12b2lkIElucHV0UmVhZGVyOjpjb25maWd1cmVFeGNsdWRlZERldmljZXMoKSB7Ci0gICAgVmVjdG9yPFN0cmluZzg+IGV4Y2x1ZGVkRGV2aWNlTmFtZXM7Ci0gICAgbVBvbGljeS0+Z2V0RXhjbHVkZWREZXZpY2VOYW1lcyhleGNsdWRlZERldmljZU5hbWVzKTsKK3ZvaWQgSW5wdXRSZWFkZXI6OmNvbmZpZ3VyZShib29sIGZpcnN0VGltZSkgeworICAgIG1Qb2xpY3ktPmdldFJlYWRlckNvbmZpZ3VyYXRpb24oJm1Db25maWcpOworICAgIG1FdmVudEh1Yi0+c2V0RXhjbHVkZWREZXZpY2VzKG1Db25maWcuZXhjbHVkZWREZXZpY2VOYW1lcyk7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4Y2x1ZGVkRGV2aWNlTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUV2ZW50SHViLT5hZGRFeGNsdWRlZERldmljZShleGNsdWRlZERldmljZU5hbWVzW2ldKTsKKyAgICBpZiAoIWZpcnN0VGltZSkgeworICAgICAgICBtRXZlbnRIdWItPnJlb3BlbkRldmljZXMoKTsKICAgICB9CiB9CiAKQEAgLTc3OCw2ICs3MjYsMTAgQEAKICAgICB9IC8vIHJlbGVhc2UgZGV2aWNlIHJlZ2lzdHkgcmVhZGVyIGxvY2sKIH0KIAordm9pZCBJbnB1dFJlYWRlcjo6cmVmcmVzaENvbmZpZ3VyYXRpb24oKSB7CisgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSgxLCAmbVJlZnJlc2hDb25maWd1cmF0aW9uKTsKK30KKwogdm9pZCBJbnB1dFJlYWRlcjo6ZHVtcChTdHJpbmc4JiBkdW1wKSB7CiAgICAgbUV2ZW50SHViLT5kdW1wKGR1bXApOwogICAgIGR1bXAuYXBwZW5kKCJcbiIpOwpAQCAtNzkxLDYgKzc0Myw2MCBAQAogICAgICAgICAgICAgbURldmljZXMudmFsdWVBdChpKS0+ZHVtcChkdW1wKTsKICAgICAgICAgfQogICAgIH0gLy8gcmVsZWFzZSBkZXZpY2UgcmVnaXN0eSByZWFkZXIgbG9jaworCisgICAgZHVtcC5hcHBlbmQoSU5ERU5UICJDb25maWd1cmF0aW9uOlxuIik7CisgICAgZHVtcC5hcHBlbmQoSU5ERU5UMiAiRXhjbHVkZWREZXZpY2VOYW1lczogWyIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbmZpZy5leGNsdWRlZERldmljZU5hbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgIGR1bXAuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIGR1bXAuYXBwZW5kKG1Db25maWcuZXhjbHVkZWREZXZpY2VOYW1lcy5pdGVtQXQoaSkuc3RyaW5nKCkpOworICAgIH0KKyAgICBkdW1wLmFwcGVuZCgiXVxuIik7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMiAiRmlsdGVyVG91Y2hFdmVudHM6ICVzXG4iLAorICAgICAgICAgICAgdG9TdHJpbmcobUNvbmZpZy5maWx0ZXJUb3VjaEV2ZW50cykpOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDIgIkZpbHRlckp1bXB5VG91Y2hFdmVudHM6ICVzXG4iLAorICAgICAgICAgICAgdG9TdHJpbmcobUNvbmZpZy5maWx0ZXJKdW1weVRvdWNoRXZlbnRzKSk7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMiAiVmlydHVhbEtleVF1aWV0VGltZTogJTAuMWZtc1xuIiwKKyAgICAgICAgICAgIG1Db25maWcudmlydHVhbEtleVF1aWV0VGltZSAqIDAuMDAwMDAxZik7CisKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQyICJQb2ludGVyVmVsb2NpdHlDb250cm9sUGFyYW1ldGVyczogIgorICAgICAgICAgICAgInNjYWxlPSUwLjNmLCBsb3dUaHJlc2hvbGQ9JTAuM2YsIGhpZ2hUaHJlc2hvbGQ9JTAuM2YsIGFjY2VsZXJhdGlvbj0lMC4zZlxuIiwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlclZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMuc2NhbGUsCisgICAgICAgICAgICBtQ29uZmlnLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzLmxvd1RocmVzaG9sZCwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlclZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMuaGlnaFRocmVzaG9sZCwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlclZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMuYWNjZWxlcmF0aW9uKTsKKworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDIgIldoZWVsVmVsb2NpdHlDb250cm9sUGFyYW1ldGVyczogIgorICAgICAgICAgICAgInNjYWxlPSUwLjNmLCBsb3dUaHJlc2hvbGQ9JTAuM2YsIGhpZ2hUaHJlc2hvbGQ9JTAuM2YsIGFjY2VsZXJhdGlvbj0lMC4zZlxuIiwKKyAgICAgICAgICAgIG1Db25maWcud2hlZWxWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzLnNjYWxlLAorICAgICAgICAgICAgbUNvbmZpZy53aGVlbFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMubG93VGhyZXNob2xkLAorICAgICAgICAgICAgbUNvbmZpZy53aGVlbFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMuaGlnaFRocmVzaG9sZCwKKyAgICAgICAgICAgIG1Db25maWcud2hlZWxWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzLmFjY2VsZXJhdGlvbik7CisKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQyICJQb2ludGVyR2VzdHVyZTpcbiIpOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIlF1aWV0SW50ZXJ2YWw6ICUwLjFmbXNcbiIsCisgICAgICAgICAgICBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlUXVpZXRJbnRlcnZhbCAqIDAuMDAwMDAxZik7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiRHJhZ01pblN3aXRjaFNwZWVkOiAlMC4xZnB4L3NcbiIsCisgICAgICAgICAgICBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlRHJhZ01pblN3aXRjaFNwZWVkKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQzICJUYXBJbnRlcnZhbDogJTAuMWZtc1xuIiwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlckdlc3R1cmVUYXBJbnRlcnZhbCAqIDAuMDAwMDAxZik7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiVGFwRHJhZ0ludGVydmFsOiAlMC4xZm1zXG4iLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyR2VzdHVyZVRhcERyYWdJbnRlcnZhbCAqIDAuMDAwMDAxZik7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiVGFwU2xvcDogJTAuMWZweFxuIiwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlckdlc3R1cmVUYXBTbG9wKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQzICJNdWx0aXRvdWNoU2V0dGxlSW50ZXJ2YWw6ICUwLjFmbXNcbiIsCisgICAgICAgICAgICBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlTXVsdGl0b3VjaFNldHRsZUludGVydmFsICogMC4wMDAwMDFmKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQzICJNdWx0aXRvdWNoTWluU3BlZWQ6ICUwLjFmcHgvc1xuIiwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoTWluU3BlZWQpOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIlN3aXBlVHJhbnNpdGlvbkFuZ2xlQ29zaW5lOiAlMC4xZlxuIiwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlckdlc3R1cmVTd2lwZVRyYW5zaXRpb25BbmdsZUNvc2luZSk7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiU3dpcGVNYXhXaWR0aFJhdGlvOiAlMC4xZlxuIiwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlckdlc3R1cmVTd2lwZU1heFdpZHRoUmF0aW8pOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIk1vdmVtZW50U3BlZWRSYXRpbzogJTAuMWZcbiIsCisgICAgICAgICAgICBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlTW92ZW1lbnRTcGVlZFJhdGlvKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQzICJab29tU3BlZWRSYXRpbzogJTAuMWZcbiIsCisgICAgICAgICAgICBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlWm9vbVNwZWVkUmF0aW8pOwogfQogCiAKQEAgLTE0NTAsNiArMTQ1NiwxMCBAQAogCiAgICAgbUhhdmVWV2hlZWwgPSBnZXRFdmVudEh1YigpLT5oYXNSZWxhdGl2ZUF4aXMoZ2V0RGV2aWNlSWQoKSwgUkVMX1dIRUVMKTsKICAgICBtSGF2ZUhXaGVlbCA9IGdldEV2ZW50SHViKCktPmhhc1JlbGF0aXZlQXhpcyhnZXREZXZpY2VJZCgpLCBSRUxfSFdIRUVMKTsKKworICAgIG1Qb2ludGVyVmVsb2NpdHlDb250cm9sLnNldFBhcmFtZXRlcnMoZ2V0Q29uZmlnKCktPnBvaW50ZXJWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzKTsKKyAgICBtV2hlZWxYVmVsb2NpdHlDb250cm9sLnNldFBhcmFtZXRlcnMoZ2V0Q29uZmlnKCktPndoZWVsVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycyk7CisgICAgbVdoZWVsWVZlbG9jaXR5Q29udHJvbC5zZXRQYXJhbWV0ZXJzKGdldENvbmZpZygpLT53aGVlbFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMpOwogfQogCiB2b2lkIEN1cnNvcklucHV0TWFwcGVyOjpjb25maWd1cmVQYXJhbWV0ZXJzKCkgewpAQCAtMTUxMSw2ICsxNTIxLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gLy8gcmVsZWFzZSBsb2NrCiAKKyAgICAgICAgLy8gUmVzZXQgdmVsb2NpdHkuCisgICAgICAgIG1Qb2ludGVyVmVsb2NpdHlDb250cm9sLnJlc2V0KCk7CisgICAgICAgIG1XaGVlbFhWZWxvY2l0eUNvbnRyb2wucmVzZXQoKTsKKyAgICAgICAgbVdoZWVsWVZlbG9jaXR5Q29udHJvbC5yZXNldCgpOworCiAgICAgICAgIC8vIFN5bnRoZXNpemUgYnV0dG9uIHVwIGV2ZW50IG9uIHJlc2V0LgogICAgICAgICBuc2Vjc190IHdoZW4gPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CiAgICAgICAgIG1BY2N1bXVsYXRvci5jbGVhcigpOwpAQCAtMTY3NCwxMSArMTY4OSwxNiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdnNjcm9sbCA9IDA7CiAgICAgICAgIH0KKyAgICAgICAgbVdoZWVsWVZlbG9jaXR5Q29udHJvbC5tb3ZlKHdoZW4sIE5VTEwsICZ2c2Nyb2xsKTsKKwogICAgICAgICBpZiAobUhhdmVIV2hlZWwgJiYgKGZpZWxkcyAmIEFjY3VtdWxhdG9yOjpGSUVMRF9SRUxfSFdIRUVMKSkgewogICAgICAgICAgICAgaHNjcm9sbCA9IG1BY2N1bXVsYXRvci5yZWxIV2hlZWw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBoc2Nyb2xsID0gMDsKICAgICAgICAgfQorICAgICAgICBtV2hlZWxYVmVsb2NpdHlDb250cm9sLm1vdmUod2hlbiwgJmhzY3JvbGwsIE5VTEwpOworCisgICAgICAgIG1Qb2ludGVyVmVsb2NpdHlDb250cm9sLm1vdmUod2hlbiwgJmRlbHRhWCwgJmRlbHRhWSk7CiAKICAgICAgICAgaWYgKG1Qb2ludGVyQ29udHJvbGxlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDAgfHwgZGVsdGFZICE9IDAgfHwgdnNjcm9sbCAhPSAwIHx8IGhzY3JvbGwgIT0gMApAQCAtMTY5NCw3ICsxNzE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5zZXRCdXR0b25TdGF0ZShtTG9ja2VkLmJ1dHRvblN0YXRlKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPnVuZmFkZSgpOworICAgICAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+dW5mYWRlKFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpUUkFOU0lUSU9OX0lNTUVESUFURSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZsb2F0IHgsIHk7CkBAIC0xNzcyLDcgKzE3OTIsNyBAQAogICAgIHsgLy8gYWNxdWlyZSBsb2NrCiAgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CiAgICAgICAgIGlmIChtUG9pbnRlckNvbnRyb2xsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5mYWRlKCk7CisgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPmZhZGUoUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlRSQU5TSVRJT05fR1JBRFVBTCk7CiAgICAgICAgIH0KICAgICB9IC8vIHJlbGVhc2UgbG9jawogfQpAQCAtMTc4Miw2ICsxODAyLDggQEAKIAogVG91Y2hJbnB1dE1hcHBlcjo6VG91Y2hJbnB1dE1hcHBlcihJbnB1dERldmljZSogZGV2aWNlKSA6CiAgICAgICAgIElucHV0TWFwcGVyKGRldmljZSkgeworICAgIG1Db25maWcgPSBnZXRDb25maWcoKTsKKwogICAgIG1Mb2NrZWQuc3VyZmFjZU9yaWVudGF0aW9uID0gLTE7CiAgICAgbUxvY2tlZC5zdXJmYWNlV2lkdGggPSAtMTsKICAgICBtTG9ja2VkLnN1cmZhY2VIZWlnaHQgPSAtMTsKQEAgLTE5MTgsNiArMTk0MCw3IEBACiAgICAgbUxvY2tlZC5vcmllbnRlZFJhbmdlcy5oYXZlRGlzdGFuY2UgPSBmYWxzZTsKIAogICAgIG1Qb2ludGVyR2VzdHVyZS5yZXNldCgpOworICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLnNldFBhcmFtZXRlcnMobUNvbmZpZy0+cG9pbnRlclZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMpOwogfQogCiB2b2lkIFRvdWNoSW5wdXRNYXBwZXI6OmNvbmZpZ3VyZSgpIHsKQEAgLTE5NjAsMTQgKzE5ODMsMjcgQEAKIH0KIAogdm9pZCBUb3VjaElucHV0TWFwcGVyOjpjb25maWd1cmVQYXJhbWV0ZXJzKCkgewotICAgIG1QYXJhbWV0ZXJzLnVzZUJhZFRvdWNoRmlsdGVyID0gZ2V0UG9saWN5KCktPmZpbHRlclRvdWNoRXZlbnRzKCk7Ci0gICAgbVBhcmFtZXRlcnMudXNlQXZlcmFnaW5nVG91Y2hGaWx0ZXIgPSBnZXRQb2xpY3koKS0+ZmlsdGVyVG91Y2hFdmVudHMoKTsKLSAgICBtUGFyYW1ldGVycy51c2VKdW1weVRvdWNoRmlsdGVyID0gZ2V0UG9saWN5KCktPmZpbHRlckp1bXB5VG91Y2hFdmVudHMoKTsKLSAgICBtUGFyYW1ldGVycy52aXJ0dWFsS2V5UXVpZXRUaW1lID0gZ2V0UG9saWN5KCktPmdldFZpcnR1YWxLZXlRdWlldFRpbWUoKTsKKyAgICBtUGFyYW1ldGVycy51c2VCYWRUb3VjaEZpbHRlciA9IG1Db25maWctPmZpbHRlclRvdWNoRXZlbnRzOworICAgIG1QYXJhbWV0ZXJzLnVzZUF2ZXJhZ2luZ1RvdWNoRmlsdGVyID0gbUNvbmZpZy0+ZmlsdGVyVG91Y2hFdmVudHM7CisgICAgbVBhcmFtZXRlcnMudXNlSnVtcHlUb3VjaEZpbHRlciA9IG1Db25maWctPmZpbHRlckp1bXB5VG91Y2hFdmVudHM7CiAKLSAgICAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlLgotICAgIC8vbVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPSBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfUE9JTlRFUjsKLSAgICBtUGFyYW1ldGVycy5nZXN0dXJlTW9kZSA9IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUzsKKyAgICAvLyBVc2UgdGhlIHBvaW50ZXIgcHJlc2VudGF0aW9uIG1vZGUgZm9yIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBkaXN0aW5jdAorICAgIC8vIG11bHRpdG91Y2guICBUaGUgc3BvdC1iYXNlZCBwcmVzZW50YXRpb24gcmVsaWVzIG9uIGJlaW5nIGFibGUgdG8gYWNjdXJhdGVseQorICAgIC8vIGxvY2F0ZSB0d28gb3IgbW9yZSBmaW5nZXJzIG9uIHRoZSB0b3VjaCBwYWQuCisgICAgbVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPSBnZXRFdmVudEh1YigpLT5oYXNJbnB1dFByb3BlcnR5KGdldERldmljZUlkKCksIElOUFVUX1BST1BfU0VNSV9NVCkKKyAgICAgICAgICAgID8gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1BPSU5URVIgOiBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfU1BPVFM7CisKKyAgICBTdHJpbmc4IGdlc3R1cmVNb2RlU3RyaW5nOworICAgIGlmIChnZXREZXZpY2UoKS0+Z2V0Q29uZmlndXJhdGlvbigpLnRyeUdldFByb3BlcnR5KFN0cmluZzgoInRvdWNoLmdlc3R1cmVNb2RlIiksCisgICAgICAgICAgICBnZXN0dXJlTW9kZVN0cmluZykpIHsKKyAgICAgICAgaWYgKGdlc3R1cmVNb2RlU3RyaW5nID09ICJwb2ludGVyIikgeworICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPSBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfUE9JTlRFUjsKKyAgICAgICAgfSBlbHNlIGlmIChnZXN0dXJlTW9kZVN0cmluZyA9PSAic3BvdHMiKSB7CisgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXN0dXJlTW9kZSA9IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUzsKKyAgICAgICAgfSBlbHNlIGlmIChnZXN0dXJlTW9kZVN0cmluZyAhPSAiZGVmYXVsdCIpIHsKKyAgICAgICAgICAgIExPR1coIkludmFsaWQgdmFsdWUgZm9yIHRvdWNoLmdlc3R1cmVNb2RlOiAnJXMnIiwgZ2VzdHVyZU1vZGVTdHJpbmcuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKGdldEV2ZW50SHViKCktPmhhc1JlbGF0aXZlQXhpcyhnZXREZXZpY2VJZCgpLCBSRUxfWCkKICAgICAgICAgICAgIHx8IGdldEV2ZW50SHViKCktPmhhc1JlbGF0aXZlQXhpcyhnZXREZXZpY2VJZCgpLCBSRUxfWSkpIHsKQEAgLTE5OTQsNyArMjAzMCw3IEBACiAgICAgICAgICAgICBtUGFyYW1ldGVycy5kZXZpY2VUeXBlID0gUGFyYW1ldGVyczo6REVWSUNFX1RZUEVfVE9VQ0hfUEFEOwogICAgICAgICB9IGVsc2UgaWYgKGRldmljZVR5cGVTdHJpbmcgPT0gInBvaW50ZXIiKSB7CiAgICAgICAgICAgICBtUGFyYW1ldGVycy5kZXZpY2VUeXBlID0gUGFyYW1ldGVyczo6REVWSUNFX1RZUEVfUE9JTlRFUjsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VUeXBlU3RyaW5nICE9ICJkZWZhdWx0IikgewogICAgICAgICAgICAgTE9HVygiSW52YWxpZCB2YWx1ZSBmb3IgdG91Y2guZGV2aWNlVHlwZTogJyVzJyIsIGRldmljZVR5cGVTdHJpbmcuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjAxMiw2ICsyMDQ4LDE3IEBACiB2b2lkIFRvdWNoSW5wdXRNYXBwZXI6OmR1bXBQYXJhbWV0ZXJzKFN0cmluZzgmIGR1bXApIHsKICAgICBkdW1wLmFwcGVuZChJTkRFTlQzICJQYXJhbWV0ZXJzOlxuIik7CiAKKyAgICBzd2l0Y2ggKG1QYXJhbWV0ZXJzLmdlc3R1cmVNb2RlKSB7CisgICAgY2FzZSBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfUE9JTlRFUjoKKyAgICAgICAgZHVtcC5hcHBlbmQoSU5ERU5UNCAiR2VzdHVyZU1vZGU6IHBvaW50ZXJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUzoKKyAgICAgICAgZHVtcC5hcHBlbmQoSU5ERU5UNCAiR2VzdHVyZU1vZGU6IHNwb3RzXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICB9CisKICAgICBzd2l0Y2ggKG1QYXJhbWV0ZXJzLmRldmljZVR5cGUpIHsKICAgICBjYXNlIFBhcmFtZXRlcnM6OkRFVklDRV9UWVBFX1RPVUNIX1NDUkVFTjoKICAgICAgICAgZHVtcC5hcHBlbmQoSU5ERU5UNCAiRGV2aWNlVHlwZTogdG91Y2hTY3JlZW5cbiIpOwpAQCAtMjM2NSwyNiArMjQxMiwyNiBAQAogICAgICAgICAgICAgICAgICAgICBtTG9ja2VkLmFzc29jaWF0ZWREaXNwbGF5SGVpZ2h0KTsKIAogICAgICAgICAgICAgLy8gU2NhbGUgbW92ZW1lbnRzIHN1Y2ggdGhhdCBvbmUgd2hvbGUgc3dpcGUgb2YgdGhlIHRvdWNoIHBhZCBjb3ZlcnMgYQotICAgICAgICAgICAgLy8gZ2l2ZW4gYXJlYSByZWxhdGl2ZSB0byB0aGUgZGlhZ29uYWwgc2l6ZSBvZiB0aGUgZGlzcGxheS4KKyAgICAgICAgICAgIC8vIGdpdmVuIGFyZWEgcmVsYXRpdmUgdG8gdGhlIGRpYWdvbmFsIHNpemUgb2YgdGhlIGRpc3BsYXkgd2hlbiBubyBhY2NlbGVyYXRpb24KKyAgICAgICAgICAgIC8vIGlzIGFwcGxpZWQuCiAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCB0aGUgdG91Y2ggcGFkIGhhcyBhIHNxdWFyZSBhc3BlY3QgcmF0aW8gc3VjaCB0aGF0IG1vdmVtZW50cyBpbgogICAgICAgICAgICAgLy8gWCBhbmQgWSBvZiB0aGUgc2FtZSBudW1iZXIgb2YgcmF3IHVuaXRzIGNvdmVyIHRoZSBzYW1lIHBoeXNpY2FsIGRpc3RhbmNlLgotICAgICAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVGYWN0b3IgPSAwLjhmOwotCi0gICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWE1vdmVtZW50U2NhbGUgPSBHRVNUVVJFX01PVkVNRU5UX1NQRUVEX1JBVElPCisgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWE1vdmVtZW50U2NhbGUgPSBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZU1vdmVtZW50U3BlZWRSYXRpbwogICAgICAgICAgICAgICAgICAgICAqIGRpc3BsYXlEaWFnb25hbCAvIHJhd0RpYWdvbmFsOwogICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyR2VzdHVyZVlNb3ZlbWVudFNjYWxlID0gbUxvY2tlZC5wb2ludGVyR2VzdHVyZVhNb3ZlbWVudFNjYWxlOwogCiAgICAgICAgICAgICAvLyBTY2FsZSB6b29tcyB0byBjb3ZlciBhIHNtYWxsZXIgcmFuZ2Ugb2YgdGhlIGRpc3BsYXkgdGhhbiBtb3ZlbWVudHMgZG8uCiAgICAgICAgICAgICAvLyBUaGlzIHZhbHVlIGRldGVybWluZXMgdGhlIGFyZWEgYXJvdW5kIHRoZSBwb2ludGVyIHRoYXQgaXMgYWZmZWN0ZWQgYnkgZnJlZWZvcm0KICAgICAgICAgICAgIC8vIHBvaW50ZXIgZ2VzdHVyZXMuCi0gICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWFpvb21TY2FsZSA9IEdFU1RVUkVfWk9PTV9TUEVFRF9SQVRJTworICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyR2VzdHVyZVhab29tU2NhbGUgPSBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZVpvb21TcGVlZFJhdGlvCiAgICAgICAgICAgICAgICAgICAgICogZGlzcGxheURpYWdvbmFsIC8gcmF3RGlhZ29uYWw7CiAgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWVpvb21TY2FsZSA9IG1Mb2NrZWQucG9pbnRlckdlc3R1cmVYWm9vbVNjYWxlOwogCiAgICAgICAgICAgICAvLyBNYXggd2lkdGggYmV0d2VlbiBwb2ludGVycyB0byBkZXRlY3QgYSBzd2lwZSBnZXN0dXJlIGlzIG1vcmUgdGhhbiBzb21lIGZyYWN0aW9uCiAgICAgICAgICAgICAvLyBvZiB0aGUgZGlhZ29uYWwgYXhpcyBvZiB0aGUgdG91Y2ggcGFkLiAgVG91Y2hlcyB0aGF0IGFyZSB3aWRlciB0aGFuIHRoaXMgYXJlCiAgICAgICAgICAgICAvLyB0cmFuc2xhdGVkIGludG8gZnJlZWZvcm0gZ2VzdHVyZXMuCi0gICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlTWF4U3dpcGVXaWR0aCA9IFNXSVBFX01BWF9XSURUSF9SQVRJTyAqIHJhd0RpYWdvbmFsOworICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyR2VzdHVyZU1heFN3aXBlV2lkdGggPQorICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZVN3aXBlTWF4V2lkdGhSYXRpbyAqIHJhd0RpYWdvbmFsOwogCiAgICAgICAgICAgICAvLyBSZXNldCB0aGUgY3VycmVudCBwb2ludGVyIGdlc3R1cmUuCiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVzZXQoKTsKQEAgLTMxMDcsOCArMzE1NCw4IEBACiAgICAgLy8gICAgYXJlYSBhbmQgYWNjaWRlbnRhbGx5IHRyaWdnZXJzIGEgdmlydHVhbCBrZXkuICBUaGlzIG9mdGVuIGhhcHBlbnMgd2hlbiB2aXJ0dWFsIGtleXMKICAgICAvLyAgICBhcmUgbGF5ZWQgb3V0IGJlbG93IHRoZSBzY3JlZW4gbmVhciB0byB3aGVyZSB0aGUgb24gc2NyZWVuIGtleWJvYXJkJ3Mgc3BhY2UgYmFyCiAgICAgLy8gICAgaXMgZGlzcGxheWVkLgotICAgIGlmIChtUGFyYW1ldGVycy52aXJ0dWFsS2V5UXVpZXRUaW1lID4gMCAmJiBtQ3VycmVudFRvdWNoLnBvaW50ZXJDb3VudCAhPSAwKSB7Ci0gICAgICAgIG1Db250ZXh0LT5kaXNhYmxlVmlydHVhbEtleXNVbnRpbCh3aGVuICsgbVBhcmFtZXRlcnMudmlydHVhbEtleVF1aWV0VGltZSk7CisgICAgaWYgKG1Db25maWctPnZpcnR1YWxLZXlRdWlldFRpbWUgPiAwICYmIG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50ICE9IDApIHsKKyAgICAgICAgbUNvbnRleHQtPmRpc2FibGVWaXJ0dWFsS2V5c1VudGlsKHdoZW4gKyBtQ29uZmlnLT52aXJ0dWFsS2V5UXVpZXRUaW1lKTsKICAgICB9CiB9CiAKQEAgLTM0NTEsMTIgKzM0OTgsNiBAQAogCiB2b2lkIFRvdWNoSW5wdXRNYXBwZXI6OmRpc3BhdGNoUG9pbnRlckdlc3R1cmVzKG5zZWNzX3Qgd2hlbiwgdWludDMyX3QgcG9saWN5RmxhZ3MsCiAgICAgICAgIGJvb2wgaXNUaW1lb3V0KSB7Ci0gICAgLy8gU3dpdGNoIHBvaW50ZXIgcHJlc2VudGF0aW9uLgotICAgIG1Qb2ludGVyQ29udHJvbGxlci0+c2V0UHJlc2VudGF0aW9uKAotICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTCi0gICAgICAgICAgICAgICAgICAgID8gUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlBSRVNFTlRBVElPTl9TUE9UCi0gICAgICAgICAgICAgICAgICAgIDogUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlBSRVNFTlRBVElPTl9QT0lOVEVSKTsKLQogICAgIC8vIFVwZGF0ZSBjdXJyZW50IGdlc3R1cmUgY29vcmRpbmF0ZXMuCiAgICAgYm9vbCBjYW5jZWxQcmV2aW91c0dlc3R1cmUsIGZpbmlzaFByZXZpb3VzR2VzdHVyZTsKICAgICBib29sIHNlbmRFdmVudHMgPSBwcmVwYXJlUG9pbnRlckdlc3R1cmVzKHdoZW4sCkBAIC0zNDY0LDExICszNTA1LDQ2IEBACiAgICAgaWYgKCFzZW5kRXZlbnRzKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgaWYgKGZpbmlzaFByZXZpb3VzR2VzdHVyZSkgeworICAgICAgICBjYW5jZWxQcmV2aW91c0dlc3R1cmUgPSBmYWxzZTsKKyAgICB9CiAKLSAgICAvLyBTaG93IHRoZSBwb2ludGVyIGlmIG5lZWRlZC4KLSAgICBpZiAobVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSAhPSBQb2ludGVyR2VzdHVyZTo6TkVVVFJBTAotICAgICAgICAgICAgJiYgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSAhPSBQb2ludGVyR2VzdHVyZTo6UVVJRVQpIHsKLSAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT51bmZhZGUoKTsKKyAgICAvLyBTd2l0Y2ggcG9pbnRlciBwcmVzZW50YXRpb24uCisgICAgbVBvaW50ZXJDb250cm9sbGVyLT5zZXRQcmVzZW50YXRpb24oCisgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXN0dXJlTW9kZSA9PSBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfU1BPVFMKKyAgICAgICAgICAgICAgICAgICAgPyBQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6UFJFU0VOVEFUSU9OX1NQT1QKKyAgICAgICAgICAgICAgICAgICAgOiBQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6UFJFU0VOVEFUSU9OX1BPSU5URVIpOworCisgICAgLy8gU2hvdyBvciBoaWRlIHRoZSBwb2ludGVyIGlmIG5lZWRlZC4KKyAgICBzd2l0Y2ggKG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUpIHsKKyAgICBjYXNlIFBvaW50ZXJHZXN0dXJlOjpORVVUUkFMOgorICAgIGNhc2UgUG9pbnRlckdlc3R1cmU6OlFVSUVUOgorICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTCisgICAgICAgICAgICAgICAgJiYgKG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGUgPT0gUG9pbnRlckdlc3R1cmU6OlNXSVBFCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlID09IFBvaW50ZXJHZXN0dXJlOjpGUkVFRk9STSkpIHsKKyAgICAgICAgICAgIC8vIFJlbWluZCB0aGUgdXNlciBvZiB3aGVyZSB0aGUgcG9pbnRlciBpcyBhZnRlciBmaW5pc2hpbmcgYSBnZXN0dXJlIHdpdGggc3BvdHMuCisgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPnVuZmFkZShQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6VFJBTlNJVElPTl9HUkFEVUFMKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFBvaW50ZXJHZXN0dXJlOjpUQVA6CisgICAgY2FzZSBQb2ludGVyR2VzdHVyZTo6VEFQX0RSQUc6CisgICAgY2FzZSBQb2ludGVyR2VzdHVyZTo6QlVUVE9OX0NMSUNLX09SX0RSQUc6CisgICAgY2FzZSBQb2ludGVyR2VzdHVyZTo6SE9WRVI6CisgICAgY2FzZSBQb2ludGVyR2VzdHVyZTo6UFJFU1M6CisgICAgICAgIC8vIFVuZmFkZSB0aGUgcG9pbnRlciB3aGVuIHRoZSBjdXJyZW50IGdlc3R1cmUgbWFuaXB1bGF0ZXMgdGhlCisgICAgICAgIC8vIGFyZWEgZGlyZWN0bHkgdW5kZXIgdGhlIHBvaW50ZXIuCisgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+dW5mYWRlKFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpUUkFOU0lUSU9OX0lNTUVESUFURSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUG9pbnRlckdlc3R1cmU6OlNXSVBFOgorICAgIGNhc2UgUG9pbnRlckdlc3R1cmU6OkZSRUVGT1JNOgorICAgICAgICAvLyBGYWRlIHRoZSBwb2ludGVyIHdoZW4gdGhlIGN1cnJlbnQgZ2VzdHVyZSBtYW5pcHVsYXRlcyBhIGRpZmZlcmVudAorICAgICAgICAvLyBhcmVhIGFuZCB0aGVyZSBhcmUgc3BvdHMgdG8gZ3VpZGUgdGhlIHVzZXIgZXhwZXJpZW5jZS4KKyAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmdlc3R1cmVNb2RlID09IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUykgeworICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5mYWRlKFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpUUkFOU0lUSU9OX0dSQURVQUwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT51bmZhZGUoUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlRSQU5TSVRJT05fSU1NRURJQVRFKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvLyBTZW5kIGV2ZW50cyEKQEAgLTM2MjAsOSArMzY5NiwxMCBAQAogI2VuZGlmCiAKICAgICAgICAgaWYgKG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGUgPT0gUG9pbnRlckdlc3R1cmU6OlRBUCkgewotICAgICAgICAgICAgaWYgKHdoZW4gPD0gbVBvaW50ZXJHZXN0dXJlLnRhcFVwVGltZSArIFRBUF9EUkFHX0lOVEVSVkFMKSB7CisgICAgICAgICAgICBpZiAod2hlbiA8PSBtUG9pbnRlckdlc3R1cmUudGFwVXBUaW1lICsgbUNvbmZpZy0+cG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgdGFwL2RyYWcgdGltZW91dCBoYXMgbm90IHlldCBleHBpcmVkLgotICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS0+cmVxdWVzdFRpbWVvdXRBdFRpbWUobVBvaW50ZXJHZXN0dXJlLnRhcFVwVGltZSArIFRBUF9EUkFHX0lOVEVSVkFMKTsKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCktPnJlcXVlc3RUaW1lb3V0QXRUaW1lKG1Qb2ludGVyR2VzdHVyZS50YXBVcFRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbmZpZy0+cG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgdGFwIGlzIGZpbmlzaGVkLgogI2lmIERFQlVHX0dFU1RVUkVTCkBAIC0zNjM0LDYgKzM3MTEsOCBAQAogICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgPSBQb2ludGVyR2VzdHVyZTo6TkVVVFJBTDsKICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVJZEJpdHMuY2xlYXIoKTsKIAorICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLnJlc2V0KCk7CisKICAgICAgICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90R2VzdHVyZSA9IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpTUE9UX0dFU1RVUkVfTkVVVFJBTDsKICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RJZEJpdHMuY2xlYXIoKTsKQEAgLTM2OTEsNyArMzc3MCw3IEBACiAgICAgaWYgKGFjdGl2ZVRvdWNoSWQgPCAwKSB7CiAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZXNldFF1aWV0VGltZSgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzUXVpZXRUaW1lID0gd2hlbiA8IG1Qb2ludGVyR2VzdHVyZS5xdWlldFRpbWUgKyBRVUlFVF9JTlRFUlZBTDsKKyAgICAgICAgaXNRdWlldFRpbWUgPSB3aGVuIDwgbVBvaW50ZXJHZXN0dXJlLnF1aWV0VGltZSArIG1Db25maWctPnBvaW50ZXJHZXN0dXJlUXVpZXRJbnRlcnZhbDsKICAgICAgICAgaWYgKCFpc1F1aWV0VGltZSkgewogICAgICAgICAgICAgaWYgKChtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlID09IFBvaW50ZXJHZXN0dXJlOjpQUkVTUwogICAgICAgICAgICAgICAgICAgICB8fCBtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlID09IFBvaW50ZXJHZXN0dXJlOjpTV0lQRQpAQCAtMzcyOCw2ICszODA3LDggQEAKICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpRVUlFVDsKICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlSWRCaXRzLmNsZWFyKCk7CiAKKyAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2wucmVzZXQoKTsKKwogICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7CiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdEdlc3R1cmUgPSBQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6U1BPVF9HRVNUVVJFX05FVVRSQUw7CiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdElkQml0cy5jbGVhcigpOwpAQCAtMzc1OSw0NiArMzg0MCw0OCBAQAogCiAgICAgICAgIC8vIFN3aXRjaCBwb2ludGVycyBpZiBuZWVkZWQuCiAgICAgICAgIC8vIEZpbmQgdGhlIGZhc3Rlc3QgcG9pbnRlciBhbmQgZm9sbG93IGl0LgotICAgICAgICBpZiAoYWN0aXZlVG91Y2hJZCA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBiZXN0SWQgPSAtMTsKLSAgICAgICAgICAgICAgICBmbG9hdCBiZXN0U3BlZWQgPSBEUkFHX01JTl9TV0lUQ0hfU1BFRUQ7Ci0gICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSBtQ3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLmlkOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCB2eCwgdnk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUG9pbnRlckdlc3R1cmUudmVsb2NpdHlUcmFja2VyLmdldFZlbG9jaXR5KGlkLCAmdngsICZ2eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gaHlwb3RmKHZ4LCB2eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWQgPiBiZXN0U3BlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0SWQgPSBpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0U3BlZWQgPSBzcGVlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2ZVRvdWNoSWQgPj0gMCAmJiBtQ3VycmVudFRvdWNoLnBvaW50ZXJDb3VudCA+IDEpIHsKKyAgICAgICAgICAgIGludDMyX3QgYmVzdElkID0gLTE7CisgICAgICAgICAgICBmbG9hdCBiZXN0U3BlZWQgPSBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZURyYWdNaW5Td2l0Y2hTcGVlZDsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ3VycmVudFRvdWNoLnBvaW50ZXJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSBtQ3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLmlkOworICAgICAgICAgICAgICAgIGZsb2F0IHZ4LCB2eTsKKyAgICAgICAgICAgICAgICBpZiAobVBvaW50ZXJHZXN0dXJlLnZlbG9jaXR5VHJhY2tlci5nZXRWZWxvY2l0eShpZCwgJnZ4LCAmdnkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gaHlwb3RmKHZ4LCB2eSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGVlZCA+IGJlc3RTcGVlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdElkID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0U3BlZWQgPSBzcGVlZDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYmVzdElkID49IDAgJiYgYmVzdElkICE9IGFjdGl2ZVRvdWNoSWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmFjdGl2ZVRvdWNoSWQgPSBhY3RpdmVUb3VjaElkID0gYmVzdElkOwotICAgICAgICAgICAgICAgICAgICBhY3RpdmVUb3VjaENoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJlc3RJZCA+PSAwICYmIGJlc3RJZCAhPSBhY3RpdmVUb3VjaElkKSB7CisgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmFjdGl2ZVRvdWNoSWQgPSBhY3RpdmVUb3VjaElkID0gYmVzdElkOworICAgICAgICAgICAgICAgIGFjdGl2ZVRvdWNoQ2hhbmdlZCA9IHRydWU7CiAjaWYgREVCVUdfR0VTVFVSRVMKLSAgICAgICAgICAgICAgICAgICAgTE9HRCgiR2VzdHVyZXM6IEJVVFRPTl9DTElDS19PUl9EUkFHIHN3aXRjaGVkIHBvaW50ZXJzLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlc3RJZD0lZCwgYmVzdFNwZWVkPSUwLjNmIiwgYmVzdElkLCBiZXN0U3BlZWQpOworICAgICAgICAgICAgICAgIExPR0QoIkdlc3R1cmVzOiBCVVRUT05fQ0xJQ0tfT1JfRFJBRyBzd2l0Y2hlZCBwb2ludGVycywgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJlc3RJZD0lZCwgYmVzdFNwZWVkPSUwLjNmIiwgYmVzdElkLCBiZXN0U3BlZWQpOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtTGFzdFRvdWNoLmlkQml0cy5oYXNCaXQoYWN0aXZlVG91Y2hJZCkpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyRGF0YSYgY3VycmVudFBvaW50ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUb3VjaC5wb2ludGVyc1ttQ3VycmVudFRvdWNoLmlkVG9JbmRleFthY3RpdmVUb3VjaElkXV07Ci0gICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlckRhdGEmIGxhc3RQb2ludGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2gucG9pbnRlcnNbbUxhc3RUb3VjaC5pZFRvSW5kZXhbYWN0aXZlVG91Y2hJZF1dOwotICAgICAgICAgICAgICAgIGZsb2F0IGRlbHRhWCA9IChjdXJyZW50UG9pbnRlci54IC0gbGFzdFBvaW50ZXIueCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogbUxvY2tlZC5wb2ludGVyR2VzdHVyZVhNb3ZlbWVudFNjYWxlOwotICAgICAgICAgICAgICAgIGZsb2F0IGRlbHRhWSA9IChjdXJyZW50UG9pbnRlci55IC0gbGFzdFBvaW50ZXIueSkKLSAgICAgICAgICAgICAgICAgICAgICAgICogbUxvY2tlZC5wb2ludGVyR2VzdHVyZVlNb3ZlbWVudFNjYWxlOworICAgICAgICBpZiAoYWN0aXZlVG91Y2hJZCA+PSAwICYmIG1MYXN0VG91Y2guaWRCaXRzLmhhc0JpdChhY3RpdmVUb3VjaElkKSkgeworICAgICAgICAgICAgY29uc3QgUG9pbnRlckRhdGEmIGN1cnJlbnRQb2ludGVyID0KKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUb3VjaC5wb2ludGVyc1ttQ3VycmVudFRvdWNoLmlkVG9JbmRleFthY3RpdmVUb3VjaElkXV07CisgICAgICAgICAgICBjb25zdCBQb2ludGVyRGF0YSYgbGFzdFBvaW50ZXIgPQorICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoLnBvaW50ZXJzW21MYXN0VG91Y2guaWRUb0luZGV4W2FjdGl2ZVRvdWNoSWRdXTsKKyAgICAgICAgICAgIGZsb2F0IGRlbHRhWCA9IChjdXJyZW50UG9pbnRlci54IC0gbGFzdFBvaW50ZXIueCkKKyAgICAgICAgICAgICAgICAgICAgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWE1vdmVtZW50U2NhbGU7CisgICAgICAgICAgICBmbG9hdCBkZWx0YVkgPSAoY3VycmVudFBvaW50ZXIueSAtIGxhc3RQb2ludGVyLnkpCisgICAgICAgICAgICAgICAgICAgICogbUxvY2tlZC5wb2ludGVyR2VzdHVyZVlNb3ZlbWVudFNjYWxlOwogCi0gICAgICAgICAgICAgICAgLy8gTW92ZSB0aGUgcG9pbnRlciB1c2luZyBhIHJlbGF0aXZlIG1vdGlvbi4KLSAgICAgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIHNwb3RzLCB0aGUgY2xpY2sgd2lsbCBvY2N1ciBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIGFuY2hvcgotICAgICAgICAgICAgICAgIC8vIHNwb3QgYW5kIGFsbCBvdGhlciBzcG90cyB3aWxsIG1vdmUgdGhlcmUuCi0gICAgICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5tb3ZlKGRlbHRhWCwgZGVsdGFZKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLm1vdmUod2hlbiwgJmRlbHRhWCwgJmRlbHRhWSk7CisKKyAgICAgICAgICAgIC8vIE1vdmUgdGhlIHBvaW50ZXIgdXNpbmcgYSByZWxhdGl2ZSBtb3Rpb24uCisgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIHNwb3RzLCB0aGUgY2xpY2sgd2lsbCBvY2N1ciBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIGFuY2hvcgorICAgICAgICAgICAgLy8gc3BvdCBhbmQgYWxsIG90aGVyIHNwb3RzIHdpbGwgbW92ZSB0aGVyZS4KKyAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+bW92ZShkZWx0YVgsIGRlbHRhWSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucG9pbnRlclZlbG9jaXR5Q29udHJvbC5yZXNldCgpOwogICAgICAgICB9CiAKICAgICAgICAgZmxvYXQgeCwgeTsKQEAgLTM4NDQsMjEgKzM5MjcsMjMgQEAKICAgICAgICAgKm91dEZpbmlzaFByZXZpb3VzR2VzdHVyZSA9IHRydWU7CiAKICAgICAgICAgLy8gV2F0Y2ggZm9yIHRhcHMgY29taW5nIG91dCBvZiBIT1ZFUiBvciBUQVBfRFJBRyBtb2RlLgorICAgICAgICAvLyBDaGVja2luZyBmb3IgdGFwcyBhZnRlciBUQVBfRFJBRyBhbGxvd3MgdXMgdG8gZGV0ZWN0IGRvdWJsZS10YXBzLgogICAgICAgICBib29sIHRhcHBlZCA9IGZhbHNlOwogICAgICAgICBpZiAoKG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGUgPT0gUG9pbnRlckdlc3R1cmU6OkhPVkVSCiAgICAgICAgICAgICAgICAgfHwgbVBvaW50ZXJHZXN0dXJlLmxhc3RHZXN0dXJlTW9kZSA9PSBQb2ludGVyR2VzdHVyZTo6VEFQX0RSQUcpCiAgICAgICAgICAgICAgICAgJiYgbUxhc3RUb3VjaC5wb2ludGVyQ291bnQgPT0gMSkgewotICAgICAgICAgICAgaWYgKHdoZW4gPD0gbVBvaW50ZXJHZXN0dXJlLnRhcERvd25UaW1lICsgVEFQX0lOVEVSVkFMKSB7CisgICAgICAgICAgICBpZiAod2hlbiA8PSBtUG9pbnRlckdlc3R1cmUudGFwRG93blRpbWUgKyBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZVRhcEludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgZmxvYXQgeCwgeTsKICAgICAgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPmdldFBvc2l0aW9uKCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhYnMoeCAtIG1Qb2ludGVyR2VzdHVyZS50YXBYKSA8PSBUQVBfU0xPUAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmFicyh5IC0gbVBvaW50ZXJHZXN0dXJlLnRhcFkpIDw9IFRBUF9TTE9QKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhYnMoeCAtIG1Qb2ludGVyR2VzdHVyZS50YXBYKSA8PSBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZVRhcFNsb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZhYnMoeSAtIG1Qb2ludGVyR2VzdHVyZS50YXBZKSA8PSBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZVRhcFNsb3ApIHsKICNpZiBERUJVR19HRVNUVVJFUwogICAgICAgICAgICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogVEFQIik7CiAjZW5kaWYKIAogICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUudGFwVXBUaW1lID0gd2hlbjsKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLT5yZXF1ZXN0VGltZW91dEF0VGltZSh3aGVuICsgVEFQX0RSQUdfSU5URVJWQUwpOworICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCktPnJlcXVlc3RUaW1lb3V0QXRUaW1lKHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1Db25maWctPnBvaW50ZXJHZXN0dXJlVGFwRHJhZ0ludGVydmFsKTsKIAogICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuYWN0aXZlR2VzdHVyZUlkID0gMDsKICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpUQVA7CkBAIC0zOTA1LDYgKzM5OTAsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2wucmVzZXQoKTsKKwogICAgICAgICBpZiAoIXRhcHBlZCkgewogI2lmIERFQlVHX0dFU1RVUkVTCiAgICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogTkVVVFJBTCIpOwpAQCAtMzkyOCwxMSArNDAxNSwxMSBAQAogCiAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgPSBQb2ludGVyR2VzdHVyZTo6SE9WRVI7CiAgICAgICAgIGlmIChtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlID09IFBvaW50ZXJHZXN0dXJlOjpUQVApIHsKLSAgICAgICAgICAgIGlmICh3aGVuIDw9IG1Qb2ludGVyR2VzdHVyZS50YXBVcFRpbWUgKyBUQVBfRFJBR19JTlRFUlZBTCkgeworICAgICAgICAgICAgaWYgKHdoZW4gPD0gbVBvaW50ZXJHZXN0dXJlLnRhcFVwVGltZSArIG1Db25maWctPnBvaW50ZXJHZXN0dXJlVGFwRHJhZ0ludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgZmxvYXQgeCwgeTsKICAgICAgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPmdldFBvc2l0aW9uKCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhYnMoeCAtIG1Qb2ludGVyR2VzdHVyZS50YXBYKSA8PSBUQVBfU0xPUAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmFicyh5IC0gbVBvaW50ZXJHZXN0dXJlLnRhcFkpIDw9IFRBUF9TTE9QKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhYnMoeCAtIG1Qb2ludGVyR2VzdHVyZS50YXBYKSA8PSBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZVRhcFNsb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZhYnMoeSAtIG1Qb2ludGVyR2VzdHVyZS50YXBZKSA8PSBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZVRhcFNsb3ApIHsKICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpUQVBfRFJBRzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogI2lmIERFQlVHX0dFU1RVUkVTCkBAIC0zOTYxLDkgKzQwNDgsMTMgQEAKICAgICAgICAgICAgIGZsb2F0IGRlbHRhWSA9IChjdXJyZW50UG9pbnRlci55IC0gbGFzdFBvaW50ZXIueSkKICAgICAgICAgICAgICAgICAgICAgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWU1vdmVtZW50U2NhbGU7CiAKKyAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLm1vdmUod2hlbiwgJmRlbHRhWCwgJmRlbHRhWSk7CisKICAgICAgICAgICAgIC8vIE1vdmUgdGhlIHBvaW50ZXIgdXNpbmcgYSByZWxhdGl2ZSBtb3Rpb24uCiAgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIHNwb3RzLCB0aGUgaG92ZXIgb3IgZHJhZyB3aWxsIG9jY3VyIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5jaG9yIHNwb3QuCiAgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPm1vdmUoZGVsdGFYLCBkZWx0YVkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2wucmVzZXQoKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2wgZG93bjsKQEAgLTQwMjksMTQgKzQxMjAsMzIgQEAKICAgICAgICAgLy8gYSBkZWNpc2lvbiB0byB0cmFuc2l0aW9uIGludG8gU1dJUEUgb3IgRlJFRUZPUk0gbW9kZSBhY2NvcmRpbmdseS4KICAgICAgICAgTE9HX0FTU0VSVChhY3RpdmVUb3VjaElkID49IDApOwogCi0gICAgICAgIGJvb2wgbmVlZFJlZmVyZW5jZSA9IGZhbHNlOwotICAgICAgICBib29sIHNldHRsZWQgPSB3aGVuID49IG1Qb2ludGVyR2VzdHVyZS5maXJzdFRvdWNoVGltZSArIE1VTFRJVE9VQ0hfU0VUVExFX0lOVEVSVkFMOworICAgICAgICBib29sIHNldHRsZWQgPSB3aGVuID49IG1Qb2ludGVyR2VzdHVyZS5maXJzdFRvdWNoVGltZQorICAgICAgICAgICAgICAgICsgbUNvbmZpZy0+cG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoU2V0dGxlSW50ZXJ2YWw7CiAgICAgICAgIGlmIChtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlICE9IFBvaW50ZXJHZXN0dXJlOjpQUkVTUwogICAgICAgICAgICAgICAgICYmIG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGUgIT0gUG9pbnRlckdlc3R1cmU6OlNXSVBFCiAgICAgICAgICAgICAgICAgJiYgbVBvaW50ZXJHZXN0dXJlLmxhc3RHZXN0dXJlTW9kZSAhPSBQb2ludGVyR2VzdHVyZTo6RlJFRUZPUk0pIHsKICAgICAgICAgICAgICpvdXRGaW5pc2hQcmV2aW91c0dlc3R1cmUgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFzZXR0bGVkICYmIG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID4gbUxhc3RUb3VjaC5wb2ludGVyQ291bnQpIHsKKyAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgcG9pbnRlcnMgaGF2ZSBnb25lIGRvd24gYnV0IG5vdCB5ZXQgc2V0dGxlZC4KKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnZXN0dXJlLgorI2lmIERFQlVHX0dFU1RVUkVTCisgICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogUmVzZXR0aW5nIGdlc3R1cmUgc2luY2UgYWRkaXRpb25hbCBwb2ludGVycyB3ZW50IGRvd24gZm9yIE1VTFRJVE9VQ0gsICIKKyAgICAgICAgICAgICAgICAgICAgInNldHRsZSB0aW1lIHJlbWFpbmluZyAlMC4zZm1zIiwKKyAgICAgICAgICAgICAgICAgICAgKG1Qb2ludGVyR2VzdHVyZS5maXJzdFRvdWNoVGltZSArIE1VTFRJVE9VQ0hfU0VUVExFX0lOVEVSVkFMIC0gd2hlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAuMDAwMDAxZik7CisjZW5kaWYKKyAgICAgICAgICAgICpvdXRDYW5jZWxQcmV2aW91c0dlc3R1cmUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ29udGludWUgcHJldmlvdXMgZ2VzdHVyZS4KKyAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgPSBtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpvdXRGaW5pc2hQcmV2aW91c0dlc3R1cmUgfHwgKm91dENhbmNlbFByZXZpb3VzR2VzdHVyZSkgewogICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpQUkVTUzsKICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5hY3RpdmVHZXN0dXJlSWQgPSAwOworICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZUlkQml0cy5jbGVhcigpOworICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2wucmVzZXQoKTsKIAogICAgICAgICAgICAgaWYgKHNldHRsZWQgJiYgbVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTCiAgICAgICAgICAgICAgICAgICAgICYmIG1MYXN0VG91Y2guaWRCaXRzLmhhc0JpdChtUG9pbnRlckdlc3R1cmUuYWN0aXZlVG91Y2hJZCkpIHsKQEAgLTQwNTcsMzcgKzQxNjYsMTggQEAKICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVggPSBjLmdldEF4aXNWYWx1ZShBTU9USU9OX0VWRU5UX0FYSVNfWCk7CiAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZUdlc3R1cmVZID0gYy5nZXRBeGlzVmFsdWUoQU1PVElPTl9FVkVOVF9BWElTX1kpOwogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGNlbnRyb2lkIGFuZCBwb2ludGVyIGxvY2F0aW9uIGFzIHRoZSByZWZlcmVuY2UgcG9pbnRzIGZvciB0aGUgZ2VzdHVyZS4KICNpZiBERUJVR19HRVNUVVJFUwogICAgICAgICAgICAgICAgIExPR0QoIkdlc3R1cmVzOiBVc2luZyBjZW50cm9pZCBhcyByZWZlcmVuY2UgZm9yIE1VTFRJVE9VQ0gsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzZXR0bGUgdGltZSByZW1haW5pbmcgJTAuM2ZtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobVBvaW50ZXJHZXN0dXJlLmZpcnN0VG91Y2hUaW1lICsgTVVMVElUT1VDSF9TRVRUTEVfSU5URVJWQUwgLSB3aGVuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAuMDAwMDAxZik7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICBuZWVkUmVmZXJlbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRvdWNoLmdldENlbnRyb2lkKCZtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlVG91Y2hYLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VUb3VjaFkpOworICAgICAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+Z2V0UG9zaXRpb24oJm1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVkpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFzZXR0bGVkICYmIG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID4gbUxhc3RUb3VjaC5wb2ludGVyQ291bnQpIHsKLSAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgcG9pbnRlcnMgaGF2ZSBnb25lIGRvd24gYnV0IG5vdCB5ZXQgc2V0dGxlZC4KLSAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnZXN0dXJlLgotI2lmIERFQlVHX0dFU1RVUkVTCi0gICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogUmVzZXR0aW5nIGdlc3R1cmUgc2luY2UgYWRkaXRpb25hbCBwb2ludGVycyB3ZW50IGRvd24gZm9yIE1VTFRJVE9VQ0gsICIKLSAgICAgICAgICAgICAgICAgICAgInNldHRsZSB0aW1lIHJlbWFpbmluZyAlMC4zZm1zIiwKLSAgICAgICAgICAgICAgICAgICAgKG1Qb2ludGVyR2VzdHVyZS5maXJzdFRvdWNoVGltZSArIE1VTFRJVE9VQ0hfU0VUVExFX0lOVEVSVkFMIC0gd2hlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAuMDAwMDAxZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICpvdXRDYW5jZWxQcmV2aW91c0dlc3R1cmUgPSB0cnVlOwotICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpQUkVTUzsKLSAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5hY3RpdmVHZXN0dXJlSWQgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQ29udGludWUgcHJldmlvdXMgZ2VzdHVyZS4KLSAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgPSBtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lZWRSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgIC8vIFVzZSB0aGUgY2VudHJvaWQgYW5kIHBvaW50ZXIgbG9jYXRpb24gYXMgdGhlIHJlZmVyZW5jZSBwb2ludHMgZm9yIHRoZSBnZXN0dXJlLgotICAgICAgICAgICAgbUN1cnJlbnRUb3VjaC5nZXRDZW50cm9pZCgmbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZVRvdWNoWCwKLSAgICAgICAgICAgICAgICAgICAgJm1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VUb3VjaFkpOwotICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5nZXRQb3NpdGlvbigmbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZUdlc3R1cmVYLAotICAgICAgICAgICAgICAgICAgICAmbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZUdlc3R1cmVZKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID09IFBvaW50ZXJHZXN0dXJlOjpQUkVTUykgewpAQCAtNDEyMywxNCArNDIxMywxNSBAQAogCiAgICAgICAgICAgICAgICAgZmxvYXQgc3BlZWQxID0gaHlwb3RmKHZ4MSwgdnkxKTsKICAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZDIgPSBoeXBvdGYodngyLCB2eTIpOwotICAgICAgICAgICAgICAgIGlmIChzcGVlZDEgPj0gTVVMVElUT1VDSF9NSU5fU1BFRUQgJiYgc3BlZWQyID49IE1VTFRJVE9VQ0hfTUlOX1NQRUVEKSB7CisgICAgICAgICAgICAgICAgaWYgKHNwZWVkMSA+PSBtQ29uZmlnLT5wb2ludGVyR2VzdHVyZU11bHRpdG91Y2hNaW5TcGVlZAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3BlZWQyID49IG1Db25maWctPnBvaW50ZXJHZXN0dXJlTXVsdGl0b3VjaE1pblNwZWVkKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIHZlbG9jaXR5IHZlY3RvcnMuCiAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHZlY3RvcnMgYXJlIG9yaWVudGVkIGluIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYW5nbGUgYmV0d2VlZW4gdGhlbSBpcyBuZWFyIHplcm8gYW5kIHRoZSBjb3NpbmUgb2YgdGhlIGFuZ2xlCiAgICAgICAgICAgICAgICAgICAgIC8vIGFwcHJvY2hlcyAxLjAuICBSZWNhbGwgdGhhdCBkb3QodjEsIHYyKSA9IGNvcyhhbmdsZSkgKiBtYWcodjEpICogbWFnKHYyKS4KICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZG90ID0gdngxICogdngyICsgdnkxICogdnkyOwogICAgICAgICAgICAgICAgICAgICBmbG9hdCBjb3NpbmUgPSBkb3QgLyAoc3BlZWQxICogc3BlZWQyKTsgLy8gZGVub21pbmF0b3IgYWx3YXlzID4gMAotICAgICAgICAgICAgICAgICAgICBpZiAoY29zaW5lID49IFNXSVBFX1RSQU5TSVRJT05fQU5HTEVfQ09TSU5FKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3NpbmUgPj0gbUNvbmZpZy0+cG9pbnRlckdlc3R1cmVTd2lwZVRyYW5zaXRpb25BbmdsZUNvc2luZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9pbnRlcnMgYXJlIG1vdmluZyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24uICBTd2l0Y2ggdG8gU1dJUEUuCiAjaWYgREVCVUdfR0VTVFVSRVMKICAgICAgICAgICAgICAgICAgICAgICAgIExPR0QoIkdlc3R1cmVzOiBQUkVTUyB0cmFuc2l0aW9uZWQgdG8gU1dJUEUsICIKQEAgLTQxNjcsNiArNDI1OCwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgLy8gQ2xlYXIgdGhlIHJlZmVyZW5jZSBkZWx0YXMgZm9yIGZpbmdlcnMgbm90IHlldCBpbmNsdWRlZCBpbiB0aGUgcmVmZXJlbmNlIGNhbGN1bGF0aW9uLgorICAgICAgICBmb3IgKEJpdFNldDMyIGlkQml0cyhtQ3VycmVudFRvdWNoLmlkQml0cy52YWx1ZSAmIH5tUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlSWRCaXRzLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAhaWRCaXRzLmlzRW1wdHkoKTsgKSB7CisgICAgICAgICAgICB1aW50MzJfdCBpZCA9IGlkQml0cy5maXJzdE1hcmtlZEJpdCgpOworICAgICAgICAgICAgaWRCaXRzLmNsZWFyQml0KGlkKTsKKworICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZURlbHRhc1tpZF0uZHggPSAwOworICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZURlbHRhc1tpZF0uZHkgPSAwOworICAgICAgICB9CisgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VJZEJpdHMgPSBtQ3VycmVudFRvdWNoLmlkQml0czsKKwogICAgICAgICAvLyBNb3ZlIHRoZSByZWZlcmVuY2UgcG9pbnRzIGJhc2VkIG9uIHRoZSBvdmVyYWxsIGdyb3VwIG1vdGlvbiBvZiB0aGUgZmluZ2Vycy4KICAgICAgICAgLy8gVGhlIG9iamVjdGl2ZSBpcyB0byBjYWxjdWxhdGUgYSB2ZWN0b3IgZGVsdGEgdGhhdCBpcyBjb21tb24gdG8gdGhlIG1vdmVtZW50CiAgICAgICAgIC8vIG9mIGFsbCBmaW5nZXJzLgpAQCAtNDE4MCwyNyArNDI4Miw0MyBAQAogCiAgICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlckRhdGEmIGNwZCA9IG1DdXJyZW50VG91Y2gucG9pbnRlcnNbbUN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaWRdXTsKICAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyRGF0YSYgbHBkID0gbUxhc3RUb3VjaC5wb2ludGVyc1ttTGFzdFRvdWNoLmlkVG9JbmRleFtpZF1dOwotICAgICAgICAgICAgICAgIGZsb2F0IGRlbHRhWCA9IGNwZC54IC0gbHBkLng7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZGVsdGFZID0gY3BkLnkgLSBscGQueTsKKyAgICAgICAgICAgICAgICBQb2ludGVyR2VzdHVyZTo6RGVsdGEmIGRlbHRhID0gbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZURlbHRhc1tpZF07CisgICAgICAgICAgICAgICAgZGVsdGEuZHggKz0gY3BkLnggLSBscGQueDsKKyAgICAgICAgICAgICAgICBkZWx0YS5keSArPSBjcGQueSAtIGxwZC55OwogCiAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkRlbHRhWCA9IGRlbHRhWDsKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFZID0gZGVsdGFZOworICAgICAgICAgICAgICAgICAgICBjb21tb25EZWx0YVggPSBkZWx0YS5keDsKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFZID0gZGVsdGEuZHk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFYID0gY2FsY3VsYXRlQ29tbW9uVmVjdG9yKGNvbW1vbkRlbHRhWCwgZGVsdGFYKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFZID0gY2FsY3VsYXRlQ29tbW9uVmVjdG9yKGNvbW1vbkRlbHRhWSwgZGVsdGFZKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFYID0gY2FsY3VsYXRlQ29tbW9uVmVjdG9yKGNvbW1vbkRlbHRhWCwgZGVsdGEuZHgpOworICAgICAgICAgICAgICAgICAgICBjb21tb25EZWx0YVkgPSBjYWxjdWxhdGVDb21tb25WZWN0b3IoY29tbW9uRGVsdGFZLCBkZWx0YS5keSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlVG91Y2hYICs9IGNvbW1vbkRlbHRhWDsKLSAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VUb3VjaFkgKz0gY29tbW9uRGVsdGFZOwotICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZUdlc3R1cmVYICs9Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkRlbHRhWCAqIG1Mb2NrZWQucG9pbnRlckdlc3R1cmVYTW92ZW1lbnRTY2FsZTsKLSAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWSArPQotICAgICAgICAgICAgICAgICAgICBjb21tb25EZWx0YVkgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWU1vdmVtZW50U2NhbGU7Ci0gICAgICAgICAgICBjbGFtcFBvc2l0aW9uVXNpbmdQb2ludGVyQm91bmRzKG1Qb2ludGVyQ29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgJm1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWCwKLSAgICAgICAgICAgICAgICAgICAgJm1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWSk7CisgICAgICAgICAgICBpZiAoY29tbW9uRGVsdGFYIHx8IGNvbW1vbkRlbHRhWSkgeworICAgICAgICAgICAgICAgIGZvciAoQml0U2V0MzIgaWRCaXRzKGNvbW1vbklkQml0cyk7ICFpZEJpdHMuaXNFbXB0eSgpOyApIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSBpZEJpdHMuZmlyc3RNYXJrZWRCaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWRCaXRzLmNsZWFyQml0KGlkKTsKKworICAgICAgICAgICAgICAgICAgICBQb2ludGVyR2VzdHVyZTo6RGVsdGEmIGRlbHRhID0gbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZURlbHRhc1tpZF07CisgICAgICAgICAgICAgICAgICAgIGRlbHRhLmR4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEuZHkgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VUb3VjaFggKz0gY29tbW9uRGVsdGFYOworICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VUb3VjaFkgKz0gY29tbW9uRGVsdGFZOworCisgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFYICo9IG1Mb2NrZWQucG9pbnRlckdlc3R1cmVYTW92ZW1lbnRTY2FsZTsKKyAgICAgICAgICAgICAgICBjb21tb25EZWx0YVkgKj0gbUxvY2tlZC5wb2ludGVyR2VzdHVyZVlNb3ZlbWVudFNjYWxlOworICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLm1vdmUod2hlbiwgJmNvbW1vbkRlbHRhWCwgJmNvbW1vbkRlbHRhWSk7CisKKyAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVggKz0gY29tbW9uRGVsdGFYOworICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWSArPSBjb21tb25EZWx0YVk7CisKKyAgICAgICAgICAgICAgICBjbGFtcFBvc2l0aW9uVXNpbmdQb2ludGVyQm91bmRzKG1Qb2ludGVyQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAmbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZUdlc3R1cmVZKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIFJlcG9ydCBnZXN0dXJlcy4KQEAgLTQ1MDgsNyArNDYyNiw3IEBACiAgICAgeyAvLyBhY3F1aXJlIGxvY2sKICAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKICAgICAgICAgaWYgKG1Qb2ludGVyQ29udHJvbGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPmZhZGUoKTsKKyAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+ZmFkZShQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6VFJBTlNJVElPTl9HUkFEVUFMKTsKICAgICAgICAgfQogICAgIH0gLy8gcmVsZWFzZSBsb2NrCiB9CkBAIC01MzAzLDcgKzU0MjEsOCBAQAogfQogCiB2b2lkIE11bHRpVG91Y2hJbnB1dE1hcHBlcjo6Y2xlYXJTdGF0ZSgpIHsKLSAgICBtQWNjdW11bGF0b3IuY2xlYXIobVNsb3RDb3VudCk7CisgICAgbUFjY3VtdWxhdG9yLmNsZWFyU2xvdHMobVNsb3RDb3VudCk7CisgICAgbUFjY3VtdWxhdG9yLmNsZWFyQnV0dG9ucygpOwogICAgIG1CdXR0b25TdGF0ZSA9IDA7CiB9CiAKQEAgLTUzMzcsMTMgKzU0NTYsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQWNjdW11bGF0b3IuY3VycmVudFNsb3QgPCAwIHx8IHNpemVfdChtQWNjdW11bGF0b3IuY3VycmVudFNsb3QpID49IG1TbG90Q291bnQpIHsKLSAgICAgICAgICAgIGlmIChuZXdTbG90KSB7CiAjaWYgREVCVUdfUE9JTlRFUlMKKyAgICAgICAgICAgIGlmIChuZXdTbG90KSB7CiAgICAgICAgICAgICAgICAgTE9HVygiTXVsdGlUb3VjaCBkZXZpY2UgJXMgZW1pdHRlZCBpbnZhbGlkIHNsb3QgaW5kZXggJWQgYnV0IGl0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCAlZDsgaWdub3JpbmcgdGhpcyBzbG90LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VOYW1lKCkuc3RyaW5nKCksIG1BY2N1bXVsYXRvci5jdXJyZW50U2xvdCwgbVNsb3RDb3VudCk7Ci0jZW5kaWYKICAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNTU0Niw3ICs1NjY1LDEwIEBACiAKICAgICBzeW5jVG91Y2god2hlbiwgaGF2ZVBvaW50ZXJJZHMpOwogCi0gICAgbUFjY3VtdWxhdG9yLmNsZWFyKG1Vc2luZ1Nsb3RzUHJvdG9jb2wgPyAwIDogbVNsb3RDb3VudCk7CisgICAgaWYgKCFtVXNpbmdTbG90c1Byb3RvY29sKSB7CisgICAgICAgIG1BY2N1bXVsYXRvci5jbGVhclNsb3RzKG1TbG90Q291bnQpOworICAgIH0KKyAgICBtQWNjdW11bGF0b3IuY2xlYXJCdXR0b25zKCk7CiB9CiAKIHZvaWQgTXVsdGlUb3VjaElucHV0TWFwcGVyOjpjb25maWd1cmVSYXdBeGVzKCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvaW5wdXQvSW5wdXRSZWFkZXIuaCBiL3NlcnZpY2VzL2lucHV0L0lucHV0UmVhZGVyLmgKaW5kZXggODUzMzhiNi4uMWQ0YWQ4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvaW5wdXQvSW5wdXRSZWFkZXIuaAorKysgYi9zZXJ2aWNlcy9pbnB1dC9JbnB1dFJlYWRlci5oCkBAIC00MCw2ICs0MCwxMTcgQEAKIAogCiAvKgorICogSW5wdXQgcmVhZGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogU3BlY2lmaWVzIHZhcmlvdXMgb3B0aW9ucyB0aGF0IG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgdGhlIGlucHV0IHJlYWRlci4KKyAqLworc3RydWN0IElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiB7CisgICAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHR1cm4gb24gc29tZSBoYWNrcyB3ZSBoYXZlIHRvIGltcHJvdmUgdGhlIHRvdWNoIGludGVyYWN0aW9uIHdpdGggYQorICAgIC8vIGNlcnRhaW4gZGV2aWNlIHdob3NlIHNjcmVlbiBjdXJyZW50bHkgaXMgbm90IGFsbCB0aGF0IGdvb2QuCisgICAgYm9vbCBmaWx0ZXJUb3VjaEV2ZW50czsKKworICAgIC8vIERldGVybWluZXMgd2hldGhlciB0byB0dXJuIG9uIHNvbWUgaGFja3MgdG8gaW1wcm92ZSB0b3VjaCBpbnRlcmFjdGlvbiB3aXRoIGFub3RoZXIgZGV2aWNlCisgICAgLy8gd2hlcmUgdG91Y2ggY29vcmRpbmF0ZSBkYXRhIGNhbiBnZXQgY29ycnVwdGVkLgorICAgIGJvb2wgZmlsdGVySnVtcHlUb3VjaEV2ZW50czsKKworICAgIC8vIEdldHMgdGhlIGFtb3VudCBvZiB0aW1lIHRvIGRpc2FibGUgdmlydHVhbCBrZXlzIGFmdGVyIHRoZSBzY3JlZW4gaXMgdG91Y2hlZAorICAgIC8vIGluIG9yZGVyIHRvIGZpbHRlciBvdXQgYWNjaWRlbnRhbCB2aXJ0dWFsIGtleSBwcmVzc2VzIGR1ZSB0byBzd2lwaW5nIGdlc3R1cmVzCisgICAgLy8gb3IgdGFwcyBuZWFyIHRoZSBlZGdlIG9mIHRoZSBkaXNwbGF5LiAgTWF5IGJlIDAgdG8gZGlzYWJsZSB0aGUgZmVhdHVyZS4KKyAgICBuc2Vjc190IHZpcnR1YWxLZXlRdWlldFRpbWU7CisKKyAgICAvLyBUaGUgZXhjbHVkZWQgZGV2aWNlIG5hbWVzIGZvciB0aGUgcGxhdGZvcm0uCisgICAgLy8gRGV2aWNlcyB3aXRoIHRoZXNlIG5hbWVzIHdpbGwgYmUgaWdub3JlZC4KKyAgICBWZWN0b3I8U3RyaW5nOD4gZXhjbHVkZWREZXZpY2VOYW1lczsKKworICAgIC8vIFZlbG9jaXR5IGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgbW91c2UgcG9pbnRlciBtb3ZlbWVudHMuCisgICAgVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycyBwb2ludGVyVmVsb2NpdHlDb250cm9sUGFyYW1ldGVyczsKKworICAgIC8vIFZlbG9jaXR5IGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgbW91c2Ugd2hlZWwgbW92ZW1lbnRzLgorICAgIFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMgd2hlZWxWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzOworCisgICAgLy8gUXVpZXQgdGltZSBiZXR3ZWVuIGNlcnRhaW4gcG9pbnRlciBnZXN0dXJlIHRyYW5zaXRpb25zLgorICAgIC8vIFRpbWUgdG8gYWxsb3cgZm9yIGFsbCBmaW5nZXJzIG9yIGJ1dHRvbnMgdG8gc2V0dGxlIGludG8gYSBzdGFibGUgc3RhdGUgYmVmb3JlCisgICAgLy8gc3RhcnRpbmcgYSBuZXcgZ2VzdHVyZS4KKyAgICBuc2Vjc190IHBvaW50ZXJHZXN0dXJlUXVpZXRJbnRlcnZhbDsKKworICAgIC8vIFRoZSBtaW5pbXVtIHNwZWVkIHRoYXQgYSBwb2ludGVyIG11c3QgdHJhdmVsIGZvciB1cyB0byBjb25zaWRlciBzd2l0Y2hpbmcgdGhlIGFjdGl2ZQorICAgIC8vIHRvdWNoIHBvaW50ZXIgdG8gaXQgZHVyaW5nIGEgZHJhZy4gIFRoaXMgdGhyZXNob2xkIGlzIHNldCB0byBhdm9pZCBzd2l0Y2hpbmcgZHVlCisgICAgLy8gdG8gbm9pc2UgZnJvbSBhIGZpbmdlciByZXN0aW5nIG9uIHRoZSB0b3VjaCBwYWQgKHBlcmhhcHMganVzdCBwcmVzc2luZyBpdCBkb3duKS4KKyAgICBmbG9hdCBwb2ludGVyR2VzdHVyZURyYWdNaW5Td2l0Y2hTcGVlZDsgLy8gaW4gcGl4ZWxzIHBlciBzZWNvbmQKKworICAgIC8vIFRhcCBnZXN0dXJlIGRlbGF5IHRpbWUuCisgICAgLy8gVGhlIHRpbWUgYmV0d2VlbiBkb3duIGFuZCB1cCBtdXN0IGJlIGxlc3MgdGhhbiB0aGlzIHRvIGJlIGNvbnNpZGVyZWQgYSB0YXAuCisgICAgbnNlY3NfdCBwb2ludGVyR2VzdHVyZVRhcEludGVydmFsOworCisgICAgLy8gVGFwIGRyYWcgZ2VzdHVyZSBkZWxheSB0aW1lLgorICAgIC8vIFRoZSB0aW1lIGJldHdlZW4gdGhlIHByZXZpb3VzIHRhcCdzIHVwIGFuZCB0aGUgbmV4dCBkb3duIG11c3QgYmUgbGVzcyB0aGFuCisgICAgLy8gdGhpcyB0byBiZSBjb25zaWRlcmVkIGEgZHJhZy4gIE90aGVyd2lzZSwgdGhlIHByZXZpb3VzIHRhcCBpcyBmaW5pc2hlZCBhbmQgYQorICAgIC8vIG5ldyB0YXAgYmVnaW5zLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSBwcmV2aW91cyB0YXAgd2lsbCBiZSBoZWxkIGRvd24gZm9yIHRoaXMgZW50aXJlIGR1cmF0aW9uIHNvIHRoaXMKKyAgICAvLyBpbnRlcnZhbCBtdXN0IGJlIHNob3J0ZXIgdGhhbiB0aGUgbG9uZyBwcmVzcyB0aW1lb3V0LgorICAgIG5zZWNzX3QgcG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWw7CisKKyAgICAvLyBUaGUgZGlzdGFuY2UgaW4gcGl4ZWxzIHRoYXQgdGhlIHBvaW50ZXIgaXMgYWxsb3dlZCB0byBtb3ZlIGZyb20gaW5pdGlhbCBkb3duCisgICAgLy8gdG8gdXAgYW5kIHN0aWxsIGJlIGNhbGxlZCBhIHRhcC4KKyAgICBmbG9hdCBwb2ludGVyR2VzdHVyZVRhcFNsb3A7IC8vIGluIHBpeGVscworCisgICAgLy8gVGltZSBhZnRlciB0aGUgZmlyc3QgdG91Y2ggcG9pbnRzIGdvIGRvd24gdG8gc2V0dGxlIG9uIGFuIGluaXRpYWwgY2VudHJvaWQuCisgICAgLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBlbm91Z2ggdGltZSB0byBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgcHV0cyBkb3duIHR3bworICAgIC8vIGZpbmdlcnMgYXQgYWxtb3N0IGJ1dCBub3QgcXVpdGUgZXhhY3RseSB0aGUgc2FtZSB0aW1lLgorICAgIG5zZWNzX3QgcG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoU2V0dGxlSW50ZXJ2YWw7CisKKyAgICAvLyBUaGUgdHJhbnNpdGlvbiBmcm9tIFBSRVNTIHRvIFNXSVBFIG9yIEZSRUVGT1JNIGdlc3R1cmUgbW9kZSBpcyBtYWRlIHdoZW4KKyAgICAvLyBib3RoIG9mIHRoZSBwb2ludGVycyBhcmUgbW92aW5nIGF0IGxlYXN0IHRoaXMgZmFzdC4KKyAgICBmbG9hdCBwb2ludGVyR2VzdHVyZU11bHRpdG91Y2hNaW5TcGVlZDsgLy8gaW4gcGl4ZWxzIHBlciBzZWNvbmQKKworICAgIC8vIFRoZSB0cmFuc2l0aW9uIGZyb20gUFJFU1MgdG8gU1dJUEUgZ2VzdHVyZSBtb2RlIGNhbiBvbmx5IG9jY3VyIHdoZW4gdGhlCisgICAgLy8gY29zaW5lIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSB0d28gdmVjdG9ycyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhhbiB0aGlzIHZhbHVlCisgICAgLy8gd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZlY3RvcnMgYXJlIG9yaWVudGVkIGluIHRoZSBzYW1lIGRpcmVjdGlvbi4KKyAgICAvLyBXaGVuIHRoZSB2ZWN0b3JzIGFyZSBvcmllbnRlZCBpbiB0aGUgZXhhY3RseSBzYW1lIGRpcmVjdGlvbiwgdGhlIGNvc2luZSBpcyAxLjAuCisgICAgLy8gKEluIGV4YWN0bHkgb3Bwb3NpdGUgZGlyZWN0aW9ucywgdGhlIGNvc2luZSBpcyAtMS4wLikKKyAgICBmbG9hdCBwb2ludGVyR2VzdHVyZVN3aXBlVHJhbnNpdGlvbkFuZ2xlQ29zaW5lOworCisgICAgLy8gVGhlIHRyYW5zaXRpb24gZnJvbSBQUkVTUyB0byBTV0lQRSBnZXN0dXJlIG1vZGUgY2FuIG9ubHkgb2NjdXIgd2hlbiB0aGUKKyAgICAvLyBmaW5nZXJzIGFyZSBubyBtb3JlIHRoYW4gdGhpcyBmYXIgYXBhcnQgcmVsYXRpdmUgdG8gdGhlIGRpYWdvbmFsIHNpemUgb2YKKyAgICAvLyB0aGUgdG91Y2ggcGFkLiAgRm9yIGV4YW1wbGUsIGEgcmF0aW8gb2YgMC41IG1lYW5zIHRoYXQgdGhlIGZpbmdlcnMgbXVzdCBiZQorICAgIC8vIG5vIG1vcmUgdGhhbiBoYWxmIHRoZSBkaWFnb25hbCBzaXplIG9mIHRoZSB0b3VjaCBwYWQgYXBhcnQuCisgICAgZmxvYXQgcG9pbnRlckdlc3R1cmVTd2lwZU1heFdpZHRoUmF0aW87CisKKyAgICAvLyBUaGUgZ2VzdHVyZSBtb3ZlbWVudCBzcGVlZCBmYWN0b3IgcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIGRpc3BsYXkuCisgICAgLy8gTW92ZW1lbnQgc3BlZWQgYXBwbGllcyB3aGVuIHRoZSBmaW5nZXJzIGFyZSBtb3ZpbmcgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLgorICAgIC8vIFdpdGhvdXQgYWNjZWxlcmF0aW9uLCBhIGZ1bGwgc3dpcGUgb2YgdGhlIHRvdWNoIHBhZCBkaWFnb25hbCBpbiBtb3ZlbWVudCBtb2RlCisgICAgLy8gd2lsbCBjb3ZlciB0aGlzIHBvcnRpb24gb2YgdGhlIGRpc3BsYXkgZGlhZ29uYWwuCisgICAgZmxvYXQgcG9pbnRlckdlc3R1cmVNb3ZlbWVudFNwZWVkUmF0aW87CisKKyAgICAvLyBUaGUgZ2VzdHVyZSB6b29tIHNwZWVkIGZhY3RvciByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgZGlzcGxheS4KKyAgICAvLyBab29tIHNwZWVkIGFwcGxpZXMgd2hlbiB0aGUgZmluZ2VycyBhcmUgbW9zdGx5IG1vdmluZyByZWxhdGl2ZSB0byBlYWNoIG90aGVyCisgICAgLy8gdG8gZXhlY3V0ZSBhIHNjYWxlIGdlc3R1cmUgb3Igc2ltaWxhci4KKyAgICAvLyBXaXRob3V0IGFjY2VsZXJhdGlvbiwgYSBmdWxsIHN3aXBlIG9mIHRoZSB0b3VjaCBwYWQgZGlhZ29uYWwgaW4gem9vbSBtb2RlCisgICAgLy8gd2lsbCBjb3ZlciB0aGlzIHBvcnRpb24gb2YgdGhlIGRpc3BsYXkgZGlhZ29uYWwuCisgICAgZmxvYXQgcG9pbnRlckdlc3R1cmVab29tU3BlZWRSYXRpbzsKKworICAgIElucHV0UmVhZGVyQ29uZmlndXJhdGlvbigpIDoKKyAgICAgICAgICAgIGZpbHRlclRvdWNoRXZlbnRzKGZhbHNlKSwKKyAgICAgICAgICAgIGZpbHRlckp1bXB5VG91Y2hFdmVudHMoZmFsc2UpLAorICAgICAgICAgICAgdmlydHVhbEtleVF1aWV0VGltZSgwKSwKKyAgICAgICAgICAgIHBvaW50ZXJWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzKDEuMGYsIDgwLjBmLCA0MDAuMGYsIDQuMGYpLAorICAgICAgICAgICAgd2hlZWxWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzKDEuMGYsIDE1LjBmLCA1MC4wZiwgNC4wZiksCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVF1aWV0SW50ZXJ2YWwoMTAwICogMTAwMDAwMExMKSwgLy8gMTAwIG1zCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZURyYWdNaW5Td2l0Y2hTcGVlZCg1MCksIC8vIDUwIHBpeGVscyBwZXIgc2Vjb25kCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVRhcEludGVydmFsKDE1MCAqIDEwMDAwMDBMTCksIC8vIDE1MCBtcworICAgICAgICAgICAgcG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWwoMTUwICogMTAwMDAwMExMKSwgLy8gMTUwIG1zCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVRhcFNsb3AoMTAuMGYpLCAvLyAxMCBwaXhlbHMKKyAgICAgICAgICAgIHBvaW50ZXJHZXN0dXJlTXVsdGl0b3VjaFNldHRsZUludGVydmFsKDEwMCAqIDEwMDAwMDBMTCksIC8vIDEwMCBtcworICAgICAgICAgICAgcG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoTWluU3BlZWQoMTUwLjBmKSwgLy8gMTUwIHBpeGVscyBwZXIgc2Vjb25kCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVN3aXBlVHJhbnNpdGlvbkFuZ2xlQ29zaW5lKDAuNWYpLCAvLyBjb3NpbmUgb2YgNDVkZWdyZWVzCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVN3aXBlTWF4V2lkdGhSYXRpbygwLjMzM2YpLAorICAgICAgICAgICAgcG9pbnRlckdlc3R1cmVNb3ZlbWVudFNwZWVkUmF0aW8oMC4zZiksCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVpvb21TcGVlZFJhdGlvKDAuM2YpIHsgfQorfTsKKworCisvKgogICogSW5wdXQgcmVhZGVyIHBvbGljeSBpbnRlcmZhY2UuCiAgKgogICogVGhlIGlucHV0IHJlYWRlciBwb2xpY3kgaXMgdXNlZCBieSB0aGUgaW5wdXQgcmVhZGVyIHRvIGludGVyYWN0IHdpdGggdGhlIFdpbmRvdyBNYW5hZ2VyCkBAIC02OCwyNCArMTc5LDggQEAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0RGlzcGxheUluZm8oaW50MzJfdCBkaXNwbGF5SWQsCiAgICAgICAgICAgICBpbnQzMl90KiB3aWR0aCwgaW50MzJfdCogaGVpZ2h0LCBpbnQzMl90KiBvcmllbnRhdGlvbikgPSAwOwogCi0gICAgLyogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHR1cm4gb24gc29tZSBoYWNrcyB3ZSBoYXZlIHRvIGltcHJvdmUgdGhlIHRvdWNoIGludGVyYWN0aW9uIHdpdGggYQotICAgICAqIGNlcnRhaW4gZGV2aWNlIHdob3NlIHNjcmVlbiBjdXJyZW50bHkgaXMgbm90IGFsbCB0aGF0IGdvb2QuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIGZpbHRlclRvdWNoRXZlbnRzKCkgPSAwOwotCi0gICAgLyogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHR1cm4gb24gc29tZSBoYWNrcyB0byBpbXByb3ZlIHRvdWNoIGludGVyYWN0aW9uIHdpdGggYW5vdGhlciBkZXZpY2UKLSAgICAgKiB3aGVyZSB0b3VjaCBjb29yZGluYXRlIGRhdGEgY2FuIGdldCBjb3JydXB0ZWQuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIGZpbHRlckp1bXB5VG91Y2hFdmVudHMoKSA9IDA7Ci0KLSAgICAvKiBHZXRzIHRoZSBhbW91bnQgb2YgdGltZSB0byBkaXNhYmxlIHZpcnR1YWwga2V5cyBhZnRlciB0aGUgc2NyZWVuIGlzIHRvdWNoZWQKLSAgICAgKiBpbiBvcmRlciB0byBmaWx0ZXIgb3V0IGFjY2lkZW50YWwgdmlydHVhbCBrZXkgcHJlc3NlcyBkdWUgdG8gc3dpcGluZyBnZXN0dXJlcwotICAgICAqIG9yIHRhcHMgbmVhciB0aGUgZWRnZSBvZiB0aGUgZGlzcGxheS4gIE1heSBiZSAwIHRvIGRpc2FibGUgdGhlIGZlYXR1cmUuCi0gICAgICovCi0gICAgdmlydHVhbCBuc2Vjc190IGdldFZpcnR1YWxLZXlRdWlldFRpbWUoKSA9IDA7Ci0KLSAgICAvKiBHZXRzIHRoZSBleGNsdWRlZCBkZXZpY2UgbmFtZXMgZm9yIHRoZSBwbGF0Zm9ybS4gKi8KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RXhjbHVkZWREZXZpY2VOYW1lcyhWZWN0b3I8U3RyaW5nOD4mIG91dEV4Y2x1ZGVkRGV2aWNlTmFtZXMpID0gMDsKKyAgICAvKiBHZXRzIHRoZSBpbnB1dCByZWFkZXIgY29uZmlndXJhdGlvbi4gKi8KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0UmVhZGVyQ29uZmlndXJhdGlvbihJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24qIG91dENvbmZpZykgPSAwOwogCiAgICAgLyogR2V0cyBhIHBvaW50ZXIgY29udHJvbGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBjdXJzb3IgZGV2aWNlIChpZS4gYSBtb3VzZSkuICovCiAgICAgdmlydHVhbCBzcDxQb2ludGVyQ29udHJvbGxlckludGVyZmFjZT4gb2J0YWluUG9pbnRlckNvbnRyb2xsZXIoaW50MzJfdCBkZXZpY2VJZCkgPSAwOwpAQCAtMTM5LDYgKzIzNCw5IEBACiAgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgcGh5c2ljYWwga2V5cyBleGlzdCBmb3IgdGhlIGdpdmVuIGZyYW1ld29yay1kb21haW4ga2V5IGNvZGVzLiAqLwogICAgIHZpcnR1YWwgYm9vbCBoYXNLZXlzKGludDMyX3QgZGV2aWNlSWQsIHVpbnQzMl90IHNvdXJjZU1hc2ssCiAgICAgICAgICAgICBzaXplX3QgbnVtQ29kZXMsIGNvbnN0IGludDMyX3QqIGtleUNvZGVzLCB1aW50OF90KiBvdXRGbGFncykgPSAwOworCisgICAgLyogUmVvcGVucyBhbmQgcmVjb25maWd1cmVzIGFsbCBpbnB1dCBkZXZpY2VzLiAqLworICAgIHZpcnR1YWwgdm9pZCByZWZyZXNoQ29uZmlndXJhdGlvbigpID0gMDsKIH07CiAKIApAQCAtMTYyLDYgKzI2MCw3IEBACiAgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RUaW1lb3V0QXRUaW1lKG5zZWNzX3Qgd2hlbikgPSAwOwogCiAgICAgdmlydHVhbCBJbnB1dFJlYWRlclBvbGljeUludGVyZmFjZSogZ2V0UG9saWN5KCkgPSAwOworICAgIHZpcnR1YWwgY29uc3QgSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uKiBnZXRDb25maWcoKSA9IDA7CiAgICAgdmlydHVhbCBJbnB1dERpc3BhdGNoZXJJbnRlcmZhY2UqIGdldERpc3BhdGNoZXIoKSA9IDA7CiAgICAgdmlydHVhbCBFdmVudEh1YkludGVyZmFjZSogZ2V0RXZlbnRIdWIoKSA9IDA7CiB9OwpAQCAtMjAyLDYgKzMwMSw4IEBACiAgICAgdmlydHVhbCBib29sIGhhc0tleXMoaW50MzJfdCBkZXZpY2VJZCwgdWludDMyX3Qgc291cmNlTWFzaywKICAgICAgICAgICAgIHNpemVfdCBudW1Db2RlcywgY29uc3QgaW50MzJfdCoga2V5Q29kZXMsIHVpbnQ4X3QqIG91dEZsYWdzKTsKIAorICAgIHZpcnR1YWwgdm9pZCByZWZyZXNoQ29uZmlndXJhdGlvbigpOworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgcHJvdGVjdGVkIHZpcnR1YWwgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBhbmQgaW5zdHJ1bWVudGVkCiAgICAgLy8gYnkgdGVzdCBjYXNlcy4KQEAgLTIxMiw3ICszMTMsMTAgQEAKICAgICBzcDxJbnB1dFJlYWRlclBvbGljeUludGVyZmFjZT4gbVBvbGljeTsKICAgICBzcDxJbnB1dERpc3BhdGNoZXJJbnRlcmZhY2U+IG1EaXNwYXRjaGVyOwogCisgICAgSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uIG1Db25maWc7CisKICAgICB2aXJ0dWFsIElucHV0UmVhZGVyUG9saWN5SW50ZXJmYWNlKiBnZXRQb2xpY3koKSB7IHJldHVybiBtUG9saWN5LmdldCgpOyB9CisgICAgdmlydHVhbCBjb25zdCBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24qIGdldENvbmZpZygpIHsgcmV0dXJuICZtQ29uZmlnOyB9CiAgICAgdmlydHVhbCBJbnB1dERpc3BhdGNoZXJJbnRlcmZhY2UqIGdldERpc3BhdGNoZXIoKSB7IHJldHVybiBtRGlzcGF0Y2hlci5nZXQoKTsgfQogICAgIHZpcnR1YWwgRXZlbnRIdWJJbnRlcmZhY2UqIGdldEV2ZW50SHViKCkgeyByZXR1cm4gbUV2ZW50SHViLmdldCgpOyB9CiAKQEAgLTI0MCwxOCArMzQ0LDE3IEBACiAgICAgdm9pZCB0aW1lb3V0RXhwaXJlZChuc2Vjc190IHdoZW4pOwogCiAgICAgdm9pZCBoYW5kbGVDb25maWd1cmF0aW9uQ2hhbmdlZChuc2Vjc190IHdoZW4pOwotICAgIHZvaWQgY29uZmlndXJlRXhjbHVkZWREZXZpY2VzKCk7CiAKICAgICAvLyBzdGF0ZSBtYW5hZ2VtZW50IGZvciBhbGwgZGV2aWNlcwogICAgIE11dGV4IG1TdGF0ZUxvY2s7CiAKLSAgICBpbnQzMl90IG1HbG9iYWxNZXRhU3RhdGU7CisgICAgaW50MzJfdCBtR2xvYmFsTWV0YVN0YXRlOyAvLyBndWFyZGVkIGJ5IG1TdGF0ZUxvY2sKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlR2xvYmFsTWV0YVN0YXRlKCk7CiAgICAgdmlydHVhbCBpbnQzMl90IGdldEdsb2JhbE1ldGFTdGF0ZSgpOwogCiAgICAgdmlydHVhbCB2b2lkIGZhZGVQb2ludGVyKCk7CiAKLSAgICBJbnB1dENvbmZpZ3VyYXRpb24gbUlucHV0Q29uZmlndXJhdGlvbjsKKyAgICBJbnB1dENvbmZpZ3VyYXRpb24gbUlucHV0Q29uZmlndXJhdGlvbjsgLy8gZ3VhcmRlZCBieSBtU3RhdGVMb2NrCiAgICAgdm9pZCB1cGRhdGVJbnB1dENvbmZpZ3VyYXRpb24oKTsKIAogICAgIG5zZWNzX3QgbURpc2FibGVWaXJ0dWFsS2V5c1RpbWVvdXQ7IC8vIG9ubHkgYWNjZXNzZWQgYnkgcmVhZGVyIHRocmVhZApAQCAtMjU5LDkgKzM2MiwxMiBAQAogICAgIHZpcnR1YWwgYm9vbCBzaG91bGREcm9wVmlydHVhbEtleShuc2Vjc190IG5vdywKICAgICAgICAgICAgIElucHV0RGV2aWNlKiBkZXZpY2UsIGludDMyX3Qga2V5Q29kZSwgaW50MzJfdCBzY2FuQ29kZSk7CiAKLSAgICBuc2Vjc190IG1OZXh0VGltZW91dDsgLy8gb25seSBhY2Nlc3NlZCBieSByZWFkZXIgdGhyZWFkCisgICAgbnNlY3NfdCBtTmV4dFRpbWVvdXQ7IC8vIG9ubHkgYWNjZXNzZWQgYnkgcmVhZGVyIHRocmVhZCwgbm90IGd1YXJkZWQKICAgICB2aXJ0dWFsIHZvaWQgcmVxdWVzdFRpbWVvdXRBdFRpbWUobnNlY3NfdCB3aGVuKTsKIAorICAgIHZvbGF0aWxlIGludDMyX3QgbVJlZnJlc2hDb25maWd1cmF0aW9uOyAvLyBhdG9taWMKKyAgICB2b2lkIGNvbmZpZ3VyZShib29sIGZpcnN0VGltZSk7CisKICAgICAvLyBzdGF0ZSBxdWVyaWVzCiAgICAgdHlwZWRlZiBpbnQzMl90IChJbnB1dERldmljZTo6KkdldFN0YXRlRnVuYykodWludDMyX3Qgc291cmNlTWFzaywgaW50MzJfdCBjb2RlKTsKICAgICBpbnQzMl90IGdldFN0YXRlKGludDMyX3QgZGV2aWNlSWQsIHVpbnQzMl90IHNvdXJjZU1hc2ssIGludDMyX3QgY29kZSwKQEAgLTM1NCw2ICs0NjAsNyBAQAogICAgIGlubGluZSBjb25zdCBTdHJpbmc4IGdldERldmljZU5hbWUoKSB7IHJldHVybiBtRGV2aWNlLT5nZXROYW1lKCk7IH0KICAgICBpbmxpbmUgSW5wdXRSZWFkZXJDb250ZXh0KiBnZXRDb250ZXh0KCkgeyByZXR1cm4gbUNvbnRleHQ7IH0KICAgICBpbmxpbmUgSW5wdXRSZWFkZXJQb2xpY3lJbnRlcmZhY2UqIGdldFBvbGljeSgpIHsgcmV0dXJuIG1Db250ZXh0LT5nZXRQb2xpY3koKTsgfQorICAgIGlubGluZSBjb25zdCBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24qIGdldENvbmZpZygpIHsgcmV0dXJuIG1Db250ZXh0LT5nZXRDb25maWcoKTsgfQogICAgIGlubGluZSBJbnB1dERpc3BhdGNoZXJJbnRlcmZhY2UqIGdldERpc3BhdGNoZXIoKSB7IHJldHVybiBtQ29udGV4dC0+Z2V0RGlzcGF0Y2hlcigpOyB9CiAgICAgaW5saW5lIEV2ZW50SHViSW50ZXJmYWNlKiBnZXRFdmVudEh1YigpIHsgcmV0dXJuIG1Db250ZXh0LT5nZXRFdmVudEh1YigpOyB9CiAKQEAgLTUzOCw2ICs2NDUsMTIgQEAKICAgICBmbG9hdCBtVldoZWVsU2NhbGU7CiAgICAgZmxvYXQgbUhXaGVlbFNjYWxlOwogCisgICAgLy8gVmVsb2NpdHkgY29udHJvbHMgZm9yIG1vdXNlIHBvaW50ZXIgYW5kIHdoZWVsIG1vdmVtZW50cy4KKyAgICAvLyBUaGUgY29udHJvbHMgZm9yIFggYW5kIFkgd2hlZWwgbW92ZW1lbnRzIGFyZSBzZXBhcmF0ZSB0byBrZWVwIHRoZW0gZGVjb3VwbGVkLgorICAgIFZlbG9jaXR5Q29udHJvbCBtUG9pbnRlclZlbG9jaXR5Q29udHJvbDsKKyAgICBWZWxvY2l0eUNvbnRyb2wgbVdoZWVsWFZlbG9jaXR5Q29udHJvbDsKKyAgICBWZWxvY2l0eUNvbnRyb2wgbVdoZWVsWVZlbG9jaXR5Q29udHJvbDsKKwogICAgIHNwPFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlPiBtUG9pbnRlckNvbnRyb2xsZXI7CiAKICAgICBzdHJ1Y3QgTG9ja2VkU3RhdGUgewpAQCAtNjY5LDYgKzc4Miw5IEBACiAgICAgdWludDMyX3QgbVRvdWNoU291cmNlOyAvLyBzb3VyY2VzIHdoZW4gcmVwb3J0aW5nIHRvdWNoIGRhdGEKICAgICB1aW50MzJfdCBtUG9pbnRlclNvdXJjZTsgLy8gc291cmNlcyB3aGVuIHJlcG9ydGluZyBwb2ludGVyIGdlc3R1cmVzCiAKKyAgICAvLyBUaGUgcmVhZGVyJ3MgY29uZmlndXJhdGlvbi4KKyAgICBjb25zdCBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24qIG1Db25maWc7CisKICAgICAvLyBJbW11dGFibGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgogICAgIHN0cnVjdCBQYXJhbWV0ZXJzIHsKICAgICAgICAgZW51bSBEZXZpY2VUeXBlIHsKQEAgLTY4NCw3ICs4MDAsNiBAQAogICAgICAgICBib29sIHVzZUJhZFRvdWNoRmlsdGVyOwogICAgICAgICBib29sIHVzZUp1bXB5VG91Y2hGaWx0ZXI7CiAgICAgICAgIGJvb2wgdXNlQXZlcmFnaW5nVG91Y2hGaWx0ZXI7Ci0gICAgICAgIG5zZWNzX3QgdmlydHVhbEtleVF1aWV0VGltZTsKIAogICAgICAgICBlbnVtIEdlc3R1cmVNb2RlIHsKICAgICAgICAgICAgIEdFU1RVUkVfTU9ERV9QT0lOVEVSLApAQCAtOTY0LDYgKzEwNzksOCBAQAogICAgICAgICAgICAgLy8gRXhhY3RseSBvbmUgZmluZ2VyIGRyYWdnaW5nIGZvbGxvd2luZyBhIHRhcC4KICAgICAgICAgICAgIC8vIFBvaW50ZXIgZm9sbG93cyB0aGUgYWN0aXZlIGZpbmdlci4KICAgICAgICAgICAgIC8vIEVtaXRzIERPV04sIE1PVkUgYW5kIFVQIGV2ZW50cyBhdCB0aGUgcG9pbnRlciBsb2NhdGlvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBEZXRlY3QgZG91YmxlLXRhcHMgd2hlbiB0aGUgZmluZ2VyIGdvZXMgdXAgd2hpbGUgaW4gVEFQX0RSQUcgbW9kZS4KICAgICAgICAgICAgIFRBUF9EUkFHLAogCiAgICAgICAgICAgICAvLyBCdXR0b24gaXMgcHJlc3NlZC4KQEAgLTk3NCw2ICsxMDkxLDggQEAKICAgICAgICAgICAgIC8vIEV4YWN0bHkgb25lIGZpbmdlciwgYnV0dG9uIGlzIG5vdCBwcmVzc2VkLgogICAgICAgICAgICAgLy8gUG9pbnRlciBmb2xsb3dzIHRoZSBhY3RpdmUgZmluZ2VyLgogICAgICAgICAgICAgLy8gRW1pdHMgSE9WRVJfTU9WRSBldmVudHMgYXQgdGhlIHBvaW50ZXIgbG9jYXRpb24uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRGV0ZWN0IHRhcHMgd2hlbiB0aGUgZmluZ2VyIGdvZXMgdXAgd2hpbGUgaW4gSE9WRVIgbW9kZS4KICAgICAgICAgICAgIEhPVkVSLAogCiAgICAgICAgICAgICAvLyBFeGFjdGx5IHR3byBmaW5nZXJzIGJ1dCBuZWl0aGVyIGhhdmUgbW92ZWQgZW5vdWdoIHRvIGNsZWFybHkgaW5kaWNhdGUKQEAgLTEwNDgsMTIgKzExNjcsMjMgQEAKICAgICAgICAgZmxvYXQgcmVmZXJlbmNlR2VzdHVyZVg7ICAvLyByZWZlcmVuY2UgZ2VzdHVyZSBYL1kgY29vcmRpbmF0ZXMgaW4gcGl4ZWxzCiAgICAgICAgIGZsb2F0IHJlZmVyZW5jZUdlc3R1cmVZOwogCisgICAgICAgIC8vIERpc3RhbmNlIHRoYXQgZWFjaCBwb2ludGVyIGhhcyB0cmF2ZWxlZCB3aGljaCBoYXMgbm90IHlldCBiZWVuCisgICAgICAgIC8vIHN1YnN1bWVkIGludG8gdGhlIHJlZmVyZW5jZSBnZXN0dXJlIHBvc2l0aW9uLgorICAgICAgICBCaXRTZXQzMiByZWZlcmVuY2VJZEJpdHM7CisgICAgICAgIHN0cnVjdCBEZWx0YSB7CisgICAgICAgICAgICBmbG9hdCBkeCwgZHk7CisgICAgICAgIH07CisgICAgICAgIERlbHRhIHJlZmVyZW5jZURlbHRhc1tNQVhfUE9JTlRFUl9JRCArIDFdOworCiAgICAgICAgIC8vIERlc2NyaWJlcyBob3cgdG91Y2ggaWRzIGFyZSBtYXBwZWQgdG8gZ2VzdHVyZSBpZHMgZm9yIGZyZWVmb3JtIGdlc3R1cmVzLgogICAgICAgICB1aW50MzJfdCBmcmVlZm9ybVRvdWNoVG9HZXN0dXJlSWRNYXBbTUFYX1BPSU5URVJfSUQgKyAxXTsKIAogICAgICAgICAvLyBBIHZlbG9jaXR5IHRyYWNrZXIgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgdG8gc3dpdGNoIGFjdGl2ZSBwb2ludGVycyBkdXJpbmcgZHJhZ3MuCiAgICAgICAgIFZlbG9jaXR5VHJhY2tlciB2ZWxvY2l0eVRyYWNrZXI7CiAKKyAgICAgICAgLy8gVmVsb2NpdHkgY29udHJvbCBmb3IgcG9pbnRlciBtb3ZlbWVudHMuCisgICAgICAgIFZlbG9jaXR5Q29udHJvbCBwb2ludGVyVmVsb2NpdHlDb250cm9sOworCiAgICAgICAgIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgICAgICBmaXJzdFRvdWNoVGltZSA9IExMT05HX01JTjsKICAgICAgICAgICAgIGFjdGl2ZVRvdWNoSWQgPSAtMTsKQEAgLTEwNjgsNiArMTE5OCw3IEBACiAgICAgICAgICAgICB2ZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKICAgICAgICAgICAgIHJlc2V0VGFwKCk7CiAgICAgICAgICAgICByZXNldFF1aWV0VGltZSgpOworICAgICAgICAgICAgcG9pbnRlclZlbG9jaXR5Q29udHJvbC5yZXNldCgpOwogICAgICAgICB9CiAKICAgICAgICAgdm9pZCByZXNldFRhcCgpIHsKQEAgLTEyMzUsOCArMTM2Niw3IEBACiAgICAgICAgIHVpbnQzMl90IGJ1dHRvbkRvd247CiAgICAgICAgIHVpbnQzMl90IGJ1dHRvblVwOwogCi0gICAgICAgIEFjY3VtdWxhdG9yKCkgOiBzbG90cyhOVUxMKSB7Ci0gICAgICAgICAgICBjbGVhcihmYWxzZSk7CisgICAgICAgIEFjY3VtdWxhdG9yKCkgOiBjdXJyZW50U2xvdCgwKSwgc2xvdHMoTlVMTCksIGJ1dHRvbkRvd24oMCksIGJ1dHRvblVwKDApIHsKICAgICAgICAgfQogCiAgICAgICAgIH5BY2N1bXVsYXRvcigpIHsKQEAgLTEyNDcsMTEgKzEzNzcsMTQgQEAKICAgICAgICAgICAgIHNsb3RzID0gbmV3IFNsb3Rbc2xvdENvdW50XTsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQgY2xlYXIoc2l6ZV90IHNsb3RDb3VudCkgeworICAgICAgICB2b2lkIGNsZWFyU2xvdHMoc2l6ZV90IHNsb3RDb3VudCkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzbG90Q291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgIHNsb3RzW2ldLmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjdXJyZW50U2xvdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNsZWFyQnV0dG9ucygpIHsKICAgICAgICAgICAgIGJ1dHRvbkRvd24gPSAwOwogICAgICAgICAgICAgYnV0dG9uVXAgPSAwOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5jcHAgYi9zZXJ2aWNlcy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5jcHAKaW5kZXggYjg3Yzk4ZC4uYzE4ZWJjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuY3BwCisrKyBiL3NlcnZpY2VzL2lucHV0L1BvaW50ZXJDb250cm9sbGVyLmNwcApAQCAtNjksMTAgKzY5LDEwIEBACiAKICAgICBtTG9ja2VkLmluYWN0aXZpdHlUaW1lb3V0ID0gSU5BQ1RJVklUWV9USU1FT1VUX05PUk1BTDsKIAotICAgIG1Mb2NrZWQucG9pbnRlcklzRmFkaW5nID0gdHJ1ZTsgLy8ga2VlcCB0aGUgcG9pbnRlciBpbml0aWFsbHkgZmFkZWQKKyAgICBtTG9ja2VkLnBvaW50ZXJGYWRlRGlyZWN0aW9uID0gMDsKICAgICBtTG9ja2VkLnBvaW50ZXJYID0gMDsKICAgICBtTG9ja2VkLnBvaW50ZXJZID0gMDsKLSAgICBtTG9ja2VkLnBvaW50ZXJBbHBoYSA9IDAuMGY7CisgICAgbUxvY2tlZC5wb2ludGVyQWxwaGEgPSAwLjBmOyAvLyBwb2ludGVyIGlzIGluaXRpYWxseSBmYWRlZAogICAgIG1Mb2NrZWQucG9pbnRlclNwcml0ZSA9IG1TcHJpdGVDb250cm9sbGVyLT5jcmVhdGVTcHJpdGUoKTsKICAgICBtTG9ja2VkLnBvaW50ZXJJY29uQ2hhbmdlZCA9IGZhbHNlOwogCkBAIC0xOTEsMjMgKzE5MSwzNyBAQAogICAgICpvdXRZID0gbUxvY2tlZC5wb2ludGVyWTsKIH0KIAotdm9pZCBQb2ludGVyQ29udHJvbGxlcjo6ZmFkZSgpIHsKK3ZvaWQgUG9pbnRlckNvbnRyb2xsZXI6OmZhZGUoVHJhbnNpdGlvbiB0cmFuc2l0aW9uKSB7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKIAotICAgIHNlbmRJbW1lZGlhdGVJbmFjdGl2aXR5VGltZW91dExvY2tlZCgpOworICAgIC8vIFJlbW92ZSB0aGUgaW5hY3Rpdml0eSB0aW1lb3V0LCBzaW5jZSB3ZSBhcmUgZmFkaW5nIG5vdy4KKyAgICByZW1vdmVJbmFjdGl2aXR5VGltZW91dExvY2tlZCgpOworCisgICAgLy8gU3RhcnQgZmFkaW5nLgorICAgIGlmICh0cmFuc2l0aW9uID09IFRSQU5TSVRJT05fSU1NRURJQVRFKSB7CisgICAgICAgIG1Mb2NrZWQucG9pbnRlckZhZGVEaXJlY3Rpb24gPSAwOworICAgICAgICBtTG9ja2VkLnBvaW50ZXJBbHBoYSA9IDAuMGY7CisgICAgICAgIHVwZGF0ZVBvaW50ZXJMb2NrZWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTG9ja2VkLnBvaW50ZXJGYWRlRGlyZWN0aW9uID0gLTE7CisgICAgICAgIHN0YXJ0QW5pbWF0aW9uTG9ja2VkKCk7CisgICAgfQogfQogCi12b2lkIFBvaW50ZXJDb250cm9sbGVyOjp1bmZhZGUoKSB7Cit2b2lkIFBvaW50ZXJDb250cm9sbGVyOjp1bmZhZGUoVHJhbnNpdGlvbiB0cmFuc2l0aW9uKSB7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKIAogICAgIC8vIEFsd2F5cyByZXNldCB0aGUgaW5hY3Rpdml0eSB0aW1lci4KICAgICByZXNldEluYWN0aXZpdHlUaW1lb3V0TG9ja2VkKCk7CiAKLSAgICAvLyBVbmZhZGUgaW1tZWRpYXRlbHkgaWYgbmVlZGVkLgotICAgIGlmIChtTG9ja2VkLnBvaW50ZXJJc0ZhZGluZykgewotICAgICAgICBtTG9ja2VkLnBvaW50ZXJJc0ZhZGluZyA9IGZhbHNlOworICAgIC8vIFN0YXJ0IHVuZmFkaW5nLgorICAgIGlmICh0cmFuc2l0aW9uID09IFRSQU5TSVRJT05fSU1NRURJQVRFKSB7CisgICAgICAgIG1Mb2NrZWQucG9pbnRlckZhZGVEaXJlY3Rpb24gPSAwOwogICAgICAgICBtTG9ja2VkLnBvaW50ZXJBbHBoYSA9IDEuMGY7CiAgICAgICAgIHVwZGF0ZVBvaW50ZXJMb2NrZWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTG9ja2VkLnBvaW50ZXJGYWRlRGlyZWN0aW9uID0gMTsKKyAgICAgICAgc3RhcnRBbmltYXRpb25Mb2NrZWQoKTsKICAgICB9CiB9CiAKQEAgLTQwMSwxMCArNDE1LDIwIEBACiAgICAgbnNlY3NfdCBmcmFtZURlbGF5ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpIC0gbUxvY2tlZC5hbmltYXRpb25UaW1lOwogCiAgICAgLy8gQW5pbWF0ZSBwb2ludGVyIGZhZGUuCi0gICAgaWYgKG1Mb2NrZWQucG9pbnRlcklzRmFkaW5nKSB7CisgICAgaWYgKG1Mb2NrZWQucG9pbnRlckZhZGVEaXJlY3Rpb24gPCAwKSB7CiAgICAgICAgIG1Mb2NrZWQucG9pbnRlckFscGhhIC09IGZsb2F0KGZyYW1lRGVsYXkpIC8gUE9JTlRFUl9GQURFX0RVUkFUSU9OOwotICAgICAgICBpZiAobUxvY2tlZC5wb2ludGVyQWxwaGEgPD0gMCkgewotICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyQWxwaGEgPSAwOworICAgICAgICBpZiAobUxvY2tlZC5wb2ludGVyQWxwaGEgPD0gMC4wZikgeworICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyQWxwaGEgPSAwLjBmOworICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyRmFkZURpcmVjdGlvbiA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBrZWVwQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVQb2ludGVyTG9ja2VkKCk7CisgICAgfSBlbHNlIGlmIChtTG9ja2VkLnBvaW50ZXJGYWRlRGlyZWN0aW9uID4gMCkgeworICAgICAgICBtTG9ja2VkLnBvaW50ZXJBbHBoYSArPSBmbG9hdChmcmFtZURlbGF5KSAvIFBPSU5URVJfRkFERV9EVVJBVElPTjsKKyAgICAgICAgaWYgKG1Mb2NrZWQucG9pbnRlckFscGhhID49IDEuMGYpIHsKKyAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlckFscGhhID0gMS4wZjsKKyAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlckZhZGVEaXJlY3Rpb24gPSAwOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAga2VlcEFuaW1hdGluZyA9IHRydWU7CiAgICAgICAgIH0KQEAgLTQzMiwxMiArNDU2LDcgQEAKIH0KIAogdm9pZCBQb2ludGVyQ29udHJvbGxlcjo6ZG9JbmFjdGl2aXR5VGltZW91dCgpIHsKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotCi0gICAgaWYgKCFtTG9ja2VkLnBvaW50ZXJJc0ZhZGluZykgewotICAgICAgICBtTG9ja2VkLnBvaW50ZXJJc0ZhZGluZyA9IHRydWU7Ci0gICAgICAgIHN0YXJ0QW5pbWF0aW9uTG9ja2VkKCk7Ci0gICAgfQorICAgIGZhZGUoVFJBTlNJVElPTl9HUkFEVUFMKTsKIH0KIAogdm9pZCBQb2ludGVyQ29udHJvbGxlcjo6c3RhcnRBbmltYXRpb25Mb2NrZWQoKSB7CkBAIC00NTYsOSArNDc1LDggQEAKICAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZURlbGF5ZWQodGltZW91dCwgbUhhbmRsZXIsIE1TR19JTkFDVElWSVRZX1RJTUVPVVQpOwogfQogCi12b2lkIFBvaW50ZXJDb250cm9sbGVyOjpzZW5kSW1tZWRpYXRlSW5hY3Rpdml0eVRpbWVvdXRMb2NrZWQoKSB7Cit2b2lkIFBvaW50ZXJDb250cm9sbGVyOjpyZW1vdmVJbmFjdGl2aXR5VGltZW91dExvY2tlZCgpIHsKICAgICBtTG9vcGVyLT5yZW1vdmVNZXNzYWdlcyhtSGFuZGxlciwgTVNHX0lOQUNUSVZJVFlfVElNRU9VVCk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2UobUhhbmRsZXIsIE1TR19JTkFDVElWSVRZX1RJTUVPVVQpOwogfQogCiB2b2lkIFBvaW50ZXJDb250cm9sbGVyOjp1cGRhdGVQb2ludGVyTG9ja2VkKCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuaCBiL3NlcnZpY2VzL2lucHV0L1BvaW50ZXJDb250cm9sbGVyLmgKaW5kZXggYzc0MzVlZS4uMWMyMWRiMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuaAorKysgYi9zZXJ2aWNlcy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5oCkBAIC02NCwxNCArNjQsMjEgQEAKICAgICAvKiBHZXRzIHRoZSBhYnNvbHV0ZSBsb2NhdGlvbiBvZiB0aGUgcG9pbnRlci4gKi8KICAgICB2aXJ0dWFsIHZvaWQgZ2V0UG9zaXRpb24oZmxvYXQqIG91dFgsIGZsb2F0KiBvdXRZKSBjb25zdCA9IDA7CiAKKyAgICBlbnVtIFRyYW5zaXRpb24geworICAgICAgICAvLyBGYWRlL3VuZmFkZSBpbW1lZGlhdGVseS4KKyAgICAgICAgVFJBTlNJVElPTl9JTU1FRElBVEUsCisgICAgICAgIC8vIEZhZGUvdW5mYWRlIGdyYWR1YWxseS4KKyAgICAgICAgVFJBTlNJVElPTl9HUkFEVUFMLAorICAgIH07CisKICAgICAvKiBGYWRlcyB0aGUgcG9pbnRlciBvdXQgbm93LiAqLwotICAgIHZpcnR1YWwgdm9pZCBmYWRlKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBmYWRlKFRyYW5zaXRpb24gdHJhbnNpdGlvbikgPSAwOwogCiAgICAgLyogTWFrZXMgdGhlIHBvaW50ZXIgdmlzaWJsZSBpZiBpdCBoYXMgZmFkZWQgb3V0LgogICAgICAqIFRoZSBwb2ludGVyIG5ldmVyIHVuZmFkZXMgaXRzZWxmIGF1dG9tYXRpY2FsbHkuICBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZAogICAgICAqIGJ5IHRoZSBjbGllbnQgd2hlbmV2ZXIgdGhlIHBvaW50ZXIgaXMgbW92ZWQgb3IgYSBidXR0b24gaXMgcHJlc3NlZCBhbmQgaXQKICAgICAgKiB3YW50cyB0byBlbnN1cmUgdGhhdCB0aGUgcG9pbnRlciBiZWNvbWVzIHZpc2libGUgYWdhaW4uICovCi0gICAgdmlydHVhbCB2b2lkIHVuZmFkZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgdW5mYWRlKFRyYW5zaXRpb24gdHJhbnNpdGlvbikgPSAwOwogCiAgICAgZW51bSBQcmVzZW50YXRpb24gewogICAgICAgICAvLyBTaG93IHRoZSBtb3VzZSBwb2ludGVyLgpAQCAtMTg3LDggKzE5NCw4IEBACiAgICAgdmlydHVhbCBpbnQzMl90IGdldEJ1dHRvblN0YXRlKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHkpOwogICAgIHZpcnR1YWwgdm9pZCBnZXRQb3NpdGlvbihmbG9hdCogb3V0WCwgZmxvYXQqIG91dFkpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBmYWRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVuZmFkZSgpOworICAgIHZpcnR1YWwgdm9pZCBmYWRlKFRyYW5zaXRpb24gdHJhbnNpdGlvbik7CisgICAgdmlydHVhbCB2b2lkIHVuZmFkZShUcmFuc2l0aW9uIHRyYW5zaXRpb24pOwogCiAgICAgdmlydHVhbCB2b2lkIHNldFByZXNlbnRhdGlvbihQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U3BvdHMoU3BvdEdlc3R1cmUgc3BvdEdlc3R1cmUsCkBAIC0yNTAsNyArMjU3LDcgQEAKICAgICAgICAgUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbjsKICAgICAgICAgYm9vbCBwcmVzZW50YXRpb25DaGFuZ2VkOwogCi0gICAgICAgIGJvb2wgcG9pbnRlcklzRmFkaW5nOworICAgICAgICBpbnQzMl90IHBvaW50ZXJGYWRlRGlyZWN0aW9uOwogICAgICAgICBmbG9hdCBwb2ludGVyWDsKICAgICAgICAgZmxvYXQgcG9pbnRlclk7CiAgICAgICAgIGZsb2F0IHBvaW50ZXJBbHBoYTsKQEAgLTI3NCw3ICsyODEsNyBAQAogICAgIHZvaWQgc3RhcnRBbmltYXRpb25Mb2NrZWQoKTsKIAogICAgIHZvaWQgcmVzZXRJbmFjdGl2aXR5VGltZW91dExvY2tlZCgpOwotICAgIHZvaWQgc2VuZEltbWVkaWF0ZUluYWN0aXZpdHlUaW1lb3V0TG9ja2VkKCk7CisgICAgdm9pZCByZW1vdmVJbmFjdGl2aXR5VGltZW91dExvY2tlZCgpOwogICAgIHZvaWQgdXBkYXRlUG9pbnRlckxvY2tlZCgpOwogCiAgICAgU3BvdCogZ2V0U3BvdExvY2tlZCh1aW50MzJfdCBpZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9pbnB1dC90ZXN0cy9JbnB1dERpc3BhdGNoZXJfdGVzdC5jcHAgYi9zZXJ2aWNlcy9pbnB1dC90ZXN0cy9JbnB1dERpc3BhdGNoZXJfdGVzdC5jcHAKaW5kZXggM2RiMzQ3My4uOGRmYjQ0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvaW5wdXQvdGVzdHMvSW5wdXREaXNwYXRjaGVyX3Rlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2lucHV0L3Rlc3RzL0lucHV0RGlzcGF0Y2hlcl90ZXN0LmNwcApAQCAtMzUsNiArMzUsOCBAQAogLy8gLS0tIEZha2VJbnB1dERpc3BhdGNoZXJQb2xpY3kgLS0tCiAKIGNsYXNzIEZha2VJbnB1dERpc3BhdGNoZXJQb2xpY3kgOiBwdWJsaWMgSW5wdXREaXNwYXRjaGVyUG9saWN5SW50ZXJmYWNlIHsKKyAgICBJbnB1dERpc3BhdGNoZXJDb25maWd1cmF0aW9uIG1Db25maWc7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GYWtlSW5wdXREaXNwYXRjaGVyUG9saWN5KCkgewogICAgIH0KQEAgLTU1LDE2ICs1NywxMiBAQAogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlJbnB1dENoYW5uZWxCcm9rZW4oY29uc3Qgc3A8SW5wdXRXaW5kb3dIYW5kbGU+JiBpbnB1dFdpbmRvd0hhbmRsZSkgewogICAgIH0KIAotICAgIHZpcnR1YWwgbnNlY3NfdCBnZXRLZXlSZXBlYXRUaW1lb3V0KCkgewotICAgICAgICByZXR1cm4gNTAwICogMTAwMDAwMExMOworICAgIHZpcnR1YWwgdm9pZCBnZXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbihJbnB1dERpc3BhdGNoZXJDb25maWd1cmF0aW9uKiBvdXRDb25maWcpIHsKKyAgICAgICAgKm91dENvbmZpZyA9IG1Db25maWc7CiAgICAgfQogCi0gICAgdmlydHVhbCBuc2Vjc190IGdldEtleVJlcGVhdERlbGF5KCkgewotICAgICAgICByZXR1cm4gNTAgKiAxMDAwMDAwTEw7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQzMl90IGdldE1heEV2ZW50c1BlclNlY29uZCgpIHsKLSAgICAgICAgcmV0dXJuIDYwOworICAgIHZpcnR1YWwgYm9vbCBpc0tleVJlcGVhdEVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHZpcnR1YWwgYm9vbCBmaWx0ZXJJbnB1dEV2ZW50KGNvbnN0IElucHV0RXZlbnQqIGlucHV0RXZlbnQsIHVpbnQzMl90IHBvbGljeUZsYWdzKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9pbnB1dC90ZXN0cy9JbnB1dFJlYWRlcl90ZXN0LmNwcCBiL3NlcnZpY2VzL2lucHV0L3Rlc3RzL0lucHV0UmVhZGVyX3Rlc3QuY3BwCmluZGV4IDFhYjJhM2UuLjAwYjQyMjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2lucHV0L3Rlc3RzL0lucHV0UmVhZGVyX3Rlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2lucHV0L3Rlc3RzL0lucHV0UmVhZGVyX3Rlc3QuY3BwCkBAIC05MiwxMCArOTIsMTAgQEAKICAgICAgICAgKm91dFkgPSAwOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBmYWRlKCkgeworICAgIHZpcnR1YWwgdm9pZCBmYWRlKFRyYW5zaXRpb24gdHJhbnNpdGlvbikgewogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCB1bmZhZGUoKSB7CisgICAgdmlydHVhbCB2b2lkIHVuZmFkZShUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlc2VudGF0aW9uKFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKQEAgLTEyMCwxNyArMTIwLDE0IEBACiAgICAgfTsKIAogICAgIEtleWVkVmVjdG9yPGludDMyX3QsIERpc3BsYXlJbmZvPiBtRGlzcGxheUluZm9zOwotICAgIGJvb2wgbUZpbHRlclRvdWNoRXZlbnRzOwotICAgIGJvb2wgbUZpbHRlckp1bXB5VG91Y2hFdmVudHM7Ci0gICAgVmVjdG9yPFN0cmluZzg+IG1FeGNsdWRlZERldmljZU5hbWVzOworICAgIElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiBtQ29uZmlnOwogICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNwPEZha2VQb2ludGVyQ29udHJvbGxlcj4gPiBtUG9pbnRlckNvbnRyb2xsZXJzOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RmFrZUlucHV0UmVhZGVyUG9saWN5KCkgeyB9CiAKIHB1YmxpYzoKLSAgICBGYWtlSW5wdXRSZWFkZXJQb2xpY3koKSA6Ci0gICAgICAgICAgICBtRmlsdGVyVG91Y2hFdmVudHMoZmFsc2UpLCBtRmlsdGVySnVtcHlUb3VjaEV2ZW50cyhmYWxzZSkgeworICAgIEZha2VJbnB1dFJlYWRlclBvbGljeSgpIHsKICAgICB9CiAKICAgICB2b2lkIHJlbW92ZURpc3BsYXlJbmZvKGludDMyX3QgZGlzcGxheUlkKSB7CkBAIC0xNDgsMTEgKzE0NSwxMSBAQAogICAgIH0KIAogICAgIHZvaWQgc2V0RmlsdGVyVG91Y2hFdmVudHMoYm9vbCBlbmFibGVkKSB7Ci0gICAgICAgIG1GaWx0ZXJUb3VjaEV2ZW50cyA9IGVuYWJsZWQ7CisgICAgICAgIG1Db25maWcuZmlsdGVyVG91Y2hFdmVudHMgPSBlbmFibGVkOwogICAgIH0KIAogICAgIHZvaWQgc2V0RmlsdGVySnVtcHlUb3VjaEV2ZW50cyhib29sIGVuYWJsZWQpIHsKLSAgICAgICAgbUZpbHRlckp1bXB5VG91Y2hFdmVudHMgPSBlbmFibGVkOworICAgICAgICBtQ29uZmlnLmZpbHRlckp1bXB5VG91Y2hFdmVudHMgPSBlbmFibGVkOwogICAgIH0KIAogICAgIHZpcnR1YWwgbnNlY3NfdCBnZXRWaXJ0dWFsS2V5UXVpZXRUaW1lKCkgewpAQCAtMTYwLDcgKzE1Nyw3IEBACiAgICAgfQogCiAgICAgdm9pZCBhZGRFeGNsdWRlZERldmljZU5hbWUoY29uc3QgU3RyaW5nOCYgZGV2aWNlTmFtZSkgewotICAgICAgICBtRXhjbHVkZWREZXZpY2VOYW1lcy5wdXNoKGRldmljZU5hbWUpOworICAgICAgICBtQ29uZmlnLmV4Y2x1ZGVkRGV2aWNlTmFtZXMucHVzaChkZXZpY2VOYW1lKTsKICAgICB9CiAKICAgICB2b2lkIHNldFBvaW50ZXJDb250cm9sbGVyKGludDMyX3QgZGV2aWNlSWQsIGNvbnN0IHNwPEZha2VQb2ludGVyQ29udHJvbGxlcj4mIGNvbnRyb2xsZXIpIHsKQEAgLTE4NywxNiArMTg0LDggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBmaWx0ZXJUb3VjaEV2ZW50cygpIHsKLSAgICAgICAgcmV0dXJuIG1GaWx0ZXJUb3VjaEV2ZW50czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZmlsdGVySnVtcHlUb3VjaEV2ZW50cygpIHsKLSAgICAgICAgcmV0dXJuIG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBnZXRFeGNsdWRlZERldmljZU5hbWVzKFZlY3RvcjxTdHJpbmc4PiYgb3V0RXhjbHVkZWREZXZpY2VOYW1lcykgewotICAgICAgICBvdXRFeGNsdWRlZERldmljZU5hbWVzLmFwcGVuZFZlY3RvcihtRXhjbHVkZWREZXZpY2VOYW1lcyk7CisgICAgdmlydHVhbCB2b2lkIGdldFJlYWRlckNvbmZpZ3VyYXRpb24oSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uKiBvdXRDb25maWcpIHsKKyAgICAgICAgKm91dENvbmZpZyA9IG1Db25maWc7CiAgICAgfQogCiAgICAgdmlydHVhbCBzcDxQb2ludGVyQ29udHJvbGxlckludGVyZmFjZT4gb2J0YWluUG9pbnRlckNvbnRyb2xsZXIoaW50MzJfdCBkZXZpY2VJZCkgewpAQCAtNjQwLDggKzYyOSw4IEBACiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWRkRXhjbHVkZWREZXZpY2UoY29uc3QgY2hhciogZGV2aWNlTmFtZSkgewotICAgICAgICBtRXhjbHVkZWREZXZpY2VzLmFkZChTdHJpbmc4KGRldmljZU5hbWUpKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXhjbHVkZWREZXZpY2VzKGNvbnN0IFZlY3RvcjxTdHJpbmc4PiYgZGV2aWNlcykgeworICAgICAgICBtRXhjbHVkZWREZXZpY2VzID0gZGV2aWNlczsKICAgICB9CiAKICAgICB2aXJ0dWFsIHNpemVfdCBnZXRFdmVudHMoaW50IHRpbWVvdXRNaWxsaXMsIFJhd0V2ZW50KiBidWZmZXIsIHNpemVfdCBidWZmZXJTaXplKSB7CkBAIC03MzksNiArNzI4LDkgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIGR1bXApIHsKICAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVvcGVuRGV2aWNlcygpIHsKKyAgICB9CiB9OwogCiAKQEAgLTc1MSw2ICs3NDMsOCBAQAogICAgIGludDMyX3QgbUdsb2JhbE1ldGFTdGF0ZTsKICAgICBib29sIG1VcGRhdGVHbG9iYWxNZXRhU3RhdGVXYXNDYWxsZWQ7CiAKKyAgICBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24gbUNvbmZpZzsKKwogcHVibGljOgogICAgIEZha2VJbnB1dFJlYWRlckNvbnRleHQoY29uc3Qgc3A8RXZlbnRIdWJJbnRlcmZhY2U+JiBldmVudEh1YiwKICAgICAgICAgICAgIGNvbnN0IHNwPElucHV0UmVhZGVyUG9saWN5SW50ZXJmYWNlPiYgcG9saWN5LApAQCAtNzg4LDYgKzc4MiwxMSBAQAogICAgICAgICByZXR1cm4gbVBvbGljeS5nZXQoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIGNvbnN0IElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiogZ2V0Q29uZmlnKCkgeworICAgICAgICBtUG9saWN5LT5nZXRSZWFkZXJDb25maWd1cmF0aW9uKCZtQ29uZmlnKTsKKyAgICAgICAgcmV0dXJuICZtQ29uZmlnOworICAgIH0KKwogICAgIHZpcnR1YWwgSW5wdXREaXNwYXRjaGVySW50ZXJmYWNlKiBnZXREaXNwYXRjaGVyKCkgewogICAgICAgICByZXR1cm4gbURpc3BhdGNoZXIuZ2V0KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQXBwV2lkZ2V0U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQXBwV2lkZ2V0U2VydmljZS5qYXZhCmluZGV4IGMwM2I5OTQuLmZkNTAyZDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5TaW1wbGVMb2c7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9CYWNrdXBNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQmFja3VwTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA3N2MyYTQ0Li43YzZkM2MxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9CYWNrdXBNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0JhY2t1cE1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTM5LDYgKzM5LDggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGVsZXRlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlSW5zdGFsbE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKQEAgLTQ2LDYgKzQ4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtNjYsOCArNjksNiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RyaW5nQnVpbGRlclByaW50ZXI7CiAKLWltcG9ydCBsaWJjb3JlLmlvLkxpYmNvcmU7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5iYWNrdXAuQmFja3VwQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmJhY2t1cC5JQmFja3VwVHJhbnNwb3J0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmJhY2t1cC5Mb2NhbFRyYW5zcG9ydDsKQEAgLTc2LDEyICs3NywxNiBAQAogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTQwMCw2ICs0MDUsMTMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBNU0dfUlVOX0ZVTExfUkVTVE9SRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGdWxsUmVzdG9yZVBhcmFtcyBwYXJhbXMgPSAoRnVsbFJlc3RvcmVQYXJhbXMpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAobmV3IFBlcmZvcm1GdWxsUmVzdG9yZVRhc2socGFyYW1zLmZkLCBwYXJhbXMub2JzZXJ2ZXIsIHBhcmFtcy5sYXRjaCkpLnJ1bigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlIE1TR19SVU5fQ0xFQVI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ2xlYXJQYXJhbXMgcGFyYW1zID0gKENsZWFyUGFyYW1zKW1zZy5vYmo7CkBAIC0xMjM4LDcgKzEyNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYXdhaXRpbmcgYWdlbnQgZm9yICIgKyBhcHApOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3M7IHdhaXQgZm9yIHRoZSBhZ2VudCB0byBhcnJpdmUKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSB3YWl0IDEwIHNlY29uZHMgZm9yIHRoZSBjbGVhciBkYXRhIHRvIGhhcHBlbgorICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHdhaXQgMTAgc2Vjb25kcyBmb3IgdGhlIGJpbmQgdG8gaGFwcGVuCiAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZW91dE1hcmsgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVRfSU5URVJWQUw7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtQ29ubmVjdGluZyAmJiBtQ29ubmVjdGVkQWdlbnQgPT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IHRpbWVvdXRNYXJrKSkgewpAQCAtMTY3OSw2ICsxNjkxLDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgZmluYWwgTGlzdDxQYWNrYWdlSW5mbz4gcGFja2FnZXNUb0JhY2t1cDsKIAorICAgICAgICAgICAgU2xvZy5pKFRBRywgIi0tLSBQZXJmb3JtaW5nIGZ1bGwtZGF0YXNldCByZXN0b3JlIC0tLSIpOwogICAgICAgICAgICAgc2VuZFN0YXJ0QmFja3VwKCk7CiAKICAgICAgICAgICAgIC8vIGRvQWxsQXBwcyBzdXBlcnNlZGVzIHRoZSBwYWNrYWdlIHNldCBpZiBhbnkKQEAgLTE2OTcsNiArMTcxMCwxNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gQ3VsbCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlIGluZGljYXRlZCB0aGF0IGJhY2t1cHMgYXJlIG5vdCBwZXJtaXR0ZWQuCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzVG9CYWNrdXAuc2l6ZSgpOyApIHsKKyAgICAgICAgICAgICAgICBQYWNrYWdlSW5mbyBpbmZvID0gcGFja2FnZXNUb0JhY2t1cC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKChpbmZvLmFwcGxpY2F0aW9uSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX0FMTE9XX0JBQ0tVUCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlc1RvQmFja3VwLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBOb3cgYmFjayB1cCB0aGUgYXBwIGRhdGEgdmlhIHRoZSBhZ2VudCBtZWNoYW5pc20KICAgICAgICAgICAgIFBhY2thZ2VJbmZvIHBrZyA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTc4MSw3ICsxODA0LDkgQEAKICAgICAgICAgICAgIC8vIFZlcnNpb24gMToKICAgICAgICAgICAgIC8vICAgICBwYWNrYWdlIG5hbWUKICAgICAgICAgICAgIC8vICAgICBwYWNrYWdlJ3MgdmVyc2lvbkNvZGUKLSAgICAgICAgICAgIC8vICAgICBib29sZWFuOiAiMSIgaWYgYXJjaGl2ZSBpbmNsdWRlcyAuYXBrLCAiMCIgb3RoZXJ3aXNlCisgICAgICAgICAgICAvLyAgICAgcGxhdGZvcm0gdmVyc2lvbkNvZGUKKyAgICAgICAgICAgIC8vICAgICBnZXRJbnN0YWxsZXJQYWNrYWdlTmFtZSgpIGZvciB0aGlzIHBhY2thZ2UgKG1heWJlIGVtcHR5KQorICAgICAgICAgICAgLy8gICAgIGJvb2xlYW46ICIxIiBpZiBhcmNoaXZlIGluY2x1ZGVzIC5hcGs7IGFueSBvdGhlciBzdHJpbmcgbWVhbnMgbm90CiAgICAgICAgICAgICAvLyAgICAgbnVtYmVyIG9mIHNpZ25hdHVyZXMgPT0gTgogICAgICAgICAgICAgLy8gTio6ICAgIHNpZ25hdHVyZSBieXRlIGFycmF5IGluIGFzY2lpIGZvcm1hdCBwZXIgU2lnbmF0dXJlLnRvQ2hhcnNTdHJpbmcoKQogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoNDA5Nik7CkBAIC0xNzkwLDYgKzE4MTUsMTEgQEAKICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbihJbnRlZ2VyLnRvU3RyaW5nKEJBQ0tVUF9NQU5JRkVTVF9WRVJTSU9OKSk7CiAgICAgICAgICAgICBwcmludGVyLnByaW50bG4ocGtnLnBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbihJbnRlZ2VyLnRvU3RyaW5nKHBrZy52ZXJzaW9uQ29kZSkpOworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKEludGVnZXIudG9TdHJpbmcoQnVpbGQuVkVSU0lPTi5TREtfSU5UKSk7CisKKyAgICAgICAgICAgIFN0cmluZyBpbnN0YWxsZXJOYW1lID0gbVBhY2thZ2VNYW5hZ2VyLmdldEluc3RhbGxlclBhY2thZ2VOYW1lKHBrZy5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKGluc3RhbGxlck5hbWUgIT0gbnVsbCkgPyBpbnN0YWxsZXJOYW1lIDogIiIpOworCiAgICAgICAgICAgICBwcmludGVyLnByaW50bG4od2l0aEFwayA/ICIxIiA6ICIwIik7CiAgICAgICAgICAgICBpZiAocGtnLnNpZ25hdHVyZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiMCIpOwpAQCAtMTgwMSw3ICsxODMxLDYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtYW5pZmVzdEZpbGUpOwotICAgICAgICAgICAgTGliY29yZS5vcy5mdHJ1bmNhdGUob3V0c3RyZWFtLmdldEZEKCksIDApOwogICAgICAgICAgICAgb3V0c3RyZWFtLndyaXRlKGJ1aWxkZXIudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKICAgICAgICAgICAgIG91dHN0cmVhbS5jbG9zZSgpOwogICAgICAgICB9CkBAIC0xODY0LDYgKzE4OTMsOTgyIEBACiAgICAgfQogCiAKKyAgICAvLyAtLS0tLSBGdWxsIHJlc3RvcmUgZnJvbSBhIGZpbGUvc29ja2V0IC0tLS0tCisKKyAgICAvLyBEZXNjcmlwdGlvbiBvZiBhIGZpbGUgaW4gdGhlIHJlc3RvcmUgZGF0YXN0cmVhbQorICAgIHN0YXRpYyBjbGFzcyBGaWxlTWV0YWRhdGEgeworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWU7ICAgICAgICAgICAgIC8vIG5hbWUgb2YgdGhlIG93bmluZyBhcHAKKyAgICAgICAgU3RyaW5nIGluc3RhbGxlclBhY2thZ2VOYW1lOyAgICAvLyBuYW1lIG9mIHRoZSBtYXJrZXQtdHlwZSBhcHAgdGhhdCBpbnN0YWxsZWQgdGhlIG93bmVyCisgICAgICAgIGludCB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiBGdWxsQmFja3VwLlRZUEVfRElSRUNUT1JZCisgICAgICAgIFN0cmluZyBkb21haW47ICAgICAgICAgICAgICAgICAgLy8gZS5nLiBGdWxsQmFja3VwLkRBVEFCQVNFX1RSRUVfVE9LRU4KKyAgICAgICAgU3RyaW5nIHBhdGg7ICAgICAgICAgICAgICAgICAgICAvLyBzdWJwYXRoIHdpdGhpbiB0aGUgc2VtYW50aWMgZG9tYWluCisgICAgICAgIGxvbmcgbW9kZTsgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiAwNjY2IChhY3R1YWxseSBpbnQpCisgICAgICAgIGxvbmcgbXRpbWU7ICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBtb2QgdGltZSwgVVRDIHRpbWVfdCAoYWN0dWFsbHkgaW50KQorICAgICAgICBsb25nIHNpemU7ICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGVzIG9mIGNvbnRlbnQKKyAgICB9CisKKyAgICBlbnVtIFJlc3RvcmVQb2xpY3kgeworICAgICAgICBJR05PUkUsCisgICAgICAgIEFDQ0VQVCwKKyAgICAgICAgQUNDRVBUX0lGX0FQSworICAgIH0KKworICAgIGNsYXNzIFBlcmZvcm1GdWxsUmVzdG9yZVRhc2sgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG1JbnB1dEZpbGU7CisgICAgICAgIElGdWxsQmFja3VwUmVzdG9yZU9ic2VydmVyIG1PYnNlcnZlcjsKKyAgICAgICAgQXRvbWljQm9vbGVhbiBtTGF0Y2hPYmplY3Q7CisgICAgICAgIElCYWNrdXBBZ2VudCBtQWdlbnQ7CisgICAgICAgIFN0cmluZyBtQWdlbnRQYWNrYWdlOworICAgICAgICBBcHBsaWNhdGlvbkluZm8gbVRhcmdldEFwcDsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBtUGlwZXMgPSBudWxsOworCisgICAgICAgIC8vIHBvc3NpYmxlIGhhbmRsaW5nIHN0YXRlcyBmb3IgYSBnaXZlbiBwYWNrYWdlIGluIHRoZSByZXN0b3JlIGRhdGFzZXQKKyAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFJlc3RvcmVQb2xpY3k+IG1QYWNrYWdlUG9saWNpZXMKKyAgICAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVzdG9yZVBvbGljeT4oKTsKKworICAgICAgICAvLyBpbnN0YWxsZXIgcGFja2FnZSBuYW1lcyBmb3IgZWFjaCBlbmNvdW50ZXJlZCBhcHAsIGRlcml2ZWQgZnJvbSB0aGUgbWFuaWZlc3RzCisgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1QYWNrYWdlSW5zdGFsbGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgICAgIC8vIFNpZ25hdHVyZXMgZm9yIGEgZ2l2ZW4gcGFja2FnZSBmb3VuZCBpbiBpdHMgbWFuaWZlc3QgZmlsZQorICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZywgU2lnbmF0dXJlW10+IG1NYW5pZmVzdFNpZ25hdHVyZXMKKyAgICAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2lnbmF0dXJlW10+KCk7CisKKyAgICAgICAgLy8gUGFja2FnZXMgd2UndmUgYWxyZWFkeSB3aXBlZCBkYXRhIG9uIHdoZW4gcmVzdG9yaW5nIHRoZWlyIGZpcnN0IGZpbGUKKyAgICAgICAgZmluYWwgSGFzaFNldDxTdHJpbmc+IG1DbGVhcmVkUGFja2FnZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKyAgICAgICAgUGVyZm9ybUZ1bGxSZXN0b3JlVGFzayhQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCwgSUZ1bGxCYWNrdXBSZXN0b3JlT2JzZXJ2ZXIgb2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgQXRvbWljQm9vbGVhbiBsYXRjaCkgeworICAgICAgICAgICAgbUlucHV0RmlsZSA9IGZkOworICAgICAgICAgICAgbU9ic2VydmVyID0gb2JzZXJ2ZXI7CisgICAgICAgICAgICBtTGF0Y2hPYmplY3QgPSBsYXRjaDsKKyAgICAgICAgICAgIG1BZ2VudCA9IG51bGw7CisgICAgICAgICAgICBtQWdlbnRQYWNrYWdlID0gbnVsbDsKKyAgICAgICAgICAgIG1UYXJnZXRBcHAgPSBudWxsOworCisgICAgICAgICAgICAvLyBXaGljaCBwYWNrYWdlcyB3ZSd2ZSBhbHJlYWR5IHdpcGVkIGRhdGEgb24uICBXZSBwcmVwb3B1bGF0ZSB0aGlzCisgICAgICAgICAgICAvLyB3aXRoIGEgd2hpdGVsaXN0IG9mIHBhY2thZ2VzIGtub3duIHRvIGJlIHVuY2xlYXJhYmxlLgorICAgICAgICAgICAgbUNsZWFyZWRQYWNrYWdlcy5hZGQoImFuZHJvaWQiKTsKKyAgICAgICAgICAgIG1DbGVhcmVkUGFja2FnZXMuYWRkKCJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFJlc3RvcmVGaWxlUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgICAgICBJQmFja3VwQWdlbnQgbUFnZW50OworICAgICAgICAgICAgRmlsZU1ldGFkYXRhIG1JbmZvOworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgbVNvY2tldDsKKyAgICAgICAgICAgIGludCBtVG9rZW47CisKKyAgICAgICAgICAgIFJlc3RvcmVGaWxlUnVubmFibGUoSUJhY2t1cEFnZW50IGFnZW50LCBGaWxlTWV0YWRhdGEgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3Igc29ja2V0LCBpbnQgdG9rZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgbUFnZW50ID0gYWdlbnQ7CisgICAgICAgICAgICAgICAgbUluZm8gPSBpbmZvOworICAgICAgICAgICAgICAgIG1Ub2tlbiA9IHRva2VuOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHN0cmljdGx5IGZvciBwcm9jZXNzLWxvY2FsIGJpbmRlciBpbnZvY2F0aW9ucy4gIFRoZQorICAgICAgICAgICAgICAgIC8vIHNlbWFudGljcyBvZiBQYXJjZWxGaWxlRGVzY3JpcHRvciBkaWZmZXIgaW4gdGhpcyBjYXNlOyBpbiBwYXJ0aWN1bGFyLCB3ZQorICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBhdXRvbWF0aWNhbGx5IGdldCBhICdkdXAnZWQgZGVzY3JpcHRvciB0aGF0IHdlIGNhbiBjYW4gY29udGludWUKKyAgICAgICAgICAgICAgICAvLyB0byB1c2UgYXN5bmNocm9ub3VzbHkgZnJvbSB0aGUgY2FsbGVyLiAgU28sIHdlIG1ha2Ugc3VyZSB0byBkdXAgaXQgb3Vyc2VsdmVzCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHByb2NlZWRpbmcgdG8gZG8gdGhlIHJlc3RvcmUuCisgICAgICAgICAgICAgICAgbVNvY2tldCA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLmR1cChzb2NrZXQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1BZ2VudC5kb1Jlc3RvcmVGaWxlKG1Tb2NrZXQsIG1JbmZvLnNpemUsIG1JbmZvLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluZm8uZG9tYWluLCBtSW5mby5wYXRoLCBtSW5mby5tb2RlLCBtSW5mby5tdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG9rZW4sIG1CYWNrdXBNYW5hZ2VyQmluZGVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBoYXBwZW5zOyB0aGlzIGlzIHVzZWQgc3RyaWN0bHkgZm9yIGxvY2FsIGJpbmRlciBjYWxscworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAiLS0tIFBlcmZvcm1pbmcgZnVsbC1kYXRhc2V0IHJlc3RvcmUgLS0tIik7CisgICAgICAgICAgICBzZW5kU3RhcnRSZXN0b3JlKCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzMyICogMTAyNF07CisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtSW5wdXRGaWxlLmdldEZpbGVEZXNjcmlwdG9yKCkpOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBkaWRSZXN0b3JlOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgZGlkUmVzdG9yZSA9IHJlc3RvcmVPbmVGaWxlKGluc3RyZWFtLCBidWZmZXIpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGRpZFJlc3RvcmUpOworCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLnYoVEFHLCAiRG9uZSBjb25zdW1pbmcgaW5wdXQgdGFyZmlsZSIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0ZWFyRG93blBpcGVzKCk7CisgICAgICAgICAgICAgICAgdGVhckRvd25BZ2VudChtVGFyZ2V0QXBwKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoaXMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQ3VycmVudE9wTG9jaykgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE9wZXJhdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTGF0Y2hPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhdGNoT2JqZWN0LnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhdGNoT2JqZWN0Lm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kRW5kUmVzdG9yZSgpOworICAgICAgICAgICAgICAgIG1XYWtlbG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiRnVsbCByZXN0b3JlIHBhc3MgY29tcGxldGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJlc3RvcmVPbmVGaWxlKElucHV0U3RyZWFtIGluc3RyZWFtLCBieXRlW10gYnVmZmVyKSB7CisgICAgICAgICAgICBGaWxlTWV0YWRhdGEgaW5mbzsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5mbyA9IHJlYWRUYXJIZWFkZXJzKGluc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcEZpbGVNZXRhZGF0YShpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwa2cgPSBpbmZvLnBhY2thZ2VOYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBrZy5lcXVhbHMobUFnZW50UGFja2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rYXksIGNoYW5nZSBpbiBwYWNrYWdlOyBzZXQgdXAgb3VyIHZhcmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvb2trZWVwaW5nIGlmIHdlIGhhdmVuJ3Qgc2VlbiBpdCB5ZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVBhY2thZ2VQb2xpY2llcy5jb250YWluc0tleShwa2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VQb2xpY2llcy5wdXQocGtnLCBSZXN0b3JlUG9saWN5LklHTk9SRSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBwcmV2aW91cyBhZ2VudCByZWxhdGlvbnNoaXAgaWYgbmVjZXNzYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGxldCB0aGUgb2JzZXJ2ZXIga25vdyB3ZSdyZSBjb25zaWRlcmluZyBhIG5ldyBhcHAuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJTYXcgbmV3IHBhY2thZ2U7IHRlYXJpbmcgZG93biBvbGQgb25lIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhckRvd25QaXBlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJEb3duQWdlbnQobVRhcmdldEFwcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRhcmdldEFwcCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFnZW50UGFja2FnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5wYXRoLmVxdWFscyhCQUNLVVBfTUFOSUZFU1RfRklMRU5BTUUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVBvbGljaWVzLnB1dChwa2csIHJlYWRBcHBNYW5pZmVzdChpbmZvLCBpbnN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VJbnN0YWxsZXJzLnB1dChwa2csIGluZm8uaW5zdGFsbGVyUGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgcmVhZCBvbmx5IHRoZSBtYW5pZmVzdCBjb250ZW50IGl0c2VsZiBhdCB0aGlzIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gY29uc3VtZSB0aGUgZm9vdGVyIGJlZm9yZSBsb29waW5nIGFyb3VuZCB0byB0aGUgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFRhclBhZGRpbmcoaW5mby5zaXplLCBpbnN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kT25SZXN0b3JlUGFja2FnZShwa2cpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uLW1hbmlmZXN0LCBzbyBpdCdzIGFjdHVhbCBmaWxlIGRhdGEuICBJcyB0aGlzIGEgcGFja2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgaWdub3Jpbmc/CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9rYXkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgUmVzdG9yZVBvbGljeSBwb2xpY3kgPSBtUGFja2FnZVBvbGljaWVzLmdldChwa2cpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwb2xpY3kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElHTk9SRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNDRVBUX0lGX0FQSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgaW4gYWNjZXB0LWlmLWFwayBzdGF0ZSwgdGhlbiB0aGUgZmlyc3QgZmlsZSB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgTVVTVCBiZSB0aGUgYXBrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5kb21haW4uZXF1YWxzKEZ1bGxCYWNrdXAuQVBLX1RSRUVfVE9LRU4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJBUEsgZmlsZTsgaW5zdGFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGluc3RhbGwgdGhlIGFwcC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnN0YWxsZXJOYW1lID0gbVBhY2thZ2VJbnN0YWxsZXJzLmdldChwa2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGluc3RhbGxBcGsoaW5mbywgaW5zdGFsbGVyTmFtZSwgaW5zdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ29vZCB0byBnbzsgcHJvbW90ZSB0byBBQ0NFUFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlUG9saWNpZXMucHV0KHBrZywgKG9rYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUmVzdG9yZVBvbGljeS5BQ0NFUFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSZXN0b3JlUG9saWN5LklHTk9SRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlJ3ZlIGNvbnN1bWVkIHRoaXMgZmlsZSBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Vyc2VsdmVzLCBzbyBqdXN0IHN0cmlwIHRoZSB0YXIgZm9vdGVyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ28gb24gdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwVGFyUGFkZGluZyhpbmZvLnNpemUsIGluc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBkYXRhIGJlZm9yZSAob3Igd2l0aG91dCkgdGhlIGFway4gIFdlIGNhbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaXQgY29oZXJlbnRseSBpbiB0aGlzIGNhc2Ugc28gaWdub3JlIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VQb2xpY2llcy5wdXQocGtnLCBSZXN0b3JlUG9saWN5LklHTk9SRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDQ0VQVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLkFQS19UUkVFX1RPS0VOKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiYXBrIHByZXNlbnQgYnV0IEFDQ0VQVCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHRha2UgdGhlIGRhdGEgd2l0aG91dCB0aGUgYXBrLCBzbyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKndhbnQqIHRvIGRvIHNvLiAgc2tpcCB0aGUgYXBrIGJ5IGRlY2xhcmluZyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgZmlsZSBub3Qtb2theSB3aXRob3V0IGNoYW5naW5nIHRoZSByZXN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2xpY3kgZm9yIHRoZSBwYWNrYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGhhcyBnb25lIGRyZWFkZnVsbHkgd3Jvbmcgd2hlbiBkZXRlcm1pbmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdG9yZSBwb2xpY3kgZnJvbSB0aGUgbWFuaWZlc3QuICBJZ25vcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3Qgb2YgdGhpcyBwYWNrYWdlJ3MgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkludmFsaWQgcG9saWN5IGZyb20gbWFuaWZlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVBvbGljaWVzLnB1dChwa2csIFJlc3RvcmVQb2xpY3kuSUdOT1JFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwb2xpY3kgaXMgc2F0aXNmaWVkLCBnbyBhaGVhZCBhbmQgc2V0IHVwIHRvIHBpcGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRvIHRoZSBhZ2VudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRyAmJiBva2F5ICYmIG1BZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlJldXNpbmcgZXhpc3RpbmcgYWdlbnQgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChva2F5ICYmIG1BZ2VudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiTmVlZCB0byBsYXVuY2ggYWdlbnQgZm9yICIgKyBwa2cpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRhcmdldEFwcCA9IG1QYWNrYWdlTWFuYWdlci5nZXRBcHBsaWNhdGlvbkluZm8ocGtnLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHNlbnQgYW55IGRhdGEgdG8gdGhpcyBhcHAgeWV0LCB3ZSBwcm9iYWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGNsZWFyIGl0IGZpcnN0LiAgQ2hlY2sgdGhhdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQ2xlYXJlZFBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcHMgd2l0aCB0aGVpciBvd24gZnVsbCBiYWNrdXAgYWdlbnRzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2libGUgZm9yIGNvaGVyZW50bHkgbWFuYWdpbmcgYSBmdWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UYXJnZXRBcHAuZnVsbEJhY2t1cEFnZW50TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiQ2xlYXJpbmcgYXBwIGRhdGEgcHJlcGFyYXRvcnkgdG8gZnVsbCByZXN0b3JlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJBcHBsaWNhdGlvbkRhdGFTeW5jaHJvbm91cyhwa2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJmdWxsIGJhY2t1cCBhZ2VudCAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVGFyZ2V0QXBwLmZ1bGxCYWNrdXBBZ2VudE5hbWUgKyAiKSA9PiBubyBjbGVhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsZWFyZWRQYWNrYWdlcy5hZGQocGtnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIldlJ3ZlIGluaXRpYWxpemVkIHRoaXMgYXBwIGFscmVhZHk7IG5vIGNsZWFyIHJlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgc2V0OyBub3cgc2V0IHVwIHRoZSBJUEMgYW5kIGxhdW5jaCB0aGUgYWdlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXBQaXBlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWdlbnQgPSBiaW5kVG9BZ2VudFN5bmNocm9ub3VzKG1UYXJnZXRBcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFwcGxpY2F0aW9uVGhyZWFkLkJBQ0tVUF9NT0RFX1JFU1RPUkVfRlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZ2VudFBhY2thZ2UgPSBwa2c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gZXJyb3IgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gZXJyb3IgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFnZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiVW5hYmxlIHRvIGNyZWF0ZSBhZ2VudCBmb3IgIiArIHBrZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhckRvd25QaXBlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVBvbGljaWVzLnB1dChwa2csIFJlc3RvcmVQb2xpY3kuSUdOT1JFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjazogbWFrZSBzdXJlIHdlIG5ldmVyIGdpdmUgZGF0YSB0byB0aGUgd3JvbmcgYXBwLiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiBidXQgYSBsaXR0bGUgcGFyYW5vaWEgaGVyZSB3b24ndCBnbyBhbWlzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChva2F5ICYmICFwa2cuZXF1YWxzKG1BZ2VudFBhY2thZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIlJlc3RvcmluZyBkYXRhIGZvciAiICsgcGtnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IGFnZW50IGlzIGZvciAiICsgbUFnZW50UGFja2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYW4gYWdlbnQgcmVhZHkgdG8gaGFuZGxlIHRoZSBmdWxsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGRhdGEgYXMgd2VsbCBhcyBhIHBpcGUgZm9yIHNlbmRpbmcgZGF0YSB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhZ2VudC4gIFRlbGwgdGhlIGFnZW50IHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpcGUuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2theSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWdlbnRTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRvQ29weSA9IGluZm8uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG9rZW4gPSBnZW5lcmF0ZVRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiSW52b2tpbmcgYWdlbnQgdG8gcmVzdG9yZSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluZm8ucGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVPcGVyYXRpb25UaW1lb3V0KHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVPVVRfRlVMTF9CQUNLVVBfSU5URVJWQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIHVwIHRoZSBhcHAncyBhZ2VudCBsaXN0ZW5pbmcgb24gdGhlIHNvY2tldC4gIElmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhZ2VudCBpcyBydW5uaW5nIGluIHRoZSBzeXN0ZW0gcHJvY2VzcyB3ZSBjYW4ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGludm9rZSBpdCBhc3luY2hyb25vdXNseSwgc28gd2UgcHJvdmlkZSBhIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgaXQgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UYXJnZXRBcHAucHJvY2Vzc05hbWUuZXF1YWxzKCJzeXN0ZW0iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInN5c3RlbSBwcm9jZXNzIGFnZW50IC0gc3Bpbm5pbmcgYSB0aHJlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RvcmVGaWxlUnVubmFibGUgcnVubmVyID0gbmV3IFJlc3RvcmVGaWxlUnVubmFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZ2VudCwgaW5mbywgbVBpcGVzWzBdLCB0b2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKHJ1bm5lcikuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZ2VudC5kb1Jlc3RvcmVGaWxlKG1QaXBlc1swXSwgaW5mby5zaXplLCBpbmZvLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZG9tYWluLCBpbmZvLnBhdGgsIGluZm8ubW9kZSwgaW5mby5tdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIG1CYWNrdXBNYW5hZ2VyQmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bGRuJ3QgZHVwIHRoZSBzb2NrZXQgZm9yIGEgcHJvY2Vzcy1sb2NhbCByZXN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJDb3VsZG4ndCBlc3RhYmxpc2ggcmVzdG9yZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VudFN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdob29wcywgcmVtb3RlIGFnZW50IHdlbnQgYXdheS4gIFdlJ2xsIGVhdCB0aGUgY29udGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXJzZWx2ZXMsIHRoZW4sIGFuZCBub3QgY29weSBpdCBvdmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQWdlbnQgY3Jhc2hlZCBkdXJpbmcgZnVsbCByZXN0b3JlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50U3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBvdmVyIHRoZSBkYXRhIGlmIHRoZSBhZ2VudCBpcyBzdGlsbCBnb29kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwaXBlT2theSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gcGlwZSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaXBlc1sxXS5nZXRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiUGlwaW5nIGRhdGEgdG8gYWdlbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRvQ29weSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b1JlYWQgPSAodG9Db3B5ID4gYnVmZmVyLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYnVmZmVyLmxlbmd0aCA6IChpbnQpdG9Db3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5SZWFkID0gaW5zdHJlYW0ucmVhZChidWZmZXIsIDAsIHRvUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoblJlYWQgPD0gMCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvcHkgLT0gblJlYWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgaXQgdG8gdGhlIG91dHB1dCBwaXBlIGFzIGxvbmcgYXMgdGhpbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgc3RpbGwgZ29vZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGVPa2F5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZS53cml0ZShidWZmZXIsIDAsIG5SZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB3cml0ZSB0byByZXN0b3JlIHBpcGUiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZU9rYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lIHNlbmRpbmcgdGhhdCBmaWxlISAgTm93IHdlIGp1c3QgbmVlZCB0byBjb25zdW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWx0YSBmcm9tIGluZm8uc2l6ZSB0byB0aGUgZW5kIG9mIGJsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwVGFyUGFkZGluZyhpbmZvLnNpemUsIGluc3RyZWFtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm93IHRoYXQgd2UndmUgc2VudCBpdCBhbGwsIHdhaXQgZm9yIHRoZSByZW1vdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lkZSB0byBhY2tub3dsZWRnZSByZWNlaXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50U3VjY2VzcyA9IHdhaXRVbnRpbE9wZXJhdGlvbkNvbXBsZXRlKHRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBva2F5LCBpZiB0aGUgcmVtb3RlIGVuZCBmYWlsZWQgYXQgYW55IHBvaW50LCBkZWFsIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBieSBpZ25vcmluZyB0aGUgcmVzdCBvZiB0aGUgcmVzdG9yZSBvbiBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWdlbnRTdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYWNrdXBIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhckRvd25QaXBlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyRG93bkFnZW50KG1UYXJnZXRBcHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWdlbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVBvbGljaWVzLnB1dChwa2csIFJlc3RvcmVQb2xpY3kuSUdOT1JFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2JsZW1zIHNldHRpbmcgdXAgdGhlIGFnZW50IGNvbW11bmljYXRpb24sIG9yIGFuIGFscmVhZHktCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVkIHBhY2thZ2U6IHNraXAgdG8gdGhlIG5leHQgdGFyIHN0cmVhbSBlbnRyeSBieQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZGluZyBhbmQgZGlzY2FyZGluZyB0aGlzIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9rYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJbZGlzY2FyZGluZyBmaWxlIGNvbnRlbnRdIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBieXRlc1RvQ29uc3VtZSA9IChpbmZvLnNpemUgKyA1MTEpICYgfjUxMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYnl0ZXNUb0NvbnN1bWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b1JlYWQgPSAoYnl0ZXNUb0NvbnN1bWUgPiBidWZmZXIubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJ1ZmZlci5sZW5ndGggOiAoaW50KWJ5dGVzVG9Db25zdW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5SZWFkID0gaW5zdHJlYW0ucmVhZChidWZmZXIsIDAsIHRvUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuUmVhZCA8PSAwKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNUb0NvbnN1bWUgLT0gblJlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJpbyBleGNlcHRpb24gb24gcmVzdG9yZSBzb2NrZXQgcmVhZCIsIGUpOworICAgICAgICAgICAgICAgIC8vIHRyZWF0IGFzIEVPRgorICAgICAgICAgICAgICAgIGluZm8gPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKGluZm8gIT0gbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFVwUGlwZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgbVBpcGVzID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuY3JlYXRlUGlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0ZWFyRG93blBpcGVzKCkgeworICAgICAgICAgICAgaWYgKG1QaXBlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1QaXBlc1swXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGlwZXNbMF0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaXBlc1swXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGlwZXNbMV0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaXBlc1sxXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDb3VsZG4ndCBjbG9zZSBhZ2VudCBwaXBlcyIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QaXBlcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRlYXJEb3duQWdlbnQoQXBwbGljYXRpb25JbmZvIGFwcCkgeworICAgICAgICAgICAgaWYgKG1BZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdW5iaW5kIGFuZCB0aWR5IHVwIGV2ZW4gb24gdGltZW91dCBvciBmYWlsdXJlLCBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5TWFuYWdlci51bmJpbmRCYWNrdXBBZ2VudChhcHApOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhZ2VudCB3YXMgcnVubmluZyB3aXRoIGEgc3R1YiBBcHBsaWNhdGlvbiBvYmplY3QsIHNvIHNodXQgaXQgZG93bi4KKyAgICAgICAgICAgICAgICAgICAgLy8gISEhIFdlIGhhcmRjb2RlIHRoZSBjb25maXJtYXRpb24gVUkncyBwYWNrYWdlIG5hbWUgaGVyZSByYXRoZXIgdGhhbiB1c2UgYQorICAgICAgICAgICAgICAgICAgICAvLyAgICAgbWFuaWZlc3QgZmxhZyEgIFRPRE8gc29tZXRoaW5nIGxlc3MgZGlyZWN0LgorICAgICAgICAgICAgICAgICAgICBpZiAoYXBwLnVpZCAhPSBQcm9jZXNzLlNZU1RFTV9VSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhYXBwLnBhY2thZ2VOYW1lLmVxdWFscygiY29tLmFuZHJvaWQuYmFja3VwY29uZmlybSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJLaWxsaW5nIGhvc3QgcHJvY2VzcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5TWFuYWdlci5raWxsQXBwbGljYXRpb25Qcm9jZXNzKGFwcC5wcm9jZXNzTmFtZSwgYXBwLnVpZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJOb3Qga2lsbGluZyBhZnRlciBmdWxsIHJlc3RvcmUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJMb3N0IGFwcCB0cnlpbmcgdG8gc2h1dCBkb3duIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BZ2VudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBSZXN0b3JlSW5zdGFsbE9ic2VydmVyIGV4dGVuZHMgSVBhY2thZ2VJbnN0YWxsT2JzZXJ2ZXIuU3R1YiB7CisgICAgICAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIG1Eb25lID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKKyAgICAgICAgICAgIFN0cmluZyBtUGFja2FnZU5hbWU7CisgICAgICAgICAgICBpbnQgbVJlc3VsdDsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRG9uZSkgeworICAgICAgICAgICAgICAgICAgICBtRG9uZS5zZXQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgd2FpdEZvckNvbXBsZXRpb24oKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRG9uZSkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobURvbmUuZ2V0KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURvbmUud2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBnZXRSZXN1bHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1SZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcGFja2FnZUluc3RhbGxlZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCByZXR1cm5Db2RlKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bHQgPSByZXR1cm5Db2RlOworICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgbURvbmUuc2V0KHRydWUpOworICAgICAgICAgICAgICAgICAgICBtRG9uZS5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBSZXN0b3JlRGVsZXRlT2JzZXJ2ZXIgZXh0ZW5kcyBJUGFja2FnZURlbGV0ZU9ic2VydmVyLlN0dWIgeworICAgICAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBtRG9uZSA9IG5ldyBBdG9taWNCb29sZWFuKCk7CisgICAgICAgICAgICBpbnQgbVJlc3VsdDsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRG9uZSkgeworICAgICAgICAgICAgICAgICAgICBtRG9uZS5zZXQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgd2FpdEZvckNvbXBsZXRpb24oKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRG9uZSkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobURvbmUuZ2V0KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURvbmUud2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcGFja2FnZURlbGV0ZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcmV0dXJuQ29kZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRG9uZSkgeworICAgICAgICAgICAgICAgICAgICBtUmVzdWx0ID0gcmV0dXJuQ29kZTsKKyAgICAgICAgICAgICAgICAgICAgbURvbmUuc2V0KHRydWUpOworICAgICAgICAgICAgICAgICAgICBtRG9uZS5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXN0b3JlSW5zdGFsbE9ic2VydmVyIG1JbnN0YWxsT2JzZXJ2ZXIgPSBuZXcgUmVzdG9yZUluc3RhbGxPYnNlcnZlcigpOworICAgICAgICBmaW5hbCBSZXN0b3JlRGVsZXRlT2JzZXJ2ZXIgbURlbGV0ZU9ic2VydmVyID0gbmV3IFJlc3RvcmVEZWxldGVPYnNlcnZlcigpOworCisgICAgICAgIGJvb2xlYW4gaW5zdGFsbEFwayhGaWxlTWV0YWRhdGEgaW5mbywgU3RyaW5nIGluc3RhbGxlclBhY2thZ2UsIElucHV0U3RyZWFtIGluc3RyZWFtKSB7CisgICAgICAgICAgICBib29sZWFuIG9rYXkgPSB0cnVlOworCisgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJJbnN0YWxsaW5nIGZyb20gYmFja3VwOiAiICsgaW5mby5wYWNrYWdlTmFtZSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBmaWxlIGNvbnRlbnQgaXMgYW4gLmFwayBmaWxlLiAgQ29weSBpdCBvdXQgdG8gYSBzdGFnaW5nIGxvY2F0aW9uIGFuZAorICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBpbnN0YWxsIGl0LgorICAgICAgICAgICAgRmlsZSBhcGtGaWxlID0gbmV3IEZpbGUobURhdGFEaXIsIGluZm8ucGFja2FnZU5hbWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGFwa1N0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFwa0ZpbGUpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVszMiAqIDEwMjRdOworICAgICAgICAgICAgICAgIGxvbmcgc2l6ZSA9IGluZm8uc2l6ZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyB0b1JlYWQgPSAoYnVmZmVyLmxlbmd0aCA8IHNpemUpID8gYnVmZmVyLmxlbmd0aCA6IHNpemU7CisgICAgICAgICAgICAgICAgICAgIGludCBkaWRSZWFkID0gaW5zdHJlYW0ucmVhZChidWZmZXIsIDAsIChpbnQpdG9SZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgYXBrU3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgZGlkUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gZGlkUmVhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXBrU3RyZWFtLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGluc3RhbGxlciBjYW4gcmVhZCBpdAorICAgICAgICAgICAgICAgIGFwa0ZpbGUuc2V0UmVhZGFibGUodHJ1ZSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgLy8gTm93IGluc3RhbGwgaXQKKyAgICAgICAgICAgICAgICBVcmkgcGFja2FnZVVyaSA9IFVyaS5mcm9tRmlsZShhcGtGaWxlKTsKKyAgICAgICAgICAgICAgICBtSW5zdGFsbE9ic2VydmVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmluc3RhbGxQYWNrYWdlKHBhY2thZ2VVcmksIG1JbnN0YWxsT2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1JFUExBQ0VfRVhJU1RJTkcsIGluc3RhbGxlclBhY2thZ2UpOworICAgICAgICAgICAgICAgIG1JbnN0YWxsT2JzZXJ2ZXIud2FpdEZvckNvbXBsZXRpb24oKTsKKworICAgICAgICAgICAgICAgIGlmIChtSW5zdGFsbE9ic2VydmVyLmdldFJlc3VsdCgpICE9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBvbmx5IHRpbWUgd2UgY29udGludWUgdG8gYWNjZXB0IGluc3RhbGwgb2YgZGF0YSBldmVuIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBhcGsgaW5zdGFsbCBmYWlsZWQgaXMgaWYgd2UgaGFkIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0IHdlIGNvdWxkCisgICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdCB0aGUgZGF0YSByZWdhcmRsZXNzLgorICAgICAgICAgICAgICAgICAgICBpZiAobVBhY2thZ2VQb2xpY2llcy5nZXQoaW5mby5wYWNrYWdlTmFtZSkgIT0gUmVzdG9yZVBvbGljeS5BQ0NFUFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9rYXksIHRoZSBpbnN0YWxsIHN1Y2NlZWRlZC4gIE1ha2Ugc3VyZSBpdCB3YXMgdGhlIHJpZ2h0IGFwcC4KKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bmluc3RhbGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5zdGFsbE9ic2VydmVyLm1QYWNrYWdlTmFtZS5lcXVhbHMoaW5mby5wYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJSZXN0b3JlIHN0cmVhbSBjbGFpbWVkIHRvIGluY2x1ZGUgYXBrIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5mby5wYWNrYWdlTmFtZSArICIgYnV0IGFwayB3YXMgcmVhbGx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFsbE9ic2VydmVyLm1QYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgdGhlIHBhY2thZ2Ugd2UganVzdCBwdXQgaW4gcGxhY2U7IGl0IG1pZ2h0IGJlIGZyYXVkdWxlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW5zdGFsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VJbmZvIHBrZyA9IG1QYWNrYWdlTWFuYWdlci5nZXRQYWNrYWdlSW5mbyhpbmZvLnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX1NJR05BVFVSRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGtnLmFwcGxpY2F0aW9uSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX0FMTE9XX0JBQ0tVUCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiUmVzdG9yZSBzdHJlYW0gY29udGFpbnMgYXBrIG9mIHBhY2thZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5mby5wYWNrYWdlTmFtZSArICIgYnV0IGl0IGRpc2FsbG93cyBiYWNrdXAvcmVzdG9yZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28gZmFyIHNvIGdvb2QgLS0gZG8gdGhlIHNpZ25hdHVyZXMgbWF0Y2ggdGhlIG1hbmlmZXN0PworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVbXSBzaWdzID0gbU1hbmlmZXN0U2lnbmF0dXJlcy5nZXQoaW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2lnbmF0dXJlc01hdGNoKHNpZ3MsIHBrZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJJbnN0YWxsZWQgYXBwICIgKyBpbmZvLnBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaWduYXR1cmVzIGRvIG5vdCBtYXRjaCByZXN0b3JlIG1hbmlmZXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmluc3RhbGwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiSW5zdGFsbCBvZiBwYWNrYWdlICIgKyBpbmZvLnBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc3VjY2VlZGVkIGJ1dCBub3cgbm90IGZvdW5kIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IG9rYXkgYXQgdGhpcyBwb2ludCwgd2UgbmVlZCB0byBkZWxldGUgdGhlIHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSBqdXN0IGluc3RhbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVuaW5zdGFsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURlbGV0ZU9ic2VydmVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU1hbmFnZXIuZGVsZXRlUGFja2FnZShtSW5zdGFsbE9ic2VydmVyLm1QYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlbGV0ZU9ic2VydmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWxldGVPYnNlcnZlci53YWl0Rm9yQ29tcGxldGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJVbmFibGUgdG8gdHJhbnNjcmliZSByZXN0b3JlZCBhcGsgZm9yIGluc3RhbGwiKTsKKyAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGFwa0ZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBva2F5OworICAgICAgICB9CisKKyAgICAgICAgLy8gR2l2ZW4gYW4gYWN0dWFsIGZpbGUgY29udGVudCBzaXplLCBjb25zdW1lIHRoZSBwb3N0LWNvbnRlbnQgcGFkZGluZyBtYW5kYXRlZAorICAgICAgICAvLyBieSB0aGUgdGFyIGZvcm1hdC4KKyAgICAgICAgdm9pZCBza2lwVGFyUGFkZGluZyhsb25nIHNpemUsIElucHV0U3RyZWFtIGluc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgbG9uZyBwYXJ0aWFsID0gKHNpemUgKyA1MTIpICUgNTEyOworICAgICAgICAgICAgaWYgKHBhcnRpYWwgPiAwKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzUxMl07CisgICAgICAgICAgICAgICAgaW5zdHJlYW0ucmVhZChidWZmZXIsIDAsIDUxMiAtIChpbnQpcGFydGlhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm5zIGEgcG9saWN5IGNvbnN0YW50OyB0YWtlcyBhIGJ1ZmZlciBhcmcgdG8gcmVkdWNlIG1lbW9yeSBjaHVybgorICAgICAgICBSZXN0b3JlUG9saWN5IHJlYWRBcHBNYW5pZmVzdChGaWxlTWV0YWRhdGEgaW5mbywgSW5wdXRTdHJlYW0gaW5zdHJlYW0pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIEZhaWwgb24gc3VzcGljaW91c2x5IGxhcmdlIG1hbmlmZXN0IGZpbGVzCisgICAgICAgICAgICBpZiAoaW5mby5zaXplID4gNjQgKiAxMDI0KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJSZXN0b3JlIG1hbmlmZXN0IHRvbyBiaWc7IGNvcnJ1cHQ/IHNpemU9IiArIGluZm8uc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbKGludCkgaW5mby5zaXplXTsKKyAgICAgICAgICAgIGludCBuUmVhZCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoblJlYWQgPCBpbmZvLnNpemUpIHsKKyAgICAgICAgICAgICAgICBuUmVhZCArPSBpbnN0cmVhbS5yZWFkKGJ1ZmZlciwgblJlYWQsIChpbnQpaW5mby5zaXplIC0gblJlYWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBSZXN0b3JlUG9saWN5IHBvbGljeSA9IFJlc3RvcmVQb2xpY3kuSUdOT1JFOworICAgICAgICAgICAgU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IGV4dHJhY3RMaW5lKGJ1ZmZlciwgb2Zmc2V0LCBzdHIpOworICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChzdHJbMF0pOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IEJBQ0tVUF9NQU5JRkVTVF9WRVJTSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGV4dHJhY3RMaW5lKGJ1ZmZlciwgb2Zmc2V0LCBzdHIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWFuaWZlc3RQYWNrYWdlID0gc3RyWzBdOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgPG9yaWdpbmFsLXBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdFBhY2thZ2UuZXF1YWxzKGluZm8ucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBleHRyYWN0TGluZShidWZmZXIsIG9mZnNldCwgc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHN0clswXSk7ICAvLyBhcHAgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZXh0cmFjdExpbmUoYnVmZmVyLCBvZmZzZXQsIHN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhdGZvcm1WZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChzdHJbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZXh0cmFjdExpbmUoYnVmZmVyLCBvZmZzZXQsIHN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmluc3RhbGxlclBhY2thZ2VOYW1lID0gKHN0clswXS5sZW5ndGgoKSA+IDApID8gc3RyWzBdIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGV4dHJhY3RMaW5lKGJ1ZmZlciwgb2Zmc2V0LCBzdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNBcGsgPSBzdHJbMF0uZXF1YWxzKCIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBleHRyYWN0TGluZShidWZmZXIsIG9mZnNldCwgc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1TaWdzID0gSW50ZWdlci5wYXJzZUludChzdHJbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVNpZ3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlW10gc2lncyA9IG5ldyBTaWduYXR1cmVbbnVtU2lnc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaWdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZXh0cmFjdExpbmUoYnVmZmVyLCBvZmZzZXQsIHN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ3NbaV0gPSBuZXcgU2lnbmF0dXJlKHN0clswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5pZmVzdFNpZ25hdHVyZXMucHV0KGluZm8ucGFja2FnZU5hbWUsIHNpZ3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2theSwgZ290IHRoZSBtYW5pZmVzdCBpbmZvIHdlIG5lZWQuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlSW5mbyBwa2dJbmZvID0gbVBhY2thZ2VNYW5hZ2VyLmdldFBhY2thZ2VJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucGFja2FnZU5hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9TSUdOQVRVUkVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIElHTk9SRSBpZiB0aGUgYXBwIGV4cGxpY2l0bHkgZGlzYWxsb3dzIGJhY2t1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBwa2dJbmZvLmFwcGxpY2F0aW9uSW5mby5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX0FMTE9XX0JBQ0tVUCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZXMgYWdhaW5zdCBhbnkgaW5zdGFsbGVkIHZlcnNpb247IGlmIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IG1hdGNoLCB0aGVuIHdlIGZhbGwgdGhvdWdoIGFuZCBpZ25vcmUgdGhlIGRhdGEuICBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25hdHVyZU1hdGNoKCkgbWV0aG9kIGV4cGxpY2l0bHkgaWdub3JlcyB0aGUgc2lnbmF0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgcGFja2FnZXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gcGFydGl0aW9uLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIHBhY2thZ2VzIGFyZSBzaWduZWQgd2l0aCB0aGUgcGxhdGZvcm0gY2VydCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIGRldmVsb3BlcidzIGNlcnQsIHNvIHRoZXkncmUgZGlmZmVyZW50IG9uIGV2ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlc01hdGNoKHNpZ3MsIHBrZ0luZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrZ0luZm8udmVyc2lvbkNvZGUgPj0gdmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2lnICsgdmVyc2lvbiBtYXRjaDsgdGFraW5nIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gUmVzdG9yZVBvbGljeS5BQ0NFUFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRhdGEgaXMgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgdGhlIGFwcCB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHByZXNlbnRseSBpbnN0YWxsZWQuICBUaGF0IG1lYW5zIHdlIGNhbiBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBpdCBpZiB0aGUgbWF0Y2hpbmcgYXBrIGlzIGFsc28gc3VwcGxpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJEYXRhIHZlcnNpb24gIiArIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbmV3ZXIgdGhhbiBpbnN0YWxsZWQgdmVyc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwa2dJbmZvLnZlcnNpb25Db2RlICsgIiAtIHJlcXVpcmluZyBhcGsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gUmVzdG9yZVBvbGljeS5BQ0NFUFRfSUZfQVBLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlJlc3RvcmUgbWFuaWZlc3Qgc2lnbmF0dXJlcyBkbyBub3QgbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaW5zdGFsbGVkIGFwcGxpY2F0aW9uIGZvciAiICsgaW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuaShUQUcsICJSZXN0b3JlIG1hbmlmZXN0IGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluZm8ucGFja2FnZU5hbWUgKyAiIGJ1dCBhbGxvd0JhY2t1cD1mYWxzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2theSwgdGhlIHRhcmdldCBhcHAgaXNuJ3QgaW5zdGFsbGVkLiAgV2UgY2FuIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3RvcmUgcHJvcGVybHkgb25seSBpZiB0aGUgZGF0YXNldCBwcm92aWRlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBrIGZpbGUgYW5kIHdlIGNhbiBzdWNjZXNzZnVsbHkgaW5zdGFsbCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmkoVEFHLCAiUGFja2FnZSAiICsgaW5mby5wYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgaW5zdGFsbGVkOyByZXF1aXJpbmcgYXBrIGluIGRhdGFzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gUmVzdG9yZVBvbGljeS5BQ0NFUFRfSUZfQVBLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2xpY3kgPT0gUmVzdG9yZVBvbGljeS5BQ0NFUFRfSUZfQVBLICYmICFoYXNBcGspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkNhbm5vdCByZXN0b3JlIHBhY2thZ2UgIiArIGluZm8ucGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aG91dCB0aGUgbWF0Y2hpbmcgLmFwayIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIk1pc3Npbmcgc2lnbmF0dXJlIG9uIGJhY2tlZC11cCBwYWNrYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiRXhwZWN0ZWQgcGFja2FnZSAiICsgaW5mby5wYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IHJlc3RvcmUgbWFuaWZlc3QgY2xhaW1zICIgKyBtYW5pZmVzdFBhY2thZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlVua25vd24gcmVzdG9yZSBtYW5pZmVzdCB2ZXJzaW9uICIgKyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBwYWNrYWdlICIgKyBpbmZvLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDb3JydXB0IHJlc3RvcmUgbWFuaWZlc3QgZm9yIHBhY2thZ2UgIiArIGluZm8ucGFja2FnZU5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcG9saWN5OworICAgICAgICB9CisKKyAgICAgICAgLy8gQnVpbGRzIGEgbGluZSBmcm9tIGEgYnl0ZSBidWZmZXIgc3RhcnRpbmcgYXQgJ29mZnNldCcsIGFuZCByZXR1cm5zCisgICAgICAgIC8vIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB1bmNvbnN1bWVkIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgaW50IGV4dHJhY3RMaW5lKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIFN0cmluZ1tdIG91dFN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBlbmQgPSBidWZmZXIubGVuZ3RoOworICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBlbmQpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW5jb21wbGV0ZSBkYXRhIik7CisKKyAgICAgICAgICAgIGludCBwb3M7CisgICAgICAgICAgICBmb3IgKHBvcyA9IG9mZnNldDsgcG9zIDwgZW5kOyBwb3MrKykgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IGJ1ZmZlcltwb3NdOworICAgICAgICAgICAgICAgIC8vIGF0IExGIHdlIGRlY2xhcmUgZW5kIG9mIGxpbmUsIGFuZCByZXR1cm4gdGhlIG5leHQgY2hhciBhcyB0aGUKKyAgICAgICAgICAgICAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgdGhlIG5leHQgdGltZSB0aHJvdWdoCisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRTdHJbMF0gPSBuZXcgU3RyaW5nKGJ1ZmZlciwgb2Zmc2V0LCBwb3MgLSBvZmZzZXQpOworICAgICAgICAgICAgcG9zKys7ICAvLyBtYXkgYmUgcG9pbnRpbmcgYW4gZXh0cmEgYnl0ZSBwYXN0IHRoZSBlbmQgYnV0IHRoYXQncyBva2F5CisgICAgICAgICAgICByZXR1cm4gcG9zOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkdW1wRmlsZU1ldGFkYXRhKEZpbGVNZXRhZGF0YSBpbmZvKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworCisgICAgICAgICAgICAgICAgLy8gbW9kZSBzdHJpbmcKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoaW5mby50eXBlID09IEZ1bGxCYWNrdXAuVFlQRV9ESVJFQ1RPUlkpID8gJ2QnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDA0MDApICE9IDApID8gJ3InIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAyMDApICE9IDApID8gJ3cnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAxMDApICE9IDApID8gJ3gnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwNDApICE9IDApID8gJ3InIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMjApICE9IDApID8gJ3cnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMTApICE9IDApID8gJ3gnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMDQpICE9IDApID8gJ3InIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMDIpICE9IDApID8gJ3cnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMDEpICE9IDApID8gJ3gnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIgJTlkICIsIGluZm8uc2l6ZSkpOworCisgICAgICAgICAgICAgICAgRGF0ZSBzdGFtcCA9IG5ldyBEYXRlKGluZm8ubXRpbWUpOworICAgICAgICAgICAgICAgIGIuYXBwZW5kKG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJNTU0gZGQga2s6bW06c3MgIikuZm9ybWF0KHN0YW1wKSk7CisKKyAgICAgICAgICAgICAgICBiLmFwcGVuZChpbmZvLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiIDo6ICIpOworICAgICAgICAgICAgICAgIGIuYXBwZW5kKGluZm8uZG9tYWluKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiIDo6ICIpOworICAgICAgICAgICAgICAgIGIuYXBwZW5kKGluZm8ucGF0aCk7CisKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCBiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENvbnN1bWUgYSB0YXIgZmlsZSBoZWFkZXIgYmxvY2sgW3NlcXVlbmNlXSBhbmQgYWNjdW11bGF0ZSB0aGUgcmVsZXZhbnQgbWV0YWRhdGEKKyAgICAgICAgRmlsZU1ldGFkYXRhIHJlYWRUYXJIZWFkZXJzKElucHV0U3RyZWFtIGluc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYnl0ZVtdIGJsb2NrID0gbmV3IGJ5dGVbNTEyXTsKKyAgICAgICAgICAgIEZpbGVNZXRhZGF0YSBpbmZvID0gbnVsbDsKKworICAgICAgICAgICAgYm9vbGVhbiBnb3RIZWFkZXIgPSByZWFkVGFySGVhZGVyKGluc3RyZWFtLCBibG9jayk7CisgICAgICAgICAgICBpZiAoZ290SGVhZGVyKSB7CisgICAgICAgICAgICAgICAgLy8gb2theSwgcHJlc3VtZSB3ZSdyZSBva2F5LCBhbmQgZXh0cmFjdCB0aGUgdmFyaW91cyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgRmlsZU1ldGFkYXRhKCk7CisgICAgICAgICAgICAgICAgaW5mby5zaXplID0gZXh0cmFjdFJhZGl4KGJsb2NrLCAxMjQsIDEyLCA4KTsKKyAgICAgICAgICAgICAgICBpbmZvLm10aW1lID0gZXh0cmFjdFJhZGl4KGJsb2NrLCAxMzYsIDEyLCA4KTsKKyAgICAgICAgICAgICAgICBpbmZvLm1vZGUgPSBleHRyYWN0UmFkaXgoYmxvY2ssIDEwMCwgOCwgOCk7CisKKyAgICAgICAgICAgICAgICBpbmZvLnBhdGggPSBleHRyYWN0U3RyaW5nKGJsb2NrLCAzNDUsIDE1NSk7IC8vIHByZWZpeAorICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZXh0cmFjdFN0cmluZyhibG9jaywgMCwgMTAwKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8ucGF0aC5sZW5ndGgoKSA+IDApIGluZm8ucGF0aCArPSAnLyc7CisgICAgICAgICAgICAgICAgICAgIGluZm8ucGF0aCArPSBwYXRoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHRhciBsaW5rIGluZGljYXRvciBmaWVsZDogMSBieXRlIGF0IG9mZnNldCAxNTYgaW4gdGhlIGhlYWRlci4KKyAgICAgICAgICAgICAgICBpbnQgdHlwZUNoYXIgPSBibG9ja1sxNTZdOworICAgICAgICAgICAgICAgIGlmICh0eXBlQ2hhciA9PSAneCcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGF4IGV4dGVuZGVkIGhlYWRlciwgc28gd2UgbmVlZCB0byByZWFkIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgZ290SGVhZGVyID0gcmVhZFBheEV4dGVuZGVkSGVhZGVyKGluc3RyZWFtLCBpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvdEhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGFmdGVyIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBjb21lcyBhbm90aGVyIHJlYWwgaGVhZGVyIC0tIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdG8gZmluZCB0aGUgcmVhbCBmaWxlIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdEhlYWRlciA9IHJlYWRUYXJIZWFkZXIoaW5zdHJlYW0sIGJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWdvdEhlYWRlcikgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJCYWQgb3IgbWlzc2luZyBwYXggaGVhZGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgdHlwZUNoYXIgPSBibG9ja1sxNTZdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZUNoYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnMCc6IGluZm8udHlwZSA9IEZ1bGxCYWNrdXAuVFlQRV9GSUxFOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6IGluZm8udHlwZSA9IEZ1bGxCYWNrdXAuVFlQRV9ESVJFQ1RPUlk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXN1bWUgRU9GCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiVW5rbm93biB0YXIgZW50aXR5IHR5cGU6ICIgKyB0eXBlQ2hhcik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVua25vd24gZW50aXR5IHR5cGUgIiArIHR5cGVDaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFBhcnNlIG91dCB0aGUgcGF0aAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gZmlyc3Q6IGFwcHMvc2hhcmVkL3VucmVjb2duaXplZAorICAgICAgICAgICAgICAgIGlmIChGdWxsQmFja3VwLlNIQVJFRF9QUkVGSVgucmVnaW9uTWF0Y2hlcygwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5wYXRoLCAwLCBGdWxsQmFja3VwLlNIQVJFRF9QUkVGSVgubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgaW4gc2hhcmVkIHN0b3JhZ2UuICAhISEgVE9ETzogaW1wbGVtZW50IHRoaXMuCisgICAgICAgICAgICAgICAgICAgIGluZm8ucGF0aCA9IGluZm8ucGF0aC5zdWJzdHJpbmcoRnVsbEJhY2t1cC5TSEFSRURfUFJFRklYLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5kb21haW4gPSBGdWxsQmFja3VwLlNIQVJFRF9TVE9SQUdFX1RPS0VOOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRnVsbEJhY2t1cC5BUFBTX1BSRUZJWC5yZWdpb25NYXRjaGVzKDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnBhdGgsIDAsIEZ1bGxCYWNrdXAuQVBQU19QUkVGSVgubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFwcCBjb250ZW50ISAgUGFyc2Ugb3V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGRvbWFpbgorCisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIHRoZSBhcHBzLyBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgaW5mby5wYXRoID0gaW5mby5wYXRoLnN1YnN0cmluZyhGdWxsQmFja3VwLkFQUFNfUFJFRklYLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IHRoZSBwYWNrYWdlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgaW50IHNsYXNoID0gaW5mby5wYXRoLmluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNsYXNoIDwgMCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbGxlZ2FsIHNlbWFudGljIHBhdGggaW4gIiArIGluZm8ucGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGluZm8ucGFja2FnZU5hbWUgPSBpbmZvLnBhdGguc3Vic3RyaW5nKDAsIHNsYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5wYXRoID0gaW5mby5wYXRoLnN1YnN0cmluZyhzbGFzaCsxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGEgbWFuaWZlc3Qgd2UncmUgZG9uZSwgb3RoZXJ3aXNlIHBhcnNlIG91dCB0aGUgZG9tYWlucworICAgICAgICAgICAgICAgICAgICBpZiAoIWluZm8ucGF0aC5lcXVhbHMoQkFDS1VQX01BTklGRVNUX0ZJTEVOQU1FKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2xhc2ggPSBpbmZvLnBhdGguaW5kZXhPZignLycpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsYXNoIDwgMCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbGxlZ2FsIHNlbWFudGljIHBhdGggaW4gbm9uLW1hbmlmZXN0ICIgKyBpbmZvLnBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5kb21haW4gPSBpbmZvLnBhdGguc3Vic3RyaW5nKDAsIHNsYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgaXQncyBvbmUgb2YgdGhlIGRvbWFpbnMgd2UgdW5kZXJzdGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmZvLmRvbWFpbi5lcXVhbHMoRnVsbEJhY2t1cC5BUEtfVFJFRV9UT0tFTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWluZm8uZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLkRBVEFfVFJFRV9UT0tFTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWluZm8uZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLkRBVEFCQVNFX1RSRUVfVE9LRU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFpbmZvLmRvbWFpbi5lcXVhbHMoRnVsbEJhY2t1cC5ST09UX1RSRUVfVE9LRU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFpbmZvLmRvbWFpbi5lcXVhbHMoRnVsbEJhY2t1cC5TSEFSRURQUkVGU19UUkVFX1RPS0VOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaW5mby5kb21haW4uZXF1YWxzKEZ1bGxCYWNrdXAuT0JCX1RSRUVfVE9LRU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFpbmZvLmRvbWFpbi5lcXVhbHMoRnVsbEJhY2t1cC5DQUNIRV9UUkVFX1RPS0VOKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5yZWNvZ25pemVkIGRvbWFpbiAiICsgaW5mby5kb21haW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnBhdGggPSBpbmZvLnBhdGguc3Vic3RyaW5nKHNsYXNoICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gcmVhZFRhckhlYWRlcihJbnB1dFN0cmVhbSBpbnN0cmVhbSwgYnl0ZVtdIGJsb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IG5SZWFkID0gaW5zdHJlYW0ucmVhZChibG9jaywgMCwgNTEyKTsKKyAgICAgICAgICAgIGlmIChuUmVhZCA+IDAgJiYgblJlYWQgIT0gNTEyKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVhZCBvbmx5IGEgcGFydGlhbCBibG9jaywgdGhlbiB0aGluZ3MgYXJlCisgICAgICAgICAgICAgICAgLy8gY2xlYXJseSBzY3Jld2VkIHVwLiAgdGVybWluYXRlIHRoZSByZXN0b3JlLgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUGFydGlhbCBoZWFkZXIgYmxvY2s6ICIgKyBuUmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKG5SZWFkID4gMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBvdmVyd3JpdGVzICdpbmZvJyBmaWVsZHMgYmFzZWQgb24gdGhlIHBheCBleHRlbmRlZCBoZWFkZXIKKyAgICAgICAgYm9vbGVhbiByZWFkUGF4RXh0ZW5kZWRIZWFkZXIoSW5wdXRTdHJlYW0gaW5zdHJlYW0sIEZpbGVNZXRhZGF0YSBpbmZvKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgc2VlIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBsYXJnZXIgdGhhbiB0aGlzCisgICAgICAgICAgICBpZiAoaW5mby5zaXplID4gMzIqMTAyNCkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJTdXNwaWNpb3VzbHkgbGFyZ2UgcGF4IGhlYWRlciBzaXplICIgKyBpbmZvLnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtIGFib3J0aW5nIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTYW5pdHkgZmFpbHVyZTogcGF4IGhlYWRlciBzaXplICIgKyBpbmZvLnNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZWFkIHdob2xlIGJsb2Nrcywgbm90IGp1c3QgdGhlIGNvbnRlbnQgc2l6ZQorICAgICAgICAgICAgaW50IG51bUJsb2NrcyA9IChpbnQpKChpbmZvLnNpemUgKyA1MTEpID4+IDkpOworICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtudW1CbG9ja3MgKiA1MTJdOworICAgICAgICAgICAgaW50IG5SZWFkID0gaW5zdHJlYW0ucmVhZChkYXRhKTsKKyAgICAgICAgICAgIGlmIChuUmVhZCAhPSBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRTaXplID0gKGludCkgaW5mby5zaXplOworICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCB0aGUgbGluZSBhdCAnb2Zmc2V0JworICAgICAgICAgICAgICAgIGludCBlb2wgPSBvZmZzZXQrMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZW9sIDwgY29udGVudFNpemUgJiYgZGF0YVtlb2xdICE9ICcgJykgZW9sKys7CisgICAgICAgICAgICAgICAgaWYgKGVvbCA+PSBjb250ZW50U2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcjogd2UganVzdCBoaXQgRU9EIGxvb2tpbmcgZm9yIHRoZSBlbmQgb2YgdGhlIHNpemUgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnZhbGlkIHBheCBkYXRhIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGVvbCBwb2ludHMgdG8gdGhlIHNwYWNlIGJldHdlZW4gdGhlIGNvdW50IGFuZCB0aGUga2V5CisgICAgICAgICAgICAgICAgaW50IGxpbmVsZW4gPSAoaW50KSBleHRyYWN0UmFkaXgoZGF0YSwgb2Zmc2V0LCBlb2wgLSBvZmZzZXQsIDEwKTsKKyAgICAgICAgICAgICAgICBpbnQga2V5ID0gZW9sICsgMTsgIC8vIHN0YXJ0IG9mIGtleT12YWx1ZQorICAgICAgICAgICAgICAgIGVvbCA9IG9mZnNldCArIGxpbmVsZW4gLSAxOyAvLyB0cmFpbGluZyBMRgorICAgICAgICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhbHVlID0ga2V5KzE7IGRhdGFbdmFsdWVdICE9ICc9JyAmJiB2YWx1ZSA8PSBlb2w7IHZhbHVlKyspOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IGVvbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludmFsaWQgcGF4IGRlY2xhcmF0aW9uIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcGF4IHJlcXVpcmVzIHRoYXQga2V5L3ZhbHVlIHN0cmluZ3MgYmUgaW4gVVRGLTgKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5U3RyID0gbmV3IFN0cmluZyhkYXRhLCBrZXksIHZhbHVlLWtleSwgIlVURi04Iik7CisgICAgICAgICAgICAgICAgLy8gLTEgdG8gc3RyaXAgdGhlIHRyYWlsaW5nIExGCisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbFN0ciA9IG5ldyBTdHJpbmcoZGF0YSwgdmFsdWUrMSwgZW9sLXZhbHVlLTEsICJVVEYtOCIpOworCisgICAgICAgICAgICAgICAgaWYgKCJwYXRoIi5lcXVhbHMoa2V5U3RyKSkgeworICAgICAgICAgICAgICAgICAgICBpbmZvLnBhdGggPSB2YWxTdHI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic2l6ZSIuZXF1YWxzKGtleVN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5zaXplID0gTG9uZy5wYXJzZUxvbmcodmFsU3RyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuaShUQUcsICJVbmhhbmRsZWQgcGF4IGtleTogIiArIGtleSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpbmVsZW47CisgICAgICAgICAgICB9IHdoaWxlIChvZmZzZXQgPCBjb250ZW50U2l6ZSk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBleHRyYWN0UmFkaXgoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBtYXhDaGFycywgaW50IHJhZGl4KQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb25nIHZhbHVlID0gMDsKKyAgICAgICAgICAgIGZpbmFsIGludCBlbmQgPSBvZmZzZXQgKyBtYXhDaGFyczsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGUgYiA9IGRhdGFbaV07CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gMCB8fCBiID09ICcgJykgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGIgPCAnMCcgfHwgYiA+ICgnMCcgKyByYWRpeCAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBudW1iZXIgaW4gaGVhZGVyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlID0gcmFkaXggKiB2YWx1ZSArIChiIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBleHRyYWN0U3RyaW5nKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbWF4Q2hhcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBpbnQgZW5kID0gb2Zmc2V0ICsgbWF4Q2hhcnM7CisgICAgICAgICAgICBpbnQgZW9zID0gb2Zmc2V0OworICAgICAgICAgICAgLy8gdGFyIHN0cmluZyBmaWVsZHMgY2FuIGVuZCB3aXRoIGVpdGhlciBOVUwgb3IgU1BDCisgICAgICAgICAgICB3aGlsZSAoZW9zIDwgZW5kICYmIGRhdGFbZW9zXSAhPSAwICYmIGRhdGFbZW9zXSAhPSAnICcpIGVvcysrOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGF0YSwgb2Zmc2V0LCBlb3Mtb2Zmc2V0LCAiVVMtQVNDSUkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2VuZFN0YXJ0UmVzdG9yZSgpIHsKKyAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1PYnNlcnZlci5vblN0YXJ0UmVzdG9yZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJmdWxsIHJlc3RvcmUgb2JzZXJ2ZXIgd2VudCBhd2F5OiBzdGFydFJlc3RvcmUiKTsKKyAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNlbmRPblJlc3RvcmVQYWNrYWdlKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBpZiAobU9ic2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgYSBtb3JlIHVzZXItZnJpZW5kbHkgbmFtZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVyLm9uUmVzdG9yZVBhY2thZ2UobmFtZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgImZ1bGwgcmVzdG9yZSBvYnNlcnZlciB3ZW50IGF3YXk6IHJlc3RvcmVQYWNrYWdlIik7CisgICAgICAgICAgICAgICAgICAgIG1PYnNlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZW5kRW5kUmVzdG9yZSgpIHsKKyAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1PYnNlcnZlci5vbkVuZFJlc3RvcmUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiZnVsbCByZXN0b3JlIG9ic2VydmVyIHdlbnQgYXdheTogZW5kUmVzdG9yZSIpOworICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIC0tLS0tIFJlc3RvcmUgaGFuZGxpbmcgLS0tLS0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBzaWduYXR1cmVzTWF0Y2goU2lnbmF0dXJlW10gc3RvcmVkU2lncywgUGFja2FnZUluZm8gdGFyZ2V0KSB7CkBAIC0yNTg2LDQxICszNTkxLDk1IEBACiAgICAgICAgICAgICAgICAgbUZ1bGxDb25maXJtYXRpb25zLnB1dCh0b2tlbiwgcGFyYW1zKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gc3RhcnQgdXAgdGhlIGNvbmZpcm1hdGlvbiBVSSwgbWFraW5nIHN1cmUgdGhlIHNjcmVlbiBsaWdodHMgdXAKLSAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIlN0YXJ0aW5nIGNvbmZpcm1hdGlvbiBVSSwgdG9rZW49IiArIHRva2VuKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW50ZW50IGNvbmZJbnRlbnQgPSBuZXcgSW50ZW50KEZ1bGxCYWNrdXAuRlVMTF9CQUNLVVBfSU5URU5UX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgY29uZkludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLmJhY2t1cGNvbmZpcm0iLAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmJhY2t1cGNvbmZpcm0uQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbiIpOwotICAgICAgICAgICAgICAgIGNvbmZJbnRlbnQucHV0RXh0cmEoRnVsbEJhY2t1cC5DT05GX1RPS0VOX0lOVEVOVF9FWFRSQSwgdG9rZW4pOwotICAgICAgICAgICAgICAgIGNvbmZJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoY29uZkludGVudCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiVW5hYmxlIHRvIGxhdW5jaCBmdWxsIGJhY2t1cCBjb25maXJtYXRpb24iLCBlKTsKKyAgICAgICAgICAgIC8vIHN0YXJ0IHVwIHRoZSBjb25maXJtYXRpb24gVUkKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIlN0YXJ0aW5nIGJhY2t1cCBjb25maXJtYXRpb24gVUksIHRva2VuPSIgKyB0b2tlbik7CisgICAgICAgICAgICBpZiAoIXN0YXJ0Q29uZmlybWF0aW9uVWkodG9rZW4sIEZ1bGxCYWNrdXAuRlVMTF9CQUNLVVBfSU5URU5UX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiVW5hYmxlIHRvIGxhdW5jaCBmdWxsIGJhY2t1cCBjb25maXJtYXRpb24iKTsKICAgICAgICAgICAgICAgICBtRnVsbENvbmZpcm1hdGlvbnMuZGVsZXRlKHRva2VuKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc2NyZWVuIGlzIGxpdCBmb3IgdGhlIHVzZXIgaW50ZXJhY3Rpb24KICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIudXNlckFjdGl2aXR5KFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLCBmYWxzZSk7CiAKICAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBjb25maXJtYXRpb24gY291bnRkb3duCi0gICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJQb3N0aW5nIGNvbmYgdGltZW91dCBtc2cgYWZ0ZXIgIgotICAgICAgICAgICAgICAgICAgICArIFRJTUVPVVRfRlVMTF9DT05GSVJNQVRJT04gKyAiIG1pbGxpcyIpOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtQmFja3VwSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19GVUxMX0NPTkZJUk1BVElPTl9USU1FT1VULAotICAgICAgICAgICAgICAgICAgICB0b2tlbiwgMCwgcGFyYW1zKTsKLSAgICAgICAgICAgIG1CYWNrdXBIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIFRJTUVPVVRfRlVMTF9DT05GSVJNQVRJT04pOworICAgICAgICAgICAgc3RhcnRDb25maXJtYXRpb25UaW1lb3V0KHRva2VuLCBwYXJhbXMpOwogCiAgICAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmFja3VwIHRvIGJlIHBlcmZvcm1lZAogICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiV2FpdGluZyBmb3IgZnVsbCBiYWNrdXAgY29tcGxldGlvbi4uLiIpOwogICAgICAgICAgICAgd2FpdEZvckNvbXBsZXRpb24ocGFyYW1zKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIi4uLkZ1bGwgYmFja3VwIG9wZXJhdGlvbiBjb21wbGV0ZSEiKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9sZElkKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvLyBqdXN0IGVhdCBpdAogICAgICAgICAgICAgfQorICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkob2xkSWQpOwogICAgICAgICB9CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkZ1bGwgYmFja3VwIGRvbmU7IHJldHVybmluZyB0byBjYWxsZXIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmdWxsUmVzdG9yZShQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJBQ0tVUCwgImZ1bGxCYWNrdXAiKTsKKyAgICAgICAgU2xvZy5pKFRBRywgIkJlZ2lubmluZyBmdWxsIHJlc3RvcmUuLi4iKTsKKworICAgICAgICBsb25nIG9sZElkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZ1bGxSZXN0b3JlUGFyYW1zIHBhcmFtcyA9IG5ldyBGdWxsUmVzdG9yZVBhcmFtcyhmZCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgdG9rZW4gPSBnZW5lcmF0ZVRva2VuKCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1GdWxsQ29uZmlybWF0aW9ucykgeworICAgICAgICAgICAgICAgIG1GdWxsQ29uZmlybWF0aW9ucy5wdXQodG9rZW4sIHBhcmFtcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IHVwIHRoZSBjb25maXJtYXRpb24gVUkKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIlN0YXJ0aW5nIHJlc3RvcmUgY29uZmlybWF0aW9uIFVJLCB0b2tlbj0iICsgdG9rZW4pOworICAgICAgICAgICAgaWYgKCFzdGFydENvbmZpcm1hdGlvblVpKHRva2VuLCBGdWxsQmFja3VwLkZVTExfUkVTVE9SRV9JTlRFTlRfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJVbmFibGUgdG8gbGF1bmNoIGZ1bGwgcmVzdG9yZSBjb25maXJtYXRpb24iKTsKKyAgICAgICAgICAgICAgICBtRnVsbENvbmZpcm1hdGlvbnMuZGVsZXRlKHRva2VuKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc2NyZWVuIGlzIGxpdCBmb3IgdGhlIHVzZXIgaW50ZXJhY3Rpb24KKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIudXNlckFjdGl2aXR5KFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLCBmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBjb25maXJtYXRpb24gY291bnRkb3duCisgICAgICAgICAgICBzdGFydENvbmZpcm1hdGlvblRpbWVvdXQodG9rZW4sIHBhcmFtcyk7CisKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSByZXN0b3JlIHRvIGJlIHBlcmZvcm1lZAorICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiV2FpdGluZyBmb3IgZnVsbCByZXN0b3JlIGNvbXBsZXRpb24uLi4iKTsKKyAgICAgICAgICAgIHdhaXRGb3JDb21wbGV0aW9uKHBhcmFtcyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZkLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkVycm9yIHRyeWluZyB0byBjbG9zZSBmZCBhZnRlciBmdWxsIHJlc3RvcmU6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9sZElkKTsKKyAgICAgICAgICAgIFNsb2cuaShUQUcsICJGdWxsIHJlc3RvcmUgY29tcGxldGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sZWFuIHN0YXJ0Q29uZmlybWF0aW9uVWkoaW50IHRva2VuLCBTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnRlbnQgY29uZkludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKKyAgICAgICAgICAgIGNvbmZJbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5iYWNrdXBjb25maXJtIiwKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmJhY2t1cGNvbmZpcm0uQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbiIpOworICAgICAgICAgICAgY29uZkludGVudC5wdXRFeHRyYShGdWxsQmFja3VwLkNPTkZfVE9LRU5fSU5URU5UX0VYVFJBLCB0b2tlbik7CisgICAgICAgICAgICBjb25mSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoY29uZkludGVudCk7CisgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgc3RhcnRDb25maXJtYXRpb25UaW1lb3V0KGludCB0b2tlbiwgRnVsbFBhcmFtcyBwYXJhbXMpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiUG9zdGluZyBjb25mIHRpbWVvdXQgbXNnIGFmdGVyICIKKyAgICAgICAgICAgICAgICArIFRJTUVPVVRfRlVMTF9DT05GSVJNQVRJT04gKyAiIG1pbGxpcyIpOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1CYWNrdXBIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0ZVTExfQ09ORklSTUFUSU9OX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgdG9rZW4sIDAsIHBhcmFtcyk7CisgICAgICAgIG1CYWNrdXBIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIFRJTUVPVVRfRlVMTF9DT05GSVJNQVRJT04pOwogICAgIH0KIAogICAgIHZvaWQgd2FpdEZvckNvbXBsZXRpb24oRnVsbFBhcmFtcyBwYXJhbXMpIHsKQEAgLTI2NjQsOSArMzcyMywxMCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vYnNlcnZlciA9IG9ic2VydmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZlcmIgPSBwYXJhbXMgaW5zdGFuY2VvZiBGdWxsQmFja3VwUGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICA/IE1TR19SVU5fRlVMTF9CQUNLVVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNU0dfUlVOX0ZVTExfQkFDS1VQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTVNHX1JVTl9GVUxMX1JFU1RPUkU7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIlNlbmRpbmcgY29uZiBtZXNzYWdlIHdpdGggdmVyYiAiICsgdmVyYik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2FrZWxvY2suYWNxdWlyZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtQmFja3VwSGFuZGxlci5vYnRhaW5NZXNzYWdlKHZlcmIsIHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQmFja3VwSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCmluZGV4IGQyZmQwNGIuLmRkNzZlYjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5VUERBVEVfREVWSUNFX1NUQVRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLmlzTmV0d29ya1R5cGVWYWxpZDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuUlVMRV9BTExPV19BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLlJVTEVfUkVKRUNUX1BBSUQ7CisKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhUZXRoZXJpbmdEYXRhVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtMjYsMTEgKzMxLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuRHVtbXlEYXRhU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LkV0aGVybmV0RGF0YVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTGlua0FkZHJlc3M7CitpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtQb2xpY3lMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5JTmV0d29ya1BvbGljeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTW9iaWxlRGF0YVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHk7CkBAIC0zOSw2ICs0Niw3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQudnBuLlZwbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtNTMsMjIgKzYxLDIxIEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jb25uZWN0aXZpdHkuVGV0aGVyaW5nOwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LkluZXQ0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAogLyoqCiAgKiBAaGlkZQpAQCAtNzgsNiArODUsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbm5lY3Rpdml0eVNlcnZpY2UiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dEX1JVTEVTID0gZmFsc2U7CisKICAgICAvLyBob3cgbG9uZyB0byB3YWl0IGJlZm9yZSBzd2l0Y2hpbmcgYmFjayB0byBhIHJhZGlvJ3MgZGVmYXVsdCBuZXR3b3JrCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1RPUkVfREVGQVVMVF9ORVRXT1JLX0RFTEFZID0gMSAqIDYwICogMTAwMDsKICAgICAvLyBzeXN0ZW0gcHJvcGVydHkgdGhhdCBjYW4gb3ZlcnJpZGUgdGhlIGFib3ZlIHZhbHVlCkBAIC05MSw2ICsxMDAsOSBAQAogICAgIHByaXZhdGUgVGV0aGVyaW5nIG1UZXRoZXJpbmc7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UZXRoZXJpbmdDb25maWdWYWxpZCA9IGZhbHNlOwogCisgICAgLyoqIEN1cnJlbnRseSBhY3RpdmUgbmV0d29yayBydWxlcyBieSBVSUQuICovCisgICAgcHJpdmF0ZSBTcGFyc2VJbnRBcnJheSBtVWlkUnVsZXMgPSBuZXcgU3BhcnNlSW50QXJyYXkoKTsKKwogICAgIC8qKgogICAgICAqIFNvbWV0aW1lcyB3ZSB3YW50IHRvIHJlZmVyIHRvIHRoZSBpbmRpdmlkdWFsIG5ldHdvcmsgc3RhdGUKICAgICAgKiB0cmFja2VycyBzZXBhcmF0ZWx5LCBhbmQgc29tZXRpbWVzIHdlIGp1c3Qgd2FudCB0byB0cmVhdCB0aGVtCkBAIC0xMjgsNiArMTQwLDcgQEAKICAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbUJhY2tncm91bmREYXRhRW5hYmxlZCA9IG5ldyBBdG9taWNCb29sZWFuKHRydWUpOwogCiAgICAgcHJpdmF0ZSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG1OZXRkOworICAgIHByaXZhdGUgSU5ldHdvcmtQb2xpY3lNYW5hZ2VyIG1Qb2xpY3lNYW5hZ2VyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQUJMRUQgID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQUJMRUQgPSAwOwpAQCAtMjUwLDE0ICsyNjMsOCBAQAogICAgIH0KICAgICBSYWRpb0F0dHJpYnV0ZXNbXSBtUmFkaW9BdHRyaWJ1dGVzOwogCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNTZXJ2aWNlSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgc1NlcnZpY2VJbnN0YW5jZSA9IG5ldyBDb25uZWN0aXZpdHlTZXJ2aWNlKGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzU2VydmljZUluc3RhbmNlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29ubmVjdGl2aXR5U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICBwdWJsaWMgQ29ubmVjdGl2aXR5U2VydmljZSgKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBuZXRkLCBJTmV0d29ya1BvbGljeU1hbmFnZXIgcG9saWN5TWFuYWdlcikgewogICAgICAgICBpZiAoREJHKSBsb2coIkNvbm5lY3Rpdml0eVNlcnZpY2Ugc3RhcnRpbmcgdXAiKTsKIAogICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ29ubmVjdGl2aXR5U2VydmljZVRocmVhZCIpOwpAQCAtMjkwLDkgKzI5NywxOSBAQAogICAgICAgICAgICAgbG9nZSgiRXJyb3Igc2V0dGluZyBkZWZhdWx0RG5zIHVzaW5nICIgKyBkbnMpOwogICAgICAgICB9CiAKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQ29udGV4dCA9IGNoZWNrTm90TnVsbChjb250ZXh0LCAibWlzc2luZyBDb250ZXh0Iik7CisgICAgICAgIG1OZXRkID0gY2hlY2tOb3ROdWxsKG5ldGQsICJtaXNzaW5nIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UiKTsKKyAgICAgICAgbVBvbGljeU1hbmFnZXIgPSBjaGVja05vdE51bGwocG9saWN5TWFuYWdlciwgIm1pc3NpbmcgSU5ldHdvcmtQb2xpY3lNYW5hZ2VyIik7CiAKLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVBvbGljeU1hbmFnZXIucmVnaXN0ZXJMaXN0ZW5lcihtUG9saWN5TGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gb3VjaCwgbm8gcnVsZXMgdXBkYXRlcyBtZWFucyBzb21lIHByb2Nlc3NlcyBtYXkgbmV2ZXIgZ2V0IG5ldHdvcmsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJ1bmFibGUgdG8gcmVnaXN0ZXIgSU5ldHdvcmtQb2xpY3lMaXN0ZW5lciIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICBDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgVEFHKTsKICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfbmV0d29ya1RyYW5zaXRpb25UaW1lb3V0KTsKQEAgLTUzNiwzMiArNTUzLDkyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hlY2sgaWYgVUlEIGlzIGJsb2NrZWQgZnJvbSB1c2luZyB0aGUgZ2l2ZW4ge0BsaW5rIE5ldHdvcmtJbmZvfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNOZXR3b3JrQmxvY2tlZChOZXR3b3JrSW5mbyBpbmZvLCBpbnQgdWlkKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVVpZFJ1bGVzKSB7CisgICAgICAgICAgICByZXR1cm4gaXNOZXR3b3JrQmxvY2tlZExvY2tlZChpbmZvLCB1aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgVUlEIGlzIGJsb2NrZWQgZnJvbSB1c2luZyB0aGUgZ2l2ZW4ge0BsaW5rIE5ldHdvcmtJbmZvfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNOZXR3b3JrQmxvY2tlZExvY2tlZChOZXR3b3JrSW5mbyBpbmZvLCBpbnQgdWlkKSB7CisgICAgICAgIC8vIFRPRE86IGV4cGFuZCBkZWZpbml0aW9uIG9mICJwYWlkIiBuZXR3b3JrIHRvIGNvdmVyIHRldGhlcmVkIG9yIHBhaWQKKyAgICAgICAgLy8gaG90c3BvdCB1c2UgY2FzZXMuCisgICAgICAgIGZpbmFsIGJvb2xlYW4gbmV0d29ya0lzUGFpZCA9IGluZm8uZ2V0VHlwZSgpICE9IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJOworICAgICAgICBmaW5hbCBpbnQgdWlkUnVsZXMgPSBtVWlkUnVsZXMuZ2V0KHVpZCwgUlVMRV9BTExPV19BTEwpOworCisgICAgICAgIGlmIChuZXR3b3JrSXNQYWlkICYmICh1aWRSdWxlcyAmIFJVTEVfUkVKRUNUX1BBSUQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gcmVzdHJpY3RpdmUgcnVsZXM7IG5ldHdvcmsgaXMgdmlzaWJsZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIE5ldHdvcmtJbmZvIGZvciB0aGUgYWN0aXZlIChpLmUuLCBjb25uZWN0ZWQpIG5ldHdvcmsgaW50ZXJmYWNlLgogICAgICAqIEl0IGlzIGFzc3VtZWQgdGhhdCBhdCBtb3N0IG9uZSBuZXR3b3JrIGlzIGFjdGl2ZSBhdCBhIHRpbWUuIElmIG1vcmUKICAgICAgKiB0aGFuIG9uZSBpcyBhY3RpdmUsIGl0IGlzIGluZGV0ZXJtaW5hdGUgd2hpY2ggd2lsbCBiZSByZXR1cm5lZC4KICAgICAgKiBAcmV0dXJuIHRoZSBpbmZvIGZvciB0aGUgYWN0aXZlIG5ldHdvcmssIG9yIHtAY29kZSBudWxsfSBpZiBub25lIGlzCiAgICAgICogYWN0aXZlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE5ldHdvcmtJbmZvIGdldEFjdGl2ZU5ldHdvcmtJbmZvKCkgewotICAgICAgICByZXR1cm4gZ2V0TmV0d29ya0luZm8obUFjdGl2ZURlZmF1bHROZXR3b3JrKTsKKyAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKKyAgICAgICAgZmluYWwgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgIHJldHVybiBnZXROZXR3b3JrSW5mbyhtQWN0aXZlRGVmYXVsdE5ldHdvcmssIHVpZCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5ldHdvcmtJbmZvIGdldEFjdGl2ZU5ldHdvcmtJbmZvRm9yVWlkKGludCB1aWQpIHsKKyAgICAgICAgZW5mb3JjZUNvbm5lY3Rpdml0eUludGVybmFsUGVybWlzc2lvbigpOworICAgICAgICByZXR1cm4gZ2V0TmV0d29ya0luZm8obUFjdGl2ZURlZmF1bHROZXR3b3JrLCB1aWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbyhpbnQgbmV0d29ya1R5cGUpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKENvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZVZhbGlkKG5ldHdvcmtUeXBlKSkgewotICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciB0ID0gbU5ldFRyYWNrZXJzW25ldHdvcmtUeXBlXTsKLSAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0TmV0d29ya0luZm8oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgZmluYWwgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgIHJldHVybiBnZXROZXR3b3JrSW5mbyhuZXR3b3JrVHlwZSwgdWlkKTsKICAgICB9CiAKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKGludCBuZXR3b3JrVHlwZSwgaW50IHVpZCkgeworICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gbnVsbDsKKyAgICAgICAgaWYgKGlzTmV0d29ya1R5cGVWYWxpZChuZXR3b3JrVHlwZSkpIHsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0ZVRyYWNrZXIgdHJhY2tlciA9IG1OZXRUcmFja2Vyc1tuZXR3b3JrVHlwZV07CisgICAgICAgICAgICBpZiAodHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5mbyA9IHRyYWNrZXIuZ2V0TmV0d29ya0luZm8oKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNOZXR3b3JrQmxvY2tlZChpbmZvLCB1aWQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5ldHdvcmsgaXMgYmxvY2tlZDsgY2xvbmUgYW5kIG92ZXJyaWRlIHN0YXRlCisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgTmV0d29ya0luZm8oaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGluZm8uc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkJMT0NLRUQsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTmV0d29ya0luZm9bXSBnZXRBbGxOZXR3b3JrSW5mbygpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgTmV0d29ya0luZm9bXSByZXN1bHQgPSBuZXcgTmV0d29ya0luZm9bbU5ldHdvcmtzRGVmaW5lZF07CisgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBmaW5hbCBOZXR3b3JrSW5mb1tdIHJlc3VsdCA9IG5ldyBOZXR3b3JrSW5mb1ttTmV0d29ya3NEZWZpbmVkXTsKICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKE5ldHdvcmtTdGF0ZVRyYWNrZXIgdCA6IG1OZXRUcmFja2VycykgewotICAgICAgICAgICAgaWYodCAhPSBudWxsKSByZXN1bHRbaSsrXSA9IHQuZ2V0TmV0d29ya0luZm8oKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtVWlkUnVsZXMpIHsKKyAgICAgICAgICAgIGZvciAoTmV0d29ya1N0YXRlVHJhY2tlciB0cmFja2VyIDogbU5ldFRyYWNrZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gdHJhY2tlci5nZXROZXR3b3JrSW5mbygpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNOZXR3b3JrQmxvY2tlZExvY2tlZChpbmZvLCB1aWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXR3b3JrIGlzIGJsb2NrZWQ7IGNsb25lIGFuZCBvdmVycmlkZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkJMT0NLRUQsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpKytdID0gaW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC01NzQsMTUgKzY1MSwxOSBAQAogICAgICAqIEByZXR1cm4gdGhlIGlwIHByb3BlcnRpZXMgZm9yIHRoZSBhY3RpdmUgbmV0d29yaywgb3Ige0Bjb2RlIG51bGx9IGlmCiAgICAgICogbm9uZSBpcyBhY3RpdmUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0QWN0aXZlTGlua1Byb3BlcnRpZXMoKSB7CiAgICAgICAgIHJldHVybiBnZXRMaW5rUHJvcGVydGllcyhtQWN0aXZlRGVmYXVsdE5ldHdvcmspOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhpbnQgbmV0d29ya1R5cGUpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKENvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZVZhbGlkKG5ldHdvcmtUeXBlKSkgewotICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciB0ID0gbU5ldFRyYWNrZXJzW25ldHdvcmtUeXBlXTsKLSAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHJldHVybiB0LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChpc05ldHdvcmtUeXBlVmFsaWQobmV0d29ya1R5cGUpKSB7CisgICAgICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdGVUcmFja2VyIHRyYWNrZXIgPSBtTmV0VHJhY2tlcnNbbmV0d29ya1R5cGVdOworICAgICAgICAgICAgaWYgKHRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFja2VyLmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMTAyNyw2ICsxMTA4LDMwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIElOZXR3b3JrUG9saWN5TGlzdGVuZXIgbVBvbGljeUxpc3RlbmVyID0gbmV3IElOZXR3b3JrUG9saWN5TGlzdGVuZXIuU3R1YigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUnVsZXNDaGFuZ2VkKGludCB1aWQsIGludCB1aWRSdWxlcykgeworICAgICAgICAgICAgLy8gb25seSBzb21lb25lIGxpa2UgTlBNUyBzaG91bGQgb25seSBiZSBjYWxsaW5nIHVzCisgICAgICAgICAgICAvLyBUT0RPOiBjcmVhdGUgcGVybWlzc2lvbiBmb3IgbW9kaWZ5aW5nIGRhdGEgcG9saWN5CisgICAgICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oVVBEQVRFX0RFVklDRV9TVEFUUywgVEFHKTsKKworICAgICAgICAgICAgaWYgKExPR0RfUlVMRVMpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25SdWxlc0NoYW5nZWQodWlkPSIgKyB1aWQgKyAiLCB1aWRSdWxlcz0iICsgdWlkUnVsZXMgKyAiKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1VaWRSdWxlcykgeworICAgICAgICAgICAgICAgIC8vIHNraXAgdXBkYXRlIHdoZW4gd2UndmUgYWxyZWFkeSBhcHBsaWVkIHJ1bGVzCisgICAgICAgICAgICAgICAgZmluYWwgaW50IG9sZFJ1bGVzID0gbVVpZFJ1bGVzLmdldCh1aWQsIFJVTEVfQUxMT1dfQUxMKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkUnVsZXMgPT0gdWlkUnVsZXMpIHJldHVybjsKKworICAgICAgICAgICAgICAgIG1VaWRSdWxlcy5wdXQodWlkLCB1aWRSdWxlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IGRpc3BhdGNoIGludG8gTk1TIHRvIHB1c2ggcnVsZXMgdG93YXJkcyBrZXJuZWwgbW9kdWxlCisgICAgICAgICAgICAvLyBUT0RPOiBub3RpZnkgVUlEIHdoZW4gaXQgaGFzIHJlcXVlc3RlZCB0YXJnZXRlZCB1cGRhdGVzCisgICAgICAgIH0KKyAgICB9OworCiAgICAgLyoqCiAgICAgICogQHNlZSBDb25uZWN0aXZpdHlNYW5hZ2VyI3NldE1vYmlsZURhdGFFbmFibGVkKGJvb2xlYW4pCiAgICAgICovCkBAIC0xMjg0LDkgKzEzODksNiBAQAogICAgIH0KIAogICAgIHZvaWQgc3lzdGVtUmVhZHkoKSB7Ci0gICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKLSAgICAgICAgbU5ldGQgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7Ci0KICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CiAgICAgICAgICAgICBpZiAobUluaXRpYWxCcm9hZGNhc3QgIT0gbnVsbCkgewpAQCAtMTU1MiwxMiArMTY1NCwxMiBAQAogCiAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSA2KSB7CiAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiL3N5cy9rZXJuZWwvaXB2NC90Y3BfIjsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWluIiwgdmFsdWVzWzBdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fZGVmIiwgdmFsdWVzWzFdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWluIiwgdmFsdWVzWzNdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fZGVmIiwgdmFsdWVzWzRdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21pbiIsIHZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9kZWYiLCB2YWx1ZXNbMV0pOworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21pbiIsIHZhbHVlc1szXSk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9kZWYiLCB2YWx1ZXNbNF0pOworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbG9nZSgiSW52YWxpZCBidWZmZXJzaXplIHN0cmluZzogIiArIGJ1ZmZlclNpemVzKTsKICAgICAgICAgICAgIH0KQEAgLTE1NjYsMjMgKzE2NjgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAvKioKLSAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdHJpbmdUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dC53cml0ZShzdHJpbmcpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQogICAgIC8qKgogICAgICAqIEFkanVzdCB0aGUgcGVyLXByb2Nlc3MgZG5zIGVudHJpZXMgKG5ldC5kbnM8eD4uPHBpZD4pIGJhc2VkCiAgICAgICogb24gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYWN0aXZlIG5ldCB3aGljaCB0aGlzIHByb2Nlc3MgcmVxdWVzdGVkLgpAQCAtMjI3Miw0ICsyMzU3LDExIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldHdvcmtUeXBlOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIGNoZWNrTm90TnVsbChUIHZhbHVlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA5MmQ3NmJlLi4zMTgxYTlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gREVGX01JTklNVU1fUEFTU1dPUkRfTE9XRVJfQ0FTRTsKIAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IERFRl9NSU5JTVVNX1BBU1NXT1JEX0xFVFRFUlMgPSAxOwotICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGV0dGVycyA9IERFRl9NSU5JTVVNX1BBU1NXT1JEX0xPV0VSX0NBU0U7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gREVGX01JTklNVU1fUEFTU1dPUkRfTEVUVEVSUzsKIAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IERFRl9NSU5JTVVNX1BBU1NXT1JEX05VTUVSSUMgPSAxOwogICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IERFRl9NSU5JTVVNX1BBU1NXT1JEX05VTUVSSUM7CkBAIC0xOTI1LDkgKzE5MjUsOCBAQAogICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBlcm1pc3Npb25zIGlmIGEgcGFydGljdWxhciBjYWxsZXIgaXMgc3BlY2lmaWVkCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBXaGVuIGNoZWNraW5nIGZvciBhIHNpbmdsZSBjYWxsZXIsIHN0YXR1cyBpcyBiYXNlZCBvbiBjYWxsZXIncyByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19FTkNSWVBURURfU1RPUkFHRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFwLmVuY3J5cHRpb25SZXF1ZXN0ZWQ7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhcCAhPSBudWxsID8gYXAuZW5jcnlwdGlvblJlcXVlc3RlZCA6IGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiBubyBwYXJ0aWN1bGFyIGNhbGxlciBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgYWdncmVnYXRlIHNldCBvZiByZXF1ZXN0cy4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0NjVmZDJlLi5mNDMwOGNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xMjYsMTAgKzEyNiw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlRZUEVfTU9ERV9LRVlCT0FSRCA9ICJrZXlib2FyZCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlRZUEVfTU9ERV9WT0lDRSA9ICJ2b2ljZSI7CiAKLSAgICAvLyBUT0RPOiBXaWxsIGZvcm1hbGl6ZSB0aGlzIHZhbHVlIGFzIEFQSQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJUWVBFX0VYVFJBVkFMVUVfRVhDTFVERV9GUk9NX0xBU1RfSU1FID0KLSAgICAgICAgICAgICJleGNsdWRlRnJvbUxhc3RJbnB1dE1ldGhvZCI7Ci0KICAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIGZpbmFsIFJlc291cmNlcyBtUmVzOwogICAgIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CkBAIC0xODgzLDEzICsxODc5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdWJ0eXBlQ291bnQgPSBpbWkuZ2V0U3VidHlwZUNvdW50KCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3VidHlwZUNvdW50OyArK2opIHsKICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlID0gaW1pLmdldFN1YnR5cGVBdChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkU3VidHlwZVNldC5jb250YWlucyhTdHJpbmcudmFsdWVPZihzdWJ0eXBlLmhhc2hDb2RlKCkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWRTdWJ0eXBlU2V0LmNvbnRhaW5zKFN0cmluZy52YWx1ZU9mKHN1YnR5cGUuaGFzaENvZGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdWJ0eXBlLmlzQXV4aWxpYXJ5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgdGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5hbWVSZXNJZCA9IHN1YnR5cGUuZ2V0TmFtZVJlc0lkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBzdWJ0eXBlLmdldE1vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVJlc0lkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBUZXh0VXRpbHMuY29uY2F0KHBtLmdldFRleHQoaW1pLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVJlc0lkLCBpbWkuZ2V0U2VydmljZUluZm8oKS5hcHBsaWNhdGlvbkluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IFRleHRVdGlscy5jb25jYXQoc3VidHlwZS5nZXREaXNwbGF5TmFtZShjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltaS5nZXRQYWNrYWdlTmFtZSgpLCBpbWkuZ2V0U2VydmljZUluZm8oKS5hcHBsaWNhdGlvbkluZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkgPyAiIiA6ICIgKCIgKyBsYWJlbCArICIpIikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBsYW5ndWFnZSA9IHN1YnR5cGUuZ2V0TG9jYWxlKCk7CkBAIC0yMDc4LDcgKzIwNzUsNyBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbkFkZFRvTGFzdElucHV0TWV0aG9kKElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlKSB7CiAgICAgICAgIGlmIChzdWJ0eXBlID09IG51bGwpIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gIXN1YnR5cGUuY29udGFpbnNFeHRyYVZhbHVlS2V5KFNVQlRZUEVfRVhUUkFWQUxVRV9FWENMVURFX0ZST01fTEFTVF9JTUUpOworICAgICAgICByZXR1cm4gIXN1YnR5cGUuaXNBdXhpbGlhcnkoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2F2ZUN1cnJlbnRJbnB1dE1ldGhvZEFuZFN1YnR5cGVUb0hpc3RvcnkoKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXRTdGF0U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0U3RhdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlNjc0My4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXRTdGF0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOwotaW1wb3J0IGFuZHJvaWQub3MuSU5ldFN0YXRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBOZXRTdGF0U2VydmljZSBleHRlbmRzIElOZXRTdGF0U2VydmljZS5TdHViIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgTmV0U3RhdFNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNb2JpbGVUeFBhY2tldHMoKSB7Ci0gICAgICAgIHJldHVybiBUcmFmZmljU3RhdHMuZ2V0TW9iaWxlVHhQYWNrZXRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TW9iaWxlUnhQYWNrZXRzKCkgewotICAgICAgICByZXR1cm4gVHJhZmZpY1N0YXRzLmdldE1vYmlsZVJ4UGFja2V0cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldE1vYmlsZVR4Qnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBUcmFmZmljU3RhdHMuZ2V0TW9iaWxlVHhCeXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldE1vYmlsZVJ4Qnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBUcmFmZmljU3RhdHMuZ2V0TW9iaWxlUnhCeXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFRvdGFsVHhQYWNrZXRzKCkgewotICAgICAgICByZXR1cm4gVHJhZmZpY1N0YXRzLmdldFRvdGFsVHhQYWNrZXRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0VG90YWxSeFBhY2tldHMoKSB7Ci0gICAgICAgIHJldHVybiBUcmFmZmljU3RhdHMuZ2V0VG90YWxSeFBhY2tldHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbFR4Qnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBUcmFmZmljU3RhdHMuZ2V0VG90YWxUeEJ5dGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0VG90YWxSeEJ5dGVzKCkgewotICAgICAgICByZXR1cm4gVHJhZmZpY1N0YXRzLmdldFRvdGFsUnhCeXRlcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIC8vIFRoaXMgZGF0YSBpcyBhY2Nlc3NpYmxlIHRvIGFueSBhcHAgLS0gbm8gcGVybWlzc2lvbiBjaGVjayBuZWVkZWQuCi0KLSAgICAgICAgcHcucHJpbnQoIkVsYXBzZWQ6IHRvdGFsPSIpOwotICAgICAgICBwdy5wcmludChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgIHB3LnByaW50KCJtcyBhd2FrZT0iKTsKLSAgICAgICAgcHcucHJpbnQoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwotICAgICAgICBwdy5wcmludGxuKCJtcyIpOwotCi0gICAgICAgIHB3LnByaW50KCJNb2JpbGU6IFR4PSIpOwotICAgICAgICBwdy5wcmludChnZXRNb2JpbGVUeEJ5dGVzKCkpOwotICAgICAgICBwdy5wcmludCgiQi8iKTsKLSAgICAgICAgcHcucHJpbnQoZ2V0TW9iaWxlVHhQYWNrZXRzKCkpOwotICAgICAgICBwdy5wcmludCgiUGt0cyBSeD0iKTsKLSAgICAgICAgcHcucHJpbnQoZ2V0TW9iaWxlUnhCeXRlcygpKTsKLSAgICAgICAgcHcucHJpbnQoIkIvIik7Ci0gICAgICAgIHB3LnByaW50KGdldE1vYmlsZVJ4UGFja2V0cygpKTsKLSAgICAgICAgcHcucHJpbnRsbigiUGt0cyIpOwotCi0gICAgICAgIHB3LnByaW50KCJUb3RhbDogVHg9Iik7Ci0gICAgICAgIHB3LnByaW50KGdldFRvdGFsVHhCeXRlcygpKTsKLSAgICAgICAgcHcucHJpbnQoIkIvIik7Ci0gICAgICAgIHB3LnByaW50KGdldFRvdGFsVHhQYWNrZXRzKCkpOwotICAgICAgICBwdy5wcmludCgiUGt0cyBSeD0iKTsKLSAgICAgICAgcHcucHJpbnQoZ2V0VG90YWxSeEJ5dGVzKCkpOwotICAgICAgICBwdy5wcmludCgiQi8iKTsKLSAgICAgICAgcHcucHJpbnQoZ2V0VG90YWxSeFBhY2tldHMoKSk7Ci0gICAgICAgIHB3LnByaW50bG4oIlBrdHMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1CYWNrdXBBZ2VudC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtQmFja3VwQWdlbnQuamF2YQppbmRleCA1NDU1NWJiLi45OWM4YWY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1CYWNrdXBBZ2VudC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbUJhY2t1cEFnZW50LmphdmEKQEAgLTM3LDE2ICszNywyNSBAQAogcHVibGljIGNsYXNzIFN5c3RlbUJhY2t1cEFnZW50IGV4dGVuZHMgQmFja3VwQWdlbnRIZWxwZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtQmFja3VwQWdlbnQiOwogCi0gICAgLy8gVGhlc2UgcGF0aHMgbXVzdCBtYXRjaCB3aGF0IHRoZSBXYWxscGFwZXJNYW5hZ2VyU2VydmljZSB1c2VzCisgICAgLy8gVGhlc2UgcGF0aHMgbXVzdCBtYXRjaCB3aGF0IHRoZSBXYWxscGFwZXJNYW5hZ2VyU2VydmljZSB1c2VzLiAgVGhlIGxlYWYgKl9GSUxFTkFNRQorICAgIC8vIGFyZSBhbHNvIHVzZWQgaW4gdGhlIGZ1bGwtYmFja3VwIGZpbGUgZm9ybWF0LCBzbyBtdXN0IG5vdCBjaGFuZ2UgdW5sZXNzIHN0ZXBzIGFyZQorICAgIC8vIHRha2VuIHRvIHN1cHBvcnQgdGhlIGxlZ2FjeSBiYWNrZWQtdXAgZGF0YXNldHMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBTExQQVBFUl9JTUFHRV9GSUxFTkFNRSA9ICJ3YWxscGFwZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQUxMUEFQRVJfSU5GT19GSUxFTkFNRSA9ICJ3YWxscGFwZXJfaW5mby54bWwiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBTExQQVBFUl9JTUFHRV9ESVIgPSAiL2RhdGEvZGF0YS9jb20uYW5kcm9pZC5zZXR0aW5ncy9maWxlcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBTExQQVBFUl9JTUFHRSA9IFdBTExQQVBFUl9JTUFHRV9ESVIgKyAiL3dhbGxwYXBlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBTExQQVBFUl9JTUFHRSA9IFdBTExQQVBFUl9JTUFHRV9ESVIgKyAiLyIgKyBXQUxMUEFQRVJfSU1BR0VfRklMRU5BTUU7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FMTFBBUEVSX0lORk9fRElSID0gIi9kYXRhL3N5c3RlbSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBTExQQVBFUl9JTkZPID0gV0FMTFBBUEVSX0lORk9fRElSICsgIi93YWxscGFwZXJfaW5mby54bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQUxMUEFQRVJfSU5GTyA9IFdBTExQQVBFUl9JTkZPX0RJUiArICIvIiArICBXQUxMUEFQRVJfSU5GT19GSUxFTkFNRTsKKwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25CYWNrdXAoUGFyY2VsRmlsZURlc2NyaXB0b3Igb2xkU3RhdGUsIEJhY2t1cERhdGFPdXRwdXQgZGF0YSwKICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5ld1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAob2xkU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQWgsIGl0J3MgYSBmdWxsIGJhY2t1cCBkYXRhc2V0LCBiZWluZyByZXN0b3JlZCBwaWVjZW1lYWwuICBKdXN0CisgICAgICAgICAgICAvLyBwb3Agb3ZlciB0byB0aGUgZnVsbCByZXN0b3JlIGhhbmRsaW5nIGFuZCB3ZSdyZSBkb25lLgogICAgICAgICAgICAgcnVuRnVsbEJhY2t1cChkYXRhKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNjYsMTEgKzc1LDE4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJ1bkZ1bGxCYWNrdXAoQmFja3VwRGF0YU91dHB1dCBvdXRwdXQpIHsKLSAgICAgICAgLy8gQmFjayB1cCB0aGUgZGF0YSBmaWxlcyBkaXJlY3RseQotICAgICAgICBGdWxsQmFja3VwLmJhY2t1cFRvVGFyKGdldFBhY2thZ2VOYW1lKCksIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgV0FMTFBBUEVSX0lNQUdFX0RJUiwgV0FMTFBBUEVSX0lNQUdFLCBvdXRwdXQpOwotICAgICAgICBGdWxsQmFja3VwLmJhY2t1cFRvVGFyKGdldFBhY2thZ2VOYW1lKCksIG51bGwsIG51bGwsCisgICAgICAgIGZ1bGxXYWxscGFwZXJCYWNrdXAob3V0cHV0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZnVsbFdhbGxwYXBlckJhY2t1cChCYWNrdXBEYXRhT3V0cHV0IG91dHB1dCkgeworICAgICAgICAvLyBCYWNrIHVwIHRoZSBkYXRhIGZpbGVzIGRpcmVjdGx5LiAgV2UgZG8gdGhlbSBpbiB0aGlzIHNwZWNpZmljIG9yZGVyIC0tCisgICAgICAgIC8vIGluZm8gZmlsZSBmb2xsb3dlZCBieSBpbWFnZSAtLSBiZWNhdXNlIHRoZW4gd2UgbmVlZCB0YWtlIG5vIHNwZWNpYWwKKyAgICAgICAgLy8gc3RlcHMgZHVyaW5nIHJlc3RvcmU7IHRoZSByZXN0b3JlIHdpbGwgaGFwcGVuIHByb3Blcmx5IHdoZW4gdGhlIGluZGl2aWR1YWwKKyAgICAgICAgLy8gZmlsZXMgYXJlIHJlc3RvcmVkIHBpZWNlbWVhbC4KKyAgICAgICAgRnVsbEJhY2t1cC5iYWNrdXBUb1RhcihnZXRQYWNrYWdlTmFtZSgpLCBGdWxsQmFja3VwLlJPT1RfVFJFRV9UT0tFTiwgbnVsbCwKICAgICAgICAgICAgICAgICBXQUxMUEFQRVJfSU5GT19ESVIsIFdBTExQQVBFUl9JTkZPLCBvdXRwdXQpOworICAgICAgICBGdWxsQmFja3VwLmJhY2t1cFRvVGFyKGdldFBhY2thZ2VOYW1lKCksIEZ1bGxCYWNrdXAuUk9PVF9UUkVFX1RPS0VOLCBudWxsLAorICAgICAgICAgICAgICAgIFdBTExQQVBFUl9JTUFHRV9ESVIsIFdBTExQQVBFUl9JTUFHRSwgb3V0cHV0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTk2LDQgKzExMiw0NiBAQAogICAgICAgICAgICAgKG5ldyBGaWxlKFdBTExQQVBFUl9JTkZPKSkuZGVsZXRlKCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmVGaWxlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGRhdGEsIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgIGludCB0eXBlLCBTdHJpbmcgZG9tYWluLCBTdHJpbmcgcGF0aCwgbG9uZyBtb2RlLCBsb25nIG10aW1lKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU2xvZy5pKFRBRywgIlJlc3RvcmluZyBmaWxlIGRvbWFpbj0iICsgZG9tYWluICsgIiBwYXRoPSIgKyBwYXRoKTsKKworICAgICAgICAvLyBCaXRzIHRvIGluZGljYXRlIHBvc3Rwcm9jZXNzaW5nIHdlIG1heSBuZWVkIHRvIHBlcmZvcm0KKyAgICAgICAgYm9vbGVhbiByZXN0b3JlZFdhbGxwYXBlciA9IGZhbHNlOworCisgICAgICAgIEZpbGUgb3V0RmlsZSA9IG51bGw7CisgICAgICAgIC8vIFZhcmlvdXMgZG9tYWluK2ZpbGVzIHdlIHVuZGVyc3RhbmQgYSBwcmlvcmkKKyAgICAgICAgaWYgKGRvbWFpbi5lcXVhbHMoRnVsbEJhY2t1cC5ST09UX1RSRUVfVE9LRU4pKSB7CisgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoV0FMTFBBUEVSX0lORk9fRklMRU5BTUUpKSB7CisgICAgICAgICAgICAgICAgb3V0RmlsZSA9IG5ldyBGaWxlKFdBTExQQVBFUl9JTkZPKTsKKyAgICAgICAgICAgICAgICByZXN0b3JlZFdhbGxwYXBlciA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGguZXF1YWxzKFdBTExQQVBFUl9JTUFHRV9GSUxFTkFNRSkpIHsKKyAgICAgICAgICAgICAgICBvdXRGaWxlID0gbmV3IEZpbGUoV0FMTFBBUEVSX0lNQUdFKTsKKyAgICAgICAgICAgICAgICByZXN0b3JlZFdhbGxwYXBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG91dEZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJTa2lwcGluZyB1bnJlY29nbml6ZWQgc3lzdGVtIGZpbGU6IFsgIiArIGRvbWFpbiArICIgOiAiICsgcGF0aCArICIgXSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRnVsbEJhY2t1cC5yZXN0b3JlVG9GaWxlKGRhdGEsIHNpemUsIHR5cGUsIG1vZGUsIG10aW1lLCBvdXRGaWxlKTsKKworICAgICAgICAgICAgaWYgKHJlc3RvcmVkV2FsbHBhcGVyKSB7CisgICAgICAgICAgICAgICAgV2FsbHBhcGVyTWFuYWdlclNlcnZpY2Ugd2FsbHBhcGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChXYWxscGFwZXJNYW5hZ2VyU2VydmljZSlTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5XQUxMUEFQRVJfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgd2FsbHBhcGVyLnNldHRpbmdzUmVzdG9yZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKHJlc3RvcmVkV2FsbHBhcGVyKSB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHdpbmQgdXAgaW4gYSBnb29kIHN0YXRlCisgICAgICAgICAgICAgICAgKG5ldyBGaWxlKFdBTExQQVBFUl9JTUFHRSkpLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIChuZXcgRmlsZShXQUxMUEFQRVJfSU5GTykpLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtU2VydmVyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YQppbmRleCA1MzU1ZDQ0Li41OTZjYmFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YQpAQCAtMTYsMTkgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VNYW5hZ2VyU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIudXNiLlVzYlNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLldpbmRvd01hbmFnZXJTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5TaHV0ZG93blRocmVhZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5CaW5kZXJJbnRlcm5hbDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb247Ci0KLWltcG9ydCBkYWx2aWsuc3lzdGVtLlZNUnVudGltZTsKLWltcG9ydCBkYWx2aWsuc3lzdGVtLlp5Z290ZTsKLQogaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwpAQCAtNDEsMjUgKzI4LDM1IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5QZW9wbGU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhBMmRwU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hNYW5hZ2VyU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuU2h1dGRvd25UaHJlYWQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuQmluZGVySW50ZXJuYWw7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0Lk5ldHdvcmtTdGF0c1NlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIudXNiLlVzYlNlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLldpbmRvd01hbmFnZXJTZXJ2aWNlOworCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVJ1bnRpbWU7CitpbXBvcnQgZGFsdmlrLnN5c3RlbS5aeWdvdGU7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVyOwogaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CkBAIC0xMjAsNiArMTE3LDkgQEAKICAgICAgICAgTGlnaHRzU2VydmljZSBsaWdodHMgPSBudWxsOwogICAgICAgICBQb3dlck1hbmFnZXJTZXJ2aWNlIHBvd2VyID0gbnVsbDsKICAgICAgICAgQmF0dGVyeVNlcnZpY2UgYmF0dGVyeSA9IG51bGw7CisgICAgICAgIEFsYXJtTWFuYWdlclNlcnZpY2UgYWxhcm0gPSBudWxsOworICAgICAgICBOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UgbmV0d29ya01hbmFnZW1lbnQgPSBudWxsOworICAgICAgICBOZXR3b3JrU3RhdHNTZXJ2aWNlIG5ldHdvcmtTdGF0cyA9IG51bGw7CiAgICAgICAgIE5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZSBuZXR3b3JrUG9saWN5ID0gbnVsbDsKICAgICAgICAgQ29ubmVjdGl2aXR5U2VydmljZSBjb25uZWN0aXZpdHkgPSBudWxsOwogICAgICAgICBJUGFja2FnZU1hbmFnZXIgcG0gPSBudWxsOwpAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgICAgICAgICBwb3dlci5pbml0KGNvbnRleHQsIGxpZ2h0cywgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5nZXREZWZhdWx0KCksIGJhdHRlcnkpOwogCiAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiQWxhcm0gTWFuYWdlciIpOwotICAgICAgICAgICAgQWxhcm1NYW5hZ2VyU2VydmljZSBhbGFybSA9IG5ldyBBbGFybU1hbmFnZXJTZXJ2aWNlKGNvbnRleHQpOworICAgICAgICAgICAgYWxhcm0gPSBuZXcgQWxhcm1NYW5hZ2VyU2VydmljZShjb250ZXh0KTsKICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFLCBhbGFybSk7CiAKICAgICAgICAgICAgIFNsb2cuaShUQUcsICJJbml0IFdhdGNoZG9nIik7CkBAIC0yNzcsMzMgKzI3NywzMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJOZXRTdGF0IFNlcnZpY2UiKTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKCJuZXRzdGF0IiwgbmV3IE5ldFN0YXRTZXJ2aWNlKGNvbnRleHQpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgTmV0U3RhdCBTZXJ2aWNlIiwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIk5ldHdvcmtQb2xpY3kgU2VydmljZSIpOwotICAgICAgICAgICAgICAgIG5ldHdvcmtQb2xpY3kgPSBuZXcgTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5zZWxmKCksIHBvd2VyKTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuTkVUV09SS19QT0xJQ1lfU0VSVklDRSwgbmV0d29ya1BvbGljeSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIENvbm5lY3Rpdml0eSBTZXJ2aWNlIiwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIk5ldHdvcmtNYW5hZ2VtZW50IFNlcnZpY2UiKTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmNyZWF0ZShjb250ZXh0KSk7CisgICAgICAgICAgICAgICAgbmV0d29ya01hbmFnZW1lbnQgPSBOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuY3JlYXRlKGNvbnRleHQpOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFLCBuZXR3b3JrTWFuYWdlbWVudCk7CiAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewogICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIE5ldHdvcmtNYW5hZ2VtZW50IFNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiTmV0d29ya1N0YXRzIFNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICBuZXR3b3JrU3RhdHMgPSBuZXcgTmV0d29ya1N0YXRzU2VydmljZShjb250ZXh0LCBuZXR3b3JrTWFuYWdlbWVudCwgYWxhcm0pOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLX1NUQVRTX1NFUlZJQ0UsIG5ldHdvcmtTdGF0cyk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIE5ldHdvcmtTdGF0cyBTZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIk5ldHdvcmtQb2xpY3kgU2VydmljZSIpOworICAgICAgICAgICAgICAgIG5ldHdvcmtQb2xpY3kgPSBuZXcgTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5zZWxmKCksIHBvd2VyLCBuZXR3b3JrU3RhdHMpOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLX1BPTElDWV9TRVJWSUNFLCBuZXR3b3JrUG9saWN5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgTmV0d29ya1BvbGljeSBTZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkNvbm5lY3Rpdml0eSBTZXJ2aWNlIik7Ci0gICAgICAgICAgICAgICAgY29ubmVjdGl2aXR5ID0gQ29ubmVjdGl2aXR5U2VydmljZS5nZXRJbnN0YW5jZShjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aXZpdHkgPSBuZXcgQ29ubmVjdGl2aXR5U2VydmljZShjb250ZXh0LCBuZXR3b3JrTWFuYWdlbWVudCwgbmV0d29ya1BvbGljeSk7CiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFLCBjb25uZWN0aXZpdHkpOwogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBDb25uZWN0aXZpdHkgU2VydmljZSIsIGUpOwpAQCAtNTM5LDYgKzUzOSw3IEBACiAgICAgICAgIC8vIFRoZXNlIGFyZSBuZWVkZWQgdG8gcHJvcGFnYXRlIHRvIHRoZSBydW5uYWJsZSBiZWxvdy4KICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0RiA9IGNvbnRleHQ7CiAgICAgICAgIGZpbmFsIEJhdHRlcnlTZXJ2aWNlIGJhdHRlcnlGID0gYmF0dGVyeTsKKyAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzU2VydmljZSBuZXR3b3JrU3RhdHNGID0gbmV0d29ya1N0YXRzOwogICAgICAgICBmaW5hbCBOZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2UgbmV0d29ya1BvbGljeUYgPSBuZXR3b3JrUG9saWN5OwogICAgICAgICBmaW5hbCBDb25uZWN0aXZpdHlTZXJ2aWNlIGNvbm5lY3Rpdml0eUYgPSBjb25uZWN0aXZpdHk7CiAgICAgICAgIGZpbmFsIERvY2tPYnNlcnZlciBkb2NrRiA9IGRvY2s7CkBAIC01NjUsNiArNTY2LDcgQEAKIAogICAgICAgICAgICAgICAgIHN0YXJ0U3lzdGVtVWkoY29udGV4dEYpOwogICAgICAgICAgICAgICAgIGlmIChiYXR0ZXJ5RiAhPSBudWxsKSBiYXR0ZXJ5Ri5zeXN0ZW1SZWFkeSgpOworICAgICAgICAgICAgICAgIGlmIChuZXR3b3JrU3RhdHNGICE9IG51bGwpIG5ldHdvcmtTdGF0c0Yuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgICAgICAgICBpZiAobmV0d29ya1BvbGljeUYgIT0gbnVsbCkgbmV0d29ya1BvbGljeUYuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGl2aXR5RiAhPSBudWxsKSBjb25uZWN0aXZpdHlGLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICAgICAgaWYgKGRvY2tGICE9IG51bGwpIGRvY2tGLnN5c3RlbVJlYWR5KCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBkOTYzNjliLi44NjY3MWQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE2LDExICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmFjY2Vzc2liaWxpdHk7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb250ZW50LlBhY2thZ2VNb25pdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLkhhbmRsZXJDYWxsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuSGFuZGxlckNhbGxlci5Tb21lQXJnczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20uV2luZG93TWFuYWdlclNlcnZpY2U7Ci0KK2ltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwogaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5JQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uOwpAQCAtMzUsMzQgKzMxLDQ1IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkRlYWRPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlNpbXBsZVN0cmluZ1NwbGl0dGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvdzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbnRlbnQuUGFja2FnZU1vbml0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuSGFuZGxlckNhbGxlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5IYW5kbGVyQ2FsbGVyLlNvbWVBcmdzOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5XaW5kb3dNYW5hZ2VyU2VydmljZTsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZCBieSB0aGUgc3lzdGVtIGFzIGEgc3lzdGVtIGxldmVsIHNlcnZpY2UgYW5kIGNhbiBiZQpAQCAtNzksMTIgKzg2LDE3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTkNUSU9OX1JFR0lTVEVSX0VWRU5UX0xJU1RFTkVSID0KKyAgICAgICAgInJlZ2lzdGVyRXZlbnRMaXN0ZW5lciI7CisKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgc0lkQ291bnRlciA9IDA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1dOX1BST0NFU1NfSUQgPSBhbmRyb2lkLm9zLlByb2Nlc3MubXlQaWQoKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET19TRVRfU0VSVklDRV9JTkZPID0gMTA7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc05leHRXaW5kb3dJZDsKKwogICAgIGZpbmFsIEhhbmRsZXJDYWxsZXIgbUNhbGxlcjsKIAogICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CkBAIC05NiwyNSArMTA4LDM1IEBACiAgICAgZmluYWwgTGlzdDxJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ+IG1DbGllbnRzID0KICAgICAgICAgbmV3IEFycmF5TGlzdDxJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ+KCk7CiAKLSAgICBmaW5hbCBNYXA8Q29tcG9uZW50TmFtZSwgU2VydmljZT4gbUNvbXBvbmVudE5hbWVUb1NlcnZpY2VNYXAgPQotICAgICAgICBuZXcgSGFzaE1hcDxDb21wb25lbnROYW1lLCBTZXJ2aWNlPigpOworICAgIGZpbmFsIE1hcDxDb21wb25lbnROYW1lLCBTZXJ2aWNlPiBtQ29tcG9uZW50TmFtZVRvU2VydmljZU1hcCA9IG5ldyBIYXNoTWFwPENvbXBvbmVudE5hbWUsIFNlcnZpY2U+KCk7CiAKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8U2VydmljZUluZm8+IG1JbnN0YWxsZWRTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8U2VydmljZUluZm8+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gbUluc3RhbGxlZFNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIFNldDxDb21wb25lbnROYW1lPiBtRW5hYmxlZFNlcnZpY2VzID0gbmV3IEhhc2hTZXQ8Q29tcG9uZW50TmFtZT4oKTsKIAotICAgIHByaXZhdGUgZmluYWwgU2ltcGxlU3RyaW5nU3BsaXR0ZXIgbVN0cmluZ0NvbG9uU3BsaXR0ZXIgPSBuZXcgU2ltcGxlU3RyaW5nU3BsaXR0ZXIoJzonKTsKKyAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uPiBtV2luZG93SWRUb0ludGVyYWN0aW9uQ29ubmVjdGlvbk1hcCA9CisgICAgICAgIG5ldyBTcGFyc2VBcnJheTxJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbj4oKTsKIAotICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8TGlzdDxTZXJ2aWNlSW5mbz4+IG1GZWVkYmFja1R5cGVUb0VuYWJsZWRTZXJ2aWNlc01hcCA9Ci0gICAgICAgIG5ldyBTcGFyc2VBcnJheTxMaXN0PFNlcnZpY2VJbmZvPj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PElCaW5kZXI+IG1XaW5kb3dJZFRvV2luZG93VG9rZW5NYXAgPSBuZXcgU3BhcnNlQXJyYXk8SUJpbmRlcj4oKTsKKworICAgIHByaXZhdGUgZmluYWwgU2ltcGxlU3RyaW5nU3BsaXR0ZXIgbVN0cmluZ0NvbG9uU3BsaXR0ZXIgPSBuZXcgU2ltcGxlU3RyaW5nU3BsaXR0ZXIoJzonKTsKIAogICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwogCiAgICAgcHJpdmF0ZSBpbnQgbUhhbmRsZWRGZWVkYmFja1R5cGVzID0gMDsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNFbmFibGVkOworCiAgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5SW5wdXRGaWx0ZXIgbUlucHV0RmlsdGVyOwogCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gbUVuYWJsZWRTZXJ2aWNlc0ZvckZlZWRiYWNrVGVtcExpc3QgPSBuZXcgQXJyYXlMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4oKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzSW5wdXRGaWx0ZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIFdpbmRvd01hbmFnZXJTZXJ2aWNlIG1XaW5kb3dNYW5hZ2VyU2VydmljZTsKKworICAgIHByaXZhdGUgZmluYWwgU2VjdXJpdHlQb2xpY3kgbVNlY3VyaXR5UG9saWN5OworCiAgICAgLyoqCiAgICAgICogSGFuZGxlciBmb3IgZGVsYXllZCBldmVudCBkaXNwYXRjaC4KICAgICAgKi8KQEAgLTE0Myw2ICsxNjUsOSBAQAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIG1DYWxsZXIgPSBuZXcgSGFuZGxlckNhbGxlcihjb250ZXh0LCB0aGlzKTsKKyAgICAgICAgbVdpbmRvd01hbmFnZXJTZXJ2aWNlID0gKFdpbmRvd01hbmFnZXJTZXJ2aWNlKSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKAorICAgICAgICAgICAgICAgIENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworICAgICAgICBtU2VjdXJpdHlQb2xpY3kgPSBuZXcgU2VjdXJpdHlQb2xpY3koKTsKIAogICAgICAgICByZWdpc3RlclBhY2thZ2VDaGFuZ2VBbmRCb290Q29tcGxldGVkQnJvYWRjYXN0UmVjZWl2ZXIoKTsKICAgICAgICAgcmVnaXN0ZXJTZXR0aW5nc0NvbnRlbnRPYnNlcnZlcnMoKTsKQEAgLTIwNiw3ICsyMzEsNiBAQAogICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkgPT0gSW50ZW50LkFDVElPTl9CT09UX0NPTVBMRVRFRCkgewogICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZUFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdExvY2tlZCgpOwotCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGFjY2Vzc2liaWxpdHkgZW5hYmxlZCBzZXR0aW5nIG9uIGJvb3QKICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0VuYWJsZWQgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELCAwKSA9PSAxOwpAQCAtMjIxLDcgKzI0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgc3VwZXIub25SZWNlaXZlKGNvbnRleHQsIGludGVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CkBAIC0yNzYsMTUgKzMwMCwyNiBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOworICAgICAgICAgICAgZmluYWwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGFkZGVkQ2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgbUNsaWVudHMuYWRkKGFkZGVkQ2xpZW50KTsKKyAgICAgICAgICAgIC8vIENsaWVudHMgYXJlIHJlZ2lzdGVyZWQgYWxsIHRoZSB0aW1lIHVudGlsIHRoZWlyIHByb2Nlc3MgaXMKKyAgICAgICAgICAgIC8vIGtpbGxlZCwgdGhlcmVmb3JlIHdlIGRvIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyB1bmxpbmtUb0RlYXRoLgorICAgICAgICAgICAgY2xpZW50LmFzQmluZGVyKCkubGlua1RvRGVhdGgobmV3IERlYXRoUmVjaXBpZW50KCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRzLnJlbW92ZShhZGRlZENsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgIHJldHVybiBtSXNFbmFibGVkOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gc2VuZEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbVNlY3VyaXR5UG9saWN5LnVwZGF0ZVJldHJpZXZhbEFsbG93aW5nV2luZG93QW5kRXZlbnRTb3VyY2VMb2NrZWQoZXZlbnQpOwogICAgICAgICAgICAgbm90aWZ5QWNjZXNzaWJpbGl0eVNlcnZpY2VzRGVsYXllZExvY2tlZChldmVudCwgZmFsc2UpOwogICAgICAgICAgICAgbm90aWZ5QWNjZXNzaWJpbGl0eVNlcnZpY2VzRGVsYXllZExvY2tlZChldmVudCwgdHJ1ZSk7CiAgICAgICAgIH0KQEAgLTI5OCwyMCArMzMzLDMwIEBACiAgICAgICAgIHJldHVybiAoT1dOX1BST0NFU1NfSUQgIT0gQmluZGVyLmdldENhbGxpbmdQaWQoKSk7CiAgICAgfQogCi0gICAgcHVibGljIExpc3Q8U2VydmljZUluZm8+IGdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpIHsKKyAgICBwdWJsaWMgTGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IGdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgcmV0dXJuIG1JbnN0YWxsZWRTZXJ2aWNlczsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBMaXN0PFNlcnZpY2VJbmZvPiBnZXRFbmFibGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KGludCBmZWVkYmFja1R5cGUpIHsKKyAgICBwdWJsaWMgTGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IGdldEVuYWJsZWRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoaW50IGZlZWRiYWNrVHlwZSkgeworICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gcmVzdWx0ID0gbUVuYWJsZWRTZXJ2aWNlc0ZvckZlZWRiYWNrVGVtcExpc3Q7CisgICAgICAgIHJlc3VsdC5jbGVhcigpOworICAgICAgICBMaXN0PFNlcnZpY2U+IHNlcnZpY2VzID0gbVNlcnZpY2VzOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBlbmFibGVkU2VydmljZXMgPSBtRmVlZGJhY2tUeXBlVG9FbmFibGVkU2VydmljZXNNYXAuZ2V0KGZlZWRiYWNrVHlwZSk7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlZFNlcnZpY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICB3aGlsZSAoZmVlZGJhY2tUeXBlICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmVlZGJhY2tUeXBlQml0ID0gKDEgPDwgSW50ZWdlci5udW1iZXJPZlRyYWlsaW5nWmVyb3MoZmVlZGJhY2tUeXBlKSk7CisgICAgICAgICAgICAgICAgZmVlZGJhY2tUeXBlICY9IH5mZWVkYmFja1R5cGVCaXQ7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlcnZpY2VDb3VudCA9IHNlcnZpY2VzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzZXJ2aWNlLm1GZWVkYmFja1R5cGUgJiBmZWVkYmFja1R5cGVCaXQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoc2VydmljZS5tQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlbmFibGVkU2VydmljZXM7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBpbnRlcnJ1cHQoKSB7CkBAIC0zMjEsMTYgKzM2Niw4IEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tU2VydmljZUludGVyZmFjZS5vbkludGVycnVwdCgpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmUgaW5zdGFuY2VvZiBEZWFkT2JqZWN0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkRlYWQgIiArIHNlcnZpY2UubVNlcnZpY2UgKyAiLiBDbGVhbmluZyB1cC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVEZWFkU2VydmljZUxvY2tlZChzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJFcnJvciBkdXJpbmcgc2VuZGluZyBpbnRlcnJ1cHQgcmVxdWVzdCB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZS5tU2VydmljZSwgcmUpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRXJyb3IgZHVyaW5nIHNlbmRpbmcgaW50ZXJydXB0IHJlcXVlc3QgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlLm1TZXJ2aWNlLCByZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zMzgsMzAgKzM3NSw4NiBAQAogCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIERPX1NFVF9TRVJWSUNFX0lORk86CisgICAgICAgICAgICBjYXNlIERPX1NFVF9TRVJWSUNFX0lORk86IHsKICAgICAgICAgICAgICAgICBTb21lQXJncyBhcmd1bWVudHMgPSAoKFNvbWVBcmdzKSBtZXNzYWdlLm9iaik7CiAKICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IChBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pIGFyZ3VtZW50cy5hcmcxOwogICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBhcmd1bWVudHMuYXJnMjsKIAogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tRXZlbnRUeXBlcyA9IGluZm8uZXZlbnRUeXBlczsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tRmVlZGJhY2tUeXBlID0gaW5mby5mZWVkYmFja1R5cGU7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VOYW1lcyA9IGluZm8ucGFja2FnZU5hbWVzOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UubVBhY2thZ2VOYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYWNrYWdlTmFtZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFhNTCBtYW5pZmVzdCBoYWQgZGF0YSB0byBjb25maWd1cmUgdGhlIHNlcnZpY2UgaXRzIGluZm8KKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFscmVhZHkgc2V0LiBJbiBzdWNoIGEgY2FzZSB1cGRhdGUgb25seSB0aGUgZHluYW1pY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlndXJhYmxlIHByb3BlcnRpZXMuCisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBvbGRJbmZvID0gc2VydmljZS5tQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbGRJbmZvLnVwZGF0ZUR5bmFtaWNhbGx5Q29uZmlndXJhYmxlUHJvcGVydGllcyhpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0RHluYW1pY2FsbHlDb25maWd1cmFibGVQcm9wZXJ0aWVzKG9sZEluZm8pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXREeW5hbWljYWxseUNvbmZpZ3VyYWJsZVByb3BlcnRpZXMoaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tTm90aWZpY2F0aW9uVGltZW91dCA9IGluZm8ubm90aWZpY2F0aW9uVGltZW91dDsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tSXNEZWZhdWx0ID0gKGluZm8uZmxhZ3MgJiBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVCkgIT0gMDsKLQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZU9uRW5hYmxlZFNlcnZpY2Uoc2VydmljZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gcmV0dXJuOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIlVua25vd24gbWVzc2FnZSB0eXBlOiAiICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgYWRkQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuLAorICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24gY29ubmVjdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIElXaW5kb3cgYWRkZWRXaW5kb3dUb2tlbiA9IHdpbmRvd1Rva2VuOworICAgICAgICAgICAgZmluYWwgaW50IHdpbmRvd0lkID0gc05leHRXaW5kb3dJZCsrOworICAgICAgICAgICAgY29ubmVjdGlvbi5hc0JpbmRlcigpLmxpbmtUb0RlYXRoKG5ldyBEZWF0aFJlY2lwaWVudCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uKGFkZGVkV2luZG93VG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMCk7CisgICAgICAgICAgICBtV2luZG93SWRUb1dpbmRvd1Rva2VuTWFwLnB1dCh3aW5kb3dJZCwgYWRkZWRXaW5kb3dUb2tlbi5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIG1XaW5kb3dJZFRvSW50ZXJhY3Rpb25Db25uZWN0aW9uTWFwLnB1dCh3aW5kb3dJZCwgY29ubmVjdGlvbik7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgIkFkZGluZyBpbnRlcmFjdGlvbiBjb25uZWN0aW9uIHRvIHdpbmRvd0lkOiAiICsgd2luZG93SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHdpbmRvd0lkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1XaW5kb3dJZFRvV2luZG93VG9rZW5NYXAuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1XaW5kb3dJZFRvV2luZG93VG9rZW5NYXAudmFsdWVBdChpKSA9PSB3aW5kb3dUb2tlbi5hc0JpbmRlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aW5kb3dJZCA9IG1XaW5kb3dJZFRvV2luZG93VG9rZW5NYXAua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dJZFRvV2luZG93VG9rZW5NYXAucmVtb3ZlKHdpbmRvd0lkKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpbmRvd0lkVG9JbnRlcmFjdGlvbkNvbm5lY3Rpb25NYXAucmVtb3ZlKHdpbmRvd0lkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgIlJlbW92aW5nIGludGVyYWN0aW9uIGNvbm5lY3Rpb24gdG8gd2luZG93SWQ6ICIgKyB3aW5kb3dJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcihJRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtU2VjdXJpdHlQb2xpY3kuZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVUUklFVkVfV0lORE9XX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgRlVOQ1RJT05fUkVHSVNURVJfRVZFTlRfTElTVEVORVIpOworICAgICAgICBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgiZm9vLmJhciIsICJGYWtlQWNjZXNzaWJpbGl0eVNlcnZpY2UiKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgU2VydmljZSBvbGRTZXJ2aWNlID0gbUNvbXBvbmVudE5hbWVUb1NlcnZpY2VNYXAuZ2V0KGNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgaWYgKG9sZFNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeVJlbW92ZVNlcnZpY2VMb2NrZWQob2xkU2VydmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKKyAgICAgICAgYWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLmV2ZW50VHlwZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRVNfQUxMX01BU0s7CisgICAgICAgIGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfR0VORVJJQzsKKyAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoY29tcG9uZW50TmFtZSwgYWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLCB0cnVlKTsKKyAgICAgICAgc2VydmljZS5vblNlcnZpY2VDb25uZWN0ZWQoY29tcG9uZW50TmFtZSwgbGlzdGVuZXIuYXNCaW5kZXIoKSk7CisgICAgICAgIHJldHVybiBzZXJ2aWNlOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFBvcHVsYXRlcyB0aGUgY2FjaGVkIGxpc3Qgb2YgaW5zdGFsbGVkIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX1zLgogICAgICAqLwpAQCAtMzY5LDEwICs0NjIsMjAgQEAKICAgICAgICAgbUluc3RhbGxlZFNlcnZpY2VzLmNsZWFyKCk7CiAKICAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gaW5zdGFsbGVkU2VydmljZXMgPSBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcygKLSAgICAgICAgICAgICAgICBuZXcgSW50ZW50KEFjY2Vzc2liaWxpdHlTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKSwgUGFja2FnZU1hbmFnZXIuR0VUX1NFUlZJQ0VTKTsKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50KEFjY2Vzc2liaWxpdHlTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKSwKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfU0VSVklDRVMgfCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMCwgY291bnQgPSBpbnN0YWxsZWRTZXJ2aWNlcy5zaXplKCk7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBtSW5zdGFsbGVkU2VydmljZXMuYWRkKGluc3RhbGxlZFNlcnZpY2VzLmdldChpKS5zZXJ2aWNlSW5mbyk7CisgICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IGluc3RhbGxlZFNlcnZpY2VzLmdldChpKTsKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBhY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8ocmVzb2x2ZUluZm8sIG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBtSW5zdGFsbGVkU2VydmljZXMuYWRkKGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyk7CisgICAgICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHhwcGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkVycm9yIHdoaWxlIGluaXRpYWxpemluZyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8iLCB4cHBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyIsIGlvZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ2NCwzMyArNTY3LDU2IEBACiAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IHNlcnZpY2UubVBlbmRpbmdFdmVudHMuZ2V0KGV2ZW50VHlwZSk7CiAKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtU2VjdXJpdHlQb2xpY3kuY2FuUmV0cmlldmVXaW5kb3dDb250ZW50KHNlcnZpY2UpKSB7CisgICAgICAgICAgICAgICAgZXZlbnQuc2V0Q29ubmVjdGlvbihzZXJ2aWNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXZlbnQuc2V0U291cmNlKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnQuc2V0U2VhbGVkKHRydWUpOwogICAgICAgICAgICAgbGlzdGVuZXIub25BY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOwogICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKExPR19UQUcsICJFdmVudCAiICsgZXZlbnQgKyAiIHNlbnQgdG8gIiArIGxpc3RlbmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICBpZiAocmUgaW5zdGFuY2VvZiBEZWFkT2JqZWN0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJEZWFkICIgKyBzZXJ2aWNlLm1TZXJ2aWNlICsgIi4gQ2xlYW5pbmcgdXAuIik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRGVhZFNlcnZpY2VMb2NrZWQoc2VydmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRXJyb3IgZHVyaW5nIHNlbmRpbmcgIiArIGV2ZW50ICsgIiB0byAiICsgc2VydmljZS5tU2VydmljZSwgcmUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJFcnJvciBkdXJpbmcgc2VuZGluZyAiICsgZXZlbnQgKyAiIHRvICIgKyBzZXJ2aWNlLm1TZXJ2aWNlLCByZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgZGVhZCBzZXJ2aWNlLgorICAgICAqIEFkZHMgYSBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gYWRkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0cnlBZGRTZXJ2aWNlTG9ja2VkKFNlcnZpY2Ugc2VydmljZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1TZXJ2aWNlcy5jb250YWlucyhzZXJ2aWNlKSB8fCAhc2VydmljZS5pc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZpY2UubGlua1RvT3duRGVhdGgoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlcy5hZGQoc2VydmljZSk7CisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZVRvU2VydmljZU1hcC5wdXQoc2VydmljZS5tQ29tcG9uZW50TmFtZSwgc2VydmljZSk7CisgICAgICAgICAgICB1cGRhdGVJbnB1dEZpbHRlckxvY2tlZCgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIHNlcnZpY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZS4KICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNlcnZpY2Ugd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRGVhZFNlcnZpY2VMb2NrZWQoU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgU2xvZy5pKExPR19UQUcsICJEZWFkIHNlcnZpY2UgIiArIHNlcnZpY2UubVNlcnZpY2UgKyAiIHJlbW92ZWQiKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdHJ5UmVtb3ZlU2VydmljZUxvY2tlZChTZXJ2aWNlIHNlcnZpY2UpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZW1vdmVkID0gbVNlcnZpY2VzLnJlbW92ZShzZXJ2aWNlKTsKKyAgICAgICAgaWYgKCFyZW1vdmVkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgbUNvbXBvbmVudE5hbWVUb1NlcnZpY2VNYXAucmVtb3ZlKHNlcnZpY2UubUNvbXBvbmVudE5hbWUpOwogICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhzZXJ2aWNlLm1JZCk7Ci0gICAgICAgIHVwZGF0ZVN0YXRlT25EaXNhYmxlZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIHJldHVybiBtU2VydmljZXMucmVtb3ZlKHNlcnZpY2UpOworICAgICAgICBzZXJ2aWNlLnVubGlua1RvT3duRGVhdGgoKTsKKyAgICAgICAgdXBkYXRlSW5wdXRGaWx0ZXJMb2NrZWQoKTsKKyAgICAgICAgcmV0dXJuIHJlbW92ZWQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTMsMTEgKzYzOSw2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIXNlcnZpY2UubVNlcnZpY2UuaXNCaW5kZXJBbGl2ZSgpKSB7Ci0gICAgICAgICAgICByZW1vdmVEZWFkU2VydmljZUxvY2tlZChzZXJ2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCiAgICAgICAgIGludCBldmVudFR5cGUgPSBldmVudC5nZXRFdmVudFR5cGUoKTsKICAgICAgICAgaWYgKChzZXJ2aWNlLm1FdmVudFR5cGVzICYgZXZlbnRUeXBlKSAhPSBldmVudFR5cGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTU5NSwyMiArNzE2LDIyIEBACiAgICAgICogQHBhcmFtIGluc3RhbGxlZFNlcnZpY2VzIEFsbCBpbnN0YWxsZWQge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfXMuCiAgICAgICogQHBhcmFtIGVuYWJsZWRTZXJ2aWNlcyBUaGUge0BsaW5rIENvbXBvbmVudE5hbWV9cyBvZiB0aGUgZW5hYmxlZCBzZXJ2aWNlcy4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VydmljZXNTdGF0ZUxvY2tlZChMaXN0PFNlcnZpY2VJbmZvPiBpbnN0YWxsZWRTZXJ2aWNlcywKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VydmljZXNTdGF0ZUxvY2tlZChMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gaW5zdGFsbGVkU2VydmljZXMsCiAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50TmFtZT4gZW5hYmxlZFNlcnZpY2VzKSB7CiAKICAgICAgICAgTWFwPENvbXBvbmVudE5hbWUsIFNlcnZpY2U+IGNvbXBvbmVudE5hbWVUb1NlcnZpY2VNYXAgPSBtQ29tcG9uZW50TmFtZVRvU2VydmljZU1hcDsKICAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWQgPSBtSXNFbmFibGVkOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBjb3VudCA9IGluc3RhbGxlZFNlcnZpY2VzLnNpemUoKTsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFNlcnZpY2VJbmZvIGludGFsbGVkU2VydmljZSA9IGluc3RhbGxlZFNlcnZpY2VzLmdldChpKTsKLSAgICAgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKGludGFsbGVkU2VydmljZS5wYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgaW50YWxsZWRTZXJ2aWNlLm5hbWUpOworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluc3RhbGxlZFNlcnZpY2UgPSBpbnN0YWxsZWRTZXJ2aWNlcy5nZXQoaSk7CisgICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUgPSBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZFNlcnZpY2UuZ2V0SWQoKSk7CiAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBjb21wb25lbnROYW1lVG9TZXJ2aWNlTWFwLmdldChjb21wb25lbnROYW1lKTsKIAogICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCkgewogICAgICAgICAgICAgICAgIGlmIChlbmFibGVkU2VydmljZXMuY29udGFpbnMoY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IG5ldyBTZXJ2aWNlKGNvbXBvbmVudE5hbWUsIGludGFsbGVkU2VydmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoY29tcG9uZW50TmFtZSwgaW5zdGFsbGVkU2VydmljZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuYmluZCgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVuYWJsZWRTZXJ2aWNlcy5jb250YWlucyhjb21wb25lbnROYW1lKSkgewpAQCAtNjQyLDY0ICs3NjMsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbnB1dCBmaWx0ZXIgc3RhdGUuIElmIHRoZSBmaWx0ZXIgaXMgaW4gZW5hYmxlZCBpdCBpcyByZWdpc3RlcmVkCi0gICAgICogaW4gdGhlIHdpbmRvdyBtYW5hZ2VyLCBvdGhlcndpc2UgdGhlIGZpbHRlciBpcyByZW1vdmVkIGZyb20gdGhlIGxhdHRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmFibGVkIFdoZXRoZXIgdGhlIGlucHV0IGZpbHRlciBpcyBlbmFibGVkLgorICAgICAqIFVwZGF0ZXMgdGhlIGlucHV0IGZpbHRlciBzdGF0ZS4gVGhlIGZpbHRlciBpcyBlbmFibGVkIGlmIGFjY2Vzc2liaWxpdHkKKyAgICAgKiBpcyBlbmFibGVkIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIHByb3ZpZGluZworICAgICAqIHNwb2tlbiBmZWVkYmFjay4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRGaWx0ZXJFbmFibGVkTG9ja2VkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZSB3bSA9IChXaW5kb3dNYW5hZ2VyU2VydmljZSlTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKAotICAgICAgICAgICAgICAgIENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICBpZiAod20gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlSW5wdXRGaWx0ZXJMb2NrZWQoKSB7CisgICAgICAgIGlmIChtSXNFbmFibGVkKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1Nwb2tlbkZlZWRiYWNrU2VydmljZXMgPSAhZ2V0RW5hYmxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX1NQT0tFTikuaXNFbXB0eSgpOworICAgICAgICAgICAgaWYgKGhhc1Nwb2tlbkZlZWRiYWNrU2VydmljZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhhc0lucHV0RmlsdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEZpbHRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZpbHRlciA9IG5ldyBBY2Nlc3NpYmlsaXR5SW5wdXRGaWx0ZXIobUNvbnRleHQpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3bS5zZXRJbnB1dEZpbHRlcihtSW5wdXRGaWx0ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3bS5zZXRJbnB1dEZpbHRlcihudWxsKTsKKyAgICAgICAgICAgICAgICBtV2luZG93TWFuYWdlclNlcnZpY2Uuc2V0SW5wdXRGaWx0ZXIobUlucHV0RmlsdGVyKTsKKyAgICAgICAgICAgICAgICBtSGFzSW5wdXRGaWx0ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHNldCBvZiBlbmFibGVkIHNlcnZpY2VzIGZvciBhIGdpdmVuIGZlZWRiYWNrIHR5cGUgYW5kCi0gICAgICogaWYgbW9yZSB0aGFuIG9uZSBvZiB0aGVtIHByb3ZpZGVzIHNwb2tlbiBmZWVkYmFjayBlbmFibGVzIHRvdWNoCi0gICAgICogZXhwbG9yYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZSBBbiBlbmFibGUgc2VydmljZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdGVPbkVuYWJsZWRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBpbnQgZmVlZGJhY2tUeXBlID0gc2VydmljZS5tRmVlZGJhY2tUeXBlOwotICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBlbmFibGVkU2VydmljZXMgPSBtRmVlZGJhY2tUeXBlVG9FbmFibGVkU2VydmljZXNNYXAuZ2V0KGZlZWRiYWNrVHlwZSk7Ci0gICAgICAgIGlmIChlbmFibGVkU2VydmljZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZW5hYmxlZFNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlSW5mbz4oKTsKLSAgICAgICAgICAgIG1GZWVkYmFja1R5cGVUb0VuYWJsZWRTZXJ2aWNlc01hcC5wdXQoZmVlZGJhY2tUeXBlLCBlbmFibGVkU2VydmljZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVuYWJsZWRTZXJ2aWNlcy5hZGQoc2VydmljZS5tU2VydmljZUluZm8pOwotCi0gICAgICAgIC8vIFdlIGVuYWJsZSB0b3VjaCBleHBsb3JhdGlvbiBpZiBhdCBsZWFzdCBvbmUKLSAgICAgICAgLy8gZW5hYmxlZCBzZXJ2aWNlIHByb3ZpZGVzIHNwb2tlbiBmZWVkYmFjay4KLSAgICAgICAgaWYgKGVuYWJsZWRTZXJ2aWNlcy5zaXplKCkgPiAwCi0gICAgICAgICAgICAgICAgJiYgc2VydmljZS5tRmVlZGJhY2tUeXBlID09IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19TUE9LRU4pIHsKLSAgICAgICAgICAgIHVwZGF0ZUNsaWVudHNMb2NrZWQoKTsKLSAgICAgICAgICAgIHNldElucHV0RmlsdGVyRW5hYmxlZExvY2tlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0ZU9uRGlzYWJsZWRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBlbmFibGVkU2VydmljZXMgPQotICAgICAgICAgICAgbUZlZWRiYWNrVHlwZVRvRW5hYmxlZFNlcnZpY2VzTWFwLmdldChzZXJ2aWNlLm1GZWVkYmFja1R5cGUpOwotICAgICAgICBpZiAoZW5hYmxlZFNlcnZpY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbmFibGVkU2VydmljZXMucmVtb3ZlKHNlcnZpY2UubVNlcnZpY2VJbmZvKTsKLSAgICAgICAgLy8gV2UgZGlzYWJsZSB0b3VjaCBleHBsb3JhdGlvbiBpZiBubwotICAgICAgICAvLyBlbmFibGVkIHNlcnZpY2UgcHJvdmlkZXMgc3Bva2VuIGZlZWRiYWNrLgotICAgICAgICBpZiAoZW5hYmxlZFNlcnZpY2VzLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICYmIHNlcnZpY2UubUZlZWRiYWNrVHlwZSA9PSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfU1BPS0VOKSB7Ci0gICAgICAgICAgICB1cGRhdGVDbGllbnRzTG9ja2VkKCk7Ci0gICAgICAgICAgICBzZXRJbnB1dEZpbHRlckVuYWJsZWRMb2NrZWQoZmFsc2UpOworICAgICAgICBpZiAobUhhc0lucHV0RmlsdGVyKSB7CisgICAgICAgICAgICBtV2luZG93TWFuYWdlclNlcnZpY2Uuc2V0SW5wdXRGaWx0ZXIobnVsbCk7CisgICAgICAgICAgICBtSGFzSW5wdXRGaWx0ZXIgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzExLDEwICs3OTcsMTEgQEAKICAgICAgKiBwYXNzZWQgdG8gdGhlIHNlcnZpY2UgaXQgcmVwcmVzZW50cyBhcyBzb29uIGl0IGlzIGJvdW5kLiBJdCBhbHNvIHNlcnZlcyBhcyB0aGUKICAgICAgKiBjb25uZWN0aW9uIGZvciB0aGUgc2VydmljZS4KICAgICAgKi8KLSAgICBjbGFzcyBTZXJ2aWNlIGV4dGVuZHMgSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbi5TdHViIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgIGNsYXNzIFNlcnZpY2UgZXh0ZW5kcyBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uLlN0dWIKKyAgICAgICAgICAgIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24sIERlYXRoUmVjaXBpZW50IHsKICAgICAgICAgaW50IG1JZCA9IDA7CiAKLSAgICAgICAgU2VydmljZUluZm8gbVNlcnZpY2VJbmZvOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gbUFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKIAogICAgICAgICBJQmluZGVyIG1TZXJ2aWNlOwogCkBAIC03MzAsMjUgKzgxNyw1NCBAQAogCiAgICAgICAgIGxvbmcgbU5vdGlmaWNhdGlvblRpbWVvdXQ7CiAKLSAgICAgICAgYm9vbGVhbiBtSXNBY3RpdmU7Ci0KICAgICAgICAgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50TmFtZTsKIAogICAgICAgICBJbnRlbnQgbUludGVudDsKIAorICAgICAgICBib29sZWFuIG1DYW5SZXRyaWV2ZVNjcmVlbkNvbnRlbnQ7CisKKyAgICAgICAgYm9vbGVhbiBtSXNGYWtlOworCisgICAgICAgIGZpbmFsIENhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpOworCisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgbUludGVyYWN0aW9uSWRDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwogICAgICAgICAvLyB0aGUgZXZlbnRzIHBlbmRpbmcgZXZlbnRzIHRvIGJlIGRpc3BhdGNoZWQgdG8gdGhpcyBzZXJ2aWNlCiAgICAgICAgIGZpbmFsIFNwYXJzZUFycmF5PEFjY2Vzc2liaWxpdHlFdmVudD4gbVBlbmRpbmdFdmVudHMgPQogICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PEFjY2Vzc2liaWxpdHlFdmVudD4oKTsKIAotICAgICAgICBTZXJ2aWNlKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSwgU2VydmljZUluZm8gc2VydmljZUluZm8pIHsKKyAgICAgICAgcHVibGljIFNlcnZpY2UoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBhY2Nlc3NpYmlsaXR5U2VydmljZUluZm8sIGJvb2xlYW4gaXNGYWtlKSB7CiAgICAgICAgICAgICBtSWQgPSBzSWRDb3VudGVyKys7CiAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0gICAgICAgICAgICBtU2VydmljZUluZm8gPSBzZXJ2aWNlSW5mbzsKLSAgICAgICAgICAgIG1JbnRlbnQgPSBuZXcgSW50ZW50KCkuc2V0Q29tcG9uZW50KG1Db21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIG1JbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0NMSUVOVF9MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWNjZXNzaWJpbGl0eV9iaW5kaW5nX2xhYmVsKTsKLSAgICAgICAgICAgIG1JbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0NMSUVOVF9JTlRFTlQsIFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkoCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCAwLCBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9BQ0NFU1NJQklMSVRZX1NFVFRJTkdTKSwgMCkpOworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyA9IGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKKyAgICAgICAgICAgIG1Jc0Zha2UgPSBpc0Zha2U7CisgICAgICAgICAgICBpZiAoIWlzRmFrZSkgeworICAgICAgICAgICAgICAgIG1DYW5SZXRyaWV2ZVNjcmVlbkNvbnRlbnQgPSBhY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uZ2V0Q2FuUmV0cmlldmVXaW5kb3dDb250ZW50KCk7CisgICAgICAgICAgICAgICAgbUludGVudCA9IG5ldyBJbnRlbnQoKS5zZXRDb21wb25lbnQobUNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgICAgIG1JbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0NMSUVOVF9MQUJFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmFjY2Vzc2liaWxpdHlfYmluZGluZ19sYWJlbCk7CisgICAgICAgICAgICAgICAgbUludGVudC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfQ0xJRU5UX0lOVEVOVCwgUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCAwLCBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9BQ0NFU1NJQklMSVRZX1NFVFRJTkdTKSwgMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ2FuUmV0cmlldmVTY3JlZW5Db250ZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldER5bmFtaWNhbGx5Q29uZmlndXJhYmxlUHJvcGVydGllcyhhY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY2FsbHlDb25maWd1cmFibGVQcm9wZXJ0aWVzKEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICBtRXZlbnRUeXBlcyA9IGluZm8uZXZlbnRUeXBlczsKKyAgICAgICAgICAgIG1GZWVkYmFja1R5cGUgPSBpbmZvLmZlZWRiYWNrVHlwZTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VOYW1lcyA9IGluZm8ucGFja2FnZU5hbWVzOworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYWNrYWdlTmFtZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25UaW1lb3V0ID0gaW5mby5ub3RpZmljYXRpb25UaW1lb3V0OworICAgICAgICAgICAgbUlzRGVmYXVsdCA9IChpbmZvLmZsYWdzICYgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQpICE9IDA7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICB0cnlBZGRTZXJ2aWNlTG9ja2VkKHRoaXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC03NTcsNyArODczLDcgQEAKICAgICAgICAgICogQHJldHVybiBUcnVlIGlmIGJpbmRpbmcgaXMgc3VjY2Vzc2Z1bC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoKSB7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFtSXNGYWtlICYmIG1TZXJ2aWNlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuYmluZFNlcnZpY2UobUludGVudCwgdGhpcywgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTc3MSwxMSArODg3LDEzIEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiB1bmJpbmQoKSB7CiAgICAgICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5UmVtb3ZlU2VydmljZUxvY2tlZCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFtSXNGYWtlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UodGhpcyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKHRoaXMpOwotICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lVG9TZXJ2aWNlTWFwLnJlbW92ZShtQ29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VzLnJlbW92ZSh0aGlzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZU9uRGlzYWJsZWRTZXJ2aWNlKHRoaXMpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzg4LDcgKzkwNiw3IEBACiAgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2VydmljZSBpcyBjb25maWd1cmVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1FdmVudFR5cGVzICE9IDAgJiYgbUZlZWRiYWNrVHlwZSAhPSAwKTsKKyAgICAgICAgICAgIHJldHVybiAobUV2ZW50VHlwZXMgIT0gMCAmJiBtRmVlZGJhY2tUeXBlICE9IDAgJiYgbVNlcnZpY2UgIT0gbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW5mbyhBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbykgewpAQCAtNzk4LDI0ICs5MTYsMzQ1IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUsIElCaW5kZXIgc2VydmljZSkgewogICAgICAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwogICAgICAgICAgICAgbVNlcnZpY2VJbnRlcmZhY2UgPSBJRXZlbnRMaXN0ZW5lci5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOwotCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG1TZXJ2aWNlSW50ZXJmYWNlLnNldENvbm5lY3Rpb24odGhpcyk7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TZXJ2aWNlcy5jb250YWlucyh0aGlzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VzLmFkZCh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lVG9TZXJ2aWNlTWFwLnB1dChjb21wb25lbnROYW1lLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnlBZGRTZXJ2aWNlTG9ja2VkKHRoaXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgICAgIFNsb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgc2V0dGluZyBDb250cm9sbGVyIGZvciBzZXJ2aWNlOiAiICsgc2VydmljZSwgcmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgeworICAgICAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZChpbnQgdmlld0lkKSB7CisgICAgICAgICAgICBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBtQ29tcG9uZW50TmFtZVRvU2VydmljZU1hcC5yZW1vdmUoY29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VzLnJlbW92ZShzZXJ2aWNlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHBlcm1pc3Npb25HcmFudGVkID0gbVNlY3VyaXR5UG9saWN5LmNhblJldHJpZXZlV2luZG93Q29udGVudCh0aGlzKTsKKyAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbkdyYW50ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb25Ub1JldHJpZXZhbEFsbG93aW5nV2luZG93TG9ja2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIk5vIGludGVyYWN0aW9uIGNvbm5lY3Rpb24gdG8gYSByZXRyaWV2ZSBhbGxvd2luZyB3aW5kb3cuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgbG9uZyBpZGVudGl0eVRva2VuID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbnRlcmFjdGlvbklkID0gbUludGVyYWN0aW9uSWRDb3VudGVyLmdldEFuZEluY3JlbWVudCgpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKHZpZXdJZCwgaW50ZXJhY3Rpb25JZCwgbUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbyA9IG1DYWxsYmFjay5nZXRGaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvUmVzdWx0QW5kQ2xlYXIoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8uc2V0Q29ubmVjdGlvbih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby5zZXRTZWFsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJFcnJvciBmaW5kaW5nIG5vZGUuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld1RleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcGVybWlzc2lvbkdyYW50ZWQgPSBtU2VjdXJpdHlQb2xpY3kuY2FuUmV0cmlldmVXaW5kb3dDb250ZW50KHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uR3JhbnRlZCkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvblRvUmV0cmlldmFsQWxsb3dpbmdXaW5kb3dMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiTm8gaW50ZXJhY3Rpb24gY29ubmVjdGlvbiB0byBmb2N1c2VkIHdpbmRvdy4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5VG9rZW4gPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGludGVyYWN0aW9uSWQgPSBtSW50ZXJhY3Rpb25JZENvdW50ZXIuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld1RleHQodGV4dCwgaW50ZXJhY3Rpb25JZCwgbUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4gaW5mb3MgPQorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2suZ2V0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NSZXN1bHRBbmRDbGVhcihpbnRlcmFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5mb0NvdW50ID0gaW5mb3Muc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZm9Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbyA9IGluZm9zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc2V0Q29ubmVjdGlvbih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc2V0U2VhbGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbmZvczsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkVycm9yIGZpbmRpbmcgbm9kZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeUFjY2Vzc2liaWxpdHlJZCgKKyAgICAgICAgICAgICAgICBpbnQgYWNjZXNzaWJpbGl0eVdpbmRvd0lkLCBpbnQgYWNjZXNzaWJpbGl0eVZpZXdJZCkgeworICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBwZXJtaXNzaW9uR3JhbnRlZCA9CisgICAgICAgICAgICAgICAgICAgIG1TZWN1cml0eVBvbGljeS5jYW5HZXRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9Mb2NrZWQodGhpcywgYWNjZXNzaWJpbGl0eVdpbmRvd0lkKTsKKyAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbkdyYW50ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IG1XaW5kb3dJZFRvSW50ZXJhY3Rpb25Db25uZWN0aW9uTWFwLmdldChhY2Nlc3NpYmlsaXR5V2luZG93SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJObyBpbnRlcmFjdGlvbiBjb25uZWN0aW9uIHRvIHdpbmRvdzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWNjZXNzaWJpbGl0eVdpbmRvd0lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5VG9rZW4gPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGludGVyYWN0aW9uSWQgPSBtSW50ZXJhY3Rpb25JZENvdW50ZXIuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlBY2Nlc3NpYmlsaXR5SWQoYWNjZXNzaWJpbGl0eVZpZXdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uSWQsIG1DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8gPQorICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmdldEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9SZXN1bHRBbmRDbGVhcihpbnRlcmFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8uc2V0Q29ubmVjdGlvbih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5zZXRTZWFsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbmZvOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRXJyb3IgcmVxdWVzdGluZyBub2RlIHdpdGggYWNjZXNzaWJpbGl0eVZpZXdJZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWNjZXNzaWJpbGl0eVZpZXdJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb24oaW50IGFjY2Vzc2liaWxpdHlXaW5kb3dJZCwKKyAgICAgICAgICAgICAgICBpbnQgYWNjZXNzaWJpbGl0eVZpZXdJZCwgaW50IGFjdGlvbikgeworICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBwZXJtaXNzaW9uR3JhbnRlZCA9IG1TZWN1cml0eVBvbGljeS5jYW5QZXJmb3JtQWN0aW9uTG9ja2VkKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NpYmlsaXR5V2luZG93SWQsIGFjdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25HcmFudGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBtV2luZG93SWRUb0ludGVyYWN0aW9uQ29ubmVjdGlvbk1hcC5nZXQoYWNjZXNzaWJpbGl0eVdpbmRvd0lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiTm8gaW50ZXJhY3Rpb24gY29ubmVjdGlvbiB0byB3aW5kb3c6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFjY2Vzc2liaWxpdHlXaW5kb3dJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgaWRlbnRpdHlUb2tlbiA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW50ZXJhY3Rpb25JZCA9IG1JbnRlcmFjdGlvbklkQ291bnRlci5nZXRBbmRJbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uKGFjY2Vzc2liaWxpdHlWaWV3SWQsIGFjdGlvbiwgaW50ZXJhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5nZXRQZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvblJlc3VsdChpbnRlcmFjdGlvbklkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkVycm9yIHJlcXVlc3Rpbmcgbm9kZSB3aXRoIGFjY2Vzc2liaWxpdHlWaWV3SWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFjY2Vzc2liaWxpdHlWaWV3SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7CisgICAgICAgICAgICAvKiBkbyBub3RoaW5nIC0gI2JpbmRlckRpZWQgdGFrZXMgY2FyZSAqLworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbGlua1RvT3duRGVhdGgoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmxpbmtUb0RlYXRoKHRoaXMsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdW5saW5rVG9Pd25EZWF0aCgpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnVubGlua1RvRGVhdGgodGhpcywgMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIHRyeVJlbW92ZVNlcnZpY2VMb2NrZWQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uIGdldENvbm5lY3Rpb25Ub1JldHJpZXZhbEFsbG93aW5nV2luZG93TG9ja2VkKCkgeworICAgICAgICAgICAgZmluYWwgaW50IHdpbmRvd0lkID0gbVNlY3VyaXR5UG9saWN5LmdldFJldHJpZXZhbEFsbG93aW5nV2luZG93TG9ja2VkKCk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgIlRyeWluZyB0byBnZXQgaW50ZXJhY3Rpb24gY29ubmVjdGlvbiB0byB3aW5kb3dJZDogIiArIHdpbmRvd0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtV2luZG93SWRUb0ludGVyYWN0aW9uQ29ubmVjdGlvbk1hcC5nZXQod2luZG93SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgY2xhc3MgU2VjdXJpdHlQb2xpY3kgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURfQUNUSU9OUyA9IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fRk9DVVMKKyAgICAgICAgICAgIHwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9DTEVBUl9GT0NVUyB8IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fU0VMRUNUCisgICAgICAgICAgICB8IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQ0xFQVJfU0VMRUNUSU9OOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVRSSUVWQUxfQUxMT1dJTkdfRVZFTlRfVFlQRVMgPQorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVE9VQ0hfRVhQTE9SQVRJT05fR0VTVFVSRV9FTkQKKyAgICAgICAgICAgIHwgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVE9VQ0hfRVhQTE9SQVRJT05fR0VTVFVSRV9TVEFSVAorICAgICAgICAgICAgfCBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQgfCBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0ZPQ1VTRUQKKyAgICAgICAgICAgIHwgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19IT1ZFUl9FTlRFUiB8IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfSE9WRVJfRVhJVAorICAgICAgICAgICAgfCBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0xPTkdfQ0xJQ0tFRCB8IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfVEVYVF9DSEFOR0VECisgICAgICAgICAgICB8IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV19TVEFURV9DSEFOR0VEOworCisgICAgICAgIHByaXZhdGUgaW50IG1SZXRyaWV2YWxBbG93aW5nV2luZG93SWQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlUmV0cmlldmFsQWxsb3dpbmdXaW5kb3dBbmRFdmVudFNvdXJjZUxvY2tlZChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB3aW5kb3dJZCA9IGV2ZW50LmdldFNvdXJjZUFjY2Vzc2liaWxpdHlXaW5kb3dJZCgpOworICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50VHlwZSA9IGV2ZW50LmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgaWYgKChldmVudFR5cGUgJiBSRVRSSUVWQUxfQUxMT1dJTkdfRVZFTlRfVFlQRVMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtUmV0cmlldmFsQWxvd2luZ1dpbmRvd0lkID0gd2luZG93SWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV2ZW50LnNldFNvdXJjZShudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UmV0cmlldmFsQWxsb3dpbmdXaW5kb3dMb2NrZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJldHJpZXZhbEFsb3dpbmdXaW5kb3dJZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbkdldEFjY2Vzc2liaWxpdHlOb2RlSW5mb0xvY2tlZChTZXJ2aWNlIHNlcnZpY2UsIGludCB3aW5kb3dJZCkgeworICAgICAgICAgICAgcmV0dXJuIGNhblJldHJpZXZlV2luZG93Q29udGVudChzZXJ2aWNlKSAmJiBpc1JldHJpZXZhbEFsbG93aW5nV2luZG93KHdpbmRvd0lkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhblBlcmZvcm1BY3Rpb25Mb2NrZWQoU2VydmljZSBzZXJ2aWNlLCBpbnQgd2luZG93SWQsIGludCBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQoc2VydmljZSkKKyAgICAgICAgICAgICAgICAmJiBpc1JldHJpZXZhbEFsbG93aW5nV2luZG93KHdpbmRvd0lkKQorICAgICAgICAgICAgICAgICYmIGlzQWN0aW9uUGVybWl0dGVkKGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQoU2VydmljZSBzZXJ2aWNlKSB7CisgICAgICAgICAgICByZXR1cm4gc2VydmljZS5tQ2FuUmV0cmlldmVTY3JlZW5Db250ZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzUmV0cmlldmFsQWxsb3dpbmdXaW5kb3coaW50IHdpbmRvd0lkKSB7CisgICAgICAgICAgICByZXR1cm4gKG1SZXRyaWV2YWxBbG93aW5nV2luZG93SWQgPT0gd2luZG93SWQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQWN0aW9uUGVybWl0dGVkKGludCBhY3Rpb24pIHsKKyAgICAgICAgICAgICByZXR1cm4gKFZBTElEX0FDVElPTlMgJiBhY3Rpb24pICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKFN0cmluZyBwZXJtaXNzaW9uLCBTdHJpbmcgZnVuY3Rpb24pIHsKKyAgICAgICAgICAgIGlmIChPV05fUFJPQ0VTU19JRCA9PSBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgaW50IHBlcm1pc3Npb25TdGF0dXMgPSBtQ29udGV4dC5jaGVja0NhbGxpbmdQZXJtaXNzaW9uKHBlcm1pc3Npb24pOworICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25TdGF0dXMgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJZb3UgZG8gbm90IGhhdmUgIiArIHBlcm1pc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXF1aXJlZCB0byBjYWxsICIgKyBmdW5jdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCBjbGFzcyBDYWxsYmFjayBleHRlbmRzIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2suU3R1YiB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9JTlRFUkFDVElPTl9NSUxMSVMgPSA1MDAwOworCisgICAgICAgIHByaXZhdGUgaW50IG1JbnRlcmFjdGlvbklkID0gLTE7CisgICAgICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIG1GaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvUmVzdWx0OworICAgICAgICBwcml2YXRlIExpc3Q8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBtRmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NSZXN1bHQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25SZXN1bHQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb1Jlc3VsdChBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbywKKyAgICAgICAgICAgICAgICBpbnQgaW50ZXJhY3Rpb25JZCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChpbnRlcmFjdGlvbklkID4gbUludGVyYWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9SZXN1bHQgPSBpbmZvOworICAgICAgICAgICAgICAgICAgICBtSW50ZXJhY3Rpb25JZCA9IGludGVyYWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBnZXRGaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvUmVzdWx0QW5kQ2xlYXIoaW50IGludGVyYWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICB3YWl0Rm9yUmVzdWx0VGltZWRMb2NrZWQoVElNRU9VVF9JTlRFUkFDVElPTl9NSUxMSVMsIGludGVyYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyByZXN1bHQgPSBtRmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb1Jlc3VsdDsKKyAgICAgICAgICAgICAgICBjbGVhckxvY2tlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc1Jlc3VsdChMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4gaW5mb3MsCisgICAgICAgICAgICAgICAgaW50IGludGVyYWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJhY3Rpb25JZCA+IG1JbnRlcmFjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgIG1GaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc1Jlc3VsdCA9IGluZm9zOworICAgICAgICAgICAgICAgICAgICBtSW50ZXJhY3Rpb25JZCA9IGludGVyYWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBnZXRGaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc1Jlc3VsdEFuZENsZWFyKAorICAgICAgICAgICAgICAgIGludCBpbnRlcmFjdGlvbklkKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgd2FpdEZvclJlc3VsdFRpbWVkTG9ja2VkKFRJTUVPVVRfSU5URVJBQ1RJT05fTUlMTElTLCBpbnRlcmFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4gcmVzdWx0ID0gbUZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zUmVzdWx0OworICAgICAgICAgICAgICAgIGNsZWFyTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uUmVzdWx0KGJvb2xlYW4gc3VjY2VlZGVkLCBpbnQgaW50ZXJhY3Rpb25JZCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChpbnRlcmFjdGlvbklkID4gbUludGVyYWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uUmVzdWx0ID0gc3VjY2VlZGVkOworICAgICAgICAgICAgICAgICAgICBtSW50ZXJhY3Rpb25JZCA9IGludGVyYWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0UGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25SZXN1bHQoaW50IGludGVyYWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICB3YWl0Rm9yUmVzdWx0VGltZWRMb2NrZWQoVElNRU9VVF9JTlRFUkFDVElPTl9NSUxMSVMsIGludGVyYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gbVBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uUmVzdWx0OworICAgICAgICAgICAgICAgIGNsZWFyTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyTG9ja2VkKCkgeworICAgICAgICAgICAgbUludGVyYWN0aW9uSWQgPSAtMTsKKyAgICAgICAgICAgIG1GaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvUmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgIG1GaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc1Jlc3VsdCA9IG51bGw7CisgICAgICAgICAgICBtUGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25SZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yUmVzdWx0VGltZWRMb2NrZWQobG9uZyB3YWl0VGltZU1pbGxpcywgaW50IGludGVyYWN0aW9uSWQpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSW50ZXJhY3Rpb25JZCA9PSBpbnRlcmFjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBlbGFwc2VkVGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnRUaW1lTWlsbGlzOworICAgICAgICAgICAgICAgICAgICB3YWl0VGltZU1pbGxpcyA9IFRJTUVPVVRfSU5URVJBQ1RJT05fTUlMTElTIC0gZWxhcHNlZFRpbWVNaWxsaXM7CisgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0VGltZU1pbGxpcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sud2FpdCh3YWl0VGltZU1pbGxpcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGNmNTU5MmMuLmMyYThhMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTI1LDcgKzI1LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuU3lzdGVtU2VydmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5XYXRjaGRvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlTdGFjay5BY3Rpdml0eVN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5XaW5kb3dNYW5hZ2VyU2VydmljZTsKIAogaW1wb3J0IGRhbHZpay5zeXN0ZW0uWnlnb3RlOwpAQCAtOTY4LDEwICs5NjcsMTIgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IENIRUNLX0VYQ0VTU0lWRV9XQUtFX0xPQ0tTX01TRyA9IDI3OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfRE5TX0NBQ0hFID0gMjg7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfSFRUUF9QUk9YWSA9IDI5OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfRk9SRUdST1VORF9BQ1RJVklUSUVTX0NIQU5HRUQgPSAzMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IERJU1BBVENIX1BST0NFU1NfRElFRCA9IDMxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19DT01QQVRfTU9ERV9ESUFMT0dfTVNHID0gMzA7CisgICAgc3RhdGljIGZpbmFsIGludCBESVNQQVRDSF9GT1JFR1JPVU5EX0FDVElWSVRJRVNfQ0hBTkdFRCA9IDMxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfUFJPQ0VTU19ESUVEID0gMzI7CiAKICAgICBBbGVydERpYWxvZyBtVWlkQWxlcnQ7CisgICAgQ29tcGF0TW9kZURpYWxvZyBtQ29tcGF0TW9kZURpYWxvZzsKIAogICAgIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKICAgICAgICAgLy9wdWJsaWMgSGFuZGxlcigpIHsKQEAgLTEyNzAsMTYgKzEyNzEsNDUgQEAKICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG5tc2csIFBPV0VSX0NIRUNLX0RFTEFZKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBTSE9XX0NPTVBBVF9NT0RFX0RJQUxPR19NU0c6IHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEFjdGl2aXR5TWFuYWdlclNlcnZpY2UudGhpcykgeworICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCBhciA9IChBY3Rpdml0eVJlY29yZCltc2cub2JqOworICAgICAgICAgICAgICAgICAgICBpZiAobUNvbXBhdE1vZGVEaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db21wYXRNb2RlRGlhbG9nLm1BcHBJbmZvLnBhY2thZ2VOYW1lLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXIuaW5mby5hcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBhdE1vZGVEaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBhdE1vZGVEaWFsb2cgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbXBhdE1vZGVQYWNrYWdlcy5nZXRQYWNrYWdlQXNrQ29tcGF0TW9kZUxvY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXIucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUgPSBtQ29tcGF0TW9kZVBhY2thZ2VzLmNvbXB1dGVDb21wYXRNb2RlTG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXIuaW5mby5hcHBsaWNhdGlvbkluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09IEFjdGl2aXR5TWFuYWdlci5DT01QQVRfTU9ERV9ESVNBQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBBY3Rpdml0eU1hbmFnZXIuQ09NUEFUX01PREVfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGF0TW9kZURpYWxvZyA9IG5ldyBDb21wYXRNb2RlRGlhbG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UudGhpcywgbUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXIuaW5mby5hcHBsaWNhdGlvbkluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGF0TW9kZURpYWxvZy5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBESVNQQVRDSF9GT1JFR1JPVU5EX0FDVElWSVRJRVNfQ0hBTkdFRDogewotICAgICAgICAgICAgICAgIGZpbmFsIFByb2Nlc3NSZWNvcmQgYXBwID0gKFByb2Nlc3NSZWNvcmQpIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmb3JlZ3JvdW5kQWN0aXZpdGllcyA9IG1zZy5hcmcxICE9IDA7Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hGb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBhcHAucGlkLCBhcHAuaW5mby51aWQsIGZvcmVncm91bmRBY3Rpdml0aWVzKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGlkID0gbXNnLmFyZzE7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IG1zZy5hcmcyOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZm9yZWdyb3VuZEFjdGl2aXRpZXMgPSAoQm9vbGVhbikgbXNnLm9iajsKKyAgICAgICAgICAgICAgICBkaXNwYXRjaEZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChwaWQsIHVpZCwgZm9yZWdyb3VuZEFjdGl2aXRpZXMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBESVNQQVRDSF9QUk9DRVNTX0RJRUQ6IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBQcm9jZXNzUmVjb3JkIGFwcCA9IChQcm9jZXNzUmVjb3JkKSBtc2cub2JqOwotICAgICAgICAgICAgICAgIGRpc3BhdGNoUHJvY2Vzc0RpZWQoYXBwLnBpZCwgYXBwLmluZm8udWlkKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGlkID0gbXNnLmFyZzE7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IG1zZy5hcmcyOworICAgICAgICAgICAgICAgIGRpc3BhdGNoUHJvY2Vzc0RpZWQocGlkLCB1aWQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjExMiw2ICsyMTQyLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29tcGF0TW9kZVBhY2thZ2VzLmdldFBhY2thZ2VBc2tDb21wYXRNb2RlTG9ja2VkKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VBc2tTY3JlZW5Db21wYXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGFzaykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1Db21wYXRNb2RlUGFja2FnZXMuc2V0UGFja2FnZUFza0NvbXBhdE1vZGVMb2NrZWQocGFja2FnZU5hbWUsIGFzayk7CisgICAgICAgIH0KKyAgICB9CisKICAgICB2b2lkIHJlcG9ydFJlc3VtZWRBY3Rpdml0eUxvY2tlZChBY3Rpdml0eVJlY29yZCByKSB7CiAgICAgICAgIC8vU2xvZy5pKFRBRywgIioqKiogUkVQT1JUIFJFU1VNRTogIiArIHIpOwogICAgICAgICAKQEAgLTM2MzQsNiArMzY3Niw3IEBACiAgICAgICAgICAgICBib29sZWFuIGlzUmVzdHJpY3RlZEJhY2t1cE1vZGUgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChtQmFja3VwVGFyZ2V0ICE9IG51bGwgJiYgbUJhY2t1cEFwcE5hbWUuZXF1YWxzKHByb2Nlc3NOYW1lKSkgewogICAgICAgICAgICAgICAgIGlzUmVzdHJpY3RlZEJhY2t1cE1vZGUgPSAobUJhY2t1cFRhcmdldC5iYWNrdXBNb2RlID09IEJhY2t1cFJlY29yZC5SRVNUT1JFKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1CYWNrdXBUYXJnZXQuYmFja3VwTW9kZSA9PSBCYWNrdXBSZWNvcmQuUkVTVE9SRV9GVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1CYWNrdXBUYXJnZXQuYmFja3VwTW9kZSA9PSBCYWNrdXBSZWNvcmQuQkFDS1VQX0ZVTEwpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgCkBAIC0zNjQ3LDEyICszNjkwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICsgcHJvY2Vzc05hbWUgKyAiIHdpdGggY29uZmlnICIgKyBtQ29uZmlndXJhdGlvbik7CiAgICAgICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwSW5mbyA9IGFwcC5pbnN0cnVtZW50YXRpb25JbmZvICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgPyBhcHAuaW5zdHJ1bWVudGF0aW9uSW5mbyA6IGFwcC5pbmZvOworICAgICAgICAgICAgYXBwLmNvbXBhdCA9IGNvbXBhdGliaWxpdHlJbmZvRm9yUGFja2FnZUxvY2tlZChhcHBJbmZvKTsKICAgICAgICAgICAgIHRocmVhZC5iaW5kQXBwbGljYXRpb24ocHJvY2Vzc05hbWUsIGFwcEluZm8sIHByb3ZpZGVycywKICAgICAgICAgICAgICAgICAgICAgYXBwLmluc3RydW1lbnRhdGlvbkNsYXNzLCBhcHAuaW5zdHJ1bWVudGF0aW9uUHJvZmlsZUZpbGUsCiAgICAgICAgICAgICAgICAgICAgIGFwcC5pbnN0cnVtZW50YXRpb25Bcmd1bWVudHMsIGFwcC5pbnN0cnVtZW50YXRpb25XYXRjaGVyLCB0ZXN0TW9kZSwgCiAgICAgICAgICAgICAgICAgICAgIGlzUmVzdHJpY3RlZEJhY2t1cE1vZGUgfHwgIW5vcm1hbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmF0aW9uLCBjb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoYXBwSW5mbyksCi0gICAgICAgICAgICAgICAgICAgIGdldENvbW1vblNlcnZpY2VzTG9ja2VkKCksCisgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmF0aW9uLCBhcHAuY29tcGF0LCBnZXRDb21tb25TZXJ2aWNlc0xvY2tlZCgpLAogICAgICAgICAgICAgICAgICAgICBtQ29yZVNldHRpbmdzT2JzZXJ2ZXIuZ2V0Q29yZVNldHRpbmdzTG9ja2VkKCkpOwogICAgICAgICAgICAgdXBkYXRlTHJ1UHJvY2Vzc0xvY2tlZChhcHAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgIGFwcC5sYXN0UmVxdWVzdGVkR2MgPSBhcHAubGFzdExvd01lbW9yeSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwpAQCAtNzk0OCw4ICs3OTkxLDE0IEBACiAgICAgICAgIGlmIChkdW1wQWxsKSB7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1Db25maWdXaWxsQ2hhbmdlOiAiICsgbU1haW5TdGFjay5tQ29uZmlnV2lsbENoYW5nZSk7CiAgICAgICAgICAgICBpZiAobUNvbXBhdE1vZGVQYWNrYWdlcy5nZXRQYWNrYWdlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludCgiICBtU2NyZWVuQ29tcGF0UGFja2FnZXM9Iik7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbihtQ29tcGF0TW9kZVBhY2thZ2VzLmdldFBhY2thZ2VzKCkpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVNjcmVlbkNvbXBhdFBhY2thZ2VzOiIpOworICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgSW50ZWdlcj4gZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvbXBhdE1vZGVQYWNrYWdlcy5nZXRQYWNrYWdlcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgIik7IHB3LnByaW50KHBrZyk7IHB3LnByaW50KCI6ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KG1vZGUpOyBwdy5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oIiAgbVNsZWVwaW5nPSIgKyBtU2xlZXBpbmcgKyAiIG1TaHV0dGluZ0Rvd249IiArIG1TaHV0dGluZ0Rvd24pOwpAQCAtOTIxMSw3ICs5MjYwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRElTUEFUQ0hfUFJPQ0VTU19ESUVELCBhcHApLnNlbmRUb1RhcmdldCgpOworICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKERJU1BBVENIX1BST0NFU1NfRElFRCwgYXBwLnBpZCwgYXBwLmluZm8udWlkLCBudWxsKS5zZW5kVG9UYXJnZXQoKTsKIAogICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIGlzIHJlc3RhcnRpbmcgdGhpcyBhcHAsIHRoZW4gbGVhdmUgaXQgaW4gaXRzCiAgICAgICAgIC8vIGN1cnJlbnQgbGlzdHMgYW5kIGxldCB0aGUgY2FsbGVyIHRha2UgY2FyZSBvZiBpdC4KQEAgLTExMTA5LDEzICsxMTE1OCwxMSBAQAogICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGFkZGluZyBhIHBhY2thZ2U6IGJ5IGRlZmF1bHQgdHVybiBvbiBjb21wYXRpYmlsaXR5CiAgICAgICAgIC8vIG1vZGUuCiAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICBpZiAoIWludGVudC5nZXRCb29sZWFuRXh0cmEoSW50ZW50LkVYVFJBX1JFUExBQ0lORywgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgVXJpIGRhdGEgPSBpbnRlbnQuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzc3A7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiAoc3NwPWRhdGEuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBhdE1vZGVQYWNrYWdlcy5zZXRQYWNrYWdlU2NyZWVuQ29tcGF0TW9kZUxvY2tlZChzc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0VOQUJMRUQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVyaSBkYXRhID0gaW50ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIFN0cmluZyBzc3A7CisgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIChzc3A9ZGF0YS5nZXRTY2hlbWVTcGVjaWZpY1BhcnQoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Db21wYXRNb2RlUGFja2FnZXMuaGFuZGxlUGFja2FnZUFkZGVkTG9ja2VkKHNzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCb29sZWFuRXh0cmEoSW50ZW50LkVYVFJBX1JFUExBQ0lORywgZmFsc2UpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMjM1MSw2ICsxMjM5OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBhYy51cGRhdGVDb25maWd1cmF0aW9uKG1Db25maWd1cmF0aW9uKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIHJlc291cmNlcyBpbiBvdXIgcHJvY2VzcyBhcmUgdXBkYXRlZAorICAgICAgICAgICAgICAgIC8vIHJpZ2h0IG5vdywgc28gdGhhdCBhbnlvbmUgd2hvIGlzIGdvaW5nIHRvIHJldHJpZXZlCisgICAgICAgICAgICAgICAgLy8gcmVzb3VyY2UgdmFsdWVzIGFmdGVyIHdlIHJldHVybiB3aWxsIGJlIHN1cmUgdG8gZ2V0CisgICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBvbmVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBkdXJpbmcKKyAgICAgICAgICAgICAgICAvLyBib290LCB3aGVyZSB0aGUgZmlyc3QgY29uZmlnIGNoYW5nZSBuZWVkcyB0byBndWFyYW50ZWUKKyAgICAgICAgICAgICAgICAvLyBhbGwgcmVzb3VyY2VzIGhhdmUgdGhhdCBjb25maWcgYmVmb3JlIGZvbGxvd2luZyBib290CisgICAgICAgICAgICAgICAgLy8gY29kZSBpcyBleGVjdXRlZC4KKyAgICAgICAgICAgICAgICBtU3lzdGVtVGhyZWFkLmFwcGx5Q29uZmlndXJhdGlvblRvUmVzb3VyY2VzKG5ld0NvbmZpZyk7CisKICAgICAgICAgICAgICAgICBpZiAoU2V0dGluZ3MuU3lzdGVtLmhhc0ludGVyZXN0aW5nQ29uZmlndXJhdGlvbkNoYW5nZXMoY2hhbmdlcykpIHsKICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFVQREFURV9DT05GSUdVUkFUSU9OX01TRyk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBuZXcgQ29uZmlndXJhdGlvbihtQ29uZmlndXJhdGlvbik7CkBAIC0xMjc3Miw4ICsxMjgyOCw4IEBACiAgICAgICAgIGFwcC5jdXJTY2hlZEdyb3VwID0gc2NoZWRHcm91cDsKIAogICAgICAgICBpZiAoaGFkRm9yZWdyb3VuZEFjdGl2aXRpZXMgIT0gYXBwLmZvcmVncm91bmRBY3Rpdml0aWVzKSB7Ci0gICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKERJU1BBVENIX0ZPUkVHUk9VTkRfQUNUSVZJVElFU19DSEFOR0VELAotICAgICAgICAgICAgICAgICAgICBhcHAuZm9yZWdyb3VuZEFjdGl2aXRpZXMgPyAxIDogMCwgMCwgYXBwKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRElTUEFUQ0hfRk9SRUdST1VORF9BQ1RJVklUSUVTX0NIQU5HRUQsIGFwcC5waWQsIGFwcC5pbmZvLnVpZCwKKyAgICAgICAgICAgICAgICAgICAgYXBwLmZvcmVncm91bmRBY3Rpdml0aWVzKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBhZGo7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YQppbmRleCBjYzllNzhlLi4wOTBlMjZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbXBhdGliaWxpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwpAQCAtNzksNiArODAsNyBAQAogICAgIGxvbmcgc3RhcnRUaW1lOyAgICAgICAgIC8vIGxhc3QgdGltZSB0aGlzIGFjdGl2aXR5IHdhcyBzdGFydGVkCiAgICAgbG9uZyBjcHVUaW1lQXRSZXN1bWU7ICAgLy8gdGhlIGNwdSB0aW1lIG9mIGhvc3QgcHJvY2VzcyBhdCB0aGUgdGltZSBvZiByZXN1bWluZyBhY3Rpdml0eQogICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsgLy8gY29uZmlndXJhdGlvbiBhY3Rpdml0eSB3YXMgbGFzdCBydW5uaW5nIGluCisgICAgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0Oy8vIGxhc3QgdXNlZCBjb21wYXRpYmlsaXR5IG1vZGUKICAgICBBY3Rpdml0eVJlY29yZCByZXN1bHRUbzsgLy8gd2hvIHN0YXJ0ZWQgdGhpcyBlbnRyeSwgc28gd2lsbCBnZXQgb3VyIHJlcGx5CiAgICAgZmluYWwgU3RyaW5nIHJlc3VsdFdobzsgLy8gYWRkaXRpb25hbCBpZGVudGlmaWVyIGZvciB1c2UgYnkgcmVzdWx0VG8uCiAgICAgZmluYWwgaW50IHJlcXVlc3RDb2RlOyAgLy8gY29kZSBnaXZlbiBieSByZXF1ZXN0ZXIgKHJlc3VsdFRvKQpAQCAtMTM3LDYgKzEzOSw3IEBACiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBjb21wb25lbnRTcGVjaWZpZWQ9Iik7IHB3LnByaW50KGNvbXBvbmVudFNwZWNpZmllZCk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBpc0hvbWVBY3Rpdml0eT0iKTsgcHcucHJpbnRsbihpc0hvbWVBY3Rpdml0eSk7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJjb25maWc9Iik7IHB3LnByaW50bG4oY29uZmlndXJhdGlvbik7CisgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJjb21wYXQ9Iik7IHB3LnByaW50bG4oY29tcGF0KTsKICAgICAgICAgaWYgKHJlc3VsdFRvICE9IG51bGwgfHwgcmVzdWx0V2hvICE9IG51bGwpIHsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJyZXN1bHRUbz0iKTsgcHcucHJpbnQocmVzdWx0VG8pOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIHJlc3VsdFdobz0iKTsgcHcucHJpbnQocmVzdWx0V2hvKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YQppbmRleCBkNWFjMTllLi5kODc3MmI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjay5qYXZhCkBAIC00ODUsNiArNDg1LDEzIEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIGZpbmFsIHZvaWQgc2hvd0Fza0NvbXBhdE1vZGVEaWFsb2dMb2NrZWQoQWN0aXZpdHlSZWNvcmQgcikgeworICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7CisgICAgICAgIG1zZy53aGF0ID0gQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5TSE9XX0NPTVBBVF9NT0RFX0RJQUxPR19NU0c7CisgICAgICAgIG1zZy5vYmogPSByLnRhc2suYXNrZWRDb21wYXRNb2RlID8gbnVsbCA6IHI7CisgICAgICAgIG1TZXJ2aWNlLm1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgfQorCiAgICAgZmluYWwgYm9vbGVhbiByZWFsU3RhcnRBY3Rpdml0eUxvY2tlZChBY3Rpdml0eVJlY29yZCByLAogICAgICAgICAgICAgUHJvY2Vzc1JlY29yZCBhcHAsIGJvb2xlYW4gYW5kUmVzdW1lLCBib29sZWFuIGNoZWNrQ29uZmlnKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CkBAIC01NDEsMTAgKzU0OCwxMSBAQAogICAgICAgICAgICAgbVNlcnZpY2UuZW5zdXJlUGFja2FnZURleE9wdChyLmludGVudC5nZXRDb21wb25lbnQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgICAgIHIuc2xlZXBpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIHIuZm9yY2VOZXdDb25maWcgPSBmYWxzZTsKKyAgICAgICAgICAgIHNob3dBc2tDb21wYXRNb2RlRGlhbG9nTG9ja2VkKHIpOworICAgICAgICAgICAgci5jb21wYXQgPSBtU2VydmljZS5jb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoci5pbmZvLmFwcGxpY2F0aW9uSW5mbyk7CiAgICAgICAgICAgICBhcHAudGhyZWFkLnNjaGVkdWxlTGF1bmNoQWN0aXZpdHkobmV3IEludGVudChyLmludGVudCksIHIsCiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHIpLAotICAgICAgICAgICAgICAgICAgICByLmluZm8sIG1TZXJ2aWNlLmNvbXBhdGliaWxpdHlJbmZvRm9yUGFja2FnZUxvY2tlZChyLmluZm8uYXBwbGljYXRpb25JbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgci5pY2ljbGUsIHJlc3VsdHMsIG5ld0ludGVudHMsICFhbmRSZXN1bWUsCisgICAgICAgICAgICAgICAgICAgIHIuaW5mbywgci5jb21wYXQsIHIuaWNpY2xlLCByZXN1bHRzLCBuZXdJbnRlbnRzLCAhYW5kUmVzdW1lLAogICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5pc05leHRUcmFuc2l0aW9uRm9yd2FyZCgpKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKChhcHAuaW5mby5mbGFncyZBcHBsaWNhdGlvbkluZm8uRkxBR19DQU5UX1NBVkVfU1RBVEUpICE9IDApIHsKQEAgLTE0MzAsNiArMTQzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LnRhc2sudGFza0lkLCBuZXh0LnNob3J0Q29tcG9uZW50TmFtZSk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgbmV4dC5zbGVlcGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNob3dBc2tDb21wYXRNb2RlRGlhbG9nTG9ja2VkKG5leHQpOwogICAgICAgICAgICAgICAgIG5leHQuYXBwLnRocmVhZC5zY2hlZHVsZVJlc3VtZUFjdGl2aXR5KG5leHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5pc05leHRUcmFuc2l0aW9uRm9yd2FyZCgpKTsKICAgICAgICAgICAgICAgICAKQEAgLTE0NDYsNiArMTQ1NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX0FQUF9TVEFSVElOR19QUkVWSUVXICYmIG1NYWluU3RhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm1XaW5kb3dNYW5hZ2VyLnNldEFwcFN0YXJ0aW5nV2luZG93KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LCBuZXh0LnBhY2thZ2VOYW1lLCBuZXh0LnRoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5jb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5pbmZvLmFwcGxpY2F0aW9uSW5mbyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQubm9uTG9jYWxpemVkTGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQubGFiZWxSZXMsIG5leHQuaWNvbiwgbmV4dC53aW5kb3dGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSk7CkBAIC0xNDgyLDYgKzE0OTMsOCBAQAogICAgICAgICAgICAgICAgIGlmIChTSE9XX0FQUF9TVEFSVElOR19QUkVWSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm1XaW5kb3dNYW5hZ2VyLnNldEFwcFN0YXJ0aW5nV2luZG93KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQsIG5leHQucGFja2FnZU5hbWUsIG5leHQudGhlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5pbmZvLmFwcGxpY2F0aW9uSW5mbyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5ub25Mb2NhbGl6ZWRMYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmxhYmVsUmVzLCBuZXh0Lmljb24sIG5leHQud2luZG93RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSk7CkBAIC0xNjA2LDcgKzE2MTksOSBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmV2Lm5vd1Zpc2libGUpIHByZXYgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU2VydmljZS5tV2luZG93TWFuYWdlci5zZXRBcHBTdGFydGluZ1dpbmRvdygKLSAgICAgICAgICAgICAgICAgICAgICAgIHIsIHIucGFja2FnZU5hbWUsIHIudGhlbWUsIHIubm9uTG9jYWxpemVkTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICByLCByLnBhY2thZ2VOYW1lLCByLnRoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmluZm8uYXBwbGljYXRpb25JbmZvKSwgci5ub25Mb2NhbGl6ZWRMYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgIHIubGFiZWxSZXMsIHIuaWNvbiwgci53aW5kb3dGbGFncywgcHJldiwgc2hvd1N0YXJ0aW5nSWNvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zODkyLDEwICszOTA3LDEwIEBACiAgICAgICAgIGlmIChERUJVR19TV0lUQ0ggfHwgREVCVUdfQ09ORklHVVJBVElPTikgewogICAgICAgICAgICAgU2xvZy52KFRBRywgIkNoZWNraW5nIHRvIHJlc3RhcnQgIiArIHIuaW5mby5uYW1lICsgIjogY2hhbmdlZD0weCIKICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoYW5nZXMpICsgIiwgaGFuZGxlcz0weCIKLSAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHIuaW5mby5jb25maWdDaGFuZ2VzKQorICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoci5pbmZvLmdldFJlYWxDb25maWdDaGFuZ2VkKCkpCiAgICAgICAgICAgICAgICAgICAgICsgIiwgbmV3Q29uZmlnPSIgKyBuZXdDb25maWcpOwogICAgICAgICB9Ci0gICAgICAgIGlmICgoY2hhbmdlcyYofnIuaW5mby5jb25maWdDaGFuZ2VzKSkgIT0gMCB8fCByLmZvcmNlTmV3Q29uZmlnKSB7CisgICAgICAgIGlmICgoY2hhbmdlcyYofnIuaW5mby5nZXRSZWFsQ29uZmlnQ2hhbmdlZCgpKSkgIT0gMCB8fCByLmZvcmNlTmV3Q29uZmlnKSB7CiAgICAgICAgICAgICAvLyBBaGEsIHRoZSBhY3Rpdml0eSBpc24ndCBoYW5kbGluZyB0aGUgY2hhbmdlLCBzbyBESUUgRElFIERJRS4KICAgICAgICAgICAgIHIuY29uZmlnQ2hhbmdlRmxhZ3MgfD0gY2hhbmdlczsKICAgICAgICAgICAgIHIuc3RhcnRGcmVlemluZ1NjcmVlbkxvY2tlZChyLmFwcCwgZ2xvYmFsQ2hhbmdlcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9CYWNrdXBSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhY2t1cFJlY29yZC5qYXZhCmluZGV4IDY1OTBiOTEuLjdlNzMxMDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhY2t1cFJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhY2t1cFJlY29yZC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1VQX05PUk1BTCA9IDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1VQX0ZVTEwgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RPUkUgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RPUkVfRlVMTCA9IDM7CiAgICAgCiAgICAgZmluYWwgQmF0dGVyeVN0YXRzSW1wbC5VaWQuUGtnLlNlcnYgc3RhdHM7CiAgICAgU3RyaW5nIHN0cmluZ05hbWU7ICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGVkIHRvU3RyaW5nKCkgb3V0cHV0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlRGlhbG9nLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0MmJkYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0NvbXBhdE1vZGVEaWFsb2cuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Td2l0Y2g7CisKK3B1YmxpYyBjbGFzcyBDb21wYXRNb2RlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKKyAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBtQXBwSW5mbzsKKworICAgIGZpbmFsIFN3aXRjaCBtQ29tcGF0RW5hYmxlZDsKKyAgICBmaW5hbCBDaGVja0JveCBtQWx3YXlzU2hvdzsKKyAgICBmaW5hbCBWaWV3IG1IaW50OworCisgICAgcHVibGljIENvbXBhdE1vZGVEaWFsb2coQWN0aXZpdHlNYW5hZ2VyU2VydmljZSBzZXJ2aWNlLCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwSW5mbykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0hvbG9fRGlhbG9nX01pbldpZHRoKTsKKyAgICAgICAgc2V0Q2FuY2VsYWJsZSh0cnVlKTsKKyAgICAgICAgc2V0Q2FuY2VsZWRPblRvdWNoT3V0c2lkZSh0cnVlKTsKKyAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICBnZXRXaW5kb3coKS5zZXRUeXBlKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfUEhPTkUpOworICAgICAgICBnZXRXaW5kb3coKS5zZXRHcmF2aXR5KEdyYXZpdHkuQk9UVE9NfEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUwpOworICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CisgICAgICAgIG1BcHBJbmZvID0gYXBwSW5mbzsKKworICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5hbV9jb21wYXRfbW9kZV9kaWFsb2cpOworICAgICAgICBtQ29tcGF0RW5hYmxlZCA9IChTd2l0Y2gpZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuY29tcGF0X2NoZWNrYm94KTsKKyAgICAgICAgbUNvbXBhdEVuYWJsZWQuc2V0T25DaGVja2VkQ2hhbmdlTGlzdGVuZXIobmV3IENvbXBvdW5kQnV0dG9uLk9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKENvbXBvdW5kQnV0dG9uIGJ1dHRvblZpZXcsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtU2VydmljZSkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5tQ29tcGF0TW9kZVBhY2thZ2VzLnNldFBhY2thZ2VTY3JlZW5Db21wYXRNb2RlTG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BcHBJbmZvLnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wYXRFbmFibGVkLmlzQ2hlY2tlZCgpID8gQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0RJU0FCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udHJvbHMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtQWx3YXlzU2hvdyA9IChDaGVja0JveClmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hc2tfY2hlY2tib3gpOworICAgICAgICBtQWx3YXlzU2hvdy5zZXRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcihuZXcgQ29tcG91bmRCdXR0b24uT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoQ29tcG91bmRCdXR0b24gYnV0dG9uVmlldywgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TZXJ2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm1Db21wYXRNb2RlUGFja2FnZXMuc2V0UGFja2FnZUFza0NvbXBhdE1vZGVMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFwcEluZm8ucGFja2FnZU5hbWUsIG1BbHdheXNTaG93LmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udHJvbHMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtSGludCA9IGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnJlYXNrX2hpbnQpOworCisgICAgICAgIHVwZGF0ZUNvbnRyb2xzKCk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVDb250cm9scygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtU2VydmljZSkgeworICAgICAgICAgICAgaW50IG1vZGUgPSBtU2VydmljZS5tQ29tcGF0TW9kZVBhY2thZ2VzLmNvbXB1dGVDb21wYXRNb2RlTG9ja2VkKG1BcHBJbmZvKTsKKyAgICAgICAgICAgIG1Db21wYXRFbmFibGVkLnNldENoZWNrZWQobW9kZSA9PSBBY3Rpdml0eU1hbmFnZXIuQ09NUEFUX01PREVfRU5BQkxFRCk7CisgICAgICAgICAgICBib29sZWFuIGFzayA9IG1TZXJ2aWNlLm1Db21wYXRNb2RlUGFja2FnZXMuZ2V0UGFja2FnZUFza0NvbXBhdE1vZGVMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgIG1BcHBJbmZvLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIG1BbHdheXNTaG93LnNldENoZWNrZWQoYXNrKTsKKyAgICAgICAgICAgIG1IaW50LnNldFZpc2liaWxpdHkoYXNrID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQ29tcGF0TW9kZVBhY2thZ2VzLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlUGFja2FnZXMuamF2YQppbmRleCAxZmFmOGRhLi4xMzM0YmNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlUGFja2FnZXMuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlUGFja2FnZXMuamF2YQpAQCAtMyw4ICszLDEwIEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKQEAgLTE1LDYgKzE3LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29tcGF0aWJpbGl0eUluZm87CkBAIC0zMSw3ICszNCwxMiBAQAogICAgIHByaXZhdGUgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU2VydmljZSBtU2VydmljZTsKICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ZpbGUgbUZpbGU7CiAKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBtUGFja2FnZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgLy8gQ29tcGF0aWJpbGl0eSBzdGF0ZTogbm8gbG9uZ2VyIGFzayB1c2VyIHRvIHNlbGVjdCB0aGUgbW9kZS4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QQVRfRkxBR19ET05UX0FTSyA9IDE8PDA7CisgICAgLy8gQ29tcGF0aWJpbGl0eSBzdGF0ZTogY29tcGF0aWJpbGl0eSBtb2RlIGlzIGVuYWJsZWQuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUEFUX0ZMQUdfRU5BQkxFRCA9IDE8PDE7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtUGFja2FnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1dSSVRFID0gMTsKIApAQCAtNzEsNyArNzksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInBrZyIuZXF1YWxzKHRhZ05hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwa2cgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgIm5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZXMuYWRkKHBrZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibW9kZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGVJbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVJbnQgPSBJbnRlZ2VyLnBhcnNlSW50KG1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VzLnB1dChwa2csIG1vZGVJbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTMsMTkgKzEwOSw1OSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIEhhc2hTZXQ8U3RyaW5nPiBnZXRQYWNrYWdlcygpIHsKKyAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IGdldFBhY2thZ2VzKCkgewogICAgICAgICByZXR1cm4gbVBhY2thZ2VzOwogICAgIH0KIAotICAgIHB1YmxpYyBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoQXBwbGljYXRpb25JbmZvIGFpKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGF0aWJpbGl0eUluZm8oYWksIG1TZXJ2aWNlLm1Db25maWd1cmF0aW9uLnNjcmVlbkxheW91dCwKLSAgICAgICAgICAgICAgICBtUGFja2FnZXMuY29udGFpbnMoYWkucGFja2FnZU5hbWUpKTsKKyAgICBwcml2YXRlIGludCBnZXRQYWNrYWdlRmxhZ3MoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIEludGVnZXIgZmxhZ3MgPSBtUGFja2FnZXMuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZsYWdzICE9IG51bGwgPyBmbGFncyA6IDA7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgY29tcHV0ZUNvbXBhdE1vZGVMb2NrZWQoQXBwbGljYXRpb25JbmZvIGFpKSB7Ci0gICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IG1QYWNrYWdlcy5jb250YWlucyhhaS5wYWNrYWdlTmFtZSk7CisgICAgcHVibGljIHZvaWQgaGFuZGxlUGFja2FnZUFkZGVkTG9ja2VkKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiB1cGRhdGVkKSB7CisgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhaSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhaSA9IEFwcEdsb2JhbHMuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRBcHBsaWNhdGlvbkluZm8ocGFja2FnZU5hbWUsIDApOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGlmIChhaSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY2kgPSBjb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoYWkpOworICAgICAgICBmaW5hbCBib29sZWFuIG1heUNvbXBhdCA9ICFjaS5hbHdheXNTdXBwb3J0c1NjcmVlbigpCisgICAgICAgICAgICAgICAgJiYgIWNpLm5ldmVyU3VwcG9ydHNTY3JlZW4oKTsKKworICAgICAgICBpZiAoIXVwZGF0ZWQpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgLS0gaWYgdGhlIGFwcCBtYXkgcnVuIGluIGNvbXBhdCBtb2RlLCBlbmFibGUgdGhhdAorICAgICAgICAgICAgLy8gYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIGlmIChtYXlDb21wYXQpIHsKKyAgICAgICAgICAgICAgICBzZXRQYWNrYWdlU2NyZWVuQ29tcGF0TW9kZUxvY2tlZChhaSwgQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0VOQUJMRUQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXBkYXRlIC0tIGlmIHRoZSBhcHAgbm8gbG9uZ2VyIGNhbiBydW4gaW4gY29tcGF0IG1vZGUsIGNsZWFyCisgICAgICAgICAgICAvLyBhbnkgY3VycmVudCBzZXR0aW5ncyBmb3IgaXQuCisgICAgICAgICAgICBpZiAoIW1heUNvbXBhdCAmJiBtUGFja2FnZXMuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VzLnJlbW92ZShwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1dSSVRFKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1dSSVRFKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCAxMDAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKEFwcGxpY2F0aW9uSW5mbyBhaSkgeworICAgICAgICBDb21wYXRpYmlsaXR5SW5mbyBjaSA9IG5ldyBDb21wYXRpYmlsaXR5SW5mbyhhaSwgbVNlcnZpY2UubUNvbmZpZ3VyYXRpb24uc2NyZWVuTGF5b3V0LAorICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm1Db25maWd1cmF0aW9uLnNtYWxsZXN0U2NyZWVuV2lkdGhEcCwKKyAgICAgICAgICAgICAgICAoZ2V0UGFja2FnZUZsYWdzKGFpLnBhY2thZ2VOYW1lKSZDT01QQVRfRkxBR19FTkFCTEVEKSAhPSAwKTsKKyAgICAgICAgLy9TbG9nLmkoVEFHLCAiKioqKioqKioqKiogQ09NUEFUIEZPUiBQS0cgIiArIGFpLnBhY2thZ2VOYW1lICsgIjogIiArIGNpKTsKKyAgICAgICAgcmV0dXJuIGNpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcHV0ZUNvbXBhdE1vZGVMb2NrZWQoQXBwbGljYXRpb25JbmZvIGFpKSB7CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IChnZXRQYWNrYWdlRmxhZ3MoYWkucGFja2FnZU5hbWUpJkNPTVBBVF9GTEFHX0VOQUJMRUQpICE9IDA7CiAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGluZm8gPSBuZXcgQ29tcGF0aWJpbGl0eUluZm8oYWksCi0gICAgICAgICAgICAgICAgbVNlcnZpY2UubUNvbmZpZ3VyYXRpb24uc2NyZWVuTGF5b3V0LCBlbmFibGVkKTsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5tQ29uZmlndXJhdGlvbi5zY3JlZW5MYXlvdXQsCisgICAgICAgICAgICAgICAgbVNlcnZpY2UubUNvbmZpZ3VyYXRpb24uc21hbGxlc3RTY3JlZW5XaWR0aERwLCBlbmFibGVkKTsKICAgICAgICAgaWYgKGluZm8uYWx3YXlzU3VwcG9ydHNTY3JlZW4oKSkgewogICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5DT01QQVRfTU9ERV9ORVZFUjsKICAgICAgICAgfQpAQCAtMTE2LDYgKzE3Miw0MCBAQAogICAgICAgICAgICAgICAgIDogQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0RJU0FCTEVEOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGdldEZyb250QWN0aXZpdHlBc2tDb21wYXRNb2RlTG9ja2VkKCkgeworICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gbVNlcnZpY2UubU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CisgICAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0UGFja2FnZUFza0NvbXBhdE1vZGVMb2NrZWQoci5wYWNrYWdlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UGFja2FnZUFza0NvbXBhdE1vZGVMb2NrZWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHJldHVybiAoZ2V0UGFja2FnZUZsYWdzKHBhY2thZ2VOYW1lKSZDT01QQVRfRkxBR19ET05UX0FTSykgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGcm9udEFjdGl2aXR5QXNrQ29tcGF0TW9kZUxvY2tlZChib29sZWFuIGFzaykgeworICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gbVNlcnZpY2UubU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CisgICAgICAgIGlmIChyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFBhY2thZ2VBc2tDb21wYXRNb2RlTG9ja2VkKHIucGFja2FnZU5hbWUsIGFzayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlQXNrQ29tcGF0TW9kZUxvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gYXNrKSB7CisgICAgICAgIGludCBjdXJGbGFncyA9IGdldFBhY2thZ2VGbGFncyhwYWNrYWdlTmFtZSk7CisgICAgICAgIGludCBuZXdGbGFncyA9IGFzayA/IChjdXJGbGFncyZ+Q09NUEFUX0ZMQUdfRE9OVF9BU0spIDogKGN1ckZsYWdzfENPTVBBVF9GTEFHX0RPTlRfQVNLKTsKKyAgICAgICAgaWYgKGN1ckZsYWdzICE9IG5ld0ZsYWdzKSB7CisgICAgICAgICAgICBpZiAobmV3RmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgICAgIG1QYWNrYWdlcy5wdXQocGFja2FnZU5hbWUsIG5ld0ZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VzLnJlbW92ZShwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfV1JJVEUpOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19XUklURSk7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCAxMDAwMCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgaW50IGdldEZyb250QWN0aXZpdHlTY3JlZW5Db21wYXRNb2RlTG9ja2VkKCkgewogICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gbVNlcnZpY2UubU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CiAgICAgICAgIGlmIChyID09IG51bGwpIHsKQEAgLTE2MSw3ICsyNTEsOCBAQAogICAgIHByaXZhdGUgdm9pZCBzZXRQYWNrYWdlU2NyZWVuQ29tcGF0TW9kZUxvY2tlZChBcHBsaWNhdGlvbkluZm8gYWksIGludCBtb2RlKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGFpLnBhY2thZ2VOYW1lOwogCi0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBpbnQgY3VyRmxhZ3MgPSBnZXRQYWNrYWdlRmxhZ3MocGFja2FnZU5hbWUpOworCiAgICAgICAgIGJvb2xlYW4gZW5hYmxlOwogICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0RJU0FCTEVEOgpAQCAtMTcxLDQwICsyNjIsNjEgQEAKICAgICAgICAgICAgICAgICBlbmFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuQ09NUEFUX01PREVfVE9HR0xFOgotICAgICAgICAgICAgICAgIGVuYWJsZSA9ICFtUGFja2FnZXMuY29udGFpbnMocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgIGVuYWJsZSA9IChjdXJGbGFncyZDT01QQVRfRkxBR19FTkFCTEVEKSA9PSAwOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5rbm93biBzY3JlZW4gY29tcGF0IG1vZGUgcmVxICMiICsgbW9kZSArICI7IGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKKyAgICAgICAgaW50IG5ld0ZsYWdzID0gY3VyRmxhZ3M7CiAgICAgICAgIGlmIChlbmFibGUpIHsKLSAgICAgICAgICAgIGlmICghbVBhY2thZ2VzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1QYWNrYWdlcy5hZGQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3RmxhZ3MgfD0gQ09NUEFUX0ZMQUdfRU5BQkxFRDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtUGFja2FnZXMuY29udGFpbnMocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBuZXdGbGFncyAmPSB+Q09NUEFUX0ZMQUdfRU5BQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGNpID0gY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKGFpKTsKKyAgICAgICAgaWYgKGNpLmFsd2F5c1N1cHBvcnRzU2NyZWVuKCkpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJJZ25vcmluZyBjb21wYXQgbW9kZSBjaGFuZ2Ugb2YgIiArIHBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjsgY29tcGF0aWJpbGl0eSBuZXZlciBuZWVkZWQiKTsKKyAgICAgICAgICAgIG5ld0ZsYWdzID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2kubmV2ZXJTdXBwb3J0c1NjcmVlbigpKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiSWdub3JpbmcgY29tcGF0IG1vZGUgY2hhbmdlIG9mICIgKyBwYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICAgICArICI7IGNvbXBhdGliaWxpdHkgYWx3YXlzIG5lZWRlZCIpOworICAgICAgICAgICAgbmV3RmxhZ3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0ZsYWdzICE9IGN1ckZsYWdzKSB7CisgICAgICAgICAgICBpZiAobmV3RmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgICAgIG1QYWNrYWdlcy5wdXQocGFja2FnZU5hbWUsIG5ld0ZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVBhY2thZ2VzLnJlbW92ZShwYWNrYWdlTmFtZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGNpID0gY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKGFpKTsKLSAgICAgICAgICAgIGlmIChjaS5hbHdheXNTdXBwb3J0c1NjcmVlbigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklnbm9yaW5nIGNvbXBhdCBtb2RlIGNoYW5nZSBvZiAiICsgcGFja2FnZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgY29tcGF0aWJpbGl0eSBuZXZlciBuZWVkZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2kubmV2ZXJTdXBwb3J0c1NjcmVlbigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklnbm9yaW5nIGNvbXBhdCBtb2RlIGNoYW5nZSBvZiAiICsgcGFja2FnZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgY29tcGF0aWJpbGl0eSBhbHdheXMgbmVlZGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOZWVkIHRvIGdldCBjb21wYXRpYmlsaXR5IGluZm8gaW4gbmV3IHN0YXRlLgorICAgICAgICAgICAgY2kgPSBjb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoYWkpOwogCiAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfV1JJVEUpOwogICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19XUklURSk7CiAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCAxMDAwMCk7CiAKKyAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIHN0YXJ0aW5nID0gbVNlcnZpY2UubU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CisKKyAgICAgICAgICAgIC8vIEFsbCBhY3Rpdml0aWVzIHRoYXQgY2FtZSBmcm9tIHRoZSBwYWNrYWdlIG11c3QgYmUKKyAgICAgICAgICAgIC8vIHJlc3RhcnRlZCBhcyBpZiB0aGVyZSB3YXMgYSBjb25maWcgY2hhbmdlLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tU2VydmljZS5tTWFpblN0YWNrLm1IaXN0b3J5LnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCBhID0gKEFjdGl2aXR5UmVjb3JkKW1TZXJ2aWNlLm1NYWluU3RhY2subUhpc3RvcnkuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChhLmluZm8ucGFja2FnZU5hbWUuZXF1YWxzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBhLmZvcmNlTmV3Q29uZmlnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nICE9IG51bGwgJiYgYSA9PSBzdGFydGluZyAmJiBhLnZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuc3RhcnRGcmVlemluZ1NjcmVlbkxvY2tlZChzdGFydGluZy5hcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5SW5mby5DT05GSUdfU0NSRUVOX0xBWU9VVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIFRlbGwgYWxsIHByb2Nlc3NlcyB0aGF0IGxvYWRlZCB0aGlzIHBhY2thZ2UgYWJvdXQgdGhlIGNoYW5nZS4KICAgICAgICAgICAgIGZvciAoaW50IGk9bVNlcnZpY2UubUxydVByb2Nlc3Nlcy5zaXplKCktMTsgaT49MDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgUHJvY2Vzc1JlY29yZCBhcHAgPSBtU2VydmljZS5tTHJ1UHJvY2Vzc2VzLmdldChpKTsKQEAgLTIyMSwxNiArMzMzLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEFsbCBhY3Rpdml0aWVzIHRoYXQgY2FtZSBmcm9tIHRoZSBwYWNrZ2UgbXVzdCBiZQotICAgICAgICAgICAgLy8gcmVzdGFydGVkIGFzIGlmIHRoZXJlIHdhcyBhIGNvbmZpZyBjaGFuZ2UuCi0gICAgICAgICAgICBmb3IgKGludCBpPW1TZXJ2aWNlLm1NYWluU3RhY2subUhpc3Rvcnkuc2l6ZSgpLTE7IGk+PTA7IGktLSkgewotICAgICAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIGEgPSAoQWN0aXZpdHlSZWNvcmQpbVNlcnZpY2UubU1haW5TdGFjay5tSGlzdG9yeS5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGEuaW5mby5wYWNrYWdlTmFtZS5lcXVhbHMocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGEuZm9yY2VOZXdDb25maWcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgc3RhcnRpbmcgPSBtU2VydmljZS5tTWFpblN0YWNrLnRvcFJ1bm5pbmdBY3Rpdml0eUxvY2tlZChudWxsKTsKICAgICAgICAgICAgIGlmIChzdGFydGluZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVNlcnZpY2UubU1haW5TdGFjay5lbnN1cmVBY3Rpdml0eUNvbmZpZ3VyYXRpb25Mb2NrZWQoc3RhcnRpbmcsIDApOwogICAgICAgICAgICAgICAgIC8vIEFuZCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhdCB0aGlzIHBvaW50IHRoYXQgYWxsIG90aGVyIGFjdGl2aXRpZXMKQEAgLTI0MSw5ICszNDMsOSBAQAogICAgIH0KIAogICAgIHZvaWQgc2F2ZUNvbXBhdE1vZGVzKCkgewotICAgICAgICBIYXNoU2V0PFN0cmluZz4gcGtnczsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHBrZ3M7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVNlcnZpY2UpIHsKLSAgICAgICAgICAgIHBrZ3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KG1QYWNrYWdlcyk7CisgICAgICAgICAgICBwa2dzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPihtUGFja2FnZXMpOwogICAgICAgICB9CiAKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwpAQCAtMjU4LDkgKzM2MCwxNSBAQAogCiAgICAgICAgICAgICBmaW5hbCBJUGFja2FnZU1hbmFnZXIgcG0gPSBBcHBHbG9iYWxzLmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgc2NyZWVuTGF5b3V0ID0gbVNlcnZpY2UubUNvbmZpZ3VyYXRpb24uc2NyZWVuTGF5b3V0OwotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzbWFsbGVzdFNjcmVlbldpZHRoRHAgPSBtU2VydmljZS5tQ29uZmlndXJhdGlvbi5zbWFsbGVzdFNjcmVlbldpZHRoRHA7CisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPj4gaXQgPSBwa2dzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IGVudHJ5ID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwa2cgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFpID0gbnVsbDsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBhaSA9IHBtLmdldEFwcGxpY2F0aW9uSW5mbyhwa2csIDApOwpAQCAtMjY5LDcgKzM3Nyw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGFpID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGluZm8gPSBuZXcgQ29tcGF0aWJpbGl0eUluZm8oYWksIHNjcmVlbkxheW91dCwgZmFsc2UpOworICAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGluZm8gPSBuZXcgQ29tcGF0aWJpbGl0eUluZm8oYWksIHNjcmVlbkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0U2NyZWVuV2lkdGhEcCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChpbmZvLmFsd2F5c1N1cHBvcnRzU2NyZWVuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjc4LDYgKzM4Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicGtnIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibmFtZSIsIHBrZyk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibW9kZSIsIEludGVnZXIudG9TdHJpbmcobW9kZSkpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInBrZyIpOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Qcm9jZXNzUmVjb3JkLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Qcm9jZXNzUmVjb3JkLmphdmEKaW5kZXggYmVlZjEzNi4uMzk2OGY2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vUHJvY2Vzc1JlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Byb2Nlc3NSZWNvcmQuamF2YQpAQCAtNzEsNiArNzEsNyBAQAogICAgIElCaW5kZXIgZm9yY2luZ1RvRm9yZWdyb3VuZDsvLyBUb2tlbiB0aGF0IGlzIGZvcmNpbmcgdGhpcyBwcm9jZXNzIHRvIGJlIGZvcmVncm91bmQKICAgICBpbnQgYWRqU2VxOyAgICAgICAgICAgICAgICAgLy8gU2VxdWVuY2UgaWQgZm9yIGlkZW50aWZ5aW5nIG9vbV9hZGogYXNzaWdubWVudCBjeWNsZXMKICAgICBpbnQgbHJ1U2VxOyAgICAgICAgICAgICAgICAgLy8gU2VxdWVuY2UgaWQgZm9yIGlkZW50aWZ5aW5nIExSVSB1cGRhdGUgY3ljbGVzCisgICAgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0OyAgIC8vIGxhc3QgdXNlZCBjb21wYXRpYmlsaXR5IG1vZGUKICAgICBDb21wb25lbnROYW1lIGluc3RydW1lbnRhdGlvbkNsYXNzOy8vIGNsYXNzIGluc3RhbGxlZCB0byBpbnN0cnVtZW50IGFwcAogICAgIEFwcGxpY2F0aW9uSW5mbyBpbnN0cnVtZW50YXRpb25JbmZvOyAvLyB0aGUgYXBwbGljYXRpb24gYmVpbmcgaW5zdHJ1bWVudGVkCiAgICAgU3RyaW5nIGluc3RydW1lbnRhdGlvblByb2ZpbGVGaWxlOyAvLyB3aGVyZSB0byBzYXZlIHByb2ZpbGluZwpAQCAtMTQ3LDYgKzE0OCw3IEBACiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBwdWJsaWNEaXI9Iik7IHB3LnByaW50KGluZm8ucHVibGljU291cmNlRGlyKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGRhdGE9Iik7IHB3LnByaW50bG4oaW5mby5kYXRhRGlyKTsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhY2thZ2VMaXN0PSIpOyBwdy5wcmludGxuKHBrZ0xpc3QpOworICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiY29tcGF0PSIpOyBwdy5wcmludGxuKGNvbXBhdCk7CiAgICAgICAgIGlmIChpbnN0cnVtZW50YXRpb25DbGFzcyAhPSBudWxsIHx8IGluc3RydW1lbnRhdGlvblByb2ZpbGVGaWxlICE9IG51bGwKICAgICAgICAgICAgICAgICB8fCBpbnN0cnVtZW50YXRpb25Bcmd1bWVudHMgIT0gbnVsbCkgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImluc3RydW1lbnRhdGlvbkNsYXNzPSIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVGFza1JlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVGFza1JlY29yZC5qYXZhCmluZGV4IGU4Yzg3ZTEuLmU2MWE3ZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Rhc2tSZWNvcmQuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9UYXNrUmVjb3JkLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKICAgICBsb25nIGxhc3RBY3RpdmVUaW1lOyAgICAvLyBMYXN0IHRpbWUgdGhpcyB0YXNrIHdhcyBhY3RpdmUsIGluY2x1ZGluZyBzbGVlcC4KICAgICBib29sZWFuIHJvb3RXYXNSZXNldDsgICAvLyBUcnVlIGlmIHRoZSBpbnRlbnQgYXQgdGhlIHJvb3Qgb2YgdGhlIHRhc2sgaGFkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIEZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERUQgZmxhZy4KKyAgICBib29sZWFuIGFza2VkQ29tcGF0TW9kZTsvLyBIYXZlIGFza2VkIHRoZSB1c2VyIGFib3V0IGNvbXBhdCBtb2RlIGZvciB0aGlzIHRhc2suCiAKICAgICBTdHJpbmcgc3RyaW5nTmFtZTsgICAgICAvLyBjYWNoaW5nIG9mIHRvU3RyaW5nKCkgcmVzdWx0LgogICAgIApAQCAtMTEyLDYgKzExMyw5IEBACiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgicmVhbEFjdGl2aXR5PSIpOwogICAgICAgICAgICAgcHcucHJpbnRsbihyZWFsQWN0aXZpdHkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCFhc2tlZENvbXBhdE1vZGUpIHsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJhc2tlZENvbXBhdE1vZGU9Iik7IHB3LnByaW50bG4oYXNrZWRDb21wYXRNb2RlKTsKKyAgICAgICAgfQogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibGFzdEFjdGl2ZVRpbWU9Iik7IHB3LnByaW50KGxhc3RBY3RpdmVUaW1lKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIChpbmFjdGl2ZSBmb3IgIik7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoKGdldEluYWN0aXZlRHVyYXRpb24oKS8xMDAwKSk7IHB3LnByaW50bG4oInMpIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEKaW5kZXggZTgxNTViNC4uN2VhMDU5MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YQpAQCAtMTIxMiw4ICsxMjEyLDggQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaWZhY2UgOiBpZmFjZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcmVnZXggOiBtVXBzdHJlYW1JZmFjZVJlZ2V4cykgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHJlZ2V4IDogbVVwc3RyZWFtSWZhY2VSZWdleHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaWZhY2UgOiBpZmFjZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmFjZS5tYXRjaGVzKHJlZ2V4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBpdCBpcyBhY3RpdmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VDb25maWd1cmF0aW9uIGlmY2cgPSBudWxsOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbmV0L05ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbmV0L05ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGQwODNkMDEuLjE3YzcxNjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25ldC9OZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9uZXQvTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE2LDExICsxNiwxNSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5uZXQ7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVA7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfQVBQX1RPS0VOUzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlVQREFURV9ERVZJQ0VfU1RBVFM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLlBPTElDWV9OT05FOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5QT0xJQ1lfUkVKRUNUX0JBQ0tHUk9VTkQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLlBPTElDWV9SRUpFQ1RfUEFJRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuUE9MSUNZX1JFSkVDVF9QQUlEX0JBQ0tHUk9VTkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLlJVTEVfQUxMT1dfQUxMOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5SVUxFX1JFSkVDVF9QQUlEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5kdW1wUG9saWN5OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5kdW1wUnVsZXM7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLklQcm9jZXNzT2JzZXJ2ZXI7CkBAIC0yOCw1MSArMzIsNzMgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5JTmV0d29ya1BvbGljeUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5JTmV0d29ya1N0YXRzU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLm9zLklQb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVDYWxsYmFja0xpc3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKIC8qKgogICogU2VydmljZSB0aGF0IG1haW50YWlucyBsb3ctbGV2ZWwgbmV0d29yayBwb2xpY3kgcnVsZXMgYW5kIGNvbGxlY3RzIHVzYWdlCiAgKiBzdGF0aXN0aWNzIHRvIGRyaXZlIHRob3NlIHJ1bGVzLgorICogPHA+CisgKiBEZXJpdmVzIGFjdGl2ZSBydWxlcyBieSBjb21iaW5pbmcgYSBnaXZlbiBwb2xpY3kgd2l0aCBvdGhlciBzeXN0ZW0gc3RhdHVzLAorICogYW5kIGRlbGl2ZXJzIHRvIGxpc3RlbmVycywgc3VjaCBhcyB7QGxpbmsgQ29ubmVjdGl2aXR5TWFuYWdlcn0sIGZvcgorICogZW5mb3JjZW1lbnQuCiAgKi8KIHB1YmxpYyBjbGFzcyBOZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2UgZXh0ZW5kcyBJTmV0d29ya1BvbGljeU1hbmFnZXIuU3R1YiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrUG9saWN5IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR0QgPSB0cnVlOwogCi0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgSUFjdGl2aXR5TWFuYWdlciBtQWN0aXZpdHlNYW5hZ2VyOwotICAgIHByaXZhdGUgSVBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIElBY3Rpdml0eU1hbmFnZXIgbUFjdGl2aXR5TWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIElQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIElOZXR3b3JrU3RhdHNTZXJ2aWNlIG1OZXR3b3JrU3RhdHM7CiAKLSAgICBwcml2YXRlIE9iamVjdCBtUnVsZXNMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1SdWxlc0xvY2sgPSBuZXcgT2JqZWN0KCk7CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNjcmVlbk9uID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TY3JlZW5PbjsKIAogICAgIC8qKiBDdXJyZW50IG5ldHdvcmsgcG9saWN5IGZvciBlYWNoIFVJRC4gKi8KICAgICBwcml2YXRlIFNwYXJzZUludEFycmF5IG1VaWRQb2xpY3kgPSBuZXcgU3BhcnNlSW50QXJyYXkoKTsKKyAgICAvKiogQ3VycmVudCBkZXJpdmVkIG5ldHdvcmsgcnVsZXMgZm9yIGVhY2ggVUlELiAqLworICAgIHByaXZhdGUgU3BhcnNlSW50QXJyYXkgbVVpZFJ1bGVzID0gbmV3IFNwYXJzZUludEFycmF5KCk7CiAKICAgICAvKiogRm9yZWdyb3VuZCBhdCBib3RoIFVJRCBhbmQgUElEIGdyYW51bGFyaXR5LiAqLwogICAgIHByaXZhdGUgU3BhcnNlQm9vbGVhbkFycmF5IG1VaWRGb3JlZ3JvdW5kID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOwogICAgIHByaXZhdGUgU3BhcnNlQXJyYXk8U3BhcnNlQm9vbGVhbkFycmF5PiBtVWlkUGlkRm9yZWdyb3VuZCA9IG5ldyBTcGFyc2VBcnJheTwKICAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheT4oKTsKIAotICAgIC8vIFRPRE86IHBlcmlvZGljYWxseSBwb2xsIG5ldHdvcmsgc3RhdHMgYW5kIHdyaXRlIHRvIGRpc2sKKyAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNhbGxiYWNrTGlzdDxJTmV0d29ya1BvbGljeUxpc3RlbmVyPiBtTGlzdGVuZXJzID0gbmV3IFJlbW90ZUNhbGxiYWNrTGlzdDwKKyAgICAgICAgICAgIElOZXR3b3JrUG9saWN5TGlzdGVuZXI+KCk7CisKICAgICAvLyBUT0RPOiBzYXZlL3Jlc3RvcmUgcG9saWN5IGluZm9ybWF0aW9uIGZyb20gZGlzawogCi0gICAgcHVibGljIE5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZSgKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgSUFjdGl2aXR5TWFuYWdlciBhY3Rpdml0eU1hbmFnZXIsIElQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyKSB7CisgICAgLy8gVE9ETzoga2VlcCB3aGl0ZWxpc3Qgb2Ygc3lzdGVtLWNyaXRpY2FsIHNlcnZpY2VzIHRoYXQgc2hvdWxkIG5ldmVyIGhhdmUKKyAgICAvLyBydWxlcyBlbmZvcmNlZCwgc3VjaCBhcyBzeXN0ZW0sIHBob25lLCBhbmQgcmFkaW8gVUlEcy4KKworICAgIC8vIFRPRE86IGtlZXAgcmVjb3JkIG9mIGJpbGxpbmcgY3ljbGUgZGV0YWlscywgYW5kIGxpbWl0IHJ1bGVzCisgICAgLy8gVE9ETzoga2VlcCBtYXAgb2YgaW50ZXJmYWNlcy10by1iaWxsaW5nLXJlbGF0aW9uc2hpcAorCisgICAgcHVibGljIE5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZShDb250ZXh0IGNvbnRleHQsIElBY3Rpdml0eU1hbmFnZXIgYWN0aXZpdHlNYW5hZ2VyLAorICAgICAgICAgICAgSVBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIsIElOZXR3b3JrU3RhdHNTZXJ2aWNlIG5ldHdvcmtTdGF0cykgewogICAgICAgICBtQ29udGV4dCA9IGNoZWNrTm90TnVsbChjb250ZXh0LCAibWlzc2luZyBjb250ZXh0Iik7CiAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIgPSBjaGVja05vdE51bGwoYWN0aXZpdHlNYW5hZ2VyLCAibWlzc2luZyBhY3Rpdml0eU1hbmFnZXIiKTsKICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGNoZWNrTm90TnVsbChwb3dlck1hbmFnZXIsICJtaXNzaW5nIHBvd2VyTWFuYWdlciIpOworICAgICAgICBtTmV0d29ya1N0YXRzID0gY2hlY2tOb3ROdWxsKG5ldHdvcmtTdGF0cywgIm1pc3NpbmcgbmV0d29ya1N0YXRzIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7Ci0gICAgICAgIC8vIFRPRE86IHJlYWQgY3VycmVudCBwb2xpY3krc3RhdHMgZnJvbSBkaXNrIGFuZCBnZW5lcmF0ZSBOTVMgcnVsZXMKKyAgICAgICAgLy8gVE9ETzogcmVhZCBjdXJyZW50IHBvbGljeSBmcm9tIGRpc2sKIAogICAgICAgICB1cGRhdGVTY3JlZW5PbigpOwogCkBAIC05MiwxOCArMTE4LDEzIEBACiAgICAgICAgIHNjcmVlbkZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU2NyZWVuUmVjZWl2ZXIsIHNjcmVlbkZpbHRlcik7CiAKLSAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIHNodXRkb3duRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBzaHV0ZG93bkZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TSFVURE9XTik7Ci0gICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVNodXRkb3duUmVjZWl2ZXIsIHNodXRkb3duRmlsdGVyKTsKLQogICAgIH0KIAogICAgIHByaXZhdGUgSVByb2Nlc3NPYnNlcnZlciBtUHJvY2Vzc09ic2VydmVyID0gbmV3IElQcm9jZXNzT2JzZXJ2ZXIuU3R1YigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKGludCBwaWQsIGludCB1aWQsIGJvb2xlYW4gZm9yZWdyb3VuZEFjdGl2aXRpZXMpIHsKICAgICAgICAgICAgIC8vIG9ubHkgc29tZW9uZSBsaWtlIEFNUyBzaG91bGQgb25seSBiZSBjYWxsaW5nIHVzCi0gICAgICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIE1BTkFHRV9BUFBfVE9LRU5TLCAicmVxdWlyZXMgTUFOQUdFX0FQUF9UT0tFTlMgcGVybWlzc2lvbiIpOworICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1BTkFHRV9BUFBfVE9LRU5TLCBUQUcpOwogCiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGEgdWlkIGNhbiBoYXZlIG11bHRpcGxlIHBpZHMgcnVubmluZyBpbnNpZGUsIHdlIG5lZWQgdG8KQEAgLTEyMyw4ICsxNDQsNyBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9jZXNzRGllZChpbnQgcGlkLCBpbnQgdWlkKSB7CiAgICAgICAgICAgICAvLyBvbmx5IHNvbWVvbmUgbGlrZSBBTVMgc2hvdWxkIG9ubHkgYmUgY2FsbGluZyB1cwotICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBNQU5BR0VfQVBQX1RPS0VOUywgInJlcXVpcmVzIE1BTkFHRV9BUFBfVE9LRU5TIHBlcm1pc3Npb24iKTsKKyAgICAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNQU5BR0VfQVBQX1RPS0VOUywgVEFHKTsKIAogICAgICAgICAgICAgc3luY2hyb25pemVkIChtUnVsZXNMb2NrKSB7CiAgICAgICAgICAgICAgICAgLy8gY2xlYXIgcmVjb3JkcyBhbmQgcmVjb21wdXRlLCB3aGVuIHRoZXkgZXhpc3QKQEAgLTE0OCwyMiArMTY4LDE5IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtU2h1dGRvd25SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHBlcnNpc3QgYW55IHBlbmRpbmcgc3RhdHMgZHVyaW5nIGNsZWFuIHNodXRkb3duCi0gICAgICAgICAgICBMb2cuZChUQUcsICJwZXJzaXN0aW5nIHN0YXRzIik7Ci0gICAgICAgIH0KLSAgICB9OwotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VWlkUG9saWN5KGludCB1aWQsIGludCBwb2xpY3kpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAotICAgICAgICAgICAgICAgIFVQREFURV9ERVZJQ0VfU1RBVFMsICJyZXF1aXJlcyBVUERBVEVfREVWSUNFX1NUQVRTIHBlcm1pc3Npb24iKTsKKyAgICAgICAgLy8gVE9ETzogY3JlYXRlIHBlcm1pc3Npb24gZm9yIG1vZGlmeWluZyBkYXRhIHBvbGljeQorICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oVVBEQVRFX0RFVklDRV9TVEFUUywgVEFHKTsKIAorICAgICAgICBmaW5hbCBpbnQgb2xkUG9saWN5OwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKKyAgICAgICAgICAgIG9sZFBvbGljeSA9IGdldFVpZFBvbGljeSh1aWQpOwogICAgICAgICAgICAgbVVpZFBvbGljeS5wdXQodWlkLCBwb2xpY3kpOworICAgICAgICAgICAgdXBkYXRlUnVsZXNGb3JVaWRMKHVpZCk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBkaXNwYXRjaGluZyBCQUNLR1JPVU5EX0RBVEFfU0VUVElORyBicm9hZGNhc3QKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE3Myw2ICsxOTAsODYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSU5ldHdvcmtQb2xpY3lMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXJzLnJlZ2lzdGVyKGxpc3RlbmVyKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKKyAgICAgICAgICAgIC8vIGRpc3BhdGNoIGFueSBleGlzdGluZyBydWxlcyB0byBuZXcgbGlzdGVuZXJzCisgICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG1VaWRSdWxlcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSBtVWlkUnVsZXMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHVpZFJ1bGVzID0gbVVpZFJ1bGVzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHVpZFJ1bGVzICE9IFJVTEVfQUxMT1dfQUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblJ1bGVzQ2hhbmdlZCh1aWQsIHVpZFJ1bGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJTmV0d29ya1BvbGljeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1MaXN0ZW5lcnMudW5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgZm91dCwgU3RyaW5nW10gYXJncykgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oRFVNUCwgVEFHKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKKyAgICAgICAgICAgIGZvdXQucHJpbnRsbigiUG9saWN5IHN0YXR1cyBmb3Iga25vd24gVUlEczoiKTsKKworICAgICAgICAgICAgZmluYWwgU3BhcnNlQm9vbGVhbkFycmF5IGtub3duVWlkcyA9IG5ldyBTcGFyc2VCb29sZWFuQXJyYXkoKTsKKyAgICAgICAgICAgIGNvbGxlY3RLZXlzKG1VaWRQb2xpY3ksIGtub3duVWlkcyk7CisgICAgICAgICAgICBjb2xsZWN0S2V5cyhtVWlkRm9yZWdyb3VuZCwga25vd25VaWRzKTsKKyAgICAgICAgICAgIGNvbGxlY3RLZXlzKG1VaWRSdWxlcywga25vd25VaWRzKTsKKworICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBrbm93blVpZHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0ga25vd25VaWRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIGZvdXQucHJpbnQoIiAgVUlEPSIpOworICAgICAgICAgICAgICAgIGZvdXQucHJpbnQodWlkKTsKKworICAgICAgICAgICAgICAgIGZvdXQucHJpbnQoIiBwb2xpY3k9Iik7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvbGljeUluZGV4ID0gbVVpZFBvbGljeS5pbmRleE9mS2V5KHVpZCk7CisgICAgICAgICAgICAgICAgaWYgKHBvbGljeUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBmb3V0LnByaW50KCJVTktOT1dOIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFBvbGljeShmb3V0LCBtVWlkUG9saWN5LnZhbHVlQXQocG9saWN5SW5kZXgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3V0LnByaW50KCIgZm9yZWdyb3VuZD0iKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZm9yZWdyb3VuZEluZGV4ID0gbVVpZFBpZEZvcmVncm91bmQuaW5kZXhPZktleSh1aWQpOworICAgICAgICAgICAgICAgIGlmIChmb3JlZ3JvdW5kSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdXQucHJpbnQoIlVOS05PV04iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkdW1wU3BhcnNlQm9vbGVhbkFycmF5KGZvdXQsIG1VaWRQaWRGb3JlZ3JvdW5kLnZhbHVlQXQoZm9yZWdyb3VuZEluZGV4KSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm91dC5wcmludCgiIHJ1bGVzPSIpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBydWxlc0luZGV4ID0gbVVpZFJ1bGVzLmluZGV4T2ZLZXkodWlkKTsKKyAgICAgICAgICAgICAgICBpZiAocnVsZXNJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm91dC5wcmludCgiVU5LTk9XTiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGR1bXBSdWxlcyhmb3V0LCBtVWlkUnVsZXMudmFsdWVBdChydWxlc0luZGV4KSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VpZEZvcmVncm91bmQoaW50IHVpZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKKyAgICAgICAgICAgIC8vIG9ubHkgcmVhbGx5IGluIGZvcmVncm91bmQgd2hlbiBzY3JlZW4gaXMgYWxzbyBvbgorICAgICAgICAgICAgcmV0dXJuIG1VaWRGb3JlZ3JvdW5kLmdldCh1aWQsIGZhbHNlKSAmJiBtU2NyZWVuT247CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBGb3JlZ3JvdW5kIGZvciBQSUQgY2hhbmdlZDsgcmVjb21wdXRlIGZvcmVncm91bmQgYXQgVUlEIGxldmVsLiBJZgogICAgICAqIGNoYW5nZWQsIHdpbGwgdHJpZ2dlciB7QGxpbmsgI3VwZGF0ZVJ1bGVzRm9yVWlkTChpbnQpfS4KQEAgLTIyMywyMiArMzIwLDMzIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bGVzRm9yVWlkTChpbnQgdWlkKSB7Ci0gICAgICAgIC8vIG9ubHkgcmVhbGx5IGluIGZvcmVncm91bmQgd2hlbiBzY3JlZW4gb24KLSAgICAgICAgZmluYWwgYm9vbGVhbiB1aWRGb3JlZ3JvdW5kID0gbVVpZEZvcmVncm91bmQuZ2V0KHVpZCwgZmFsc2UpICYmIG1TY3JlZW5PbjsKICAgICAgICAgZmluYWwgaW50IHVpZFBvbGljeSA9IGdldFVpZFBvbGljeSh1aWQpOworICAgICAgICBmaW5hbCBib29sZWFuIHVpZEZvcmVncm91bmQgPSBpc1VpZEZvcmVncm91bmQodWlkKTsKIAotICAgICAgICBpZiAoTE9HRCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlUnVsZXNGb3JVaWQodWlkPSIgKyB1aWQgKyAiKSBmb3VuZCBmb3JlZ3JvdW5kPSIgKyB1aWRGb3JlZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbmQgcG9saWN5PSIgKyB1aWRQb2xpY3kpOworICAgICAgICAvLyBkZXJpdmUgYWN0aXZlIHJ1bGVzIGJhc2VkIG9uIHBvbGljeSBhbmQgYWN0aXZlIHN0YXRlCisgICAgICAgIGludCB1aWRSdWxlcyA9IFJVTEVfQUxMT1dfQUxMOworICAgICAgICBpZiAoIXVpZEZvcmVncm91bmQgJiYgKHVpZFBvbGljeSAmIFBPTElDWV9SRUpFQ1RfUEFJRF9CQUNLR1JPVU5EKSAhPSAwKSB7CisgICAgICAgICAgICAvLyB1aWQgaW4gYmFja2dyb3VuZCwgYW5kIHBvbGljeSBzYXlzIHRvIGJsb2NrIHBhaWQgZGF0YQorICAgICAgICAgICAgdWlkUnVsZXMgPSBSVUxFX1JFSkVDVF9QQUlEOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCF1aWRGb3JlZ3JvdW5kICYmICh1aWRQb2xpY3kgJiBQT0xJQ1lfUkVKRUNUX0JBQ0tHUk9VTkQpICE9IDApIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGJ1aWxkIHVwZGF0ZWQgcnVsZXMgYW5kIHB1c2ggdG8gTk1TCi0gICAgICAgIH0gZWxzZSBpZiAoKHVpZFBvbGljeSAmIFBPTElDWV9SRUpFQ1RfUEFJRCkgIT0gMCkgewotICAgICAgICAgICAgLy8gVE9ETzogYnVpbGQgdXBkYXRlZCBydWxlcyBhbmQgcHVzaCB0byBOTVMKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGJ1aWxkIHVwZGF0ZWQgcnVsZXMgYW5kIHB1c2ggdG8gTk1TCisgICAgICAgIC8vIFRPRE86IG9ubHkgZGlzcGF0Y2ggd2hlbiBydWxlcyBhY3R1YWxseSBjaGFuZ2UKKworICAgICAgICAvLyByZWNvcmQgcnVsZSBsb2NhbGx5IHRvIGRpc3BhdGNoIHRvIG5ldyBsaXN0ZW5lcnMKKyAgICAgICAgbVVpZFJ1bGVzLnB1dCh1aWQsIHVpZFJ1bGVzKTsKKworICAgICAgICAvLyBkaXNwYXRjaCBjaGFuZ2VkIHJ1bGUgdG8gZXhpc3RpbmcgbGlzdGVuZXJzCisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBtTGlzdGVuZXJzLmJlZ2luQnJvYWRjYXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIElOZXR3b3JrUG9saWN5TGlzdGVuZXIgbGlzdGVuZXIgPSBtTGlzdGVuZXJzLmdldEJyb2FkY2FzdEl0ZW0oaSk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uUnVsZXNDaGFuZ2VkKHVpZCwgdWlkUnVsZXMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lcnMuZmluaXNoQnJvYWRjYXN0KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgY2hlY2tOb3ROdWxsKFQgdmFsdWUsIFN0cmluZyBtZXNzYWdlKSB7CkBAIC0yNDcsNCArMzU1LDI4IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdEtleXMoU3BhcnNlSW50QXJyYXkgc291cmNlLCBTcGFyc2VCb29sZWFuQXJyYXkgdGFyZ2V0KSB7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gc291cmNlLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHRhcmdldC5wdXQoc291cmNlLmtleUF0KGkpLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdEtleXMoU3BhcnNlQm9vbGVhbkFycmF5IHNvdXJjZSwgU3BhcnNlQm9vbGVhbkFycmF5IHRhcmdldCkgeworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHNvdXJjZS5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICB0YXJnZXQucHV0KHNvdXJjZS5rZXlBdChpKSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXBTcGFyc2VCb29sZWFuQXJyYXkoUHJpbnRXcml0ZXIgZm91dCwgU3BhcnNlQm9vbGVhbkFycmF5IHZhbHVlKSB7CisgICAgICAgIGZvdXQucHJpbnQoIlsiKTsKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSB2YWx1ZS5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmb3V0LnByaW50KHZhbHVlLmtleUF0KGkpICsgIj0iICsgdmFsdWUudmFsdWVBdChpKSk7CisgICAgICAgICAgICBpZiAoaSA8IHNpemUgLSAxKSBmb3V0LnByaW50KCIsIik7CisgICAgICAgIH0KKyAgICAgICAgZm91dC5wcmludCgiXSIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25ldC9OZXR3b3JrU3RhdHNTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9uZXQvTmV0d29ya1N0YXRzU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzFmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9uZXQvTmV0d29ya1N0YXRzU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0hVVERPV047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5VUERBVEVfREVWSUNFX1NUQVRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzLlVJRF9BTEw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuSUFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtTdGF0c1NlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0c0hpc3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLk50cFRydXN0ZWRUaW1lOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5UcnVzdGVkVGltZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOworCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIENvbGxlY3QgYW5kIHBlcnNpc3QgZGV0YWlsZWQgbmV0d29yayBzdGF0aXN0aWNzLCBhbmQgcHJvdmlkZSB0aGlzIGRhdGEgdG8KKyAqIG90aGVyIHN5c3RlbSBzZXJ2aWNlcy4KKyAqLworcHVibGljIGNsYXNzIE5ldHdvcmtTdGF0c1NlcnZpY2UgZXh0ZW5kcyBJTmV0d29ya1N0YXRzU2VydmljZS5TdHViIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5ldHdvcmtTdGF0c1NlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HRCA9IHRydWU7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG1OZXR3b3JrTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIElBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFRydXN0ZWRUaW1lIG1UaW1lOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5hY3Rpb24uTkVUV09SS19TVEFUU19QT0xMIjsKKworICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtUG9sbEludGVudDsKKworICAgIC8vIFRPRE86IG1vdmUgdHdlYWthYmxlIHBhcmFtcyB0byBTZXR0aW5ncy5TZWN1cmUKKyAgICAvLyBUT0RPOiBsaXN0ZW4gZm9yIGtlcm5lbCBwdXNoIGV2ZW50cyB0aHJvdWdoIG5ldGQgaW5zdGVhZCBvZiBwb2xsaW5nCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEtCX0lOX0JZVEVTID0gMTAyNDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUE9MTF9JTlRFUlZBTCA9IEFsYXJtTWFuYWdlci5JTlRFUlZBTF9GSUZURUVOX01JTlVURVM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTVU1NQVJZX0JVQ0tFVF9EVVJBVElPTiA9IDYgKiBEYXRlVXRpbHMuSE9VUl9JTl9NSUxMSVM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTVU1NQVJZX01BWF9ISVNUT1JZID0gOTAgKiBEYXRlVXRpbHMuREFZX0lOX01JTExJUzsKKworICAgIC8vIFRPRE86IHJlbW92ZSB0aGVzZSBoaWdoLWZyZXF1ZW5jeSB0ZXN0aW5nIHZhbHVlcworLy8gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQT0xMX0lOVEVSVkFMID0gNSAqIERhdGVVdGlscy5TRUNPTkRfSU5fTUlMTElTOworLy8gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTVU1NQVJZX0JVQ0tFVF9EVVJBVElPTiA9IDEwICogRGF0ZVV0aWxzLlNFQ09ORF9JTl9NSUxMSVM7CisvLyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNVTU1BUllfTUFYX0hJU1RPUlkgPSAyICogRGF0ZVV0aWxzLk1JTlVURV9JTl9NSUxMSVM7CisKKyAgICAvKiogTWluaW11bSBkZWx0YSByZXF1aXJlZCB0byBwZXJzaXN0IHRvIGRpc2suICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTVU1NQVJZX1BFUlNJU1RfVEhSRVNIT0xEID0gNjQgKiBLQl9JTl9CWVRFUzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRV9DQUNIRV9NQVhfQUdFID0gRGF0ZVV0aWxzLkRBWV9JTl9NSUxMSVM7CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtU3RhdHNMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqIFNldCBvZiBhY3RpdmUgaWZhY2VzIGR1cmluZyB0aGlzIGJvb3QuICovCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgSW50ZXJmYWNlSW5mbz4gbUFjdGl2ZUlmYWNlID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgLyoqIFNldCBvZiBoaXN0b3JpY2FsIHN0YXRzIGZvciBrbm93biBpZmFjZXMuICovCisgICAgcHJpdmF0ZSBIYXNoTWFwPEludGVyZmFjZUluZm8sIE5ldHdvcmtTdGF0c0hpc3Rvcnk+IG1JZmFjZVN0YXRzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0cyBtTGFzdFBvbGxTdGF0czsKKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0cyBtTGFzdFBlcnNpc3RTdGF0czsKKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlclRocmVhZCBtSGFuZGxlclRocmVhZDsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CisKKyAgICAvLyBUT0RPOiBjb2xsZWN0IGRldGFpbGVkIHVpZCBzdGF0cywgc3RvcmluZyB0YWctZ3JhbnVsYXJpdHkgZGF0YSB1bnRpbCBuZXh0CisgICAgLy8gZHJvcGJveCwgYW5kIHVpZCBzdW1tYXJ5IGZvciBhIHNwZWNpZmljIGJ1Y2tldCBjb3VudC4KKworICAgIC8vIFRPRE86IHBlcmlvZGljYWxseSBjb21waWxlIHN0YXRpc3RpY3MgYW5kIHNlbmQgdG8gZHJvcGJveC4KKworICAgIHB1YmxpYyBOZXR3b3JrU3RhdHNTZXJ2aWNlKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG5ldHdvcmtNYW5hZ2VyLCBJQWxhcm1NYW5hZ2VyIGFsYXJtTWFuYWdlcikgeworICAgICAgICAvLyBUT0RPOiBtb3ZlIHRvIHVzaW5nIGNhY2hlZCBOdHBUcnVzdGVkVGltZQorICAgICAgICB0aGlzKGNvbnRleHQsIG5ldHdvcmtNYW5hZ2VyLCBhbGFybU1hbmFnZXIsIG5ldyBOdHBUcnVzdGVkVGltZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV0d29ya1N0YXRzU2VydmljZShDb250ZXh0IGNvbnRleHQsIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UgbmV0d29ya01hbmFnZXIsCisgICAgICAgICAgICBJQWxhcm1NYW5hZ2VyIGFsYXJtTWFuYWdlciwgVHJ1c3RlZFRpbWUgdGltZSkgeworICAgICAgICBtQ29udGV4dCA9IGNoZWNrTm90TnVsbChjb250ZXh0LCAibWlzc2luZyBDb250ZXh0Iik7CisgICAgICAgIG1OZXR3b3JrTWFuYWdlciA9IGNoZWNrTm90TnVsbChuZXR3b3JrTWFuYWdlciwgIm1pc3NpbmcgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSIpOworICAgICAgICBtQWxhcm1NYW5hZ2VyID0gY2hlY2tOb3ROdWxsKGFsYXJtTWFuYWdlciwgIm1pc3NpbmcgSUFsYXJtTWFuYWdlciIpOworICAgICAgICBtVGltZSA9IGNoZWNrTm90TnVsbCh0aW1lLCAibWlzc2luZyBUcnVzdGVkVGltZSIpOworCisgICAgICAgIG1IYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoVEFHKTsKKyAgICAgICAgbUhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihtSGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIC8vIHJlYWQgaGlzdG9yaWNhbCBzdGF0cyBmcm9tIGRpc2sKKyAgICAgICAgcmVhZFN0YXRzTG9ja2VkKCk7CisKKyAgICAgICAgLy8gd2F0Y2ggb3RoZXIgc3lzdGVtIHNlcnZpY2VzIHRoYXQgY2xhaW0gaW50ZXJmYWNlcworICAgICAgICAvLyBUT0RPOiBwcm90ZWN0IGluY29taW5nIGJyb2FkY2FzdCB3aXRoIHBlcm1pc3Npb25zIGNoZWNrLgorICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBtaWdyYXRpbmcgdGhpcyB0byBDb25uZWN0aXZpdHlTZXJ2aWNlLCBidXQgaXQgbWlnaHQKKyAgICAgICAgLy8gY2F1c2UgYSBjaXJjdWxhciBkZXBlbmRlbmN5LgorICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgaW50ZXJmYWNlRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBpbnRlcmZhY2VGaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVyZmFjZUZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUludGVyZmFjZVJlY2VpdmVyLCBpbnRlcmZhY2VGaWx0ZXIpOworCisgICAgICAgIC8vIGxpc3RlbiBmb3IgcGVyaW9kaWMgcG9sbGluZyBldmVudHMKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIHBvbGxGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Qb2xsUmVjZWl2ZXIsIHBvbGxGaWx0ZXIsIFVQREFURV9ERVZJQ0VfU1RBVFMsIG1IYW5kbGVyKTsKKworICAgICAgICAvLyBwZXJzaXN0IHN0YXRzIGR1cmluZyBjbGVhbiBzaHV0ZG93bgorICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgc2h1dGRvd25GaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fU0hVVERPV04pOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TaHV0ZG93blJlY2VpdmVyLCBzaHV0ZG93bkZpbHRlciwgU0hVVERPV04sIG51bGwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWdpc3RlclBvbGxBbGFybUxvY2tlZCgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy53KFRBRywgInVuYWJsZSB0byByZWdpc3RlciBwb2xsIGFsYXJtIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbnkgZXhpc3Rpbmcge0BsaW5rICNBQ1RJT05fTkVUV09SS19TVEFUU19QT0xMfSBhbGFybXMsIGFuZAorICAgICAqIHJlc2NoZWR1bGUgYmFzZWQgb24gY3VycmVudCB7QGxpbmsgI1BPTExfSU5URVJWQUx9IHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclBvbGxBbGFybUxvY2tlZCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpZiAobVBvbGxJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5yZW1vdmUobVBvbGxJbnRlbnQpOworICAgICAgICB9CisKKyAgICAgICAgbVBvbGxJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICBtQ29udGV4dCwgMCwgbmV3IEludGVudChBQ1RJT05fTkVUV09SS19TVEFUU19QT0xMKSwgMCk7CisKKyAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50UmVhbHRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKyAgICAgICAgbUFsYXJtTWFuYWdlci5zZXRJbmV4YWN0UmVwZWF0aW5nKAorICAgICAgICAgICAgICAgIEFsYXJtTWFuYWdlci5FTEFQU0VEX1JFQUxUSU1FLCBjdXJyZW50UmVhbHRpbWUsIFBPTExfSU5URVJWQUwsIG1Qb2xsSW50ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTmV0d29ya1N0YXRzSGlzdG9yeVtdIGdldE5ldHdvcmtTdGF0c1N1bW1hcnkoaW50IG5ldHdvcmtUeXBlKSB7CisgICAgICAgIC8vIFRPRE86IHJldHVybiBoaXN0b3J5IGZvciByZXF1ZXN0ZWQgdHlwZXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5ldHdvcmtTdGF0c0hpc3RvcnkgZ2V0TmV0d29ya1N0YXRzVWlkKGludCB1aWQpIHsKKyAgICAgICAgLy8gVE9ETzogcmV0dXJuIGhpc3RvcnkgZm9yIHJlcXVlc3RlZCB1aWQKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjZWl2ZXIgdGhhdCB3YXRjaGVzIGZvciBvdGhlciBzeXN0ZW0gY29tcG9uZW50cyB0aGF0IGNsYWltIG5ldHdvcmsKKyAgICAgKiBpbnRlcmZhY2VzLiBVc2VkIHRvIGFzc29jaWF0ZSB7QGxpbmsgVGVsZXBob255TWFuYWdlciNnZXRTdWJzY3JpYmVySWQoKX0KKyAgICAgKiB3aXRoIG1vYmlsZSBpbnRlcmZhY2VzLgorICAgICAqLworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUludGVyZmFjZVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaW5rUHJvcGVydGllcyBwcm9wID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFBob25lLkRBVEFfTElOS19QUk9QRVJUSUVTX0tFWSk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlmYWNlID0gcHJvcCAhPSBudWxsID8gcHJvcC5nZXRJbnRlcmZhY2VOYW1lKCkgOiBudWxsOworICAgICAgICAgICAgICAgIGlmIChpZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlbGVwaG9ueU1hbmFnZXIgdGVsZU1hbmFnZXIgPSAoVGVsZXBob255TWFuYWdlcikgY29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlcmZhY2VJbmZvIGluZm8gPSBuZXcgSW50ZXJmYWNlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZSwgVFlQRV9NT0JJTEUsIHRlbGVNYW5hZ2VyLmdldFN1YnNjcmliZXJJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0QWN0aXZlSW50ZXJmYWNlKGluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTi5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIExpbmtQcm9wZXJ0aWVzIHByb3AgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTElOS19QUk9QRVJUSUVTKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWZhY2UgPSBwcm9wICE9IG51bGwgPyBwcm9wLmdldEludGVyZmFjZU5hbWUoKSA6IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZXJmYWNlSW5mbyBpbmZvID0gbmV3IEludGVyZmFjZUluZm8oaWZhY2UsIFRZUEVfV0lGSSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydEFjdGl2ZUludGVyZmFjZShpbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtUG9sbFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgLy8gYWxyZWFkeSBydW5uaW5nIG9uIGJhY2tncm91bmQgaGFuZGxlciwgbmV0d29yay9pbyBpcyBzYWZlLCBhbmQKKyAgICAgICAgICAgIC8vIGNhbGxlciB2ZXJpZmllZCB0byBoYXZlIFVQREFURV9ERVZJQ0VfU1RBVFMgcGVybWlzc2lvbiBhYm92ZS4KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRzTG9jaykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGFjcXVpcmUgd2FrZWxvY2sgd2hpbGUgcGVyZm9ybWluZyBwb2xsCisgICAgICAgICAgICAgICAgcGVyZm9ybVBvbGxMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1TaHV0ZG93blJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgLy8gcGVyc2lzdCBzdGF0cyBkdXJpbmcgY2xlYW4gc2h1dGRvd24KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRzTG9jaykgeworICAgICAgICAgICAgICAgIHdyaXRlU3RhdHNMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgcGVyZm9ybVBvbGxMb2NrZWQoKSB7CisgICAgICAgIGlmIChMT0dEKSBTbG9nLnYoVEFHLCAicGVyZm9ybVBvbGxMb2NrZWQoKSIpOworCisgICAgICAgIC8vIHRyeSByZWZyZXNoaW5nIHRpbWUgc291cmNlIHdoZW4gc3RhbGUKKyAgICAgICAgaWYgKG1UaW1lLmdldENhY2hlQWdlKCkgPiBUSU1FX0NBQ0hFX01BWF9BR0UpIHsKKyAgICAgICAgICAgIG1UaW1lLmZvcmNlUmVmcmVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgbWFya2luZyAidW50cnVzdGVkIiB0aW1lcyBpbiBoaXN0b3JpY2FsIHN0YXRzCisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBtVGltZS5oYXNDYWNoZSgpID8gbVRpbWUuY3VycmVudFRpbWVNaWxsaXMoKQorICAgICAgICAgICAgICAgIDogU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIGN1cnJlbnQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdXJyZW50ID0gbU5ldHdvcmtNYW5hZ2VyLmdldE5ldHdvcmtTdGF0c1N1bW1hcnkoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJwcm9ibGVtIHJlYWRpbmcgbmV0d29yayBzdGF0cyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIGhpc3RvcmljYWwgdXNhZ2Ugd2l0aCBkZWx0YSBzaW5jZSBsYXN0IHBvbGwKKyAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHBvbGxEZWx0YSA9IGNvbXB1dGVTdGF0c0RlbHRhKG1MYXN0UG9sbFN0YXRzLCBjdXJyZW50KTsKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lU3RhcnQgPSBjdXJyZW50VGltZSAtIHBvbGxEZWx0YS5lbGFwc2VkUmVhbHRpbWU7CisgICAgICAgIGZvciAoU3RyaW5nIGlmYWNlIDogcG9sbERlbHRhLmdldEtub3duSWZhY2VzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEludGVyZmFjZUluZm8gaW5mbyA9IG1BY3RpdmVJZmFjZS5nZXQoaWZhY2UpOworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChMT0dEKSBTbG9nLncoVEFHLCAidW5rbm93biBpbnRlcmZhY2UgIiArIGlmYWNlICsgIiwgaWdub3Jpbmcgc3RhdHMiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gcG9sbERlbHRhLmZpbmRJbmRleChpZmFjZSwgVUlEX0FMTCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIHJ4ID0gcG9sbERlbHRhLnJ4W2luZGV4XTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgdHggPSBwb2xsRGVsdGEudHhbaW5kZXhdOworCisgICAgICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IGhpc3RvcnkgPSBmaW5kT3JDcmVhdGVIaXN0b3J5TG9ja2VkKGluZm8pOworICAgICAgICAgICAgaGlzdG9yeS5yZWNvcmREYXRhKHRpbWVTdGFydCwgY3VycmVudFRpbWUsIHJ4LCB0eCk7CisgICAgICAgICAgICBoaXN0b3J5LnJlbW92ZUJ1Y2tldHNCZWZvcmUoY3VycmVudFRpbWUgLSBTVU1NQVJZX01BWF9ISVNUT1JZKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXN0UG9sbFN0YXRzID0gY3VycmVudDsKKworICAgICAgICAvLyBkZWNpZGUgaWYgZW5vdWdoIGhhcyBjaGFuZ2VkIHRvIHRyaWdnZXIgcGVyc2lzdAorICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgcGVyc2lzdERlbHRhID0gY29tcHV0ZVN0YXRzRGVsdGEobUxhc3RQZXJzaXN0U3RhdHMsIGN1cnJlbnQpOworICAgICAgICBmb3IgKFN0cmluZyBpZmFjZSA6IHBlcnNpc3REZWx0YS5nZXRLbm93bklmYWNlcygpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBwZXJzaXN0RGVsdGEuZmluZEluZGV4KGlmYWNlLCBVSURfQUxMKTsKKyAgICAgICAgICAgIGlmIChwZXJzaXN0RGVsdGEucnhbaW5kZXhdID4gU1VNTUFSWV9QRVJTSVNUX1RIUkVTSE9MRAorICAgICAgICAgICAgICAgICAgICB8fCBwZXJzaXN0RGVsdGEudHhbaW5kZXhdID4gU1VNTUFSWV9QRVJTSVNUX1RIUkVTSE9MRCkgeworICAgICAgICAgICAgICAgIHdyaXRlU3RhdHNMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICBtTGFzdFBlcnNpc3RTdGF0cyA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0c0hpc3RvcnkgZmluZE9yQ3JlYXRlSGlzdG9yeUxvY2tlZChJbnRlcmZhY2VJbmZvIGluZm8pIHsKKyAgICAgICAgTmV0d29ya1N0YXRzSGlzdG9yeSBzdGF0cyA9IG1JZmFjZVN0YXRzLmdldChpbmZvKTsKKyAgICAgICAgaWYgKHN0YXRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHN0YXRzID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoCisgICAgICAgICAgICAgICAgICAgIGluZm8ubmV0d29ya1R5cGUsIGluZm8uaWRlbnRpdHksIFVJRF9BTEwsIFNVTU1BUllfQlVDS0VUX0RVUkFUSU9OKTsKKyAgICAgICAgICAgIG1JZmFjZVN0YXRzLnB1dChpbmZvLCBzdGF0cyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkU3RhdHNMb2NrZWQoKSB7CisgICAgICAgIGlmIChMT0dEKSBTbG9nLnYoVEFHLCAicmVhZFN0YXRzTG9ja2VkKCkiKTsKKyAgICAgICAgLy8gVE9ETzogcmVhZCBoaXN0b3JpY2FsIHN0YXRzIGZyb20gZGlzayB1c2luZyBBdG9taWNGaWxlCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlU3RhdHNMb2NrZWQoKSB7CisgICAgICAgIGlmIChMT0dEKSBTbG9nLnYoVEFHLCAid3JpdGVTdGF0c0xvY2tlZCgpIik7CisgICAgICAgIC8vIFRPRE86IHBlcnNpc3QgaGlzdG9yaWNhbCBzdGF0cyB0byBkaXNrIHVzaW5nIEF0b21pY0ZpbGUKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oRFVNUCwgVEFHKTsKKworICAgICAgICBwdy5wcmludGxuKCJBY3RpdmUgaW50ZXJmYWNlczoiKTsKKyAgICAgICAgZm9yIChJbnRlcmZhY2VJbmZvIGluZm8gOiBtQWN0aXZlSWZhY2UudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGluZm8uZHVtcCgiICAiLCBwdyk7CisgICAgICAgIH0KKworICAgICAgICBwdy5wcmludGxuKCJLbm93biBoaXN0b3JpY2FsIHN0YXRzOiIpOworICAgICAgICBmb3IgKE5ldHdvcmtTdGF0c0hpc3Rvcnkgc3RhdHMgOiBtSWZhY2VTdGF0cy52YWx1ZXMoKSkgeworICAgICAgICAgICAgc3RhdHMuZHVtcCgiICAiLCBwdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRhaWxzIGZvciBhIHdlbGwta25vd24gbmV0d29yayBpbnRlcmZhY2UsIGluY2x1ZGluZyBpdHMgbmFtZSwgbmV0d29yaworICAgICAqIHR5cGUsIGFuZCBiaWxsaW5nIHJlbGF0aW9uc2hpcCBpZGVudGl0eSAoc3VjaCBhcyBJTVNJKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnRlcmZhY2VJbmZvIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBpZmFjZTsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuZXR3b3JrVHlwZTsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBpZGVudGl0eTsKKworICAgICAgICBwdWJsaWMgSW50ZXJmYWNlSW5mbyhTdHJpbmcgaWZhY2UsIGludCBuZXR3b3JrVHlwZSwgU3RyaW5nIGlkZW50aXR5KSB7CisgICAgICAgICAgICB0aGlzLmlmYWNlID0gaWZhY2U7CisgICAgICAgICAgICB0aGlzLm5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7CisgICAgICAgICAgICB0aGlzLmlkZW50aXR5ID0gaWRlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgICAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaWRlbnRpdHkgPT0gbnVsbCkgPyAwIDogaWRlbnRpdHkuaGFzaENvZGUoKSk7CisgICAgICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaWZhY2UgPT0gbnVsbCkgPyAwIDogaWZhY2UuaGFzaENvZGUoKSk7CisgICAgICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIG5ldHdvcmtUeXBlOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEludGVyZmFjZUluZm8pIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlcmZhY2VJbmZvIGluZm8gPSAoSW50ZXJmYWNlSW5mbykgb2JqOworICAgICAgICAgICAgICAgIHJldHVybiBlcXVhbChpZmFjZSwgaW5mby5pZmFjZSkgJiYgbmV0d29ya1R5cGUgPT0gaW5mby5uZXR3b3JrVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXF1YWwoaWRlbnRpdHksIGluZm8uaWRlbnRpdHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4LCBQcmludFdyaXRlciBwdykgeworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsKKyAgICAgICAgICAgIHB3LnByaW50KCJJbnRlcmZhY2VJbmZvOiBpZmFjZT0iKTsgcHcucHJpbnQoaWZhY2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiBuZXR3b3JrVHlwZT0iKTsgcHcucHJpbnQobmV0d29ya1R5cGUpOworICAgICAgICAgICAgcHcucHJpbnQoIiBpZGVudGl0eT0iKTsgcHcucHJpbnRsbihpZGVudGl0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0QWN0aXZlSW50ZXJmYWNlKEludGVyZmFjZUluZm8gaW5mbykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0c0xvY2spIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHdoZW4gaW50ZXJmYWNlIHJlZGVmaW5lZCwgcG9ydCBvdmVyIGhpc3RvcmljYWwgc3RhdHMKKyAgICAgICAgICAgIG1BY3RpdmVJZmFjZS5wdXQoaW5mby5pZmFjZSwgaW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlbHRhIGJldHdlZW4gdHdvIHtAbGluayBOZXR3b3JrU3RhdHN9IHNuYXBzaG90cywgd2hlcmUge0Bjb2RlCisgICAgICogYmVmb3JlfSBjYW4gYmUge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE5ldHdvcmtTdGF0cyBjb21wdXRlU3RhdHNEZWx0YShOZXR3b3JrU3RhdHMgYmVmb3JlLCBOZXR3b3JrU3RhdHMgY3VycmVudCkgeworICAgICAgICBpZiAoYmVmb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50LnN1YnRyYWN0KGJlZm9yZSwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsKE9iamVjdCBhLCBPYmplY3QgYikgeworICAgICAgICByZXR1cm4gYSA9PSBiIHx8IChhICE9IG51bGwgJiYgYS5lcXVhbHMoYikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIGNoZWNrTm90TnVsbChUIHZhbHVlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JEZXZpY2VNYW5hZ2VyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiRGV2aWNlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTFjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiRGV2aWNlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci51c2I7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiQWNjZXNzb3J5OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5vcy5VRXZlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFVzYkRldmljZU1hbmFnZXIgbWFuYWdlcyBVU0Igc3RhdGUgaW4gZGV2aWNlIG1vZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBVc2JEZXZpY2VNYW5hZ2VyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gVXNiRGV2aWNlTWFuYWdlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0cgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0JfQ09OTkVDVEVEX01BVENIID0KKyAgICAgICAgICAgICJERVZQQVRIPS9kZXZpY2VzL3ZpcnR1YWwvc3dpdGNoL3VzYl9jb25uZWN0ZWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0JfQ09ORklHVVJBVElPTl9NQVRDSCA9CisgICAgICAgICAgICAiREVWUEFUSD0vZGV2aWNlcy92aXJ0dWFsL3N3aXRjaC91c2JfY29uZmlndXJhdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9GVU5DVElPTlNfTUFUQ0ggPQorICAgICAgICAgICAgIkRFVlBBVEg9L2RldmljZXMvdmlydHVhbC91c2JfY29tcG9zaXRlLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9DT05ORUNURURfUEFUSCA9CisgICAgICAgICAgICAiL3N5cy9jbGFzcy9zd2l0Y2gvdXNiX2Nvbm5lY3RlZC9zdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9DT05GSUdVUkFUSU9OX1BBVEggPQorICAgICAgICAgICAgIi9zeXMvY2xhc3Mvc3dpdGNoL3VzYl9jb25maWd1cmF0aW9uL3N0YXRlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0NPTVBPU0lURV9DTEFTU19QQVRIID0KKyAgICAgICAgICAgICIvc3lzL2NsYXNzL3VzYl9jb21wb3NpdGUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfU1RBVEUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRlVOQ1RJT05fRU5BQkxFRCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19GVU5DVElPTl9ESVNBQkxFRCA9IDI7CisKKyAgICAvLyBEZWxheSBmb3IgZGVib3VuY2luZyBVU0IgZGlzY29ubmVjdHMuCisgICAgLy8gV2Ugb2Z0ZW4gZ2V0IHJhcGlkIGNvbm5lY3QvZGlzY29ubmVjdCBldmVudHMgd2hlbiBlbmFibGluZyBVU0IgZnVuY3Rpb25zLAorICAgIC8vIHdoaWNoIG5lZWQgZGVib3VuY2luZy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0RFTEFZID0gMTAwMDsKKworICAgIC8vIGN1cnJlbnQgY29ubmVjdGVkIGFuZCBjb25maWd1cmF0aW9uIHN0YXRlCisgICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3RlZDsKKyAgICBwcml2YXRlIGludCBtQ29uZmlndXJhdGlvbjsKKworICAgIC8vIGxhc3QgYnJvYWRjYXN0ZWQgY29ubmVjdGVkIGFuZCBjb25maWd1cmF0aW9uIHN0YXRlCisgICAgcHJpdmF0ZSBpbnQgbUxhc3RDb25uZWN0ZWQgPSAtMTsKKyAgICBwcml2YXRlIGludCBtTGFzdENvbmZpZ3VyYXRpb24gPSAtMTsKKworICAgIC8vIGxpc3RzIG9mIGVuYWJsZWQgYW5kIGRpc2FibGVkIFVTQiBmdW5jdGlvbnMKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1FbmFibGVkRnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRGlzYWJsZWRGdW5jdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7CisKKyAgICBwcml2YXRlIFVzYkFjY2Vzc29yeSBtQ3VycmVudEFjY2Vzc29yeTsKKyAgICAvLyBVU0IgZnVuY3Rpb25zIHRoYXQgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgdG8gcmVzdG9yZSBhZnRlciBleGl0aW5nIGFjY2Vzc29yeSBtb2RlCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRGVmYXVsdEZ1bmN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgVXNiU2V0dGluZ3NNYW5hZ2VyIG1TZXR0aW5nc01hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1IYXNVc2JBY2Nlc3Nvcnk7CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgcmVhZEN1cnJlbnRBY2Nlc3NvcnlMb2NrZWQoKSB7CisgICAgICAgIGlmIChtSGFzVXNiQWNjZXNzb3J5KSB7CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gbmF0aXZlR2V0QWNjZXNzb3J5U3RyaW5ncygpOworICAgICAgICAgICAgaWYgKHN0cmluZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50QWNjZXNzb3J5ID0gbmV3IFVzYkFjY2Vzc29yeShzdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJlbnRlcmluZyBVU0IgYWNjZXNzb3J5IG1vZGU6ICIgKyBtQ3VycmVudEFjY2Vzc29yeSk7CisgICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyLmFjY2Vzc29yeUF0dGFjaGVkKG1DdXJyZW50QWNjZXNzb3J5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIm5hdGl2ZUdldEFjY2Vzc29yeVN0cmluZ3MgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEhhbmRsZXMgVVNCIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIGV2ZW50cworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdm9pZCBmdW5jdGlvbkVuYWJsZWRMb2NrZWQoU3RyaW5nIGZ1bmN0aW9uLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICghbUVuYWJsZWRGdW5jdGlvbnMuY29udGFpbnMoZnVuY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbUVuYWJsZWRGdW5jdGlvbnMuYWRkKGZ1bmN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EaXNhYmxlZEZ1bmN0aW9ucy5yZW1vdmUoZnVuY3Rpb24pOworCisgICAgICAgICAgICBpZiAoVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQUNDRVNTT1JZLmVxdWFscyhmdW5jdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZWFkQ3VycmVudEFjY2Vzc29yeUxvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtRGlzYWJsZWRGdW5jdGlvbnMuY29udGFpbnMoZnVuY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbURpc2FibGVkRnVuY3Rpb25zLmFkZChmdW5jdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRW5hYmxlZEZ1bmN0aW9ucy5yZW1vdmUoZnVuY3Rpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMaXN0ZW5zIGZvciB1ZXZlbnQgbWVzc2FnZXMgZnJvbSB0aGUga2VybmVsIHRvIG1vbml0b3IgdGhlIFVTQiBzdGF0ZQorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVUV2ZW50T2JzZXJ2ZXIgbVVFdmVudE9ic2VydmVyID0gbmV3IFVFdmVudE9ic2VydmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25VRXZlbnQoVUV2ZW50T2JzZXJ2ZXIuVUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAiVVNCIFVFVkVOVDogIiArIGV2ZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBldmVudC5nZXQoIlNXSVRDSF9OQU1FIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlID0gZXZlbnQuZ2V0KCJTV0lUQ0hfU1RBVEUiKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIHN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRTdGF0ZSA9IEludGVnZXIucGFyc2VJbnQoc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJ1c2JfY29ubmVjdGVkIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gaW50U3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBhbiBJbnRlbnQgYnJvYWRjYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJvdW5jZSBkaXNjb25uZWN0cyB0byBhdm9pZCBwcm9ibGVtcyBicmluZ2luZyB1cCBVU0IgdGV0aGVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShtQ29ubmVjdGVkID09IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInVzYl9jb25maWd1cmF0aW9uIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJhdGlvbiA9IGludFN0YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgYW4gSW50ZW50IGJyb2FkY2FzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKG1Db25uZWN0ZWQgPT0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBwYXJzZSBzd2l0Y2ggc3RhdGUgZnJvbSBldmVudCAiICsgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bmN0aW9uID0gZXZlbnQuZ2V0KCJGVU5DVElPTiIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5hYmxlZFN0ciA9IGV2ZW50LmdldCgiRU5BQkxFRCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCAmJiBlbmFibGVkU3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHdlIGRvIG5vdCBicm9hZGNhc3QgYSBjaGFuZ2Ugd2hlbiBhIGZ1bmN0aW9uIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBqdXN0IHJlY29yZCB0aGUgc3RhdGUgY2hhbmdlIGZvciB0aGUgbmV4dCBicm9hZGNhc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hhdCA9ICgiMSIuZXF1YWxzKGVuYWJsZWRTdHIpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX0ZVTkNUSU9OX0VOQUJMRUQgOiBNU0dfRlVOQ1RJT05fRElTQUJMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgd2hhdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cub2JqID0gZnVuY3Rpb247CisgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtQm9vdENvbXBsZXRlZFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgYWNjZXNzb3JpZXMgYXR0YWNoZWQgYXQgYm9vdCB0aW1lCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50QWNjZXNzb3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzTWFuYWdlci5hY2Nlc3NvcnlBdHRhY2hlZChtQ3VycmVudEFjY2Vzc29yeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBVc2JEZXZpY2VNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgVXNiU2V0dGluZ3NNYW5hZ2VyIHNldHRpbmdzTWFuYWdlcikgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1TZXR0aW5nc01hbmFnZXIgPSBzZXR0aW5nc01hbmFnZXI7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgbUhhc1VzYkFjY2Vzc29yeSA9IHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9VU0JfQUNDRVNTT1JZKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpbml0KCk7ICAvLyBzZXQgaW5pdGlhbCBzdGF0dXMKKworICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIFVTQiBjb25maWd1cmF0aW9uIGNoYW5nZXMKKyAgICAgICAgICAgIGlmIChtQ29uZmlndXJhdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgbVVFdmVudE9ic2VydmVyLnN0YXJ0T2JzZXJ2aW5nKFVTQl9DT05ORUNURURfTUFUQ0gpOworICAgICAgICAgICAgICAgIG1VRXZlbnRPYnNlcnZlci5zdGFydE9ic2VydmluZyhVU0JfQ09ORklHVVJBVElPTl9NQVRDSCk7CisgICAgICAgICAgICAgICAgbVVFdmVudE9ic2VydmVyLnN0YXJ0T2JzZXJ2aW5nKFVTQl9GVU5DVElPTlNfTUFUQ0gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGluaXQoKSB7CisgICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsxMDI0XTsKKyAgICAgICAgYm9vbGVhbiBpbkFjY2Vzc29yeU1vZGUgPSBmYWxzZTsKKworICAgICAgICAvLyBSZWFkIGluaXRpYWwgVVNCIHN0YXRlCisgICAgICAgIG1Db25maWd1cmF0aW9uID0gLTE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlUmVhZGVyIGZpbGUgPSBuZXcgRmlsZVJlYWRlcihVU0JfQ09OTkVDVEVEX1BBVEgpOworICAgICAgICAgICAgaW50IGxlbiA9IGZpbGUucmVhZChidWZmZXIsIDAsIDEwMjQpOworICAgICAgICAgICAgZmlsZS5jbG9zZSgpOworICAgICAgICAgICAgbUNvbm5lY3RlZCA9IEludGVnZXIudmFsdWVPZigobmV3IFN0cmluZyhidWZmZXIsIDAsIGxlbikpLnRyaW0oKSk7CisKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZVJlYWRlcihVU0JfQ09ORklHVVJBVElPTl9QQVRIKTsKKyAgICAgICAgICAgIGxlbiA9IGZpbGUucmVhZChidWZmZXIsIDAsIDEwMjQpOworICAgICAgICAgICAgZmlsZS5jbG9zZSgpOworICAgICAgICAgICAgbUNvbmZpZ3VyYXRpb24gPSBJbnRlZ2VyLnZhbHVlT2YoKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBsZW4pKS50cmltKCkpOworCisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAiVGhpcyBrZXJuZWwgZG9lcyBub3QgaGF2ZSBVU0IgY29uZmlndXJhdGlvbiBzd2l0Y2ggc3VwcG9ydCIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIiIgLCBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNvbmZpZ3VyYXRpb24gPCAwKSB7CisgICAgICAgICAgICAvLyBUaGlzIG1heSBoYXBwZW4gaW4gdGhlIGVtdWxhdG9yIG9yIGRldmljZXMgd2l0aG91dCBVU0IgZGV2aWNlIG1vZGUgc3VwcG9ydAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVhZCBpbml0aWFsIGxpc3Qgb2YgZW5hYmxlZCBhbmQgZGlzYWJsZWQgZnVuY3Rpb25zIChkZXZpY2UgbW9kZSkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlKFVTQl9DT01QT1NJVEVfQ0xBU1NfUEFUSCkubGlzdEZpbGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZXNbaV0sICJlbmFibGUiKTsKKyAgICAgICAgICAgICAgICBGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGZpbGUpOworICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkZXIucmVhZChidWZmZXIsIDAsIDEwMjQpOworICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IEludGVnZXIudmFsdWVPZigobmV3IFN0cmluZyhidWZmZXIsIDAsIGxlbikpLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bmN0aW9uTmFtZSA9IGZpbGVzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZEZ1bmN0aW9ucy5hZGQoZnVuY3Rpb25OYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQUNDRVNTT1JZLmVxdWFscyhmdW5jdGlvbk5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgVVNCIGFjY2Vzc29yeSBkcml2ZXIgaXMgb24gYnkgZGVmYXVsdCwgYnV0IGl0IG1pZ2h0IGhhdmUgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCBiZWZvcmUgdGhlIFVTQiBzZXJ2aWNlIGhhcyBpbml0aWFsaXplZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluQWNjZXNzb3J5TW9kZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIVVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX0FEQi5lcXVhbHMoZnVuY3Rpb25OYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRiIGlzIGVuYWJsZWQvZGlzYWJsZWQgYXV0b21hdGljYWxseSBieSB0aGUgYWRiZCBkYWVtb24sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBkb24ndCB0cmVhdCBpdCBhcyBhIGRlZmF1bHQgZnVuY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdEZ1bmN0aW9ucy5hZGQoZnVuY3Rpb25OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1EaXNhYmxlZEZ1bmN0aW9ucy5hZGQoZnVuY3Rpb25OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiVGhpcyBrZXJuZWwgZG9lcyBub3QgaGF2ZSBVU0IgY29tcG9zaXRlIGNsYXNzIHN1cHBvcnQiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICIiICwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYW4gYWNjZXNzb3J5IHN3aXRjaGVkIHRoZSBkcml2ZXIgdG8gYWNjZXNzb3J5IG1vZGUKKyAgICAgICAgLy8gYmVmb3JlIHRoZSBmcmFtZXdvcmsgZmluaXNoZWQgYm9vdGluZworICAgICAgICBpZiAoaW5BY2Nlc3NvcnlNb2RlKSB7CisgICAgICAgICAgICByZWFkQ3VycmVudEFjY2Vzc29yeUxvY2tlZCgpOworCisgICAgICAgICAgICAvLyBGSVhNRSAtIGlmIHdlIGJvb3RlZCBpbiBhY2Nlc3NvcnkgbW9kZSwgdGhlbiB3ZSBoYXZlIG5vIHdheSB0byBmaWd1cmUgb3V0CisgICAgICAgICAgICAvLyB3aGljaCBmdW5jdGlvbnMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIC8vIEZvciBub3csIGFzc3VtZSB0aGF0IE1UUCBvciBtYXNzIHN0b3JhZ2UgYXJlIHRoZSBvbmx5IHBvc3NpYmlsaXRpZXMKKyAgICAgICAgICAgIGlmIChtRGlzYWJsZWRGdW5jdGlvbnMuY29udGFpbnMoVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fTVRQKSkgeworICAgICAgICAgICAgICAgIG1EZWZhdWx0RnVuY3Rpb25zLmFkZChVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9NVFApOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRGlzYWJsZWRGdW5jdGlvbnMuY29udGFpbnMoVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fTUFTU19TVE9SQUdFKSkgeworICAgICAgICAgICAgICAgIG1EZWZhdWx0RnVuY3Rpb25zLmFkZChVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9NQVNTX1NUT1JBR0UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRBY2Nlc3NvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFjY2Vzc29yeUF0dGFjaGVkIGF0IHN5c3RlbVJlYWR5Iik7CisgICAgICAgICAgICAgICAgLy8gaXRzIHN0aWxsIHRvbyBlYXJseSB0byBoYW5kbGUgYWNjZXNzb3JpZXMsIHNvIGFkZCBhIEJPT1RfQ09NUExFVEVEIHJlY2VpdmVyCisgICAgICAgICAgICAgICAgLy8gdG8gaGFuZGxlIHRoaXMgbGF0ZXIuCisgICAgICAgICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQm9vdENvbXBsZXRlZFJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX0JPT1RfQ09NUExFVEVEKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3lzdGVtUmVhZHkgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdXBkYXRlIHRoZSBVU0IgY29ubmVjdGVkIGFuZCBjb25maWd1cmVkIHN0YXRlIChkZXZpY2UgbW9kZSkuCisgICAgICogSWYgZGVsYXllZCBpcyB0cnVlLCB0aGVuIHdlIGFkZCBhIHNtYWxsIGRlbGF5IGluIHNlbmRpbmcgdGhlIG1lc3NhZ2UgdG8gZGVib3VuY2UKKyAgICAgKiB0aGUgVVNCIGNvbm5lY3Rpb24gd2hlbiBlbmFibGluZyBVU0IgdGV0aGVyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdm9pZCB1cGRhdGUoYm9vbGVhbiBkZWxheWVkKSB7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfU1RBVEUpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfVVBEQVRFX1NUQVRFLCBkZWxheWVkID8gVVBEQVRFX0RFTEFZIDogMCk7CisgICAgfQorCisgICAgLyogcmV0dXJucyB0aGUgY3VycmVudGx5IGF0dGFjaGVkIFVTQiBhY2Nlc3NvcnkgKGRldmljZSBtb2RlKSAqLworICAgIHB1YmxpYyBVc2JBY2Nlc3NvcnkgZ2V0Q3VycmVudEFjY2Vzc29yeSgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50QWNjZXNzb3J5OworICAgIH0KKworICAgIC8qIG9wZW5zIHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgVVNCIGFjY2Vzc29yeSAoZGV2aWNlIG1vZGUpICovCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5BY2Nlc3NvcnkoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRBY2Nlc3NvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIGFjY2Vzc29yeSBhdHRhY2hlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtQ3VycmVudEFjY2Vzc29yeS5lcXVhbHMoYWNjZXNzb3J5KSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgYWNjZXNzb3J5LnRvU3RyaW5nKCkgKyAiIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgYWNjZXNzb3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbUN1cnJlbnRBY2Nlc3NvcnkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY2Vzc29yeSBub3QgYXR0YWNoZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKG1DdXJyZW50QWNjZXNzb3J5KTsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVPcGVuQWNjZXNzb3J5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoaXMgaGFuZGxlciBpcyBmb3IgZGVmZXJyZWQgaGFuZGxpbmcgb2YgZXZlbnRzIHJlbGF0ZWQgdG8gZGV2aWNlIG1vZGUgYW5kIGFjY2Vzc29yaWVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBwcml2YXRlIHZvaWQgYWRkRW5hYmxlZEZ1bmN0aW9uc0xvY2tlZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAvLyBpbmNsdWRlIHN0YXRlIG9mIGFsbCBVU0IgZnVuY3Rpb25zIGluIG91ciBleHRyYXMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUVuYWJsZWRGdW5jdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEobUVuYWJsZWRGdW5jdGlvbnMuZ2V0KGkpLCBVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9FTkFCTEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURpc2FibGVkRnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKG1EaXNhYmxlZEZ1bmN0aW9ucy5nZXQoaSksIFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX0RJU0FCTEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RlZCAhPSBtTGFzdENvbm5lY3RlZCB8fCBtQ29uZmlndXJhdGlvbiAhPSBtTGFzdENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RlZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChVc2JNYW5hZ2VyLmlzRnVuY3Rpb25FbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9BQ0NFU1NPUlkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYWNjZXNzb3J5IG1vZGUgaXMgb2ZmLCBhbmQgcmVzdG9yZSBkZWZhdWx0IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZXhpdGVkIFVTQiBhY2Nlc3NvcnkgbW9kZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFVc2JNYW5hZ2VyLnNldEZ1bmN0aW9uRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQUNDRVNTT1JZLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjb3VsZCBub3QgZGlzYWJsZSBhY2Nlc3NvcnkgZnVuY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1EZWZhdWx0RnVuY3Rpb25zLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbiA9IG1EZWZhdWx0RnVuY3Rpb25zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVVzYk1hbmFnZXIuc2V0RnVuY3Rpb25FbmFibGVkKGZ1bmN0aW9uLCB0cnVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjb3VsZCBub3QgcmVlbmFibGUgZnVuY3Rpb24gIiArIGZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEFjY2Vzc29yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzTWFuYWdlci5hY2Nlc3NvcnlEZXRhY2hlZChtQ3VycmVudEFjY2Vzc29yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRBY2Nlc3NvcnkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVWSUNFX1BST1ZJU0lPTkVELCAwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJEZXZpY2Ugbm90IHByb3Zpc2lvbmVkLCBza2lwcGluZyBVU0IgYnJvYWRjYXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdENvbm5lY3RlZCA9IG1Db25uZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RDb25maWd1cmF0aW9uID0gbUNvbmZpZ3VyYXRpb247CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGEgc3RpY2t5IGJyb2FkY2FzdCBjb250YWluaW5nIGN1cnJlbnQgVVNCIHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiTWFuYWdlci5BQ1RJT05fVVNCX1NUQVRFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5VU0JfQ09OTkVDVEVELCBtQ29ubmVjdGVkICE9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLlVTQl9DT05GSUdVUkFUSU9OLCBtQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRW5hYmxlZEZ1bmN0aW9uc0xvY2tlZChpbnRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19GVU5DVElPTl9FTkFCTEVEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19GVU5DVElPTl9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRW5hYmxlZExvY2tlZCgoU3RyaW5nKW1zZy5vYmosIG1zZy53aGF0ID09IE1TR19GVU5DVElPTl9FTkFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIFVTQiBEZXZpY2UgU3RhdGU6Iik7CisgICAgICAgICAgICBwdy5wcmludCgiICAgIEVuYWJsZWQgRnVuY3Rpb25zOiAiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUVuYWJsZWRGdW5jdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChtRW5hYmxlZEZ1bmN0aW9ucy5nZXQoaSkgKyAiICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHcucHJpbnRsbigiIik7CisgICAgICAgICAgICBwdy5wcmludCgiICAgIERpc2FibGVkIEZ1bmN0aW9uczogIik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EaXNhYmxlZEZ1bmN0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHB3LnByaW50KG1EaXNhYmxlZEZ1bmN0aW9ucy5nZXQoaSkgKyAiICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHcucHJpbnRsbigiIik7CisgICAgICAgICAgICBwdy5wcmludCgiICAgIERlZmF1bHQgRnVuY3Rpb25zOiAiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURlZmF1bHRGdW5jdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChtRGVmYXVsdEZ1bmN0aW9ucy5nZXQoaSkgKyAiICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHcucHJpbnRsbigiIik7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgbUNvbm5lY3RlZDogIiArIG1Db25uZWN0ZWQgKyAiLCBtQ29uZmlndXJhdGlvbjogIiArIG1Db25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBtQ3VycmVudEFjY2Vzc29yeTogIiArIG1DdXJyZW50QWNjZXNzb3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZ1tdIG5hdGl2ZUdldEFjY2Vzc29yeVN0cmluZ3MoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBuYXRpdmVPcGVuQWNjZXNzb3J5KCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiRGV2aWNlU2V0dGluZ3NNYW5hZ2VyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiRGV2aWNlU2V0dGluZ3NNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMGIxMTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkRldmljZVNldHRpbmdzTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIudXNiOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiQWNjZXNzb3J5OwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkRldmljZTsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb250ZW50LlBhY2thZ2VNb25pdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuRmFzdFhtbFNlcmlhbGl6ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWNsYXNzIFVzYkRldmljZVNldHRpbmdzTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlVzYkRldmljZVNldHRpbmdzTWFuYWdlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBzU2V0dGluZ3NGaWxlID0gbmV3IEZpbGUoIi9kYXRhL3N5c3RlbS91c2JfZGV2aWNlX21hbmFnZXIueG1sIik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7Ci0KLSAgICAvLyBUZW1wb3JhcnkgbWFwcGluZyBVU0IgZGV2aWNlIG5hbWUgdG8gbGlzdCBvZiBVSURzIHdpdGggcGVybWlzc2lvbnMgZm9yIHRoZSBkZXZpY2UKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTcGFyc2VCb29sZWFuQXJyYXk+IG1EZXZpY2VQZXJtaXNzaW9uTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgU3BhcnNlQm9vbGVhbkFycmF5PigpOwotICAgIC8vIFRlbXBvcmFyeSBtYXBwaW5nIFVzYkFjY2Vzc29yeSB0byBsaXN0IG9mIFVJRHMgd2l0aCBwZXJtaXNzaW9ucyBmb3IgdGhlIGFjY2Vzc29yeQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxVc2JBY2Nlc3NvcnksIFNwYXJzZUJvb2xlYW5BcnJheT4gbUFjY2Vzc29yeVBlcm1pc3Npb25NYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8VXNiQWNjZXNzb3J5LCBTcGFyc2VCb29sZWFuQXJyYXk+KCk7Ci0gICAgLy8gTWFwcyBEZXZpY2VGaWx0ZXIgdG8gdXNlciBwcmVmZXJyZWQgYXBwbGljYXRpb24gcGFja2FnZQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxEZXZpY2VGaWx0ZXIsIFN0cmluZz4gbURldmljZVByZWZlcmVuY2VNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8RGV2aWNlRmlsdGVyLCBTdHJpbmc+KCk7Ci0gICAgLy8gTWFwcyBBY2Nlc3NvcnlGaWx0ZXIgdG8gdXNlciBwcmVmZXJyZWQgYXBwbGljYXRpb24gcGFja2FnZQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxBY2Nlc3NvcnlGaWx0ZXIsIFN0cmluZz4gbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8QWNjZXNzb3J5RmlsdGVyLCBTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIC8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBkZXNjcmliZSBhIFVTQiBkZXZpY2UuCi0gICAgLy8gV2hlbiB1c2VkIGluIEhhc2hNYXBzIGFsbCB2YWx1ZXMgbXVzdCBiZSBzcGVjaWZpZWQsCi0gICAgLy8gYnV0IHdpbGRjYXJkcyBjYW4gYmUgdXNlZCBmb3IgYW55IG9mIHRoZSBmaWVsZHMgaW4KLSAgICAvLyB0aGUgcGFja2FnZSBtZXRhLWRhdGEuCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGV2aWNlRmlsdGVyIHsKLSAgICAgICAgLy8gVVNCIFZlbmRvciBJRCAob3IgLTEgZm9yIHVuc3BlY2lmaWVkKQotICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1WZW5kb3JJZDsKLSAgICAgICAgLy8gVVNCIFByb2R1Y3QgSUQgKG9yIC0xIGZvciB1bnNwZWNpZmllZCkKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtUHJvZHVjdElkOwotICAgICAgICAvLyBVU0IgZGV2aWNlIG9yIGludGVyZmFjZSBjbGFzcyAob3IgLTEgZm9yIHVuc3BlY2lmaWVkKQotICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1DbGFzczsKLSAgICAgICAgLy8gVVNCIGRldmljZSBzdWJjbGFzcyAob3IgLTEgZm9yIHVuc3BlY2lmaWVkKQotICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1TdWJjbGFzczsKLSAgICAgICAgLy8gVVNCIGRldmljZSBwcm90b2NvbCAob3IgLTEgZm9yIHVuc3BlY2lmaWVkKQotICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1Qcm90b2NvbDsKLQotICAgICAgICBwdWJsaWMgRGV2aWNlRmlsdGVyKGludCB2aWQsIGludCBwaWQsIGludCBjbGFzeiwgaW50IHN1YmNsYXNzLCBpbnQgcHJvdG9jb2wpIHsKLSAgICAgICAgICAgIG1WZW5kb3JJZCA9IHZpZDsKLSAgICAgICAgICAgIG1Qcm9kdWN0SWQgPSBwaWQ7Ci0gICAgICAgICAgICBtQ2xhc3MgPSBjbGFzejsKLSAgICAgICAgICAgIG1TdWJjbGFzcyA9IHN1YmNsYXNzOwotICAgICAgICAgICAgbVByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGV2aWNlRmlsdGVyKFVzYkRldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIG1WZW5kb3JJZCA9IGRldmljZS5nZXRWZW5kb3JJZCgpOwotICAgICAgICAgICAgbVByb2R1Y3RJZCA9IGRldmljZS5nZXRQcm9kdWN0SWQoKTsKLSAgICAgICAgICAgIG1DbGFzcyA9IGRldmljZS5nZXREZXZpY2VDbGFzcygpOwotICAgICAgICAgICAgbVN1YmNsYXNzID0gZGV2aWNlLmdldERldmljZVN1YmNsYXNzKCk7Ci0gICAgICAgICAgICBtUHJvdG9jb2wgPSBkZXZpY2UuZ2V0RGV2aWNlUHJvdG9jb2woKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGV2aWNlRmlsdGVyIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGludCB2ZW5kb3JJZCA9IC0xOwotICAgICAgICAgICAgaW50IHByb2R1Y3RJZCA9IC0xOwotICAgICAgICAgICAgaW50IGRldmljZUNsYXNzID0gLTE7Ci0gICAgICAgICAgICBpbnQgZGV2aWNlU3ViY2xhc3MgPSAtMTsKLSAgICAgICAgICAgIGludCBkZXZpY2VQcm90b2NvbCA9IC0xOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldEF0dHJpYnV0ZU5hbWUoaSk7Ci0gICAgICAgICAgICAgICAgLy8gQWxsIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGludHMKLSAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoInZlbmRvci1pZCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlbmRvcklkID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicHJvZHVjdC1pZCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RJZCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImNsYXNzIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlQ2xhc3MgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJzdWJjbGFzcyIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZVN1YmNsYXNzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicHJvdG9jb2wiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VQcm90b2NvbCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRGV2aWNlRmlsdGVyKHZlbmRvcklkLCBwcm9kdWN0SWQsCi0gICAgICAgICAgICAgICAgICAgIGRldmljZUNsYXNzLCBkZXZpY2VTdWJjbGFzcywgZGV2aWNlUHJvdG9jb2wpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoWG1sU2VyaWFsaXplciBzZXJpYWxpemVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhudWxsLCAidXNiLWRldmljZSIpOwotICAgICAgICAgICAgaWYgKG1WZW5kb3JJZCAhPSAtMSkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJ2ZW5kb3ItaWQiLCBJbnRlZ2VyLnRvU3RyaW5nKG1WZW5kb3JJZCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Qcm9kdWN0SWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAicHJvZHVjdC1pZCIsIEludGVnZXIudG9TdHJpbmcobVByb2R1Y3RJZCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DbGFzcyAhPSAtMSkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJjbGFzcyIsIEludGVnZXIudG9TdHJpbmcobUNsYXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN1YmNsYXNzICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInN1YmNsYXNzIiwgSW50ZWdlci50b1N0cmluZyhtU3ViY2xhc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUHJvdG9jb2wgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAicHJvdG9jb2wiLCBJbnRlZ2VyLnRvU3RyaW5nKG1Qcm90b2NvbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcobnVsbCwgInVzYi1kZXZpY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaGVzKGludCBjbGFzeiwgaW50IHN1YmNsYXNzLCBpbnQgcHJvdG9jb2wpIHsKLSAgICAgICAgICAgIHJldHVybiAoKG1DbGFzcyA9PSAtMSB8fCBjbGFzeiA9PSBtQ2xhc3MpICYmCi0gICAgICAgICAgICAgICAgICAgIChtU3ViY2xhc3MgPT0gLTEgfHwgc3ViY2xhc3MgPT0gbVN1YmNsYXNzKSAmJgotICAgICAgICAgICAgICAgICAgICAobVByb3RvY29sID09IC0xIHx8IHByb3RvY29sID09IG1Qcm90b2NvbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhVc2JEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBpZiAobVZlbmRvcklkICE9IC0xICYmIGRldmljZS5nZXRWZW5kb3JJZCgpICE9IG1WZW5kb3JJZCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Qcm9kdWN0SWQgIT0gLTEgJiYgZGV2aWNlLmdldFByb2R1Y3RJZCgpICE9IG1Qcm9kdWN0SWQpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgZGV2aWNlIGNsYXNzL3N1YmNsYXNzL3Byb3RvY29sCi0gICAgICAgICAgICBpZiAobWF0Y2hlcyhkZXZpY2UuZ2V0RGV2aWNlQ2xhc3MoKSwgZGV2aWNlLmdldERldmljZVN1YmNsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXREZXZpY2VQcm90b2NvbCgpKSkgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIC8vIGlmIGRldmljZSBkb2Vzbid0IG1hdGNoLCBjaGVjayB0aGUgaW50ZXJmYWNlcwotICAgICAgICAgICAgaW50IGNvdW50ID0gZGV2aWNlLmdldEludGVyZmFjZUNvdW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBVc2JJbnRlcmZhY2UgaW50ZiA9IGRldmljZS5nZXRJbnRlcmZhY2UoaSk7Ci0gICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKGludGYuZ2V0SW50ZXJmYWNlQ2xhc3MoKSwgaW50Zi5nZXRJbnRlcmZhY2VTdWJjbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50Zi5nZXRJbnRlcmZhY2VQcm90b2NvbCgpKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoRGV2aWNlRmlsdGVyIGYpIHsKLSAgICAgICAgICAgIGlmIChtVmVuZG9ySWQgIT0gLTEgJiYgZi5tVmVuZG9ySWQgIT0gbVZlbmRvcklkKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobVByb2R1Y3RJZCAhPSAtMSAmJiBmLm1Qcm9kdWN0SWQgIT0gbVByb2R1Y3RJZCkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAvLyBjaGVjayBkZXZpY2UgY2xhc3Mvc3ViY2xhc3MvcHJvdG9jb2wKLSAgICAgICAgICAgIHJldHVybiBtYXRjaGVzKGYubUNsYXNzLCBmLm1TdWJjbGFzcywgZi5tUHJvdG9jb2wpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICAvLyBjYW4ndCBjb21wYXJlIGlmIHdlIGhhdmUgd2lsZGNhcmQgc3RyaW5ncwotICAgICAgICAgICAgaWYgKG1WZW5kb3JJZCA9PSAtMSB8fCBtUHJvZHVjdElkID09IC0xIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1DbGFzcyA9PSAtMSB8fCBtU3ViY2xhc3MgPT0gLTEgfHwgbVByb3RvY29sID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERldmljZUZpbHRlcikgewotICAgICAgICAgICAgICAgIERldmljZUZpbHRlciBmaWx0ZXIgPSAoRGV2aWNlRmlsdGVyKW9iajsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGZpbHRlci5tVmVuZG9ySWQgPT0gbVZlbmRvcklkICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIubVByb2R1Y3RJZCA9PSBtUHJvZHVjdElkICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIubUNsYXNzID09IG1DbGFzcyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1TdWJjbGFzcyA9PSBtU3ViY2xhc3MgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5tUHJvdG9jb2wgPT0gbVByb3RvY29sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBVc2JEZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBVc2JEZXZpY2UgZGV2aWNlID0gKFVzYkRldmljZSlvYmo7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChkZXZpY2UuZ2V0VmVuZG9ySWQoKSA9PSBtVmVuZG9ySWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXRQcm9kdWN0SWQoKSA9PSBtUHJvZHVjdElkICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0RGV2aWNlQ2xhc3MoKSA9PSBtQ2xhc3MgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXREZXZpY2VTdWJjbGFzcygpID09IG1TdWJjbGFzcyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldERldmljZVByb3RvY29sKCkgPT0gbVByb3RvY29sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuICgoKG1WZW5kb3JJZCA8PCAxNikgfCBtUHJvZHVjdElkKSBeCi0gICAgICAgICAgICAgICAgICAgICgobUNsYXNzIDw8IDE2KSB8IChtU3ViY2xhc3MgPDwgOCkgfCBtUHJvdG9jb2wpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJEZXZpY2VGaWx0ZXJbbVZlbmRvcklkPSIgKyBtVmVuZG9ySWQgKyAiLG1Qcm9kdWN0SWQ9IiArIG1Qcm9kdWN0SWQgKwotICAgICAgICAgICAgICAgICAgICAiLG1DbGFzcz0iICsgbUNsYXNzICsgIixtU3ViY2xhc3M9IiArIG1TdWJjbGFzcyArCi0gICAgICAgICAgICAgICAgICAgICIsbVByb3RvY29sPSIgKyBtUHJvdG9jb2wgKyAiXSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBVU0IgYWNjZXNzb3J5LgotICAgIC8vIFdoZW4gdXNlZCBpbiBIYXNoTWFwcyBhbGwgdmFsdWVzIG11c3QgYmUgc3BlY2lmaWVkLAotICAgIC8vIGJ1dCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQgZm9yIGFueSBvZiB0aGUgZmllbGRzIGluCi0gICAgLy8gdGhlIHBhY2thZ2UgbWV0YS1kYXRhLgotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjY2Vzc29yeUZpbHRlciB7Ci0gICAgICAgIC8vIFVTQiBhY2Nlc3NvcnkgbWFudWZhY3R1cmVyIChvciBudWxsIGZvciB1bnNwZWNpZmllZCkKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtTWFudWZhY3R1cmVyOwotICAgICAgICAvLyBVU0IgYWNjZXNzb3J5IG1vZGVsIChvciBudWxsIGZvciB1bnNwZWNpZmllZCkKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtTW9kZWw7Ci0gICAgICAgIC8vIFVTQiBhY2Nlc3NvcnkgdmVyc2lvbiAob3IgbnVsbCBmb3IgdW5zcGVjaWZpZWQpCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVZlcnNpb247Ci0KLSAgICAgICAgcHVibGljIEFjY2Vzc29yeUZpbHRlcihTdHJpbmcgbWFudWZhY3R1cmVyLCBTdHJpbmcgbW9kZWwsIFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgICAgICBtTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyOwotICAgICAgICAgICAgbU1vZGVsID0gbW9kZWw7Ci0gICAgICAgICAgICBtVmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQWNjZXNzb3J5RmlsdGVyKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKLSAgICAgICAgICAgIG1NYW51ZmFjdHVyZXIgPSBhY2Nlc3NvcnkuZ2V0TWFudWZhY3R1cmVyKCk7Ci0gICAgICAgICAgICBtTW9kZWwgPSBhY2Nlc3NvcnkuZ2V0TW9kZWwoKTsKLSAgICAgICAgICAgIG1WZXJzaW9uID0gYWNjZXNzb3J5LmdldFZlcnNpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzb3J5RmlsdGVyIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBtYW51ZmFjdHVyZXIgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIG1vZGVsID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLQotICAgICAgICAgICAgICAgIGlmICgibWFudWZhY3R1cmVyIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFudWZhY3R1cmVyID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibW9kZWwiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInZlcnNpb24iLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICByZXR1cm4gbmV3IEFjY2Vzc29yeUZpbHRlcihtYW51ZmFjdHVyZXIsIG1vZGVsLCB2ZXJzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKFhtbFNlcmlhbGl6ZXIgc2VyaWFsaXplcil0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhudWxsLCAidXNiLWFjY2Vzc29yeSIpOwotICAgICAgICAgICAgaWYgKG1NYW51ZmFjdHVyZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJtYW51ZmFjdHVyZXIiLCBtTWFudWZhY3R1cmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTW9kZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJtb2RlbCIsIG1Nb2RlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJ2ZXJzaW9uIiwgbVZlcnNpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcobnVsbCwgInVzYi1hY2Nlc3NvcnkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoVXNiQWNjZXNzb3J5IGFjYykgewotICAgICAgICAgICAgaWYgKG1NYW51ZmFjdHVyZXIgIT0gbnVsbCAmJiAhYWNjLmdldE1hbnVmYWN0dXJlcigpLmVxdWFscyhtTWFudWZhY3R1cmVyKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Nb2RlbCAhPSBudWxsICYmICFhY2MuZ2V0TW9kZWwoKS5lcXVhbHMobU1vZGVsKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG1WZXJzaW9uICE9IG51bGwgJiYgIWFjYy5nZXRWZXJzaW9uKCkuZXF1YWxzKG1WZXJzaW9uKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEFjY2Vzc29yeUZpbHRlciBmKSB7Ci0gICAgICAgICAgICBpZiAobU1hbnVmYWN0dXJlciAhPSBudWxsICYmICFmLm1NYW51ZmFjdHVyZXIuZXF1YWxzKG1NYW51ZmFjdHVyZXIpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobU1vZGVsICE9IG51bGwgJiYgIWYubU1vZGVsLmVxdWFscyhtTW9kZWwpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobVZlcnNpb24gIT0gbnVsbCAmJiAhZi5tVmVyc2lvbi5lcXVhbHMobVZlcnNpb24pKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgLy8gY2FuJ3QgY29tcGFyZSBpZiB3ZSBoYXZlIHdpbGRjYXJkIHN0cmluZ3MKLSAgICAgICAgICAgIGlmIChtTWFudWZhY3R1cmVyID09IG51bGwgfHwgbU1vZGVsID09IG51bGwgfHwgbVZlcnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBY2Nlc3NvcnlGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyID0gKEFjY2Vzc29yeUZpbHRlcilvYmo7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtTWFudWZhY3R1cmVyLmVxdWFscyhmaWx0ZXIubU1hbnVmYWN0dXJlcikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2RlbC5lcXVhbHMoZmlsdGVyLm1Nb2RlbCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WZXJzaW9uLmVxdWFscyhmaWx0ZXIubVZlcnNpb24pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBVc2JBY2Nlc3NvcnkpIHsKLSAgICAgICAgICAgICAgICBVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5ID0gKFVzYkFjY2Vzc29yeSlvYmo7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtTWFudWZhY3R1cmVyLmVxdWFscyhhY2Nlc3NvcnkuZ2V0TWFudWZhY3R1cmVyKCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtTW9kZWwuZXF1YWxzKGFjY2Vzc29yeS5nZXRNb2RlbCgpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnNpb24uZXF1YWxzKGFjY2Vzc29yeS5nZXRWZXJzaW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuICgobU1hbnVmYWN0dXJlciA9PSBudWxsID8gMCA6IG1NYW51ZmFjdHVyZXIuaGFzaENvZGUoKSkgXgotICAgICAgICAgICAgICAgICAgICAobU1vZGVsID09IG51bGwgPyAwIDogbU1vZGVsLmhhc2hDb2RlKCkpIF4KLSAgICAgICAgICAgICAgICAgICAgKG1WZXJzaW9uID09IG51bGwgPyAwIDogbVZlcnNpb24uaGFzaENvZGUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkFjY2Vzc29yeUZpbHRlclttTWFudWZhY3R1cmVyPVwiIiArIG1NYW51ZmFjdHVyZXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIsIG1Nb2RlbD1cIiIgKyBtTW9kZWwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIsIG1WZXJzaW9uPVwiIiArIG1WZXJzaW9uICsgIlwiXSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE15UGFja2FnZU1vbml0b3IgZXh0ZW5kcyBQYWNrYWdlTW9uaXRvciB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25QYWNrYWdlQWRkZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgICAgICBoYW5kbGVQYWNrYWdlVXBkYXRlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGFja2FnZUNoYW5nZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgdWlkLCBTdHJpbmdbXSBjb21wb25lbnRzKSB7Ci0gICAgICAgICAgICBoYW5kbGVQYWNrYWdlVXBkYXRlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGFja2FnZVJlbW92ZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgICAgICBjbGVhckRlZmF1bHRzKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBNeVBhY2thZ2VNb25pdG9yIG1QYWNrYWdlTW9uaXRvciA9IG5ldyBNeVBhY2thZ2VNb25pdG9yKCk7Ci0KLSAgICBwdWJsaWMgVXNiRGV2aWNlU2V0dGluZ3NNYW5hZ2VyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmVhZFNldHRpbmdzTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVBhY2thZ2VNb25pdG9yLnJlZ2lzdGVyKGNvbnRleHQsIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkUHJlZmVyZW5jZShYbWxQdWxsUGFyc2VyIHBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7Ci0gICAgICAgIGludCBjb3VudCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlmICgicGFja2FnZSIuZXF1YWxzKHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lKGkpKSkgewotICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7Ci0gICAgICAgIGlmICgidXNiLWRldmljZSIuZXF1YWxzKHBhcnNlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBEZXZpY2VGaWx0ZXIgZmlsdGVyID0gRGV2aWNlRmlsdGVyLnJlYWQocGFyc2VyKTsKLSAgICAgICAgICAgIG1EZXZpY2VQcmVmZXJlbmNlTWFwLnB1dChmaWx0ZXIsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmICgidXNiLWFjY2Vzc29yeSIuZXF1YWxzKHBhcnNlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyID0gQWNjZXNzb3J5RmlsdGVyLnJlYWQocGFyc2VyKTsKLSAgICAgICAgICAgIG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLnB1dChmaWx0ZXIsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBYbWxVdGlscy5uZXh0RWxlbWVudChwYXJzZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkU2V0dGluZ3NMb2NrZWQoKSB7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzU2V0dGluZ3NGaWxlKTsKLSAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gWG1sLm5ld1B1bGxQYXJzZXIoKTsKLSAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChzdHJlYW0sIG51bGwpOwotCi0gICAgICAgICAgICBYbWxVdGlscy5uZXh0RWxlbWVudChwYXJzZXIpOwotICAgICAgICAgICAgd2hpbGUgKHBhcnNlci5nZXRFdmVudFR5cGUoKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0YWdOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoInByZWZlcmVuY2UiLmVxdWFscyh0YWdOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZWFkUHJlZmVyZW5jZShwYXJzZXIpOwotICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5uZXh0RWxlbWVudChwYXJzZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgInNldHRpbmdzIGZpbGUgbm90IGZvdW5kIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciByZWFkaW5nIHNldHRpbmdzIGZpbGUsIGRlbGV0aW5nIHRvIHN0YXJ0IGZyZXNoIiwgZSk7Ci0gICAgICAgICAgICBzU2V0dGluZ3NGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVNldHRpbmdzTG9ja2VkKCkgewotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZzdHIgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzU2V0dGluZ3NGaWxlKTsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIndyaXRpbmcgc2V0dGluZ3MgdG8gIiArIGZzdHIpOwotICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gc3RyID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZzdHIpOwotICAgICAgICAgICAgRmFzdFhtbFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBGYXN0WG1sU2VyaWFsaXplcigpOwotICAgICAgICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXQoc3RyLCAidXRmLTgiKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnREb2N1bWVudChudWxsLCB0cnVlKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbHB1bGwub3JnL3YxL2RvYy9mZWF0dXJlcy5odG1sI2luZGVudC1vdXRwdXQiLCB0cnVlKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgInNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGZvciAoRGV2aWNlRmlsdGVyIGZpbHRlciA6IG1EZXZpY2VQcmVmZXJlbmNlTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhudWxsLCAicHJlZmVyZW5jZSIpOwotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJwYWNrYWdlIiwgbURldmljZVByZWZlcmVuY2VNYXAuZ2V0KGZpbHRlcikpOwotICAgICAgICAgICAgICAgIGZpbHRlci53cml0ZShzZXJpYWxpemVyKTsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhudWxsLCAicHJlZmVyZW5jZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKEFjY2Vzc29yeUZpbHRlciBmaWx0ZXIgOiBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgInByZWZlcmVuY2UiKTsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAicGFja2FnZSIsIG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmdldChmaWx0ZXIpKTsKLSAgICAgICAgICAgICAgICBmaWx0ZXIud3JpdGUoc2VyaWFsaXplcik7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcobnVsbCwgInByZWZlcmVuY2UiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcobnVsbCwgInNldHRpbmdzIik7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLmVuZERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIHN0ci5mbHVzaCgpOwotICAgICAgICAgICAgRmlsZVV0aWxzLnN5bmMoZnN0cik7Ci0gICAgICAgICAgICBzdHIuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImVycm9yIHdyaXRpbmcgc2V0dGluZ3MgZmlsZSwgZGVsZXRpbmcgdG8gc3RhcnQgZnJlc2giLCBlKTsKLSAgICAgICAgICAgIHNTZXR0aW5nc0ZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVja3MgdG8gc2VlIGlmIGEgcGFja2FnZSBtYXRjaGVzIGEgZGV2aWNlIG9yIGFjY2Vzc29yeS4KLSAgICAvLyBPbmx5IG9uZSBvZiBkZXZpY2UgYW5kIGFjY2Vzc29yeSBzaG91bGQgYmUgbm9uLW51bGwuCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhY2thZ2VNYXRjaGVzTG9ja2VkKFJlc29sdmVJbmZvIGluZm8sIFN0cmluZyBtZXRhRGF0YU5hbWUsCi0gICAgICAgICAgICBVc2JEZXZpY2UgZGV2aWNlLCBVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5KSB7Ci0gICAgICAgIEFjdGl2aXR5SW5mbyBhaSA9IGluZm8uYWN0aXZpdHlJbmZvOwotCi0gICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIgPSBhaS5sb2FkWG1sTWV0YURhdGEobVBhY2thZ2VNYW5hZ2VyLCBtZXRhRGF0YU5hbWUpOwotICAgICAgICAgICAgaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAibm8gbWV0YS1kYXRhIGZvciAiICsgaW5mbyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYbWxVdGlscy5uZXh0RWxlbWVudChwYXJzZXIpOwotICAgICAgICAgICAgd2hpbGUgKHBhcnNlci5nZXRFdmVudFR5cGUoKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0YWdOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwgJiYgInVzYi1kZXZpY2UiLmVxdWFscyh0YWdOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBEZXZpY2VGaWx0ZXIgZmlsdGVyID0gRGV2aWNlRmlsdGVyLnJlYWQocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5tYXRjaGVzKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjY2Vzc29yeSAhPSBudWxsICYmICJ1c2ItYWNjZXNzb3J5Ii5lcXVhbHModGFnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA9IEFjY2Vzc29yeUZpbHRlci5yZWFkKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhhY2Nlc3NvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYbWxVdGlscy5uZXh0RWxlbWVudChwYXJzZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIGxvYWQgY29tcG9uZW50IGluZm8gIiArIGluZm8udG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gZ2V0RGV2aWNlTWF0Y2hlc0xvY2tlZChVc2JEZXZpY2UgZGV2aWNlLCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+KCk7Ci0gICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IHJlc29sdmVJbmZvcyA9IG1QYWNrYWdlTWFuYWdlci5xdWVyeUludGVudEFjdGl2aXRpZXMoaW50ZW50LAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBpbnQgY291bnQgPSByZXNvbHZlSW5mb3Muc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gcmVzb2x2ZUluZm9zLmdldChpKTsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlTWF0Y2hlc0xvY2tlZChyZXNvbHZlSW5mbywgaW50ZW50LmdldEFjdGlvbigpLCBkZXZpY2UsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQocmVzb2x2ZUluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXRjaGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlc29sdmVJbmZvPiBnZXRBY2Nlc3NvcnlNYXRjaGVzTG9ja2VkKAotICAgICAgICAgICAgVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSwgSW50ZW50IGludGVudCkgewotICAgICAgICBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0PFJlc29sdmVJbmZvPigpOwotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiByZXNvbHZlSW5mb3MgPSBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRBY3Rpdml0aWVzKGludGVudCwKLSAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKLSAgICAgICAgaW50IGNvdW50ID0gcmVzb2x2ZUluZm9zLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IHJlc29sdmVJbmZvcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZU1hdGNoZXNMb2NrZWQocmVzb2x2ZUluZm8sIGludGVudC5nZXRBY3Rpb24oKSwgbnVsbCwgYWNjZXNzb3J5KSkgewotICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKHJlc29sdmVJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF0Y2hlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXZpY2VBdHRhY2hlZChVc2JEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9ERVZJQ0VfQVRUQUNIRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9ERVZJQ0UsIGRldmljZSk7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PFJlc29sdmVJbmZvPiBtYXRjaGVzOwotICAgICAgICBTdHJpbmcgZGVmYXVsdFBhY2thZ2U7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1hdGNoZXMgPSBnZXREZXZpY2VNYXRjaGVzTG9ja2VkKGRldmljZSwgaW50ZW50KTsKLSAgICAgICAgICAgIC8vIExhdW5jaCBvdXIgZGVmYXVsdCBhY3Rpdml0eSBkaXJlY3RseSwgaWYgd2UgaGF2ZSBvbmUuCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2Ugd2lsbCBzdGFydCB0aGUgVXNiUmVzb2x2ZXJBY3Rpdml0eSB0byBhbGxvdyB0aGUgdXNlciB0byBjaG9vc2UuCi0gICAgICAgICAgICBkZWZhdWx0UGFja2FnZSA9IG1EZXZpY2VQcmVmZXJlbmNlTWFwLmdldChuZXcgRGV2aWNlRmlsdGVyKGRldmljZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzb2x2ZUFjdGl2aXR5KGludGVudCwgbWF0Y2hlcywgZGVmYXVsdFBhY2thZ2UsIGRldmljZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGV2aWNlRGV0YWNoZWQoVXNiRGV2aWNlIGRldmljZSkgewotICAgICAgICAvLyBjbGVhciB0ZW1wb3JhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBkZXZpY2UKLSAgICAgICAgbURldmljZVBlcm1pc3Npb25NYXAucmVtb3ZlKGRldmljZS5nZXREZXZpY2VOYW1lKCkpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9ERVZJQ0VfREVUQUNIRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9ERVZJQ0UsIGRldmljZSk7Ci0gICAgICAgIExvZy5kKFRBRywgInVzYkRldmljZVJlbW92ZWQsIHNlbmRpbmcgIiArIGludGVudCk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2Nlc3NvcnlBdHRhY2hlZChVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5KSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9BQ0NFU1NPUllfQVRUQUNIRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PFJlc29sdmVJbmZvPiBtYXRjaGVzOwotICAgICAgICBTdHJpbmcgZGVmYXVsdFBhY2thZ2U7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1hdGNoZXMgPSBnZXRBY2Nlc3NvcnlNYXRjaGVzTG9ja2VkKGFjY2Vzc29yeSwgaW50ZW50KTsKLSAgICAgICAgICAgIC8vIExhdW5jaCBvdXIgZGVmYXVsdCBhY3Rpdml0eSBkaXJlY3RseSwgaWYgd2UgaGF2ZSBvbmUuCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2Ugd2lsbCBzdGFydCB0aGUgVXNiUmVzb2x2ZXJBY3Rpdml0eSB0byBhbGxvdyB0aGUgdXNlciB0byBjaG9vc2UuCi0gICAgICAgICAgICBkZWZhdWx0UGFja2FnZSA9IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmdldChuZXcgQWNjZXNzb3J5RmlsdGVyKGFjY2Vzc29yeSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzb2x2ZUFjdGl2aXR5KGludGVudCwgbWF0Y2hlcywgZGVmYXVsdFBhY2thZ2UsIG51bGwsIGFjY2Vzc29yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXNzb3J5RGV0YWNoZWQoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgewotICAgICAgICAvLyBjbGVhciB0ZW1wb3JhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBhY2Nlc3NvcnkKLSAgICAgICAgbUFjY2Vzc29yeVBlcm1pc3Npb25NYXAucmVtb3ZlKGFjY2Vzc29yeSk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoCi0gICAgICAgICAgICAgICAgVXNiTWFuYWdlci5BQ1RJT05fVVNCX0FDQ0VTU09SWV9ERVRBQ0hFRCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0FDQ0VTU09SWSwgYWNjZXNzb3J5KTsKLSAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXNvbHZlQWN0aXZpdHkoSW50ZW50IGludGVudCwgQXJyYXlMaXN0PFJlc29sdmVJbmZvPiBtYXRjaGVzLAotICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlLCBVc2JEZXZpY2UgZGV2aWNlLCBVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5KSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1hdGNoZXMuc2l6ZSgpOwotCi0gICAgICAgIC8vIGRvbid0IHNob3cgdGhlIHJlc29sdmVyIGFjdGl2aXR5IGlmIHRoZXJlIGFyZSBubyBjaG9pY2VzIGF2YWlsYWJsZQotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgaWYgKGFjY2Vzc29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGFjY2Vzc29yeS5nZXRVcmkoKTsKLSAgICAgICAgICAgICAgICBpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IFVSSSB0byB1c2VyCi0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IFVzYlJlc29sdmVyQWN0aXZpdHkgc28gdXNlciBjYW4gY2hvb3NlIGFuIGFjdGl2aXR5Ci0gICAgICAgICAgICAgICAgICAgIEludGVudCBkaWFsb2dJbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0ludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLnN5c3RlbXVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc3lzdGVtdWkudXNiLlVzYkFjY2Vzc29yeVVyaUFjdGl2aXR5Iik7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0ludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0ludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0FDQ0VTU09SWSwgYWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nSW50ZW50LnB1dEV4dHJhKCJ1cmkiLCB1cmkpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShkaWFsb2dJbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInVuYWJsZSB0byBzdGFydCBVc2JBY2Nlc3NvcnlVcmlBY3Rpdml0eSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBSZXNvbHZlSW5mbyBkZWZhdWx0UkkgPSBudWxsOwotICAgICAgICBpZiAoY291bnQgPT0gMSAmJiBkZWZhdWx0UGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgb3VyIHNpbmdsZSBjaG9pY2UgaXMgb24gdGhlIHN5c3RlbSBwYXJ0aXRpb24uCi0gICAgICAgICAgICAvLyBJZiBzbywgdHJlYXQgaXQgYXMgb3VyIGRlZmF1bHQgd2l0aG91dCBjYWxsaW5nIFVzYlJlc29sdmVyQWN0aXZpdHkKLSAgICAgICAgICAgIFJlc29sdmVJbmZvIHJJbmZvID0gbWF0Y2hlcy5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAockluZm8uYWN0aXZpdHlJbmZvICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgckluZm8uYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mbyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIChySW5mby5hY3Rpdml0eUluZm8uYXBwbGljYXRpb25JbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1lTVEVNKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFJJID0gckluZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVmYXVsdFJJID09IG51bGwgJiYgZGVmYXVsdFBhY2thZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbG9vayBmb3IgZGVmYXVsdCBhY3Rpdml0eQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUmVzb2x2ZUluZm8gckluZm8gPSBtYXRjaGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAockluZm8uYWN0aXZpdHlJbmZvICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQYWNrYWdlLmVxdWFscyhySW5mby5hY3Rpdml0eUluZm8ucGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRSSSA9IHJJbmZvOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVmYXVsdFJJICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGdyYW50IHBlcm1pc3Npb24gZm9yIGRlZmF1bHQgYWN0aXZpdHkKLSAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdyYW50RGV2aWNlUGVybWlzc2lvbihkZXZpY2UsIGRlZmF1bHRSSS5hY3Rpdml0eUluZm8uYXBwbGljYXRpb25JbmZvLnVpZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjY2Vzc29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZ3JhbnRBY2Nlc3NvcnlQZXJtaXNzaW9uKGFjY2Vzc29yeSwgZGVmYXVsdFJJLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8udWlkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc3RhcnQgZGVmYXVsdCBhY3Rpdml0eSBkaXJlY3RseQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoZGVmYXVsdFJJLmFjdGl2aXR5SW5mby5wYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFJJLmFjdGl2aXR5SW5mby5uYW1lKSk7Ci0gICAgICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic3RhcnRBY3Rpdml0eSBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEludGVudCByZXNvbHZlckludGVudCA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgICAgIHJlc29sdmVySW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLQotICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAvLyBzdGFydCBVc2JDb25maXJtQWN0aXZpdHkgaWYgdGhlcmUgaXMgb25seSBvbmUgY2hvaWNlCi0gICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5zeXN0ZW11aSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc3lzdGVtdWkudXNiLlVzYkNvbmZpcm1BY3Rpdml0eSIpOwotICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnB1dEV4dHJhKCJyaW5mbyIsIG1hdGNoZXMuZ2V0KDApKTsKLQotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlckludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlckludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0FDQ0VTU09SWSwgYWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHN0YXJ0IFVzYlJlc29sdmVyQWN0aXZpdHkgc28gdXNlciBjYW4gY2hvb3NlIGFuIGFjdGl2aXR5Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5zeXN0ZW11aSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc3lzdGVtdWkudXNiLlVzYlJlc29sdmVyQWN0aXZpdHkiKTsKLSAgICAgICAgICAgICAgICByZXNvbHZlckludGVudC5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0RXh0cmEoInJsaXN0IiwgbWF0Y2hlcyk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0lOVEVOVCwgaW50ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShyZXNvbHZlckludGVudCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJ1bmFibGUgdG8gc3RhcnQgYWN0aXZpdHkgIiArIHJlc29sdmVySW50ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhckNvbXBhdGlibGVNYXRjaGVzTG9ja2VkKFN0cmluZyBwYWNrYWdlTmFtZSwgRGV2aWNlRmlsdGVyIGZpbHRlcikgewotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChEZXZpY2VGaWx0ZXIgdGVzdCA6IG1EZXZpY2VQcmVmZXJlbmNlTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXModGVzdCkpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlUHJlZmVyZW5jZU1hcC5yZW1vdmUodGVzdCk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNsZWFyQ29tcGF0aWJsZU1hdGNoZXNMb2NrZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICBmb3IgKEFjY2Vzc29yeUZpbHRlciB0ZXN0IDogbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyh0ZXN0KSkgewotICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLnJlbW92ZSh0ZXN0KTsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhbmdlZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUGFja2FnZVVwZGF0ZUxvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUsIEFjdGl2aXR5SW5mbyBhSW5mbywKLSAgICAgICAgICAgIFN0cmluZyBtZXRhRGF0YU5hbWUpIHsKLSAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlciA9IGFJbmZvLmxvYWRYbWxNZXRhRGF0YShtUGFja2FnZU1hbmFnZXIsIG1ldGFEYXRhTmFtZSk7Ci0gICAgICAgICAgICBpZiAocGFyc2VyID09IG51bGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKLSAgICAgICAgICAgIHdoaWxlIChwYXJzZXIuZ2V0RXZlbnRUeXBlKCkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFnTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCJ1c2ItZGV2aWNlIi5lcXVhbHModGFnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgRGV2aWNlRmlsdGVyIGZpbHRlciA9IERldmljZUZpbHRlci5yZWFkKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckNvbXBhdGlibGVNYXRjaGVzTG9ja2VkKHBhY2thZ2VOYW1lLCBmaWx0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgidXNiLWFjY2Vzc29yeSIuZXF1YWxzKHRhZ05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc29yeUZpbHRlciBmaWx0ZXIgPSBBY2Nlc3NvcnlGaWx0ZXIucmVhZChwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJDb21wYXRpYmxlTWF0Y2hlc0xvY2tlZChwYWNrYWdlTmFtZSwgZmlsdGVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBsb2FkIGNvbXBvbmVudCBpbmZvICIgKyBhSW5mby50b1N0cmluZygpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBwYWNrYWdlIHN1cHBvcnRzIGFueSBVU0IgZGV2aWNlcyBvciBhY2Nlc3Nvcmllcy4KLSAgICAvLyBJZiBzbywgY2xlYXIgYW55IG5vbi1tYXRjaGluZyBwcmVmZXJlbmNlcyBmb3IgbWF0Y2hpbmcgZGV2aWNlcy9hY2Nlc3Nvcmllcy4KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGFja2FnZVVwZGF0ZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgUGFja2FnZUluZm8gaW5mbzsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluZm8gPSBtUGFja2FnZU1hbmFnZXIuZ2V0UGFja2FnZUluZm8ocGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfQUNUSVZJVElFUyB8IFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJoYW5kbGVQYWNrYWdlVXBkYXRlIGNvdWxkIG5vdCBmaW5kIHBhY2thZ2UgIiArIHBhY2thZ2VOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjdGl2aXR5SW5mb1tdIGFjdGl2aXRpZXMgPSBpbmZvLmFjdGl2aXRpZXM7Ci0gICAgICAgICAgICBpZiAoYWN0aXZpdGllcyA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGl2aXRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgbWV0YS1kYXRhLCBib3RoIGZvciBkZXZpY2VzIGFuZCBhY2Nlc3NvcmllcwotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVQYWNrYWdlVXBkYXRlTG9ja2VkKHBhY2thZ2VOYW1lLCBhY3Rpdml0aWVzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgVXNiTWFuYWdlci5BQ1RJT05fVVNCX0RFVklDRV9BVFRBQ0hFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVQYWNrYWdlVXBkYXRlTG9ja2VkKHBhY2thZ2VOYW1lLCBhY3Rpdml0aWVzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgVXNiTWFuYWdlci5BQ1RJT05fVVNCX0FDQ0VTU09SWV9BVFRBQ0hFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAgICAgICAgIHdyaXRlU2V0dGluZ3NMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1Blcm1pc3Npb24oVXNiRGV2aWNlIGRldmljZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgdWlkTGlzdCA9IG1EZXZpY2VQZXJtaXNzaW9uTWFwLmdldChkZXZpY2UuZ2V0RGV2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgIGlmICh1aWRMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdWlkTGlzdC5nZXQoQmluZGVyLmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQZXJtaXNzaW9uKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IHVpZExpc3QgPSBtQWNjZXNzb3J5UGVybWlzc2lvbk1hcC5nZXQoYWNjZXNzb3J5KTsKLSAgICAgICAgICAgIGlmICh1aWRMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdWlkTGlzdC5nZXQoQmluZGVyLmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oVXNiRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoIWhhc1Blcm1pc3Npb24oZGV2aWNlKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJVc2VyIGhhcyBub3QgZ2l2ZW4gcGVybWlzc2lvbiB0byBkZXZpY2UgIiArIGRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgewotICAgICAgICBpZiAoIWhhc1Blcm1pc3Npb24oYWNjZXNzb3J5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJVc2VyIGhhcyBub3QgZ2l2ZW4gcGVybWlzc2lvbiB0byBhY2Nlc3NvcnkgIiArIGFjY2Vzc29yeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFBlcm1pc3Npb25EaWFsb2coSW50ZW50IGludGVudCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBQZW5kaW5nSW50ZW50IHBpKSB7Ci0gICAgICAgIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgdWlkIHdpdGggcGFja2FnZU5hbWUgdG8gZm9pbCBhcHBzIHByZXRlbmRpbmcgdG8gYmUgc29tZW9uZSBlbHNlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcHBsaWNhdGlvbkluZm8gYUluZm8gPSBtUGFja2FnZU1hbmFnZXIuZ2V0QXBwbGljYXRpb25JbmZvKHBhY2thZ2VOYW1lLCAwKTsKLSAgICAgICAgICAgIGlmIChhSW5mby51aWQgIT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBtYXRjaCBjYWxsZXIncyB1aWQgIiArIHVpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICIgbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGlkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLnN5c3RlbXVpIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc3lzdGVtdWkudXNiLlVzYlBlcm1pc3Npb25BY3Rpdml0eSIpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0lOVEVOVCwgcGkpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoInBhY2thZ2UiLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgidWlkIiwgdWlkKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJ1bmFibGUgdG8gc3RhcnQgVXNiUGVybWlzc2lvbkFjdGl2aXR5Iik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0UGVybWlzc2lvbihVc2JEZXZpY2UgZGV2aWNlLCBTdHJpbmcgcGFja2FnZU5hbWUsIFBlbmRpbmdJbnRlbnQgcGkpIHsKLSAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0KLSAgICAgICAgLy8gcmVzcG9uZCBpbW1lZGlhdGVseSBpZiBwZXJtaXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gZ3JhbnRlZAotICAgICAgaWYgKGhhc1Blcm1pc3Npb24oZGV2aWNlKSkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfUEVSTUlTU0lPTl9HUkFOVEVELCB0cnVlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGkuc2VuZChtQ29udGV4dCwgMCwgaW50ZW50KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInJlcXVlc3RQZXJtaXNzaW9uIFBlbmRpbmdJbnRlbnQgd2FzIGNhbmNlbGxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc3RhcnQgVXNiUGVybWlzc2lvbkFjdGl2aXR5IHNvIHVzZXIgY2FuIGNob29zZSBhbiBhY3Rpdml0eQotICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9ERVZJQ0UsIGRldmljZSk7Ci0gICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uRGlhbG9nKGludGVudCwgcGFja2FnZU5hbWUsIHBpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0UGVybWlzc2lvbihVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5LCBTdHJpbmcgcGFja2FnZU5hbWUsIFBlbmRpbmdJbnRlbnQgcGkpIHsKLSAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0KLSAgICAgICAgLy8gcmVzcG9uZCBpbW1lZGlhdGVseSBpZiBwZXJtaXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gZ3JhbnRlZAotICAgICAgICBpZiAoaGFzUGVybWlzc2lvbihhY2Nlc3NvcnkpKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9QRVJNSVNTSU9OX0dSQU5URUQsIHRydWUpOwotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBpLnNlbmQobUNvbnRleHQsIDAsIGludGVudCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZXF1ZXN0UGVybWlzc2lvbiBQZW5kaW5nSW50ZW50IHdhcyBjYW5jZWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0FDQ0VTU09SWSwgYWNjZXNzb3J5KTsKLSAgICAgICAgcmVxdWVzdFBlcm1pc3Npb25EaWFsb2coaW50ZW50LCBwYWNrYWdlTmFtZSwgcGkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERldmljZVBhY2thZ2UoVXNiRGV2aWNlIGRldmljZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIERldmljZUZpbHRlciBmaWx0ZXIgPSBuZXcgRGV2aWNlRmlsdGVyKGRldmljZSk7Ci0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAobURldmljZVByZWZlcmVuY2VNYXAucmVtb3ZlKGZpbHRlcikgIT0gbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAhcGFja2FnZU5hbWUuZXF1YWxzKG1EZXZpY2VQcmVmZXJlbmNlTWFwLmdldChmaWx0ZXIpKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlUHJlZmVyZW5jZU1hcC5wdXQoZmlsdGVyLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNldHRpbmdzTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcnlQYWNrYWdlKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnksIFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyID0gbmV3IEFjY2Vzc29yeUZpbHRlcihhY2Nlc3NvcnkpOwotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gKG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLnJlbW92ZShmaWx0ZXIpICE9IG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gIXBhY2thZ2VOYW1lLmVxdWFscyhtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5nZXQoZmlsdGVyKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAucHV0KGZpbHRlciwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTZXR0aW5nc0xvY2tlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ3JhbnREZXZpY2VQZXJtaXNzaW9uKFVzYkRldmljZSBkZXZpY2UsIGludCB1aWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgU3RyaW5nIGRldmljZU5hbWUgPSBkZXZpY2UuZ2V0RGV2aWNlTmFtZSgpOwotICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IHVpZExpc3QgPSBtRGV2aWNlUGVybWlzc2lvbk1hcC5nZXQoZGV2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAodWlkTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdWlkTGlzdCA9IG5ldyBTcGFyc2VCb29sZWFuQXJyYXkoMSk7Ci0gICAgICAgICAgICAgICAgbURldmljZVBlcm1pc3Npb25NYXAucHV0KGRldmljZU5hbWUsIHVpZExpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWlkTGlzdC5wdXQodWlkLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdyYW50QWNjZXNzb3J5UGVybWlzc2lvbihVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5LCBpbnQgdWlkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSB1aWRMaXN0ID0gbUFjY2Vzc29yeVBlcm1pc3Npb25NYXAuZ2V0KGFjY2Vzc29yeSk7Ci0gICAgICAgICAgICBpZiAodWlkTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdWlkTGlzdCA9IG5ldyBTcGFyc2VCb29sZWFuQXJyYXkoMSk7Ci0gICAgICAgICAgICAgICAgbUFjY2Vzc29yeVBlcm1pc3Npb25NYXAucHV0KGFjY2Vzc29yeSwgdWlkTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aWRMaXN0LnB1dCh1aWQsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRGVmYXVsdHMoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtRGV2aWNlUHJlZmVyZW5jZU1hcC52YWx1ZXMoKS5jb250YWlucyhwYWNrYWdlTmFtZSkpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLnZhbHVlcygpLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhckRlZmF1bHRzKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoY2xlYXJQYWNrYWdlRGVmYXVsdHNMb2NrZWQocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTZXR0aW5nc0xvY2tlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNsZWFyUGFja2FnZURlZmF1bHRzTG9ja2VkKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBib29sZWFuIGNsZWFyZWQgPSBmYWxzZTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1EZXZpY2VQcmVmZXJlbmNlTWFwLmNvbnRhaW5zVmFsdWUocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgdGhlIGtleSBzZXQgdG8gYXZvaWQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIE9iamVjdFtdIGtleXMgPSBtRGV2aWNlUHJlZmVyZW5jZU1hcC5rZXlTZXQoKS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBrZXlzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKG1EZXZpY2VQcmVmZXJlbmNlTWFwLmdldChrZXkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZVByZWZlcmVuY2VNYXAucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5jb250YWluc1ZhbHVlKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBjb3B5IG9mIHRoZSBrZXkgc2V0IHRvIGF2b2lkIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLSAgICAgICAgICAgICAgICBPYmplY3RbXSBrZXlzID0gbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAua2V5U2V0KCkudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0ga2V5c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5nZXQoa2V5KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xlYXJlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgRGV2aWNlIHBlcm1pc3Npb25zOiIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgZGV2aWNlTmFtZSA6IG1EZXZpY2VQZXJtaXNzaW9uTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgICAiICsgZGV2aWNlTmFtZSArICI6ICIpOwotICAgICAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSB1aWRMaXN0ID0gbURldmljZVBlcm1pc3Npb25NYXAuZ2V0KGRldmljZU5hbWUpOwotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHVpZExpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvU3RyaW5nKHVpZExpc3Qua2V5QXQoaSkpICsgIiAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbigiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIEFjY2Vzc29yeSBwZXJtaXNzaW9uczoiKTsKLSAgICAgICAgICAgIGZvciAoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSA6IG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgICAiICsgYWNjZXNzb3J5ICsgIjogIik7Ci0gICAgICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IHVpZExpc3QgPSBtQWNjZXNzb3J5UGVybWlzc2lvbk1hcC5nZXQoYWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSB1aWRMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoSW50ZWdlci50b1N0cmluZyh1aWRMaXN0LmtleUF0KGkpKSArICIgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHcucHJpbnRsbigiICBEZXZpY2UgcHJlZmVyZW5jZXM6Iik7Ci0gICAgICAgICAgICBmb3IgKERldmljZUZpbHRlciBmaWx0ZXIgOiBtRGV2aWNlUHJlZmVyZW5jZU1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAiICsgZmlsdGVyICsgIjogIiArIG1EZXZpY2VQcmVmZXJlbmNlTWFwLmdldChmaWx0ZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgQWNjZXNzb3J5IHByZWZlcmVuY2VzOiIpOwotICAgICAgICAgICAgZm9yIChBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyIDogbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgIiArIGZpbHRlciArICI6ICIgKyBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5nZXQoZmlsdGVyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiSG9zdE1hbmFnZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JIb3N0TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2IwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiSG9zdE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbgorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIudXNiOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuSVVzYk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkRldmljZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JFbmRwb2ludDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlVFdmVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFVzYkhvc3RNYW5hZ2VyIG1hbmFnZXMgVVNCIHN0YXRlIGluIGhvc3QgbW9kZS4KKyAqLworcHVibGljIGNsYXNzIFVzYkhvc3RNYW5hZ2VyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gVXNiSG9zdE1hbmFnZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HID0gZmFsc2U7CisKKyAgICAvLyBjb250YWlucyBhbGwgY29ubmVjdGVkIFVTQiBkZXZpY2VzCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZyxVc2JEZXZpY2U+IG1EZXZpY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFVzYkRldmljZT4oKTsKKworICAgIC8vIFVTQiBidXNzZXMgdG8gZXhjbHVkZSBmcm9tIFVTQiBob3N0IHN1cHBvcnQKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1Ib3N0QmxhY2tsaXN0OworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgVXNiU2V0dGluZ3NNYW5hZ2VyIG1TZXR0aW5nc01hbmFnZXI7CisKKyAgICBwdWJsaWMgVXNiSG9zdE1hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBVc2JTZXR0aW5nc01hbmFnZXIgc2V0dGluZ3NNYW5hZ2VyKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVNldHRpbmdzTWFuYWdlciA9IHNldHRpbmdzTWFuYWdlcjsKKyAgICAgICAgbUhvc3RCbGFja2xpc3QgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3VzYkhvc3RCbGFja2xpc3QpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0JsYWNrTGlzdGVkKFN0cmluZyBkZXZpY2VOYW1lKSB7CisgICAgICAgIGludCBjb3VudCA9IG1Ib3N0QmxhY2tsaXN0Lmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlTmFtZS5zdGFydHNXaXRoKG1Ib3N0QmxhY2tsaXN0W2ldKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiByZXR1cm5zIHRydWUgaWYgdGhlIFVTQiBkZXZpY2Ugc2hvdWxkIG5vdCBiZSBhY2Nlc3NpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0JsYWNrTGlzdGVkKGludCBjbGF6eiwgaW50IHN1YkNsYXNzLCBpbnQgcHJvdG9jb2wpIHsKKyAgICAgICAgLy8gYmxhY2tsaXN0IGh1YnMKKyAgICAgICAgaWYgKGNsYXp6ID09IFVzYkNvbnN0YW50cy5VU0JfQ0xBU1NfSFVCKSByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBibGFja2xpc3QgSElEIGJvb3QgZGV2aWNlcyAobW91c2UgYW5kIGtleWJvYXJkKQorICAgICAgICBpZiAoY2xhenogPT0gVXNiQ29uc3RhbnRzLlVTQl9DTEFTU19ISUQgJiYKKyAgICAgICAgICAgICAgICBzdWJDbGFzcyA9PSBVc2JDb25zdGFudHMuVVNCX0lOVEVSRkFDRV9TVUJDTEFTU19CT09UKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiBDYWxsZWQgZnJvbSBKTkkgaW4gbW9uaXRvclVzYkhvc3RCdXMoKSB0byByZXBvcnQgbmV3IFVTQiBkZXZpY2VzICovCisgICAgcHJpdmF0ZSB2b2lkIHVzYkRldmljZUFkZGVkKFN0cmluZyBkZXZpY2VOYW1lLCBpbnQgdmVuZG9ySUQsIGludCBwcm9kdWN0SUQsCisgICAgICAgICAgICBpbnQgZGV2aWNlQ2xhc3MsIGludCBkZXZpY2VTdWJjbGFzcywgaW50IGRldmljZVByb3RvY29sLAorICAgICAgICAgICAgLyogYXJyYXkgb2YgcXVpbnR1cGxlcyBjb250YWluaW5nIGlkLCBjbGFzcywgc3ViY2xhc3MsIHByb3RvY29sCisgICAgICAgICAgICAgICBhbmQgbnVtYmVyIG9mIGVuZHBvaW50cyBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KKyAgICAgICAgICAgIGludFtdIGludGVyZmFjZVZhbHVlcywKKyAgICAgICAgICAgLyogYXJyYXkgb2YgcXVhZHJ1cGxlcyBjb250YWluaW5nIGFkZHJlc3MsIGF0dHJpYnV0ZXMsIG1heCBwYWNrZXQgc2l6ZQorICAgICAgICAgICAgICBhbmQgaW50ZXJ2YWwgZm9yIGVhY2ggZW5kcG9pbnQgKi8KKyAgICAgICAgICAgIGludFtdIGVuZHBvaW50VmFsdWVzKSB7CisKKyAgICAgICAgaWYgKGlzQmxhY2tMaXN0ZWQoZGV2aWNlTmFtZSkgfHwKKyAgICAgICAgICAgICAgICBpc0JsYWNrTGlzdGVkKGRldmljZUNsYXNzLCBkZXZpY2VTdWJjbGFzcywgZGV2aWNlUHJvdG9jb2wpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobURldmljZXMuZ2V0KGRldmljZU5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJkZXZpY2UgYWxyZWFkeSBvbiBtRGV2aWNlcyBsaXN0OiAiICsgZGV2aWNlTmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbnVtSW50ZXJmYWNlcyA9IGludGVyZmFjZVZhbHVlcy5sZW5ndGggLyA1OworICAgICAgICAgICAgUGFyY2VsYWJsZVtdIGludGVyZmFjZXMgPSBuZXcgVXNiSW50ZXJmYWNlW251bUludGVyZmFjZXNdOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyByZXBhY2thZ2UgaW50ZXJmYWNlVmFsdWVzIGFzIGFuIGFycmF5IG9mIFVzYkludGVyZmFjZQorICAgICAgICAgICAgICAgIGludCBpbnRmLCBlbmRwLCBpdmFsID0gMCwgZXZhbCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnRmID0gMDsgaW50ZiA8IG51bUludGVyZmFjZXM7IGludGYrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJmYWNlSWQgPSBpbnRlcmZhY2VWYWx1ZXNbaXZhbCsrXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGludGVyZmFjZUNsYXNzID0gaW50ZXJmYWNlVmFsdWVzW2l2YWwrK107CisgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcmZhY2VTdWJjbGFzcyA9IGludGVyZmFjZVZhbHVlc1tpdmFsKytdOworICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJmYWNlUHJvdG9jb2wgPSBpbnRlcmZhY2VWYWx1ZXNbaXZhbCsrXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bUVuZHBvaW50cyA9IGludGVyZmFjZVZhbHVlc1tpdmFsKytdOworCisgICAgICAgICAgICAgICAgICAgIFBhcmNlbGFibGVbXSBlbmRwb2ludHMgPSBuZXcgVXNiRW5kcG9pbnRbbnVtRW5kcG9pbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChlbmRwID0gMDsgZW5kcCA8IG51bUVuZHBvaW50czsgZW5kcCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkcmVzcyA9IGVuZHBvaW50VmFsdWVzW2V2YWwrK107CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlcyA9IGVuZHBvaW50VmFsdWVzW2V2YWwrK107CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4UGFja2V0U2l6ZSA9IGVuZHBvaW50VmFsdWVzW2V2YWwrK107CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJ2YWwgPSBlbmRwb2ludFZhbHVlc1tldmFsKytdOworICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRzW2VuZHBdID0gbmV3IFVzYkVuZHBvaW50KGFkZHJlc3MsIGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhY2tldFNpemUsIGludGVydmFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFsbG93IGlmIGFueSBpbnRlcmZhY2VzIGFyZSBibGFja2xpc3RlZAorICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbGFja0xpc3RlZChpbnRlcmZhY2VDbGFzcywgaW50ZXJmYWNlU3ViY2xhc3MsIGludGVyZmFjZVByb3RvY29sKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZXNbaW50Zl0gPSBuZXcgVXNiSW50ZXJmYWNlKGludGVyZmFjZUlkLCBpbnRlcmZhY2VDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VTdWJjbGFzcywgaW50ZXJmYWNlUHJvdG9jb2wsIGVuZHBvaW50cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBiZXdhcmUgb2YgaW5kZXggb3V0IG9mIGJvdW5kIGV4Y2VwdGlvbnMsIHdoaWNoIG1pZ2h0IGhhcHBlbiBpZgorICAgICAgICAgICAgICAgIC8vIGEgZGV2aWNlIGRvZXMgbm90IHNldCBiTnVtRW5kcG9pbnRzIGNvcnJlY3RseQorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImVycm9yIHBhcnNpbmcgVVNCIGRlc2NyaXB0b3JzIiwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBVc2JEZXZpY2UgZGV2aWNlID0gbmV3IFVzYkRldmljZShkZXZpY2VOYW1lLCB2ZW5kb3JJRCwgcHJvZHVjdElELAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VDbGFzcywgZGV2aWNlU3ViY2xhc3MsIGRldmljZVByb3RvY29sLCBpbnRlcmZhY2VzKTsKKyAgICAgICAgICAgIG1EZXZpY2VzLnB1dChkZXZpY2VOYW1lLCBkZXZpY2UpOworICAgICAgICAgICAgbVNldHRpbmdzTWFuYWdlci5kZXZpY2VBdHRhY2hlZChkZXZpY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzIHRvIHJlcG9ydCBVU0IgZGV2aWNlIHJlbW92YWwgKi8KKyAgICBwcml2YXRlIHZvaWQgdXNiRGV2aWNlUmVtb3ZlZChTdHJpbmcgZGV2aWNlTmFtZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBVc2JEZXZpY2UgZGV2aWNlID0gbURldmljZXMucmVtb3ZlKGRldmljZU5hbWUpOworICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNldHRpbmdzTWFuYWdlci5kZXZpY2VEZXRhY2hlZChkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIHRocmVhZCB0byBjYWxsIGludG8gbmF0aXZlIGNvZGUgdG8gd2FpdCBmb3IgVVNCIGhvc3QgZXZlbnRzLgorICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgd2lsbCBjYWxsIHVzIGJhY2sgb24gdXNiRGV2aWNlQWRkZWQgYW5kIHVzYkRldmljZVJlbW92ZWQuCisgICAgICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIG1vbml0b3JVc2JIb3N0QnVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobnVsbCwgcnVubmFibGUsICJVc2JTZXJ2aWNlIGhvc3QgdGhyZWFkIikuc3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJldHVybnMgYSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYXR0YWNoZWQgVVNCIGRldmljZXMgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXREZXZpY2VMaXN0KEJ1bmRsZSBkZXZpY2VzKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBtRGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIGRldmljZXMucHV0UGFyY2VsYWJsZShuYW1lLCBtRGV2aWNlcy5nZXQobmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogT3BlbnMgdGhlIHNwZWNpZmllZCBVU0IgZGV2aWNlICovCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5EZXZpY2UoU3RyaW5nIGRldmljZU5hbWUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKGlzQmxhY2tMaXN0ZWQoZGV2aWNlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlVTQiBkZXZpY2UgaXMgb24gYSByZXN0cmljdGVkIGJ1cyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IG1EZXZpY2VzLmdldChkZXZpY2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIG5vdCBpbiBtRGV2aWNlcywgaXQgZWl0aGVyIGRvZXMgbm90IGV4aXN0IG9yIGlzIGJsYWNrbGlzdGVkCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXZpY2UgIiArIGRldmljZU5hbWUgKyAiIGRvZXMgbm90IGV4aXN0IG9yIGlzIHJlc3RyaWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlT3BlbkRldmljZShkZXZpY2VOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgVVNCIEhvc3QgU3RhdGU6Iik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbURldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgIiArIG5hbWUgKyAiOiAiICsgbURldmljZXMuZ2V0KG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbW9uaXRvclVzYkhvc3RCdXMoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBuYXRpdmVPcGVuRGV2aWNlKFN0cmluZyBkZXZpY2VOYW1lKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiU2VydmljZS5qYXZhCmluZGV4IGExNTFhZjAuLjIxZTU5OTdjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JTZXJ2aWNlLmphdmEKQEAgLTEwLDYwOCArMTAsMTQyIEBACiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW4KICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLnVzYjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5JVXNiTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JBY2Nlc3Nvcnk7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkRldmljZTsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JFbmRwb2ludDsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLm9zLlVFdmVudE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogVXNiU2VydmljZSBtb25pdG9ycyBmb3IgY2hhbmdlcyB0byBVU0Igc3RhdGUuCi0gKiBUaGlzIGluY2x1ZGVzIGNvZGUgZm9yIGJvdGggVVNCIGhvc3Qgc3VwcG9ydCAod2hlcmUgdGhlIGFuZHJvaWQgZGV2aWNlIGlzIHRoZSBob3N0KQotICogYXMgd2VsbCBhcyBVU0IgZGV2aWNlIHN1cHBvcnQgKGFuZHJvaWQgZGV2aWNlIGlzIGNvbm5lY3RlZCB0byBhIFVTQiBob3N0KS4KLSAqIEFjY2Vzc29yeSBtb2RlIGlzIGEgc3BlY2lhbCBjYXNlIG9mIFVTQiBkZXZpY2UgbW9kZSwgd2hlcmUgdGhlIGFuZHJvaWQgZGV2aWNlIGlzCi0gKiBjb25uZWN0ZWQgdG8gYSBVU0IgaG9zdCB0aGF0IHN1cHBvcnRzIHRoZSBhbmRyb2lkIGFjY2Vzc29yeSBwcm90b2NvbC4KKyAqIFVzYlNlcnZpY2UgbWFuYWdlcyBhbGwgVVNCIHJlbGF0ZWQgc3RhdGUsIGluY2x1ZGluZyBib3RoIGhvc3QgYW5kIGRldmljZSBzdXBwb3J0LgorICogSG9zdCByZWxhdGVkIGV2ZW50cyBhbmQgY2FsbHMgYXJlIGRlbGVnYXRlZCB0byBVc2JIb3N0TWFuYWdlciwgYW5kIGRldmljZSByZWxhdGVkCisgKiBzdXBwb3J0IGlzIGRlbGVnYXRlZCB0byBVc2JEZXZpY2VNYW5hZ2VyLgogICovCiBwdWJsaWMgY2xhc3MgVXNiU2VydmljZSBleHRlbmRzIElVc2JNYW5hZ2VyLlN0dWIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBVc2JTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPRyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9DT05ORUNURURfTUFUQ0ggPQotICAgICAgICAgICAgIkRFVlBBVEg9L2RldmljZXMvdmlydHVhbC9zd2l0Y2gvdXNiX2Nvbm5lY3RlZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9DT05GSUdVUkFUSU9OX01BVENIID0KLSAgICAgICAgICAgICJERVZQQVRIPS9kZXZpY2VzL3ZpcnR1YWwvc3dpdGNoL3VzYl9jb25maWd1cmF0aW9uIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0ZVTkNUSU9OU19NQVRDSCA9Ci0gICAgICAgICAgICAiREVWUEFUSD0vZGV2aWNlcy92aXJ0dWFsL3VzYl9jb21wb3NpdGUvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0NPTk5FQ1RFRF9QQVRIID0KLSAgICAgICAgICAgICIvc3lzL2NsYXNzL3N3aXRjaC91c2JfY29ubmVjdGVkL3N0YXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0NPTkZJR1VSQVRJT05fUEFUSCA9Ci0gICAgICAgICAgICAiL3N5cy9jbGFzcy9zd2l0Y2gvdXNiX2NvbmZpZ3VyYXRpb24vc3RhdGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0JfQ09NUE9TSVRFX0NMQVNTX1BBVEggPQotICAgICAgICAgICAgIi9zeXMvY2xhc3MvdXNiX2NvbXBvc2l0ZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9TVEFURSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19GVU5DVElPTl9FTkFCTEVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZVTkNUSU9OX0RJU0FCTEVEID0gMjsKLQotICAgIC8vIERlbGF5IGZvciBkZWJvdW5jaW5nIFVTQiBkaXNjb25uZWN0cy4KLSAgICAvLyBXZSBvZnRlbiBnZXQgcmFwaWQgY29ubmVjdC9kaXNjb25uZWN0IGV2ZW50cyB3aGVuIGVuYWJsaW5nIFVTQiBmdW5jdGlvbnMsCi0gICAgLy8gd2hpY2ggbmVlZCBkZWJvdW5jaW5nLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAxMDAwOwotCi0gICAgLy8gY3VycmVudCBjb25uZWN0ZWQgYW5kIGNvbmZpZ3VyYXRpb24gc3RhdGUKLSAgICBwcml2YXRlIGludCBtQ29ubmVjdGVkOwotICAgIHByaXZhdGUgaW50IG1Db25maWd1cmF0aW9uOwotCi0gICAgLy8gbGFzdCBicm9hZGNhc3RlZCBjb25uZWN0ZWQgYW5kIGNvbmZpZ3VyYXRpb24gc3RhdGUKLSAgICBwcml2YXRlIGludCBtTGFzdENvbm5lY3RlZCA9IC0xOwotICAgIHByaXZhdGUgaW50IG1MYXN0Q29uZmlndXJhdGlvbiA9IC0xOwotCi0gICAgLy8gbGlzdHMgb2YgZW5hYmxlZCBhbmQgZGlzYWJsZWQgVVNCIGZ1bmN0aW9ucyAoZm9yIFVTQiBkZXZpY2UgbW9kZSkKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1FbmFibGVkRnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRGlzYWJsZWRGdW5jdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgIC8vIGNvbnRhaW5zIGFsbCBjb25uZWN0ZWQgVVNCIGRldmljZXMgKGZvciBVU0IgaG9zdCBtb2RlKQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsVXNiRGV2aWNlPiBtRGV2aWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxVc2JEZXZpY2U+KCk7Ci0KLSAgICAvLyBVU0IgYnVzc2VzIHRvIGV4Y2x1ZGUgZnJvbSBVU0IgaG9zdCBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtSG9zdEJsYWNrbGlzdDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7Ci0KLSAgICBwcml2YXRlIFVzYkFjY2Vzc29yeSBtQ3VycmVudEFjY2Vzc29yeTsKLSAgICAvLyBVU0IgZnVuY3Rpb25zIHRoYXQgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgdG8gcmVzdG9yZSBhZnRlciBleGl0aW5nIGFjY2Vzc29yeSBtb2RlCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRGVmYXVsdEZ1bmN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgVXNiRGV2aWNlU2V0dGluZ3NNYW5hZ2VyIG1EZXZpY2VNYW5hZ2VyOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSGFzVXNiSG9zdDsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUhhc1VzYkFjY2Vzc29yeTsKKyAgICBwcml2YXRlIFVzYkRldmljZU1hbmFnZXIgbURldmljZU1hbmFnZXI7CisgICAgcHJpdmF0ZSBVc2JIb3N0TWFuYWdlciBtSG9zdE1hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBVc2JTZXR0aW5nc01hbmFnZXIgbVNldHRpbmdzTWFuYWdlcjsKIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCByZWFkQ3VycmVudEFjY2Vzc29yeUxvY2tlZCgpIHsKLSAgICAgICAgaWYgKG1IYXNVc2JBY2Nlc3NvcnkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBuYXRpdmVHZXRBY2Nlc3NvcnlTdHJpbmdzKCk7Ci0gICAgICAgICAgICBpZiAoc3RyaW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRBY2Nlc3NvcnkgPSBuZXcgVXNiQWNjZXNzb3J5KHN0cmluZ3MpOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVudGVyaW5nIFVTQiBhY2Nlc3NvcnkgbW9kZTogIiArIG1DdXJyZW50QWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmFjY2Vzc29yeUF0dGFjaGVkKG1DdXJyZW50QWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIm5hdGl2ZUdldEFjY2Vzc29yeVN0cmluZ3MgZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhhbmRsZXMgVVNCIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIGV2ZW50cyAoZGV2aWNlIG1vZGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGZ1bmN0aW9uRW5hYmxlZExvY2tlZChTdHJpbmcgZnVuY3Rpb24sIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgaWYgKCFtRW5hYmxlZEZ1bmN0aW9ucy5jb250YWlucyhmdW5jdGlvbikpIHsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZEZ1bmN0aW9ucy5hZGQoZnVuY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbURpc2FibGVkRnVuY3Rpb25zLnJlbW92ZShmdW5jdGlvbik7Ci0KLSAgICAgICAgICAgIGlmIChVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9BQ0NFU1NPUlkuZXF1YWxzKGZ1bmN0aW9uKSkgewotICAgICAgICAgICAgICAgIHJlYWRDdXJyZW50QWNjZXNzb3J5TG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIW1EaXNhYmxlZEZ1bmN0aW9ucy5jb250YWlucyhmdW5jdGlvbikpIHsKLSAgICAgICAgICAgICAgICBtRGlzYWJsZWRGdW5jdGlvbnMuYWRkKGZ1bmN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FbmFibGVkRnVuY3Rpb25zLnJlbW92ZShmdW5jdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIExpc3RlbnMgZm9yIHVldmVudCBtZXNzYWdlcyBmcm9tIHRoZSBrZXJuZWwgdG8gbW9uaXRvciB0aGUgVVNCIHN0YXRlIChkZXZpY2UgbW9kZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFVFdmVudE9ic2VydmVyIG1VRXZlbnRPYnNlcnZlciA9IG5ldyBVRXZlbnRPYnNlcnZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVUV2ZW50KFVFdmVudE9ic2VydmVyLlVFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy52KFRBRywgIlVTQiBVRVZFTlQ6ICIgKyBldmVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnQuZ2V0KCJTV0lUQ0hfTkFNRSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdGF0ZSA9IGV2ZW50LmdldCgiU1dJVENIX1NUQVRFIik7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBzdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50U3RhdGUgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgidXNiX2Nvbm5lY3RlZCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGludFN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgYW4gSW50ZW50IGJyb2FkY2FzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUmVhZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVib3VuY2UgZGlzY29ubmVjdHMgdG8gYXZvaWQgcHJvYmxlbXMgYnJpbmdpbmcgdXAgVVNCIHRldGhlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUobUNvbm5lY3RlZCA9PSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJ1c2JfY29uZmlndXJhdGlvbiIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyYXRpb24gPSBpbnRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFuIEludGVudCBicm9hZGNhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShtQ29ubmVjdGVkID09IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcGFyc2Ugc3dpdGNoIHN0YXRlIGZyb20gZXZlbnQgIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbiA9IGV2ZW50LmdldCgiRlVOQ1RJT04iKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuYWJsZWRTdHIgPSBldmVudC5nZXQoIkVOQUJMRUQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uICE9IG51bGwgJiYgZW5hYmxlZFN0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB3ZSBkbyBub3QgYnJvYWRjYXN0IGEgY2hhbmdlIHdoZW4gYSBmdW5jdGlvbiBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UganVzdCByZWNvcmQgdGhlIHN0YXRlIGNoYW5nZSBmb3IgdGhlIG5leHQgYnJvYWRjYXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoYXQgPSAoIjEiLmVxdWFscyhlbmFibGVkU3RyKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19GVU5DVElPTl9FTkFCTEVEIDogTVNHX0ZVTkNUSU9OX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIHdoYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IGZ1bmN0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbUJvb3RDb21wbGV0ZWRSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgLy8gaGFuZGxlIGFjY2Vzc29yaWVzIGF0dGFjaGVkIGF0IGJvb3QgdGltZQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEFjY2Vzc29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmFjY2Vzc29yeUF0dGFjaGVkKG1DdXJyZW50QWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwogCiAgICAgcHVibGljIFVzYlNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbURldmljZU1hbmFnZXIgPSBuZXcgVXNiRGV2aWNlU2V0dGluZ3NNYW5hZ2VyKGNvbnRleHQpOworICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyID0gbmV3IFVzYlNldHRpbmdzTWFuYWdlcihjb250ZXh0KTsKICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBtSGFzVXNiSG9zdCA9IHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9VU0JfSE9TVCk7Ci0gICAgICAgIG1IYXNVc2JBY2Nlc3NvcnkgPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVVNCX0FDQ0VTU09SWSk7Ci0KLSAgICAgICAgbUhvc3RCbGFja2xpc3QgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAotICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3VzYkhvc3RCbGFja2xpc3QpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGluaXQoKTsgIC8vIHNldCBpbml0aWFsIHN0YXR1cwotCi0gICAgICAgICAgICAvLyBXYXRjaCBmb3IgVVNCIGNvbmZpZ3VyYXRpb24gY2hhbmdlcwotICAgICAgICAgICAgaWYgKG1Db25maWd1cmF0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICBtVUV2ZW50T2JzZXJ2ZXIuc3RhcnRPYnNlcnZpbmcoVVNCX0NPTk5FQ1RFRF9NQVRDSCk7Ci0gICAgICAgICAgICAgICAgbVVFdmVudE9ic2VydmVyLnN0YXJ0T2JzZXJ2aW5nKFVTQl9DT05GSUdVUkFUSU9OX01BVENIKTsKLSAgICAgICAgICAgICAgICBtVUV2ZW50T2JzZXJ2ZXIuc3RhcnRPYnNlcnZpbmcoVVNCX0ZVTkNUSU9OU19NQVRDSCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVVNCX0hPU1QpKSB7CisgICAgICAgICAgICBtSG9zdE1hbmFnZXIgPSBuZXcgVXNiSG9zdE1hbmFnZXIoY29udGV4dCwgbVNldHRpbmdzTWFuYWdlcik7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgICBib29sZWFuIGluQWNjZXNzb3J5TW9kZSA9IGZhbHNlOwotCi0gICAgICAgIC8vIFJlYWQgaW5pdGlhbCBVU0Igc3RhdGUgKGRldmljZSBtb2RlKQotICAgICAgICBtQ29uZmlndXJhdGlvbiA9IC0xOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZVJlYWRlciBmaWxlID0gbmV3IEZpbGVSZWFkZXIoVVNCX0NPTk5FQ1RFRF9QQVRIKTsKLSAgICAgICAgICAgIGludCBsZW4gPSBmaWxlLnJlYWQoYnVmZmVyLCAwLCAxMDI0KTsKLSAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBJbnRlZ2VyLnZhbHVlT2YoKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBsZW4pKS50cmltKCkpOwotCi0gICAgICAgICAgICBmaWxlID0gbmV3IEZpbGVSZWFkZXIoVVNCX0NPTkZJR1VSQVRJT05fUEFUSCk7Ci0gICAgICAgICAgICBsZW4gPSBmaWxlLnJlYWQoYnVmZmVyLCAwLCAxMDI0KTsKLSAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgIG1Db25maWd1cmF0aW9uID0gSW50ZWdlci52YWx1ZU9mKChuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgbGVuKSkudHJpbSgpKTsKLQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU2xvZy5pKFRBRywgIlRoaXMga2VybmVsIGRvZXMgbm90IGhhdmUgVVNCIGNvbmZpZ3VyYXRpb24gc3dpdGNoIHN1cHBvcnQiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICIiICwgZSk7CisgICAgICAgIGlmIChuZXcgRmlsZSgiL3N5cy9jbGFzcy91c2JfY29tcG9zaXRlIikuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyID0gbmV3IFVzYkRldmljZU1hbmFnZXIoY29udGV4dCwgbVNldHRpbmdzTWFuYWdlcik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1Db25maWd1cmF0aW9uIDwgMCkgewotICAgICAgICAgICAgLy8gVGhpcyBtYXkgaGFwcGVuIGluIHRoZSBlbXVsYXRvciBvciBkZXZpY2VzIHdpdGhvdXQgVVNCIGRldmljZSBtb2RlIHN1cHBvcnQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWQgaW5pdGlhbCBsaXN0IG9mIGVuYWJsZWQgYW5kIGRpc2FibGVkIGZ1bmN0aW9ucyAoZGV2aWNlIG1vZGUpCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBuZXcgRmlsZShVU0JfQ09NUE9TSVRFX0NMQVNTX1BBVEgpLmxpc3RGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVzW2ldLCAiZW5hYmxlIik7Ci0gICAgICAgICAgICAgICAgRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihmaWxlKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCAxMDI0KTsKLSAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YoKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBsZW4pKS50cmltKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbk5hbWUgPSBmaWxlc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWRGdW5jdGlvbnMuYWRkKGZ1bmN0aW9uTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX0FDQ0VTU09SWS5lcXVhbHMoZnVuY3Rpb25OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFVTQiBhY2Nlc3NvcnkgZHJpdmVyIGlzIG9uIGJ5IGRlZmF1bHQsIGJ1dCBpdCBtaWdodCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQgYmVmb3JlIHRoZSBVU0Igc2VydmljZSBoYXMgaW5pdGlhbGl6ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICBpbkFjY2Vzc29yeU1vZGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9BREIuZXF1YWxzKGZ1bmN0aW9uTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkYiBpcyBlbmFibGVkL2Rpc2FibGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGFkYmQgZGFlbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gZG9uJ3QgdHJlYXQgaXQgYXMgYSBkZWZhdWx0IGZ1bmN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRGdW5jdGlvbnMuYWRkKGZ1bmN0aW9uTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRGlzYWJsZWRGdW5jdGlvbnMuYWRkKGZ1bmN0aW9uTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU2xvZy53KFRBRywgIlRoaXMga2VybmVsIGRvZXMgbm90IGhhdmUgVVNCIGNvbXBvc2l0ZSBjbGFzcyBzdXBwb3J0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoVEFHLCAiIiAsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGFjY2Vzc29yeSBzd2l0Y2hlZCB0aGUgZHJpdmVyIHRvIGFjY2Vzc29yeSBtb2RlCi0gICAgICAgIC8vIGJlZm9yZSB0aGUgZnJhbWV3b3JrIGZpbmlzaGVkIGJvb3RpbmcKLSAgICAgICAgaWYgKGluQWNjZXNzb3J5TW9kZSkgewotICAgICAgICAgICAgcmVhZEN1cnJlbnRBY2Nlc3NvcnlMb2NrZWQoKTsKLQotICAgICAgICAgICAgLy8gRklYTUUgLSBpZiB3ZSBib290ZWQgaW4gYWNjZXNzb3J5IG1vZGUsIHRoZW4gd2UgaGF2ZSBubyB3YXkgdG8gZmlndXJlIG91dAotICAgICAgICAgICAgLy8gd2hpY2ggZnVuY3Rpb25zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAvLyBGb3Igbm93LCBhc3N1bWUgdGhhdCBNVFAgb3IgbWFzcyBzdG9yYWdlIGFyZSB0aGUgb25seSBwb3NzaWJpbGl0aWVzCi0gICAgICAgICAgICBpZiAobURpc2FibGVkRnVuY3Rpb25zLmNvbnRhaW5zKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX01UUCkpIHsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdEZ1bmN0aW9ucy5hZGQoVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fTVRQKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURpc2FibGVkRnVuY3Rpb25zLmNvbnRhaW5zKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX01BU1NfU1RPUkFHRSkpIHsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdEZ1bmN0aW9ucy5hZGQoVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fTUFTU19TVE9SQUdFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JsYWNrTGlzdGVkKFN0cmluZyBkZXZpY2VOYW1lKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Ib3N0QmxhY2tsaXN0Lmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlTmFtZS5zdGFydHNXaXRoKG1Ib3N0QmxhY2tsaXN0W2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiByZXR1cm5zIHRydWUgaWYgdGhlIFVTQiBkZXZpY2Ugc2hvdWxkIG5vdCBiZSBhY2Nlc3NpYmxlIGJ5IGFwcGxpY2F0aW9ucyAoaG9zdCBtb2RlKSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JsYWNrTGlzdGVkKGludCBjbGF6eiwgaW50IHN1YkNsYXNzLCBpbnQgcHJvdG9jb2wpIHsKLSAgICAgICAgLy8gYmxhY2tsaXN0IGh1YnMKLSAgICAgICAgaWYgKGNsYXp6ID09IFVzYkNvbnN0YW50cy5VU0JfQ0xBU1NfSFVCKSByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAvLyBibGFja2xpc3QgSElEIGJvb3QgZGV2aWNlcyAobW91c2UgYW5kIGtleWJvYXJkKQotICAgICAgICBpZiAoY2xhenogPT0gVXNiQ29uc3RhbnRzLlVTQl9DTEFTU19ISUQgJiYKLSAgICAgICAgICAgICAgICBzdWJDbGFzcyA9PSBVc2JDb25zdGFudHMuVVNCX0lOVEVSRkFDRV9TVUJDTEFTU19CT09UKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiBDYWxsZWQgZnJvbSBKTkkgaW4gbW9uaXRvclVzYkhvc3RCdXMoKSB0byByZXBvcnQgbmV3IFVTQiBkZXZpY2VzIChob3N0IG1vZGUpICovCi0gICAgcHJpdmF0ZSB2b2lkIHVzYkRldmljZUFkZGVkKFN0cmluZyBkZXZpY2VOYW1lLCBpbnQgdmVuZG9ySUQsIGludCBwcm9kdWN0SUQsCi0gICAgICAgICAgICBpbnQgZGV2aWNlQ2xhc3MsIGludCBkZXZpY2VTdWJjbGFzcywgaW50IGRldmljZVByb3RvY29sLAotICAgICAgICAgICAgLyogYXJyYXkgb2YgcXVpbnR1cGxlcyBjb250YWluaW5nIGlkLCBjbGFzcywgc3ViY2xhc3MsIHByb3RvY29sCi0gICAgICAgICAgICAgICBhbmQgbnVtYmVyIG9mIGVuZHBvaW50cyBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KLSAgICAgICAgICAgIGludFtdIGludGVyZmFjZVZhbHVlcywKLSAgICAgICAgICAgLyogYXJyYXkgb2YgcXVhZHJ1cGxlcyBjb250YWluaW5nIGFkZHJlc3MsIGF0dHJpYnV0ZXMsIG1heCBwYWNrZXQgc2l6ZQotICAgICAgICAgICAgICBhbmQgaW50ZXJ2YWwgZm9yIGVhY2ggZW5kcG9pbnQgKi8KLSAgICAgICAgICAgIGludFtdIGVuZHBvaW50VmFsdWVzKSB7Ci0KLSAgICAgICAgaWYgKGlzQmxhY2tMaXN0ZWQoZGV2aWNlTmFtZSkgfHwKLSAgICAgICAgICAgICAgICBpc0JsYWNrTGlzdGVkKGRldmljZUNsYXNzLCBkZXZpY2VTdWJjbGFzcywgZGV2aWNlUHJvdG9jb2wpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobURldmljZXMuZ2V0KGRldmljZU5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJkZXZpY2UgYWxyZWFkeSBvbiBtRGV2aWNlcyBsaXN0OiAiICsgZGV2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgbnVtSW50ZXJmYWNlcyA9IGludGVyZmFjZVZhbHVlcy5sZW5ndGggLyA1OwotICAgICAgICAgICAgUGFyY2VsYWJsZVtdIGludGVyZmFjZXMgPSBuZXcgVXNiSW50ZXJmYWNlW251bUludGVyZmFjZXNdOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyByZXBhY2thZ2UgaW50ZXJmYWNlVmFsdWVzIGFzIGFuIGFycmF5IG9mIFVzYkludGVyZmFjZQotICAgICAgICAgICAgICAgIGludCBpbnRmLCBlbmRwLCBpdmFsID0gMCwgZXZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnRmID0gMDsgaW50ZiA8IG51bUludGVyZmFjZXM7IGludGYrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJmYWNlSWQgPSBpbnRlcmZhY2VWYWx1ZXNbaXZhbCsrXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGludGVyZmFjZUNsYXNzID0gaW50ZXJmYWNlVmFsdWVzW2l2YWwrK107Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbnRlcmZhY2VTdWJjbGFzcyA9IGludGVyZmFjZVZhbHVlc1tpdmFsKytdOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJmYWNlUHJvdG9jb2wgPSBpbnRlcmZhY2VWYWx1ZXNbaXZhbCsrXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG51bUVuZHBvaW50cyA9IGludGVyZmFjZVZhbHVlc1tpdmFsKytdOwotCi0gICAgICAgICAgICAgICAgICAgIFBhcmNlbGFibGVbXSBlbmRwb2ludHMgPSBuZXcgVXNiRW5kcG9pbnRbbnVtRW5kcG9pbnRzXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChlbmRwID0gMDsgZW5kcCA8IG51bUVuZHBvaW50czsgZW5kcCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkcmVzcyA9IGVuZHBvaW50VmFsdWVzW2V2YWwrK107Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlcyA9IGVuZHBvaW50VmFsdWVzW2V2YWwrK107Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4UGFja2V0U2l6ZSA9IGVuZHBvaW50VmFsdWVzW2V2YWwrK107Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJ2YWwgPSBlbmRwb2ludFZhbHVlc1tldmFsKytdOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRzW2VuZHBdID0gbmV3IFVzYkVuZHBvaW50KGFkZHJlc3MsIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhY2tldFNpemUsIGludGVydmFsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFsbG93IGlmIGFueSBpbnRlcmZhY2VzIGFyZSBibGFja2xpc3RlZAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbGFja0xpc3RlZChpbnRlcmZhY2VDbGFzcywgaW50ZXJmYWNlU3ViY2xhc3MsIGludGVyZmFjZVByb3RvY29sKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZXNbaW50Zl0gPSBuZXcgVXNiSW50ZXJmYWNlKGludGVyZmFjZUlkLCBpbnRlcmZhY2VDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VTdWJjbGFzcywgaW50ZXJmYWNlUHJvdG9jb2wsIGVuZHBvaW50cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBiZXdhcmUgb2YgaW5kZXggb3V0IG9mIGJvdW5kIGV4Y2VwdGlvbnMsIHdoaWNoIG1pZ2h0IGhhcHBlbiBpZgotICAgICAgICAgICAgICAgIC8vIGEgZGV2aWNlIGRvZXMgbm90IHNldCBiTnVtRW5kcG9pbnRzIGNvcnJlY3RseQotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImVycm9yIHBhcnNpbmcgVVNCIGRlc2NyaXB0b3JzIiwgZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBVc2JEZXZpY2UgZGV2aWNlID0gbmV3IFVzYkRldmljZShkZXZpY2VOYW1lLCB2ZW5kb3JJRCwgcHJvZHVjdElELAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VDbGFzcywgZGV2aWNlU3ViY2xhc3MsIGRldmljZVByb3RvY29sLCBpbnRlcmZhY2VzKTsKLSAgICAgICAgICAgIG1EZXZpY2VzLnB1dChkZXZpY2VOYW1lLCBkZXZpY2UpOwotICAgICAgICAgICAgbURldmljZU1hbmFnZXIuZGV2aWNlQXR0YWNoZWQoZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENhbGxlZCBmcm9tIEpOSSBpbiBtb25pdG9yVXNiSG9zdEJ1cyB0byByZXBvcnQgVVNCIGRldmljZSByZW1vdmFsIChob3N0IG1vZGUpICovCi0gICAgcHJpdmF0ZSB2b2lkIHVzYkRldmljZVJlbW92ZWQoU3RyaW5nIGRldmljZU5hbWUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IG1EZXZpY2VzLnJlbW92ZShkZXZpY2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmRldmljZURldGFjaGVkKGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEhvc3RTdXBwb3J0KCkgewotICAgICAgICAvLyBDcmVhdGUgYSB0aHJlYWQgdG8gY2FsbCBpbnRvIG5hdGl2ZSBjb2RlIHRvIHdhaXQgZm9yIFVTQiBob3N0IGV2ZW50cy4KLSAgICAgICAgLy8gVGhpcyB0aHJlYWQgd2lsbCBjYWxsIHVzIGJhY2sgb24gdXNiRGV2aWNlQWRkZWQgYW5kIHVzYkRldmljZVJlbW92ZWQuCi0gICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIG1vbml0b3JVc2JIb3N0QnVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG5ldyBUaHJlYWQobnVsbCwgcnVubmFibGUsICJVc2JTZXJ2aWNlIGhvc3QgdGhyZWFkIikuc3RhcnQoKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzeXN0ZW1SZWFkeSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1IYXNVc2JIb3N0KSB7Ci0gICAgICAgICAgICAgICAgLy8gc3RhcnQgbW9uaXRvcmluZyBmb3IgY29ubmVjdGVkIFVTQiBkZXZpY2VzCi0gICAgICAgICAgICAgICAgaW5pdEhvc3RTdXBwb3J0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRBY2Nlc3NvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFjY2Vzc29yeUF0dGFjaGVkIGF0IHN5c3RlbVJlYWR5Iik7Ci0gICAgICAgICAgICAgICAgLy8gaXRzIHN0aWxsIHRvbyBlYXJseSB0byBoYW5kbGUgYWNjZXNzb3JpZXMsIHNvIGFkZCBhIEJPT1RfQ09NUExFVEVEIHJlY2VpdmVyCi0gICAgICAgICAgICAgICAgLy8gdG8gaGFuZGxlIHRoaXMgbGF0ZXIuCi0gICAgICAgICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQm9vdENvbXBsZXRlZFJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX0JPT1RfQ09NUExFVEVEKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3lzdGVtUmVhZHkgPSB0cnVlOworICAgICAgICBpZiAobURldmljZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbURldmljZU1hbmFnZXIuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHVwZGF0ZSB0aGUgVVNCIGNvbm5lY3RlZCBhbmQgY29uZmlndXJlZCBzdGF0ZSAoZGV2aWNlIG1vZGUpLgotICAgICAqIElmIGRlbGF5ZWQgaXMgdHJ1ZSwgdGhlbiB3ZSBhZGQgYSBzbWFsbCBkZWxheSBpbiBzZW5kaW5nIHRoZSBtZXNzYWdlIHRvIGRlYm91bmNlCi0gICAgICogdGhlIFVTQiBjb25uZWN0aW9uIHdoZW4gZW5hYmxpbmcgVVNCIHRldGhlcmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgdXBkYXRlKGJvb2xlYW4gZGVsYXllZCkgewotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1NUQVRFKTsKLSAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX1VQREFURV9TVEFURSwgZGVsYXllZCA/IFVQREFURV9ERUxBWSA6IDApOworICAgICAgICBpZiAobUhvc3RNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ib3N0TWFuYWdlci5zeXN0ZW1SZWFkeSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBhdHRhY2hlZCBVU0IgZGV2aWNlcyAoaG9zdCBtZG9lKSAqLwogICAgIHB1YmxpYyB2b2lkIGdldERldmljZUxpc3QoQnVuZGxlIGRldmljZXMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG1EZXZpY2VzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcy5wdXRQYXJjZWxhYmxlKG5hbWUsIG1EZXZpY2VzLmdldChuYW1lKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtSG9zdE1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUhvc3RNYW5hZ2VyLmdldERldmljZUxpc3QoZGV2aWNlcyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBPcGVucyB0aGUgc3BlY2lmaWVkIFVTQiBkZXZpY2UgKGhvc3QgbW9kZSkgKi8KICAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkRldmljZShTdHJpbmcgZGV2aWNlTmFtZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoaXNCbGFja0xpc3RlZChkZXZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVVNCIGRldmljZSBpcyBvbiBhIHJlc3RyaWN0ZWQgYnVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVc2JEZXZpY2UgZGV2aWNlID0gbURldmljZXMuZ2V0KGRldmljZU5hbWUpOwotICAgICAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IGluIG1EZXZpY2VzLCBpdCBlaXRoZXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgYmxhY2tsaXN0ZWQKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgImRldmljZSAiICsgZGV2aWNlTmFtZSArICIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgcmVzdHJpY3RlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbURldmljZU1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gbmF0aXZlT3BlbkRldmljZShkZXZpY2VOYW1lKTsKKyAgICAgICAgaWYgKG1Ib3N0TWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUhvc3RNYW5hZ2VyLm9wZW5EZXZpY2UoZGV2aWNlTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qIHJldHVybnMgdGhlIGN1cnJlbnRseSBhdHRhY2hlZCBVU0IgYWNjZXNzb3J5IChkZXZpY2UgbW9kZSkgKi8KICAgICBwdWJsaWMgVXNiQWNjZXNzb3J5IGdldEN1cnJlbnRBY2Nlc3NvcnkoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudEFjY2Vzc29yeTsKKyAgICAgICAgaWYgKG1EZXZpY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlTWFuYWdlci5nZXRDdXJyZW50QWNjZXNzb3J5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qIG9wZW5zIHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgVVNCIGFjY2Vzc29yeSAoZGV2aWNlIG1vZGUpICovCiAgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5BY2Nlc3NvcnkoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRBY2Nlc3NvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIGFjY2Vzc29yeSBhdHRhY2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtQ3VycmVudEFjY2Vzc29yeS5lcXVhbHMoYWNjZXNzb3J5KSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgYWNjZXNzb3J5LnRvU3RyaW5nKCkgKyAiIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgYWNjZXNzb3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUN1cnJlbnRBY2Nlc3NvcnkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY2Vzc29yeSBub3QgYXR0YWNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihtQ3VycmVudEFjY2Vzc29yeSk7Ci0gICAgICAgICAgICByZXR1cm4gbmF0aXZlT3BlbkFjY2Vzc29yeSgpOworICAgICAgICBpZiAobURldmljZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG9wZW5BY2Nlc3NvcnkoYWNjZXNzb3J5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0RGV2aWNlUGFja2FnZShVc2JEZXZpY2UgZGV2aWNlLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfVVNCLCBudWxsKTsKLSAgICAgICAgbURldmljZU1hbmFnZXIuc2V0RGV2aWNlUGFja2FnZShkZXZpY2UsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgbVNldHRpbmdzTWFuYWdlci5zZXREZXZpY2VQYWNrYWdlKGRldmljZSwgcGFja2FnZU5hbWUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc29yeVBhY2thZ2UoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTUFOQUdFX1VTQiwgbnVsbCk7Ci0gICAgICAgIG1EZXZpY2VNYW5hZ2VyLnNldEFjY2Vzc29yeVBhY2thZ2UoYWNjZXNzb3J5LCBwYWNrYWdlTmFtZSk7CisgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuc2V0QWNjZXNzb3J5UGFja2FnZShhY2Nlc3NvcnksIHBhY2thZ2VOYW1lKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNEZXZpY2VQZXJtaXNzaW9uKFVzYkRldmljZSBkZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2VNYW5hZ2VyLmhhc1Blcm1pc3Npb24oZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIG1TZXR0aW5nc01hbmFnZXIuaGFzUGVybWlzc2lvbihkZXZpY2UpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGhhc0FjY2Vzc29yeVBlcm1pc3Npb24oVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgewotICAgICAgICByZXR1cm4gbURldmljZU1hbmFnZXIuaGFzUGVybWlzc2lvbihhY2Nlc3NvcnkpOworICAgICAgICByZXR1cm4gbVNldHRpbmdzTWFuYWdlci5oYXNQZXJtaXNzaW9uKGFjY2Vzc29yeSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVxdWVzdERldmljZVBlcm1pc3Npb24oVXNiRGV2aWNlIGRldmljZSwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwaSkgewotICAgICAgICBtRGV2aWNlTWFuYWdlci5yZXF1ZXN0UGVybWlzc2lvbihkZXZpY2UsIHBhY2thZ2VOYW1lLCBwaSk7CisgICAgICAgIG1TZXR0aW5nc01hbmFnZXIucmVxdWVzdFBlcm1pc3Npb24oZGV2aWNlLCBwYWNrYWdlTmFtZSwgcGkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RBY2Nlc3NvcnlQZXJtaXNzaW9uKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnksIFN0cmluZyBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGkpIHsKLSAgICAgICAgbURldmljZU1hbmFnZXIucmVxdWVzdFBlcm1pc3Npb24oYWNjZXNzb3J5LCBwYWNrYWdlTmFtZSwgcGkpOworICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyLnJlcXVlc3RQZXJtaXNzaW9uKGFjY2Vzc29yeSwgcGFja2FnZU5hbWUsIHBpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBncmFudERldmljZVBlcm1pc3Npb24oVXNiRGV2aWNlIGRldmljZSwgaW50IHVpZCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1BTkFHRV9VU0IsIG51bGwpOwotICAgICAgICBtRGV2aWNlTWFuYWdlci5ncmFudERldmljZVBlcm1pc3Npb24oZGV2aWNlLCB1aWQpOworICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyLmdyYW50RGV2aWNlUGVybWlzc2lvbihkZXZpY2UsIHVpZCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZ3JhbnRBY2Nlc3NvcnlQZXJtaXNzaW9uKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnksIGludCB1aWQpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfVVNCLCBudWxsKTsKLSAgICAgICAgbURldmljZU1hbmFnZXIuZ3JhbnRBY2Nlc3NvcnlQZXJtaXNzaW9uKGFjY2Vzc29yeSwgdWlkKTsKKyAgICAgICAgbVNldHRpbmdzTWFuYWdlci5ncmFudEFjY2Vzc29yeVBlcm1pc3Npb24oYWNjZXNzb3J5LCB1aWQpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGhhc0RlZmF1bHRzKFN0cmluZyBwYWNrYWdlTmFtZSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1BTkFHRV9VU0IsIG51bGwpOwotICAgICAgICByZXR1cm4gbURldmljZU1hbmFnZXIuaGFzRGVmYXVsdHMocGFja2FnZU5hbWUpOworICAgICAgICByZXR1cm4gbVNldHRpbmdzTWFuYWdlci5oYXNEZWZhdWx0cyhwYWNrYWdlTmFtZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xlYXJEZWZhdWx0cyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfVVNCLCBudWxsKTsKLSAgICAgICAgbURldmljZU1hbmFnZXIuY2xlYXJEZWZhdWx0cyhwYWNrYWdlTmFtZSk7CisgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuY2xlYXJEZWZhdWx0cyhwYWNrYWdlTmFtZSk7CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBUaGlzIGhhbmRsZXIgaXMgZm9yIGRlZmVycmVkIGhhbmRsaW5nIG9mIGV2ZW50cyByZWxhdGVkIHRvIGRldmljZSBtb2RlIGFuZCBhY2Nlc3Nvcmllcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZEVuYWJsZWRGdW5jdGlvbnNMb2NrZWQoSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgLy8gaW5jbHVkZSBzdGF0ZSBvZiBhbGwgVVNCIGZ1bmN0aW9ucyBpbiBvdXIgZXh0cmFzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbmFibGVkRnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKG1FbmFibGVkRnVuY3Rpb25zLmdldChpKSwgVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fRU5BQkxFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EaXNhYmxlZEZ1bmN0aW9ucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShtRGlzYWJsZWRGdW5jdGlvbnMuZ2V0KGkpLCBVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9ESVNBQkxFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1NUQVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0ZWQgIT0gbUxhc3RDb25uZWN0ZWQgfHwgbUNvbmZpZ3VyYXRpb24gIT0gbUxhc3RDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0ZWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXNiTWFuYWdlci5pc0Z1bmN0aW9uRW5hYmxlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQUNDRVNTT1JZKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGFjY2Vzc29yeSBtb2RlIGlzIG9mZiwgYW5kIHJlc3RvcmUgZGVmYXVsdCBmdW5jdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImV4aXRlZCBVU0IgYWNjZXNzb3J5IG1vZGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVXNiTWFuYWdlci5zZXRGdW5jdGlvbkVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX0FDQ0VTU09SWSwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY291bGQgbm90IGRpc2FibGUgYWNjZXNzb3J5IGZ1bmN0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtRGVmYXVsdEZ1bmN0aW9ucy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVuY3Rpb24gPSBtRGVmYXVsdEZ1bmN0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFVc2JNYW5hZ2VyLnNldEZ1bmN0aW9uRW5hYmxlZChmdW5jdGlvbiwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY291bGQgbm90IHJlZW5hYmxlIGZ1bmN0aW9uICIgKyBmdW5jdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRBY2Nlc3NvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmFjY2Vzc29yeURldGFjaGVkKG1DdXJyZW50QWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEFjY2Vzc29yeSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2V0dGluZ3MuU2VjdXJlLmdldEludChjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERVZJQ0VfUFJPVklTSU9ORUQsIDApID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkRldmljZSBub3QgcHJvdmlzaW9uZWQsIHNraXBwaW5nIFVTQiBicm9hZGNhc3QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0Q29ubmVjdGVkID0gbUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdENvbmZpZ3VyYXRpb24gPSBtQ29uZmlndXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgYSBzdGlja3kgYnJvYWRjYXN0IGNvbnRhaW5pbmcgY3VycmVudCBVU0Igc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfU1RBVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLlVTQl9DT05ORUNURUQsIG1Db25uZWN0ZWQgIT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuVVNCX0NPTkZJR1VSQVRJT04sIG1Db25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbmFibGVkRnVuY3Rpb25zTG9ja2VkKGludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX0ZVTkNUSU9OX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX0ZVTkNUSU9OX0RJU0FCTEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25FbmFibGVkTG9ja2VkKChTdHJpbmcpbXNnLm9iaiwgbXNnLndoYXQgPT0gTVNHX0ZVTkNUSU9OX0VOQUJMRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQpAQCAtNjIyLDQwICsxNTYsMTQgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIlVTQiBNYW5hZ2VyIFN0YXRlOiIpOworICAgICAgICBwdy5wcmludGxuKCJVU0IgTWFuYWdlciBTdGF0ZToiKTsKIAotICAgICAgICAgICAgcHcucHJpbnRsbigiICBVU0IgRGV2aWNlIFN0YXRlOiIpOwotICAgICAgICAgICAgcHcucHJpbnQoIiAgICBFbmFibGVkIEZ1bmN0aW9uczogIik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbmFibGVkRnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQobUVuYWJsZWRGdW5jdGlvbnMuZ2V0KGkpICsgIiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LnByaW50bG4oIiIpOwotICAgICAgICAgICAgcHcucHJpbnQoIiAgICBEaXNhYmxlZCBGdW5jdGlvbnM6ICIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGlzYWJsZWRGdW5jdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludChtRGlzYWJsZWRGdW5jdGlvbnMuZ2V0KGkpICsgIiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LnByaW50bG4oIiIpOwotICAgICAgICAgICAgcHcucHJpbnQoIiAgICBEZWZhdWx0IEZ1bmN0aW9uczogIik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZWZhdWx0RnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQobURlZmF1bHRGdW5jdGlvbnMuZ2V0KGkpICsgIiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LnByaW50bG4oIiIpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIG1Db25uZWN0ZWQ6ICIgKyBtQ29ubmVjdGVkICsgIiwgbUNvbmZpZ3VyYXRpb246ICIgKyBtQ29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgICAgbUN1cnJlbnRBY2Nlc3Nvcnk6ICIgKyBtQ3VycmVudEFjY2Vzc29yeSk7Ci0KLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgVVNCIEhvc3QgU3RhdGU6Iik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbURldmljZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgIiArIG5hbWUgKyAiOiAiICsgbURldmljZXMuZ2V0KG5hbWUpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1EZXZpY2VNYW5hZ2VyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmR1bXAoZmQsIHB3KTsKICAgICAgICAgfQorICAgICAgICBpZiAobUhvc3RNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ib3N0TWFuYWdlci5kdW1wKGZkLCBwdyk7CisgICAgICAgIH0KKyAgICAgICAgbVNldHRpbmdzTWFuYWdlci5kdW1wKGZkLCBwdyk7CiAgICAgfQotCi0gICAgLy8gaG9zdCBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBtb25pdG9yVXNiSG9zdEJ1cygpOwotICAgIHByaXZhdGUgbmF0aXZlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5hdGl2ZU9wZW5EZXZpY2UoU3RyaW5nIGRldmljZU5hbWUpOwotICAgIC8vIGFjY2Vzc29yeSBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nW10gbmF0aXZlR2V0QWNjZXNzb3J5U3RyaW5ncygpOwotICAgIHByaXZhdGUgbmF0aXZlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5hdGl2ZU9wZW5BY2Nlc3NvcnkoKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JTZXR0aW5nc01hbmFnZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JTZXR0aW5nc01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTEzNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYlNldHRpbmdzTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTAxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLnVzYjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkFjY2Vzc29yeTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29udGVudC5QYWNrYWdlTW9uaXRvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkZhc3RYbWxTZXJpYWxpemVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBVc2JTZXR0aW5nc01hbmFnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJVc2JTZXR0aW5nc01hbmFnZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgc1NldHRpbmdzRmlsZSA9IG5ldyBGaWxlKCIvZGF0YS9zeXN0ZW0vdXNiX2RldmljZV9tYW5hZ2VyLnhtbCIpOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOworCisgICAgLy8gVGVtcG9yYXJ5IG1hcHBpbmcgVVNCIGRldmljZSBuYW1lIHRvIGxpc3Qgb2YgVUlEcyB3aXRoIHBlcm1pc3Npb25zIGZvciB0aGUgZGV2aWNlCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3BhcnNlQm9vbGVhbkFycmF5PiBtRGV2aWNlUGVybWlzc2lvbk1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFNwYXJzZUJvb2xlYW5BcnJheT4oKTsKKyAgICAvLyBUZW1wb3JhcnkgbWFwcGluZyBVc2JBY2Nlc3NvcnkgdG8gbGlzdCBvZiBVSURzIHdpdGggcGVybWlzc2lvbnMgZm9yIHRoZSBhY2Nlc3NvcnkKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8VXNiQWNjZXNzb3J5LCBTcGFyc2VCb29sZWFuQXJyYXk+IG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFVzYkFjY2Vzc29yeSwgU3BhcnNlQm9vbGVhbkFycmF5PigpOworICAgIC8vIE1hcHMgRGV2aWNlRmlsdGVyIHRvIHVzZXIgcHJlZmVycmVkIGFwcGxpY2F0aW9uIHBhY2thZ2UKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8RGV2aWNlRmlsdGVyLCBTdHJpbmc+IG1EZXZpY2VQcmVmZXJlbmNlTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPERldmljZUZpbHRlciwgU3RyaW5nPigpOworICAgIC8vIE1hcHMgQWNjZXNzb3J5RmlsdGVyIHRvIHVzZXIgcHJlZmVycmVkIGFwcGxpY2F0aW9uIHBhY2thZ2UKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8QWNjZXNzb3J5RmlsdGVyLCBTdHJpbmc+IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPEFjY2Vzc29yeUZpbHRlciwgU3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBVU0IgZGV2aWNlLgorICAgIC8vIFdoZW4gdXNlZCBpbiBIYXNoTWFwcyBhbGwgdmFsdWVzIG11c3QgYmUgc3BlY2lmaWVkLAorICAgIC8vIGJ1dCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQgZm9yIGFueSBvZiB0aGUgZmllbGRzIGluCisgICAgLy8gdGhlIHBhY2thZ2UgbWV0YS1kYXRhLgorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERldmljZUZpbHRlciB7CisgICAgICAgIC8vIFVTQiBWZW5kb3IgSUQgKG9yIC0xIGZvciB1bnNwZWNpZmllZCkKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBtVmVuZG9ySWQ7CisgICAgICAgIC8vIFVTQiBQcm9kdWN0IElEIChvciAtMSBmb3IgdW5zcGVjaWZpZWQpCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVByb2R1Y3RJZDsKKyAgICAgICAgLy8gVVNCIGRldmljZSBvciBpbnRlcmZhY2UgY2xhc3MgKG9yIC0xIGZvciB1bnNwZWNpZmllZCkKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBtQ2xhc3M7CisgICAgICAgIC8vIFVTQiBkZXZpY2Ugc3ViY2xhc3MgKG9yIC0xIGZvciB1bnNwZWNpZmllZCkKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBtU3ViY2xhc3M7CisgICAgICAgIC8vIFVTQiBkZXZpY2UgcHJvdG9jb2wgKG9yIC0xIGZvciB1bnNwZWNpZmllZCkKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBtUHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIERldmljZUZpbHRlcihpbnQgdmlkLCBpbnQgcGlkLCBpbnQgY2xhc3osIGludCBzdWJjbGFzcywgaW50IHByb3RvY29sKSB7CisgICAgICAgICAgICBtVmVuZG9ySWQgPSB2aWQ7CisgICAgICAgICAgICBtUHJvZHVjdElkID0gcGlkOworICAgICAgICAgICAgbUNsYXNzID0gY2xhc3o7CisgICAgICAgICAgICBtU3ViY2xhc3MgPSBzdWJjbGFzczsKKyAgICAgICAgICAgIG1Qcm90b2NvbCA9IHByb3RvY29sOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERldmljZUZpbHRlcihVc2JEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgICAgICBtVmVuZG9ySWQgPSBkZXZpY2UuZ2V0VmVuZG9ySWQoKTsKKyAgICAgICAgICAgIG1Qcm9kdWN0SWQgPSBkZXZpY2UuZ2V0UHJvZHVjdElkKCk7CisgICAgICAgICAgICBtQ2xhc3MgPSBkZXZpY2UuZ2V0RGV2aWNlQ2xhc3MoKTsKKyAgICAgICAgICAgIG1TdWJjbGFzcyA9IGRldmljZS5nZXREZXZpY2VTdWJjbGFzcygpOworICAgICAgICAgICAgbVByb3RvY29sID0gZGV2aWNlLmdldERldmljZVByb3RvY29sKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIERldmljZUZpbHRlciByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgdmVuZG9ySWQgPSAtMTsKKyAgICAgICAgICAgIGludCBwcm9kdWN0SWQgPSAtMTsKKyAgICAgICAgICAgIGludCBkZXZpY2VDbGFzcyA9IC0xOworICAgICAgICAgICAgaW50IGRldmljZVN1YmNsYXNzID0gLTE7CisgICAgICAgICAgICBpbnQgZGV2aWNlUHJvdG9jb2wgPSAtMTsKKworICAgICAgICAgICAgaW50IGNvdW50ID0gcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lKGkpOworICAgICAgICAgICAgICAgIC8vIEFsbCBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBpbnRzCisgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOworCisgICAgICAgICAgICAgICAgaWYgKCJ2ZW5kb3ItaWQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB2ZW5kb3JJZCA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInByb2R1Y3QtaWQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9kdWN0SWQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJjbGFzcyIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZUNsYXNzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic3ViY2xhc3MiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdWJjbGFzcyA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInByb3RvY29sIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlUHJvdG9jb2wgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IERldmljZUZpbHRlcih2ZW5kb3JJZCwgcHJvZHVjdElkLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VDbGFzcywgZGV2aWNlU3ViY2xhc3MsIGRldmljZVByb3RvY29sKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKFhtbFNlcmlhbGl6ZXIgc2VyaWFsaXplcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgInVzYi1kZXZpY2UiKTsKKyAgICAgICAgICAgIGlmIChtVmVuZG9ySWQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAidmVuZG9yLWlkIiwgSW50ZWdlci50b1N0cmluZyhtVmVuZG9ySWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUHJvZHVjdElkICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInByb2R1Y3QtaWQiLCBJbnRlZ2VyLnRvU3RyaW5nKG1Qcm9kdWN0SWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ2xhc3MgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAiY2xhc3MiLCBJbnRlZ2VyLnRvU3RyaW5nKG1DbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TdWJjbGFzcyAhPSAtMSkgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJzdWJjbGFzcyIsIEludGVnZXIudG9TdHJpbmcobVN1YmNsYXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVByb3RvY29sICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInByb3RvY29sIiwgSW50ZWdlci50b1N0cmluZyhtUHJvdG9jb2wpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsICJ1c2ItZGV2aWNlIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhpbnQgY2xhc3osIGludCBzdWJjbGFzcywgaW50IHByb3RvY29sKSB7CisgICAgICAgICAgICByZXR1cm4gKChtQ2xhc3MgPT0gLTEgfHwgY2xhc3ogPT0gbUNsYXNzKSAmJgorICAgICAgICAgICAgICAgICAgICAobVN1YmNsYXNzID09IC0xIHx8IHN1YmNsYXNzID09IG1TdWJjbGFzcykgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1Qcm90b2NvbCA9PSAtMSB8fCBwcm90b2NvbCA9PSBtUHJvdG9jb2wpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoVXNiRGV2aWNlIGRldmljZSkgeworICAgICAgICAgICAgaWYgKG1WZW5kb3JJZCAhPSAtMSAmJiBkZXZpY2UuZ2V0VmVuZG9ySWQoKSAhPSBtVmVuZG9ySWQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtUHJvZHVjdElkICE9IC0xICYmIGRldmljZS5nZXRQcm9kdWN0SWQoKSAhPSBtUHJvZHVjdElkKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGRldmljZSBjbGFzcy9zdWJjbGFzcy9wcm90b2NvbAorICAgICAgICAgICAgaWYgKG1hdGNoZXMoZGV2aWNlLmdldERldmljZUNsYXNzKCksIGRldmljZS5nZXREZXZpY2VTdWJjbGFzcygpLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0RGV2aWNlUHJvdG9jb2woKSkpIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAvLyBpZiBkZXZpY2UgZG9lc24ndCBtYXRjaCwgY2hlY2sgdGhlIGludGVyZmFjZXMKKyAgICAgICAgICAgIGludCBjb3VudCA9IGRldmljZS5nZXRJbnRlcmZhY2VDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgVXNiSW50ZXJmYWNlIGludGYgPSBkZXZpY2UuZ2V0SW50ZXJmYWNlKGkpOworICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyhpbnRmLmdldEludGVyZmFjZUNsYXNzKCksIGludGYuZ2V0SW50ZXJmYWNlU3ViY2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGYuZ2V0SW50ZXJmYWNlUHJvdG9jb2woKSkpIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKERldmljZUZpbHRlciBmKSB7CisgICAgICAgICAgICBpZiAobVZlbmRvcklkICE9IC0xICYmIGYubVZlbmRvcklkICE9IG1WZW5kb3JJZCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG1Qcm9kdWN0SWQgIT0gLTEgJiYgZi5tUHJvZHVjdElkICE9IG1Qcm9kdWN0SWQpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgLy8gY2hlY2sgZGV2aWNlIGNsYXNzL3N1YmNsYXNzL3Byb3RvY29sCisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcyhmLm1DbGFzcywgZi5tU3ViY2xhc3MsIGYubVByb3RvY29sKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgLy8gY2FuJ3QgY29tcGFyZSBpZiB3ZSBoYXZlIHdpbGRjYXJkIHN0cmluZ3MKKyAgICAgICAgICAgIGlmIChtVmVuZG9ySWQgPT0gLTEgfHwgbVByb2R1Y3RJZCA9PSAtMSB8fAorICAgICAgICAgICAgICAgICAgICBtQ2xhc3MgPT0gLTEgfHwgbVN1YmNsYXNzID09IC0xIHx8IG1Qcm90b2NvbCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEZXZpY2VGaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICBEZXZpY2VGaWx0ZXIgZmlsdGVyID0gKERldmljZUZpbHRlcilvYmo7CisgICAgICAgICAgICAgICAgcmV0dXJuIChmaWx0ZXIubVZlbmRvcklkID09IG1WZW5kb3JJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1Qcm9kdWN0SWQgPT0gbVByb2R1Y3RJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1DbGFzcyA9PSBtQ2xhc3MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5tU3ViY2xhc3MgPT0gbVN1YmNsYXNzICYmCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIubVByb3RvY29sID09IG1Qcm90b2NvbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVXNiRGV2aWNlKSB7CisgICAgICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IChVc2JEZXZpY2Upb2JqOworICAgICAgICAgICAgICAgIHJldHVybiAoZGV2aWNlLmdldFZlbmRvcklkKCkgPT0gbVZlbmRvcklkICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0UHJvZHVjdElkKCkgPT0gbVByb2R1Y3RJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldERldmljZUNsYXNzKCkgPT0gbUNsYXNzICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0RGV2aWNlU3ViY2xhc3MoKSA9PSBtU3ViY2xhc3MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXREZXZpY2VQcm90b2NvbCgpID09IG1Qcm90b2NvbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoKChtVmVuZG9ySWQgPDwgMTYpIHwgbVByb2R1Y3RJZCkgXgorICAgICAgICAgICAgICAgICAgICAoKG1DbGFzcyA8PCAxNikgfCAobVN1YmNsYXNzIDw8IDgpIHwgbVByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiRGV2aWNlRmlsdGVyW21WZW5kb3JJZD0iICsgbVZlbmRvcklkICsgIixtUHJvZHVjdElkPSIgKyBtUHJvZHVjdElkICsKKyAgICAgICAgICAgICAgICAgICAgIixtQ2xhc3M9IiArIG1DbGFzcyArICIsbVN1YmNsYXNzPSIgKyBtU3ViY2xhc3MgKworICAgICAgICAgICAgICAgICAgICAiLG1Qcm90b2NvbD0iICsgbVByb3RvY29sICsgIl0iOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgVVNCIGFjY2Vzc29yeS4KKyAgICAvLyBXaGVuIHVzZWQgaW4gSGFzaE1hcHMgYWxsIHZhbHVlcyBtdXN0IGJlIHNwZWNpZmllZCwKKyAgICAvLyBidXQgd2lsZGNhcmRzIGNhbiBiZSB1c2VkIGZvciBhbnkgb2YgdGhlIGZpZWxkcyBpbgorICAgIC8vIHRoZSBwYWNrYWdlIG1ldGEtZGF0YS4KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBY2Nlc3NvcnlGaWx0ZXIgeworICAgICAgICAvLyBVU0IgYWNjZXNzb3J5IG1hbnVmYWN0dXJlciAob3IgbnVsbCBmb3IgdW5zcGVjaWZpZWQpCisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbU1hbnVmYWN0dXJlcjsKKyAgICAgICAgLy8gVVNCIGFjY2Vzc29yeSBtb2RlbCAob3IgbnVsbCBmb3IgdW5zcGVjaWZpZWQpCisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbU1vZGVsOworICAgICAgICAvLyBVU0IgYWNjZXNzb3J5IHZlcnNpb24gKG9yIG51bGwgZm9yIHVuc3BlY2lmaWVkKQorICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1WZXJzaW9uOworCisgICAgICAgIHB1YmxpYyBBY2Nlc3NvcnlGaWx0ZXIoU3RyaW5nIG1hbnVmYWN0dXJlciwgU3RyaW5nIG1vZGVsLCBTdHJpbmcgdmVyc2lvbikgeworICAgICAgICAgICAgbU1hbnVmYWN0dXJlciA9IG1hbnVmYWN0dXJlcjsKKyAgICAgICAgICAgIG1Nb2RlbCA9IG1vZGVsOworICAgICAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjY2Vzc29yeUZpbHRlcihVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5KSB7CisgICAgICAgICAgICBtTWFudWZhY3R1cmVyID0gYWNjZXNzb3J5LmdldE1hbnVmYWN0dXJlcigpOworICAgICAgICAgICAgbU1vZGVsID0gYWNjZXNzb3J5LmdldE1vZGVsKCk7CisgICAgICAgICAgICBtVmVyc2lvbiA9IGFjY2Vzc29yeS5nZXRWZXJzaW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc29yeUZpbHRlciByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgbWFudWZhY3R1cmVyID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBtb2RlbCA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IG51bGw7CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIm1hbnVmYWN0dXJlciIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0dXJlciA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1vZGVsIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJ2ZXJzaW9uIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NvcnlGaWx0ZXIobWFudWZhY3R1cmVyLCBtb2RlbCwgdmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIpdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgInVzYi1hY2Nlc3NvcnkiKTsKKyAgICAgICAgICAgIGlmIChtTWFudWZhY3R1cmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAibWFudWZhY3R1cmVyIiwgbU1hbnVmYWN0dXJlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobU1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAibW9kZWwiLCBtTW9kZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1WZXJzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAidmVyc2lvbiIsIG1WZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsICJ1c2ItYWNjZXNzb3J5Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFVzYkFjY2Vzc29yeSBhY2MpIHsKKyAgICAgICAgICAgIGlmIChtTWFudWZhY3R1cmVyICE9IG51bGwgJiYgIWFjYy5nZXRNYW51ZmFjdHVyZXIoKS5lcXVhbHMobU1hbnVmYWN0dXJlcikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtTW9kZWwgIT0gbnVsbCAmJiAhYWNjLmdldE1vZGVsKCkuZXF1YWxzKG1Nb2RlbCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtVmVyc2lvbiAhPSBudWxsICYmICFhY2MuZ2V0VmVyc2lvbigpLmVxdWFscyhtVmVyc2lvbikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhBY2Nlc3NvcnlGaWx0ZXIgZikgeworICAgICAgICAgICAgaWYgKG1NYW51ZmFjdHVyZXIgIT0gbnVsbCAmJiAhZi5tTWFudWZhY3R1cmVyLmVxdWFscyhtTWFudWZhY3R1cmVyKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG1Nb2RlbCAhPSBudWxsICYmICFmLm1Nb2RlbC5lcXVhbHMobU1vZGVsKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG1WZXJzaW9uICE9IG51bGwgJiYgIWYubVZlcnNpb24uZXF1YWxzKG1WZXJzaW9uKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIC8vIGNhbid0IGNvbXBhcmUgaWYgd2UgaGF2ZSB3aWxkY2FyZCBzdHJpbmdzCisgICAgICAgICAgICBpZiAobU1hbnVmYWN0dXJlciA9PSBudWxsIHx8IG1Nb2RlbCA9PSBudWxsIHx8IG1WZXJzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQWNjZXNzb3J5RmlsdGVyKSB7CisgICAgICAgICAgICAgICAgQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA9IChBY2Nlc3NvcnlGaWx0ZXIpb2JqOworICAgICAgICAgICAgICAgIHJldHVybiAobU1hbnVmYWN0dXJlci5lcXVhbHMoZmlsdGVyLm1NYW51ZmFjdHVyZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtTW9kZWwuZXF1YWxzKGZpbHRlci5tTW9kZWwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtVmVyc2lvbi5lcXVhbHMoZmlsdGVyLm1WZXJzaW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVXNiQWNjZXNzb3J5KSB7CisgICAgICAgICAgICAgICAgVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSA9IChVc2JBY2Nlc3Nvcnkpb2JqOworICAgICAgICAgICAgICAgIHJldHVybiAobU1hbnVmYWN0dXJlci5lcXVhbHMoYWNjZXNzb3J5LmdldE1hbnVmYWN0dXJlcigpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbU1vZGVsLmVxdWFscyhhY2Nlc3NvcnkuZ2V0TW9kZWwoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WZXJzaW9uLmVxdWFscyhhY2Nlc3NvcnkuZ2V0VmVyc2lvbigpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoKG1NYW51ZmFjdHVyZXIgPT0gbnVsbCA/IDAgOiBtTWFudWZhY3R1cmVyLmhhc2hDb2RlKCkpIF4KKyAgICAgICAgICAgICAgICAgICAgKG1Nb2RlbCA9PSBudWxsID8gMCA6IG1Nb2RlbC5oYXNoQ29kZSgpKSBeCisgICAgICAgICAgICAgICAgICAgIChtVmVyc2lvbiA9PSBudWxsID8gMCA6IG1WZXJzaW9uLmhhc2hDb2RlKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJBY2Nlc3NvcnlGaWx0ZXJbbU1hbnVmYWN0dXJlcj1cIiIgKyBtTWFudWZhY3R1cmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiLCBtTW9kZWw9XCIiICsgbU1vZGVsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiLCBtVmVyc2lvbj1cIiIgKyBtVmVyc2lvbiArICJcIl0iOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBNeVBhY2thZ2VNb25pdG9yIGV4dGVuZHMgUGFja2FnZU1vbml0b3IgeworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFja2FnZUFkZGVkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHVpZCkgeworICAgICAgICAgICAgaGFuZGxlUGFja2FnZVVwZGF0ZShwYWNrYWdlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblBhY2thZ2VDaGFuZ2VkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHVpZCwgU3RyaW5nW10gY29tcG9uZW50cykgeworICAgICAgICAgICAgaGFuZGxlUGFja2FnZVVwZGF0ZShwYWNrYWdlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblBhY2thZ2VSZW1vdmVkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHVpZCkgeworICAgICAgICAgICAgY2xlYXJEZWZhdWx0cyhwYWNrYWdlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgTXlQYWNrYWdlTW9uaXRvciBtUGFja2FnZU1vbml0b3IgPSBuZXcgTXlQYWNrYWdlTW9uaXRvcigpOworCisgICAgcHVibGljIFVzYlNldHRpbmdzTWFuYWdlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHJlYWRTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICB9CisgICAgICAgIG1QYWNrYWdlTW9uaXRvci5yZWdpc3Rlcihjb250ZXh0LCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZFByZWZlcmVuY2UoWG1sUHVsbFBhcnNlciBwYXJzZXIpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOworICAgICAgICBpbnQgY291bnQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoInBhY2thZ2UiLmVxdWFscyhwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZShpKSkpIHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBYbWxVdGlscy5uZXh0RWxlbWVudChwYXJzZXIpOworICAgICAgICBpZiAoInVzYi1kZXZpY2UiLmVxdWFscyhwYXJzZXIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgRGV2aWNlRmlsdGVyIGZpbHRlciA9IERldmljZUZpbHRlci5yZWFkKHBhcnNlcik7CisgICAgICAgICAgICBtRGV2aWNlUHJlZmVyZW5jZU1hcC5wdXQoZmlsdGVyLCBwYWNrYWdlTmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAoInVzYi1hY2Nlc3NvcnkiLmVxdWFscyhwYXJzZXIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA9IEFjY2Vzc29yeUZpbHRlci5yZWFkKHBhcnNlcik7CisgICAgICAgICAgICBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5wdXQoZmlsdGVyLCBwYWNrYWdlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZFNldHRpbmdzTG9ja2VkKCkgeworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc1NldHRpbmdzRmlsZSk7CisgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IFhtbC5uZXdQdWxsUGFyc2VyKCk7CisgICAgICAgICAgICBwYXJzZXIuc2V0SW5wdXQoc3RyZWFtLCBudWxsKTsKKworICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKKyAgICAgICAgICAgIHdoaWxlIChwYXJzZXIuZ2V0RXZlbnRUeXBlKCkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFnTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCJwcmVmZXJlbmNlIi5lcXVhbHModGFnTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZFByZWZlcmVuY2UocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJzZXR0aW5ncyBmaWxlIG5vdCBmb3VuZCIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXJyb3IgcmVhZGluZyBzZXR0aW5ncyBmaWxlLCBkZWxldGluZyB0byBzdGFydCBmcmVzaCIsIGUpOworICAgICAgICAgICAgc1NldHRpbmdzRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVTZXR0aW5nc0xvY2tlZCgpIHsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmc3RyID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc1NldHRpbmdzRmlsZSk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJ3cml0aW5nIHNldHRpbmdzIHRvICIgKyBmc3RyKTsKKyAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHN0ciA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmc3RyKTsKKyAgICAgICAgICAgIEZhc3RYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgRmFzdFhtbFNlcmlhbGl6ZXIoKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0KHN0ciwgInV0Zi04Iik7CisgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0RG9jdW1lbnQobnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWxwdWxsLm9yZy92MS9kb2MvZmVhdHVyZXMuaHRtbCNpbmRlbnQtb3V0cHV0IiwgdHJ1ZSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG51bGwsICJzZXR0aW5ncyIpOworCisgICAgICAgICAgICBmb3IgKERldmljZUZpbHRlciBmaWx0ZXIgOiBtRGV2aWNlUHJlZmVyZW5jZU1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgInByZWZlcmVuY2UiKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAicGFja2FnZSIsIG1EZXZpY2VQcmVmZXJlbmNlTWFwLmdldChmaWx0ZXIpKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXIud3JpdGUoc2VyaWFsaXplcik7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcobnVsbCwgInByZWZlcmVuY2UiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyIDogbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG51bGwsICJwcmVmZXJlbmNlIik7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInBhY2thZ2UiLCBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5nZXQoZmlsdGVyKSk7CisgICAgICAgICAgICAgICAgZmlsdGVyLndyaXRlKHNlcmlhbGl6ZXIpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsICJwcmVmZXJlbmNlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsICJzZXR0aW5ncyIpOworICAgICAgICAgICAgc2VyaWFsaXplci5lbmREb2N1bWVudCgpOworCisgICAgICAgICAgICBzdHIuZmx1c2goKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5zeW5jKGZzdHIpOworICAgICAgICAgICAgc3RyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciB3cml0aW5nIHNldHRpbmdzIGZpbGUsIGRlbGV0aW5nIHRvIHN0YXJ0IGZyZXNoIiwgZSk7CisgICAgICAgICAgICBzU2V0dGluZ3NGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiBhIHBhY2thZ2UgbWF0Y2hlcyBhIGRldmljZSBvciBhY2Nlc3NvcnkuCisgICAgLy8gT25seSBvbmUgb2YgZGV2aWNlIGFuZCBhY2Nlc3Nvcnkgc2hvdWxkIGJlIG5vbi1udWxsLgorICAgIHByaXZhdGUgYm9vbGVhbiBwYWNrYWdlTWF0Y2hlc0xvY2tlZChSZXNvbHZlSW5mbyBpbmZvLCBTdHJpbmcgbWV0YURhdGFOYW1lLAorICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSwgVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgeworICAgICAgICBBY3Rpdml0eUluZm8gYWkgPSBpbmZvLmFjdGl2aXR5SW5mbzsKKworICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gYWkubG9hZFhtbE1ldGFEYXRhKG1QYWNrYWdlTWFuYWdlciwgbWV0YURhdGFOYW1lKTsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm5vIG1ldGEtZGF0YSBmb3IgIiArIGluZm8pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKKyAgICAgICAgICAgIHdoaWxlIChwYXJzZXIuZ2V0RXZlbnRUeXBlKCkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFnTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxsICYmICJ1c2ItZGV2aWNlIi5lcXVhbHModGFnTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlRmlsdGVyIGZpbHRlciA9IERldmljZUZpbHRlci5yZWFkKHBhcnNlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhY2Nlc3NvcnkgIT0gbnVsbCAmJiAidXNiLWFjY2Vzc29yeSIuZXF1YWxzKHRhZ05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc29yeUZpbHRlciBmaWx0ZXIgPSBBY2Nlc3NvcnlGaWx0ZXIucmVhZChwYXJzZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMoYWNjZXNzb3J5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBsb2FkIGNvbXBvbmVudCBpbmZvICIgKyBpbmZvLnRvU3RyaW5nKCksIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+IGdldERldmljZU1hdGNoZXNMb2NrZWQoVXNiRGV2aWNlIGRldmljZSwgSW50ZW50IGludGVudCkgeworICAgICAgICBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0PFJlc29sdmVJbmZvPigpOworICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiByZXNvbHZlSW5mb3MgPSBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRBY3Rpdml0aWVzKGludGVudCwKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgaW50IGNvdW50ID0gcmVzb2x2ZUluZm9zLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IHJlc29sdmVJbmZvcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAocGFja2FnZU1hdGNoZXNMb2NrZWQocmVzb2x2ZUluZm8sIGludGVudC5nZXRBY3Rpb24oKSwgZGV2aWNlLCBudWxsKSkgeworICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKHJlc29sdmVJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF0Y2hlczsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gZ2V0QWNjZXNzb3J5TWF0Y2hlc0xvY2tlZCgKKyAgICAgICAgICAgIFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnksIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgQXJyYXlMaXN0PFJlc29sdmVJbmZvPiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDxSZXNvbHZlSW5mbz4oKTsKKyAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gcmVzb2x2ZUluZm9zID0gbVBhY2thZ2VNYW5hZ2VyLnF1ZXJ5SW50ZW50QWN0aXZpdGllcyhpbnRlbnQsCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7CisgICAgICAgIGludCBjb3VudCA9IHJlc29sdmVJbmZvcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gPSByZXNvbHZlSW5mb3MuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHBhY2thZ2VNYXRjaGVzTG9ja2VkKHJlc29sdmVJbmZvLCBpbnRlbnQuZ2V0QWN0aW9uKCksIG51bGwsIGFjY2Vzc29yeSkpIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChyZXNvbHZlSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGV2aWNlQXR0YWNoZWQoVXNiRGV2aWNlIGRldmljZSkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfREVWSUNFX0FUVEFDSEVEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworCisgICAgICAgIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gbWF0Y2hlczsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtYXRjaGVzID0gZ2V0RGV2aWNlTWF0Y2hlc0xvY2tlZChkZXZpY2UsIGludGVudCk7CisgICAgICAgICAgICAvLyBMYXVuY2ggb3VyIGRlZmF1bHQgYWN0aXZpdHkgZGlyZWN0bHksIGlmIHdlIGhhdmUgb25lLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIHdpbGwgc3RhcnQgdGhlIFVzYlJlc29sdmVyQWN0aXZpdHkgdG8gYWxsb3cgdGhlIHVzZXIgdG8gY2hvb3NlLgorICAgICAgICAgICAgZGVmYXVsdFBhY2thZ2UgPSBtRGV2aWNlUHJlZmVyZW5jZU1hcC5nZXQobmV3IERldmljZUZpbHRlcihkZXZpY2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc29sdmVBY3Rpdml0eShpbnRlbnQsIG1hdGNoZXMsIGRlZmF1bHRQYWNrYWdlLCBkZXZpY2UsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRldmljZURldGFjaGVkKFVzYkRldmljZSBkZXZpY2UpIHsKKyAgICAgICAgLy8gY2xlYXIgdGVtcG9yYXJ5IHBlcm1pc3Npb25zIGZvciB0aGUgZGV2aWNlCisgICAgICAgIG1EZXZpY2VQZXJtaXNzaW9uTWFwLnJlbW92ZShkZXZpY2UuZ2V0RGV2aWNlTmFtZSgpKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfREVWSUNFX0RFVEFDSEVEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBMb2cuZChUQUcsICJ1c2JEZXZpY2VSZW1vdmVkLCBzZW5kaW5nICIgKyBpbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXNzb3J5QXR0YWNoZWQoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfQUNDRVNTT1JZX0FUVEFDSEVEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfQUNDRVNTT1JZLCBhY2Nlc3NvcnkpOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworCisgICAgICAgIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gbWF0Y2hlczsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtYXRjaGVzID0gZ2V0QWNjZXNzb3J5TWF0Y2hlc0xvY2tlZChhY2Nlc3NvcnksIGludGVudCk7CisgICAgICAgICAgICAvLyBMYXVuY2ggb3VyIGRlZmF1bHQgYWN0aXZpdHkgZGlyZWN0bHksIGlmIHdlIGhhdmUgb25lLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIHdpbGwgc3RhcnQgdGhlIFVzYlJlc29sdmVyQWN0aXZpdHkgdG8gYWxsb3cgdGhlIHVzZXIgdG8gY2hvb3NlLgorICAgICAgICAgICAgZGVmYXVsdFBhY2thZ2UgPSBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5nZXQobmV3IEFjY2Vzc29yeUZpbHRlcihhY2Nlc3NvcnkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc29sdmVBY3Rpdml0eShpbnRlbnQsIG1hdGNoZXMsIGRlZmF1bHRQYWNrYWdlLCBudWxsLCBhY2Nlc3NvcnkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2Vzc29yeURldGFjaGVkKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKKyAgICAgICAgLy8gY2xlYXIgdGVtcG9yYXJ5IHBlcm1pc3Npb25zIGZvciB0aGUgYWNjZXNzb3J5CisgICAgICAgIG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwLnJlbW92ZShhY2Nlc3NvcnkpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KAorICAgICAgICAgICAgICAgIFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9BQ0NFU1NPUllfREVUQUNIRUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUFjdGl2aXR5KEludGVudCBpbnRlbnQsIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gbWF0Y2hlcywKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0UGFja2FnZSwgVXNiRGV2aWNlIGRldmljZSwgVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgeworICAgICAgICBpbnQgY291bnQgPSBtYXRjaGVzLnNpemUoKTsKKworICAgICAgICAvLyBkb24ndCBzaG93IHRoZSByZXNvbHZlciBhY3Rpdml0eSBpZiB0aGVyZSBhcmUgbm8gY2hvaWNlcyBhdmFpbGFibGUKKyAgICAgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBhY2Nlc3NvcnkuZ2V0VXJpKCk7CisgICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheSBVUkkgdG8gdXNlcgorICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBVc2JSZXNvbHZlckFjdGl2aXR5IHNvIHVzZXIgY2FuIGNob29zZSBhbiBhY3Rpdml0eQorICAgICAgICAgICAgICAgICAgICBJbnRlbnQgZGlhbG9nSW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgICAgICBkaWFsb2dJbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5zeXN0ZW11aSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnVzYi5Vc2JBY2Nlc3NvcnlVcmlBY3Rpdml0eSIpOworICAgICAgICAgICAgICAgICAgICBkaWFsb2dJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgICAgICAgICBkaWFsb2dJbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7CisgICAgICAgICAgICAgICAgICAgIGRpYWxvZ0ludGVudC5wdXRFeHRyYSgidXJpIiwgdXJpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoZGlhbG9nSW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJ1bmFibGUgdG8gc3RhcnQgVXNiQWNjZXNzb3J5VXJpQWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUmVzb2x2ZUluZm8gZGVmYXVsdFJJID0gbnVsbDsKKyAgICAgICAgaWYgKGNvdW50ID09IDEgJiYgZGVmYXVsdFBhY2thZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG91ciBzaW5nbGUgY2hvaWNlIGlzIG9uIHRoZSBzeXN0ZW0gcGFydGl0aW9uLgorICAgICAgICAgICAgLy8gSWYgc28sIHRyZWF0IGl0IGFzIG91ciBkZWZhdWx0IHdpdGhvdXQgY2FsbGluZyBVc2JSZXNvbHZlckFjdGl2aXR5CisgICAgICAgICAgICBSZXNvbHZlSW5mbyBySW5mbyA9IG1hdGNoZXMuZ2V0KDApOworICAgICAgICAgICAgaWYgKHJJbmZvLmFjdGl2aXR5SW5mbyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIHJJbmZvLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8gIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAockluZm8uYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NZU1RFTSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRSSSA9IHJJbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmF1bHRSSSA9PSBudWxsICYmIGRlZmF1bHRQYWNrYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIGRlZmF1bHQgYWN0aXZpdHkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFJlc29sdmVJbmZvIHJJbmZvID0gbWF0Y2hlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHJJbmZvLmFjdGl2aXR5SW5mbyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UGFja2FnZS5lcXVhbHMockluZm8uYWN0aXZpdHlJbmZvLnBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UkkgPSBySW5mbzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmF1bHRSSSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBncmFudCBwZXJtaXNzaW9uIGZvciBkZWZhdWx0IGFjdGl2aXR5CisgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBncmFudERldmljZVBlcm1pc3Npb24oZGV2aWNlLCBkZWZhdWx0UkkuYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mby51aWQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY2Nlc3NvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGdyYW50QWNjZXNzb3J5UGVybWlzc2lvbihhY2Nlc3NvcnksIGRlZmF1bHRSSS5hY3Rpdml0eUluZm8uYXBwbGljYXRpb25JbmZvLnVpZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IGRlZmF1bHQgYWN0aXZpdHkgZGlyZWN0bHkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKGRlZmF1bHRSSS5hY3Rpdml0eUluZm8ucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRSSS5hY3Rpdml0eUluZm8ubmFtZSkpOworICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInN0YXJ0QWN0aXZpdHkgZmFpbGVkIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJbnRlbnQgcmVzb2x2ZXJJbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICByZXNvbHZlckludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgLy8gc3RhcnQgVXNiQ29uZmlybUFjdGl2aXR5IGlmIHRoZXJlIGlzIG9ubHkgb25lIGNob2ljZQorICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuc3lzdGVtdWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnVzYi5Vc2JDb25maXJtQWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICByZXNvbHZlckludGVudC5wdXRFeHRyYSgicmluZm8iLCBtYXRjaGVzLmdldCgwKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9ERVZJQ0UsIGRldmljZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBVc2JSZXNvbHZlckFjdGl2aXR5IHNvIHVzZXIgY2FuIGNob29zZSBhbiBhY3Rpdml0eQorICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuc3lzdGVtdWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnVzYi5Vc2JSZXNvbHZlckFjdGl2aXR5Iik7CisgICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQucHV0UGFyY2VsYWJsZUFycmF5TGlzdEV4dHJhKCJybGlzdCIsIG1hdGNoZXMpOworICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnB1dEV4dHJhKEludGVudC5FWFRSQV9JTlRFTlQsIGludGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkocmVzb2x2ZXJJbnRlbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAidW5hYmxlIHRvIHN0YXJ0IGFjdGl2aXR5ICIgKyByZXNvbHZlckludGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2xlYXJDb21wYXRpYmxlTWF0Y2hlc0xvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUsIERldmljZUZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGZvciAoRGV2aWNlRmlsdGVyIHRlc3QgOiBtRGV2aWNlUHJlZmVyZW5jZU1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGZpbHRlci5tYXRjaGVzKHRlc3QpKSB7CisgICAgICAgICAgICAgICAgbURldmljZVByZWZlcmVuY2VNYXAucmVtb3ZlKHRlc3QpOworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhckNvbXBhdGlibGVNYXRjaGVzTG9ja2VkKFN0cmluZyBwYWNrYWdlTmFtZSwgQWNjZXNzb3J5RmlsdGVyIGZpbHRlcikgeworICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChBY2Nlc3NvcnlGaWx0ZXIgdGVzdCA6IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXModGVzdCkpIHsKKyAgICAgICAgICAgICAgICBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5yZW1vdmUodGVzdCk7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVBhY2thZ2VVcGRhdGVMb2NrZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBBY3Rpdml0eUluZm8gYUluZm8sCisgICAgICAgICAgICBTdHJpbmcgbWV0YURhdGFOYW1lKSB7CisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBhSW5mby5sb2FkWG1sTWV0YURhdGEobVBhY2thZ2VNYW5hZ2VyLCBtZXRhRGF0YU5hbWUpOworICAgICAgICAgICAgaWYgKHBhcnNlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7CisgICAgICAgICAgICB3aGlsZSAocGFyc2VyLmdldEV2ZW50VHlwZSgpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgidXNiLWRldmljZSIuZXF1YWxzKHRhZ05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIERldmljZUZpbHRlciBmaWx0ZXIgPSBEZXZpY2VGaWx0ZXIucmVhZChwYXJzZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJDb21wYXRpYmxlTWF0Y2hlc0xvY2tlZChwYWNrYWdlTmFtZSwgZmlsdGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoInVzYi1hY2Nlc3NvcnkiLmVxdWFscyh0YWdOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyID0gQWNjZXNzb3J5RmlsdGVyLnJlYWQocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyQ29tcGF0aWJsZU1hdGNoZXNMb2NrZWQocGFja2FnZU5hbWUsIGZpbHRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gbG9hZCBjb21wb25lbnQgaW5mbyAiICsgYUluZm8udG9TdHJpbmcoKSwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgIH0KKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcGFja2FnZSBzdXBwb3J0cyBhbnkgVVNCIGRldmljZXMgb3IgYWNjZXNzb3JpZXMuCisgICAgLy8gSWYgc28sIGNsZWFyIGFueSBub24tbWF0Y2hpbmcgcHJlZmVyZW5jZXMgZm9yIG1hdGNoaW5nIGRldmljZXMvYWNjZXNzb3JpZXMuCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBhY2thZ2VVcGRhdGUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIFBhY2thZ2VJbmZvIGluZm87CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbmZvID0gbVBhY2thZ2VNYW5hZ2VyLmdldFBhY2thZ2VJbmZvKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX0FDVElWSVRJRVMgfCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiaGFuZGxlUGFja2FnZVVwZGF0ZSBjb3VsZCBub3QgZmluZCBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBY3Rpdml0eUluZm9bXSBhY3Rpdml0aWVzID0gaW5mby5hY3Rpdml0aWVzOworICAgICAgICAgICAgaWYgKGFjdGl2aXRpZXMgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpdml0aWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG1ldGEtZGF0YSwgYm90aCBmb3IgZGV2aWNlcyBhbmQgYWNjZXNzb3JpZXMKKyAgICAgICAgICAgICAgICBpZiAoaGFuZGxlUGFja2FnZVVwZGF0ZUxvY2tlZChwYWNrYWdlTmFtZSwgYWN0aXZpdGllc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9ERVZJQ0VfQVRUQUNIRUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFuZGxlUGFja2FnZVVwZGF0ZUxvY2tlZChwYWNrYWdlTmFtZSwgYWN0aXZpdGllc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9BQ0NFU1NPUllfQVRUQUNIRUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQZXJtaXNzaW9uKFVzYkRldmljZSBkZXZpY2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IHVpZExpc3QgPSBtRGV2aWNlUGVybWlzc2lvbk1hcC5nZXQoZGV2aWNlLmdldERldmljZU5hbWUoKSk7CisgICAgICAgICAgICBpZiAodWlkTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVpZExpc3QuZ2V0KEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUGVybWlzc2lvbihVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSB1aWRMaXN0ID0gbUFjY2Vzc29yeVBlcm1pc3Npb25NYXAuZ2V0KGFjY2Vzc29yeSk7CisgICAgICAgICAgICBpZiAodWlkTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVpZExpc3QuZ2V0KEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFVzYkRldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uKGRldmljZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVXNlciBoYXMgbm90IGdpdmVuIHBlcm1pc3Npb24gdG8gZGV2aWNlICIgKyBkZXZpY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKKyAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uKGFjY2Vzc29yeSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVXNlciBoYXMgbm90IGdpdmVuIHBlcm1pc3Npb24gdG8gYWNjZXNzb3J5ICIgKyBhY2Nlc3NvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RQZXJtaXNzaW9uRGlhbG9nKEludGVudCBpbnRlbnQsIFN0cmluZyBwYWNrYWdlTmFtZSwgUGVuZGluZ0ludGVudCBwaSkgeworICAgICAgICBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKKworICAgICAgICAvLyBjb21wYXJlIHVpZCB3aXRoIHBhY2thZ2VOYW1lIHRvIGZvaWwgYXBwcyBwcmV0ZW5kaW5nIHRvIGJlIHNvbWVvbmUgZWxzZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFJbmZvID0gbVBhY2thZ2VNYW5hZ2VyLmdldEFwcGxpY2F0aW9uSW5mbyhwYWNrYWdlTmFtZSwgMCk7CisgICAgICAgICAgICBpZiAoYUluZm8udWlkICE9IHVpZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgbWF0Y2ggY2FsbGVyJ3MgdWlkICIgKyB1aWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiIG5vdCBmb3VuZCIpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBpZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5zeXN0ZW11aSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnVzYi5Vc2JQZXJtaXNzaW9uQWN0aXZpdHkiKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEludGVudC5FWFRSQV9JTlRFTlQsIHBpKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJwYWNrYWdlIiwgcGFja2FnZU5hbWUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInVpZCIsIHVpZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAidW5hYmxlIHRvIHN0YXJ0IFVzYlBlcm1pc3Npb25BY3Rpdml0eSIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVxdWVzdFBlcm1pc3Npb24oVXNiRGV2aWNlIGRldmljZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBQZW5kaW5nSW50ZW50IHBpKSB7CisgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworCisgICAgICAgIC8vIHJlc3BvbmQgaW1tZWRpYXRlbHkgaWYgcGVybWlzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIGdyYW50ZWQKKyAgICAgIGlmIChoYXNQZXJtaXNzaW9uKGRldmljZSkpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX1BFUk1JU1NJT05fR1JBTlRFRCwgdHJ1ZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBpLnNlbmQobUNvbnRleHQsIDAsIGludGVudCk7CisgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZXF1ZXN0UGVybWlzc2lvbiBQZW5kaW5nSW50ZW50IHdhcyBjYW5jZWxsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0YXJ0IFVzYlBlcm1pc3Npb25BY3Rpdml0eSBzbyB1c2VyIGNhbiBjaG9vc2UgYW4gYWN0aXZpdHkKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICByZXF1ZXN0UGVybWlzc2lvbkRpYWxvZyhpbnRlbnQsIHBhY2thZ2VOYW1lLCBwaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVxdWVzdFBlcm1pc3Npb24oVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBQZW5kaW5nSW50ZW50IHBpKSB7CisgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworCisgICAgICAgIC8vIHJlc3BvbmQgaW1tZWRpYXRlbHkgaWYgcGVybWlzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIGdyYW50ZWQKKyAgICAgICAgaWYgKGhhc1Blcm1pc3Npb24oYWNjZXNzb3J5KSkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfQUNDRVNTT1JZLCBhY2Nlc3NvcnkpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfUEVSTUlTU0lPTl9HUkFOVEVELCB0cnVlKTsKKyAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwaS5zZW5kKG1Db250ZXh0LCAwLCBpbnRlbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicmVxdWVzdFBlcm1pc3Npb24gUGVuZGluZ0ludGVudCB3YXMgY2FuY2VsbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7CisgICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uRGlhbG9nKGludGVudCwgcGFja2FnZU5hbWUsIHBpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXZpY2VQYWNrYWdlKFVzYkRldmljZSBkZXZpY2UsIFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBEZXZpY2VGaWx0ZXIgZmlsdGVyID0gbmV3IERldmljZUZpbHRlcihkZXZpY2UpOworICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gKG1EZXZpY2VQcmVmZXJlbmNlTWFwLnJlbW92ZShmaWx0ZXIpICE9IG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gIXBhY2thZ2VOYW1lLmVxdWFscyhtRGV2aWNlUHJlZmVyZW5jZU1hcC5nZXQoZmlsdGVyKSk7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVByZWZlcmVuY2VNYXAucHV0KGZpbHRlciwgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgd3JpdGVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzb3J5UGFja2FnZShVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5LCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA9IG5ldyBBY2Nlc3NvcnlGaWx0ZXIoYWNjZXNzb3J5KTsKKyAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IChtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5yZW1vdmUoZmlsdGVyKSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9ICFwYWNrYWdlTmFtZS5lcXVhbHMobUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuZ2V0KGZpbHRlcikpOworICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLnB1dChmaWx0ZXIsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgIHdyaXRlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdyYW50RGV2aWNlUGVybWlzc2lvbihVc2JEZXZpY2UgZGV2aWNlLCBpbnQgdWlkKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIFN0cmluZyBkZXZpY2VOYW1lID0gZGV2aWNlLmdldERldmljZU5hbWUoKTsKKyAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSB1aWRMaXN0ID0gbURldmljZVBlcm1pc3Npb25NYXAuZ2V0KGRldmljZU5hbWUpOworICAgICAgICAgICAgaWYgKHVpZExpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVpZExpc3QgPSBuZXcgU3BhcnNlQm9vbGVhbkFycmF5KDEpOworICAgICAgICAgICAgICAgIG1EZXZpY2VQZXJtaXNzaW9uTWFwLnB1dChkZXZpY2VOYW1lLCB1aWRMaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpZExpc3QucHV0KHVpZCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncmFudEFjY2Vzc29yeVBlcm1pc3Npb24oVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSwgaW50IHVpZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgdWlkTGlzdCA9IG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwLmdldChhY2Nlc3NvcnkpOworICAgICAgICAgICAgaWYgKHVpZExpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVpZExpc3QgPSBuZXcgU3BhcnNlQm9vbGVhbkFycmF5KDEpOworICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwLnB1dChhY2Nlc3NvcnksIHVpZExpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWlkTGlzdC5wdXQodWlkLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0RlZmF1bHRzKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobURldmljZVByZWZlcmVuY2VNYXAudmFsdWVzKCkuY29udGFpbnMocGFja2FnZU5hbWUpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC52YWx1ZXMoKS5jb250YWlucyhwYWNrYWdlTmFtZSkpIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJEZWZhdWx0cyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKGNsZWFyUGFja2FnZURlZmF1bHRzTG9ja2VkKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIHdyaXRlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhclBhY2thZ2VEZWZhdWx0c0xvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgYm9vbGVhbiBjbGVhcmVkID0gZmFsc2U7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtRGV2aWNlUHJlZmVyZW5jZU1hcC5jb250YWluc1ZhbHVlKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBjb3B5IG9mIHRoZSBrZXkgc2V0IHRvIGF2b2lkIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KKyAgICAgICAgICAgICAgICBPYmplY3RbXSBrZXlzID0gbURldmljZVByZWZlcmVuY2VNYXAua2V5U2V0KCkudG9BcnJheSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0ga2V5c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhtRGV2aWNlUHJlZmVyZW5jZU1hcC5nZXQoa2V5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQcmVmZXJlbmNlTWFwLnJlbW92ZShrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuY29udGFpbnNWYWx1ZShwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUga2V5IHNldCB0byBhdm9pZCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgT2JqZWN0W10ga2V5cyA9IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmtleVNldCgpLnRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGtleXNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMobUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuZ2V0KGtleSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5yZW1vdmUoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNsZWFyZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIERldmljZSBwZXJtaXNzaW9uczoiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGRldmljZU5hbWUgOiBtRGV2aWNlUGVybWlzc2lvbk1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgIiArIGRldmljZU5hbWUgKyAiOiAiKTsKKyAgICAgICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgdWlkTGlzdCA9IG1EZXZpY2VQZXJtaXNzaW9uTWFwLmdldChkZXZpY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSB1aWRMaXN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoSW50ZWdlci50b1N0cmluZyh1aWRMaXN0LmtleUF0KGkpKSArICIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHcucHJpbnRsbigiICBBY2Nlc3NvcnkgcGVybWlzc2lvbnM6Iik7CisgICAgICAgICAgICBmb3IgKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkgOiBtQWNjZXNzb3J5UGVybWlzc2lvbk1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgIiArIGFjY2Vzc29yeSArICI6ICIpOworICAgICAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSB1aWRMaXN0ID0gbUFjY2Vzc29yeVBlcm1pc3Npb25NYXAuZ2V0KGFjY2Vzc29yeSk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gdWlkTGlzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KEludGVnZXIudG9TdHJpbmcodWlkTGlzdC5rZXlBdChpKSkgKyAiICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgRGV2aWNlIHByZWZlcmVuY2VzOiIpOworICAgICAgICAgICAgZm9yIChEZXZpY2VGaWx0ZXIgZmlsdGVyIDogbURldmljZVByZWZlcmVuY2VNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgIiArIGZpbHRlciArICI6ICIgKyBtRGV2aWNlUHJlZmVyZW5jZU1hcC5nZXQoZmlsdGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIEFjY2Vzc29yeSBwcmVmZXJlbmNlczoiKTsKKyAgICAgICAgICAgIGZvciAoQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA6IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICIgKyBmaWx0ZXIgKyAiOiAiICsgbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuZ2V0KGZpbHRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRNYW5hZ2VyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9JbnB1dE1hbmFnZXIuamF2YQppbmRleCA2OWJkZTQxLi4zMDk1YzM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9JbnB1dE1hbmFnZXIuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9JbnB1dE1hbmFnZXIuamF2YQpAQCAtMjMsMTAgKzIzLDE0IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2VRdWV1ZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dENoYW5uZWw7CkBAIC01Nyw3ICs2MSw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja3MgbUNhbGxiYWNrczsKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBXaW5kb3dNYW5hZ2VyU2VydmljZSBtV2luZG93TWFuYWdlclNlcnZpY2U7Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVJbml0KENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIENhbGxiYWNrcyBjYWxsYmFja3MsIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVN0YXJ0KCk7CkBAIC04OCw2ICs5Miw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludFtdIG5hdGl2ZUdldElucHV0RGV2aWNlSWRzKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlVHJhbnNmZXJUb3VjaEZvY3VzKElucHV0Q2hhbm5lbCBmcm9tQ2hhbm5lbCwKICAgICAgICAgICAgIElucHV0Q2hhbm5lbCB0b0NoYW5uZWwpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFBvaW50ZXJTcGVlZChpbnQgc3BlZWQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgbmF0aXZlRHVtcCgpOwogICAgIAogICAgIC8vIElucHV0IGV2ZW50IGluamVjdGlvbiBjb25zdGFudHMgZGVmaW5lZCBpbiBJbnB1dERpc3BhdGNoZXIuaC4KQEAgLTEzMSwxMCArMTM2LDEzIEBACiAgICAgICAgIFNsb2cuaShUQUcsICJJbml0aWFsaXppbmcgaW5wdXQgbWFuYWdlciIpOwogICAgICAgICBuYXRpdmVJbml0KG1Db250ZXh0LCBtQ2FsbGJhY2tzLCBsb29wZXIuZ2V0UXVldWUoKSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CiAgICAgICAgIFNsb2cuaShUQUcsICJTdGFydGluZyBpbnB1dCBtYW5hZ2VyIik7CiAgICAgICAgIG5hdGl2ZVN0YXJ0KCk7CisKKyAgICAgICAgcmVnaXN0ZXJQb2ludGVyU3BlZWRTZXR0aW5nT2JzZXJ2ZXIoKTsKKyAgICAgICAgdXBkYXRlUG9pbnRlclNwZWVkRnJvbVNldHRpbmdzKCk7CiAgICAgfQogICAgIAogICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlTaXplKGludCBkaXNwbGF5SWQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewpAQCAtNDAzLDYgKzQxMSw0MiBAQAogICAgICAgICByZXR1cm4gbmF0aXZlVHJhbnNmZXJUb3VjaEZvY3VzKGZyb21DaGFubmVsLCB0b0NoYW5uZWwpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9pbnRlciBzcGVlZC4KKyAgICAgKiBAcGFyYW0gc3BlZWQgVGhlIHBvaW50ZXIgc3BlZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIC03IChzbG93ZXN0KSBhbmQgNyAoZmFzdGVzdCkKKyAgICAgKiB3aGVyZSAwIGlzIHRoZSBkZWZhdWx0IHNwZWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvaW50ZXJTcGVlZChpbnQgc3BlZWQpIHsKKyAgICAgICAgc3BlZWQgPSBNYXRoLm1pbihNYXRoLm1heChzcGVlZCwgLTcpLCA3KTsKKyAgICAgICAgbmF0aXZlU2V0UG9pbnRlclNwZWVkKHNwZWVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVQb2ludGVyU3BlZWRGcm9tU2V0dGluZ3MoKSB7CisgICAgICAgIGludCBzcGVlZCA9IGdldFBvaW50ZXJTcGVlZFNldHRpbmcoMCk7CisgICAgICAgIHNldFBvaW50ZXJTcGVlZChzcGVlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUG9pbnRlclNwZWVkU2V0dGluZ09ic2VydmVyKCkgeworICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKFNldHRpbmdzLlN5c3RlbS5QT0lOVEVSX1NQRUVEKSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICBuZXcgQ29udGVudE9ic2VydmVyKG1XaW5kb3dNYW5hZ2VyU2VydmljZS5tSCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQb2ludGVyU3BlZWRGcm9tU2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFBvaW50ZXJTcGVlZFNldHRpbmcoaW50IGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBpbnQgc3BlZWQgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzcGVlZCA9IFNldHRpbmdzLlN5c3RlbS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5QT0lOVEVSX1NQRUVEKTsKKyAgICAgICAgfSBjYXRjaCAoU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIHNuZmUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3BlZWQ7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZHVtcChQcmludFdyaXRlciBwdykgewogICAgICAgICBTdHJpbmcgZHVtcFN0ciA9IG5hdGl2ZUR1bXAoKTsKICAgICAgICAgaWYgKGR1bXBTdHIgIT0gbnVsbCkgewpAQCAtNTczLDYgKzYxNywyNiBAQAogICAgICAgICB9CiAKICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFwVGltZW91dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBWaWV3Q29uZmlndXJhdGlvbi5nZXRUYXBUaW1lb3V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIGludCBnZXREb3VibGVUYXBUaW1lb3V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFZpZXdDb25maWd1cmF0aW9uLmdldERvdWJsZVRhcFRpbWVvdXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwdWJsaWMgaW50IGdldExvbmdQcmVzc1RpbWVvdXQoKSB7CisgICAgICAgICAgICByZXR1cm4gVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VG91Y2hTbG9wKCkgeworICAgICAgICAgICAgcmV0dXJuIFZpZXdDb25maWd1cmF0aW9uLmdldChtQ29udGV4dCkuZ2V0U2NhbGVkVG91Y2hTbG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICAgICAgcHVibGljIGludCBnZXRNYXhFdmVudHNQZXJTZWNvbmQoKSB7CiAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsKICAgICAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9TY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbi5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU2NyZWVuUm90YXRpb25BbmltYXRpb24uamF2YQppbmRleCBiYjAxNjMzLi5iMDFkZGQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9TY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbi5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1NjcmVlblJvdGF0aW9uQW5pbWF0aW9uLmphdmEKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtRGlzcGxheSA9IGRpc3BsYXk7CiAKLSAgICAgICAgZGlzcGxheS5nZXRNZXRyaWNzKG1EaXNwbGF5TWV0cmljcyk7CisgICAgICAgIGRpc3BsYXkuZ2V0UmVhbE1ldHJpY3MobURpc3BsYXlNZXRyaWNzKTsKIAogICAgICAgICBCaXRtYXAgc2NyZWVuc2hvdCA9IFN1cmZhY2Uuc2NyZWVuc2hvdCgwLCAwKTsKIApAQCAtMjQ0LDcgKzI0NCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBtRGlzcGxheS5nZXRNZXRyaWNzKG1EaXNwbGF5TWV0cmljcyk7CisgICAgICAgIG1EaXNwbGF5LmdldFJlYWxNZXRyaWNzKG1EaXNwbGF5TWV0cmljcyk7CiAKICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYW5pbWF0aW9ucy4gIFRoaXMgaXMgYSBoYWNrLCByZWRlZmluaW5nIHdoYXQgInBhcmVudCIKICAgICAgICAgLy8gbWVhbnMgdG8gYWxsb3cgc3VwcGx5aW5nIHRoZSBsYXN0IGFuZCBuZXh0IHNpemUuICBJbiB0aGlzIGRlZmluaXRpb24KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1N0YXJ0aW5nRGF0YS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RhcnRpbmdEYXRhLmphdmEKaW5kZXggNjI1ZmNmZS4uNDZiYjQ4MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RhcnRpbmdEYXRhLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RhcnRpbmdEYXRhLmphdmEKQEAgLTE2LDE4ICsxNiwyMyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bTsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29tcGF0aWJpbGl0eUluZm87CisKIGZpbmFsIGNsYXNzIFN0YXJ0aW5nRGF0YSB7CiAgICAgZmluYWwgU3RyaW5nIHBrZzsKICAgICBmaW5hbCBpbnQgdGhlbWU7CisgICAgZmluYWwgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0SW5mbzsKICAgICBmaW5hbCBDaGFyU2VxdWVuY2Ugbm9uTG9jYWxpemVkTGFiZWw7CiAgICAgZmluYWwgaW50IGxhYmVsUmVzOwogICAgIGZpbmFsIGludCBpY29uOwogICAgIGZpbmFsIGludCB3aW5kb3dGbGFnczsKIAotICAgIFN0YXJ0aW5nRGF0YShTdHJpbmcgX3BrZywgaW50IF90aGVtZSwgQ2hhclNlcXVlbmNlIF9ub25Mb2NhbGl6ZWRMYWJlbCwKKyAgICBTdGFydGluZ0RhdGEoU3RyaW5nIF9wa2csIGludCBfdGhlbWUsIENvbXBhdGliaWxpdHlJbmZvIF9jb21wYXRJbmZvLAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIF9ub25Mb2NhbGl6ZWRMYWJlbCwKICAgICAgICAgICAgIGludCBfbGFiZWxSZXMsIGludCBfaWNvbiwgaW50IF93aW5kb3dGbGFncykgewogICAgICAgICBwa2cgPSBfcGtnOwogICAgICAgICB0aGVtZSA9IF90aGVtZTsKKyAgICAgICAgY29tcGF0SW5mbyA9IF9jb21wYXRJbmZvOwogICAgICAgICBub25Mb2NhbGl6ZWRMYWJlbCA9IF9ub25Mb2NhbGl6ZWRMYWJlbDsKICAgICAgICAgbGFiZWxSZXMgPSBfbGFiZWxSZXM7CiAgICAgICAgIGljb24gPSBfaWNvbjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1N0cmljdE1vZGVGbGFzaC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RyaWN0TW9kZUZsYXNoLmphdmEKaW5kZXggMmM2MjA4MC4uNzFiNTk1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RyaWN0TW9kZUZsYXNoLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RyaWN0TW9kZUZsYXNoLmphdmEKQEAgLTM5LDcgKzM5LDcgQEAKIAogICAgIHB1YmxpYyBTdHJpY3RNb2RlRmxhc2goRGlzcGxheSBkaXNwbGF5LCBTdXJmYWNlU2Vzc2lvbiBzZXNzaW9uKSB7CiAgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIGRtID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGRpc3BsYXkuZ2V0TWV0cmljcyhkbSk7CisgICAgICAgIGRpc3BsYXkuZ2V0UmVhbE1ldHJpY3MoZG0pOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHNlc3Npb24sIDAsICJTdHJpY3RNb2RlRmxhc2giLCAtMSwgMSwgMSwgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQsIDApOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2F0ZXJtYXJrLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYXRlcm1hcmsuamF2YQppbmRleCAyMjEyNmYzLi4zNzVhYmU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYXRlcm1hcmsuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYXRlcm1hcmsuamF2YQpAQCAtNTIsNyArNTIsNyBAQAogCiAgICAgV2F0ZXJtYXJrKERpc3BsYXkgZGlzcGxheSwgU3VyZmFjZVNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nW10gdG9rZW5zKSB7CiAgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIGRtID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGRpc3BsYXkuZ2V0TWV0cmljcyhkbSk7CisgICAgICAgIGRpc3BsYXkuZ2V0UmVhbE1ldHJpY3MoZG0pOwogCiAgICAgICAgIGlmIChmYWxzZSkgewogICAgICAgICAgICAgTG9nLmkoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiKioqKioqKioqKioqKioqKioqKioqKiogV0FURVJNQVJLIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAwOGZlYTFiLi5kOTVkNGM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTQwOCw2ICs0MDgsOCBAQAogICAgIGludCBtQmFzZURpc3BsYXlIZWlnaHQgPSAwOwogICAgIGludCBtQ3VyRGlzcGxheVdpZHRoID0gMDsKICAgICBpbnQgbUN1ckRpc3BsYXlIZWlnaHQgPSAwOworICAgIGludCBtQXBwRGlzcGxheVdpZHRoID0gMDsKKyAgICBpbnQgbUFwcERpc3BsYXlIZWlnaHQgPSAwOwogICAgIGludCBtUm90YXRpb24gPSAwOwogICAgIGludCBtUmVxdWVzdGVkUm90YXRpb24gPSAwOwogICAgIGludCBtRm9yY2VkQXBwT3JpZW50YXRpb24gPSBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1VOU1BFQ0lGSUVEOwpAQCAtNjAwLDggKzYwMiw3IEBACiAKICAgICBmaW5hbCBDb25maWd1cmF0aW9uIG1UZW1wQ29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CiAKLSAgICAvLyBUaGUgZnJhbWUgdXNlIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBhcHAgcnVubmluZyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuCi0gICAgUmVjdCBtQ29tcGF0aWJsZVNjcmVlbkZyYW1lID0gbmV3IFJlY3QoKTsKKyAgICAvLyBUaGUgZGVzaXJlZCBzY2FsaW5nIGZhY3RvciBmb3IgY29tcGF0aWJsZSBhcHBzLgogICAgIGZsb2F0IG1Db21wYXRpYmxlU2NyZWVuU2NhbGU7CiAKICAgICBwdWJsaWMgc3RhdGljIFdpbmRvd01hbmFnZXJTZXJ2aWNlIG1haW4oQ29udGV4dCBjb250ZXh0LApAQCAtMTQzMyw4ICsxNDM0LDggQEAKICAgICBpbnQgYWRqdXN0V2FsbHBhcGVyV2luZG93c0xvY2tlZCgpIHsKICAgICAgICAgaW50IGNoYW5nZWQgPSAwOwogCi0gICAgICAgIGZpbmFsIGludCBkdyA9IG1DdXJEaXNwbGF5V2lkdGg7Ci0gICAgICAgIGZpbmFsIGludCBkaCA9IG1DdXJEaXNwbGF5SGVpZ2h0OworICAgICAgICBmaW5hbCBpbnQgZHcgPSBtQXBwRGlzcGxheVdpZHRoOworICAgICAgICBmaW5hbCBpbnQgZGggPSBtQXBwRGlzcGxheUhlaWdodDsKIAogICAgICAgICAvLyBGaXJzdCBmaW5kIHRvcC1tb3N0IHdpbmRvdyB0aGF0IGhhcyBhc2tlZCB0byBiZSBvbiB0b3Agb2YgdGhlCiAgICAgICAgIC8vIHdhbGxwYXBlcjsgYWxsIHdhbGxwYXBlcnMgZ28gYmVoaW5kIGl0LgpAQCAtMTg1Miw4ICsxODUzLDggQEAKICAgICB9CiAKICAgICBib29sZWFuIHVwZGF0ZVdhbGxwYXBlck9mZnNldExvY2tlZChXaW5kb3dTdGF0ZSBjaGFuZ2luZ1RhcmdldCwgYm9vbGVhbiBzeW5jKSB7Ci0gICAgICAgIGZpbmFsIGludCBkdyA9IG1DdXJEaXNwbGF5V2lkdGg7Ci0gICAgICAgIGZpbmFsIGludCBkaCA9IG1DdXJEaXNwbGF5SGVpZ2h0OworICAgICAgICBmaW5hbCBpbnQgZHcgPSBtQXBwRGlzcGxheVdpZHRoOworICAgICAgICBmaW5hbCBpbnQgZGggPSBtQXBwRGlzcGxheUhlaWdodDsKIAogICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKIApAQCAtMTg5Myw4ICsxODk0LDggQEAKIAogICAgIHZvaWQgdXBkYXRlV2FsbHBhcGVyVmlzaWJpbGl0eUxvY2tlZCgpIHsKICAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlID0gaXNXYWxscGFwZXJWaXNpYmxlKG1XYWxscGFwZXJUYXJnZXQpOwotICAgICAgICBmaW5hbCBpbnQgZHcgPSBtQ3VyRGlzcGxheVdpZHRoOwotICAgICAgICBmaW5hbCBpbnQgZGggPSBtQ3VyRGlzcGxheUhlaWdodDsKKyAgICAgICAgZmluYWwgaW50IGR3ID0gbUFwcERpc3BsYXlXaWR0aDsKKyAgICAgICAgZmluYWwgaW50IGRoID0gbUFwcERpc3BsYXlIZWlnaHQ7CiAKICAgICAgICAgaW50IGN1clRva2VuSW5kZXggPSBtV2FsbHBhcGVyVG9rZW5zLnNpemUoKTsKICAgICAgICAgd2hpbGUgKGN1clRva2VuSW5kZXggPiAwKSB7CkBAIC0yNzAxLDcgKzI3MDIsNyBAQAogICAgICAgICAgICAgY29uZmlnQ2hhbmdlZCA9IHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2Vuc0xvY2tlZChmYWxzZSk7CiAgICAgICAgICAgICBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZCgpOwogICAgICAgICAgICAgaWYgKGRpc3BsYXllZCAmJiB3aW4ubUlzV2FsbHBhcGVyKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlV2FsbHBhcGVyT2Zmc2V0TG9ja2VkKHdpbiwgbUN1ckRpc3BsYXlXaWR0aCwgbUN1ckRpc3BsYXlIZWlnaHQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVXYWxscGFwZXJPZmZzZXRMb2NrZWQod2luLCBtQXBwRGlzcGxheVdpZHRoLCBtQXBwRGlzcGxheUhlaWdodCwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHdpbi5tQXBwVG9rZW4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHdpbi5tQXBwVG9rZW4udXBkYXRlUmVwb3J0ZWRWaXNpYmlsaXR5TG9ja2VkKCk7CkBAIC0zNTI0LDcgKzM1MjUsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEFwcFN0YXJ0aW5nV2luZG93KElCaW5kZXIgdG9rZW4sIFN0cmluZyBwa2csCi0gICAgICAgICAgICBpbnQgdGhlbWUsIENoYXJTZXF1ZW5jZSBub25Mb2NhbGl6ZWRMYWJlbCwgaW50IGxhYmVsUmVzLCBpbnQgaWNvbiwKKyAgICAgICAgICAgIGludCB0aGVtZSwgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0SW5mbywKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBub25Mb2NhbGl6ZWRMYWJlbCwgaW50IGxhYmVsUmVzLCBpbnQgaWNvbiwKICAgICAgICAgICAgIGludCB3aW5kb3dGbGFncywgSUJpbmRlciB0cmFuc2ZlckZyb20sIGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpIHsKICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfQVBQX1RPS0VOUywKICAgICAgICAgICAgICAgICAic2V0QXBwU3RhcnRpbmdJY29uKCkiKSkgewpAQCAtMzY3NCw4ICszNjc2LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVN0YXJ0aW5nSWNvbkluVHJhbnNpdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICB3dG9rZW4uc3RhcnRpbmdEYXRhID0gbmV3IFN0YXJ0aW5nRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgcGtnLCB0aGVtZSwgbm9uTG9jYWxpemVkTGFiZWwsCisgICAgICAgICAgICB3dG9rZW4uc3RhcnRpbmdEYXRhID0gbmV3IFN0YXJ0aW5nRGF0YShwa2csIHRoZW1lLCBjb21wYXRJbmZvLCBub25Mb2NhbGl6ZWRMYWJlbCwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxSZXMsIGljb24sIHdpbmRvd0ZsYWdzKTsKICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5BRERfU1RBUlRJTkcsIHd0b2tlbik7CiAgICAgICAgICAgICAvLyBOb3RlOiB3ZSByZWFsbHkgd2FudCB0byBkbyBzZW5kTWVzc2FnZUF0RnJvbnRPZlF1ZXVlKCkgYmVjYXVzZSB3ZQpAQCAtNDc4Myw4ICs0Nzg0LDggQEAKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAotICAgICAgICAgICAgZHcgPSBtUG9saWN5LmdldE5vbkRlY29yRGlzcGxheVdpZHRoKG1Sb3RhdGlvbiwgbUN1ckRpc3BsYXlXaWR0aCk7Ci0gICAgICAgICAgICBkaCA9IG1Qb2xpY3kuZ2V0Tm9uRGVjb3JEaXNwbGF5SGVpZ2h0KG1Sb3RhdGlvbiwgbUN1ckRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgZHcgPSBtQXBwRGlzcGxheVdpZHRoOworICAgICAgICAgICAgZGggPSBtQXBwRGlzcGxheUhlaWdodDsKIAogICAgICAgICAgICAgaW50IGFib3ZlQXBwTGF5ZXIgPSBtUG9saWN5LndpbmRvd1R5cGVUb0xheWVyTHcoCiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQVBQTElDQVRJT04pICogVFlQRV9MQVlFUl9NVUxUSVBMSUVSCkBAIC01NTU5LDEzICs1NTYwLDEyIEBACiAKICAgICAgICAgLy8gT3ZlcnJpZGUgZGlzcGxheSB3aWR0aCBhbmQgaGVpZ2h0IHdpdGggd2hhdCB3ZSBhcmUgY29tcHV0aW5nLAogICAgICAgICAvLyB0byBiZSBzdXJlIHRoZXkgcmVtYWluIGNvbnNpc3RlbnQuCi0gICAgICAgIGRtLndpZHRoUGl4ZWxzID0gZG0ucmVhbFdpZHRoUGl4ZWxzID0gbVBvbGljeS5nZXROb25EZWNvckRpc3BsYXlXaWR0aCgKLSAgICAgICAgICAgICAgICBtUm90YXRpb24sIGR3KTsKLSAgICAgICAgZG0uaGVpZ2h0UGl4ZWxzID0gZG0ucmVhbEhlaWdodFBpeGVscyA9IG1Qb2xpY3kuZ2V0Tm9uRGVjb3JEaXNwbGF5SGVpZ2h0KAotICAgICAgICAgICAgICAgIG1Sb3RhdGlvbiwgZGgpOworICAgICAgICBkbS53aWR0aFBpeGVscyA9IGRtLnVuc2NhbGVkV2lkdGhQaXhlbHMgPSBtQXBwRGlzcGxheVdpZHRoCisgICAgICAgICAgICAgICAgPSBtUG9saWN5LmdldE5vbkRlY29yRGlzcGxheVdpZHRoKG1Sb3RhdGlvbiwgZHcpOworICAgICAgICBkbS5oZWlnaHRQaXhlbHMgPSBkbS51bnNjYWxlZEhlaWdodFBpeGVscyA9IG1BcHBEaXNwbGF5SGVpZ2h0CisgICAgICAgICAgICAgICAgPSBtUG9saWN5LmdldE5vbkRlY29yRGlzcGxheUhlaWdodChtUm90YXRpb24sIGRoKTsKIAotICAgICAgICBtQ29tcGF0aWJsZVNjcmVlblNjYWxlID0gQ29tcGF0aWJpbGl0eUluZm8udXBkYXRlQ29tcGF0aWJsZVNjcmVlbkZyYW1lKAotICAgICAgICAgICAgICAgIGRtLCBtQ29tcGF0aWJsZVNjcmVlbkZyYW1lLCBudWxsKTsKKyAgICAgICAgbUNvbXBhdGlibGVTY3JlZW5TY2FsZSA9IENvbXBhdGliaWxpdHlJbmZvLmNvbXB1dGVDb21wYXRpYmxlU2NhbGluZyhkbSwgbnVsbCk7CiAKICAgICAgICAgY29uZmlnLnNjcmVlbldpZHRoRHAgPSAoaW50KShtUG9saWN5LmdldENvbmZpZ0Rpc3BsYXlXaWR0aChtUm90YXRpb24sIGR3KSAvIGRtLmRlbnNpdHkpOwogICAgICAgICBjb25maWcuc2NyZWVuSGVpZ2h0RHAgPSAoaW50KShtUG9saWN5LmdldENvbmZpZ0Rpc3BsYXlIZWlnaHQobVJvdGF0aW9uLCBkaCkgLyBkbS5kZW5zaXR5KTsKQEAgLTU5NTEsNiArNTk1MSwxOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGVtcG9yYXJpbHkgc2V0IHRoZSBwb2ludGVyIHNwZWVkLiAgRG9lcyBub3Qgc2F2ZSB0aGUgbmV3IHNldHRpbmcuCisgICAgICogVXNlZCBieSB0aGUgc2V0dGluZ3MgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9pbnRlclNwZWVkKGludCBzcGVlZCkgeworICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNFVF9QT0lOVEVSX1NQRUVELAorICAgICAgICAgICAgICAgICJzZXRQb2ludGVyU3BlZWQoKSIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIFNFVF9QT0lOVEVSX1NQRUVEIHBlcm1pc3Npb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIG1JbnB1dE1hbmFnZXIuc2V0UG9pbnRlclNwZWVkKHNwZWVkKTsKKyAgICB9CisKICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIGdldEZvY3VzZWRXaW5kb3coKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVdpbmRvd01hcCkgewogICAgICAgICAgICAgcmV0dXJuIGdldEZvY3VzZWRXaW5kb3dMb2NrZWQoKTsKQEAgLTU5OTAsOCArNjAwMyw4IEBACiAgICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5V2lkdGggPSBtSW5pdGlhbERpc3BsYXlIZWlnaHQ7CiAgICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gdG1wOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJhc2VEaXNwbGF5V2lkdGggPSBtQ3VyRGlzcGxheVdpZHRoID0gbUluaXRpYWxEaXNwbGF5V2lkdGg7Ci0gICAgICAgICAgICBtQmFzZURpc3BsYXlIZWlnaHQgPSBtQ3VyRGlzcGxheUhlaWdodCA9IG1Jbml0aWFsRGlzcGxheUhlaWdodDsKKyAgICAgICAgICAgIG1CYXNlRGlzcGxheVdpZHRoID0gbUN1ckRpc3BsYXlXaWR0aCA9IG1BcHBEaXNwbGF5V2lkdGggPSBtSW5pdGlhbERpc3BsYXlXaWR0aDsKKyAgICAgICAgICAgIG1CYXNlRGlzcGxheUhlaWdodCA9IG1DdXJEaXNwbGF5SGVpZ2h0ID0gbUFwcERpc3BsYXlIZWlnaHQgPSBtSW5pdGlhbERpc3BsYXlIZWlnaHQ7CiAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnNldERpc3BsYXlTaXplKDAsIG1EaXNwbGF5LmdldFJhd1dpZHRoKCksIG1EaXNwbGF5LmdldFJhd0hlaWdodCgpKTsKICAgICAgICAgICAgIG1Qb2xpY3kuc2V0SW5pdGlhbERpc3BsYXlTaXplKG1Jbml0aWFsRGlzcGxheVdpZHRoLCBtSW5pdGlhbERpc3BsYXlIZWlnaHQpOwogICAgICAgICB9CkBAIC02MTQwLDkgKzYxNTMsOCBAQAogICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IG1Qb2xpY3kuYWRkU3RhcnRpbmdXaW5kb3coCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3Rva2VuLnRva2VuLCBzZC5wa2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QudGhlbWUsIHNkLm5vbkxvY2FsaXplZExhYmVsLCBzZC5sYWJlbFJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZC5pY29uLCBzZC53aW5kb3dGbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3Rva2VuLnRva2VuLCBzZC5wa2csIHNkLnRoZW1lLCBzZC5jb21wYXRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkLm5vbkxvY2FsaXplZExhYmVsLCBzZC5sYWJlbFJlcywgc2QuaWNvbiwgc2Qud2luZG93RmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkV4Y2VwdGlvbiB3aGVuIGFkZGluZyBzdGFydGluZyB3aW5kb3ciLCBlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjQ5Myw4ICs2NTA1LDggQEAKIAogICAgIHB1YmxpYyB2b2lkIGdldERpc3BsYXlTaXplKFBvaW50IHNpemUpIHsKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIHNpemUueCA9IG1DdXJEaXNwbGF5V2lkdGg7Ci0gICAgICAgICAgICBzaXplLnkgPSBtQ3VyRGlzcGxheUhlaWdodDsKKyAgICAgICAgICAgIHNpemUueCA9IG1BcHBEaXNwbGF5V2lkdGg7CisgICAgICAgICAgICBzaXplLnkgPSBtQXBwRGlzcGxheUhlaWdodDsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjYyNiw2ICs2NjM4LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5TdGF0dXNCYXJIaWRlKCkgeworICAgICAgICByZXR1cm4gbVBvbGljeS5jYW5TdGF0dXNCYXJIaWRlKCk7CisgICAgfQorCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIEludGVybmFscwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY5OTAsOSArNzAwNiw4IEBACiAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgaW50IGR3ID0gbUN1ckRpc3BsYXlXaWR0aDsKICAgICAgICAgZmluYWwgaW50IGRoID0gbUN1ckRpc3BsYXlIZWlnaHQ7Ci0KLSAgICAgICAgZmluYWwgaW50IGlubmVyRHcgPSBtUG9saWN5LmdldE5vbkRlY29yRGlzcGxheVdpZHRoKG1Sb3RhdGlvbiwgZHcpOwotICAgICAgICBmaW5hbCBpbnQgaW5uZXJEaCA9IG1Qb2xpY3kuZ2V0Tm9uRGVjb3JEaXNwbGF5SGVpZ2h0KG1Sb3RhdGlvbiwgZGgpOworICAgICAgICBmaW5hbCBpbnQgaW5uZXJEdyA9IG1BcHBEaXNwbGF5V2lkdGg7CisgICAgICAgIGZpbmFsIGludCBpbm5lckRoID0gbUFwcERpc3BsYXlIZWlnaHQ7CiAKICAgICAgICAgaW50IGk7CiAKQEAgLTg5NjUsNiArODk4MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludChtQmFzZURpc3BsYXlXaWR0aCk7IHB3LnByaW50KCJ4Iik7IHB3LnByaW50KG1CYXNlRGlzcGxheUhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGN1cj0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KG1DdXJEaXNwbGF5V2lkdGgpOyBwdy5wcmludCgieCIpOyBwdy5wcmludChtQ3VyRGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGFwcD0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KG1BcHBEaXNwbGF5V2lkdGgpOyBwdy5wcmludCgieCIpOyBwdy5wcmludChtQXBwRGlzcGxheUhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIHJlYWw9Iik7IHB3LnByaW50KG1EaXNwbGF5LmdldFJlYWxXaWR0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCJ4Iik7IHB3LnByaW50KG1EaXNwbGF5LmdldFJlYWxIZWlnaHQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIHJhdz0iKTsgcHcucHJpbnQobURpc3BsYXkuZ2V0UmF3V2lkdGgoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2puaS9BbmRyb2lkLm1rCmluZGV4IDRlOTNmZTIuLmExYzMyODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2puaS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2puaS9BbmRyb2lkLm1rCkBAIC0xMiw3ICsxMiw4IEBACiAgICAgY29tX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UuY3BwIFwKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIuY3BwIFwKLSAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZS5jcHAgXAorICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Vc2JEZXZpY2VNYW5hZ2VyLmNwcCBcCisgICAgY29tX2FuZHJvaWRfc2VydmVyX1VzYkhvc3RNYW5hZ2VyLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcCBcCiAgICAgb25sb2FkLmNwcApkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwCmluZGV4IDFmMTBkOWMuLjg4MTg4MmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlci5jcHAKQEAgLTUzLDYgKzUzLDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gVGhlIGV4cG9uZW50IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb2ludGVyIHNwZWVkIHNjYWxpbmcgZmFjdG9yLgorLy8gVGhlIHNjYWxpbmcgZmFjdG9yIGlzIGNhbGN1bGF0ZWQgYXMgMiBeIChzcGVlZCAqIGV4cG9uZW50KSwKKy8vIHdoZXJlIHRoZSBzcGVlZCByYW5nZXMgZnJvbSAtNyB0byArIDcgYW5kIGlzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorc3RhdGljIGNvbnN0IGZsb2F0IFBPSU5URVJfU1BFRURfRVhQT05FTlQgPSAxLjBmIC8gMzsKKwogc3RhdGljIHN0cnVjdCB7CiAgICAgam1ldGhvZElEIG5vdGlmeUNvbmZpZ3VyYXRpb25DaGFuZ2VkOwogICAgIGptZXRob2RJRCBub3RpZnlMaWRTd2l0Y2hDaGFuZ2VkOwpAQCAtNzEsNiArNzYsMTAgQEAKICAgICBqbWV0aG9kSUQgZ2V0S2V5UmVwZWF0VGltZW91dDsKICAgICBqbWV0aG9kSUQgZ2V0S2V5UmVwZWF0RGVsYXk7CiAgICAgam1ldGhvZElEIGdldE1heEV2ZW50c1BlclNlY29uZDsKKyAgICBqbWV0aG9kSUQgZ2V0VGFwVGltZW91dDsKKyAgICBqbWV0aG9kSUQgZ2V0RG91YmxlVGFwVGltZW91dDsKKyAgICBqbWV0aG9kSUQgZ2V0TG9uZ1ByZXNzVGltZW91dDsKKyAgICBqbWV0aG9kSUQgZ2V0VG91Y2hTbG9wOwogICAgIGptZXRob2RJRCBnZXRQb2ludGVyTGF5ZXI7CiAgICAgam1ldGhvZElEIGdldFBvaW50ZXJJY29uOwogfSBnQ2FsbGJhY2tzQ2xhc3NJbmZvOwpAQCAtMTA0LDYgKzExMywxNiBAQAogCiAvLyAtLS0gR2xvYmFsIGZ1bmN0aW9ucyAtLS0KIAordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBzdGF0aWMgVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikgeworICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIHN0YXRpYyBUIG1heChjb25zdCBUJiBhLCBjb25zdCBUJiBiKSB7CisgICAgcmV0dXJuIGEgPiBiID8gYSA6IGI7Cit9CisKIHN0YXRpYyBqb2JqZWN0IGdldElucHV0QXBwbGljYXRpb25IYW5kbGVPYmpMb2NhbFJlZihKTklFbnYqIGVudiwKICAgICAgICAgY29uc3Qgc3A8SW5wdXRBcHBsaWNhdGlvbkhhbmRsZT4mIGlucHV0QXBwbGljYXRpb25IYW5kbGUpIHsKICAgICBpZiAoaW5wdXRBcHBsaWNhdGlvbkhhbmRsZSA9PSBOVUxMKSB7CkBAIC0xNjIsMTUgKzE4MSwxMyBAQAogICAgIHZvaWQgc2V0Rm9jdXNlZEFwcGxpY2F0aW9uKEpOSUVudiogZW52LCBqb2JqZWN0IGFwcGxpY2F0aW9uT2JqKTsKICAgICB2b2lkIHNldElucHV0RGlzcGF0Y2hNb2RlKGJvb2wgZW5hYmxlZCwgYm9vbCBmcm96ZW4pOwogICAgIHZvaWQgc2V0U3lzdGVtVWlWaXNpYmlsaXR5KGludDMyX3QgdmlzaWJpbGl0eSk7CisgICAgdm9pZCBzZXRQb2ludGVyU3BlZWQoaW50MzJfdCBzcGVlZCk7CiAKICAgICAvKiAtLS0gSW5wdXRSZWFkZXJQb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gLS0tICovCiAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0RGlzcGxheUluZm8oaW50MzJfdCBkaXNwbGF5SWQsCiAgICAgICAgICAgICBpbnQzMl90KiB3aWR0aCwgaW50MzJfdCogaGVpZ2h0LCBpbnQzMl90KiBvcmllbnRhdGlvbik7Ci0gICAgdmlydHVhbCBib29sIGZpbHRlclRvdWNoRXZlbnRzKCk7Ci0gICAgdmlydHVhbCBib29sIGZpbHRlckp1bXB5VG91Y2hFdmVudHMoKTsKLSAgICB2aXJ0dWFsIG5zZWNzX3QgZ2V0VmlydHVhbEtleVF1aWV0VGltZSgpOwotICAgIHZpcnR1YWwgdm9pZCBnZXRFeGNsdWRlZERldmljZU5hbWVzKFZlY3RvcjxTdHJpbmc4PiYgb3V0RXhjbHVkZWREZXZpY2VOYW1lcyk7CisgICAgdmlydHVhbCB2b2lkIGdldFJlYWRlckNvbmZpZ3VyYXRpb24oSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uKiBvdXRDb25maWcpOwogICAgIHZpcnR1YWwgc3A8UG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U+IG9idGFpblBvaW50ZXJDb250cm9sbGVyKGludDMyX3QgZGV2aWNlSWQpOwogCiAgICAgLyogLS0tIElucHV0RGlzcGF0Y2hlclBvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiAtLS0gKi8KQEAgLTE4MSwxMCArMTk4LDkgQEAKICAgICB2aXJ0dWFsIG5zZWNzX3Qgbm90aWZ5QU5SKGNvbnN0IHNwPElucHV0QXBwbGljYXRpb25IYW5kbGU+JiBpbnB1dEFwcGxpY2F0aW9uSGFuZGxlLAogICAgICAgICAgICAgY29uc3Qgc3A8SW5wdXRXaW5kb3dIYW5kbGU+JiBpbnB1dFdpbmRvd0hhbmRsZSk7CiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUlucHV0Q2hhbm5lbEJyb2tlbihjb25zdCBzcDxJbnB1dFdpbmRvd0hhbmRsZT4mIGlucHV0V2luZG93SGFuZGxlKTsKLSAgICB2aXJ0dWFsIG5zZWNzX3QgZ2V0S2V5UmVwZWF0VGltZW91dCgpOwotICAgIHZpcnR1YWwgbnNlY3NfdCBnZXRLZXlSZXBlYXREZWxheSgpOwotICAgIHZpcnR1YWwgaW50MzJfdCBnZXRNYXhFdmVudHNQZXJTZWNvbmQoKTsKICAgICB2aXJ0dWFsIGJvb2wgZmlsdGVySW5wdXRFdmVudChjb25zdCBJbnB1dEV2ZW50KiBpbnB1dEV2ZW50LCB1aW50MzJfdCBwb2xpY3lGbGFncyk7CisgICAgdmlydHVhbCB2b2lkIGdldERpc3BhdGNoZXJDb25maWd1cmF0aW9uKElucHV0RGlzcGF0Y2hlckNvbmZpZ3VyYXRpb24qIG91dENvbmZpZyk7CisgICAgdmlydHVhbCBib29sIGlzS2V5UmVwZWF0RW5hYmxlZCgpOwogICAgIHZpcnR1YWwgdm9pZCBpbnRlcmNlcHRLZXlCZWZvcmVRdWV1ZWluZyhjb25zdCBLZXlFdmVudCoga2V5RXZlbnQsIHVpbnQzMl90JiBwb2xpY3lGbGFncyk7CiAgICAgdmlydHVhbCB2b2lkIGludGVyY2VwdE1vdGlvbkJlZm9yZVF1ZXVlaW5nKG5zZWNzX3Qgd2hlbiwgdWludDMyX3QmIHBvbGljeUZsYWdzKTsKICAgICB2aXJ0dWFsIGJvb2wgaW50ZXJjZXB0S2V5QmVmb3JlRGlzcGF0Y2hpbmcoY29uc3Qgc3A8SW5wdXRXaW5kb3dIYW5kbGU+JiBpbnB1dFdpbmRvd0hhbmRsZSwKQEAgLTIwNiwxOCArMjIyLDYgQEAKICAgICBqb2JqZWN0IG1DYWxsYmFja3NPYmo7CiAgICAgc3A8TG9vcGVyPiBtTG9vcGVyOwogCi0gICAgLy8gQ2FjaGVkIGZpbHRlcmluZyBwb2xpY2llcy4KLSAgICBpbnQzMl90IG1GaWx0ZXJUb3VjaEV2ZW50czsKLSAgICBpbnQzMl90IG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzOwotICAgIG5zZWNzX3QgbVZpcnR1YWxLZXlRdWlldFRpbWU7Ci0KLSAgICAvLyBDYWNoZWQga2V5IHJlcGVhdCBwb2xpY3kuCi0gICAgbnNlY3NfdCBtS2V5UmVwZWF0VGltZW91dDsKLSAgICBuc2Vjc190IG1LZXlSZXBlYXREZWxheTsKLQotICAgIC8vIENhY2hlZCB0aHJvdHRsaW5nIHBvbGljeS4KLSAgICBpbnQzMl90IG1NYXhFdmVudHNQZXJTZWNvbmQ7Ci0KICAgICBNdXRleCBtTG9jazsKICAgICBzdHJ1Y3QgTG9ja2VkIHsKICAgICAgICAgLy8gRGlzcGxheSBzaXplIGluZm9ybWF0aW9uLgpAQCAtMjI3LDYgKzIzMSw5IEBACiAgICAgICAgIC8vIFN5c3RlbSBVSSB2aXNpYmlsaXR5LgogICAgICAgICBpbnQzMl90IHN5c3RlbVVpVmlzaWJpbGl0eTsKIAorICAgICAgICAvLyBQb2ludGVyIHNwZWVkLgorICAgICAgICBpbnQzMl90IHBvaW50ZXJTcGVlZDsKKwogICAgICAgICAvLyBTcHJpdGUgY29udHJvbGxlciBzaW5nbGV0b24sIGNyZWF0ZWQgb24gZmlyc3QgdXNlLgogICAgICAgICBzcDxTcHJpdGVDb250cm9sbGVyPiBzcHJpdGVDb250cm9sbGVyOwogCkBAIC0yNTMsMTAgKzI2MCw3IEBACiAKIE5hdGl2ZUlucHV0TWFuYWdlcjo6TmF0aXZlSW5wdXRNYW5hZ2VyKGpvYmplY3QgY29udGV4dE9iaiwKICAgICAgICAgam9iamVjdCBjYWxsYmFja3NPYmosIGNvbnN0IHNwPExvb3Blcj4mIGxvb3BlcikgOgotICAgICAgICBtTG9vcGVyKGxvb3BlciksCi0gICAgICAgIG1GaWx0ZXJUb3VjaEV2ZW50cygtMSksIG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzKC0xKSwgbVZpcnR1YWxLZXlRdWlldFRpbWUoLTEpLAotICAgICAgICBtS2V5UmVwZWF0VGltZW91dCgtMSksIG1LZXlSZXBlYXREZWxheSgtMSksCi0gICAgICAgIG1NYXhFdmVudHNQZXJTZWNvbmQoLTEpIHsKKyAgICAgICAgbUxvb3Blcihsb29wZXIpIHsKICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwogCiAgICAgbUNvbnRleHRPYmogPSBlbnYtPk5ld0dsb2JhbFJlZihjb250ZXh0T2JqKTsKQEAgLTI2OSw2ICsyNzMsNyBAQAogICAgICAgICBtTG9ja2VkLmRpc3BsYXlPcmllbnRhdGlvbiA9IFJPVEFUSU9OXzA7CiAKICAgICAgICAgbUxvY2tlZC5zeXN0ZW1VaVZpc2liaWxpdHkgPSBBU1lTVEVNX1VJX1ZJU0lCSUxJVFlfU1RBVFVTX0JBUl9WSVNJQkxFOworICAgICAgICBtTG9ja2VkLnBvaW50ZXJTcGVlZCA9IDA7CiAgICAgfQogCiAgICAgc3A8RXZlbnRIdWI+IGV2ZW50SHViID0gbmV3IEV2ZW50SHViKCk7CkBAIC0zNjksNzQgKzM3NCw3NiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWJvb2wgTmF0aXZlSW5wdXRNYW5hZ2VyOjpmaWx0ZXJUb3VjaEV2ZW50cygpIHsKLSAgICBpZiAobUZpbHRlclRvdWNoRXZlbnRzIDwgMCkgewotICAgICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwotCi0gICAgICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmZpbHRlclRvdWNoRXZlbnRzKTsKLSAgICAgICAgaWYgKGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZmlsdGVyVG91Y2hFdmVudHMiKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtRmlsdGVyVG91Y2hFdmVudHMgPSByZXN1bHQgPyAxIDogMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1GaWx0ZXJUb3VjaEV2ZW50czsKLX0KLQotYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmZpbHRlckp1bXB5VG91Y2hFdmVudHMoKSB7Ci0gICAgaWYgKG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzIDwgMCkgewotICAgICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwotCi0gICAgICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmZpbHRlckp1bXB5VG91Y2hFdmVudHMpOwotICAgICAgICBpZiAoY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJmaWx0ZXJKdW1weVRvdWNoRXZlbnRzIikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUZpbHRlckp1bXB5VG91Y2hFdmVudHMgPSByZXN1bHQgPyAxIDogMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzOwotfQotCi1uc2Vjc190IE5hdGl2ZUlucHV0TWFuYWdlcjo6Z2V0VmlydHVhbEtleVF1aWV0VGltZSgpIHsKLSAgICBpZiAobVZpcnR1YWxLZXlRdWlldFRpbWUgPCAwKSB7Ci0gICAgICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7Ci0KLSAgICAgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldFZpcnR1YWxLZXlRdWlldFRpbWVNaWxsaXMpOwotICAgICAgICBpZiAoY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRWaXJ0dWFsS2V5UXVpZXRUaW1lTWlsbGlzIikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBtVmlydHVhbEtleVF1aWV0VGltZSA9IG1pbGxpc2Vjb25kc190b19uYW5vc2Vjb25kcyhyZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gbVZpcnR1YWxLZXlRdWlldFRpbWU7Ci19Ci0KLXZvaWQgTmF0aXZlSW5wdXRNYW5hZ2VyOjpnZXRFeGNsdWRlZERldmljZU5hbWVzKFZlY3RvcjxTdHJpbmc4PiYgb3V0RXhjbHVkZWREZXZpY2VOYW1lcykgewotICAgIG91dEV4Y2x1ZGVkRGV2aWNlTmFtZXMuY2xlYXIoKTsKLQordm9pZCBOYXRpdmVJbnB1dE1hbmFnZXI6OmdldFJlYWRlckNvbmZpZ3VyYXRpb24oSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uKiBvdXRDb25maWcpIHsKICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwogCi0gICAgam9iamVjdEFycmF5IHJlc3VsdCA9IGpvYmplY3RBcnJheShlbnYtPkNhbGxPYmplY3RNZXRob2QobUNhbGxiYWNrc09iaiwKKyAgICBqYm9vbGVhbiBmaWx0ZXJUb3VjaEV2ZW50cyA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUNhbGxiYWNrc09iaiwKKyAgICAgICAgICAgIGdDYWxsYmFja3NDbGFzc0luZm8uZmlsdGVyVG91Y2hFdmVudHMpOworICAgIGlmICghY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJmaWx0ZXJUb3VjaEV2ZW50cyIpKSB7CisgICAgICAgIG91dENvbmZpZy0+ZmlsdGVyVG91Y2hFdmVudHMgPSBmaWx0ZXJUb3VjaEV2ZW50czsKKyAgICB9CisKKyAgICBqYm9vbGVhbiBmaWx0ZXJKdW1weVRvdWNoRXZlbnRzID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtQ2FsbGJhY2tzT2JqLAorICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5maWx0ZXJKdW1weVRvdWNoRXZlbnRzKTsKKyAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZmlsdGVySnVtcHlUb3VjaEV2ZW50cyIpKSB7CisgICAgICAgIG91dENvbmZpZy0+ZmlsdGVySnVtcHlUb3VjaEV2ZW50cyA9IGZpbHRlckp1bXB5VG91Y2hFdmVudHM7CisgICAgfQorCisgICAgamludCB2aXJ0dWFsS2V5UXVpZXRUaW1lID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldFZpcnR1YWxLZXlRdWlldFRpbWVNaWxsaXMpOworICAgIGlmICghY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRWaXJ0dWFsS2V5UXVpZXRUaW1lTWlsbGlzIikpIHsKKyAgICAgICAgb3V0Q29uZmlnLT52aXJ0dWFsS2V5UXVpZXRUaW1lID0gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHZpcnR1YWxLZXlRdWlldFRpbWUpOworICAgIH0KKworICAgIG91dENvbmZpZy0+ZXhjbHVkZWREZXZpY2VOYW1lcy5jbGVhcigpOworICAgIGpvYmplY3RBcnJheSBleGNsdWRlZERldmljZU5hbWVzID0gam9iamVjdEFycmF5KGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQ2FsbGJhY2tzT2JqLAogICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRFeGNsdWRlZERldmljZU5hbWVzKSk7Ci0gICAgaWYgKCEgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRFeGNsdWRlZERldmljZU5hbWVzIikgJiYgcmVzdWx0KSB7Ci0gICAgICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgocmVzdWx0KTsKKyAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZ2V0RXhjbHVkZWREZXZpY2VOYW1lcyIpICYmIGV4Y2x1ZGVkRGV2aWNlTmFtZXMpIHsKKyAgICAgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChleGNsdWRlZERldmljZU5hbWVzKTsKICAgICAgICAgZm9yIChqc2l6ZSBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBqc3RyaW5nIGl0ZW0gPSBqc3RyaW5nKGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KHJlc3VsdCwgaSkpOwotCisgICAgICAgICAgICBqc3RyaW5nIGl0ZW0gPSBqc3RyaW5nKGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KGV4Y2x1ZGVkRGV2aWNlTmFtZXMsIGkpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZU5hbWVDaGFycyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoaXRlbSwgTlVMTCk7Ci0gICAgICAgICAgICBvdXRFeGNsdWRlZERldmljZU5hbWVzLmFkZChTdHJpbmc4KGRldmljZU5hbWVDaGFycykpOworICAgICAgICAgICAgb3V0Q29uZmlnLT5leGNsdWRlZERldmljZU5hbWVzLmFkZChTdHJpbmc4KGRldmljZU5hbWVDaGFycykpOwogICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoaXRlbSwgZGV2aWNlTmFtZUNoYXJzKTsKLQogICAgICAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihpdGVtKTsKICAgICAgICAgfQotICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHJlc3VsdCk7CisgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXhjbHVkZWREZXZpY2VOYW1lcyk7CiAgICAgfQorCisgICAgamludCB0YXBUaW1lb3V0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldFRhcFRpbWVvdXQpOworICAgIGlmICghY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRUYXBUaW1lb3V0IikpIHsKKyAgICAgICAgamludCBkb3VibGVUYXBUaW1lb3V0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXREb3VibGVUYXBUaW1lb3V0KTsKKyAgICAgICAgaWYgKCFjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldERvdWJsZVRhcFRpbWVvdXQiKSkgeworICAgICAgICAgICAgamludCBsb25nUHJlc3NUaW1lb3V0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICAgICAgICAgIGdDYWxsYmFja3NDbGFzc0luZm8uZ2V0TG9uZ1ByZXNzVGltZW91dCk7CisgICAgICAgICAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZ2V0TG9uZ1ByZXNzVGltZW91dCIpKSB7CisgICAgICAgICAgICAgICAgb3V0Q29uZmlnLT5wb2ludGVyR2VzdHVyZVRhcEludGVydmFsID0gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHRhcFRpbWVvdXQpOworCisgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgdGFwLWRyYWcgaW50ZXJ2YWwgaXMgc2lnbmlmaWNhbnRseSBzaG9ydGVyIHRoYW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgbG9uZy1wcmVzcyB0aW1lb3V0IGJlY2F1c2UgdGhlIHRhcCBpcyBoZWxkIGRvd24gZm9yIHRoZSBlbnRpcmUgZHVyYXRpb24KKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZG91YmxlLXRhcCB0aW1lb3V0LgorICAgICAgICAgICAgICAgIGppbnQgdGFwRHJhZ0ludGVydmFsID0gbWF4KG1pbihsb25nUHJlc3NUaW1lb3V0IC0gMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlVGFwVGltZW91dCksIHRhcFRpbWVvdXQpOworICAgICAgICAgICAgICAgIG91dENvbmZpZy0+cG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHRhcERyYWdJbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBqaW50IHRvdWNoU2xvcCA9IGVudi0+Q2FsbEludE1ldGhvZChtQ2FsbGJhY2tzT2JqLAorICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRUb3VjaFNsb3ApOworICAgIGlmICghY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRUb3VjaFNsb3AiKSkgeworICAgICAgICBvdXRDb25maWctPnBvaW50ZXJHZXN0dXJlVGFwU2xvcCA9IHRvdWNoU2xvcDsKKyAgICB9CisKKyAgICB7IC8vIGFjcXVpcmUgbG9jaworICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworCisgICAgICAgIG91dENvbmZpZy0+cG9pbnRlclZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMuc2NhbGUgPSBleHAyZihtTG9ja2VkLnBvaW50ZXJTcGVlZAorICAgICAgICAgICAgICAgICogUE9JTlRFUl9TUEVFRF9FWFBPTkVOVCk7CisgICAgfSAvLyByZWxlYXNlIGxvY2sKIH0KIAogc3A8UG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U+IE5hdGl2ZUlucHV0TWFuYWdlcjo6b2J0YWluUG9pbnRlckNvbnRyb2xsZXIoaW50MzJfdCBkZXZpY2VJZCkgewpAQCAtNTU3LDU0ICs1NjQsMzEgQEAKICAgICB9CiB9CiAKLW5zZWNzX3QgTmF0aXZlSW5wdXRNYW5hZ2VyOjpnZXRLZXlSZXBlYXRUaW1lb3V0KCkgewotICAgIGlmICghIGlzU2NyZWVuT24oKSkgewotICAgICAgICAvLyBEaXNhYmxlIGtleSByZXBlYXQgd2hlbiB0aGUgc2NyZWVuIGlzIG9mZi4KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtS2V5UmVwZWF0VGltZW91dCA8IDApIHsKLSAgICAgICAgICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7Cit2b2lkIE5hdGl2ZUlucHV0TWFuYWdlcjo6Z2V0RGlzcGF0Y2hlckNvbmZpZ3VyYXRpb24oSW5wdXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbiogb3V0Q29uZmlnKSB7CisgICAgSk5JRW52KiBlbnYgPSBqbmlFbnYoKTsKIAotICAgICAgICAgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRLZXlSZXBlYXRUaW1lb3V0KTsKLSAgICAgICAgICAgIGlmIChjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldEtleVJlcGVhdFRpbWVvdXQiKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IDUwMDsKLSAgICAgICAgICAgIH0KKyAgICBqaW50IGtleVJlcGVhdFRpbWVvdXQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKKyAgICAgICAgICAgIGdDYWxsYmFja3NDbGFzc0luZm8uZ2V0S2V5UmVwZWF0VGltZW91dCk7CisgICAgaWYgKCFjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldEtleVJlcGVhdFRpbWVvdXQiKSkgeworICAgICAgICBvdXRDb25maWctPmtleVJlcGVhdFRpbWVvdXQgPSBtaWxsaXNlY29uZHNfdG9fbmFub3NlY29uZHMoa2V5UmVwZWF0VGltZW91dCk7CisgICAgfQogCi0gICAgICAgICAgICBtS2V5UmVwZWF0VGltZW91dCA9IG1pbGxpc2Vjb25kc190b19uYW5vc2Vjb25kcyhyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtS2V5UmVwZWF0VGltZW91dDsKKyAgICBqaW50IGtleVJlcGVhdERlbGF5ID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldEtleVJlcGVhdERlbGF5KTsKKyAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZ2V0S2V5UmVwZWF0RGVsYXkiKSkgeworICAgICAgICBvdXRDb25maWctPmtleVJlcGVhdERlbGF5ID0gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKGtleVJlcGVhdERlbGF5KTsKKyAgICB9CisKKyAgICBqaW50IG1heEV2ZW50c1BlclNlY29uZCA9IGVudi0+Q2FsbEludE1ldGhvZChtQ2FsbGJhY2tzT2JqLAorICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRNYXhFdmVudHNQZXJTZWNvbmQpOworICAgIGlmICghY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRNYXhFdmVudHNQZXJTZWNvbmQiKSkgeworICAgICAgICBvdXRDb25maWctPm1heEV2ZW50c1BlclNlY29uZCA9IG1heEV2ZW50c1BlclNlY29uZDsKICAgICB9CiB9CiAKLW5zZWNzX3QgTmF0aXZlSW5wdXRNYW5hZ2VyOjpnZXRLZXlSZXBlYXREZWxheSgpIHsKLSAgICBpZiAobUtleVJlcGVhdERlbGF5IDwgMCkgewotICAgICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwotCi0gICAgICAgIGppbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCi0gICAgICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRLZXlSZXBlYXREZWxheSk7Ci0gICAgICAgIGlmIChjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldEtleVJlcGVhdERlbGF5IikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDUwOwotICAgICAgICB9Ci0KLSAgICAgICAgbUtleVJlcGVhdERlbGF5ID0gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiBtS2V5UmVwZWF0RGVsYXk7Ci19Ci0KLWludDMyX3QgTmF0aXZlSW5wdXRNYW5hZ2VyOjpnZXRNYXhFdmVudHNQZXJTZWNvbmQoKSB7Ci0gICAgaWYgKG1NYXhFdmVudHNQZXJTZWNvbmQgPCAwKSB7Ci0gICAgICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7Ci0KLSAgICAgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldE1heEV2ZW50c1BlclNlY29uZCk7Ci0gICAgICAgIGlmIChjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldE1heEV2ZW50c1BlclNlY29uZCIpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSA2MDsKLSAgICAgICAgfQotCi0gICAgICAgIG1NYXhFdmVudHNQZXJTZWNvbmQgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiBtTWF4RXZlbnRzUGVyU2Vjb25kOworYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmlzS2V5UmVwZWF0RW5hYmxlZCgpIHsKKyAgICAvLyBPbmx5IGVuYWJsZSBhdXRvbWF0aWMga2V5IHJlcGVhdGluZyB3aGVuIHRoZSBzY3JlZW4gaXMgb24uCisgICAgcmV0dXJuIGlzU2NyZWVuT24oKTsKIH0KIAogdm9pZCBOYXRpdmVJbnB1dE1hbmFnZXI6OnNldElucHV0V2luZG93cyhKTklFbnYqIGVudiwgam9iamVjdEFycmF5IHdpbmRvd09iakFycmF5KSB7CkBAIC02NjUsNiArNjQ5LDE3IEBACiAgICAgICAgICAgICA6IFBvaW50ZXJDb250cm9sbGVyOjpJTkFDVElWSVRZX1RJTUVPVVRfTk9STUFMKTsKIH0KIAordm9pZCBOYXRpdmVJbnB1dE1hbmFnZXI6OnNldFBvaW50ZXJTcGVlZChpbnQzMl90IHNwZWVkKSB7CisgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKworICAgIGlmIChtTG9ja2VkLnBvaW50ZXJTcGVlZCAhPSBzcGVlZCkgeworICAgICAgICBMT0dJKCJTZXR0aW5nIHBvaW50ZXIgc3BlZWQgdG8gJWQuIiwgc3BlZWQpOworICAgICAgICBtTG9ja2VkLnBvaW50ZXJTcGVlZCA9IHNwZWVkOworCisgICAgICAgIG1JbnB1dE1hbmFnZXItPmdldFJlYWRlcigpLT5yZWZyZXNoQ29uZmlndXJhdGlvbigpOworICAgIH0KK30KKwogYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmlzU2NyZWVuT24oKSB7CiAgICAgcmV0dXJuIGFuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2VfaXNTY3JlZW5PbigpOwogfQpAQCAtMTI1NCw2ICsxMjQ5LDE1IEBACiAgICAgICAgICAgICB0cmFuc2ZlclRvdWNoRm9jdXMoZnJvbUNoYW5uZWwsIHRvQ2hhbm5lbCk7CiB9CiAKK3N0YXRpYyB2b2lkIGFuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcl9uYXRpdmVTZXRQb2ludGVyU3BlZWQoSk5JRW52KiBlbnYsCisgICAgICAgIGpjbGFzcyBjbGF6eiwgamludCBzcGVlZCkgeworICAgIGlmIChjaGVja0lucHV0TWFuYWdlclVuaXRpYWxpemVkKGVudikpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdOYXRpdmVJbnB1dE1hbmFnZXItPnNldFBvaW50ZXJTcGVlZChzcGVlZCk7Cit9CisKIHN0YXRpYyBqc3RyaW5nIGFuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcl9uYXRpdmVEdW1wKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopIHsKICAgICBpZiAoY2hlY2tJbnB1dE1hbmFnZXJVbml0aWFsaXplZChlbnYpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTMxMCw2ICsxMzE0LDggQEAKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZUdldElucHV0Q29uZmlndXJhdGlvbiB9LAogICAgIHsgIm5hdGl2ZVRyYW5zZmVyVG91Y2hGb2N1cyIsICIoTGFuZHJvaWQvdmlldy9JbnB1dENoYW5uZWw7TGFuZHJvaWQvdmlldy9JbnB1dENoYW5uZWw7KVoiLAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXJfbmF0aXZlVHJhbnNmZXJUb3VjaEZvY3VzIH0sCisgICAgeyAibmF0aXZlU2V0UG9pbnRlclNwZWVkIiwgIihJKVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXJfbmF0aXZlU2V0UG9pbnRlclNwZWVkIH0sCiAgICAgeyAibmF0aXZlRHVtcCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsCiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcl9uYXRpdmVEdW1wIH0sCiB9OwpAQCAtMTM4OCw2ICsxMzk0LDE4IEBACiAgICAgR0VUX01FVEhPRF9JRChnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldEtleVJlcGVhdERlbGF5LCBjbGF6eiwKICAgICAgICAgICAgICJnZXRLZXlSZXBlYXREZWxheSIsICIoKUkiKTsKIAorICAgIEdFVF9NRVRIT0RfSUQoZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRUYXBUaW1lb3V0LCBjbGF6eiwKKyAgICAgICAgICAgICJnZXRUYXBUaW1lb3V0IiwgIigpSSIpOworCisgICAgR0VUX01FVEhPRF9JRChnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldERvdWJsZVRhcFRpbWVvdXQsIGNsYXp6LAorICAgICAgICAgICAgImdldERvdWJsZVRhcFRpbWVvdXQiLCAiKClJIik7CisKKyAgICBHRVRfTUVUSE9EX0lEKGdDYWxsYmFja3NDbGFzc0luZm8uZ2V0TG9uZ1ByZXNzVGltZW91dCwgY2xhenosCisgICAgICAgICAgICAiZ2V0TG9uZ1ByZXNzVGltZW91dCIsICIoKUkiKTsKKworICAgIEdFVF9NRVRIT0RfSUQoZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRUb3VjaFNsb3AsIGNsYXp6LAorICAgICAgICAgICAgImdldFRvdWNoU2xvcCIsICIoKUkiKTsKKwogICAgIEdFVF9NRVRIT0RfSUQoZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRNYXhFdmVudHNQZXJTZWNvbmQsIGNsYXp6LAogICAgICAgICAgICAgImdldE1heEV2ZW50c1BlclNlY29uZCIsICIoKUkiKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JEZXZpY2VNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1NDE3MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlci5jcHAKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlVzYkRldmljZU1hbmFnZXJKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2ZfYWNjZXNzb3J5Lmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIi9kZXYvdXNiX2FjY2Vzc29yeSIKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKworc3RhdGljIHN0cnVjdCBwYXJjZWxfZmlsZV9kZXNjcmlwdG9yX29mZnNldHNfdAoreworICAgIGpjbGFzcyBtQ2xhc3M7CisgICAgam1ldGhvZElEIG1Db25zdHJ1Y3RvcjsKK30gZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0czsKKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfYWNjZXNzb3J5X3N0cmluZyhKTklFbnYgKmVudiwgaW50IGZkLCBpbnQgY21kLCBqb2JqZWN0QXJyYXkgc3RyQXJyYXksIGludCBpbmRleCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOworCisgICAgYnVmZmVyWzBdID0gMDsKKyAgICBpbnQgbGVuZ3RoID0gaW9jdGwoZmQsIGNtZCwgYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyWzBdKSB7CisgICAgICAgIGpzdHJpbmcgb2JqID0gZW52LT5OZXdTdHJpbmdVVEYoYnVmZmVyKTsKKyAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoc3RyQXJyYXksIGluZGV4LCBvYmopOworICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKG9iaik7CisgICAgfQorfQorCisKK3N0YXRpYyBqb2JqZWN0QXJyYXkgYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlcl9nZXRBY2Nlc3NvcnlTdHJpbmdzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgaW50IGZkID0gb3BlbihEUklWRVJfTkFNRSwgT19SRFdSKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuICVzIiwgRFJJVkVSX05BTUUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgamNsYXNzIHN0cmluZ0NsYXNzID0gZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKTsKKyAgICBqb2JqZWN0QXJyYXkgc3RyQXJyYXkgPSBlbnYtPk5ld09iamVjdEFycmF5KDYsIHN0cmluZ0NsYXNzLCBOVUxMKTsKKyAgICBpZiAoIXN0ckFycmF5KSBnb3RvIG91dDsKKyAgICBzZXRfYWNjZXNzb3J5X3N0cmluZyhlbnYsIGZkLCBBQ0NFU1NPUllfR0VUX1NUUklOR19NQU5VRkFDVFVSRVIsIHN0ckFycmF5LCAwKTsKKyAgICBzZXRfYWNjZXNzb3J5X3N0cmluZyhlbnYsIGZkLCBBQ0NFU1NPUllfR0VUX1NUUklOR19NT0RFTCwgc3RyQXJyYXksIDEpOworICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX0RFU0NSSVBUSU9OLCBzdHJBcnJheSwgMik7CisgICAgc2V0X2FjY2Vzc29yeV9zdHJpbmcoZW52LCBmZCwgQUNDRVNTT1JZX0dFVF9TVFJJTkdfVkVSU0lPTiwgc3RyQXJyYXksIDMpOworICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX1VSSSwgc3RyQXJyYXksIDQpOworICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX1NFUklBTCwgc3RyQXJyYXksIDUpOworCitvdXQ6CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiBzdHJBcnJheTsKK30KKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlcl9vcGVuQWNjZXNzb3J5KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgaW50IGZkID0gb3BlbihEUklWRVJfTkFNRSwgT19SRFdSKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuICVzIiwgRFJJVkVSX05BTUUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgam9iamVjdCBmaWxlRGVzY3JpcHRvciA9IGpuaUNyZWF0ZUZpbGVEZXNjcmlwdG9yKGVudiwgZmQpOworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yLCBmaWxlRGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kX3RhYmxlW10gPSB7CisgICAgeyAibmF0aXZlR2V0QWNjZXNzb3J5U3RyaW5ncyIsICAiKClbTGphdmEvbGFuZy9TdHJpbmc7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3NlcnZlcl9Vc2JEZXZpY2VNYW5hZ2VyX2dldEFjY2Vzc29yeVN0cmluZ3MgfSwKKyAgICB7ICJuYXRpdmVPcGVuQWNjZXNzb3J5IiwgICAgICAgICIoKUxhbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlcl9vcGVuQWNjZXNzb3J5IH0sCit9OworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlcihKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JEZXZpY2VNYW5hZ2VyIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBjb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkRldmljZU1hbmFnZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKyAgICBMT0dfRkFUQUxfSUYoY2xhenogPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKyAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIik7CisgICAgTE9HX0ZBVEFMX0lGKGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID09IE5VTEwsCisgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBjb25zdHJ1Y3RvciBmb3IgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworCisgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJjb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkRldmljZU1hbmFnZXIiLAorICAgICAgICAgICAgbWV0aG9kX3RhYmxlLCBORUxFTShtZXRob2RfdGFibGUpKTsKK30KKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiSG9zdE1hbmFnZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JIb3N0TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwNmQ3NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiSG9zdE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJVc2JIb3N0TWFuYWdlckpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworCitzdGF0aWMgc3RydWN0IHBhcmNlbF9maWxlX2Rlc2NyaXB0b3Jfb2Zmc2V0c190Cit7CisgICAgamNsYXNzIG1DbGFzczsKKyAgICBqbWV0aG9kSUQgbUNvbnN0cnVjdG9yOworfSBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzOworCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF91c2JEZXZpY2VBZGRlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3VzYkRldmljZVJlbW92ZWQ7CisKK3N0YXRpYyB2b2lkIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGNhbGxiYWNrICclcycuIiwgbWV0aG9kTmFtZSk7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKworc3RhdGljIGludCB1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciogZGVzYzsKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciBpdGVyOworCisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IHVzYl9kZXZpY2Vfb3BlbihkZXZuYW1lKTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX29wZW4gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam9iamVjdCB0aGl6ID0gKGpvYmplY3QpY2xpZW50X2RhdGE7CisgICAgVmVjdG9yPGludD4gaW50ZXJmYWNlVmFsdWVzOworICAgIFZlY3RvcjxpbnQ+IGVuZHBvaW50VmFsdWVzOworICAgIGNvbnN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciogZGV2aWNlRGVzYyA9IHVzYl9kZXZpY2VfZ2V0X2RldmljZV9kZXNjcmlwdG9yKGRldmljZSk7CisKKyAgICB1aW50MTZfdCB2ZW5kb3JJZCA9IHVzYl9kZXZpY2VfZ2V0X3ZlbmRvcl9pZChkZXZpY2UpOworICAgIHVpbnQxNl90IHByb2R1Y3RJZCA9IHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfaWQoZGV2aWNlKTsKKyAgICB1aW50OF90IGRldmljZUNsYXNzID0gZGV2aWNlRGVzYy0+YkRldmljZUNsYXNzOworICAgIHVpbnQ4X3QgZGV2aWNlU3ViQ2xhc3MgPSBkZXZpY2VEZXNjLT5iRGV2aWNlU3ViQ2xhc3M7CisgICAgdWludDhfdCBwcm90b2NvbCA9IGRldmljZURlc2MtPmJEZXZpY2VQcm90b2NvbDsKKworICAgIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChkZXZpY2UsICZpdGVyKTsKKworICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfSU5URVJGQUNFKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZhY2UgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIC8vIHB1c2ggY2xhc3MsIHN1YmNsYXNzLCBwcm90b2NvbCBhbmQgbnVtYmVyIG9mIGVuZHBvaW50cyBpbnRvIGludGVyZmFjZVZhbHVlcyB2ZWN0b3IKKyAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iSW50ZXJmYWNlTnVtYmVyKTsKKyAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iSW50ZXJmYWNlQ2xhc3MpOworICAgICAgICAgICAgaW50ZXJmYWNlVmFsdWVzLmFkZChpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyk7CisgICAgICAgICAgICBpbnRlcmZhY2VWYWx1ZXMuYWRkKGludGVyZmFjZS0+YkludGVyZmFjZVByb3RvY29sKTsKKyAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iTnVtRW5kcG9pbnRzKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZXNjLT5iRGVzY3JpcHRvclR5cGUgPT0gVVNCX0RUX0VORFBPSU5UKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50ID0gKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIC8vIHB1c2ggYWRkcmVzcywgYXR0cmlidXRlcywgbWF4IHBhY2tldCBzaXplIGFuZCBpbnRlcnZhbCBpbnRvIGVuZHBvaW50VmFsdWVzIHZlY3RvcgorICAgICAgICAgICAgZW5kcG9pbnRWYWx1ZXMuYWRkKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKyAgICAgICAgICAgIGVuZHBvaW50VmFsdWVzLmFkZChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGVuZHBvaW50VmFsdWVzLmFkZChfX2xlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpOworICAgICAgICAgICAgZW5kcG9pbnRWYWx1ZXMuYWRkKGVuZHBvaW50LT5iSW50ZXJ2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOworCisgICAgLy8gaGFuZGxlIGdlbmVyaWMgZGV2aWNlIG5vdGlmaWNhdGlvbgorICAgIGludCBsZW5ndGggPSBpbnRlcmZhY2VWYWx1ZXMuc2l6ZSgpOworICAgIGppbnRBcnJheSBpbnRlcmZhY2VBcnJheSA9IGVudi0+TmV3SW50QXJyYXkobGVuZ3RoKTsKKyAgICBlbnYtPlNldEludEFycmF5UmVnaW9uKGludGVyZmFjZUFycmF5LCAwLCBsZW5ndGgsIGludGVyZmFjZVZhbHVlcy5hcnJheSgpKTsKKworICAgIGxlbmd0aCA9IGVuZHBvaW50VmFsdWVzLnNpemUoKTsKKyAgICBqaW50QXJyYXkgZW5kcG9pbnRBcnJheSA9IGVudi0+TmV3SW50QXJyYXkobGVuZ3RoKTsKKyAgICBlbnYtPlNldEludEFycmF5UmVnaW9uKGVuZHBvaW50QXJyYXksIDAsIGxlbmd0aCwgZW5kcG9pbnRWYWx1ZXMuYXJyYXkoKSk7CisKKyAgICBqc3RyaW5nIGRldmljZU5hbWUgPSBlbnYtPk5ld1N0cmluZ1VURihkZXZuYW1lKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHRoaXosIG1ldGhvZF91c2JEZXZpY2VBZGRlZCwKKyAgICAgICAgICAgIGRldmljZU5hbWUsIHZlbmRvcklkLCBwcm9kdWN0SWQsIGRldmljZUNsYXNzLAorICAgICAgICAgICAgZGV2aWNlU3ViQ2xhc3MsIHByb3RvY29sLCBpbnRlcmZhY2VBcnJheSwgZW5kcG9pbnRBcnJheSk7CisKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGludGVyZmFjZUFycmF5KTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGVuZHBvaW50QXJyYXkpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZGV2aWNlTmFtZSk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfZGV2aWNlX3JlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqb2JqZWN0IHRoaXogPSAoam9iamVjdCljbGllbnRfZGF0YTsKKworICAgIGpzdHJpbmcgZGV2aWNlTmFtZSA9IGVudi0+TmV3U3RyaW5nVVRGKGRldm5hbWUpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QodGhpeiwgbWV0aG9kX3VzYkRldmljZVJlbW92ZWQsIGVudi0+TmV3U3RyaW5nVVRGKGRldm5hbWUpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGRldmljZU5hbWUpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3NlcnZlcl9Vc2JIb3N0TWFuYWdlcl9tb25pdG9yVXNiSG9zdEJ1cyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIHN0cnVjdCB1c2JfaG9zdF9jb250ZXh0KiBjb250ZXh0ID0gdXNiX2hvc3RfaW5pdCgpOworICAgIGlmICghY29udGV4dCkgeworICAgICAgICBMT0dFKCJ1c2JfaG9zdF9pbml0IGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gc28gaXQgaXMgc2FmZSB0byBwYXNzIHRoaXogZGlyZWN0bHkKKyAgICB1c2JfaG9zdF9ydW4oY29udGV4dCwgdXNiX2RldmljZV9hZGRlZCwgdXNiX2RldmljZV9yZW1vdmVkLCBOVUxMLCAodm9pZCAqKXRoaXopOworfQorCitzdGF0aWMgam9iamVjdCBhbmRyb2lkX3NlcnZlcl9Vc2JIb3N0TWFuYWdlcl9vcGVuRGV2aWNlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgZGV2aWNlTmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpkZXZpY2VOYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhkZXZpY2VOYW1lLCBOVUxMKTsKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSogZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldmljZU5hbWVTdHIpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRldmljZU5hbWUsIGRldmljZU5hbWVTdHIpOworCisgICAgaWYgKCFkZXZpY2UpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaW50IGZkID0gdXNiX2RldmljZV9nZXRfZmQoZGV2aWNlKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbnQgbmV3RkQgPSBkdXAoZmQpOworICAgIHVzYl9kZXZpY2VfY2xvc2UoZGV2aWNlKTsKKworICAgIGpvYmplY3QgZmlsZURlc2NyaXB0b3IgPSBqbmlDcmVhdGVGaWxlRGVzY3JpcHRvcihlbnYsIG5ld0ZEKTsKKyAgICBpZiAoZmlsZURlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzLAorICAgICAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciwgZmlsZURlc2NyaXB0b3IpOworfQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIG1ldGhvZF90YWJsZVtdID0geworICAgIHsgIm1vbml0b3JVc2JIb3N0QnVzIiwgIigpViIsICh2b2lkKilhbmRyb2lkX3NlcnZlcl9Vc2JIb3N0TWFuYWdlcl9tb25pdG9yVXNiSG9zdEJ1cyB9LAorICAgIHsgIm5hdGl2ZU9wZW5EZXZpY2UiLCAgIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3I7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9zZXJ2ZXJfVXNiSG9zdE1hbmFnZXJfb3BlbkRldmljZSB9LAorfTsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYkhvc3RNYW5hZ2VyKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJjb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkhvc3RNYW5hZ2VyIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBjb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkhvc3RNYW5hZ2VyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3VzYkRldmljZUFkZGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInVzYkRldmljZUFkZGVkIiwgIihMamF2YS9sYW5nL1N0cmluZztJSUlJSVtJW0kpViIpOworICAgIGlmIChtZXRob2RfdXNiRGV2aWNlQWRkZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkRldmljZUFkZGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3VzYkRldmljZVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiRGV2aWNlUmVtb3ZlZCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBpZiAobWV0aG9kX3VzYkRldmljZVJlbW92ZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkRldmljZVJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKyAgICBMT0dfRkFUQUxfSUYoY2xhenogPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKyAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIik7CisgICAgTE9HX0ZBVEFMX0lGKGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID09IE5VTEwsCisgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBjb25zdHJ1Y3RvciBmb3IgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworCisgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJjb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkhvc3RNYW5hZ2VyIiwKKyAgICAgICAgICAgIG1ldGhvZF90YWJsZSwgTkVMRU0obWV0aG9kX3RhYmxlKSk7Cit9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2UuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDRmNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlVzYlNlcnZpY2UiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJKTklIZWxwLmgiCi0jaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCi0jaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCi0KLSNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IvZl9hY2Nlc3NvcnkuaD4KLQotI2RlZmluZSBEUklWRVJfTkFNRSAiL2Rldi91c2JfYWNjZXNzb3J5IgotCi1uYW1lc3BhY2UgYW5kcm9pZAotewotCi1zdGF0aWMgc3RydWN0IHBhcmNlbF9maWxlX2Rlc2NyaXB0b3Jfb2Zmc2V0c190Ci17Ci0gICAgamNsYXNzIG1DbGFzczsKLSAgICBqbWV0aG9kSUQgbUNvbnN0cnVjdG9yOwotfSBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzOwotCi1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF91c2JEZXZpY2VBZGRlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3VzYkRldmljZVJlbW92ZWQ7Ci0KLXN0YXRpYyB2b2lkIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKLSAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7Ci0gICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGNhbGxiYWNrICclcycuIiwgbWV0aG9kTmFtZSk7Ci0gICAgICAgIExPR0VfRVgoZW52KTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgIH0KLX0KLQotc3RhdGljIGludCB1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7Ci0gICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciogZGVzYzsKLSAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciBpdGVyOwotCi0gICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IHVzYl9kZXZpY2Vfb3BlbihkZXZuYW1lKTsKLSAgICBpZiAoIWRldmljZSkgewotICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX29wZW4gZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam9iamVjdCB0aGl6ID0gKGpvYmplY3QpY2xpZW50X2RhdGE7Ci0gICAgVmVjdG9yPGludD4gaW50ZXJmYWNlVmFsdWVzOwotICAgIFZlY3RvcjxpbnQ+IGVuZHBvaW50VmFsdWVzOwotICAgIGNvbnN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciogZGV2aWNlRGVzYyA9IHVzYl9kZXZpY2VfZ2V0X2RldmljZV9kZXNjcmlwdG9yKGRldmljZSk7Ci0KLSAgICB1aW50MTZfdCB2ZW5kb3JJZCA9IHVzYl9kZXZpY2VfZ2V0X3ZlbmRvcl9pZChkZXZpY2UpOwotICAgIHVpbnQxNl90IHByb2R1Y3RJZCA9IHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfaWQoZGV2aWNlKTsKLSAgICB1aW50OF90IGRldmljZUNsYXNzID0gZGV2aWNlRGVzYy0+YkRldmljZUNsYXNzOwotICAgIHVpbnQ4X3QgZGV2aWNlU3ViQ2xhc3MgPSBkZXZpY2VEZXNjLT5iRGV2aWNlU3ViQ2xhc3M7Ci0gICAgdWludDhfdCBwcm90b2NvbCA9IGRldmljZURlc2MtPmJEZXZpY2VQcm90b2NvbDsKLQotICAgIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChkZXZpY2UsICZpdGVyKTsKLQotICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfSU5URVJGQUNFKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZhY2UgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKWRlc2M7Ci0KLSAgICAgICAgICAgIC8vIHB1c2ggY2xhc3MsIHN1YmNsYXNzLCBwcm90b2NvbCBhbmQgbnVtYmVyIG9mIGVuZHBvaW50cyBpbnRvIGludGVyZmFjZVZhbHVlcyB2ZWN0b3IKLSAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iSW50ZXJmYWNlTnVtYmVyKTsKLSAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iSW50ZXJmYWNlQ2xhc3MpOwotICAgICAgICAgICAgaW50ZXJmYWNlVmFsdWVzLmFkZChpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VWYWx1ZXMuYWRkKGludGVyZmFjZS0+YkludGVyZmFjZVByb3RvY29sKTsKLSAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iTnVtRW5kcG9pbnRzKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjLT5iRGVzY3JpcHRvclR5cGUgPT0gVVNCX0RUX0VORFBPSU5UKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50ID0gKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqKWRlc2M7Ci0KLSAgICAgICAgICAgIC8vIHB1c2ggYWRkcmVzcywgYXR0cmlidXRlcywgbWF4IHBhY2tldCBzaXplIGFuZCBpbnRlcnZhbCBpbnRvIGVuZHBvaW50VmFsdWVzIHZlY3RvcgotICAgICAgICAgICAgZW5kcG9pbnRWYWx1ZXMuYWRkKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKLSAgICAgICAgICAgIGVuZHBvaW50VmFsdWVzLmFkZChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGVuZHBvaW50VmFsdWVzLmFkZChfX2xlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpOwotICAgICAgICAgICAgZW5kcG9pbnRWYWx1ZXMuYWRkKGVuZHBvaW50LT5iSW50ZXJ2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOwotCi0gICAgLy8gaGFuZGxlIGdlbmVyaWMgZGV2aWNlIG5vdGlmaWNhdGlvbgotICAgIGludCBsZW5ndGggPSBpbnRlcmZhY2VWYWx1ZXMuc2l6ZSgpOwotICAgIGppbnRBcnJheSBpbnRlcmZhY2VBcnJheSA9IGVudi0+TmV3SW50QXJyYXkobGVuZ3RoKTsKLSAgICBlbnYtPlNldEludEFycmF5UmVnaW9uKGludGVyZmFjZUFycmF5LCAwLCBsZW5ndGgsIGludGVyZmFjZVZhbHVlcy5hcnJheSgpKTsKLQotICAgIGxlbmd0aCA9IGVuZHBvaW50VmFsdWVzLnNpemUoKTsKLSAgICBqaW50QXJyYXkgZW5kcG9pbnRBcnJheSA9IGVudi0+TmV3SW50QXJyYXkobGVuZ3RoKTsKLSAgICBlbnYtPlNldEludEFycmF5UmVnaW9uKGVuZHBvaW50QXJyYXksIDAsIGxlbmd0aCwgZW5kcG9pbnRWYWx1ZXMuYXJyYXkoKSk7Ci0KLSAgICBqc3RyaW5nIGRldmljZU5hbWUgPSBlbnYtPk5ld1N0cmluZ1VURihkZXZuYW1lKTsKLSAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHRoaXosIG1ldGhvZF91c2JEZXZpY2VBZGRlZCwKLSAgICAgICAgICAgIGRldmljZU5hbWUsIHZlbmRvcklkLCBwcm9kdWN0SWQsIGRldmljZUNsYXNzLAotICAgICAgICAgICAgZGV2aWNlU3ViQ2xhc3MsIHByb3RvY29sLCBpbnRlcmZhY2VBcnJheSwgZW5kcG9pbnRBcnJheSk7Ci0KLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGludGVyZmFjZUFycmF5KTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGVuZHBvaW50QXJyYXkpOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZGV2aWNlTmFtZSk7Ci0gICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfZGV2aWNlX3JlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKLSAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqb2JqZWN0IHRoaXogPSAoam9iamVjdCljbGllbnRfZGF0YTsKLQotICAgIGpzdHJpbmcgZGV2aWNlTmFtZSA9IGVudi0+TmV3U3RyaW5nVVRGKGRldm5hbWUpOwotICAgIGVudi0+Q2FsbFZvaWRNZXRob2QodGhpeiwgbWV0aG9kX3VzYkRldmljZVJlbW92ZWQsIGVudi0+TmV3U3RyaW5nVVRGKGRldm5hbWUpKTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGRldmljZU5hbWUpOwotICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhbmRyb2lkX3NlcnZlcl9Vc2JTZXJ2aWNlX21vbml0b3JVc2JIb3N0QnVzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCi17Ci0gICAgc3RydWN0IHVzYl9ob3N0X2NvbnRleHQqIGNvbnRleHQgPSB1c2JfaG9zdF9pbml0KCk7Ci0gICAgaWYgKCFjb250ZXh0KSB7Ci0gICAgICAgIExPR0UoInVzYl9ob3N0X2luaXQgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gdGhpcyB3aWxsIG5ldmVyIHJldHVybiBzbyBpdCBpcyBzYWZlIHRvIHBhc3MgdGhpeiBkaXJlY3RseQotICAgIHVzYl9ob3N0X3J1bihjb250ZXh0LCB1c2JfZGV2aWNlX2FkZGVkLCB1c2JfZGV2aWNlX3JlbW92ZWQsIE5VTEwsICh2b2lkICopdGhpeik7Ci19Ci0KLXN0YXRpYyBqb2JqZWN0IGFuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2Vfb3BlbkRldmljZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIGRldmljZU5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqZGV2aWNlTmFtZVN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZGV2aWNlTmFtZSwgTlVMTCk7Ci0gICAgc3RydWN0IHVzYl9kZXZpY2UqIGRldmljZSA9IHVzYl9kZXZpY2Vfb3BlbihkZXZpY2VOYW1lU3RyKTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkZXZpY2VOYW1lLCBkZXZpY2VOYW1lU3RyKTsKLQotICAgIGlmICghZGV2aWNlKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGludCBmZCA9IHVzYl9kZXZpY2VfZ2V0X2ZkKGRldmljZSk7Ci0gICAgaWYgKGZkIDwgMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaW50IG5ld0ZEID0gZHVwKGZkKTsKLSAgICB1c2JfZGV2aWNlX2Nsb3NlKGRldmljZSk7Ci0KLSAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yID0gam5pQ3JlYXRlRmlsZURlc2NyaXB0b3IoZW52LCBuZXdGRCk7Ci0gICAgaWYgKGZpbGVEZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBlbnYtPk5ld09iamVjdChnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcywKLSAgICAgICAgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IsIGZpbGVEZXNjcmlwdG9yKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2FjY2Vzc29yeV9zdHJpbmcoSk5JRW52ICplbnYsIGludCBmZCwgaW50IGNtZCwgam9iamVjdEFycmF5IHN0ckFycmF5LCBpbnQgaW5kZXgpCi17Ci0gICAgY2hhciBidWZmZXJbMjU2XTsKLQotICAgIGJ1ZmZlclswXSA9IDA7Ci0gICAgaW50IGxlbmd0aCA9IGlvY3RsKGZkLCBjbWQsIGJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZmZlclswXSkgewotICAgICAgICBqc3RyaW5nIG9iaiA9IGVudi0+TmV3U3RyaW5nVVRGKGJ1ZmZlcik7Ci0gICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHN0ckFycmF5LCBpbmRleCwgb2JqKTsKLSAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIH0KLX0KLQotCi1zdGF0aWMgam9iamVjdEFycmF5IGFuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2VfZ2V0QWNjZXNzb3J5U3RyaW5ncyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQotewotICAgIGludCBmZCA9IG9wZW4oRFJJVkVSX05BTUUsIE9fUkRXUik7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBMT0dFKCJjb3VsZCBub3Qgb3BlbiAlcyIsIERSSVZFUl9OQU1FKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGpjbGFzcyBzdHJpbmdDbGFzcyA9IGVudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvU3RyaW5nIik7Ci0gICAgam9iamVjdEFycmF5IHN0ckFycmF5ID0gZW52LT5OZXdPYmplY3RBcnJheSg2LCBzdHJpbmdDbGFzcywgTlVMTCk7Ci0gICAgaWYgKCFzdHJBcnJheSkgZ290byBvdXQ7Ci0gICAgc2V0X2FjY2Vzc29yeV9zdHJpbmcoZW52LCBmZCwgQUNDRVNTT1JZX0dFVF9TVFJJTkdfTUFOVUZBQ1RVUkVSLCBzdHJBcnJheSwgMCk7Ci0gICAgc2V0X2FjY2Vzc29yeV9zdHJpbmcoZW52LCBmZCwgQUNDRVNTT1JZX0dFVF9TVFJJTkdfTU9ERUwsIHN0ckFycmF5LCAxKTsKLSAgICBzZXRfYWNjZXNzb3J5X3N0cmluZyhlbnYsIGZkLCBBQ0NFU1NPUllfR0VUX1NUUklOR19ERVNDUklQVElPTiwgc3RyQXJyYXksIDIpOwotICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX1ZFUlNJT04sIHN0ckFycmF5LCAzKTsKLSAgICBzZXRfYWNjZXNzb3J5X3N0cmluZyhlbnYsIGZkLCBBQ0NFU1NPUllfR0VUX1NUUklOR19VUkksIHN0ckFycmF5LCA0KTsKLSAgICBzZXRfYWNjZXNzb3J5X3N0cmluZyhlbnYsIGZkLCBBQ0NFU1NPUllfR0VUX1NUUklOR19TRVJJQUwsIHN0ckFycmF5LCA1KTsKLQotb3V0OgotICAgIGNsb3NlKGZkKTsKLSAgICByZXR1cm4gc3RyQXJyYXk7Ci19Ci0KLXN0YXRpYyBqb2JqZWN0IGFuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2Vfb3BlbkFjY2Vzc29yeShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQotewotICAgIGludCBmZCA9IG9wZW4oRFJJVkVSX05BTUUsIE9fUkRXUik7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBMT0dFKCJjb3VsZCBub3Qgb3BlbiAlcyIsIERSSVZFUl9OQU1FKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGpvYmplY3QgZmlsZURlc2NyaXB0b3IgPSBqbmlDcmVhdGVGaWxlRGVzY3JpcHRvcihlbnYsIGZkKTsKLSAgICBpZiAoZmlsZURlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzLAotICAgICAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciwgZmlsZURlc2NyaXB0b3IpOwotfQotCi1zdGF0aWMgSk5JTmF0aXZlTWV0aG9kIG1ldGhvZF90YWJsZVtdID0gewotICAgIHsgIm1vbml0b3JVc2JIb3N0QnVzIiwgIigpViIsICh2b2lkKilhbmRyb2lkX3NlcnZlcl9Vc2JTZXJ2aWNlX21vbml0b3JVc2JIb3N0QnVzIH0sCi0gICAgeyAibmF0aXZlT3BlbkRldmljZSIsICAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3NlcnZlcl9Vc2JTZXJ2aWNlX29wZW5EZXZpY2UgfSwKLSAgICB7ICJuYXRpdmVHZXRBY2Nlc3NvcnlTdHJpbmdzIiwgIigpW0xqYXZhL2xhbmcvU3RyaW5nOyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2VfZ2V0QWNjZXNzb3J5U3RyaW5ncyB9LAotICAgIHsgIm5hdGl2ZU9wZW5BY2Nlc3NvcnkiLCIoKUxhbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yOyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2Vfb3BlbkFjY2Vzc29yeSB9LAotfTsKLQotaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2UoSk5JRW52ICplbnYpCi17Ci0gICAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImNvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiU2VydmljZSIpOwotICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIkNhbid0IGZpbmQgY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JTZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbWV0aG9kX3VzYkRldmljZUFkZGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInVzYkRldmljZUFkZGVkIiwgIihMamF2YS9sYW5nL1N0cmluZztJSUlJSVtJW0kpViIpOwotICAgIGlmIChtZXRob2RfdXNiRGV2aWNlQWRkZWQgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkRldmljZUFkZGVkIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbWV0aG9kX3VzYkRldmljZVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiRGV2aWNlUmVtb3ZlZCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKLSAgICBpZiAobWV0aG9kX3VzYkRldmljZVJlbW92ZWQgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkRldmljZVJlbW92ZWQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKLSAgICBMT0dfRkFUQUxfSUYoY2xhenogPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKLSAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKLSAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIik7Ci0gICAgTE9HX0ZBVEFMX0lGKGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID09IE5VTEwsCi0gICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBjb25zdHJ1Y3RvciBmb3IgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJjb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYlNlcnZpY2UiLAotICAgICAgICAgICAgbWV0aG9kX3RhYmxlLCBORUxFTShtZXRob2RfdGFibGUpKTsKLX0KLQotfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwIGIvc2VydmljZXMvam5pL29ubG9hZC5jcHAKaW5kZXggMGM0NmVlZS4uNDY5ZTgxOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL29ubG9hZC5jcHAKKysrIGIvc2VydmljZXMvam5pL29ubG9hZC5jcHAKQEAgLTI5LDcgKzI5LDggQEAKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2UoSk5JRW52KiBlbnYpOwotaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2UoSk5JRW52KiBlbnYpOworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYkRldmljZU1hbmFnZXIoSk5JRW52KiBlbnYpOworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYkhvc3RNYW5hZ2VyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlcihKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcihKTklFbnYqIGVudik7CkBAIC01Nyw3ICs1OCw4IEBACiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0FsYXJtTWFuYWdlclNlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZShlbnYpOwotICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2UoZW52KTsKKyAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JEZXZpY2VNYW5hZ2VyKGVudik7CisgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiSG9zdE1hbmFnZXIoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyKGVudik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggYzUwZTRhMS4uYmEzZTZlNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMiwxMyArMiwxNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLQlHcmF2aXR5U2Vuc29yLmNwcCBcCi0JTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yLmNwcCBcCi0JUm90YXRpb25WZWN0b3JTZW5zb3IuY3BwIFwKLSAgICBTZW5zb3JTZXJ2aWNlLmNwcCBcCi0gICAgU2Vuc29ySW50ZXJmYWNlLmNwcCBcCisJQ29ycmVjdGVkR3lyb1NlbnNvci5jcHAgXAorICAgIEZ1c2lvbi5jcHAgXAorICAgIEdyYXZpdHlTZW5zb3IuY3BwIFwKKyAgICBMaW5lYXJBY2NlbGVyYXRpb25TZW5zb3IuY3BwIFwKKyAgICBPcmllbnRhdGlvblNlbnNvci5jcHAgXAorICAgIFJvdGF0aW9uVmVjdG9yU2Vuc29yLmNwcCBcCiAgICAgU2Vuc29yRGV2aWNlLmNwcCBcCi0gICAgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyLmNwcAorICAgIFNlbnNvckZ1c2lvbi5jcHAgXAorICAgIFNlbnNvckludGVyZmFjZS5jcHAgXAorICAgIFNlbnNvclNlcnZpY2UuY3BwIFwKKwogCiBMT0NBTF9DRkxBR1M6PSAtRExPR19UQUc9XCJTZW5zb3JTZXJ2aWNlXCIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9Db3JyZWN0ZWRHeXJvU2Vuc29yLmNwcCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvQ29ycmVjdGVkR3lyb1NlbnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1NzQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvQ29ycmVjdGVkR3lyb1NlbnNvci5jcHAKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKworI2luY2x1ZGUgIkNvcnJlY3RlZEd5cm9TZW5zb3IuaCIKKyNpbmNsdWRlICJTZW5zb3JEZXZpY2UuaCIKKyNpbmNsdWRlICJTZW5zb3JGdXNpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvcnJlY3RlZEd5cm9TZW5zb3I6OkNvcnJlY3RlZEd5cm9TZW5zb3Ioc2Vuc29yX3QgY29uc3QqIGxpc3QsIHNpemVfdCBjb3VudCkKKyAgICA6IG1TZW5zb3JEZXZpY2UoU2Vuc29yRGV2aWNlOjpnZXRJbnN0YW5jZSgpKSwKKyAgICAgIG1TZW5zb3JGdXNpb24oU2Vuc29yRnVzaW9uOjpnZXRJbnN0YW5jZSgpKQoreworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKKyAgICAgICAgaWYgKGxpc3RbaV0udHlwZSA9PSBTRU5TT1JfVFlQRV9HWVJPU0NPUEUpIHsKKyAgICAgICAgICAgIG1HeXJvID0gU2Vuc29yKGxpc3QgKyBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENvcnJlY3RlZEd5cm9TZW5zb3I6OnByb2Nlc3Moc2Vuc29yc19ldmVudF90KiBvdXRFdmVudCwKKyAgICAgICAgY29uc3Qgc2Vuc29yc19ldmVudF90JiBldmVudCkKK3sKKyAgICBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9HWVJPU0NPUEUpIHsKKyAgICAgICAgY29uc3QgdmVjM190IGJpYXMobVNlbnNvckZ1c2lvbi5nZXRHeXJvQmlhcygpKTsKKyAgICAgICAgKm91dEV2ZW50ID0gZXZlbnQ7CisgICAgICAgIG91dEV2ZW50LT5kYXRhWzBdIC09IGJpYXMueDsKKyAgICAgICAgb3V0RXZlbnQtPmRhdGFbMV0gLT0gYmlhcy55OworICAgICAgICBvdXRFdmVudC0+ZGF0YVsyXSAtPSBiaWFzLno7CisgICAgICAgIG91dEV2ZW50LT5zZW5zb3IgPSAnX2NneSc7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IENvcnJlY3RlZEd5cm9TZW5zb3I6OmFjdGl2YXRlKHZvaWQqIGlkZW50LCBib29sIGVuYWJsZWQpIHsKKyAgICBtU2Vuc29yRGV2aWNlLmFjdGl2YXRlKHRoaXMsIG1HeXJvLmdldEhhbmRsZSgpLCBlbmFibGVkKTsKKyAgICByZXR1cm4gbVNlbnNvckZ1c2lvbi5hY3RpdmF0ZSh0aGlzLCBlbmFibGVkKTsKK30KKworc3RhdHVzX3QgQ29ycmVjdGVkR3lyb1NlbnNvcjo6c2V0RGVsYXkodm9pZCogaWRlbnQsIGludCBoYW5kbGUsIGludDY0X3QgbnMpIHsKKyAgICBtU2Vuc29yRGV2aWNlLnNldERlbGF5KHRoaXMsIG1HeXJvLmdldEhhbmRsZSgpLCBucyk7CisgICAgcmV0dXJuIG1TZW5zb3JGdXNpb24uc2V0RGVsYXkodGhpcywgbnMpOworfQorCitTZW5zb3IgQ29ycmVjdGVkR3lyb1NlbnNvcjo6Z2V0U2Vuc29yKCkgY29uc3QgeworICAgIHNlbnNvcl90IGh3U2Vuc29yOworICAgIGh3U2Vuc29yLm5hbWUgICAgICAgPSAiQ29ycmVjdGVkIEd5cm9zY29wZSBTZW5zb3IiOworICAgIGh3U2Vuc29yLnZlbmRvciAgICAgPSAiR29vZ2xlIEluYy4iOworICAgIGh3U2Vuc29yLnZlcnNpb24gICAgPSAxOworICAgIGh3U2Vuc29yLmhhbmRsZSAgICAgPSAnX2NneSc7CisgICAgaHdTZW5zb3IudHlwZSAgICAgICA9IFNFTlNPUl9UWVBFX0dZUk9TQ09QRTsKKyAgICBod1NlbnNvci5tYXhSYW5nZSAgID0gbUd5cm8uZ2V0TWF4VmFsdWUoKTsKKyAgICBod1NlbnNvci5yZXNvbHV0aW9uID0gbUd5cm8uZ2V0UmVzb2x1dGlvbigpOworICAgIGh3U2Vuc29yLnBvd2VyICAgICAgPSBtU2Vuc29yRnVzaW9uLmdldFBvd2VyVXNhZ2UoKTsKKyAgICBod1NlbnNvci5taW5EZWxheSAgID0gbUd5cm8uZ2V0TWluRGVsYXkoKTsKKyAgICBTZW5zb3Igc2Vuc29yKCZod1NlbnNvcik7CisgICAgcmV0dXJuIHNlbnNvcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0NvcnJlY3RlZEd5cm9TZW5zb3IuaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvQ29ycmVjdGVkR3lyb1NlbnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDljMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0NvcnJlY3RlZEd5cm9TZW5zb3IuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NPUlJFQ1RFRF9HWVJPX1NFTlNPUl9ICisjZGVmaW5lIEFORFJPSURfQ09SUkVDVEVEX0dZUk9fU0VOU09SX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Z3VpL1NlbnNvci5oPgorCisjaW5jbHVkZSAiU2Vuc29ySW50ZXJmYWNlLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFNlbnNvckRldmljZTsKK2NsYXNzIFNlbnNvckZ1c2lvbjsKKworY2xhc3MgQ29ycmVjdGVkR3lyb1NlbnNvciA6IHB1YmxpYyBTZW5zb3JJbnRlcmZhY2UgeworICAgIFNlbnNvckRldmljZSYgbVNlbnNvckRldmljZTsKKyAgICBTZW5zb3JGdXNpb24mIG1TZW5zb3JGdXNpb247CisgICAgU2Vuc29yIG1HeXJvOworCitwdWJsaWM6CisgICAgQ29ycmVjdGVkR3lyb1NlbnNvcihzZW5zb3JfdCBjb25zdCogbGlzdCwgc2l6ZV90IGNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzZW5zb3JzX2V2ZW50X3QqIG91dEV2ZW50LAorICAgICAgICAgICAgY29uc3Qgc2Vuc29yc19ldmVudF90JiBldmVudCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhY3RpdmF0ZSh2b2lkKiBpZGVudCwgYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERlbGF5KHZvaWQqIGlkZW50LCBpbnQgaGFuZGxlLCBpbnQ2NF90IG5zKTsKKyAgICB2aXJ0dWFsIFNlbnNvciBnZXRTZW5zb3IoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNWaXJ0dWFsKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9DT1JSRUNURURfR1lST19TRU5TT1JfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9GdXNpb24uY3BwIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9GdXNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Zjk3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0Z1c2lvbi5jcHAKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRnVzaW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IGZsb2F0IGd5cm9TVERFViA9IDMuMTZlLTQ7IC8vIHJhZC9zXjMvMgorc3RhdGljIGNvbnN0IGZsb2F0IGFjY1NUREVWICA9IDAuMDVmOyAgIC8vIG0vc14yIChtZWFzdXJlZCAwLjA4IC8gQ0REIDAuMDUpCitzdGF0aWMgY29uc3QgZmxvYXQgbWFnU1RERVYgID0gMC41ZjsgICAgLy8gdVQgICAgKG1lYXN1cmVkIDAuNyAgLyBDREQgMC41KQorc3RhdGljIGNvbnN0IGZsb2F0IGJpYXNTVERFViA9IDMuMTZlLTU7IC8vIHJhZC9zXjEvMiAoZ3Vlc3NlZCkKKworc3RhdGljIGNvbnN0IGZsb2F0IEZSRUVfRkFMTF9USFJFU0hPTEQgPSAwLjk4MWY7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUWVBFLCBzaXplX3QgQywgc2l6ZV90IFI+CitzdGF0aWMgbWF0PFRZUEUsIFIsIFI+IHNjYWxlQ292YXJpYW5jZSgKKyAgICAgICAgY29uc3QgbWF0PFRZUEUsIEMsIFI+JiBBLAorICAgICAgICBjb25zdCBtYXQ8VFlQRSwgQywgQz4mIFApIHsKKyAgICAvLyBBKlAqdHJhbnNwb3NlKEEpOworICAgIG1hdDxUWVBFLCBSLCBSPiBBUEF0OworICAgIGZvciAoc2l6ZV90IHI9MCA7IHI8UiA7IHIrKykgeworICAgICAgICBmb3IgKHNpemVfdCBqPXIgOyBqPFIgOyBqKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBhcGF0KDApOworICAgICAgICAgICAgZm9yIChzaXplX3QgYz0wIDsgYzxDIDsgYysrKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHYoQVtjXVtyXSpQW2NdW2NdKjAuNSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3Qgaz1jKzEgOyBrPEMgOyBrKyspCisgICAgICAgICAgICAgICAgICAgIHYgKz0gQVtrXVtyXSAqIFBbY11ba107CisgICAgICAgICAgICAgICAgYXBhdCArPSAyICogdiAqIEFbY11bal07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBUEF0W2pdW3JdID0gYXBhdDsKKyAgICAgICAgICAgIEFQQXRbcl1bal0gPSBhcGF0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBUEF0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRSwgdHlwZW5hbWUgT1RIRVJfVFlQRT4KK3N0YXRpYyBtYXQ8VFlQRSwgMywgMz4gY3Jvc3NNYXRyaXgoY29uc3QgdmVjPFRZUEUsIDM+JiBwLCBPVEhFUl9UWVBFIGRpYWcpIHsKKyAgICBtYXQ8VFlQRSwgMywgMz4gcjsKKyAgICByWzBdWzBdID0gZGlhZzsKKyAgICByWzFdWzFdID0gZGlhZzsKKyAgICByWzJdWzJdID0gZGlhZzsKKyAgICByWzBdWzFdID0gcC56OworICAgIHJbMV1bMF0gPS1wLno7CisgICAgclswXVsyXSA9LXAueTsKKyAgICByWzJdWzBdID0gcC55OworICAgIHJbMV1bMl0gPSBwLng7CisgICAgclsyXVsxXSA9LXAueDsKKyAgICByZXR1cm4gcjsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFLCBzaXplX3QgU0laRT4KK2NsYXNzIENvdmFyaWFuY2UgeworICAgIG1hdDxUWVBFLCBTSVpFLCBTSVpFPiBtU3VtWFg7CisgICAgdmVjPFRZUEUsIFNJWkU+IG1TdW1YOworICAgIHNpemVfdCBtTjsKK3B1YmxpYzoKKyAgICBDb3ZhcmlhbmNlKCkgOiBtU3VtWFgoMC4wZiksIG1TdW1YKDAuMGYpLCBtTigwKSB7IH0KKyAgICB2b2lkIHVwZGF0ZShjb25zdCB2ZWM8VFlQRSwgU0laRT4mIHgpIHsKKyAgICAgICAgbVN1bVhYICs9IHgqdHJhbnNwb3NlKHgpOworICAgICAgICBtU3VtWCAgKz0geDsKKyAgICAgICAgbU4rKzsKKyAgICB9CisgICAgbWF0PFRZUEUsIFNJWkUsIFNJWkU+IG9wZXJhdG9yKCkoKSBjb25zdCB7CisgICAgICAgIGNvbnN0IGZsb2F0IE4gPSAxLjBmIC8gbU47CisgICAgICAgIHJldHVybiBtU3VtWFgqTiAtIChtU3VtWCp0cmFuc3Bvc2UobVN1bVgpKSooTipOKTsKKyAgICB9CisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbU4gPSAwOworICAgICAgICBtU3VtWFggPSAwOworICAgICAgICBtU3VtWCA9IDA7CisgICAgfQorICAgIHNpemVfdCBnZXRDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1OOworICAgIH0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Z1c2lvbjo6RnVzaW9uKCkgeworICAgIFBoaVswXVsxXSA9IDA7CisgICAgUGhpWzFdWzFdID0gMTsKKworICAgIEJhLnggPSAwOworICAgIEJhLnkgPSAwOworICAgIEJhLnogPSAxOworCisgICAgQm0ueCA9IDA7CisgICAgQm0ueSA9IDE7CisgICAgQm0ueiA9IDA7CisKKyAgICBpbml0KCk7Cit9CisKK3ZvaWQgRnVzaW9uOjppbml0KCkgeworICAgIG1Jbml0U3RhdGUgPSAwOworICAgIG1HeXJvUmF0ZSA9IDA7CisgICAgbUNvdW50WzBdID0gMDsKKyAgICBtQ291bnRbMV0gPSAwOworICAgIG1Db3VudFsyXSA9IDA7CisgICAgbURhdGEgPSAwOworfQorCit2b2lkIEZ1c2lvbjo6aW5pdEZ1c2lvbihjb25zdCB2ZWM0X3QmIHEsIGZsb2F0IGRUKQoreworICAgIC8vIGluaXRpYWwgZXN0aW1hdGU6IEV7IHgodDApIH0KKyAgICB4MCA9IHE7CisgICAgeDEgPSAwOworCisgICAgLy8gcHJvY2VzcyBub2lzZSBjb3ZhcmlhbmNlIG1hdHJpeAorICAgIC8vICBHID0gfCAtMSAwIHwKKyAgICAvLyAgICAgIHwgIDAgMSB8CisKKyAgICBjb25zdCBmbG9hdCB2ID0gZ3lyb1NUREVWOworICAgIGNvbnN0IGZsb2F0IHUgPSBiaWFzU1RERVY7CisgICAgY29uc3QgZmxvYXQgcTAwID0gdip2KmRUICsgMC4zMzMzM2YqKGRUKmRUKmRUKSp1KnU7CisgICAgY29uc3QgZmxvYXQgcTEwID0gICAgICAgICAgICAgIDAuNWYqKGRUKmRUKSAgICp1KnU7CisgICAgY29uc3QgZmxvYXQgcTAxID0gcTEwOworICAgIGNvbnN0IGZsb2F0IHExMSA9IHUqdSpkVDsKKyAgICBHUUd0WzBdWzBdID0gIHEwMDsKKyAgICBHUUd0WzFdWzBdID0gLXExMDsKKyAgICBHUUd0WzBdWzFdID0gLXEwMTsKKyAgICBHUUd0WzFdWzFdID0gIHExMTsKKworCisgICAgLy8gaW5pdGlhbCBjb3ZhcmlhbmNlOiBWYXJ7IHgodDApIH0KKyAgICBQID0gMDsKK30KKworYm9vbCBGdXNpb246Omhhc0VzdGltYXRlKCkgY29uc3QgeworICAgIHJldHVybiAobUluaXRTdGF0ZSA9PSAoTUFHfEFDQ3xHWVJPKSk7Cit9CisKK2Jvb2wgRnVzaW9uOjpjaGVja0luaXRDb21wbGV0ZShpbnQgd2hhdCwgY29uc3QgdmVjM190JiBkLCBmbG9hdCBkVCkgeworICAgIGlmIChoYXNFc3RpbWF0ZSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICh3aGF0ID09IEFDQykgeworICAgICAgICBtRGF0YVswXSArPSBkICogKDEvbGVuZ3RoKGQpKTsKKyAgICAgICAgbUNvdW50WzBdKys7CisgICAgICAgIG1Jbml0U3RhdGUgfD0gQUNDOworICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNQUcpIHsKKyAgICAgICAgbURhdGFbMV0gKz0gZCAqICgxL2xlbmd0aChkKSk7CisgICAgICAgIG1Db3VudFsxXSsrOworICAgICAgICBtSW5pdFN0YXRlIHw9IE1BRzsKKyAgICB9IGVsc2UgaWYgKHdoYXQgPT0gR1lSTykgeworICAgICAgICBtR3lyb1JhdGUgPSBkVDsKKyAgICAgICAgbURhdGFbMl0gKz0gZCpkVDsKKyAgICAgICAgbUNvdW50WzJdKys7CisgICAgICAgIGlmIChtQ291bnRbMl0gPT0gNjQpIHsKKyAgICAgICAgICAgIC8vIDY0IHNhbXBsZXMgaXMgZ29vZCBlbm91Z2ggdG8gZXN0aW1hdGUgdGhlIGd5cm8gZHJpZnQgYW5kCisgICAgICAgICAgICAvLyBkb2Vzbid0IHRha2UgdG9vIG11Y2ggdGltZS4KKyAgICAgICAgICAgIG1Jbml0U3RhdGUgfD0gR1lSTzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtSW5pdFN0YXRlID09IChNQUd8QUNDfEdZUk8pKSB7CisgICAgICAgIC8vIEF2ZXJhZ2UgYWxsIHRoZSB2YWx1ZXMgd2UgY29sbGVjdGVkIHNvIGZhcgorICAgICAgICBtRGF0YVswXSAqPSAxLjBmL21Db3VudFswXTsKKyAgICAgICAgbURhdGFbMV0gKj0gMS4wZi9tQ291bnRbMV07CisgICAgICAgIG1EYXRhWzJdICo9IDEuMGYvbUNvdW50WzJdOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgTVJQcyBmcm9tIHRoZSBkYXRhIGNvbGxlY3Rpb24sIHRoaXMgZ2l2ZXMgdXMKKyAgICAgICAgLy8gYSByb3VnaCBlc3RpbWF0ZSBvZiBvdXIgaW5pdGlhbCBzdGF0ZQorICAgICAgICBtYXQzM190IFI7CisgICAgICAgIHZlYzNfdCB1cChtRGF0YVswXSk7CisgICAgICAgIHZlYzNfdCBlYXN0KGNyb3NzX3Byb2R1Y3QobURhdGFbMV0sIHVwKSk7CisgICAgICAgIGVhc3QgKj0gMS9sZW5ndGgoZWFzdCk7CisgICAgICAgIHZlYzNfdCBub3J0aChjcm9zc19wcm9kdWN0KHVwLCBlYXN0KSk7CisgICAgICAgIFIgPDwgZWFzdCA8PCBub3J0aCA8PCB1cDsKKyAgICAgICAgY29uc3QgdmVjNF90IHEgPSBtYXRyaXhUb1F1YXQoUik7CisKKyAgICAgICAgaW5pdEZ1c2lvbihxLCBtR3lyb1JhdGUpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBGdXNpb246OmhhbmRsZUd5cm8oY29uc3QgdmVjM190JiB3LCBmbG9hdCBkVCkgeworICAgIGlmICghY2hlY2tJbml0Q29tcGxldGUoR1lSTywgdywgZFQpKQorICAgICAgICByZXR1cm47CisKKyAgICBwcmVkaWN0KHcsIGRUKTsKK30KKworc3RhdHVzX3QgRnVzaW9uOjpoYW5kbGVBY2MoY29uc3QgdmVjM190JiBhKSB7CisgICAgLy8gaWdub3JlIGFjY2VsZXJhdGlvbiBkYXRhIGlmIHdlJ3JlIGNsb3NlIHRvIGZyZWUtZmFsbAorICAgIGlmIChsZW5ndGgoYSkgPCBGUkVFX0ZBTExfVEhSRVNIT0xEKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgaWYgKCFjaGVja0luaXRDb21wbGV0ZShBQ0MsIGEpKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgY29uc3QgZmxvYXQgbCA9IDEvbGVuZ3RoKGEpOworICAgIHVwZGF0ZShhKmwsIEJhLCBhY2NTVERFVipsKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEZ1c2lvbjo6aGFuZGxlTWFnKGNvbnN0IHZlYzNfdCYgbSkgeworICAgIC8vIHRoZSBnZW9tYWduZXRpYy1maWVsZCBzaG91bGQgYmUgYmV0d2VlbiAzMHVUIGFuZCA2MHVUCisgICAgLy8gcmVqZWN0IG9idmlvdXNseSB3cm9uZyBtYWduZXRpYy1maWVsZHMKKyAgICBpZiAobGVuZ3RoKG0pID4gMTAwKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgaWYgKCFjaGVja0luaXRDb21wbGV0ZShNQUcsIG0pKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgY29uc3QgdmVjM190IHVwKCBnZXRSb3RhdGlvbk1hdHJpeCgpICogQmEgKTsKKyAgICBjb25zdCB2ZWMzX3QgZWFzdCggY3Jvc3NfcHJvZHVjdChtLCB1cCkgKTsKKyAgICB2ZWMzX3Qgbm9ydGgoIGNyb3NzX3Byb2R1Y3QodXAsIGVhc3QpICk7CisKKyAgICBjb25zdCBmbG9hdCBsID0gMSAvIGxlbmd0aChub3J0aCk7CisgICAgbm9ydGggKj0gbDsKKworICAgIHVwZGF0ZShub3J0aCwgQm0sIG1hZ1NUREVWKmwpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBGdXNpb246OmNoZWNrU3RhdGUoY29uc3QgdmVjM190JiB2KSB7CisgICAgaWYgKGlzbmFuZihsZW5ndGgodikpKSB7CisgICAgICAgIExPR1coIjktYXhpcyBmdXNpb24gZGl2ZXJnZWQuIHJlc2V0aW5nIHN0YXRlLiIpOworICAgICAgICBQID0gMDsKKyAgICAgICAgeDEgPSAwOworICAgICAgICBtSW5pdFN0YXRlID0gMDsKKyAgICAgICAgbUNvdW50WzBdID0gMDsKKyAgICAgICAgbUNvdW50WzFdID0gMDsKKyAgICAgICAgbUNvdW50WzJdID0gMDsKKyAgICAgICAgbURhdGEgPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2ZWM0X3QgRnVzaW9uOjpnZXRBdHRpdHVkZSgpIGNvbnN0IHsKKyAgICByZXR1cm4geDA7Cit9CisKK3ZlYzNfdCBGdXNpb246OmdldEJpYXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHgxOworfQorCittYXQzM190IEZ1c2lvbjo6Z2V0Um90YXRpb25NYXRyaXgoKSBjb25zdCB7CisgICAgcmV0dXJuIHF1YXRUb01hdHJpeCh4MCk7Cit9CisKK21hdDM0X3QgRnVzaW9uOjpnZXRGKGNvbnN0IHZlYzRfdCYgcSkgeworICAgIG1hdDM0X3QgRjsKKyAgICBGWzBdLnggPSBxLnc7ICAgRlsxXS54ID0tcS56OyAgIEZbMl0ueCA9IHEueTsKKyAgICBGWzBdLnkgPSBxLno7ICAgRlsxXS55ID0gcS53OyAgIEZbMl0ueSA9LXEueDsKKyAgICBGWzBdLnogPS1xLnk7ICAgRlsxXS56ID0gcS54OyAgIEZbMl0ueiA9IHEudzsKKyAgICBGWzBdLncgPS1xLng7ICAgRlsxXS53ID0tcS55OyAgIEZbMl0udyA9LXEuejsKKyAgICByZXR1cm4gRjsKK30KKwordm9pZCBGdXNpb246OnByZWRpY3QoY29uc3QgdmVjM190JiB3LCBmbG9hdCBkVCkgeworICAgIGNvbnN0IHZlYzRfdCBxICA9IHgwOworICAgIGNvbnN0IHZlYzNfdCBiICA9IHgxOworICAgIGNvbnN0IHZlYzNfdCB3ZSA9IHcgLSBiOworICAgIGNvbnN0IHZlYzRfdCBkcSA9IGdldEYocSkqKCgwLjVmKmRUKSp3ZSk7CisgICAgeDAgPSBub3JtYWxpemVfcXVhdChxICsgZHEpOworCisgICAgLy8gUChrKzEpID0gRipQKGspKkZ0ICsgRypRKkd0CisKKyAgICAvLyAgUGhpID0gfCBQaGkwMCBQaGkxMCB8CisgICAgLy8gICAgICAgIHwgICAwICAgICAxICAgfAorICAgIGNvbnN0IG1hdDMzX3QgSTMzKDEpOworICAgIGNvbnN0IG1hdDMzX3QgSTMzZFQoZFQpOworICAgIGNvbnN0IG1hdDMzX3Qgd3goY3Jvc3NNYXRyaXgod2UsIDApKTsKKyAgICBjb25zdCBtYXQzM190IHd4Mih3eCp3eCk7CisgICAgY29uc3QgZmxvYXQgbHdlZFQgPSBsZW5ndGgod2UpKmRUOworICAgIGNvbnN0IGZsb2F0IGlsd2UgPSAxL2xlbmd0aCh3ZSk7CisgICAgY29uc3QgZmxvYXQgazAgPSAoMS1jb3NmKGx3ZWRUKSkqKGlsd2UqaWx3ZSk7CisgICAgY29uc3QgZmxvYXQgazEgPSBzaW5mKGx3ZWRUKTsKKworICAgIFBoaVswXVswXSA9IEkzMyAtIHd4KihrMSppbHdlKSArIHd4MiprMDsKKyAgICBQaGlbMV1bMF0gPSB3eCprMCAtIEkzM2RUIC0gd3gyKihpbHdlKmlsd2UqaWx3ZSkqKGx3ZWRULWsxKTsKKworICAgIFAgPSBQaGkqUCp0cmFuc3Bvc2UoUGhpKSArIEdRR3Q7Cit9CisKK3ZvaWQgRnVzaW9uOjp1cGRhdGUoY29uc3QgdmVjM190JiB6LCBjb25zdCB2ZWMzX3QmIEJpLCBmbG9hdCBzaWdtYSkgeworICAgIHZlYzRfdCBxKHgwKTsKKyAgICAvLyBtZWFzdXJlZCB2ZWN0b3IgaW4gYm9keSBzcGFjZTogaChwKSA9IEEocCkqQmkKKyAgICBjb25zdCBtYXQzM190IEEocXVhdFRvTWF0cml4KHEpKTsKKyAgICBjb25zdCB2ZWMzX3QgQmIoQSpCaSk7CisKKyAgICAvLyBTZW5zaXRpdml0eSBtYXRyaXggSCA9IGRoKHApL2RwCisgICAgLy8gSCA9IFsgTCAwIF0KKyAgICBjb25zdCBtYXQzM190IEwoY3Jvc3NNYXRyaXgoQmIsIDApKTsKKworICAgIC8vIGdhaW4uLi4KKyAgICAvLyBLID0gUCpIdCAvIFtIKlAqSHQgKyBSXQorICAgIHZlYzxtYXQzM190LCAyPiBLOworICAgIGNvbnN0IG1hdDMzX3QgUihzaWdtYSpzaWdtYSk7CisgICAgY29uc3QgbWF0MzNfdCBTKHNjYWxlQ292YXJpYW5jZShMLCBQWzBdWzBdKSArIFIpOworICAgIGNvbnN0IG1hdDMzX3QgU2koaW52ZXJ0KFMpKTsKKyAgICBjb25zdCBtYXQzM190IEx0U2kodHJhbnNwb3NlKEwpKlNpKTsKKyAgICBLWzBdID0gUFswXVswXSAqIEx0U2k7CisgICAgS1sxXSA9IHRyYW5zcG9zZShQWzFdWzBdKSpMdFNpOworCisgICAgLy8gdXBkYXRlLi4uCisgICAgLy8gUCAtPSBLKkgqUDsKKyAgICBjb25zdCBtYXQzM190IEswTChLWzBdICogTCk7CisgICAgY29uc3QgbWF0MzNfdCBLMUwoS1sxXSAqIEwpOworICAgIFBbMF1bMF0gLT0gSzBMKlBbMF1bMF07CisgICAgUFsxXVsxXSAtPSBLMUwqUFsxXVswXTsKKyAgICBQWzFdWzBdIC09IEswTCpQWzFdWzBdOworICAgIFBbMF1bMV0gPSB0cmFuc3Bvc2UoUFsxXVswXSk7CisKKyAgICBjb25zdCB2ZWMzX3QgZSh6IC0gQmIpOworICAgIGNvbnN0IHZlYzNfdCBkcShLWzBdKmUpOworICAgIGNvbnN0IHZlYzNfdCBkYihLWzFdKmUpOworCisgICAgcSArPSBnZXRGKHEpKigwLjVmKmRxKTsKKyAgICB4MCA9IG5vcm1hbGl6ZV9xdWF0KHEpOworICAgIHgxICs9IGRiOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0Z1c2lvbi5oIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9GdXNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTY5NDRiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9GdXNpb24uaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZVU0lPTl9ICisjZGVmaW5lIEFORFJPSURfRlVTSU9OX0gKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAicXVhdC5oIgorI2luY2x1ZGUgIm1hdC5oIgorI2luY2x1ZGUgInZlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3R5cGVkZWYgbWF0PGZsb2F0LCAzLCA0PiBtYXQzNF90OworCitjbGFzcyBGdXNpb24geworICAgIC8qCisgICAgICogdGhlIHN0YXRlIHZlY3RvciBpcyBtYWRlIG9mIHR3byBzdWItdmVjdG9yIGNvbnRhaW5pbmcgcmVzcGVjdGl2ZWx5OgorICAgICAqIC0gbW9kaWZpZWQgUm9kcmlndWVzIHBhcmFtZXRlcnMKKyAgICAgKiAtIHRoZSBlc3RpbWF0ZWQgZ3lybyBiaWFzCisgICAgICovCisgICAgcXVhdF90ICB4MDsKKyAgICB2ZWMzX3QgIHgxOworCisgICAgLyoKKyAgICAgKiB0aGUgcHJlZGljYXRlZCBjb3ZhcmlhbmNlIG1hdHJpeCBpcyBtYWRlIG9mIDQgM3gzIHN1Yi1tYXRyaWNlcyBhbmQgaXQKKyAgICAgKiBzZW1pLWRlZmluaXRlIHBvc2l0aXZlLgorICAgICAqCisgICAgICogUCA9IHwgUDAwICBQMTAgfCA9IHwgUDAwICBQMTAgfAorICAgICAqICAgICB8IFAwMSAgUDExIHwgICB8IFAxMHQgUDExIHwKKyAgICAgKgorICAgICAqIFNpbmNlIFAwMSA9IHRyYW5zcG9zZShQMTApLCB0aGUgY29kZSBiZWxvdyBuZXZlciBjYWxjdWxhdGVzIG9yCisgICAgICogc3RvcmVzIFAwMS4KKyAgICAgKi8KKyAgICBtYXQ8bWF0MzNfdCwgMiwgMj4gUDsKKworICAgIC8qCisgICAgICogdGhlIHByb2Nlc3Mgbm9pc2UgY292YXJpYW5jZSBtYXRyaXgKKyAgICAgKi8KKyAgICBtYXQ8bWF0MzNfdCwgMiwgMj4gR1FHdDsKKworcHVibGljOgorICAgIEZ1c2lvbigpOworICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgaGFuZGxlR3lybyhjb25zdCB2ZWMzX3QmIHcsIGZsb2F0IGRUKTsKKyAgICBzdGF0dXNfdCBoYW5kbGVBY2MoY29uc3QgdmVjM190JiBhKTsKKyAgICBzdGF0dXNfdCBoYW5kbGVNYWcoY29uc3QgdmVjM190JiBtKTsKKyAgICB2ZWM0X3QgZ2V0QXR0aXR1ZGUoKSBjb25zdDsKKyAgICB2ZWMzX3QgZ2V0QmlhcygpIGNvbnN0OworICAgIG1hdDMzX3QgZ2V0Um90YXRpb25NYXRyaXgoKSBjb25zdDsKKyAgICBib29sIGhhc0VzdGltYXRlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgbWF0PG1hdDMzX3QsIDIsIDI+IFBoaTsKKyAgICB2ZWMzX3QgQmEsIEJtOworICAgIHVpbnQzMl90IG1Jbml0U3RhdGU7CisgICAgZmxvYXQgbUd5cm9SYXRlOworICAgIHZlYzx2ZWMzX3QsIDM+IG1EYXRhOworICAgIHNpemVfdCBtQ291bnRbM107CisgICAgZW51bSB7IEFDQz0weDEsIE1BRz0weDIsIEdZUk89MHg0IH07CisgICAgYm9vbCBjaGVja0luaXRDb21wbGV0ZShpbnQsIGNvbnN0IHZlYzNfdCYgdywgZmxvYXQgZCA9IDApOworICAgIHZvaWQgaW5pdEZ1c2lvbihjb25zdCB2ZWM0X3QmIHEwLCBmbG9hdCBkVCk7CisgICAgYm9vbCBjaGVja1N0YXRlKGNvbnN0IHZlYzNfdCYgdik7CisgICAgdm9pZCBwcmVkaWN0KGNvbnN0IHZlYzNfdCYgdywgZmxvYXQgZFQpOworICAgIHZvaWQgdXBkYXRlKGNvbnN0IHZlYzNfdCYgeiwgY29uc3QgdmVjM190JiBCaSwgZmxvYXQgc2lnbWEpOworICAgIHN0YXRpYyBtYXQzNF90IGdldEYoY29uc3QgdmVjNF90JiBwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0ZVU0lPTl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0dyYXZpdHlTZW5zb3IuY3BwIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9HcmF2aXR5U2Vuc29yLmNwcAppbmRleCA1YzZhYTk5Li5jNTc3MTVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0dyYXZpdHlTZW5zb3IuY3BwCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvR3Jhdml0eVNlbnNvci5jcHAKQEAgLTIzLDE2ICsyMywxNSBAQAogI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KIAogI2luY2x1ZGUgIkdyYXZpdHlTZW5zb3IuaCIKKyNpbmNsdWRlICJTZW5zb3JEZXZpY2UuaCIKKyNpbmNsdWRlICJTZW5zb3JGdXNpb24uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEdyYXZpdHlTZW5zb3I6OkdyYXZpdHlTZW5zb3Ioc2Vuc29yX3QgY29uc3QqIGxpc3QsIHNpemVfdCBjb3VudCkKICAgICA6IG1TZW5zb3JEZXZpY2UoU2Vuc29yRGV2aWNlOjpnZXRJbnN0YW5jZSgpKSwKLSAgICAgIG1BY2NUaW1lKDApLAotICAgICAgbUxvd1Bhc3MoTV9TUVJUMV8yLCAxLjVmKSwKLSAgICAgIG1YKG1Mb3dQYXNzKSwgbVkobUxvd1Bhc3MpLCBtWihtTG93UGFzcykKLQorICAgICAgbVNlbnNvckZ1c2lvbihTZW5zb3JGdXNpb246OmdldEluc3RhbmNlKCkpCiB7CiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBpZiAobGlzdFtpXS50eXBlID09IFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIpIHsKQEAgLTQ3LDU2ICs0Niw0NSBAQAogewogICAgIGNvbnN0IHN0YXRpYyBkb3VibGUgTlMyUyA9IDEuMCAvIDEwMDAwMDAwMDAuMDsKICAgICBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSKSB7Ci0gICAgICAgIGZsb2F0IHgsIHksIHo7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSBub3cgPSBldmVudC50aW1lc3RhbXAgKiBOUzJTOwotICAgICAgICBpZiAobUFjY1RpbWUgPT0gMCkgewotICAgICAgICAgICAgeCA9IG1YLmluaXQoZXZlbnQuYWNjZWxlcmF0aW9uLngpOwotICAgICAgICAgICAgeSA9IG1ZLmluaXQoZXZlbnQuYWNjZWxlcmF0aW9uLnkpOwotICAgICAgICAgICAgeiA9IG1aLmluaXQoZXZlbnQuYWNjZWxlcmF0aW9uLnopOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG91YmxlIGRUID0gbm93IC0gbUFjY1RpbWU7Ci0gICAgICAgICAgICBtTG93UGFzcy5zZXRTYW1wbGluZ1BlcmlvZChkVCk7Ci0gICAgICAgICAgICB4ID0gbVgoZXZlbnQuYWNjZWxlcmF0aW9uLngpOwotICAgICAgICAgICAgeSA9IG1ZKGV2ZW50LmFjY2VsZXJhdGlvbi55KTsKLSAgICAgICAgICAgIHogPSBtWihldmVudC5hY2NlbGVyYXRpb24ueik7Ci0gICAgICAgIH0KLSAgICAgICAgbUFjY1RpbWUgPSBub3c7CisgICAgICAgIHZlYzNfdCBnOworICAgICAgICBpZiAoIW1TZW5zb3JGdXNpb24uaGFzRXN0aW1hdGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY29uc3QgbWF0MzNfdCBSKG1TZW5zb3JGdXNpb24uZ2V0Um90YXRpb25NYXRyaXgoKSk7CisgICAgICAgIC8vIEZJWE1FOiB3ZSBuZWVkIHRvIGVzdGltYXRlIHRoZSBsZW5ndGggb2YgZ3Jhdml0eSBiZWNhdXNlCisgICAgICAgIC8vIHRoZSBhY2NlbGVyb21ldGVyIG1heSBoYXZlIGEgc21hbGwgc2NhbGluZyBlcnJvci4gVGhpcworICAgICAgICAvLyB0cmFuc2xhdGVzIHRvIGFuIG9mZnNldCBpbiB0aGUgbGluZWFyLWFjY2VsZXJhdGlvbiBzZW5zb3IuCisgICAgICAgIGcgPSBSWzJdICogR1JBVklUWV9FQVJUSDsKKwogICAgICAgICAqb3V0RXZlbnQgPSBldmVudDsKLSAgICAgICAgb3V0RXZlbnQtPmRhdGFbMF0gPSB4OwotICAgICAgICBvdXRFdmVudC0+ZGF0YVsxXSA9IHk7Ci0gICAgICAgIG91dEV2ZW50LT5kYXRhWzJdID0gejsKKyAgICAgICAgb3V0RXZlbnQtPmRhdGFbMF0gPSBnLng7CisgICAgICAgIG91dEV2ZW50LT5kYXRhWzFdID0gZy55OworICAgICAgICBvdXRFdmVudC0+ZGF0YVsyXSA9IGcuejsKICAgICAgICAgb3V0RXZlbnQtPnNlbnNvciA9ICdfZ3J2JzsKICAgICAgICAgb3V0RXZlbnQtPnR5cGUgPSBTRU5TT1JfVFlQRV9HUkFWSVRZOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQorCiBzdGF0dXNfdCBHcmF2aXR5U2Vuc29yOjphY3RpdmF0ZSh2b2lkKiBpZGVudCwgYm9vbCBlbmFibGVkKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVNlbnNvckRldmljZS5hY3RpdmF0ZSh0aGlzLCBtQWNjZWxlcm9tZXRlci5nZXRIYW5kbGUoKSwgZW5hYmxlZCk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgbUFjY1RpbWUgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7CisgICAgcmV0dXJuIG1TZW5zb3JGdXNpb24uYWN0aXZhdGUodGhpcywgZW5hYmxlZCk7CiB9CiAKLXN0YXR1c190IEdyYXZpdHlTZW5zb3I6OnNldERlbGF5KHZvaWQqIGlkZW50LCBpbnQgaGFuZGxlLCBpbnQ2NF90IG5zKQotewotICAgIHJldHVybiBtU2Vuc29yRGV2aWNlLnNldERlbGF5KHRoaXMsIG1BY2NlbGVyb21ldGVyLmdldEhhbmRsZSgpLCBucyk7CitzdGF0dXNfdCBHcmF2aXR5U2Vuc29yOjpzZXREZWxheSh2b2lkKiBpZGVudCwgaW50IGhhbmRsZSwgaW50NjRfdCBucykgeworICAgIHJldHVybiBtU2Vuc29yRnVzaW9uLnNldERlbGF5KHRoaXMsIG5zKTsKIH0KIAogU2Vuc29yIEdyYXZpdHlTZW5zb3I6OmdldFNlbnNvcigpIGNvbnN0IHsKICAgICBzZW5zb3JfdCBod1NlbnNvcjsKICAgICBod1NlbnNvci5uYW1lICAgICAgID0gIkdyYXZpdHkgU2Vuc29yIjsKICAgICBod1NlbnNvci52ZW5kb3IgICAgID0gIkdvb2dsZSBJbmMuIjsKLSAgICBod1NlbnNvci52ZXJzaW9uICAgID0gMTsKKyAgICBod1NlbnNvci52ZXJzaW9uICAgID0gMzsKICAgICBod1NlbnNvci5oYW5kbGUgICAgID0gJ19ncnYnOwogICAgIGh3U2Vuc29yLnR5cGUgICAgICAgPSBTRU5TT1JfVFlQRV9HUkFWSVRZOwotICAgIGh3U2Vuc29yLm1heFJhbmdlICAgPSBtQWNjZWxlcm9tZXRlci5nZXRNYXhWYWx1ZSgpOworICAgIGh3U2Vuc29yLm1heFJhbmdlICAgPSBHUkFWSVRZX0VBUlRIICogMjsKICAgICBod1NlbnNvci5yZXNvbHV0aW9uID0gbUFjY2VsZXJvbWV0ZXIuZ2V0UmVzb2x1dGlvbigpOwotICAgIGh3U2Vuc29yLnBvd2VyICAgICAgPSBtQWNjZWxlcm9tZXRlci5nZXRQb3dlclVzYWdlKCk7Ci0gICAgaHdTZW5zb3IubWluRGVsYXkgICA9IG1BY2NlbGVyb21ldGVyLmdldE1pbkRlbGF5KCk7CisgICAgaHdTZW5zb3IucG93ZXIgICAgICA9IG1TZW5zb3JGdXNpb24uZ2V0UG93ZXJVc2FnZSgpOworICAgIGh3U2Vuc29yLm1pbkRlbGF5ICAgPSBtU2Vuc29yRnVzaW9uLmdldE1pbkRlbGF5KCk7CiAgICAgU2Vuc29yIHNlbnNvcigmaHdTZW5zb3IpOwogICAgIHJldHVybiBzZW5zb3I7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0dyYXZpdHlTZW5zb3IuaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvR3Jhdml0eVNlbnNvci5oCmluZGV4IGRlY2ZiYjguLmFjMTc3YzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvR3Jhdml0eVNlbnNvci5oCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvR3Jhdml0eVNlbnNvci5oCkBAIC0yMiwyMSArMjIsMTkgQEAKIAogI2luY2x1ZGUgPGd1aS9TZW5zb3IuaD4KIAotI2luY2x1ZGUgIlNlbnNvckRldmljZS5oIgogI2luY2x1ZGUgIlNlbnNvckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlNlY29uZE9yZGVyTG93UGFzc0ZpbHRlci5oIgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitjbGFzcyBTZW5zb3JEZXZpY2U7CitjbGFzcyBTZW5zb3JGdXNpb247CisKIGNsYXNzIEdyYXZpdHlTZW5zb3IgOiBwdWJsaWMgU2Vuc29ySW50ZXJmYWNlIHsKICAgICBTZW5zb3JEZXZpY2UmIG1TZW5zb3JEZXZpY2U7CisgICAgU2Vuc29yRnVzaW9uJiBtU2Vuc29yRnVzaW9uOwogICAgIFNlbnNvciBtQWNjZWxlcm9tZXRlcjsKLSAgICBkb3VibGUgbUFjY1RpbWU7Ci0KLSAgICBTZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIgbUxvd1Bhc3M7Ci0gICAgQ2FzY2FkZWRCaXF1YWRGaWx0ZXIgbVgsIG1ZLCBtWjsKIAogcHVibGljOgogICAgIEdyYXZpdHlTZW5zb3Ioc2Vuc29yX3QgY29uc3QqIGxpc3QsIHNpemVfdCBjb3VudCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0xpbmVhckFjY2VsZXJhdGlvblNlbnNvci5jcHAgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0xpbmVhckFjY2VsZXJhdGlvblNlbnNvci5jcHAKaW5kZXggOTQyNWE5Mi4uZjAwNTRmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9MaW5lYXJBY2NlbGVyYXRpb25TZW5zb3IuY3BwCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KIAogI2luY2x1ZGUgIkxpbmVhckFjY2VsZXJhdGlvblNlbnNvci5oIgorI2luY2x1ZGUgIlNlbnNvckRldmljZS5oIgorI2luY2x1ZGUgIlNlbnNvckZ1c2lvbi5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMxLDM0ICszMywyOSBAQAogICAgIDogbVNlbnNvckRldmljZShTZW5zb3JEZXZpY2U6OmdldEluc3RhbmNlKCkpLAogICAgICAgbUdyYXZpdHlTZW5zb3IobGlzdCwgY291bnQpCiB7Ci0gICAgbURhdGFbMF0gPSBtRGF0YVsxXSA9IG1EYXRhWzJdID0gMDsKIH0KIAogYm9vbCBMaW5lYXJBY2NlbGVyYXRpb25TZW5zb3I6OnByb2Nlc3Moc2Vuc29yc19ldmVudF90KiBvdXRFdmVudCwKICAgICAgICAgY29uc3Qgc2Vuc29yc19ldmVudF90JiBldmVudCkKIHsKICAgICBib29sIHJlc3VsdCA9IG1HcmF2aXR5U2Vuc29yLnByb2Nlc3Mob3V0RXZlbnQsIGV2ZW50KTsKLSAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgIGlmIChldmVudC50eXBlID09IFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIpIHsKLSAgICAgICAgICAgIG1EYXRhWzBdID0gZXZlbnQuYWNjZWxlcmF0aW9uLng7Ci0gICAgICAgICAgICBtRGF0YVsxXSA9IGV2ZW50LmFjY2VsZXJhdGlvbi55OwotICAgICAgICAgICAgbURhdGFbMl0gPSBldmVudC5hY2NlbGVyYXRpb24uejsKLSAgICAgICAgfQotICAgICAgICBvdXRFdmVudC0+ZGF0YVswXSA9IG1EYXRhWzBdIC0gb3V0RXZlbnQtPmRhdGFbMF07Ci0gICAgICAgIG91dEV2ZW50LT5kYXRhWzFdID0gbURhdGFbMV0gLSBvdXRFdmVudC0+ZGF0YVsxXTsKLSAgICAgICAgb3V0RXZlbnQtPmRhdGFbMl0gPSBtRGF0YVsyXSAtIG91dEV2ZW50LT5kYXRhWzJdOworICAgIGlmIChyZXN1bHQgJiYgZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSKSB7CisgICAgICAgIG91dEV2ZW50LT5kYXRhWzBdID0gZXZlbnQuYWNjZWxlcmF0aW9uLnggLSBvdXRFdmVudC0+ZGF0YVswXTsKKyAgICAgICAgb3V0RXZlbnQtPmRhdGFbMV0gPSBldmVudC5hY2NlbGVyYXRpb24ueSAtIG91dEV2ZW50LT5kYXRhWzFdOworICAgICAgICBvdXRFdmVudC0+ZGF0YVsyXSA9IGV2ZW50LmFjY2VsZXJhdGlvbi56IC0gb3V0RXZlbnQtPmRhdGFbMl07CiAgICAgICAgIG91dEV2ZW50LT5zZW5zb3IgPSAnX2xpbic7CiAgICAgICAgIG91dEV2ZW50LT50eXBlID0gU0VOU09SX1RZUEVfTElORUFSX0FDQ0VMRVJBVElPTjsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0dXNfdCBMaW5lYXJBY2NlbGVyYXRpb25TZW5zb3I6OmFjdGl2YXRlKHZvaWQqIGlkZW50LCBib29sIGVuYWJsZWQpIHsKLSAgICByZXR1cm4gbUdyYXZpdHlTZW5zb3IuYWN0aXZhdGUoaWRlbnQsIGVuYWJsZWQpOworICAgIHJldHVybiBtR3Jhdml0eVNlbnNvci5hY3RpdmF0ZSh0aGlzLCBlbmFibGVkKTsKIH0KIAogc3RhdHVzX3QgTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yOjpzZXREZWxheSh2b2lkKiBpZGVudCwgaW50IGhhbmRsZSwgaW50NjRfdCBucykgewotICAgIHJldHVybiBtR3Jhdml0eVNlbnNvci5zZXREZWxheShpZGVudCwgaGFuZGxlLCBucyk7CisgICAgcmV0dXJuIG1HcmF2aXR5U2Vuc29yLnNldERlbGF5KHRoaXMsIGhhbmRsZSwgbnMpOwogfQogCiBTZW5zb3IgTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yOjpnZXRTZW5zb3IoKSBjb25zdCB7CkBAIC02Niw3ICs2Myw3IEBACiAgICAgc2Vuc29yX3QgaHdTZW5zb3I7CiAgICAgaHdTZW5zb3IubmFtZSAgICAgICA9ICJMaW5lYXIgQWNjZWxlcmF0aW9uIFNlbnNvciI7CiAgICAgaHdTZW5zb3IudmVuZG9yICAgICA9ICJHb29nbGUgSW5jLiI7Ci0gICAgaHdTZW5zb3IudmVyc2lvbiAgICA9IDE7CisgICAgaHdTZW5zb3IudmVyc2lvbiAgICA9IGdzZW5zb3IuZ2V0VmVyc2lvbigpOwogICAgIGh3U2Vuc29yLmhhbmRsZSAgICAgPSAnX2xpbic7CiAgICAgaHdTZW5zb3IudHlwZSAgICAgICA9IFNFTlNPUl9UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT047CiAgICAgaHdTZW5zb3IubWF4UmFuZ2UgICA9IGdzZW5zb3IuZ2V0TWF4VmFsdWUoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yLmggYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0xpbmVhckFjY2VsZXJhdGlvblNlbnNvci5oCmluZGV4IGM1NzcwODZhLi41ZGViMjRmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0xpbmVhckFjY2VsZXJhdGlvblNlbnNvci5oCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yLmgKQEAgLTIyLDE5ICsyMiwxOSBAQAogCiAjaW5jbHVkZSA8Z3VpL1NlbnNvci5oPgogCi0jaW5jbHVkZSAiU2Vuc29yRGV2aWNlLmgiCiAjaW5jbHVkZSAiU2Vuc29ySW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiR3Jhdml0eVNlbnNvci5oIgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK2NsYXNzIFNlbnNvckRldmljZTsKK2NsYXNzIFNlbnNvckZ1c2lvbjsKKwogY2xhc3MgTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yIDogcHVibGljIFNlbnNvckludGVyZmFjZSB7CiAgICAgU2Vuc29yRGV2aWNlJiBtU2Vuc29yRGV2aWNlOwogICAgIEdyYXZpdHlTZW5zb3IgbUdyYXZpdHlTZW5zb3I7Ci0gICAgZmxvYXQgbURhdGFbM107CiAKICAgICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzZW5zb3JzX2V2ZW50X3QqIG91dEV2ZW50LAogICAgICAgICAgICAgY29uc3Qgc2Vuc29yc19ldmVudF90JiBldmVudCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL09yaWVudGF0aW9uU2Vuc29yLmNwcCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvT3JpZW50YXRpb25TZW5zb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzN2FkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL09yaWVudGF0aW9uU2Vuc29yLmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorCisjaW5jbHVkZSAiT3JpZW50YXRpb25TZW5zb3IuaCIKKyNpbmNsdWRlICJTZW5zb3JEZXZpY2UuaCIKKyNpbmNsdWRlICJTZW5zb3JGdXNpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09yaWVudGF0aW9uU2Vuc29yOjpPcmllbnRhdGlvblNlbnNvcigpCisgICAgOiBtU2Vuc29yRGV2aWNlKFNlbnNvckRldmljZTo6Z2V0SW5zdGFuY2UoKSksCisgICAgICBtU2Vuc29yRnVzaW9uKFNlbnNvckZ1c2lvbjo6Z2V0SW5zdGFuY2UoKSkKK3sKK30KKworYm9vbCBPcmllbnRhdGlvblNlbnNvcjo6cHJvY2VzcyhzZW5zb3JzX2V2ZW50X3QqIG91dEV2ZW50LAorICAgICAgICBjb25zdCBzZW5zb3JzX2V2ZW50X3QmIGV2ZW50KQoreworICAgIGlmIChldmVudC50eXBlID09IFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIpIHsKKyAgICAgICAgaWYgKG1TZW5zb3JGdXNpb24uaGFzRXN0aW1hdGUoKSkgeworICAgICAgICAgICAgdmVjM190IGc7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByYWQyZGVnID0gMTgwIC8gTV9QSTsKKyAgICAgICAgICAgIGNvbnN0IG1hdDMzX3QgUihtU2Vuc29yRnVzaW9uLmdldFJvdGF0aW9uTWF0cml4KCkpOworICAgICAgICAgICAgZ1swXSA9IGF0YW4yZigtUlsxXVswXSwgUlswXVswXSkgICAgKiByYWQyZGVnOworICAgICAgICAgICAgZ1sxXSA9IGF0YW4yZigtUlsyXVsxXSwgUlsyXVsyXSkgICAgKiByYWQyZGVnOworICAgICAgICAgICAgZ1syXSA9IGFzaW5mICggUlsyXVswXSkgICAgICAgICAgICAgKiByYWQyZGVnOworICAgICAgICAgICAgaWYgKGdbMF0gPCAwKQorICAgICAgICAgICAgICAgIGdbMF0gKz0gMzYwOworCisgICAgICAgICAgICAqb3V0RXZlbnQgPSBldmVudDsKKyAgICAgICAgICAgIG91dEV2ZW50LT5vcmllbnRhdGlvbi5hemltdXRoID0gZy54OworICAgICAgICAgICAgb3V0RXZlbnQtPm9yaWVudGF0aW9uLnBpdGNoICAgPSBnLnk7CisgICAgICAgICAgICBvdXRFdmVudC0+b3JpZW50YXRpb24ucm9sbCAgICA9IGcuejsKKyAgICAgICAgICAgIG91dEV2ZW50LT5vcmllbnRhdGlvbi5zdGF0dXMgID0gU0VOU09SX1NUQVRVU19BQ0NVUkFDWV9ISUdIOworICAgICAgICAgICAgb3V0RXZlbnQtPnNlbnNvciA9ICdfeXByJzsKKyAgICAgICAgICAgIG91dEV2ZW50LT50eXBlID0gU0VOU09SX1RZUEVfT1JJRU5UQVRJT047CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IE9yaWVudGF0aW9uU2Vuc29yOjphY3RpdmF0ZSh2b2lkKiBpZGVudCwgYm9vbCBlbmFibGVkKSB7CisgICAgcmV0dXJuIG1TZW5zb3JGdXNpb24uYWN0aXZhdGUodGhpcywgZW5hYmxlZCk7Cit9CisKK3N0YXR1c190IE9yaWVudGF0aW9uU2Vuc29yOjpzZXREZWxheSh2b2lkKiBpZGVudCwgaW50IGhhbmRsZSwgaW50NjRfdCBucykgeworICAgIHJldHVybiBtU2Vuc29yRnVzaW9uLnNldERlbGF5KHRoaXMsIG5zKTsKK30KKworU2Vuc29yIE9yaWVudGF0aW9uU2Vuc29yOjpnZXRTZW5zb3IoKSBjb25zdCB7CisgICAgc2Vuc29yX3QgaHdTZW5zb3I7CisgICAgaHdTZW5zb3IubmFtZSAgICAgICA9ICJPcmllbnRhdGlvbiBTZW5zb3IiOworICAgIGh3U2Vuc29yLnZlbmRvciAgICAgPSAiR29vZ2xlIEluYy4iOworICAgIGh3U2Vuc29yLnZlcnNpb24gICAgPSAxOworICAgIGh3U2Vuc29yLmhhbmRsZSAgICAgPSAnX3lwcic7CisgICAgaHdTZW5zb3IudHlwZSAgICAgICA9IFNFTlNPUl9UWVBFX09SSUVOVEFUSU9OOworICAgIGh3U2Vuc29yLm1heFJhbmdlICAgPSAzNjAuMGY7CisgICAgaHdTZW5zb3IucmVzb2x1dGlvbiA9IDEuMGYvMjU2LjBmOyAvLyBGSVhNRTogcmVhbCB2YWx1ZSBoZXJlCisgICAgaHdTZW5zb3IucG93ZXIgICAgICA9IG1TZW5zb3JGdXNpb24uZ2V0UG93ZXJVc2FnZSgpOworICAgIGh3U2Vuc29yLm1pbkRlbGF5ICAgPSBtU2Vuc29yRnVzaW9uLmdldE1pbkRlbGF5KCk7CisgICAgU2Vuc29yIHNlbnNvcigmaHdTZW5zb3IpOworICAgIHJldHVybiBzZW5zb3I7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9PcmllbnRhdGlvblNlbnNvci5oIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9PcmllbnRhdGlvblNlbnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTk0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL09yaWVudGF0aW9uU2Vuc29yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9PUklFTlRBVElPTl9TRU5TT1JfSAorI2RlZmluZSBBTkRST0lEX09SSUVOVEFUSU9OX1NFTlNPUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGd1aS9TZW5zb3IuaD4KKworI2luY2x1ZGUgIlNlbnNvckludGVyZmFjZS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBTZW5zb3JEZXZpY2U7CitjbGFzcyBTZW5zb3JGdXNpb247CisKK2NsYXNzIE9yaWVudGF0aW9uU2Vuc29yIDogcHVibGljIFNlbnNvckludGVyZmFjZSB7CisgICAgU2Vuc29yRGV2aWNlJiBtU2Vuc29yRGV2aWNlOworICAgIFNlbnNvckZ1c2lvbiYgbVNlbnNvckZ1c2lvbjsKKworcHVibGljOgorICAgIE9yaWVudGF0aW9uU2Vuc29yKCk7CisgICAgdmlydHVhbCBib29sIHByb2Nlc3Moc2Vuc29yc19ldmVudF90KiBvdXRFdmVudCwKKyAgICAgICAgICAgIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCYgZXZlbnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWN0aXZhdGUodm9pZCogaWRlbnQsIGJvb2wgZW5hYmxlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZWxheSh2b2lkKiBpZGVudCwgaW50IGhhbmRsZSwgaW50NjRfdCBucyk7CisgICAgdmlydHVhbCBTZW5zb3IgZ2V0U2Vuc29yKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzVmlydHVhbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1JJRU5UQVRJT05fU0VOU09SX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvUm90YXRpb25WZWN0b3JTZW5zb3IuY3BwIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9Sb3RhdGlvblZlY3RvclNlbnNvci5jcHAKaW5kZXggM2FiZmMxMi4uNWVhOTU2OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9Sb3RhdGlvblZlY3RvclNlbnNvci5jcHAKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9Sb3RhdGlvblZlY3RvclNlbnNvci5jcHAKQEAgLTI3LDEzOSArMjcsOTkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBjbGFtcChUIHYpIHsKLSAgICByZXR1cm4gdiA8IDAgPyAwIDogdjsKLX0KLQotUm90YXRpb25WZWN0b3JTZW5zb3I6OlJvdGF0aW9uVmVjdG9yU2Vuc29yKHNlbnNvcl90IGNvbnN0KiBsaXN0LCBzaXplX3QgY291bnQpCitSb3RhdGlvblZlY3RvclNlbnNvcjo6Um90YXRpb25WZWN0b3JTZW5zb3IoKQogICAgIDogbVNlbnNvckRldmljZShTZW5zb3JEZXZpY2U6OmdldEluc3RhbmNlKCkpLAotICAgICAgbUFMb3dQYXNzKE1fU1FSVDFfMiwgMS41ZiksCi0gICAgICBtQVgobUFMb3dQYXNzKSwgbUFZKG1BTG93UGFzcyksIG1BWihtQUxvd1Bhc3MpLAotICAgICAgbU1Mb3dQYXNzKE1fU1FSVDFfMiwgMS41ZiksCi0gICAgICBtTVgobU1Mb3dQYXNzKSwgbU1ZKG1NTG93UGFzcyksIG1NWihtTUxvd1Bhc3MpCisgICAgICBtU2Vuc29yRnVzaW9uKFNlbnNvckZ1c2lvbjo6Z2V0SW5zdGFuY2UoKSkKIHsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGlmIChsaXN0W2ldLnR5cGUgPT0gU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUikgewotICAgICAgICAgICAgbUFjYyA9IFNlbnNvcihsaXN0ICsgaSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxpc3RbaV0udHlwZSA9PSBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCkgewotICAgICAgICAgICAgbU1hZyA9IFNlbnNvcihsaXN0ICsgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbWVtc2V0KG1NYWdEYXRhLCAwLCBzaXplb2YobU1hZ0RhdGEpKTsKIH0KIAogYm9vbCBSb3RhdGlvblZlY3RvclNlbnNvcjo6cHJvY2VzcyhzZW5zb3JzX2V2ZW50X3QqIG91dEV2ZW50LAogICAgICAgICBjb25zdCBzZW5zb3JzX2V2ZW50X3QmIGV2ZW50KQogewotICAgIGNvbnN0IHN0YXRpYyBkb3VibGUgTlMyUyA9IDEuMCAvIDEwMDAwMDAwMDAuMDsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCkgewotICAgICAgICBjb25zdCBkb3VibGUgbm93ID0gZXZlbnQudGltZXN0YW1wICogTlMyUzsKLSAgICAgICAgaWYgKG1NYWdUaW1lID09IDApIHsKLSAgICAgICAgICAgIG1NYWdEYXRhWzBdID0gbU1YLmluaXQoZXZlbnQubWFnbmV0aWMueCk7Ci0gICAgICAgICAgICBtTWFnRGF0YVsxXSA9IG1NWS5pbml0KGV2ZW50Lm1hZ25ldGljLnkpOwotICAgICAgICAgICAgbU1hZ0RhdGFbMl0gPSBtTVouaW5pdChldmVudC5tYWduZXRpYy56KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRvdWJsZSBkVCA9IG5vdyAtIG1NYWdUaW1lOwotICAgICAgICAgICAgbU1Mb3dQYXNzLnNldFNhbXBsaW5nUGVyaW9kKGRUKTsKLSAgICAgICAgICAgIG1NYWdEYXRhWzBdID0gbU1YKGV2ZW50Lm1hZ25ldGljLngpOwotICAgICAgICAgICAgbU1hZ0RhdGFbMV0gPSBtTVkoZXZlbnQubWFnbmV0aWMueSk7Ci0gICAgICAgICAgICBtTWFnRGF0YVsyXSA9IG1NWihldmVudC5tYWduZXRpYy56KTsKLSAgICAgICAgfQotICAgICAgICBtTWFnVGltZSA9IG5vdzsKLSAgICB9CiAgICAgaWYgKGV2ZW50LnR5cGUgPT0gU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUikgewotICAgICAgICBjb25zdCBkb3VibGUgbm93ID0gZXZlbnQudGltZXN0YW1wICogTlMyUzsKLSAgICAgICAgZmxvYXQgQXgsIEF5LCBBejsKLSAgICAgICAgaWYgKG1BY2NUaW1lID09IDApIHsKLSAgICAgICAgICAgIEF4ID0gbUFYLmluaXQoZXZlbnQuYWNjZWxlcmF0aW9uLngpOwotICAgICAgICAgICAgQXkgPSBtQVkuaW5pdChldmVudC5hY2NlbGVyYXRpb24ueSk7Ci0gICAgICAgICAgICBBeiA9IG1BWi5pbml0KGV2ZW50LmFjY2VsZXJhdGlvbi56KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRvdWJsZSBkVCA9IG5vdyAtIG1BY2NUaW1lOwotICAgICAgICAgICAgbUFMb3dQYXNzLnNldFNhbXBsaW5nUGVyaW9kKGRUKTsKLSAgICAgICAgICAgIEF4ID0gbUFYKGV2ZW50LmFjY2VsZXJhdGlvbi54KTsKLSAgICAgICAgICAgIEF5ID0gbUFZKGV2ZW50LmFjY2VsZXJhdGlvbi55KTsKLSAgICAgICAgICAgIEF6ID0gbUFaKGV2ZW50LmFjY2VsZXJhdGlvbi56KTsKKyAgICAgICAgaWYgKG1TZW5zb3JGdXNpb24uaGFzRXN0aW1hdGUoKSkgeworICAgICAgICAgICAgY29uc3QgdmVjNF90IHEobVNlbnNvckZ1c2lvbi5nZXRBdHRpdHVkZSgpKTsKKyAgICAgICAgICAgICpvdXRFdmVudCA9IGV2ZW50OworICAgICAgICAgICAgb3V0RXZlbnQtPmRhdGFbMF0gPSBxLng7CisgICAgICAgICAgICBvdXRFdmVudC0+ZGF0YVsxXSA9IHEueTsKKyAgICAgICAgICAgIG91dEV2ZW50LT5kYXRhWzJdID0gcS56OworICAgICAgICAgICAgb3V0RXZlbnQtPmRhdGFbM10gPSBxLnc7CisgICAgICAgICAgICBvdXRFdmVudC0+c2Vuc29yID0gJ19yb3YnOworICAgICAgICAgICAgb3V0RXZlbnQtPnR5cGUgPSBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1I7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBtQWNjVGltZSA9IG5vdzsKLSAgICAgICAgY29uc3QgZmxvYXQgRXggPSBtTWFnRGF0YVswXTsKLSAgICAgICAgY29uc3QgZmxvYXQgRXkgPSBtTWFnRGF0YVsxXTsKLSAgICAgICAgY29uc3QgZmxvYXQgRXogPSBtTWFnRGF0YVsyXTsKLSAgICAgICAgZmxvYXQgSHggPSBFeSpBeiAtIEV6KkF5OwotICAgICAgICBmbG9hdCBIeSA9IEV6KkF4IC0gRXgqQXo7Ci0gICAgICAgIGZsb2F0IEh6ID0gRXgqQXkgLSBFeSpBeDsKLSAgICAgICAgY29uc3QgZmxvYXQgbm9ybUggPSBzcXJ0ZihIeCpIeCArIEh5Kkh5ICsgSHoqSHopOwotICAgICAgICBpZiAobm9ybUggPCAwLjFmKSB7Ci0gICAgICAgICAgICAvLyBkZXZpY2UgaXMgY2xvc2UgdG8gZnJlZSBmYWxsIChvciBpbiBzcGFjZT8pLCBvciBjbG9zZSB0bwotICAgICAgICAgICAgLy8gbWFnbmV0aWMgbm9ydGggcG9sZS4gVHlwaWNhbCB2YWx1ZXMgYXJlICA+IDEwMC4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBmbG9hdCBpbnZIID0gMS4wZiAvIG5vcm1IOwotICAgICAgICBjb25zdCBmbG9hdCBpbnZBID0gMS4wZiAvIHNxcnRmKEF4KkF4ICsgQXkqQXkgKyBBeipBeik7Ci0gICAgICAgIEh4ICo9IGludkg7Ci0gICAgICAgIEh5ICo9IGludkg7Ci0gICAgICAgIEh6ICo9IGludkg7Ci0gICAgICAgIEF4ICo9IGludkE7Ci0gICAgICAgIEF5ICo9IGludkE7Ci0gICAgICAgIEF6ICo9IGludkE7Ci0gICAgICAgIGNvbnN0IGZsb2F0IE14ID0gQXkqSHogLSBBeipIeTsKLSAgICAgICAgY29uc3QgZmxvYXQgTXkgPSBBeipIeCAtIEF4Kkh6OwotICAgICAgICBjb25zdCBmbG9hdCBNeiA9IEF4Kkh5IC0gQXkqSHg7Ci0KLSAgICAgICAgLy8gbWF0cml4IHRvIHJvdGF0aW9uIHZlY3RvciAobm9ybWFsaXplZCBxdWF0ZXJuaW9uKQotICAgICAgICBmbG9hdCBxdyA9IHNxcnRmKCBjbGFtcCggSHggKyBNeSArIEF6ICsgMSkgKiAwLjI1ZiApOwotICAgICAgICBmbG9hdCBxeCA9IHNxcnRmKCBjbGFtcCggSHggLSBNeSAtIEF6ICsgMSkgKiAwLjI1ZiApOwotICAgICAgICBmbG9hdCBxeSA9IHNxcnRmKCBjbGFtcCgtSHggKyBNeSAtIEF6ICsgMSkgKiAwLjI1ZiApOwotICAgICAgICBmbG9hdCBxeiA9IHNxcnRmKCBjbGFtcCgtSHggLSBNeSArIEF6ICsgMSkgKiAwLjI1ZiApOwotICAgICAgICBxeCA9IGNvcHlzaWduZihxeCwgQXkgLSBNeik7Ci0gICAgICAgIHF5ID0gY29weXNpZ25mKHF5LCBIeiAtIEF4KTsKLSAgICAgICAgcXogPSBjb3B5c2lnbmYocXosIE14IC0gSHkpOwotCi0gICAgICAgIC8vIHRoaXMgcXVhdGVybmlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIG5vcm1hbGl6ZWQsIGJ5IGNvbnN0cnVjdGlvbgotICAgICAgICAvLyBvZiB0aGUgcm90YXRpb24gbWF0cml4LgotCi0gICAgICAgICpvdXRFdmVudCA9IGV2ZW50OwotICAgICAgICBvdXRFdmVudC0+ZGF0YVswXSA9IHF4OwotICAgICAgICBvdXRFdmVudC0+ZGF0YVsxXSA9IHF5OwotICAgICAgICBvdXRFdmVudC0+ZGF0YVsyXSA9IHF6OwotICAgICAgICBvdXRFdmVudC0+ZGF0YVszXSA9IHF3OwotICAgICAgICBvdXRFdmVudC0+c2Vuc29yID0gJ19yb3YnOwotICAgICAgICBvdXRFdmVudC0+dHlwZSA9IFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUjsKLSAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdHVzX3QgUm90YXRpb25WZWN0b3JTZW5zb3I6OmFjdGl2YXRlKHZvaWQqIGlkZW50LCBib29sIGVuYWJsZWQpIHsKLSAgICBtU2Vuc29yRGV2aWNlLmFjdGl2YXRlKHRoaXMsIG1BY2MuZ2V0SGFuZGxlKCksIGVuYWJsZWQpOwotICAgIG1TZW5zb3JEZXZpY2UuYWN0aXZhdGUodGhpcywgbU1hZy5nZXRIYW5kbGUoKSwgZW5hYmxlZCk7Ci0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgbU1hZ1RpbWUgPSAwOwotICAgICAgICBtQWNjVGltZSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gbVNlbnNvckZ1c2lvbi5hY3RpdmF0ZSh0aGlzLCBlbmFibGVkKTsKIH0KIAotc3RhdHVzX3QgUm90YXRpb25WZWN0b3JTZW5zb3I6OnNldERlbGF5KHZvaWQqIGlkZW50LCBpbnQgaGFuZGxlLCBpbnQ2NF90IG5zKQotewotICAgIG1TZW5zb3JEZXZpY2Uuc2V0RGVsYXkodGhpcywgbUFjYy5nZXRIYW5kbGUoKSwgbnMpOwotICAgIG1TZW5zb3JEZXZpY2Uuc2V0RGVsYXkodGhpcywgbU1hZy5nZXRIYW5kbGUoKSwgbnMpOwotICAgIHJldHVybiBOT19FUlJPUjsKK3N0YXR1c190IFJvdGF0aW9uVmVjdG9yU2Vuc29yOjpzZXREZWxheSh2b2lkKiBpZGVudCwgaW50IGhhbmRsZSwgaW50NjRfdCBucykgeworICAgIHJldHVybiBtU2Vuc29yRnVzaW9uLnNldERlbGF5KHRoaXMsIG5zKTsKIH0KIAogU2Vuc29yIFJvdGF0aW9uVmVjdG9yU2Vuc29yOjpnZXRTZW5zb3IoKSBjb25zdCB7CiAgICAgc2Vuc29yX3QgaHdTZW5zb3I7CiAgICAgaHdTZW5zb3IubmFtZSAgICAgICA9ICJSb3RhdGlvbiBWZWN0b3IgU2Vuc29yIjsKICAgICBod1NlbnNvci52ZW5kb3IgICAgID0gIkdvb2dsZSBJbmMuIjsKLSAgICBod1NlbnNvci52ZXJzaW9uICAgID0gMTsKKyAgICBod1NlbnNvci52ZXJzaW9uICAgID0gMzsKICAgICBod1NlbnNvci5oYW5kbGUgICAgID0gJ19yb3YnOwogICAgIGh3U2Vuc29yLnR5cGUgICAgICAgPSBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1I7CiAgICAgaHdTZW5zb3IubWF4UmFuZ2UgICA9IDE7CiAgICAgaHdTZW5zb3IucmVzb2x1dGlvbiA9IDEuMGYgLyAoMTw8MjQpOwotICAgIGh3U2Vuc29yLnBvd2VyICAgICAgPSBtQWNjLmdldFBvd2VyVXNhZ2UoKSArIG1NYWcuZ2V0UG93ZXJVc2FnZSgpOwotICAgIGh3U2Vuc29yLm1pbkRlbGF5ICAgPSBtQWNjLmdldE1pbkRlbGF5KCk7CisgICAgaHdTZW5zb3IucG93ZXIgICAgICA9IG1TZW5zb3JGdXNpb24uZ2V0UG93ZXJVc2FnZSgpOworICAgIGh3U2Vuc29yLm1pbkRlbGF5ICAgPSBtU2Vuc29yRnVzaW9uLmdldE1pbkRlbGF5KCk7CisgICAgU2Vuc29yIHNlbnNvcigmaHdTZW5zb3IpOworICAgIHJldHVybiBzZW5zb3I7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHeXJvRHJpZnRTZW5zb3I6Okd5cm9EcmlmdFNlbnNvcigpCisgICAgOiBtU2Vuc29yRGV2aWNlKFNlbnNvckRldmljZTo6Z2V0SW5zdGFuY2UoKSksCisgICAgICBtU2Vuc29yRnVzaW9uKFNlbnNvckZ1c2lvbjo6Z2V0SW5zdGFuY2UoKSkKK3sKK30KKworYm9vbCBHeXJvRHJpZnRTZW5zb3I6OnByb2Nlc3Moc2Vuc29yc19ldmVudF90KiBvdXRFdmVudCwKKyAgICAgICAgY29uc3Qgc2Vuc29yc19ldmVudF90JiBldmVudCkKK3sKKyAgICBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSKSB7CisgICAgICAgIGlmIChtU2Vuc29yRnVzaW9uLmhhc0VzdGltYXRlKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IHZlYzNfdCBiKG1TZW5zb3JGdXNpb24uZ2V0R3lyb0JpYXMoKSk7CisgICAgICAgICAgICAqb3V0RXZlbnQgPSBldmVudDsKKyAgICAgICAgICAgIG91dEV2ZW50LT5kYXRhWzBdID0gYi54OworICAgICAgICAgICAgb3V0RXZlbnQtPmRhdGFbMV0gPSBiLnk7CisgICAgICAgICAgICBvdXRFdmVudC0+ZGF0YVsyXSA9IGIuejsKKyAgICAgICAgICAgIG91dEV2ZW50LT5zZW5zb3IgPSAnX2dicyc7CisgICAgICAgICAgICBvdXRFdmVudC0+dHlwZSA9IFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVI7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IEd5cm9EcmlmdFNlbnNvcjo6YWN0aXZhdGUodm9pZCogaWRlbnQsIGJvb2wgZW5hYmxlZCkgeworICAgIHJldHVybiBtU2Vuc29yRnVzaW9uLmFjdGl2YXRlKHRoaXMsIGVuYWJsZWQpOworfQorCitzdGF0dXNfdCBHeXJvRHJpZnRTZW5zb3I6OnNldERlbGF5KHZvaWQqIGlkZW50LCBpbnQgaGFuZGxlLCBpbnQ2NF90IG5zKSB7CisgICAgcmV0dXJuIG1TZW5zb3JGdXNpb24uc2V0RGVsYXkodGhpcywgbnMpOworfQorCitTZW5zb3IgR3lyb0RyaWZ0U2Vuc29yOjpnZXRTZW5zb3IoKSBjb25zdCB7CisgICAgc2Vuc29yX3QgaHdTZW5zb3I7CisgICAgaHdTZW5zb3IubmFtZSAgICAgICA9ICJHeXJvc2NvcGUgQmlhcyAoZGVidWcpIjsKKyAgICBod1NlbnNvci52ZW5kb3IgICAgID0gIkdvb2dsZSBJbmMuIjsKKyAgICBod1NlbnNvci52ZXJzaW9uICAgID0gMTsKKyAgICBod1NlbnNvci5oYW5kbGUgICAgID0gJ19nYnMnOworICAgIGh3U2Vuc29yLnR5cGUgICAgICAgPSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSOworICAgIGh3U2Vuc29yLm1heFJhbmdlICAgPSAxOworICAgIGh3U2Vuc29yLnJlc29sdXRpb24gPSAxLjBmIC8gKDE8PDI0KTsKKyAgICBod1NlbnNvci5wb3dlciAgICAgID0gbVNlbnNvckZ1c2lvbi5nZXRQb3dlclVzYWdlKCk7CisgICAgaHdTZW5zb3IubWluRGVsYXkgICA9IG1TZW5zb3JGdXNpb24uZ2V0TWluRGVsYXkoKTsKICAgICBTZW5zb3Igc2Vuc29yKCZod1NlbnNvcik7CiAgICAgcmV0dXJuIHNlbnNvcjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvUm90YXRpb25WZWN0b3JTZW5zb3IuaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvUm90YXRpb25WZWN0b3JTZW5zb3IuaAppbmRleCAxNzY5OWY4Li5iYjk3ZmUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1JvdGF0aW9uVmVjdG9yU2Vuc29yLmgKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9Sb3RhdGlvblZlY3RvclNlbnNvci5oCkBAIC0yNCw3ICsyNCw5IEBACiAKICNpbmNsdWRlICJTZW5zb3JEZXZpY2UuaCIKICNpbmNsdWRlICJTZW5zb3JJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJTZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIuaCIKKworI2luY2x1ZGUgIkZ1c2lvbi5oIgorI2luY2x1ZGUgIlNlbnNvckZ1c2lvbi5oIgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTMyLDE4ICszNCwyNCBAQAogCiBjbGFzcyBSb3RhdGlvblZlY3RvclNlbnNvciA6IHB1YmxpYyBTZW5zb3JJbnRlcmZhY2UgewogICAgIFNlbnNvckRldmljZSYgbVNlbnNvckRldmljZTsKLSAgICBTZW5zb3IgbUFjYzsKLSAgICBTZW5zb3IgbU1hZzsKLSAgICBmbG9hdCBtTWFnRGF0YVszXTsKLSAgICBkb3VibGUgbUFjY1RpbWU7Ci0gICAgZG91YmxlIG1NYWdUaW1lOwotICAgIFNlY29uZE9yZGVyTG93UGFzc0ZpbHRlciBtQUxvd1Bhc3M7Ci0gICAgQ2FzY2FkZWRCaXF1YWRGaWx0ZXIgbUFYLCBtQVksIG1BWjsKLSAgICBTZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIgbU1Mb3dQYXNzOwotICAgIENhc2NhZGVkQmlxdWFkRmlsdGVyIG1NWCwgbU1ZLCBtTVo7CisgICAgU2Vuc29yRnVzaW9uJiBtU2Vuc29yRnVzaW9uOwogCiBwdWJsaWM6Ci0gICAgUm90YXRpb25WZWN0b3JTZW5zb3Ioc2Vuc29yX3QgY29uc3QqIGxpc3QsIHNpemVfdCBjb3VudCk7CisgICAgUm90YXRpb25WZWN0b3JTZW5zb3IoKTsKKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzZW5zb3JzX2V2ZW50X3QqIG91dEV2ZW50LAorICAgICAgICAgICAgY29uc3Qgc2Vuc29yc19ldmVudF90JiBldmVudCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhY3RpdmF0ZSh2b2lkKiBpZGVudCwgYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERlbGF5KHZvaWQqIGlkZW50LCBpbnQgaGFuZGxlLCBpbnQ2NF90IG5zKTsKKyAgICB2aXJ0dWFsIFNlbnNvciBnZXRTZW5zb3IoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNWaXJ0dWFsKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworY2xhc3MgR3lyb0RyaWZ0U2Vuc29yIDogcHVibGljIFNlbnNvckludGVyZmFjZSB7CisgICAgU2Vuc29yRGV2aWNlJiBtU2Vuc29yRGV2aWNlOworICAgIFNlbnNvckZ1c2lvbiYgbVNlbnNvckZ1c2lvbjsKKworcHVibGljOgorICAgIEd5cm9EcmlmdFNlbnNvcigpOwogICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHNlbnNvcnNfZXZlbnRfdCogb3V0RXZlbnQsCiAgICAgICAgICAgICBjb25zdCBzZW5zb3JzX2V2ZW50X3QmIGV2ZW50KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjdGl2YXRlKHZvaWQqIGlkZW50LCBib29sIGVuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIuY3BwIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWI2ZDFlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCi0jaW5jbHVkZSAiU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyOjpTZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIoZmxvYXQgUSwgZmxvYXQgZmMpCi0gICAgOiBpUSgxLjBmIC8gUSksIGZjKGZjKQotewotfQotCi12b2lkIFNlY29uZE9yZGVyTG93UGFzc0ZpbHRlcjo6c2V0U2FtcGxpbmdQZXJpb2QoZmxvYXQgZFQpCi17Ci0gICAgSyA9IHRhbmYoZmxvYXQoTV9QSSkgKiBmYyAqIGRUKTsKLSAgICBpRCA9IDEuMGYgLyAoSypLICsgSyppUSArIDEpOwotICAgIGEwID0gSypLKmlEOwotICAgIGExID0gMi4wZiAqIGEwOwotICAgIGIxID0gMi4wZiooSypLIC0gMSkqaUQ7Ci0gICAgYjIgPSAoSypLIC0gSyppUSArIDEpKmlEOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQmlxdWFkRmlsdGVyOjpCaXF1YWRGaWx0ZXIoY29uc3QgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyJiBzKQotICAgIDogcyhzKQotewotfQotCi1mbG9hdCBCaXF1YWRGaWx0ZXI6OmluaXQoZmxvYXQgeCkKLXsKLSAgICB4MSA9IHgyID0geDsKLSAgICB5MSA9IHkyID0geDsKLSAgICByZXR1cm4geDsKLX0KLQotZmxvYXQgQmlxdWFkRmlsdGVyOjpvcGVyYXRvcigpKGZsb2F0IHgpCi17Ci0gICAgZmxvYXQgeSA9ICh4ICsgeDIpKnMuYTAgKyB4MSpzLmExIC0geTEqcy5iMSAtIHkyKnMuYjI7Ci0gICAgeDIgPSB4MTsKLSAgICB5MiA9IHkxOwotICAgIHgxID0geDsKLSAgICB5MSA9IHk7Ci0gICAgcmV0dXJuIHk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DYXNjYWRlZEJpcXVhZEZpbHRlcjo6Q2FzY2FkZWRCaXF1YWRGaWx0ZXIoY29uc3QgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyJiBzKQotICAgIDogbUEocyksIG1CKHMpCi17Ci19Ci0KLWZsb2F0IENhc2NhZGVkQmlxdWFkRmlsdGVyOjppbml0KGZsb2F0IHgpCi17Ci0gICAgbUEuaW5pdCh4KTsKLSAgICBtQi5pbml0KHgpOwotICAgIHJldHVybiB4OwotfQotCi1mbG9hdCBDYXNjYWRlZEJpcXVhZEZpbHRlcjo6b3BlcmF0b3IoKShmbG9hdCB4KQotewotICAgIHJldHVybiBtQihtQSh4KSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyLmggYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlY29uZE9yZGVyTG93UGFzc0ZpbHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTY5OGNhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NFQ09ORF9PUkRFUl9MT1dfUEFTU19GSUxURVJfSAotI2RlZmluZSBBTkRST0lEX1NFQ09ORF9PUkRFUl9MT1dfUEFTU19GSUxURVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQmlxdWFkRmlsdGVyOwotCi0vKgotICogU3RhdGUgb2YgYSAybmQgb3JkZXIgbG93LXBhc3MgSUlSIGZpbHRlcgotICovCi1jbGFzcyBTZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIgewotICAgIGZyaWVuZCBjbGFzcyBCaXF1YWRGaWx0ZXI7Ci0gICAgZmxvYXQgaVEsIGZjOwotICAgIGZsb2F0IEssIGlEOwotICAgIGZsb2F0IGEwLCBhMTsKLSAgICBmbG9hdCBiMSwgYjI7Ci1wdWJsaWM6Ci0gICAgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyKGZsb2F0IFEsIGZsb2F0IGZjKTsKLSAgICB2b2lkIHNldFNhbXBsaW5nUGVyaW9kKGZsb2F0IGRUKTsKLX07Ci0KLS8qCi0gKiBJbXBsZW1lbnRzIGEgQmlxdWFkIElJUiBmaWx0ZXIKLSAqLwotY2xhc3MgQmlxdWFkRmlsdGVyIHsKLSAgICBmbG9hdCB4MSwgeDI7Ci0gICAgZmxvYXQgeTEsIHkyOwotICAgIGNvbnN0IFNlY29uZE9yZGVyTG93UGFzc0ZpbHRlciYgczsKLXB1YmxpYzoKLSAgICBCaXF1YWRGaWx0ZXIoY29uc3QgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyJiBzKTsKLSAgICBmbG9hdCBpbml0KGZsb2F0IGluKTsKLSAgICBmbG9hdCBvcGVyYXRvcigpKGZsb2F0IGluKTsKLX07Ci0KLS8qCi0gKiBUd28gY2FzY2FkZWQgYmlxdWFkIElJUiBmaWx0ZXJzCi0gKiAoNC1wb2xlcyBJSVIpCi0gKi8KLWNsYXNzIENhc2NhZGVkQmlxdWFkRmlsdGVyIHsKLSAgICBCaXF1YWRGaWx0ZXIgbUE7Ci0gICAgQmlxdWFkRmlsdGVyIG1COwotcHVibGljOgotICAgIENhc2NhZGVkQmlxdWFkRmlsdGVyKGNvbnN0IFNlY29uZE9yZGVyTG93UGFzc0ZpbHRlciYgcyk7Ci0gICAgZmxvYXQgaW5pdChmbG9hdCBpbik7Ci0gICAgZmxvYXQgb3BlcmF0b3IoKShmbG9hdCBpbik7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1NFQ09ORF9PUkRFUl9MT1dfUEFTU19GSUxURVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JEZXZpY2UuY3BwIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JEZXZpY2UuY3BwCmluZGV4IGYxOTI5MTMuLjM4ZDQ5OGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvckRldmljZS5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CiAKICNpbmNsdWRlICJTZW5zb3JEZXZpY2UuaCIKKyNpbmNsdWRlICJTZW5zb3JTZXJ2aWNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTY2LDE3ICsxNjcsMzIgQEAKICAgICBib29sIGFjdHVhdGVIYXJkd2FyZSA9IGZhbHNlOwogCiAgICAgSW5mbyYgaW5mbyggbUFjdGl2YXRpb25Db3VudC5lZGl0VmFsdWVGb3IoaGFuZGxlKSApOworCisKKyAgICBMT0dEX0lGKERFQlVHX0NPTk5FQ1RJT05TLAorICAgICAgICAgICAgIlNlbnNvckRldmljZTo6YWN0aXZhdGU6IGlkZW50PSVwLCBoYW5kbGU9MHglMDh4LCBlbmFibGVkPSVkLCBjb3VudD0lZCIsCisgICAgICAgICAgICBpZGVudCwgaGFuZGxlLCBlbmFibGVkLCBpbmZvLnJhdGVzLnNpemUoKSk7CisKICAgICBpZiAoZW5hYmxlZCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBMT0dEX0lGKERFQlVHX0NPTk5FQ1RJT05TLCAiLi4uIGluZGV4PSVsZCIsCisgICAgICAgICAgICAgICAgaW5mby5yYXRlcy5pbmRleE9mS2V5KGlkZW50KSk7CisKICAgICAgICAgaWYgKGluZm8ucmF0ZXMuaW5kZXhPZktleShpZGVudCkgPCAwKSB7CiAgICAgICAgICAgICBpbmZvLnJhdGVzLmFkZChpZGVudCwgREVGQVVMVF9FVkVOVFNfUEVSSU9EKTsKLSAgICAgICAgICAgIGFjdHVhdGVIYXJkd2FyZSA9IHRydWU7CisgICAgICAgICAgICBpZiAoaW5mby5yYXRlcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFjdHVhdGVIYXJkd2FyZSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBzZW5zb3Igd2FzIGFscmVhZHkgYWN0aXZhdGVkIGZvciB0aGlzIGlkZW50CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAoaW5mby5yYXRlcy5yZW1vdmVJdGVtKGlkZW50KSA+PSAwKSB7CisgICAgICAgIExPR0RfSUYoREVCVUdfQ09OTkVDVElPTlMsICIuLi4gaW5kZXg9JWxkIiwKKyAgICAgICAgICAgICAgICBpbmZvLnJhdGVzLmluZGV4T2ZLZXkoaWRlbnQpKTsKKworICAgICAgICBzc2l6ZV90IGlkeCA9IGluZm8ucmF0ZXMucmVtb3ZlSXRlbShpZGVudCk7CisgICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICAgaWYgKGluZm8ucmF0ZXMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgICAgICBhY3R1YXRlSGFyZHdhcmUgPSB0cnVlOwogICAgICAgICAgICAgfQpAQCAtMTg2LDYgKzIwMiw4IEBACiAgICAgfQogCiAgICAgaWYgKGFjdHVhdGVIYXJkd2FyZSkgeworICAgICAgICBMT0dEX0lGKERFQlVHX0NPTk5FQ1RJT05TLCAiXHQ+Pj4gYWN0dWF0aW5nIGgvdyIpOworCiAgICAgICAgIGVyciA9IG1TZW5zb3JEZXZpY2UtPmFjdGl2YXRlKG1TZW5zb3JEZXZpY2UsIGhhbmRsZSwgZW5hYmxlZCk7CiAgICAgICAgIGlmIChlbmFibGVkKSB7CiAgICAgICAgICAgICBMT0dFX0lGKGVyciwgIkVycm9yIGFjdGl2YXRpbmcgc2Vuc29yICVkICglcykiLCBoYW5kbGUsIHN0cmVycm9yKC1lcnIpKTsKQEAgLTIzMyw2ICsyNTEsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCisgICAgLy9MT0dEKCJzZXREZWxheTogaWRlbnQ9JXAsIGhhbmRsZT0lZCwgbnM9JWxsZCIsIGlkZW50LCBoYW5kbGUsIG5zKTsKKwogICAgIHJldHVybiBtU2Vuc29yRGV2aWNlLT5zZXREZWxheShtU2Vuc29yRGV2aWNlLCBoYW5kbGUsIG5zKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JGdXNpb24uY3BwIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JGdXNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzBjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvckZ1c2lvbi5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU2Vuc29yRGV2aWNlLmgiCisjaW5jbHVkZSAiU2Vuc29yRnVzaW9uLmgiCisjaW5jbHVkZSAiU2Vuc29yU2VydmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKFNlbnNvckZ1c2lvbikKKworU2Vuc29yRnVzaW9uOjpTZW5zb3JGdXNpb24oKQorICAgIDogbVNlbnNvckRldmljZShTZW5zb3JEZXZpY2U6OmdldEluc3RhbmNlKCkpLAorICAgICAgbUVuYWJsZWQoZmFsc2UpLCBtR3lyb1RpbWUoMCkKK3sKKyAgICBzZW5zb3JfdCBjb25zdCogbGlzdDsKKyAgICBzaXplX3QgY291bnQgPSBtU2Vuc29yRGV2aWNlLmdldFNlbnNvckxpc3QoJmxpc3QpOworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKKyAgICAgICAgaWYgKGxpc3RbaV0udHlwZSA9PSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSKSB7CisgICAgICAgICAgICBtQWNjID0gU2Vuc29yKGxpc3QgKyBpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdFtpXS50eXBlID09IFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEKSB7CisgICAgICAgICAgICBtTWFnID0gU2Vuc29yKGxpc3QgKyBpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdFtpXS50eXBlID09IFNFTlNPUl9UWVBFX0dZUk9TQ09QRSkgeworICAgICAgICAgICAgbUd5cm8gPSBTZW5zb3IobGlzdCArIGkpOworICAgICAgICAgICAgLy8gMjAwIEh6IGZvciBneXJvIGV2ZW50cyBpcyBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIHByZWNpc2lvbgorICAgICAgICAgICAgLy8gYW5kIHBvd2VyL2NwdSB1c2FnZS4KKyAgICAgICAgICAgIG1HeXJvUmF0ZSA9IDIwMDsKKyAgICAgICAgICAgIG1UYXJnZXREZWxheU5zID0gMTAwMDAwMDAwMExML21HeXJvUmF0ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRnVzaW9uLmluaXQoKTsKK30KKwordm9pZCBTZW5zb3JGdXNpb246OnByb2Nlc3MoY29uc3Qgc2Vuc29yc19ldmVudF90JiBldmVudCkgeworICAgIGlmIChldmVudC50eXBlID09IFNFTlNPUl9UWVBFX0dZUk9TQ09QRSkgeworICAgICAgICBpZiAobUd5cm9UaW1lICE9IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGRUID0gKGV2ZW50LnRpbWVzdGFtcCAtIG1HeXJvVGltZSkgLyAxMDAwMDAwMDAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQgZnJlcSA9IDEgLyBkVDsKKyAgICAgICAgICAgIGlmIChmcmVxID49IDEwMCAmJiBmcmVxPDEwMDApIHsgLy8gZmlsdGVyIHZhbHVlcyBvYnZpb3VzbHkgd3JvbmcKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBhbHBoYSA9IDEgLyAoMSArIGRUKTsgLy8gMXMgdGltZS1jb25zdGFudAorICAgICAgICAgICAgICAgIG1HeXJvUmF0ZSA9IGZyZXEgKyAobUd5cm9SYXRlIC0gZnJlcSkqYWxwaGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUd5cm9UaW1lID0gZXZlbnQudGltZXN0YW1wOworICAgICAgICBtRnVzaW9uLmhhbmRsZUd5cm8odmVjM190KGV2ZW50LmRhdGEpLCAxLjBmL21HeXJvUmF0ZSk7CisgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09IFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEKSB7CisgICAgICAgIGNvbnN0IHZlYzNfdCBtYWcoZXZlbnQuZGF0YSk7CisgICAgICAgIG1GdXNpb24uaGFuZGxlTWFnKG1hZyk7CisgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09IFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIpIHsKKyAgICAgICAgY29uc3QgdmVjM190IGFjYyhldmVudC5kYXRhKTsKKyAgICAgICAgbUZ1c2lvbi5oYW5kbGVBY2MoYWNjKTsKKyAgICAgICAgbUF0dGl0dWRlID0gbUZ1c2lvbi5nZXRBdHRpdHVkZSgpOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBUIG1pbihUIGEsIFQgYikgeyByZXR1cm4gYTxiID8gYSA6IGI7IH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgVCBtYXgoVCBhLCBUIGIpIHsgcmV0dXJuIGE+YiA/IGEgOiBiOyB9CisKK3N0YXR1c190IFNlbnNvckZ1c2lvbjo6YWN0aXZhdGUodm9pZCogaWRlbnQsIGJvb2wgZW5hYmxlZCkgeworCisgICAgTE9HRF9JRihERUJVR19DT05ORUNUSU9OUywKKyAgICAgICAgICAgICJTZW5zb3JGdXNpb246OmFjdGl2YXRlKGlkZW50PSVwLCBlbmFibGVkPSVkKSIsCisgICAgICAgICAgICBpZGVudCwgZW5hYmxlZCk7CisKKyAgICBjb25zdCBzc2l6ZV90IGlkeCA9IG1DbGllbnRzLmluZGV4T2YoaWRlbnQpOworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgICAgICBtQ2xpZW50cy5hZGQoaWRlbnQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgICAgICBtQ2xpZW50cy5yZW1vdmVJdGVtc0F0KGlkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU2Vuc29yRGV2aWNlLmFjdGl2YXRlKGlkZW50LCBtQWNjLmdldEhhbmRsZSgpLCBlbmFibGVkKTsKKyAgICBtU2Vuc29yRGV2aWNlLmFjdGl2YXRlKGlkZW50LCBtTWFnLmdldEhhbmRsZSgpLCBlbmFibGVkKTsKKyAgICBtU2Vuc29yRGV2aWNlLmFjdGl2YXRlKGlkZW50LCBtR3lyby5nZXRIYW5kbGUoKSwgZW5hYmxlZCk7CisKKyAgICBjb25zdCBib29sIG5ld1N0YXRlID0gbUNsaWVudHMuc2l6ZSgpICE9IDA7CisgICAgaWYgKG5ld1N0YXRlICE9IG1FbmFibGVkKSB7CisgICAgICAgIG1FbmFibGVkID0gbmV3U3RhdGU7CisgICAgICAgIGlmIChuZXdTdGF0ZSkgeworICAgICAgICAgICAgbUZ1c2lvbi5pbml0KCk7CisgICAgICAgICAgICBtR3lyb1RpbWUgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU2Vuc29yRnVzaW9uOjpzZXREZWxheSh2b2lkKiBpZGVudCwgaW50NjRfdCBucykgeworICAgIG1TZW5zb3JEZXZpY2Uuc2V0RGVsYXkoaWRlbnQsIG1BY2MuZ2V0SGFuZGxlKCksIG5zKTsKKyAgICBtU2Vuc29yRGV2aWNlLnNldERlbGF5KGlkZW50LCBtTWFnLmdldEhhbmRsZSgpLCBtczJucygyMCkpOworICAgIG1TZW5zb3JEZXZpY2Uuc2V0RGVsYXkoaWRlbnQsIG1HeXJvLmdldEhhbmRsZSgpLCBtVGFyZ2V0RGVsYXlOcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK2Zsb2F0IFNlbnNvckZ1c2lvbjo6Z2V0UG93ZXJVc2FnZSgpIGNvbnN0IHsKKyAgICBmbG9hdCBwb3dlciA9ICAgbUFjYy5nZXRQb3dlclVzYWdlKCkgKworICAgICAgICAgICAgICAgICAgICBtTWFnLmdldFBvd2VyVXNhZ2UoKSArCisgICAgICAgICAgICAgICAgICAgIG1HeXJvLmdldFBvd2VyVXNhZ2UoKTsKKyAgICByZXR1cm4gcG93ZXI7Cit9CisKK2ludDMyX3QgU2Vuc29yRnVzaW9uOjpnZXRNaW5EZWxheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFjYy5nZXRNaW5EZWxheSgpOworfQorCit2b2lkIFNlbnNvckZ1c2lvbjo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIHsKKyAgICBjb25zdCBGdXNpb24mIGZ1c2lvbihtRnVzaW9uKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICI5LWF4aXMgZnVzaW9uICVzICglZCBjbGllbnRzKSwgZ3lyby1yYXRlPSU3LjJmSHosICIKKyAgICAgICAgICAgICJxPTwgJWcsICVnLCAlZywgJWcgPiAoJWcpLCAiCisgICAgICAgICAgICAiYj08ICVnLCAlZywgJWcgPlxuIiwKKyAgICAgICAgICAgIG1FbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKKyAgICAgICAgICAgIG1DbGllbnRzLnNpemUoKSwKKyAgICAgICAgICAgIG1HeXJvUmF0ZSwKKyAgICAgICAgICAgIGZ1c2lvbi5nZXRBdHRpdHVkZSgpLngsCisgICAgICAgICAgICBmdXNpb24uZ2V0QXR0aXR1ZGUoKS55LAorICAgICAgICAgICAgZnVzaW9uLmdldEF0dGl0dWRlKCkueiwKKyAgICAgICAgICAgIGZ1c2lvbi5nZXRBdHRpdHVkZSgpLncsCisgICAgICAgICAgICBsZW5ndGgoZnVzaW9uLmdldEF0dGl0dWRlKCkpLAorICAgICAgICAgICAgZnVzaW9uLmdldEJpYXMoKS54LAorICAgICAgICAgICAgZnVzaW9uLmdldEJpYXMoKS55LAorICAgICAgICAgICAgZnVzaW9uLmdldEJpYXMoKS56KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yRnVzaW9uLmggYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvckZ1c2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTliY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvckZ1c2lvbi5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SX0ZVU0lPTl9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SX0ZVU0lPTl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPGd1aS9TZW5zb3IuaD4KKworI2luY2x1ZGUgIkZ1c2lvbi5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFNlbnNvckRldmljZTsKKworY2xhc3MgU2Vuc29yRnVzaW9uIDogcHVibGljIFNpbmdsZXRvbjxTZW5zb3JGdXNpb24+IHsKKyAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPFNlbnNvckZ1c2lvbj47CisKKyAgICBTZW5zb3JEZXZpY2UmIG1TZW5zb3JEZXZpY2U7CisgICAgU2Vuc29yIG1BY2M7CisgICAgU2Vuc29yIG1NYWc7CisgICAgU2Vuc29yIG1HeXJvOworICAgIEZ1c2lvbiBtRnVzaW9uOworICAgIGJvb2wgbUVuYWJsZWQ7CisgICAgZmxvYXQgbUd5cm9SYXRlOworICAgIG5zZWNzX3QgbVRhcmdldERlbGF5TnM7CisgICAgbnNlY3NfdCBtR3lyb1RpbWU7CisgICAgdmVjNF90IG1BdHRpdHVkZTsKKyAgICBTb3J0ZWRWZWN0b3I8dm9pZCo+IG1DbGllbnRzOworCisgICAgU2Vuc29yRnVzaW9uKCk7CisKK3B1YmxpYzoKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgc2Vuc29yc19ldmVudF90JiBldmVudCk7CisKKyAgICBib29sIGlzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1FbmFibGVkOyB9CisgICAgYm9vbCBoYXNFc3RpbWF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1GdXNpb24uaGFzRXN0aW1hdGUoKTsgfQorICAgIG1hdDMzX3QgZ2V0Um90YXRpb25NYXRyaXgoKSBjb25zdCB7IHJldHVybiBtRnVzaW9uLmdldFJvdGF0aW9uTWF0cml4KCk7IH0KKyAgICB2ZWM0X3QgZ2V0QXR0aXR1ZGUoKSBjb25zdCB7IHJldHVybiBtQXR0aXR1ZGU7IH0KKyAgICB2ZWMzX3QgZ2V0R3lyb0JpYXMoKSBjb25zdCB7IHJldHVybiBtRnVzaW9uLmdldEJpYXMoKTsgfQorICAgIGZsb2F0IGdldEVzdGltYXRlZFJhdGUoKSBjb25zdCB7IHJldHVybiBtR3lyb1JhdGU7IH0KKworICAgIHN0YXR1c190IGFjdGl2YXRlKHZvaWQqIGlkZW50LCBib29sIGVuYWJsZWQpOworICAgIHN0YXR1c190IHNldERlbGF5KHZvaWQqIGlkZW50LCBpbnQ2NF90IG5zKTsKKworICAgIGZsb2F0IGdldFBvd2VyVXNhZ2UoKSBjb25zdDsKKyAgICBpbnQzMl90IGdldE1pbkRlbGF5KCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKTsKK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JfRlVTSU9OX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29ySW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvckludGVyZmFjZS5oCmluZGV4IDA4NGYyZjUuLmZiMzU3ZDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29ySW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JJbnRlcmZhY2UuaApAQCAtMjAsOCArMjAsNiBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+Ci0KICNpbmNsdWRlIDxndWkvU2Vuc29yLmg+CiAKICNpbmNsdWRlICJTZW5zb3JEZXZpY2UuaCIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvclNlcnZpY2UuY3BwCmluZGV4IGM1ZTY5ZmYuLmQxYjEwZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JTZXJ2aWNlLmNwcApAQCAtMTgsNiArMTgsOCBAQAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTM1LDE0ICszNywyNyBAQAogCiAjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgogCi0jaW5jbHVkZSAiU2Vuc29yU2VydmljZS5oIgorI2luY2x1ZGUgIkNvcnJlY3RlZEd5cm9TZW5zb3IuaCIKICNpbmNsdWRlICJHcmF2aXR5U2Vuc29yLmgiCiAjaW5jbHVkZSAiTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yLmgiCisjaW5jbHVkZSAiT3JpZW50YXRpb25TZW5zb3IuaCIKICNpbmNsdWRlICJSb3RhdGlvblZlY3RvclNlbnNvci5oIgorI2luY2x1ZGUgIlNlbnNvckZ1c2lvbi5oIgorI2luY2x1ZGUgIlNlbnNvclNlcnZpY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKy8qCisgKiBOb3RlczoKKyAqCisgKiAtIHdoYXQgYWJvdXQgYSBneXJvLWNvcnJlY3RlZCBtYWduZXRpYy1maWVsZCBzZW5zb3I/CisgKiAtIG9wdGlvbiB0byAiaGlkZSIgdGhlIEhBTCBzZW5zb3JzCisgKiAtIHJ1biBtYWcgc2Vuc29yIGZyb20gdGltZSB0byB0aW1lIHRvIGZvcmNlIGNhbGlicmF0aW9uCisgKiAtIGdyYXZpdHkgc2Vuc29yIGxlbmd0aCBpcyB3cm9uZyAoPT4gZHJpZnQgaW4gbGluZWFyLWFjYyBzZW5zb3IpCisgKgorICovCisKIFNlbnNvclNlcnZpY2U6OlNlbnNvclNlcnZpY2UoKQogICAgIDogbUR1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIiksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpCkBAIC01Niw2ICs3MSw3IEBACiAgICAgU2Vuc29yRGV2aWNlJiBkZXYoU2Vuc29yRGV2aWNlOjpnZXRJbnN0YW5jZSgpKTsKIAogICAgIGlmIChkZXYuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgYm9vbCBoYXNHeXJvID0gZmFsc2U7CiAgICAgICAgIHVpbnQzMl90IHZpcnR1YWxTZW5zb3JzTmVlZHMgPQogICAgICAgICAgICAgICAgICgxPDxTRU5TT1JfVFlQRV9HUkFWSVRZKSB8CiAgICAgICAgICAgICAgICAgKDE8PFNFTlNPUl9UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04pIHwKQEAgLTY2LDYgKzgyLDkgQEAKICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICAgICAgcmVnaXN0ZXJTZW5zb3IoIG5ldyBIYXJkd2FyZVNlbnNvcihsaXN0W2ldKSApOwogICAgICAgICAgICAgc3dpdGNoIChsaXN0W2ldLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX0dZUk9TQ09QRToKKyAgICAgICAgICAgICAgICAgICAgaGFzR3lybyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VOU09SX1RZUEVfR1JBVklUWToKICAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT046CiAgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1I6CkBAIC03NCwxNCArOTMsMzEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICh2aXJ0dWFsU2Vuc29yc05lZWRzICYgKDE8PFNFTlNPUl9UWVBFX0dSQVZJVFkpKSB7CisgICAgICAgIC8vIGl0J3Mgc2FmZSB0byBpbnN0YW50aWF0ZSB0aGUgU2Vuc29yRnVzaW9uIG9iamVjdCBoZXJlCisgICAgICAgIC8vIChpdCB3YW50cyB0byBiZSBpbnN0YW50aWF0ZWQgYWZ0ZXIgaC93IHNlbnNvcnMgaGF2ZSBiZWVuCisgICAgICAgIC8vIHJlZ2lzdGVyZWQpCisgICAgICAgIGNvbnN0IFNlbnNvckZ1c2lvbiYgZnVzaW9uKFNlbnNvckZ1c2lvbjo6Z2V0SW5zdGFuY2UoKSk7CisKKyAgICAgICAgaWYgKGhhc0d5cm8pIHsKKyAgICAgICAgICAgIC8vIEFsd2F5cyBpbnN0YW50aWF0ZSBBbmRyb2lkJ3MgdmlydHVhbCBzZW5zb3JzLiBTaW5jZSB0aGV5IGFyZQorICAgICAgICAgICAgLy8gaW5zdGFudGlhdGVkIGJlaGluZCBzZW5zb3JzIGZyb20gdGhlIEhBTCwgdGhleSB3b24ndAorICAgICAgICAgICAgLy8gaW50ZXJmZXJlIHdpdGggYXBwbGljYXRpb25zLCB1bmxlc3MgdGhleSBsb29rcyBzcGVjaWZpY2FsbHkKKyAgICAgICAgICAgIC8vIGZvciB0aGVtIChieSBuYW1lKS4KKworICAgICAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsU2Vuc29yKCBuZXcgUm90YXRpb25WZWN0b3JTZW5zb3IoKSApOwogICAgICAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsU2Vuc29yKCBuZXcgR3Jhdml0eVNlbnNvcihsaXN0LCBjb3VudCkgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmlydHVhbFNlbnNvcnNOZWVkcyAmICgxPDxTRU5TT1JfVFlQRV9MSU5FQVJfQUNDRUxFUkFUSU9OKSkgewogICAgICAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsU2Vuc29yKCBuZXcgTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yKGxpc3QsIGNvdW50KSApOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2aXJ0dWFsU2Vuc29yc05lZWRzICYgKDE8PFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUikpIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyVmlydHVhbFNlbnNvciggbmV3IFJvdGF0aW9uVmVjdG9yU2Vuc29yKGxpc3QsIGNvdW50KSApOworCisgICAgICAgICAgICAvLyB0aGVzZSBhcmUgb3B0aW9uYWwKKyAgICAgICAgICAgIHJlZ2lzdGVyVmlydHVhbFNlbnNvciggbmV3IE9yaWVudGF0aW9uU2Vuc29yKCkgKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyVmlydHVhbFNlbnNvciggbmV3IENvcnJlY3RlZEd5cm9TZW5zb3IobGlzdCwgY291bnQpICk7CisKKyAgICAgICAgICAgIC8vIHZpcnR1YWwgZGVidWdnaW5nIHNlbnNvcnMuLi4KKyAgICAgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgICAgIHByb3BlcnR5X2dldCgiZGVidWcuc2Vuc29ycyIsIHZhbHVlLCAiMCIpOworICAgICAgICAgICAgaWYgKGF0b2kodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsU2Vuc29yKCBuZXcgR3lyb0RyaWZ0U2Vuc29yKCkgKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJ1bigiU2Vuc29yU2VydmljZSIsIFBSSU9SSVRZX1VSR0VOVF9ESVNQTEFZKTsKQEAgLTEzMyw3ICsxNjksOSBAQAogICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPG1TZW5zb3JMaXN0LnNpemUoKSA7IGkrKykgewogICAgICAgICAgICAgY29uc3QgU2Vuc29yJiBzKG1TZW5zb3JMaXN0W2ldKTsKICAgICAgICAgICAgIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCYgZShtTGFzdEV2ZW50U2Vlbi52YWx1ZUZvcihzLmdldEhhbmRsZSgpKSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlLTQ4c3wgJS0zMnMgfCAweCUwOHggfCBtYXhSYXRlPSU3LjJmSHogfCBsYXN0PTwlNS4xZiwlNS4xZiwlNS4xZj5cbiIsCisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCisgICAgICAgICAgICAgICAgICAgICIlLTQ4c3wgJS0zMnMgfCAweCUwOHggfCBtYXhSYXRlPSU3LjJmSHogfCAiCisgICAgICAgICAgICAgICAgICAgICJsYXN0PTwlNS4xZiwlNS4xZiwlNS4xZj5cbiIsCiAgICAgICAgICAgICAgICAgICAgIHMuZ2V0TmFtZSgpLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICBzLmdldFZlbmRvcigpLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICBzLmdldEhhbmRsZSgpLApAQCAtMTQxLDYgKzE3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGUuZGF0YVswXSwgZS5kYXRhWzFdLCBlLmRhdGFbMl0pOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgICAgICB9CisgICAgICAgIFNlbnNvckZ1c2lvbjo6Z2V0SW5zdGFuY2UoKS5kdW1wKHJlc3VsdCwgYnVmZmVyLCBTSVpFKTsKICAgICAgICAgU2Vuc29yRGV2aWNlOjpnZXRJbnN0YW5jZSgpLmR1bXAocmVzdWx0LCBidWZmZXIsIFNJWkUpOwogCiAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVkIGFjdGl2ZSBjb25uZWN0aW9uc1xuIiwKQEAgLTE4MywxMyArMjIyLDE5IEBACiAKICAgICAgICAgLy8gaGFuZGxlIHZpcnR1YWwgc2Vuc29ycwogICAgICAgICBpZiAoY291bnQgJiYgdmNvdW50KSB7CisgICAgICAgICAgICBzZW5zb3JzX2V2ZW50X3QgY29uc3QgKiBjb25zdCBldmVudCA9IGJ1ZmZlcjsKICAgICAgICAgICAgIGNvbnN0IERlZmF1bHRLZXllZFZlY3RvcjxpbnQsIFNlbnNvckludGVyZmFjZSo+IHZpcnR1YWxTZW5zb3JzKAogICAgICAgICAgICAgICAgICAgICBnZXRBY3RpdmVWaXJ0dWFsU2Vuc29ycygpKTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhY3RpdmVWaXJ0dWFsU2Vuc29yQ291bnQgPSB2aXJ0dWFsU2Vuc29ycy5zaXplKCk7CiAgICAgICAgICAgICBpZiAoYWN0aXZlVmlydHVhbFNlbnNvckNvdW50KSB7CiAgICAgICAgICAgICAgICAgc2l6ZV90IGsgPSAwOworICAgICAgICAgICAgICAgIFNlbnNvckZ1c2lvbiYgZnVzaW9uKFNlbnNvckZ1c2lvbjo6Z2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgICAgICAgaWYgKGZ1c2lvbi5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPHNpemVfdChjb3VudCkgOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1c2lvbi5wcm9jZXNzKGV2ZW50W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPHNpemVfdChjb3VudCkgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vuc29yc19ldmVudF90IGNvbnN0ICogY29uc3QgZXZlbnQgPSBidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGo9MCA7IGo8YWN0aXZlVmlydHVhbFNlbnNvckNvdW50IDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zb3JzX2V2ZW50X3Qgb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpcnR1YWxTZW5zb3JzLnZhbHVlQXQoaiktPnByb2Nlc3MoJm91dCwgZXZlbnRbaV0pKSB7CkBAIC0yOTcsMTYgKzM0MiwyNSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgY29uc3Qgd3A8U2Vuc29yRXZlbnRDb25uZWN0aW9uPiBjb25uZWN0aW9uKGMpOwogICAgIHNpemVfdCBzaXplID0gbUFjdGl2ZVNlbnNvcnMuc2l6ZSgpOworICAgIExPR0RfSUYoREVCVUdfQ09OTkVDVElPTlMsICIlZCBhY3RpdmUgc2Vuc29ycyIsIHNpemUpOwogICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8c2l6ZSA7ICkgewogICAgICAgICBpbnQgaGFuZGxlID0gbUFjdGl2ZVNlbnNvcnMua2V5QXQoaSk7CiAgICAgICAgIGlmIChjLT5oYXNTZW5zb3IoaGFuZGxlKSkgeworICAgICAgICAgICAgTE9HRF9JRihERUJVR19DT05ORUNUSU9OUywgIiVpOiBkaXNhYmxpbmcgaGFuZGxlPTB4JTA4eCIsIGksIGhhbmRsZSk7CiAgICAgICAgICAgICBTZW5zb3JJbnRlcmZhY2UqIHNlbnNvciA9IG1TZW5zb3JNYXAudmFsdWVGb3IoIGhhbmRsZSApOworICAgICAgICAgICAgTE9HRV9JRighc2Vuc29yLCAibVNlbnNvck1hcFtoYW5kbGU9MHglMDh4XSBpcyBudWxsISIsIGhhbmRsZSk7CiAgICAgICAgICAgICBpZiAoc2Vuc29yKSB7CiAgICAgICAgICAgICAgICAgc2Vuc29yLT5hY3RpdmF0ZShjLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgU2Vuc29yUmVjb3JkKiByZWMgPSBtQWN0aXZlU2Vuc29ycy52YWx1ZUF0KGkpOworICAgICAgICBMT0dFX0lGKCFyZWMsICJtQWN0aXZlU2Vuc29yc1slZF0gaXMgbnVsbCAoaGFuZGxlPTB4JTA4eCkhIiwgaSwgaGFuZGxlKTsKKyAgICAgICAgTE9HRF9JRihERUJVR19DT05ORUNUSU9OUywKKyAgICAgICAgICAgICAgICAicmVtb3ZpbmcgY29ubmVjdGlvbiAlcCBmb3Igc2Vuc29yWyVkXS5oYW5kbGU9MHglMDh4IiwKKyAgICAgICAgICAgICAgICBjLCBpLCBoYW5kbGUpOworCiAgICAgICAgIGlmIChyZWMgJiYgcmVjLT5yZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb24pKSB7CisgICAgICAgICAgICBMT0dEX0lGKERFQlVHX0NPTk5FQ1RJT05TLCAiLi4uIGFuZCBpdCB3YXMgdGhlIGxhc3QgY29ubmVjdGlvbiIpOwogICAgICAgICAgICAgbUFjdGl2ZVNlbnNvcnMucmVtb3ZlSXRlbXNBdChpLCAxKTsKICAgICAgICAgICAgIG1BY3RpdmVWaXJ0dWFsU2Vuc29ycy5yZW1vdmVJdGVtKGhhbmRsZSk7CiAgICAgICAgICAgICBkZWxldGUgcmVjOwpAQCAtNDQ2LDYgKzUwMCw3IEBACiAKIFNlbnNvclNlcnZpY2U6OlNlbnNvckV2ZW50Q29ubmVjdGlvbjo6flNlbnNvckV2ZW50Q29ubmVjdGlvbigpCiB7CisgICAgTE9HRF9JRihERUJVR19DT05ORUNUSU9OUywgIn5TZW5zb3JFdmVudENvbm5lY3Rpb24oJXApIiwgdGhpcyk7CiAgICAgbVNlcnZpY2UtPmNsZWFudXBDb25uZWN0aW9uKHRoaXMpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvclNlcnZpY2UuaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5oCmluZGV4IDIxZjEyYmQuLjc3YTdlMzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5oCkBAIC0zOCw2ICszOCw4IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisjZGVmaW5lIERFQlVHX0NPTk5FQ1RJT05TICAgZmFsc2UKKwogc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfdDsKIHN0cnVjdCBzZW5zb3JzX21vZHVsZV90OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL21hdC5oIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9tYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzAyY2EzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9tYXQuaApAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NQVRfSAorI2RlZmluZSBBTkRST0lEX01BVF9ICisKKyNpbmNsdWRlICJ2ZWMuaCIKKyNpbmNsdWRlICJ0cmFpdHMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRSwgc2l6ZV90IEMsIHNpemVfdCBSPgorY2xhc3MgbWF0OworCituYW1lc3BhY2UgaGVscGVycyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUWVBFLCBzaXplX3QgQywgc2l6ZV90IFI+CittYXQ8VFlQRSwgQywgUj4mIGRvQXNzaWduKAorICAgICAgICBtYXQ8VFlQRSwgQywgUj4mIGxocywKKyAgICAgICAgdHlwZW5hbWUgVHlwZVRyYWl0czxUWVBFPjo6UGFyYW1ldGVyVHlwZSByaHMpIHsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPEMgOyBpKyspCisgICAgICAgIGZvciAoc2l6ZV90IGo9MCA7IGo8UiA7IGorKykKKyAgICAgICAgICAgIGxoc1tpXVtqXSA9IChpPT1qKSA/IHJocyA6IDA7CisgICAgcmV0dXJuIGxoczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEUsIHNpemVfdCBDLCBzaXplX3QgUiwgc2l6ZV90IEQ+CittYXQ8VFlQRSwgQywgUj4gUFVSRSBkb011bCgKKyAgICAgICAgY29uc3QgbWF0PFRZUEUsIEQsIFI+JiBsaHMsCisgICAgICAgIGNvbnN0IG1hdDxUWVBFLCBDLCBEPiYgcmhzKQoreworICAgIG1hdDxUWVBFLCBDLCBSPiByZXM7CisgICAgZm9yIChzaXplX3QgYz0wIDsgYzxDIDsgYysrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IHI9MCA7IHI8UiA7IHIrKykgeworICAgICAgICAgICAgVFlQRSB2KDApOworICAgICAgICAgICAgZm9yIChzaXplX3Qgaz0wIDsgazxEIDsgaysrKSB7CisgICAgICAgICAgICAgICAgdiArPSBsaHNba11bcl0gKiByaHNbY11ba107CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNbY11bcl0gPSB2OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUWVBFLCBzaXplX3QgUiwgc2l6ZV90IEQ+Cit2ZWM8VFlQRSwgUj4gUFVSRSBkb011bCgKKyAgICAgICAgY29uc3QgbWF0PFRZUEUsIEQsIFI+JiBsaHMsCisgICAgICAgIGNvbnN0IHZlYzxUWVBFLCBEPiYgcmhzKQoreworICAgIHZlYzxUWVBFLCBSPiByZXM7CisgICAgZm9yIChzaXplX3Qgcj0wIDsgcjxSIDsgcisrKSB7CisgICAgICAgIFRZUEUgdigwKTsKKyAgICAgICAgZm9yIChzaXplX3Qgaz0wIDsgazxEIDsgaysrKSB7CisgICAgICAgICAgICB2ICs9IGxoc1trXVtyXSAqIHJoc1trXTsKKyAgICAgICAgfQorICAgICAgICByZXNbcl0gPSB2OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRSwgc2l6ZV90IEMsIHNpemVfdCBSPgorbWF0PFRZUEUsIEMsIFI+IFBVUkUgZG9NdWwoCisgICAgICAgIGNvbnN0IHZlYzxUWVBFLCBSPiYgbGhzLAorICAgICAgICBjb25zdCBtYXQ8VFlQRSwgQywgMT4mIHJocykKK3sKKyAgICBtYXQ8VFlQRSwgQywgUj4gcmVzOworICAgIGZvciAoc2l6ZV90IGM9MCA7IGM8QyA7IGMrKykgeworICAgICAgICBmb3IgKHNpemVfdCByPTAgOyByPFIgOyByKyspIHsKKyAgICAgICAgICAgIHJlc1tjXVtyXSA9IGxoc1tyXSAqIHJoc1tjXVswXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRSwgc2l6ZV90IEMsIHNpemVfdCBSPgorbWF0PFRZUEUsIEMsIFI+IFBVUkUgZG9NdWwoCisgICAgICAgIGNvbnN0IG1hdDxUWVBFLCBDLCBSPiYgcmhzLAorICAgICAgICB0eXBlbmFtZSBUeXBlVHJhaXRzPFRZUEU+OjpQYXJhbWV0ZXJUeXBlIHYpCit7CisgICAgbWF0PFRZUEUsIEMsIFI+IHJlczsKKyAgICBmb3IgKHNpemVfdCBjPTAgOyBjPEMgOyBjKyspIHsKKyAgICAgICAgZm9yIChzaXplX3Qgcj0wIDsgcjxSIDsgcisrKSB7CisgICAgICAgICAgICByZXNbY11bcl0gPSByaHNbY11bcl0gKiB2OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUWVBFLCBzaXplX3QgQywgc2l6ZV90IFI+CittYXQ8VFlQRSwgQywgUj4gUFVSRSBkb011bCgKKyAgICAgICAgdHlwZW5hbWUgVHlwZVRyYWl0czxUWVBFPjo6UGFyYW1ldGVyVHlwZSB2LAorICAgICAgICBjb25zdCBtYXQ8VFlQRSwgQywgUj4mIHJocykKK3sKKyAgICBtYXQ8VFlQRSwgQywgUj4gcmVzOworICAgIGZvciAoc2l6ZV90IGM9MCA7IGM8QyA7IGMrKykgeworICAgICAgICBmb3IgKHNpemVfdCByPTAgOyByPFIgOyByKyspIHsKKyAgICAgICAgICAgIHJlc1tjXVtyXSA9IHYgKiByaHNbY11bcl07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworCit9OyAvLyBuYW1lc3BhY2UgaGVscGVycworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRSwgc2l6ZV90IEMsIHNpemVfdCBSPgorY2xhc3MgbWF0IDogcHVibGljIHZlYzwgdmVjPFRZUEUsIFI+LCBDID4geworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZVRyYWl0czxUWVBFPjo6UGFyYW1ldGVyVHlwZSBwVFlQRTsKKyAgICB0eXBlZGVmIHZlYzwgdmVjPFRZUEUsIFI+LCBDID4gYmFzZTsKK3B1YmxpYzoKKyAgICAvLyBTVEwtbGlrZSBpbnRlcmZhY2UuCisgICAgdHlwZWRlZiBUWVBFIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBUWVBFJiByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBUWVBFIGNvbnN0JiBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gUipDOyB9CisgICAgZW51bSB7IFJPV1MgPSBSLCBDT0xTID0gQyB9OworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGRlZmF1bHQgY29uc3RydWN0b3JzCisKKyAgICBtYXQoKSB7IH0KKyAgICBtYXQoY29uc3QgbWF0JiByaHMpICA6IGJhc2UocmhzKSB7IH0KKyAgICBtYXQoY29uc3QgYmFzZSYgcmhzKSA6IGJhc2UocmhzKSB7IH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gY29udmVyc2lvbiBjb25zdHJ1Y3RvcnMKKworICAgIC8vIHNldHMgdGhlIGRpYWdvbmFsIHRvIHRoZSB2YWx1ZSwgb2ZmLWRpYWdvbmFsIHRvIHplcm8KKyAgICBtYXQocFRZUEUgcmhzKSB7CisgICAgICAgIGhlbHBlcnM6OmRvQXNzaWduKCp0aGlzLCByaHMpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQXNzaWdubWVudAorCisgICAgbWF0JiBvcGVyYXRvcj0oY29uc3QgbWF0JiByaHMpIHsKKyAgICAgICAgYmFzZTo6b3BlcmF0b3I9KHJocyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBtYXQmIG9wZXJhdG9yPShjb25zdCBiYXNlJiByaHMpIHsKKyAgICAgICAgYmFzZTo6b3BlcmF0b3I9KHJocyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBtYXQmIG9wZXJhdG9yPShwVFlQRSByaHMpIHsKKyAgICAgICAgcmV0dXJuIGhlbHBlcnM6OmRvQXNzaWduKCp0aGlzLCByaHMpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gbm9uLW1lbWJlciBmdW5jdGlvbiBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbgorCisgICAgZnJpZW5kIGlubGluZSBtYXQgUFVSRSBvcGVyYXRvciArIChjb25zdCBtYXQmIGxocywgY29uc3QgbWF0JiByaHMpIHsKKyAgICAgICAgcmV0dXJuIGhlbHBlcnM6OmRvQWRkKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGJhc2UmPihsaHMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGJhc2UmPihyaHMpKTsKKyAgICB9CisgICAgZnJpZW5kIGlubGluZSBtYXQgUFVSRSBvcGVyYXRvciAtIChjb25zdCBtYXQmIGxocywgY29uc3QgbWF0JiByaHMpIHsKKyAgICAgICAgcmV0dXJuIGhlbHBlcnM6OmRvU3ViKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGJhc2UmPihsaHMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGJhc2UmPihyaHMpKTsKKyAgICB9CisKKyAgICAvLyBtYXRyaXgqbWF0cml4CisgICAgdGVtcGxhdGUgPHNpemVfdCBEPgorICAgIGZyaWVuZCBtYXQgUFVSRSBvcGVyYXRvciAqICgKKyAgICAgICAgICAgIGNvbnN0IG1hdDxUWVBFLCBELCBSPiYgbGhzLAorICAgICAgICAgICAgY29uc3QgbWF0PFRZUEUsIEMsIEQ+JiByaHMpIHsKKyAgICAgICAgcmV0dXJuIGhlbHBlcnM6OmRvTXVsKGxocywgcmhzKTsKKyAgICB9CisKKyAgICAvLyBtYXRyaXgqdmVjdG9yCisgICAgZnJpZW5kIHZlYzxUWVBFLCBSPiBQVVJFIG9wZXJhdG9yICogKAorICAgICAgICAgICAgY29uc3QgbWF0JiBsaHMsIGNvbnN0IHZlYzxUWVBFLCBDPiYgcmhzKSB7CisgICAgICAgIHJldHVybiBoZWxwZXJzOjpkb011bChsaHMsIHJocyk7CisgICAgfQorCisgICAgLy8gdmVjdG9yKm1hdHJpeAorICAgIGZyaWVuZCBtYXQgUFVSRSBvcGVyYXRvciAqICgKKyAgICAgICAgICAgIGNvbnN0IHZlYzxUWVBFLCBSPiYgbGhzLCBjb25zdCBtYXQ8VFlQRSwgQywgMT4mIHJocykgeworICAgICAgICByZXR1cm4gaGVscGVyczo6ZG9NdWwobGhzLCByaHMpOworICAgIH0KKworICAgIC8vIG1hdHJpeCpzY2FsYXIKKyAgICBmcmllbmQgaW5saW5lIG1hdCBQVVJFIG9wZXJhdG9yICogKGNvbnN0IG1hdCYgbGhzLCBwVFlQRSB2KSB7CisgICAgICAgIHJldHVybiBoZWxwZXJzOjpkb011bChsaHMsIHYpOworICAgIH0KKworICAgIC8vIHNjYWxhciptYXRyaXgKKyAgICBmcmllbmQgaW5saW5lIG1hdCBQVVJFIG9wZXJhdG9yICogKHBUWVBFIHYsIGNvbnN0IG1hdCYgcmhzKSB7CisgICAgICAgIHJldHVybiBoZWxwZXJzOjpkb011bCh2LCByaHMpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gc3RyZWFtaW5nIG9wZXJhdG9yIHRvIHNldCB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4OgorICAgIC8vIGV4YW1wbGU6CisgICAgLy8gICAgbWF0MzNfdCBtOworICAgIC8vICAgIG0gPDwgdjAgPDwgdjEgPDwgdjI7CisKKyAgICAvLyBjb2x1bW5fYnVpbGRlcjw+IHN0b3JlcyB0aGUgbWF0cml4IGFuZCBrbm93cyB3aGljaCBjb2x1bW4gdG8gc2V0CisgICAgdGVtcGxhdGU8c2l6ZV90IFBSRVZfQ09MVU1OPgorICAgIHN0cnVjdCBjb2x1bW5fYnVpbGRlciB7CisgICAgICAgIG1hdCYgbWF0cml4OworICAgICAgICBjb2x1bW5fYnVpbGRlcihtYXQmIG1hdHJpeCkgOiBtYXRyaXgobWF0cml4KSB7IH0KKyAgICB9OworCisgICAgLy8gb3BlcmF0b3IgPDwgaXMgbm90IGEgbWV0aG9kIG9mIGNvbHVtbl9idWlsZGVyPD4gc28gd2UgY2FuCisgICAgLy8gb3ZlcmxvYWQgaXQgZm9yIHVuYXV0aG9yaXplZCB2YWx1ZXMgKHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KKyAgICAvLyBub3QgYWxsb3dlZCBpbiBjbGFzcy1zY29wZSkuCisgICAgLy8gd2UganVzdCBzZXQgdGhlIGNvbHVtbiBhbmQgcmV0dXJuIHRoZSBuZXh0IGNvbHVtbl9idWlsZGVyPD4KKyAgICB0ZW1wbGF0ZTxzaXplX3QgUFJFVl9DT0xVTU4+CisgICAgZnJpZW5kIGNvbHVtbl9idWlsZGVyPFBSRVZfQ09MVU1OKzE+IG9wZXJhdG9yIDw8ICgKKyAgICAgICAgICAgIGNvbnN0IGNvbHVtbl9idWlsZGVyPFBSRVZfQ09MVU1OPiYgbGhzLAorICAgICAgICAgICAgY29uc3QgdmVjPFRZUEUsIFI+JiByaHMpIHsKKyAgICAgICAgbGhzLm1hdHJpeFtQUkVWX0NPTFVNTisxXSA9IHJoczsKKyAgICAgICAgcmV0dXJuIGNvbHVtbl9idWlsZGVyPFBSRVZfQ09MVU1OKzE+KGxocy5tYXRyaXgpOworICAgIH0KKworICAgIC8vIHdlIHJldHVybiB2b2lkIGhlcmUgc28gd2UgZ2V0IGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZQorICAgIC8vIHVzZXIgdHJpZXMgdG8gc2V0IHRvbyBtYW55IGNvbHVtbnMKKyAgICBmcmllbmQgdm9pZCBvcGVyYXRvciA8PCAoCisgICAgICAgICAgICBjb25zdCBjb2x1bW5fYnVpbGRlcjxDLTI+JiBsaHMsCisgICAgICAgICAgICBjb25zdCB2ZWM8VFlQRSwgUj4mIHJocykgeworICAgICAgICBsaHMubWF0cml4W0MtMV0gPSByaHM7CisgICAgfQorCisgICAgLy8gdGhpcyBpcyB3aGVyZSB0aGUgcHJvY2VzcyBzdGFydHMuIHdlIHNldCB0aGUgZmlyc3QgY29sdW1ucyBhbmQKKyAgICAvLyByZXR1cm4gdGhlIG5leHQgY29sdW1uX2J1aWxkZXI8PgorICAgIGNvbHVtbl9idWlsZGVyPDA+IG9wZXJhdG9yIDw8IChjb25zdCB2ZWM8VFlQRSwgUj4mIHJocykgeworICAgICAgICAoKnRoaXMpWzBdID0gcmhzOworICAgICAgICByZXR1cm4gY29sdW1uX2J1aWxkZXI8MD4oKnRoaXMpOworICAgIH0KK307CisKKy8vIFNwZWNpYWxpemUgY29sdW1uIG1hdHJpeCBzbyB0aGV5J3JlIGV4YWN0bHkgZXF1aXZhbGVudCB0byBhIHZlY3RvcgordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEUsIHNpemVfdCBSPgorY2xhc3MgbWF0PFRZUEUsIDEsIFI+IDogcHVibGljIHZlYzxUWVBFLCBSPiB7CisgICAgdHlwZWRlZiB2ZWM8VFlQRSwgUj4gYmFzZTsKK3B1YmxpYzoKKyAgICAvLyBTVEwtbGlrZSBpbnRlcmZhY2UuCisgICAgdHlwZWRlZiBUWVBFIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBUWVBFJiByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBUWVBFIGNvbnN0JiBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gUjsgfQorICAgIGVudW0geyBST1dTID0gUiwgQ09MUyA9IDEgfTsKKworICAgIG1hdCgpIHsgfQorICAgIG1hdChjb25zdCBiYXNlJiByaHMpIDogYmFzZShyaHMpIHsgfQorICAgIG1hdChjb25zdCBtYXQmIHJocykgOiBiYXNlKHJocykgeyB9CisgICAgbWF0KGNvbnN0IFRZUEUmIHJocykgeyBoZWxwZXJzOjpkb0Fzc2lnbigqdGhpcywgcmhzKTsgfQorICAgIG1hdCYgb3BlcmF0b3I9KGNvbnN0IG1hdCYgcmhzKSB7IGJhc2U6Om9wZXJhdG9yPShyaHMpOyByZXR1cm4gKnRoaXM7IH0KKyAgICBtYXQmIG9wZXJhdG9yPShjb25zdCBiYXNlJiByaHMpIHsgYmFzZTo6b3BlcmF0b3I9KHJocyk7IHJldHVybiAqdGhpczsgfQorICAgIG1hdCYgb3BlcmF0b3I9KGNvbnN0IFRZUEUmIHJocykgeyByZXR1cm4gaGVscGVyczo6ZG9Bc3NpZ24oKnRoaXMsIHJocyk7IH0KKyAgICAvLyB3ZSBvbmx5IGhhdmUgb25lIGNvbHVtbiwgc28gaWdub3JlIHRoZSBpbmRleAorICAgIGNvbnN0IGJhc2UmIG9wZXJhdG9yW10oc2l6ZV90KSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorICAgIGJhc2UmIG9wZXJhdG9yW10oc2l6ZV90KSB7IHJldHVybiAqdGhpczsgfQorICAgIHZvaWQgb3BlcmF0b3IgPDwgKGNvbnN0IHZlYzxUWVBFLCBSPiYgcmhzKSB7IGJhc2U6Om9wZXJhdG9yW10oMCkgPSByaHM7IH0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtYXRyaXggZnVuY3Rpb25zCisKKy8vIHRyYW5zcG9zZS4gdGhpcyBoYW5kbGVzIG1hdHJpY2VzIG9mIG1hdHJpY2VzCitpbmxpbmUgaW50ICAgICBQVVJFIHRyYW5zcG9zZShpbnQgdikgICAgeyByZXR1cm4gdjsgfQoraW5saW5lIGZsb2F0ICAgUFVSRSB0cmFuc3Bvc2UoZmxvYXQgdikgIHsgcmV0dXJuIHY7IH0KK2lubGluZSBkb3VibGUgIFBVUkUgdHJhbnNwb3NlKGRvdWJsZSB2KSB7IHJldHVybiB2OyB9CisKKy8vIFRyYW5zcG9zZSBhIG1hdHJpeAordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEUsIHNpemVfdCBDLCBzaXplX3QgUj4KK21hdDxUWVBFLCBSLCBDPiBQVVJFIHRyYW5zcG9zZShjb25zdCBtYXQ8VFlQRSwgQywgUj4mIG0pIHsKKyAgICBtYXQ8VFlQRSwgUiwgQz4gcjsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPFIgOyBpKyspCisgICAgICAgIGZvciAoc2l6ZV90IGo9MCA7IGo8QyA7IGorKykKKyAgICAgICAgICAgIHJbaV1bal0gPSB0cmFuc3Bvc2UobVtqXVtpXSk7CisgICAgcmV0dXJuIHI7Cit9CisKKy8vIFRyYW5zcG9zZSBhIHZlY3RvcgordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWRUMsCisgICAgdHlwZW5hbWUgVFlQRSwKKyAgICBzaXplX3QgU0laRQorPgorbWF0PFRZUEUsIFNJWkUsIDE+IFBVUkUgdHJhbnNwb3NlKGNvbnN0IFZFQzxUWVBFLCBTSVpFPiYgdikgeworICAgIG1hdDxUWVBFLCBTSVpFLCAxPiByOworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8U0laRSA7IGkrKykKKyAgICAgICAgcltpXVswXSA9IHRyYW5zcG9zZSh2W2ldKTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICJkdW1iIiBtYXRyaXggaW52ZXJzaW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgTj4KK21hdDxULCBOLCBOPiBQVVJFIGludmVydChjb25zdCBtYXQ8VCwgTiwgTj4mIHNyYykgeworICAgIFQgdDsKKyAgICBzaXplX3Qgc3dhcDsKKyAgICBtYXQ8VCwgTiwgTj4gdG1wKHNyYyk7CisgICAgbWF0PFQsIE4sIE4+IGludmVyc2UoMSk7CisKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPE4gOyBpKyspIHsKKyAgICAgICAgLy8gbG9vayBmb3IgbGFyZ2VzdCBlbGVtZW50IGluIGNvbHVtbgorICAgICAgICBzd2FwID0gaTsKKyAgICAgICAgZm9yIChzaXplX3Qgaj1pKzEgOyBqPE4gOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChmYWJzKHRtcFtqXVtpXSkgPiBmYWJzKHRtcFtpXVtpXSkpIHsKKyAgICAgICAgICAgICAgICBzd2FwID0gajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzd2FwICE9IGkpIHsKKyAgICAgICAgICAgIC8qIHN3YXAgcm93cy4gKi8KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGs9MCA7IGs8TiA7IGsrKykgeworICAgICAgICAgICAgICAgIHQgPSB0bXBbaV1ba107CisgICAgICAgICAgICAgICAgdG1wW2ldW2tdID0gdG1wW3N3YXBdW2tdOworICAgICAgICAgICAgICAgIHRtcFtzd2FwXVtrXSA9IHQ7CisKKyAgICAgICAgICAgICAgICB0ID0gaW52ZXJzZVtpXVtrXTsKKyAgICAgICAgICAgICAgICBpbnZlcnNlW2ldW2tdID0gaW52ZXJzZVtzd2FwXVtrXTsKKyAgICAgICAgICAgICAgICBpbnZlcnNlW3N3YXBdW2tdID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHQgPSAxIC8gdG1wW2ldW2ldOworICAgICAgICBmb3IgKHNpemVfdCBrPTAgOyBrPE4gOyBrKyspIHsKKyAgICAgICAgICAgIHRtcFtpXVtrXSAqPSB0OworICAgICAgICAgICAgaW52ZXJzZVtpXVtrXSAqPSB0OworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGo9MCA7IGo8TiA7IGorKykgeworICAgICAgICAgICAgaWYgKGogIT0gaSkgeworICAgICAgICAgICAgICAgIHQgPSB0bXBbal1baV07CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3Qgaz0wIDsgazxOIDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcFtqXVtrXSAtPSB0bXBbaV1ba10gKiB0OworICAgICAgICAgICAgICAgICAgICBpbnZlcnNlW2pdW2tdIC09IGludmVyc2VbaV1ba10gKiB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW52ZXJzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBtYXQ8ZmxvYXQsIDIsIDI+IG1hdDIyX3Q7Cit0eXBlZGVmIG1hdDxmbG9hdCwgMywgMz4gbWF0MzNfdDsKK3R5cGVkZWYgbWF0PGZsb2F0LCA0LCA0PiBtYXQ0NF90OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLyogQU5EUk9JRF9NQVRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9xdWF0LmggYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL3F1YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWExYWZlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9xdWF0LmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9RVUFUX0gKKyNkZWZpbmUgQU5EUk9JRF9RVUFUX0gKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInZlYy5oIgorI2luY2x1ZGUgIm1hdC5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+CittYXQ8VFlQRSwgMywgMz4gcXVhdFRvTWF0cml4KGNvbnN0IHZlYzxUWVBFLCA0PiYgcSkgeworICAgIG1hdDxUWVBFLCAzLCAzPiBSOworICAgIFRZUEUgcTAocS53KTsKKyAgICBUWVBFIHExKHEueCk7CisgICAgVFlQRSBxMihxLnkpOworICAgIFRZUEUgcTMocS56KTsKKyAgICBUWVBFIHNxX3ExID0gMiAqIHExICogcTE7CisgICAgVFlQRSBzcV9xMiA9IDIgKiBxMiAqIHEyOworICAgIFRZUEUgc3FfcTMgPSAyICogcTMgKiBxMzsKKyAgICBUWVBFIHExX3EyID0gMiAqIHExICogcTI7CisgICAgVFlQRSBxM19xMCA9IDIgKiBxMyAqIHEwOworICAgIFRZUEUgcTFfcTMgPSAyICogcTEgKiBxMzsKKyAgICBUWVBFIHEyX3EwID0gMiAqIHEyICogcTA7CisgICAgVFlQRSBxMl9xMyA9IDIgKiBxMiAqIHEzOworICAgIFRZUEUgcTFfcTAgPSAyICogcTEgKiBxMDsKKyAgICBSWzBdWzBdID0gMSAtIHNxX3EyIC0gc3FfcTM7CisgICAgUlswXVsxXSA9IHExX3EyIC0gcTNfcTA7CisgICAgUlswXVsyXSA9IHExX3EzICsgcTJfcTA7CisgICAgUlsxXVswXSA9IHExX3EyICsgcTNfcTA7CisgICAgUlsxXVsxXSA9IDEgLSBzcV9xMSAtIHNxX3EzOworICAgIFJbMV1bMl0gPSBxMl9xMyAtIHExX3EwOworICAgIFJbMl1bMF0gPSBxMV9xMyAtIHEyX3EwOworICAgIFJbMl1bMV0gPSBxMl9xMyArIHExX3EwOworICAgIFJbMl1bMl0gPSAxIC0gc3FfcTEgLSBzcV9xMjsKKyAgICByZXR1cm4gUjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+Cit2ZWM8VFlQRSwgND4gbWF0cml4VG9RdWF0KGNvbnN0IG1hdDxUWVBFLCAzLCAzPiYgUikgeworICAgIC8vIG1hdHJpeCB0byBxdWF0ZXJuaW9uCisKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbmxpbmUgVFlQRSBvcGVyYXRvcigpKFRZUEUgdikgeworICAgICAgICAgICAgcmV0dXJuIHYgPCAwID8gMCA6IHY7CisgICAgICAgIH0KKyAgICB9IGNsYW1wOworCisgICAgdmVjPFRZUEUsIDQ+IHE7CisgICAgY29uc3QgZmxvYXQgSHggPSBSWzBdLng7CisgICAgY29uc3QgZmxvYXQgTXkgPSBSWzFdLnk7CisgICAgY29uc3QgZmxvYXQgQXogPSBSWzJdLno7CisgICAgcS54ID0gc3FydGYoIGNsYW1wKCBIeCAtIE15IC0gQXogKyAxKSAqIDAuMjVmICk7CisgICAgcS55ID0gc3FydGYoIGNsYW1wKC1IeCArIE15IC0gQXogKyAxKSAqIDAuMjVmICk7CisgICAgcS56ID0gc3FydGYoIGNsYW1wKC1IeCAtIE15ICsgQXogKyAxKSAqIDAuMjVmICk7CisgICAgcS53ID0gc3FydGYoIGNsYW1wKCBIeCArIE15ICsgQXogKyAxKSAqIDAuMjVmICk7CisgICAgcS54ID0gY29weXNpZ25mKHEueCwgUlsyXS55IC0gUlsxXS56KTsKKyAgICBxLnkgPSBjb3B5c2lnbmYocS55LCBSWzBdLnogLSBSWzJdLngpOworICAgIHEueiA9IGNvcHlzaWduZihxLnosIFJbMV0ueCAtIFJbMF0ueSk7CisgICAgLy8gZ3VhcmFudGVlZCB0byBiZSB1bml0LXF1YXRlcm5pb24KKyAgICByZXR1cm4gcTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+Cit2ZWM8VFlQRSwgND4gbm9ybWFsaXplX3F1YXQoY29uc3QgdmVjPFRZUEUsIDQ+JiBxKSB7CisgICAgdmVjPFRZUEUsIDQ+IHIocSk7CisgICAgaWYgKHIudyA8IDApIHsKKyAgICAgICAgciA9IC1yOworICAgIH0KKyAgICByZXR1cm4gbm9ybWFsaXplKHIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHZlYzRfdCBxdWF0X3Q7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLyogQU5EUk9JRF9RVUFUX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvdHJhaXRzLmggYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNGM1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL3RyYWl0cy5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1RSQUlUU19ICisjZGVmaW5lIEFORFJPSURfVFJBSVRTX0gKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFR5cGVsaXN0cworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGVuZC1vZi1saXN0IG1hcmtlcgorY2xhc3MgTnVsbFR5cGUge307CisKKy8vIHR5cGUtbGlzdCBub2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBUeXBlTGlzdCB7CisgICAgdHlwZWRlZiBUIEhlYWQ7CisgICAgdHlwZWRlZiBVIFRhaWw7Cit9OworCisvLyBoZWxwZXJzIHRvIGJ1aWxkIHR5cGVsaXN0cworI2RlZmluZSBUWVBFTElTVF8xKFQxKSBUeXBlTGlzdDxUMSwgTnVsbFR5cGU+CisjZGVmaW5lIFRZUEVMSVNUXzIoVDEsIFQyKSBUeXBlTGlzdDxUMSwgVFlQRUxJU1RfMShUMik+CisjZGVmaW5lIFRZUEVMSVNUXzMoVDEsIFQyLCBUMykgVHlwZUxpc3Q8VDEsIFRZUEVMSVNUXzIoVDIsIFQzKT4KKyNkZWZpbmUgVFlQRUxJU1RfNChUMSwgVDIsIFQzLCBUNCkgVHlwZUxpc3Q8VDEsIFRZUEVMSVNUXzMoVDIsIFQzLCBUNCk+CisKKy8vIHR5cGVsaXN0cyBhbGdvcml0aG1zCituYW1lc3BhY2UgVEwgewordGVtcGxhdGUgPHR5cGVuYW1lIFRMaXN0LCB0eXBlbmFtZSBUPiBzdHJ1Y3QgSW5kZXhPZjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW5kZXhPZjxOdWxsVHlwZSwgVD4geworICAgIGVudW0geyB2YWx1ZSA9IC0xIH07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVGFpbD4KK3N0cnVjdCBJbmRleE9mPFR5cGVMaXN0PFQsIFRhaWw+LCBUPiB7CisgICAgZW51bSB7IHZhbHVlID0gMCB9OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEhlYWQsIHR5cGVuYW1lIFRhaWwsIHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW5kZXhPZjxUeXBlTGlzdDxIZWFkLCBUYWlsPiwgVD4geworcHJpdmF0ZToKKyAgICBlbnVtIHsgdGVtcCA9IEluZGV4T2Y8VGFpbCwgVD46OnZhbHVlIH07CitwdWJsaWM6CisgICAgZW51bSB7IHZhbHVlID0gdGVtcCA9PSAtMSA/IC0xIDogMSArIHRlbXAgfTsKK307CisKK307IC8vIG5hbWVzcGFjZSBUTAorCisvLyB0eXBlIHNlbGVjdGlvbiBiYXNlZCBvbiBhIGJvb2xlYW4KK3RlbXBsYXRlIDxib29sIGZsYWcsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgU2VsZWN0IHsKKyAgICB0eXBlZGVmIFQgUmVzdWx0OworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IFNlbGVjdDxmYWxzZSwgVCwgVT4geworICAgIHR5cGVkZWYgVSBSZXN1bHQ7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHlwZSB0cmFpdHMKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlVHJhaXRzIHsKKyAgICB0eXBlZGVmIFRZUEVMSVNUXzQoCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBzaG9ydCwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyBpbnQpIFVuc2lnbmVkSW50czsKKworICAgIHR5cGVkZWYgVFlQRUxJU1RfNCgKKyAgICAgICAgICAgIHNpZ25lZCBjaGFyLCBzaWduZWQgc2hvcnQsCisgICAgICAgICAgICBzaWduZWQgaW50LCBzaWduZWQgbG9uZyBpbnQpIFNpZ25lZEludHM7CisKKyAgICB0eXBlZGVmIFRZUEVMSVNUXzEoCisgICAgICAgICAgICBib29sKSBPdGhlckludHM7CisKKyAgICB0eXBlZGVmIFRZUEVMSVNUXzMoCisgICAgICAgICAgICBmbG9hdCwgZG91YmxlLCBsb25nIGRvdWJsZSkgRmxvYXRzOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3RydWN0IFBvaW50ZXJUcmFpdHMgeworICAgICAgICBlbnVtIHsgcmVzdWx0ID0gZmFsc2UgfTsKKyAgICAgICAgdHlwZWRlZiBOdWxsVHlwZSBQb2ludGVlVHlwZTsKKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHN0cnVjdCBQb2ludGVyVHJhaXRzPFUqPiB7CisgICAgICAgIGVudW0geyByZXN1bHQgPSB0cnVlIH07CisgICAgICAgIHR5cGVkZWYgVSBQb2ludGVlVHlwZTsKKyAgICB9OworCitwdWJsaWM6CisgICAgZW51bSB7IGlzU3RkVW5zaWduZWRJbnQgPSBUTDo6SW5kZXhPZjxVbnNpZ25lZEludHMsIFQ+Ojp2YWx1ZSA+PSAwIH07CisgICAgZW51bSB7IGlzU3RkU2lnbmVkSW50ICAgPSBUTDo6SW5kZXhPZjxTaWduZWRJbnRzLCAgIFQ+Ojp2YWx1ZSA+PSAwIH07CisgICAgZW51bSB7IGlzU3RkSW50ZWdyYWwgICAgPSBUTDo6SW5kZXhPZjxPdGhlckludHMsICAgIFQ+Ojp2YWx1ZSA+PSAwIHx8IGlzU3RkVW5zaWduZWRJbnQgfHwgaXNTdGRTaWduZWRJbnQgfTsKKyAgICBlbnVtIHsgaXNTdGRGbG9hdCAgICAgICA9IFRMOjpJbmRleE9mPEZsb2F0cywgICAgICAgVD46OnZhbHVlID49IDAgfTsKKyAgICBlbnVtIHsgaXNQb2ludGVyICAgICAgICA9IFBvaW50ZXJUcmFpdHM8VD46OnJlc3VsdCB9OworICAgIGVudW0geyBpc1N0ZEFyaXRoICAgICAgID0gaXNTdGRJbnRlZ3JhbCB8fCBpc1N0ZEZsb2F0IH07CisKKyAgICAvLyBiZXN0IHBhcmFtZXRlciB0eXBlIGZvciBnaXZlbiB0eXBlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBTZWxlY3Q8aXNTdGRBcml0aCB8fCBpc1BvaW50ZXIsIFQsIGNvbnN0IFQmPjo6UmVzdWx0IFBhcmFtZXRlclR5cGU7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIEFORFJPSURfVFJBSVRTX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvdmVjLmggYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL3ZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NGNjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL3ZlYy5oCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1ZFQ19ICisjZGVmaW5lIEFORFJPSURfVkVDX0gKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAidHJhaXRzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgUFVSRSBfX2F0dHJpYnV0ZV9fKChwdXJlKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbm9uLWlubGluZSBoZWxwZXJzCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUWVBFLCBzaXplX3QgU0laRT4KK2NsYXNzIHZlYzsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEUsIHNpemVfdCBTSVpFPgorY2xhc3MgdmJhc2U7CisKK25hbWVzcGFjZSBoZWxwZXJzIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBUIG1pbihUIGEsIFQgYikgeyByZXR1cm4gYTxiID8gYSA6IGI7IH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgVCBtYXgoVCBhLCBUIGIpIHsgcmV0dXJuIGE+YiA/IGEgOiBiOyB9CisKK3RlbXBsYXRlIDwgdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IFM+IGNsYXNzIFZFQywKKyAgICB0eXBlbmFtZSBUWVBFLCBzaXplX3QgU0laRSwgc2l6ZV90IFM+Cit2ZWM8VFlQRSwgU0laRT4mIGRvQXNzaWduKAorICAgICAgICB2ZWM8VFlQRSwgU0laRT4mIGxocywgY29uc3QgVkVDPFRZUEUsIFM+JiByaHMpIHsKKyAgICBjb25zdCBzaXplX3QgbWluU2l6ZSA9IG1pbihTSVpFLCBTKTsKKyAgICBjb25zdCBzaXplX3QgbWF4U2l6ZSA9IG1heChTSVpFLCBTKTsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPG1pblNpemUgOyBpKyspCisgICAgICAgIGxoc1tpXSA9IHJoc1tpXTsKKyAgICBmb3IgKHNpemVfdCBpPW1pblNpemUgOyBpPG1heFNpemUgOyBpKyspCisgICAgICAgIGxoc1tpXSA9IDA7CisgICAgcmV0dXJuIGxoczsKK30KKworCit0ZW1wbGF0ZSA8CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IFM+IGNsYXNzIFZMSFMsCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IFM+IGNsYXNzIFZSSFMsCisgICAgdHlwZW5hbWUgVFlQRSwKKyAgICBzaXplX3QgU0laRQorPgorVkxIUzxUWVBFLCBTSVpFPiBQVVJFIGRvQWRkKAorICAgICAgICBjb25zdCBWTEhTPFRZUEUsIFNJWkU+JiBsaHMsCisgICAgICAgIGNvbnN0IFZSSFM8VFlQRSwgU0laRT4mIHJocykgeworICAgIFZMSFM8VFlQRSwgU0laRT4gcjsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPFNJWkUgOyBpKyspCisgICAgICAgIHJbaV0gPSBsaHNbaV0gKyByaHNbaV07CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlIDwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgUz4gY2xhc3MgVkxIUywKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgUz4gY2xhc3MgVlJIUywKKyAgICB0eXBlbmFtZSBUWVBFLAorICAgIHNpemVfdCBTSVpFCis+CitWTEhTPFRZUEUsIFNJWkU+IFBVUkUgZG9TdWIoCisgICAgICAgIGNvbnN0IFZMSFM8VFlQRSwgU0laRT4mIGxocywKKyAgICAgICAgY29uc3QgVlJIUzxUWVBFLCBTSVpFPiYgcmhzKSB7CisgICAgVkxIUzxUWVBFLCBTSVpFPiByOworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8U0laRSA7IGkrKykKKyAgICAgICAgcltpXSA9IGxoc1tpXSAtIHJoc1tpXTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWRUMsCisgICAgdHlwZW5hbWUgVFlQRSwKKyAgICBzaXplX3QgU0laRQorPgorVkVDPFRZUEUsIFNJWkU+IFBVUkUgZG9NdWxTY2FsYXIoCisgICAgICAgIGNvbnN0IFZFQzxUWVBFLCBTSVpFPiYgbGhzLAorICAgICAgICB0eXBlbmFtZSBUeXBlVHJhaXRzPFRZUEU+OjpQYXJhbWV0ZXJUeXBlIHJocykgeworICAgIFZFQzxUWVBFLCBTSVpFPiByOworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8U0laRSA7IGkrKykKKyAgICAgICAgcltpXSA9IGxoc1tpXSAqIHJoczsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWRUMsCisgICAgdHlwZW5hbWUgVFlQRSwKKyAgICBzaXplX3QgU0laRQorPgorVkVDPFRZUEUsIFNJWkU+IFBVUkUgZG9TY2FsYXJNdWwoCisgICAgICAgIHR5cGVuYW1lIFR5cGVUcmFpdHM8VFlQRT46OlBhcmFtZXRlclR5cGUgbGhzLAorICAgICAgICBjb25zdCBWRUM8VFlQRSwgU0laRT4mIHJocykgeworICAgIFZFQzxUWVBFLCBTSVpFPiByOworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8U0laRSA7IGkrKykKKyAgICAgICAgcltpXSA9IGxocyAqIHJoc1tpXTsKKyAgICByZXR1cm4gcjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGhlbHBlcnMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJlbG93IHdlIGRlZmluZSB0aGUgbWF0aGVtYXRpY2FsIG9wZXJhdG9ycyBmb3IgdmVjdG9ycy4KKy8vIFdlIHVzZSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudHMgc28gd2UgY2FuIGdlbmVyaWNhbGx5CisvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHJpZ2h0LWhhbmQtc2l6ZSBhbmQgbGVmdC1oYW5kLXNpZGUgYXJlCisvLyBkaWZmZXJlbnQgdmVjdG9yIHR5cGVzIChidXQgd2l0aCBzYW1lIHZhbHVlX3R5cGUgYW5kIHNpemUpLgorLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHBlcmZvcm1hbmNlIHdoZW4gdXNpbmcgIi54eXt6fSIgZWxlbWVudCBhY2Nlc3MKKy8vIG9uIHZlYzw+LiBXaXRob3V0IHRoaXMsIGFuIGV4dHJhIGNvbnZlcnNpb24gdG8gdmVjPD4gd291bGQgYmUgbmVlZGVkLgorLy8KKy8vIGV4YW1wbGU6CisvLyAgICAgIHZlYzRfdCBhOworLy8gICAgICB2ZWMzX3QgYjsKKy8vICAgICAgdmVjM190IGMgPSBhLnh5eiArIGI7CisvLworLy8gICJhLnh5eiArIGIiIGlzIGEgbWl4ZWQtb3BlcmF0aW9uIGJldHdlZW4gYSB2YmFzZTw+IGFuZCBhIHZlYzw+LCByZXF1aXJpbmcKKy8vICBhIGNvbnZlcnNpb24gb2YgdmJhc2U8PiB0byB2ZWM8Pi4gVGhlIHRlbXBsYXRlIGd1bmsgYmVsb3cgYXZvaWRzIHRoaXMsCisvLyBieSBhbGxvd2luZyB0aGUgYWRkaXRpb24gb24gdGhlc2UgZGlmZmVyZW50IHZlY3RvciB0eXBlcyBkaXJlY3RseQorLy8KKwordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWTEhTLAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWUkhTLAorICAgIHR5cGVuYW1lIFRZUEUsCisgICAgc2l6ZV90IFNJWkUKKz4KK2lubGluZSBWTEhTPFRZUEUsIFNJWkU+IFBVUkUgb3BlcmF0b3IgKyAoCisgICAgICAgIGNvbnN0IFZMSFM8VFlQRSwgU0laRT4mIGxocywKKyAgICAgICAgY29uc3QgVlJIUzxUWVBFLCBTSVpFPiYgcmhzKSB7CisgICAgcmV0dXJuIGhlbHBlcnM6OmRvQWRkKGxocywgcmhzKTsKK30KKwordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWTEhTLAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWUkhTLAorICAgIHR5cGVuYW1lIFRZUEUsCisgICAgc2l6ZV90IFNJWkUKKz4KK2lubGluZSBWTEhTPFRZUEUsIFNJWkU+IFBVUkUgb3BlcmF0b3IgLSAoCisgICAgICAgIGNvbnN0IFZMSFM8VFlQRSwgU0laRT4mIGxocywKKyAgICAgICAgY29uc3QgVlJIUzxUWVBFLCBTSVpFPiYgcmhzKSB7CisgICAgcmV0dXJuIGhlbHBlcnM6OmRvU3ViKGxocywgcmhzKTsKK30KKwordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWRUMsCisgICAgdHlwZW5hbWUgVFlQRSwKKyAgICBzaXplX3QgU0laRQorPgoraW5saW5lIFZFQzxUWVBFLCBTSVpFPiBQVVJFIG9wZXJhdG9yICogKAorICAgICAgICBjb25zdCBWRUM8VFlQRSwgU0laRT4mIGxocywKKyAgICAgICAgdHlwZW5hbWUgVHlwZVRyYWl0czxUWVBFPjo6UGFyYW1ldGVyVHlwZSByaHMpIHsKKyAgICByZXR1cm4gaGVscGVyczo6ZG9NdWxTY2FsYXIobGhzLCByaHMpOworfQorCit0ZW1wbGF0ZSA8CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IFM+IGNsYXNzIFZFQywKKyAgICB0eXBlbmFtZSBUWVBFLAorICAgIHNpemVfdCBTSVpFCis+CitpbmxpbmUgVkVDPFRZUEUsIFNJWkU+IFBVUkUgb3BlcmF0b3IgKiAoCisgICAgICAgIHR5cGVuYW1lIFR5cGVUcmFpdHM8VFlQRT46OlBhcmFtZXRlclR5cGUgbGhzLAorICAgICAgICBjb25zdCBWRUM8VFlQRSwgU0laRT4mIHJocykgeworICAgIHJldHVybiBoZWxwZXJzOjpkb1NjYWxhck11bChsaHMsIHJocyk7Cit9CisKKwordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWTEhTLAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWUkhTLAorICAgIHR5cGVuYW1lIFRZUEUsCisgICAgc2l6ZV90IFNJWkUKKz4KK1RZUEUgUFVSRSBkb3RfcHJvZHVjdCgKKyAgICAgICAgY29uc3QgVkxIUzxUWVBFLCBTSVpFPiYgbGhzLAorICAgICAgICBjb25zdCBWUkhTPFRZUEUsIFNJWkU+JiByaHMpIHsKKyAgICBUWVBFIHIoMCk7CisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxTSVpFIDsgaSsrKQorICAgICAgICByICs9IGxoc1tpXSAqIHJoc1tpXTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWLAorICAgIHR5cGVuYW1lIFRZUEUsCisgICAgc2l6ZV90IFNJWkUKKz4KK1RZUEUgUFVSRSBsZW5ndGgoY29uc3QgVjxUWVBFLCBTSVpFPiYgdikgeworICAgIHJldHVybiBzcXJ0KGRvdF9wcm9kdWN0KHYsIHYpKTsKK30KKwordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWLAorICAgIHR5cGVuYW1lIFRZUEUsCisgICAgc2l6ZV90IFNJWkUKKz4KK1Y8VFlQRSwgU0laRT4gUFVSRSBub3JtYWxpemUoY29uc3QgVjxUWVBFLCBTSVpFPiYgdikgeworICAgIHJldHVybiB2ICogKDEvbGVuZ3RoKHYpKTsKK30KKwordGVtcGxhdGUgPAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWTEhTLAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPiBjbGFzcyBWUkhTLAorICAgIHR5cGVuYW1lIFRZUEUKKz4KK1ZMSFM8VFlQRSwgMz4gUFVSRSBjcm9zc19wcm9kdWN0KAorICAgICAgICBjb25zdCBWTEhTPFRZUEUsIDM+JiB1LAorICAgICAgICBjb25zdCBWUkhTPFRZUEUsIDM+JiB2KSB7CisgICAgVkxIUzxUWVBFLCAzPiByOworICAgIHIueCA9IHUueSp2LnogLSB1Lnoqdi55OworICAgIHIueSA9IHUueip2LnggLSB1Lngqdi56OworICAgIHIueiA9IHUueCp2LnkgLSB1Lnkqdi54OworICAgIHJldHVybiByOworfQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUWVBFLCBzaXplX3QgU0laRT4KK3ZlYzxUWVBFLCBTSVpFPiBQVVJFIG9wZXJhdG9yIC0gKGNvbnN0IHZlYzxUWVBFLCBTSVpFPiYgbGhzKSB7CisgICAgdmVjPFRZUEUsIFNJWkU+IHI7CisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxTSVpFIDsgaSsrKQorICAgICAgICByW2ldID0gLWxoc1tpXTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBvdXIgYmFzaWMgdmVjdG9yIHR5cGUsIGl0IGp1c3QgaW1wbGVtZW50cyB0aGUgZGF0YSBzdG9yYWdlCisvLyBhbmQgYWNjZXNzb3JzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRSwgc2l6ZV90IFNJWkU+CitzdHJ1Y3QgdmJhc2UgeworICAgIFRZUEUgdltTSVpFXTsKKyAgICBpbmxpbmUgY29uc3QgVFlQRSYgb3BlcmF0b3JbXShzaXplX3QgaSkgY29uc3QgeyByZXR1cm4gdltpXTsgfQorICAgIGlubGluZSAgICAgICBUWVBFJiBvcGVyYXRvcltdKHNpemVfdCBpKSAgICAgICB7IHJldHVybiB2W2ldOyB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgdmJhc2U8ZmxvYXQsIDI+IHsKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0IHZbMl07CisgICAgICAgIHN0cnVjdCB7IGZsb2F0IHgsIHk7IH07CisgICAgICAgIHN0cnVjdCB7IGZsb2F0IHMsIHQ7IH07CisgICAgfTsKKyAgICBpbmxpbmUgY29uc3QgZmxvYXQmIG9wZXJhdG9yW10oc2l6ZV90IGkpIGNvbnN0IHsgcmV0dXJuIHZbaV07IH0KKyAgICBpbmxpbmUgICAgICAgZmxvYXQmIG9wZXJhdG9yW10oc2l6ZV90IGkpICAgICAgIHsgcmV0dXJuIHZbaV07IH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCB2YmFzZTxmbG9hdCwgMz4geworICAgIHVuaW9uIHsKKyAgICAgICAgZmxvYXQgdlszXTsKKyAgICAgICAgc3RydWN0IHsgZmxvYXQgeCwgeSwgejsgfTsKKyAgICAgICAgc3RydWN0IHsgZmxvYXQgcywgdCwgcjsgfTsKKyAgICAgICAgdmJhc2U8ZmxvYXQsIDI+IHh5OworICAgICAgICB2YmFzZTxmbG9hdCwgMj4gc3Q7CisgICAgfTsKKyAgICBpbmxpbmUgY29uc3QgZmxvYXQmIG9wZXJhdG9yW10oc2l6ZV90IGkpIGNvbnN0IHsgcmV0dXJuIHZbaV07IH0KKyAgICBpbmxpbmUgICAgICAgZmxvYXQmIG9wZXJhdG9yW10oc2l6ZV90IGkpICAgICAgIHsgcmV0dXJuIHZbaV07IH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCB2YmFzZTxmbG9hdCwgND4geworICAgIHVuaW9uIHsKKyAgICAgICAgZmxvYXQgdls0XTsKKyAgICAgICAgc3RydWN0IHsgZmxvYXQgeCwgeSwgeiwgdzsgfTsKKyAgICAgICAgc3RydWN0IHsgZmxvYXQgcywgdCwgciwgcTsgfTsKKyAgICAgICAgdmJhc2U8ZmxvYXQsIDM+IHh5ejsKKyAgICAgICAgdmJhc2U8ZmxvYXQsIDM+IHN0cjsKKyAgICAgICAgdmJhc2U8ZmxvYXQsIDI+IHh5OworICAgICAgICB2YmFzZTxmbG9hdCwgMj4gc3Q7CisgICAgfTsKKyAgICBpbmxpbmUgY29uc3QgZmxvYXQmIG9wZXJhdG9yW10oc2l6ZV90IGkpIGNvbnN0IHsgcmV0dXJuIHZbaV07IH0KKyAgICBpbmxpbmUgICAgICAgZmxvYXQmIG9wZXJhdG9yW10oc2l6ZV90IGkpICAgICAgIHsgcmV0dXJuIHZbaV07IH0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUWVBFLCBzaXplX3QgU0laRT4KK2NsYXNzIHZlYyA6IHB1YmxpYyB2YmFzZTxUWVBFLCBTSVpFPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZVRyYWl0czxUWVBFPjo6UGFyYW1ldGVyVHlwZSBwVFlQRTsKKyAgICB0eXBlZGVmIHZiYXNlPFRZUEUsIFNJWkU+IGJhc2U7CisKK3B1YmxpYzoKKyAgICAvLyBTVEwtbGlrZSBpbnRlcmZhY2UuCisgICAgdHlwZWRlZiBUWVBFIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBUWVBFJiByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBUWVBFIGNvbnN0JiBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworCisgICAgdHlwZWRlZiBUWVBFKiBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIFRZUEUgY29uc3QqIGNvbnN0X2l0ZXJhdG9yOworICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gYmFzZTo6djsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGJhc2U6OnYgKyBTSVpFOyB9CisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBiYXNlOjp2OyB9CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYmFzZTo6diArIFNJWkU7IH0KKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNJWkU7IH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gZGVmYXVsdCBjb25zdHJ1Y3RvcnMKKworICAgIHZlYygpIHsgfQorICAgIHZlYyhjb25zdCB2ZWMmIHJocykgIDogYmFzZShyaHMpIHsgfQorICAgIHZlYyhjb25zdCBiYXNlJiByaHMpIDogYmFzZShyaHMpIHsgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBjb252ZXJzaW9uIGNvbnN0cnVjdG9ycworCisgICAgdmVjKHBUWVBFIHJocykgeworICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPFNJWkUgOyBpKyspCisgICAgICAgICAgICBiYXNlOjpvcGVyYXRvcltdKGkpID0gcmhzOworICAgIH0KKworICAgIHRlbXBsYXRlIDwgdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IFM+IGNsYXNzIFZFQywgc2l6ZV90IFM+CisgICAgZXhwbGljaXQgdmVjKGNvbnN0IFZFQzxUWVBFLCBTPiYgcmhzKSB7CisgICAgICAgIGhlbHBlcnM6OmRvQXNzaWduKCp0aGlzLCByaHMpOworICAgIH0KKworICAgIGV4cGxpY2l0IHZlYyhUWVBFIGNvbnN0KiBhcnJheSkgeworICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPFNJWkUgOyBpKyspCisgICAgICAgICAgICBiYXNlOjpvcGVyYXRvcltdKGkpID0gYXJyYXlbaV07CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBBc3NpZ25tZW50CisKKyAgICB2ZWMmIG9wZXJhdG9yID0gKGNvbnN0IHZlYyYgcmhzKSB7CisgICAgICAgIGJhc2U6Om9wZXJhdG9yPShyaHMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdmVjJiBvcGVyYXRvciA9IChjb25zdCBiYXNlJiByaHMpIHsKKyAgICAgICAgYmFzZTo6b3BlcmF0b3I9KHJocyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2ZWMmIG9wZXJhdG9yID0gKHBUWVBFIHJocykgeworICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPFNJWkUgOyBpKyspCisgICAgICAgICAgICBiYXNlOjpvcGVyYXRvcltdKGkpID0gcmhzOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGUgPCB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgUz4gY2xhc3MgVkVDLCBzaXplX3QgUz4KKyAgICB2ZWMmIG9wZXJhdG9yID0gKGNvbnN0IFZFQzxUWVBFLCBTPiYgcmhzKSB7CisgICAgICAgIHJldHVybiBoZWxwZXJzOjpkb0Fzc2lnbigqdGhpcywgcmhzKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIG9wZXJhdGlvbi1hc3NpZ25tZW50CisKKyAgICB2ZWMmIG9wZXJhdG9yICs9IChjb25zdCB2ZWMmIHJocyk7CisgICAgdmVjJiBvcGVyYXRvciAtPSAoY29uc3QgdmVjJiByaHMpOworICAgIHZlYyYgb3BlcmF0b3IgKj0gKHBUWVBFIHJocyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIG5vbi1tZW1iZXIgZnVuY3Rpb24gZGVjbGFyYXRpb24gYW5kIGRlZmluaXRpb24KKyAgICAvLyBOT1RFOiB3ZSBkZWNsYXJlIHRoZSBub24tbWVtYmVyIGZ1bmN0aW9uIGFzIGZyaWVuZCBpbnNpZGUgdGhlIGNsYXNzCisgICAgLy8gc28gdGhhdCB0aGV5IGFyZSBrbm93biB0byB0aGUgY29tcGlsZXIgd2hlbiB0aGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkLgorICAgIC8vIFRoaXMgaGVscHMgdGhlIGNvbXBpbGVyIGRvaW5nIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiB3aGVuIHRoZQorICAgIC8vIHBhc3NlZCB0eXBlcyBhcmUgbm90IGlkZW50aWNhbC4gRXNzZW50aWFsbHkgdGhpcyBoZWxwcyB3aXRoCisgICAgLy8gdHlwZSBjb252ZXJzaW9uIHNvIHRoYXQgeW91IGNhbiBtdWx0aXBseSBhIHZlYzxmbG9hdD4gYnkgYW4gc2NhbGFyIGludAorICAgIC8vIChmb3IgaW5zdGFuY2UpLgorCisgICAgZnJpZW5kIGlubGluZSB2ZWMgUFVSRSBvcGVyYXRvciArIChjb25zdCB2ZWMmIGxocywgY29uc3QgdmVjJiByaHMpIHsKKyAgICAgICAgcmV0dXJuIGhlbHBlcnM6OmRvQWRkKGxocywgcmhzKTsKKyAgICB9CisgICAgZnJpZW5kIGlubGluZSB2ZWMgUFVSRSBvcGVyYXRvciAtIChjb25zdCB2ZWMmIGxocywgY29uc3QgdmVjJiByaHMpIHsKKyAgICAgICAgcmV0dXJuIGhlbHBlcnM6OmRvU3ViKGxocywgcmhzKTsKKyAgICB9CisgICAgZnJpZW5kIGlubGluZSB2ZWMgUFVSRSBvcGVyYXRvciAqIChjb25zdCB2ZWMmIGxocywgcFRZUEUgdikgeworICAgICAgICByZXR1cm4gaGVscGVyczo6ZG9NdWxTY2FsYXIobGhzLCB2KTsKKyAgICB9CisgICAgZnJpZW5kIGlubGluZSB2ZWMgUFVSRSBvcGVyYXRvciAqIChwVFlQRSB2LCBjb25zdCB2ZWMmIHJocykgeworICAgICAgICByZXR1cm4gaGVscGVyczo6ZG9TY2FsYXJNdWwodiwgcmhzKTsKKyAgICB9CisgICAgZnJpZW5kIGlubGluZSBUWVBFIFBVUkUgZG90X3Byb2R1Y3QoY29uc3QgdmVjJiBsaHMsIGNvbnN0IHZlYyYgcmhzKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpkb3RfcHJvZHVjdChsaHMsIHJocyk7CisgICAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEUsIHNpemVfdCBTSVpFPgordmVjPFRZUEUsIFNJWkU+JiB2ZWM8VFlQRSwgU0laRT46Om9wZXJhdG9yICs9IChjb25zdCB2ZWM8VFlQRSwgU0laRT4mIHJocykgeworICAgIHZlYzxUWVBFLCBTSVpFPiYgbGhzKCp0aGlzKTsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPFNJWkUgOyBpKyspCisgICAgICAgIGxoc1tpXSArPSByaHNbaV07CisgICAgcmV0dXJuIGxoczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEUsIHNpemVfdCBTSVpFPgordmVjPFRZUEUsIFNJWkU+JiB2ZWM8VFlQRSwgU0laRT46Om9wZXJhdG9yIC09IChjb25zdCB2ZWM8VFlQRSwgU0laRT4mIHJocykgeworICAgIHZlYzxUWVBFLCBTSVpFPiYgbGhzKCp0aGlzKTsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPFNJWkUgOyBpKyspCisgICAgICAgIGxoc1tpXSAtPSByaHNbaV07CisgICAgcmV0dXJuIGxoczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRZUEUsIHNpemVfdCBTSVpFPgordmVjPFRZUEUsIFNJWkU+JiB2ZWM8VFlQRSwgU0laRT46Om9wZXJhdG9yICo9ICh2ZWM8VFlQRSwgU0laRT46OnBUWVBFIHJocykgeworICAgIHZlYzxUWVBFLCBTSVpFPiYgbGhzKCp0aGlzKTsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPFNJWkUgOyBpKyspCisgICAgICAgIGxoc1tpXSAqPSByaHM7CisgICAgcmV0dXJuIGxoczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB2ZWM8ZmxvYXQsIDI+IHZlYzJfdDsKK3R5cGVkZWYgdmVjPGZsb2F0LCAzPiB2ZWMzX3Q7Cit0eXBlZGVmIHZlYzxmbG9hdCwgND4gdmVjNF90OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLyogQU5EUk9JRF9WRUNfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGY4ZDE0MjYuLjI5NWQ1NjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI0LDcgKzI0LDkgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQlJPQURDQVNUX1NUSUNLWSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFQ1VSRV9TRVRUSU5HUyIgLz4KLSAgICAKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlVQREFURV9ERVZJQ0VfU1RBVFMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfQVBQX1RPS0VOUyIgLz4KKwogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IDJiYzY4MjUuLjMwMmEyZDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpAQCAtMTUwLDcgKzE1MCw4IEBACiAgICAgICAgIFN0cmluZyBzZWNvbmRNb2NrU2VydmljZUNsYXNzTmFtZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKTsKIAogICAgICAgICAvLyBsb29rIGZvciB0aGUgdHdvIG1vY2sgc2VydmljZXMKLSAgICAgICAgZm9yIChTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA6IG1NYW5hZ2VyU2VydmljZS5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSkgeworICAgICAgICBmb3IgKEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvIDogbU1hbmFnZXJTZXJ2aWNlLmdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpKSB7CisgICAgICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IGluZm8uZ2V0UmVzb2x2ZUluZm8oKS5zZXJ2aWNlSW5mbzsKICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoc2VydmljZUluZm8ucGFja2FnZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDM4ZmVkMjIuLjE0NjNkMzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIAogaW1wb3J0IG9yZy5lYXN5bW9jay5JQXJndW1lbnRNYXRjaGVyOwogCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKQEAgLTYyLDIwICs2MywyMiBAQAogICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjcmVhdGUgYSBsaXN0IG9mIGluc3RhbGxlZCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIHRoZSBtb2NrIHNlcnZpY2UgcmV0dXJucwotICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBleHBlY3RlZFNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlSW5mbz4oKTsKLSAgICAgICAgU2VydmljZUluZm8gc2VydmljZUluZm8gPSBuZXcgU2VydmljZUluZm8oKTsKLSAgICAgICAgc2VydmljZUluZm8ubmFtZSA9ICJUZXN0U2VydmljZUluZm9OYW1lIjsKLSAgICAgICAgZXhwZWN0ZWRTZXJ2aWNlcy5hZGQoc2VydmljZUluZm8pOworICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gZXhwZWN0ZWRTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPigpOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gYWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOworICAgICAgICBhY2Nlc3NpYmlsaXR5U2VydmljZUluZm8ucGFja2FnZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsgImZvby5iYXIiIH07CisgICAgICAgIGV4cGVjdGVkU2VydmljZXMuYWRkKGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyk7CiAKICAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKICAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOwogICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOwotICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpLmFuZFJldHVybihleHBlY3RlZFNlcnZpY2VzKTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpKS5hbmRSZXR1cm4oCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRTZXJ2aWNlcyk7CiAgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CiAKICAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAogICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7Ci0gICAgICAgIExpc3Q8U2VydmljZUluZm8+IHJlY2VpdmVkU2VydmljZXMgPSBtYW5hZ2VyLmdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOworICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gcmVjZWl2ZWRTZXJ2aWNlcyA9CisgICAgICAgICAgICBtYW5hZ2VyLmdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOwogCiAgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdCAobGlzdCBlcXVhbHMoKSBjb21wYXJlcyBpdCBjb250ZW50cyBhcyB3ZWxsKQogICAgICAgICBhc3NlcnRFcXVhbHMoIkFsbCBleHBlY3RlZCBzZXJ2aWNlcyBtdXN0IGJlIHJldHVybmVkIiwgcmVjZWl2ZWRTZXJ2aWNlcywgZXhwZWN0ZWRTZXJ2aWNlcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQnJvYWRjYXN0SW50ZXJjZXB0aW5nQ29udGV4dC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0Jyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTg4NzkzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0Jyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCisvKioKKyAqIHtAbGluayBDb250ZXh0V3JhcHBlcn0gdGhhdCBjYW4gYXR0YWNoIGxpc3RlbmVycyBmb3IgdXBjb21pbmcKKyAqIHtAbGluayBDb250ZXh0I3NlbmRCcm9hZGNhc3QoSW50ZW50KX0uCisgKi8KK3B1YmxpYyBjbGFzcyBCcm9hZGNhc3RJbnRlcmNlcHRpbmdDb250ZXh0IGV4dGVuZHMgQ29udGV4dFdyYXBwZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2F0Y2hpbmdDb250ZXh0IjsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxCcm9hZGNhc3RJbnRlcmNlcHRvcj4gbUludGVyY2VwdG9ycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgcHVibGljIGNsYXNzIEJyb2FkY2FzdEludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RGdXR1cmU8SW50ZW50PiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyOworICAgICAgICBwcml2YXRlIGZpbmFsIEludGVudEZpbHRlciBtRmlsdGVyOworCisgICAgICAgIHB1YmxpYyBCcm9hZGNhc3RJbnRlcmNlcHRvcihCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlciwgSW50ZW50RmlsdGVyIGZpbHRlcikgeworICAgICAgICAgICAgbVJlY2VpdmVyID0gcmVjZWl2ZXI7CisgICAgICAgICAgICBtRmlsdGVyID0gZmlsdGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hCcm9hZGNhc3QoSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgaWYgKG1GaWx0ZXIubWF0Y2goZ2V0Q29udGVudFJlc29sdmVyKCksIGludGVudCwgZmFsc2UsIFRBRykgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1SZWNlaXZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IEJyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQudGhpczsKKyAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyLm9uUmVjZWl2ZShjb250ZXh0LCBpbnRlbnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0KGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQoQ29udGV4dCBiYXNlKSB7CisgICAgICAgIHN1cGVyKGJhc2UpOworICAgIH0KKworICAgIHB1YmxpYyBGdXR1cmU8SW50ZW50PiBuZXh0QnJvYWRjYXN0SW50ZW50KFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIG5leHRCcm9hZGNhc3RJbnRlbnQobmV3IEludGVudEZpbHRlcihhY3Rpb24pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRnV0dXJlPEludGVudD4gbmV4dEJyb2FkY2FzdEludGVudChJbnRlbnRGaWx0ZXIgZmlsdGVyKSB7CisgICAgICAgIGZpbmFsIEJyb2FkY2FzdEludGVyY2VwdG9yIGludGVyY2VwdG9yID0gbmV3IEJyb2FkY2FzdEludGVyY2VwdG9yKG51bGwsIGZpbHRlcik7CisgICAgICAgIHN5bmNocm9uaXplZCAobUludGVyY2VwdG9ycykgeworICAgICAgICAgICAgbUludGVyY2VwdG9ycy5hZGQoaW50ZXJjZXB0b3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRlcmNlcHRvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW50ZW50IHJlZ2lzdGVyUmVjZWl2ZXIoQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIsIEludGVudEZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtSW50ZXJjZXB0b3JzKSB7CisgICAgICAgICAgICBtSW50ZXJjZXB0b3JzLmFkZChuZXcgQnJvYWRjYXN0SW50ZXJjZXB0b3IocmVjZWl2ZXIsIGZpbHRlcikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRlbnQgcmVnaXN0ZXJSZWNlaXZlcihCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlciwgSW50ZW50RmlsdGVyIGZpbHRlciwKKyAgICAgICAgICAgIFN0cmluZyBicm9hZGNhc3RQZXJtaXNzaW9uLCBIYW5kbGVyIHNjaGVkdWxlcikgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUmVjZWl2ZXIoQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtSW50ZXJjZXB0b3JzKSB7CisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxCcm9hZGNhc3RJbnRlcmNlcHRvcj4gaSA9IG1JbnRlcmNlcHRvcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEJyb2FkY2FzdEludGVyY2VwdG9yIGludGVyY2VwdG9yID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyLmVxdWFscyhpbnRlcmNlcHRvci5tUmVjZWl2ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VuZEJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUludGVyY2VwdG9ycykgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8QnJvYWRjYXN0SW50ZXJjZXB0b3I+IGkgPSBtSW50ZXJjZXB0b3JzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBCcm9hZGNhc3RJbnRlcmNlcHRvciBpbnRlcmNlcHRvciA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChpbnRlcmNlcHRvci5kaXNwYXRjaEJyb2FkY2FzdChpbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VuZFN0aWNreUJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTdGlja3lCcm9hZGNhc3QoSW50ZW50IGludGVudCkgeworICAgICAgICAvLyBpZ25vcmVkCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1MmNkZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5QT0xJQ1lfTk9ORTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuUE9MSUNZX1JFSkVDVF9QQUlEX0JBQ0tHUk9VTkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLlJVTEVfQUxMT1dfQUxMOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5SVUxFX1JFSkVDVF9QQUlEOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suY2FwdHVyZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmNyZWF0ZU1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdExhc3RDYWxsOworCitpbXBvcnQgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JUHJvY2Vzc09ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtQb2xpY3lMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5JTmV0d29ya1N0YXRzU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklQb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU3VwcHJlc3M7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZTsKKworaW1wb3J0IG9yZy5lYXN5bW9jay5DYXB0dXJlOworaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIE5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZX0uCisgKi8KK0BMYXJnZVRlc3QKK3B1YmxpYyBjbGFzcyBOZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZVRlc3QiOworCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RJbnRlcmNlcHRpbmdDb250ZXh0IG1TZXJ2aWNlQ29udGV4dDsKKworICAgIHByaXZhdGUgSUFjdGl2aXR5TWFuYWdlciBtQWN0aXZpdHlNYW5hZ2VyOworICAgIHByaXZhdGUgSVBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOworICAgIHByaXZhdGUgSU5ldHdvcmtTdGF0c1NlcnZpY2UgbVN0YXRzU2VydmljZTsKKyAgICBwcml2YXRlIElOZXR3b3JrUG9saWN5TGlzdGVuZXIgbVBvbGljeUxpc3RlbmVyOworCisgICAgcHJpdmF0ZSBOZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2UgbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBJUHJvY2Vzc09ic2VydmVyIG1Qcm9jZXNzT2JzZXJ2ZXI7CisKKyAgICBwcml2YXRlIEJpbmRlciBtU3R1YkJpbmRlciA9IG5ldyBCaW5kZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVSURfQSA9IDgwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVUlEX0IgPSA4MDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElEXzEgPSA0MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJRF8yID0gNDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSURfMyA9IDQwMjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgLy8gaW50ZXJjZXB0IHZhcmlvdXMgYnJvYWRjYXN0cywgYW5kIHByZXRlbmQgdGhhdCB1aWRzIGhhdmUgcGFja2FnZXMKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0ID0gbmV3IEJyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQoZ2V0Q29udGV4dCgpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1vY2tQYWNrYWdlTWFuYWdlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYWNrYWdlc0ZvclVpZChpbnQgdWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgImNvbS5leGFtcGxlIiB9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyID0gY3JlYXRlTW9jayhJQWN0aXZpdHlNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgbVBvd2VyTWFuYWdlciA9IGNyZWF0ZU1vY2soSVBvd2VyTWFuYWdlci5jbGFzcyk7CisgICAgICAgIG1TdGF0c1NlcnZpY2UgPSBjcmVhdGVNb2NrKElOZXR3b3JrU3RhdHNTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgbVBvbGljeUxpc3RlbmVyID0gY3JlYXRlTW9jayhJTmV0d29ya1BvbGljeUxpc3RlbmVyLmNsYXNzKTsKKworICAgICAgICBtU2VydmljZSA9IG5ldyBOZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2UoCisgICAgICAgICAgICAgICAgbVNlcnZpY2VDb250ZXh0LCBtQWN0aXZpdHlNYW5hZ2VyLCBtUG93ZXJNYW5hZ2VyLCBtU3RhdHNTZXJ2aWNlKTsKKworICAgICAgICAvLyBSZW1vdGVDYWxsYmFja0xpc3QgbmVlZHMgYSBiaW5kZXIgdG8gdXNlIGFzIGtleQorICAgICAgICBleHBlY3QobVBvbGljeUxpc3RlbmVyLmFzQmluZGVyKCkpLmFuZFJldHVybihtU3R1YkJpbmRlcikuYXRMZWFzdE9uY2UoKTsKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlLnJlZ2lzdGVyTGlzdGVuZXIobVBvbGljeUxpc3RlbmVyKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBjYXRjaCB0aGUgcmVnaXN0ZXJlZCBJUHJvY2Vzc09ic2VydmVyIGR1cmluZyBzeXN0ZW1SZWFkeSgpCisgICAgICAgIGZpbmFsIENhcHR1cmU8SVByb2Nlc3NPYnNlcnZlcj4gcHJvY2Vzc09ic2VydmVyID0gbmV3IENhcHR1cmU8SVByb2Nlc3NPYnNlcnZlcj4oKTsKKyAgICAgICAgbUFjdGl2aXR5TWFuYWdlci5yZWdpc3RlclByb2Nlc3NPYnNlcnZlcihjYXB0dXJlKHByb2Nlc3NPYnNlcnZlcikpOworICAgICAgICBleHBlY3RMYXN0Q2FsbCgpLmF0TGVhc3RPbmNlKCk7CisKKyAgICAgICAgLy8gZXhwZWN0IHRvIGFuc3dlciBzY3JlZW4gc3RhdHVzIGR1cmluZyBzeXN0ZW1SZWFkeSgpCisgICAgICAgIGV4cGVjdChtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkuYW5kUmV0dXJuKHRydWUpLmF0TGVhc3RPbmNlKCk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlLnN5c3RlbVJlYWR5KCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlciA9IHByb2Nlc3NPYnNlcnZlci5nZXRWYWx1ZSgpOworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0ID0gbnVsbDsKKworICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgbVBvd2VyTWFuYWdlciA9IG51bGw7CisgICAgICAgIG1TdGF0c1NlcnZpY2UgPSBudWxsOworICAgICAgICBtUG9saWN5TGlzdGVuZXIgPSBudWxsOworCisgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlciA9IG51bGw7CisKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3MKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9saWN5Q2hhbmdlVHJpZ2dlcnNCcm9hZGNhc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVNlcnZpY2Uuc2V0VWlkUG9saWN5KFVJRF9BLCBQT0xJQ1lfTk9ORSk7CisKKyAgICAgICAgLy8gY2hhbmdlIGJhY2tncm91bmQgcG9saWN5IGFuZCBleHBlY3QgYnJvYWRjYXN0CisgICAgICAgIGZpbmFsIEZ1dHVyZTxJbnRlbnQ+IGJhY2tncm91bmRDaGFuZ2VkID0gbVNlcnZpY2VDb250ZXh0Lm5leHRCcm9hZGNhc3RJbnRlbnQoCisgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5BQ1RJT05fQkFDS0dST1VORF9EQVRBX1NFVFRJTkdfQ0hBTkdFRCk7CisKKyAgICAgICAgbVNlcnZpY2Uuc2V0VWlkUG9saWN5KFVJRF9BLCBQT0xJQ1lfUkVKRUNUX1BBSURfQkFDS0dST1VORCk7CisKKyAgICAgICAgYmFja2dyb3VuZENoYW5nZWQuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBpZEZvcmVncm91bmRDb21iaW5lZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBwdXNoIGFsbCB1aWQgaW50byBiYWNrZ3JvdW5kCisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzEsIFVJRF9BLCBmYWxzZSk7CisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzIsIFVJRF9BLCBmYWxzZSk7CisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzMsIFVJRF9CLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmlzVWlkRm9yZWdyb3VuZChVSURfQSkpOworICAgICAgICBhc3NlcnRGYWxzZShtU2VydmljZS5pc1VpZEZvcmVncm91bmQoVUlEX0IpKTsKKworICAgICAgICAvLyBwdXNoIG9uZSBvZiB0aGUgc2hhcmVkIHBpZHMgaW50byBmb3JlZ3JvdW5kCisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzIsIFVJRF9BLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtU2VydmljZS5pc1VpZEZvcmVncm91bmQoVUlEX0EpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVNlcnZpY2UuaXNVaWRGb3JlZ3JvdW5kKFVJRF9CKSk7CisKKyAgICAgICAgLy8gYW5kIHN3YXAgYW5vdGhlciB1aWQgaW50byBmb3JlZ3JvdW5kCisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzIsIFVJRF9BLCBmYWxzZSk7CisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzMsIFVJRF9CLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVNlcnZpY2UuaXNVaWRGb3JlZ3JvdW5kKFVJRF9BKSk7CisgICAgICAgIGFzc2VydFRydWUobVNlcnZpY2UuaXNVaWRGb3JlZ3JvdW5kKFVJRF9CKSk7CisKKyAgICAgICAgLy8gcHVzaCBib3RoIHBpZCBpbnRvIGZvcmVncm91bmQKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlci5vbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChQSURfMSwgVUlEX0EsIHRydWUpOworICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8yLCBVSURfQSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobVNlcnZpY2UuaXNVaWRGb3JlZ3JvdW5kKFVJRF9BKSk7CisKKyAgICAgICAgLy8gcHVsbCBvbmUgb3V0LCBzaG91bGQgc3RpbGwgYmUgZm9yZWdyb3VuZAorICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8xLCBVSURfQSwgZmFsc2UpOworICAgICAgICBhc3NlcnRUcnVlKG1TZXJ2aWNlLmlzVWlkRm9yZWdyb3VuZChVSURfQSkpOworCisgICAgICAgIC8vIHB1bGwgZmluYWwgcGlkIG91dCwgc2hvdWxkIG5vdyBiZSBiYWNrZ3JvdW5kCisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzIsIFVJRF9BLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmlzVWlkRm9yZWdyb3VuZChVSURfQSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5DaGFuZ2VzUnVsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHVzaCBzdHJpY3QgcG9saWN5IGZvciBmb3JlZ3JvdW5kIHVpZCwgdmVyaWZ5IEFMTE9XIHJ1bGUKKyAgICAgICAgZXhwZWN0UnVsZXNDaGFuZ2VkKFVJRF9BLCBSVUxFX0FMTE9XX0FMTCk7CisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8xLCBVSURfQSwgdHJ1ZSk7CisgICAgICAgIG1TZXJ2aWNlLnNldFVpZFBvbGljeShVSURfQSwgUE9MSUNZX1JFSkVDVF9QQUlEX0JBQ0tHUk9VTkQpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIC8vIG5vdyB0dXJuIHNjcmVlbiBvZmYgYW5kIHZlcmlmeSBSRUpFQ1QgcnVsZQorICAgICAgICBleHBlY3QobVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLmFuZFJldHVybihmYWxzZSkuYXRMZWFzdE9uY2UoKTsKKyAgICAgICAgZXhwZWN0UnVsZXNDaGFuZ2VkKFVJRF9BLCBSVUxFX1JFSkVDVF9QQUlEKTsKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKSk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gYW5kIHR1cm4gc2NyZWVuIGJhY2sgb24sIHZlcmlmeSBBTExPVyBydWxlIHJlc3RvcmVkCisgICAgICAgIGV4cGVjdChtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkuYW5kUmV0dXJuKHRydWUpLmF0TGVhc3RPbmNlKCk7CisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9BTExPV19BTEwpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChJbnRlbnQuQUNUSU9OX1NDUkVFTl9PTikpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQb2xpY3lOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFBPTElDWV9OT05FIHNob3VsZCBSVUxFX0FMTE9XIGluIGZvcmVncm91bmQKKyAgICAgICAgZXhwZWN0UnVsZXNDaGFuZ2VkKFVJRF9BLCBSVUxFX0FMTE9XX0FMTCk7CisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZS5zZXRVaWRQb2xpY3koVUlEX0EsIFBPTElDWV9OT05FKTsKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlci5vbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChQSURfMSwgVUlEX0EsIHRydWUpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIC8vIFBPTElDWV9OT05FIHNob3VsZCBSVUxFX0FMTE9XIGluIGJhY2tncm91bmQKKyAgICAgICAgZXhwZWN0UnVsZXNDaGFuZ2VkKFVJRF9BLCBSVUxFX0FMTE9XX0FMTCk7CisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8xLCBVSURfQSwgZmFsc2UpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQb2xpY3lSZWplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUE9MSUNZX1JFSkVDVCBzaG91bGQgUlVMRV9BTExPVyBpbiBiYWNrZ3JvdW5kCisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9SRUpFQ1RfUEFJRCk7CisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZS5zZXRVaWRQb2xpY3koVUlEX0EsIFBPTElDWV9SRUpFQ1RfUEFJRF9CQUNLR1JPVU5EKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBQT0xJQ1lfUkVKRUNUIHNob3VsZCBSVUxFX0FMTE9XIGluIGZvcmVncm91bmQKKyAgICAgICAgZXhwZWN0UnVsZXNDaGFuZ2VkKFVJRF9BLCBSVUxFX0FMTE9XX0FMTCk7CisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8xLCBVSURfQSwgdHJ1ZSk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gUE9MSUNZX1JFSkVDVCBzaG91bGQgUlVMRV9SRUpFQ1QgaW4gYmFja2dyb3VuZAorICAgICAgICBleHBlY3RSdWxlc0NoYW5nZWQoVUlEX0EsIFJVTEVfUkVKRUNUX1BBSUQpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlci5vbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChQSURfMSwgVUlEX0EsIGZhbHNlKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9saWN5UmVqZWN0QWRkUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFBPTElDWV9OT05FIHNob3VsZCBoYXZlIFJVTEVfQUxMT1cgaW4gYmFja2dyb3VuZAorICAgICAgICBleHBlY3RSdWxlc0NoYW5nZWQoVUlEX0EsIFJVTEVfQUxMT1dfQUxMKTsKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlLnNldFVpZFBvbGljeShVSURfQSwgUE9MSUNZX05PTkUpOworICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8xLCBVSURfQSwgZmFsc2UpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIC8vIGFkZGluZyBQT0xJQ1lfUkVKRUNUIHNob3VsZCBjYXVzZSBSVUxFX1JFSkVDVAorICAgICAgICBleHBlY3RSdWxlc0NoYW5nZWQoVUlEX0EsIFJVTEVfUkVKRUNUX1BBSUQpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2Uuc2V0VWlkUG9saWN5KFVJRF9BLCBQT0xJQ1lfUkVKRUNUX1BBSURfQkFDS0dST1VORCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gcmVtb3ZpbmcgUE9MSUNZX1JFSkVDVCBzaG91bGQgcmV0dXJuIHVzIHRvIFJVTEVfQUxMT1cKKyAgICAgICAgZXhwZWN0UnVsZXNDaGFuZ2VkKFVJRF9BLCBSVUxFX0FMTE9XX0FMTCk7CisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZS5zZXRVaWRQb2xpY3koVUlEX0EsIFBPTElDWV9OT05FKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0UnVsZXNDaGFuZ2VkKGludCB1aWQsIGludCBwb2xpY3kpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtUG9saWN5TGlzdGVuZXIub25SdWxlc0NoYW5nZWQoZXEodWlkKSwgZXEocG9saWN5KSk7CisgICAgICAgIGV4cGVjdExhc3RDYWxsKCkuYXRMZWFzdE9uY2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVwbGF5KCkgeworICAgICAgICBFYXN5TW9jay5yZXBsYXkobUFjdGl2aXR5TWFuYWdlciwgbVBvd2VyTWFuYWdlciwgbVN0YXRzU2VydmljZSwgbVBvbGljeUxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5QW5kUmVzZXQoKSB7CisgICAgICAgIEVhc3lNb2NrLnZlcmlmeShtQWN0aXZpdHlNYW5hZ2VyLCBtUG93ZXJNYW5hZ2VyLCBtU3RhdHNTZXJ2aWNlLCBtUG9saWN5TGlzdGVuZXIpOworICAgICAgICBFYXN5TW9jay5yZXNldChtQWN0aXZpdHlNYW5hZ2VyLCBtUG93ZXJNYW5hZ2VyLCBtU3RhdHNTZXJ2aWNlLCBtUG9saWN5TGlzdGVuZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2VUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IGNhMzNkMzIuLmQxZWU0ZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2VUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZVRlc3QuamF2YQpAQCAtMjUsMTQgKzI1LDkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlc2V0OwogaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sudmVyaWZ5OwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmU7Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtNYW5hZ2VtZW50RXZlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVGhyb3R0bGVNYW5hZ2VyOwpAQCAtNDgsOCArNDMsNiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlRydXN0ZWRUaW1lOwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKIAogLyoqCkBAIC02Niw3ICs1OSw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JRkFDRSA9ICJ0ZXN0MCI7CiAKLSAgICBwcml2YXRlIFdhdGNoaW5nQ29udGV4dCBtV2F0Y2hpbmdDb250ZXh0OworICAgIHByaXZhdGUgQnJvYWRjYXN0SW50ZXJjZXB0aW5nQ29udGV4dCBtV2F0Y2hpbmdDb250ZXh0OwogICAgIHByaXZhdGUgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBtTW9ja05NU2VydmljZTsKICAgICBwcml2YXRlIFRydXN0ZWRUaW1lIG1Nb2NrVGltZTsKIApAQCAtNzYsNyArNjksNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAKLSAgICAgICAgbVdhdGNoaW5nQ29udGV4dCA9IG5ldyBXYXRjaGluZ0NvbnRleHQoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVdhdGNoaW5nQ29udGV4dCA9IG5ldyBCcm9hZGNhc3RJbnRlcmNlcHRpbmdDb250ZXh0KGdldENvbnRleHQoKSk7CiAKICAgICAgICAgbU1vY2tOTVNlcnZpY2UgPSBjcmVhdGVNb2NrKElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuY2xhc3MpOwogICAgICAgICBtTW9ja1RpbWUgPSBjcmVhdGVNb2NrKFRydXN0ZWRUaW1lLmNsYXNzKTsKQEAgLTM1NCw2OSArMzQ3LDQgQEAKIAogICAgICAgICBwb2xsQWN0aW9uLmdldCgpOwogICAgIH0KLQotCi0gICAgLyoqCi0gICAgICoge0BsaW5rIENvbnRleHRXcmFwcGVyfSB0aGF0IGNhbiBhdHRhY2ggbGlzdGVuZXJzIGZvciB1cGNvbWluZwotICAgICAqIHtAbGluayBDb250ZXh0I3NlbmRCcm9hZGNhc3QoSW50ZW50KX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2F0Y2hpbmdDb250ZXh0IGV4dGVuZHMgQ29udGV4dFdyYXBwZXIgewotICAgICAgICBwcml2YXRlIExpc3Q8TG9jYWxCcm9hZGNhc3RSZWNlaXZlcj4gbVJlY2VpdmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotCi0gICAgICAgIHB1YmxpYyBjbGFzcyBMb2NhbEJyb2FkY2FzdFJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RGdXR1cmU8SW50ZW50PiB7Ci0gICAgICAgICAgICBwcml2YXRlIEludGVudEZpbHRlciBtRmlsdGVyOwotCi0gICAgICAgICAgICBwdWJsaWMgTG9jYWxCcm9hZGNhc3RSZWNlaXZlcihJbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgbUZpbHRlciA9IGZpbHRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hCcm9hZGNhc3QoSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgICAgIGlmIChtRmlsdGVyLm1hdGNoKGdldENvbnRlbnRSZXNvbHZlcigpLCBpbnRlbnQsIGZhbHNlLCBUQUcpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzZXQoaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXYXRjaGluZ0NvbnRleHQoQ29udGV4dCBiYXNlKSB7Ci0gICAgICAgICAgICBzdXBlcihiYXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGdXR1cmU8SW50ZW50PiBuZXh0QnJvYWRjYXN0SW50ZW50KFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBuZXh0QnJvYWRjYXN0SW50ZW50KG5ldyBJbnRlbnRGaWx0ZXIoYWN0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRnV0dXJlPEludGVudD4gbmV4dEJyb2FkY2FzdEludGVudChJbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgICAgICBmaW5hbCBMb2NhbEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIoZmlsdGVyKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY2VpdmVycykgewotICAgICAgICAgICAgICAgIG1SZWNlaXZlcnMuYWRkKHJlY2VpdmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZWNlaXZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZW5kQnJvYWRjYXN0KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY2VpdmVycykgewotICAgICAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPExvY2FsQnJvYWRjYXN0UmVjZWl2ZXI+IGkgPSBtUmVjZWl2ZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyLmRpc3BhdGNoQnJvYWRjYXN0KGludGVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2VuZFN0aWNreUJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBzZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlU3RpY2t5QnJvYWRjYXN0KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZWQKLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1NlcnZpY2VTdGF0ZS5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU2VydmljZVN0YXRlLmphdmEKaW5kZXggYmEwNTgzNy4uZmNlN2NkYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU2VydmljZVN0YXRlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU2VydmljZVN0YXRlLmphdmEKQEAgLTM4Nyw2MiArMzg3LDc3IEBACiAgICAgICAgICAgICAgICAgJiYgbUlzRW1lcmdlbmN5T25seSA9PSBzLm1Jc0VtZXJnZW5jeU9ubHkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnZlcnQgcmFkaW8gdGVjaG5vbG9neSB0byBTdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSByYWRpb1RlY2hub2xvZ3kKKyAgICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgUkFUCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJhZGlvVGVjaG5vbG9neVRvU3RyaW5nKGludCBydCkgeworICAgICAgICBTdHJpbmcgcnRTdHJpbmc7CisKKyAgICAgICAgc3dpdGNoKHJ0KSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiVW5rbm93biI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiR1BSUyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiRURHRSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiVU1UUyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiQ0RNQS1JUzk1QSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiQ0RNQS1JUzk1QiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiMXhSVFQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIHJ0U3RyaW5nID0gIkV2RG8tcmV2LjAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIHJ0U3RyaW5nID0gIkV2RG8tcmV2LkEiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgIHJ0U3RyaW5nID0gIkhTRFBBIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiSFNVUEEiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJIU1BBIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiRXZEby1yZXYuQiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgIHJ0U3RyaW5nID0gImVIUlBEIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiTFRFIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiSFNQQVAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJVbmV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVW5leHBlY3RlZCByYWRpb1RlY2hub2xvZ3k9IiArIHJ0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnRTdHJpbmcgKyAiOiIgKyBydDsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgcmFkaW9UZWNobm9sb2d5ID0gbmV3IFN0cmluZygiRXJyb3IgaW4gcmFkaW9UZWNobm9sb2d5Iik7Ci0gICAgICAgIHN3aXRjaCh0aGlzLm1SYWRpb1RlY2hub2xvZ3kpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gIlVua25vd24iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJHUFJTIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiRURHRSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gIlVNVFMiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJJUzk1QSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gIklTOTVCIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiMXhSVFQiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJFdkRvIHJldi4gMCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gIkV2RG8gcmV2LiBBIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiSFNEUEEiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiSFNVUEEiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiSFNQQSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJFdkRvIHJldi4gQiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJlSFJQRCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJMVEUiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiSFNQQVAiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAibVJhZGlvVGVjaG5vbG9neSB2YXJpYWJsZSBvdXQgb2YgcmFuZ2UuIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIFN0cmluZyByYWRpb1RlY2hub2xvZ3kgPSByYWRpb1RlY2hub2xvZ3lUb1N0cmluZyhtUmFkaW9UZWNobm9sb2d5KTsKIAogICAgICAgICByZXR1cm4gKG1TdGF0ZSArICIgIiArIChtUm9hbWluZyA/ICJyb2FtaW5nIiA6ICJob21lIikKICAgICAgICAgICAgICAgICArICIgIiArIG1PcGVyYXRvckFscGhhTG9uZwpAQCAtNTUxLDcgKzU2Niw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENkbWFFcmlUZXh0KFN0cmluZyBsb25nTmFtZSkgeworICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdG9yQWxwaGFMb25nKFN0cmluZyBsb25nTmFtZSkgewogICAgICAgICBtT3BlcmF0b3JBbHBoYUxvbmcgPSBsb25nTmFtZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zQ2JNZXNzYWdlLmphdmEKaW5kZXggMzU0MzI3NS4uNTYwODQwMiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zQ2JNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zQ2JNZXNzYWdlLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueTsKIAoraW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TbXNDYkhlYWRlcjsKIApAQCAtNTgsMTAgKzYwLDEzIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFNtc0NiTWVzc2FnZShwZHUpOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkZhaWxlZCBwYXJzaW5nIFNNUy1DQiBwZHUiLCBlKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU01TQ0IiOworCiAgICAgLyoqCiAgICAgICogTGFuZ3VhZ2VzIGluIHRoZSAwMDAweHh4eCBEQ1MgZ3JvdXAgYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzOCwgc2VjdGlvbiA1LgogICAgICAqLwpAQCAtODAsNiArODUsOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBDQVJSSUFHRV9SRVRVUk4gPSAweDBkOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9CT0RZX1BBR0VfTEVOR1RIID0gODI7CisKICAgICBwcml2YXRlIFNtc0NiSGVhZGVyIG1IZWFkZXI7CiAKICAgICBwcml2YXRlIFN0cmluZyBtTGFuZ3VhZ2U7CkBAIC0xNDksNiArMTU2LDEzIEBACiAgICAgICAgIHJldHVybiBtSGVhZGVyLnVwZGF0ZU51bWJlcjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbmQgdW5wYWNrIHRoZSBib2R5IHRleHQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBpbiB0aGUgRENTLgorICAgICAqIEFmdGVyIGNvbXBsZXRpbmcgc3VjY2Vzc2Z1bGx5IHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBhc3NpZ25lZCB0aGUgYm9keQorICAgICAqIHRleHQgaW50byBtQm9keSwgYW5kIG9wdGlvbmFsbHkgdGhlIGxhbmd1YWdlIGNvZGUgaW50byBtTGFuZ3VhZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBwZHUgVGhlIHBkdQorICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBwYXJzZUJvZHkoYnl0ZVtdIHBkdSkgewogICAgICAgICBpbnQgZW5jb2Rpbmc7CiAgICAgICAgIGJvb2xlYW4gaGFzTGFuZ3VhZ2VJbmRpY2F0b3IgPSBmYWxzZTsKQEAgLTIyMSwyOCArMjM1LDgxIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUhlYWRlci5mb3JtYXQgPT0gU21zQ2JIZWFkZXIuRk9STUFUX1VNVFMpIHsKKyAgICAgICAgICAgIC8vIFBheWxvYWQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgcGFnZXMKKyAgICAgICAgICAgIGludCBuclBhZ2VzID0gcGR1W1Ntc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIXTsKKworICAgICAgICAgICAgaWYgKHBkdS5sZW5ndGggPCBTbXNDYkhlYWRlci5QRFVfSEVBREVSX0xFTkdUSCArIDEgKyAoUERVX0JPRFlfUEFHRV9MRU5HVEggKyAxKQorICAgICAgICAgICAgICAgICAgICAqIG5yUGFnZXMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQZHUgbGVuZ3RoICIgKyBwZHUubGVuZ3RoICsgIiBkb2VzIG5vdCBtYXRjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5yUGFnZXMgKyAiIHBhZ2VzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yUGFnZXM7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIEVhY2ggcGFnZSBpcyA4MiBieXRlcyBmb2xsb3dlZCBieSBhIGxlbmd0aCBvY3RldCBpbmRpY2F0aW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIG51bWJlciBvZiB1c2VmdWwgb2N0ZXRzIHdpdGhpbiB0aG9zZSA4MgorICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBTbXNDYkhlYWRlci5QRFVfSEVBREVSX0xFTkdUSCArIDEgKyAoUERVX0JPRFlfUEFHRV9MRU5HVEggKyAxKSAqIGk7CisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHBkdVtvZmZzZXQgKyBQRFVfQk9EWV9QQUdFX0xFTkdUSF07CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gUERVX0JPRFlfUEFHRV9MRU5HVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFnZSBsZW5ndGggIiArIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleGNlZWRzIG1heGltdW0gdmFsdWUgIiArIFBEVV9CT0RZX1BBR0VfTEVOR1RIKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodW5wYWNrQm9keShwZHUsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCwgaGFzTGFuZ3VhZ2VJbmRpY2F0b3IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Cb2R5ID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBheWxvYWQgaXMgb25lIHNpbmdsZSBwYWdlCisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEg7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcGR1Lmxlbmd0aCAtIG9mZnNldDsKKworICAgICAgICAgICAgbUJvZHkgPSB1bnBhY2tCb2R5KHBkdSwgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoLCBoYXNMYW5ndWFnZUluZGljYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnBhY2sgYm9keSB0ZXh0IGZyb20gdGhlIHBkdSB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcsIHBvc2l0aW9uIGFuZAorICAgICAqIGxlbmd0aCB3aXRoaW4gdGhlIHBkdQorICAgICAqCisgICAgICogQHBhcmFtIHBkdSBUaGUgcGR1CisgICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZywgYXMgZGVyaXZlZCBmcm9tIHRoZSBEQ1MKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIHRvIHVucGFjaworICAgICAqIEBwYXJhbSBsZW5ndGggTnVtYmVyIG9mIGJ5dGVzIHRvIHVucGFjaworICAgICAqIEBwYXJhbSBoYXNMYW5ndWFnZUluZGljYXRvciB0cnVlIGlmIHRoZSBib2R5IHRleHQgaXMgcHJlY2VkZWQgYnkgYQorICAgICAqICAgICAgICAgICAgbGFuZ3VhZ2UgaW5kaWNhdG9yLiBJZiBzbywgdGhpcyBtZXRob2Qgd2lsbCBhcyBhIHNpZGUtZWZmZWN0CisgICAgICogICAgICAgICAgICBhc3NpZ24gdGhlIGV4dHJhY3RlZCBsYW5ndWFnZSBjb2RlIGludG8gbUxhbmd1YWdlCisgICAgICogQHJldHVybiBCb2R5IHRleHQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1bnBhY2tCb2R5KGJ5dGVbXSBwZHUsIGludCBlbmNvZGluZywgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzTGFuZ3VhZ2VJbmRpY2F0b3IpIHsKKyAgICAgICAgU3RyaW5nIGJvZHkgPSBudWxsOworCiAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKICAgICAgICAgICAgIGNhc2UgU21zTWVzc2FnZS5FTkNPRElOR183QklUOgotICAgICAgICAgICAgICAgIG1Cb2R5ID0gR3NtQWxwaGFiZXQuZ3NtN0JpdFBhY2tlZFRvU3RyaW5nKHBkdSwgU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAocGR1Lmxlbmd0aCAtIFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIKSAqIDggLyA3KTsKKyAgICAgICAgICAgICAgICBib2R5ID0gR3NtQWxwaGFiZXQuZ3NtN0JpdFBhY2tlZFRvU3RyaW5nKHBkdSwgb2Zmc2V0LCBsZW5ndGggKiA4IC8gNyk7CiAKLSAgICAgICAgICAgICAgICBpZiAoaGFzTGFuZ3VhZ2VJbmRpY2F0b3IgJiYgbUJvZHkgIT0gbnVsbCAmJiBtQm9keS5sZW5ndGgoKSA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhbmd1YWdlID0gbUJvZHkuc3Vic3RyaW5nKDAsIDIpOwotICAgICAgICAgICAgICAgICAgICBtQm9keSA9IG1Cb2R5LnN1YnN0cmluZygzKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFzTGFuZ3VhZ2VJbmRpY2F0b3IgJiYgYm9keSAhPSBudWxsICYmIGJvZHkubGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExhbmd1YWdlIGlzIHR3byBHU00gY2hhcmFjdGVycyBmb2xsb3dlZCBieSBhIENSLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIGJvZHkgdGV4dCBpcyBvZmZzZXQgYnkgMyBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgICAgICBtTGFuZ3VhZ2UgPSBib2R5LnN1YnN0cmluZygwLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYm9keSA9IGJvZHkuc3Vic3RyaW5nKDMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBTbXNNZXNzYWdlLkVOQ09ESU5HXzE2QklUOgotICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBTbXNDYkhlYWRlci5QRFVfSEVBREVSX0xFTkdUSDsKLQotICAgICAgICAgICAgICAgIGlmIChoYXNMYW5ndWFnZUluZGljYXRvciAmJiBwZHUubGVuZ3RoID49IFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIICsgMikgewotICAgICAgICAgICAgICAgICAgICBtTGFuZ3VhZ2UgPSBHc21BbHBoYWJldC5nc203Qml0UGFja2VkVG9TdHJpbmcocGR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RILCAyKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFzTGFuZ3VhZ2VJbmRpY2F0b3IgJiYgcGR1Lmxlbmd0aCA+PSBvZmZzZXQgKyAyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExhbmd1YWdlIGlzIHR3byBHU00gY2hhcmFjdGVycy4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFjdHVhbCBib2R5IHRleHQgaXMgb2Zmc2V0IGJ5IDIgYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgIG1MYW5ndWFnZSA9IEdzbUFscGhhYmV0LmdzbTdCaXRQYWNrZWRUb1N0cmluZyhwZHUsIG9mZnNldCwgMik7CiAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggLT0gMjsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtQm9keSA9IG5ldyBTdHJpbmcocGR1LCBvZmZzZXQsIChwZHUubGVuZ3RoICYgMHhmZmZlKSAtIG9mZnNldCwgInV0Zi0xNiIpOworICAgICAgICAgICAgICAgICAgICBib2R5ID0gbmV3IFN0cmluZyhwZHUsIG9mZnNldCwgKGxlbmd0aCAmIDB4ZmZmZSksICJ1dGYtMTYiKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRWVlZWsKICAgICAgICAgICAgICAgICB9CkBAIC0yNTIsMTYgKzMxOSwxOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Cb2R5ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Cb2R5Lmxlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBpZiAobUJvZHkuY2hhckF0KGkpICE9IENBUlJJQUdFX1JFVFVSTikgewotICAgICAgICAgICAgICAgICAgICBtQm9keSA9IG1Cb2R5LnN1YnN0cmluZygwLCBpICsgMSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gYm9keS5sZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKGJvZHkuY2hhckF0KGkpICE9IENBUlJJQUdFX1JFVFVSTikgeworICAgICAgICAgICAgICAgICAgICBib2R5ID0gYm9keS5zdWJzdHJpbmcoMCwgaSArIDEpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQm9keSA9ICIiOworICAgICAgICAgICAgYm9keSA9ICIiOwogICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJvZHk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQppbmRleCAzNjM2YmFhLi5jMjFhOTZhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQpAQCAtNjIsNiArNjIsNyBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YUNvbm5lY3Rpb24gZXh0ZW5kcyBTdGF0ZU1hY2hpbmUgewogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWREJHID0gZmFsc2U7CiAKICAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBtQ291bnRMb2NrID0gbmV3IE9iamVjdCgpOwogICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IG1Db3VudDsKQEAgLTE0MSw3ICsxNDIsNyBAQAogICAgICAgICBzdGF0aWMgewogICAgICAgICAgICAgc0Vycm9yQ29kZVRvRmFpbENhdXNlTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgRmFpbENhdXNlPigpOwogICAgICAgICAgICAgZm9yIChGYWlsQ2F1c2UgZmMgOiB2YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIHNFcnJvckNvZGVUb0ZhaWxDYXVzZU1hcC5wdXQoZmMub3JkaW5hbCgpLCBmYyk7CisgICAgICAgICAgICAgICAgc0Vycm9yQ29kZVRvRmFpbENhdXNlTWFwLnB1dChmYy5nZXRFcnJvckNvZGUoKSwgZmMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI5MCw3ICsyOTEsNyBAQAogICAgICAgICAgICAgbGFzdEZhaWxUaW1lID0gdGltZVN0YW1wOwogICAgICAgICAgICAgQXN5bmNSZXN1bHQuZm9yTWVzc2FnZShjb25uZWN0aW9uQ29tcGxldGVkTXNnLCBjYXVzZSwgbmV3IEV4Y2VwdGlvbigpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoREJHKSBsb2coIm5vdGlmeUNvbm5lY3Rpb24gYXQgIiArIHRpbWVTdGFtcCArICIgY2F1c2U9IiArIGNhdXNlKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJub3RpZnlDb25uZWN0aW9uQ29tcGxldGVkIGF0ICIgKyB0aW1lU3RhbXAgKyAiIGNhdXNlPSIgKyBjYXVzZSk7CiAKICAgICAgICAgY29ubmVjdGlvbkNvbXBsZXRlZE1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICB9CkBAIC0zMDEsMTIgKzMwMiwxNCBAQAogICAgICAqIEBwYXJhbSBkcCBpcyB0aGUgRGlzY29ubmVjdFBhcmFtcy4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgbm90aWZ5RGlzY29ubmVjdENvbXBsZXRlZChEaXNjb25uZWN0UGFyYW1zIGRwKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygiTm90aWZ5RGlzY29ubmVjdENvbXBsZXRlZCIpOworICAgICAgICBpZiAoVkRCRykgbG9nKCJOb3RpZnlEaXNjb25uZWN0Q29tcGxldGVkIik7CiAKICAgICAgICAgaWYgKGRwLm9uQ29tcGxldGVkTXNnICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gZHAub25Db21wbGV0ZWRNc2c7Ci0gICAgICAgICAgICBsb2coU3RyaW5nLmZvcm1hdCgibXNnPSVzIG1zZy5vYmo9JXMiLCBtc2cudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGlmIChWREJHKSB7CisgICAgICAgICAgICAgICAgbG9nKFN0cmluZy5mb3JtYXQoIm1zZz0lcyBtc2cub2JqPSVzIiwgbXNnLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICgobXNnLm9iaiBpbnN0YW5jZW9mIFN0cmluZykgPyAoU3RyaW5nKSBtc2cub2JqIDogIjxuby1yZWFzb24+IikpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFzeW5jUmVzdWx0LmZvck1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgfQpAQCAtNDcyLDcgKzQ3NSw3IEBACiAgICAgICAgICAgICByZXN1bHQgPSBEYXRhQ2FsbFN0YXRlLlNldHVwUmVzdWx0LkVSUl9SaWxFcnJvcjsKICAgICAgICAgICAgIHJlc3VsdC5tRmFpbENhdXNlID0gRmFpbENhdXNlLmZyb21JbnQocmVzcG9uc2Uuc3RhdHVzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygib25TZXR1cENvbm5lY3Rpb25Db21wbGV0ZWQgcmVjZWl2ZWQgRGF0YUNhbGxTdGF0ZTogIiArIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIGlmIChEQkcpIGxvZygib25TZXR1cENvbm5lY3Rpb25Db21wbGV0ZWQgcmVjZWl2ZWQgRGF0YUNhbGxTdGF0ZTogIiArIHJlc3BvbnNlKTsKICAgICAgICAgICAgIGNpZCA9IHJlc3BvbnNlLmNpZDsKICAgICAgICAgICAgIC8vIHNldCBsaW5rIHByb3BlcnRpZXMgYmFzZWQgb24gZGF0YSBjYWxsIHJlc3BvbnNlCiAgICAgICAgICAgICByZXN1bHQgPSBzZXRMaW5rUHJvcGVydGllcyhyZXNwb25zZSwgbUxpbmtQcm9wZXJ0aWVzKTsKQEAgLTU1OCw1MyArNTYxLDUzIEBACiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSBBc3luY0NoYW5uZWwuQ01EX0NIQU5ORUxfRlVMTF9DT05ORUNUSU9OOiB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtQWMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0aW5nIHRvIHByZXZpb3VzIGNvbm5lY3Rpb24gbUFjPSIgKyBtQWMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiRGlzY29ubmVjdGluZyB0byBwcmV2aW91cyBjb25uZWN0aW9uIG1BYz0iICsgbUFjKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1BYy5yZXBseVRvTWVzc2FnZShtc2csIEFzeW5jQ2hhbm5lbC5DTURfQ0hBTk5FTF9GVUxMWV9DT05ORUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jQ2hhbm5lbC5TVEFUVVNfRlVMTF9DT05ORUNUSU9OX1JFRlVTRURfQUxSRUFEWV9DT05ORUNURUQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbUFjID0gbmV3IEFzeW5jQ2hhbm5lbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUFjLmNvbm5lY3RlZChudWxsLCBnZXRIYW5kbGVyKCksIG1zZy5yZXBseVRvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGNEZWZhdWx0U3RhdGU6IEZVTExfQ09OTkVDVElPTiByZXBseSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIkRjRGVmYXVsdFN0YXRlOiBGVUxMX0NPTk5FQ1RJT04gcmVwbHkgY29ubmVjdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQWMucmVwbHlUb01lc3NhZ2UobXNnLCBBc3luY0NoYW5uZWwuQ01EX0NIQU5ORUxfRlVMTFlfQ09OTkVDVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY0NoYW5uZWwuU1RBVFVTX1NVQ0NFU1NGVUwsIG1JZCwgImhpIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgQXN5bmNDaGFubmVsLkNNRF9DSEFOTkVMX0RJU0NPTk5FQ1Q6IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJDTURfQ0hBTk5FTF9ESVNDT05ORUNUIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIkNNRF9DSEFOTkVMX0RJU0NPTk5FQ1QiKTsKICAgICAgICAgICAgICAgICAgICAgbUFjLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgQXN5bmNDaGFubmVsLkNNRF9DSEFOTkVMX0RJU0NPTk5FQ1RFRDogewotICAgICAgICAgICAgICAgICAgICBsb2coIkNNRF9DSEFOTkVMX0RJU0NPTk5FQ1RFRCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJDTURfQ0hBTk5FTF9ESVNDT05ORUNURUQiKTsKICAgICAgICAgICAgICAgICAgICAgbUFjID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgRGF0YUNvbm5lY3Rpb25BYy5SRVFfSVNfSU5BQ1RJVkU6IHsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWwgPSBnZXRDdXJyZW50U3RhdGUoKSA9PSBtSW5hY3RpdmVTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJSRVFfSVNfSU5BQ1RJVkUgIGlzSW5hY3RpdmU9IiArIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIlJFUV9JU19JTkFDVElWRSAgaXNJbmFjdGl2ZT0iICsgdmFsKTsKICAgICAgICAgICAgICAgICAgICAgbUFjLnJlcGx5VG9NZXNzYWdlKG1zZywgRGF0YUNvbm5lY3Rpb25BYy5SU1BfSVNfSU5BQ1RJVkUsIHZhbCA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgRGF0YUNvbm5lY3Rpb25BYy5SRVFfR0VUX0NJRDogewotICAgICAgICAgICAgICAgICAgICBsb2coIlJFUV9HRVRfQ0lEICBjaWQ9IiArIGNpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIlJFUV9HRVRfQ0lEICBjaWQ9IiArIGNpZCk7CiAgICAgICAgICAgICAgICAgICAgIG1BYy5yZXBseVRvTWVzc2FnZShtc2csIERhdGFDb25uZWN0aW9uQWMuUlNQX0dFVF9DSUQsIGNpZCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIERhdGFDb25uZWN0aW9uQWMuUkVRX0dFVF9BUE5TRVRUSU5HOiB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiUkVRX0dFVF9BUE5TRVRUSU5HICBhcG5TZXR0aW5nPSIgKyBtQXBuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiUkVRX0dFVF9BUE5TRVRUSU5HICBhcG5TZXR0aW5nPSIgKyBtQXBuKTsKICAgICAgICAgICAgICAgICAgICAgbUFjLnJlcGx5VG9NZXNzYWdlKG1zZywgRGF0YUNvbm5lY3Rpb25BYy5SU1BfR0VUX0FQTlNFVFRJTkcsIG1BcG4pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBEYXRhQ29ubmVjdGlvbkFjLlJFUV9HRVRfTElOS19QUk9QRVJUSUVTOiB7CiAgICAgICAgICAgICAgICAgICAgIExpbmtQcm9wZXJ0aWVzIGxwID0gbmV3IExpbmtQcm9wZXJ0aWVzKG1MaW5rUHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiUkVRX0dFVF9MSU5LX1BST1BFUlRJRVMgbGlua1Byb3BlcnRpZXMiICsgbHApOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJSRVFfR0VUX0xJTktfUFJPUEVSVElFUyBsaW5rUHJvcGVydGllcyIgKyBscCk7CiAgICAgICAgICAgICAgICAgICAgIG1BYy5yZXBseVRvTWVzc2FnZShtc2csIERhdGFDb25uZWN0aW9uQWMuUlNQX0dFVF9MSU5LX1BST1BFUlRJRVMsIGxwKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgRGF0YUNvbm5lY3Rpb25BYy5SRVFfU0VUX0xJTktfUFJPUEVSVElFU19IVFRQX1BST1hZOiB7CiAgICAgICAgICAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBwcm94eSA9IChQcm94eVByb3BlcnRpZXMpIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiUkVRX1NFVF9MSU5LX1BST1BFUlRJRVNfSFRUUF9QUk9YWSBwcm94eT0iICsgcHJveHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJSRVFfU0VUX0xJTktfUFJPUEVSVElFU19IVFRQX1BST1hZIHByb3h5PSIgKyBwcm94eSk7CiAgICAgICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcy5zZXRIdHRwUHJveHkocHJveHkpOwogICAgICAgICAgICAgICAgICAgICBtQWMucmVwbHlUb01lc3NhZ2UobXNnLCBEYXRhQ29ubmVjdGlvbkFjLlJTUF9TRVRfTElOS19QUk9QRVJUSUVTX0hUVFBfUFJPWFkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTYxMiw3ICs2MTUsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRGF0YUNvbm5lY3Rpb25BYy5SRVFfVVBEQVRFX0xJTktfUFJPUEVSVElFU19EQVRBX0NBTExfU1RBVEU6IHsKICAgICAgICAgICAgICAgICAgICAgRGF0YUNhbGxTdGF0ZSBuZXdTdGF0ZSA9IChEYXRhQ2FsbFN0YXRlKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBEYXRhQ29ubmVjdGlvbkFjLkxpbmtQcm9wZXJ0eUNoYW5nZUFjdGlvbiBhY3Rpb24gPSB1cGRhdGVMaW5rUHJvcGVydHkobmV3U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlJFUV9VUERBVEVfTElOS19QUk9QRVJUSUVTX0RBVEFfQ0FMTF9TVEFURSBhY3Rpb249IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWN0aW9uICsgIiBuZXdTdGF0ZT0iICsgbmV3U3RhdGUpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02MjMsMTggKzYyNiwxOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIERhdGFDb25uZWN0aW9uQWMuUkVRX0dFVF9MSU5LX0NBUEFCSUxJVElFUzogewogICAgICAgICAgICAgICAgICAgICBMaW5rQ2FwYWJpbGl0aWVzIGxjID0gbmV3IExpbmtDYXBhYmlsaXRpZXMobUNhcGFiaWxpdGllcyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiUkVRX0dFVF9MSU5LX0NBUEFCSUxJVElFUyBsaW5rQ2FwYWJpbGl0aWVzIiArIGxjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiUkVRX0dFVF9MSU5LX0NBUEFCSUxJVElFUyBsaW5rQ2FwYWJpbGl0aWVzIiArIGxjKTsKICAgICAgICAgICAgICAgICAgICAgbUFjLnJlcGx5VG9NZXNzYWdlKG1zZywgRGF0YUNvbm5lY3Rpb25BYy5SU1BfR0VUX0xJTktfQ0FQQUJJTElUSUVTLCBsYyk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIERhdGFDb25uZWN0aW9uQWMuUkVRX1JFU0VUOgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkRjRGVmYXVsdFN0YXRlOiBtc2cud2hhdD1SRVFfUkVTRVQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiRGNEZWZhdWx0U3RhdGU6IG1zZy53aGF0PVJFUV9SRVNFVCIpOwogICAgICAgICAgICAgICAgICAgICBjbGVhclNldHRpbmdzKCk7CiAgICAgICAgICAgICAgICAgICAgIG1BYy5yZXBseVRvTWVzc2FnZShtc2csIERhdGFDb25uZWN0aW9uQWMuUlNQX1JFU0VUKTsKICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmFjdGl2ZVN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEYXRhQ29ubmVjdGlvbkFjLlJFUV9HRVRfUkVGQ09VTlQ6IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJSRVFfR0VUX1JFRkNPVU5UICByZWZDb3VudD0iICsgbVJlZkNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiUkVRX0dFVF9SRUZDT1VOVCAgcmVmQ291bnQ9IiArIG1SZWZDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgIG1BYy5yZXBseVRvTWVzc2FnZShtc2csIERhdGFDb25uZWN0aW9uQWMuUlNQX0dFVF9SRUZDT1VOVCwgbVJlZkNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjY2LDcgKzY2OSw4IEBACiAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRjRGVmYXVsdFN0YXRlOiBzaG91bGRuJ3QgaGFwcGVuIGJ1dCBpZ25vcmUgbXNnLndoYXQ9IiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGNEZWZhdWx0U3RhdGU6IHNob3VsZG4ndCBoYXBwZW4gYnV0IGlnbm9yZSBtc2cud2hhdD0weCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1zZy53aGF0KSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02ODUsMTMgKzY4OSwxMyBAQAogICAgICAgICBwcml2YXRlIERpc2Nvbm5lY3RQYXJhbXMgbURpc2Nvbm5lY3RQYXJhbXMgPSBudWxsOwogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEVudGVyTm90aWZpY2F0aW9uUGFyYW1zKENvbm5lY3Rpb25QYXJhbXMgY3AsIEZhaWxDYXVzZSBjYXVzZSkgewotICAgICAgICAgICAgbG9nKCJEY0luYWN0aXZlU3RhdGU6IHNldEVudGVyTm90aWNhdGlvblBhcmFtcyBjcCxjYXVzZSIpOworICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiRGNJbmFjdGl2ZVN0YXRlOiBzZXRFbnRlck5vdGljYXRpb25QYXJhbXMgY3AsY2F1c2UiKTsKICAgICAgICAgICAgIG1Db25uZWN0aW9uUGFyYW1zID0gY3A7CiAgICAgICAgICAgICBtRmFpbENhdXNlID0gY2F1c2U7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbnRlck5vdGlmaWNhdGlvblBhcmFtcyhEaXNjb25uZWN0UGFyYW1zIGRwKSB7Ci0gICAgICAgICAgbG9nKCJEY0luYWN0aXZlU3RhdGU6IHNldEVudGVyTm90aWNhdGlvblBhcmFtcyBkcCIpOworICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiRGNJbmFjdGl2ZVN0YXRlOiBzZXRFbnRlck5vdGljYXRpb25QYXJhbXMgZHAiKTsKICAgICAgICAgICAgIG1EaXNjb25uZWN0UGFyYW1zID0gZHA7CiAgICAgICAgIH0KIApAQCAtNzA3LDExICs3MTEsMTEgQEAKICAgICAgICAgICAgICAqIGNhbGwgdG8gaXNJbmFjdGl2ZS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKChtQ29ubmVjdGlvblBhcmFtcyAhPSBudWxsKSAmJiAobUZhaWxDYXVzZSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIGxvZygiRGNJbmFjdGl2ZVN0YXRlOiBlbnRlciBub3RpZnlDb25uZWN0Q29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiRGNJbmFjdGl2ZVN0YXRlOiBlbnRlciBub3RpZnlDb25uZWN0Q29tcGxldGVkIik7CiAgICAgICAgICAgICAgICAgbm90aWZ5Q29ubmVjdENvbXBsZXRlZChtQ29ubmVjdGlvblBhcmFtcywgbUZhaWxDYXVzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobURpc2Nvbm5lY3RQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICBsb2coIkRjSW5hY3RpdmVTdGF0ZTogZW50ZXIgbm90aWZ5RGlzY29ubmVjdENvbXBsZXRlZCIpOworICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIkRjSW5hY3RpdmVTdGF0ZTogZW50ZXIgbm90aWZ5RGlzY29ubmVjdENvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgIG5vdGlmeURpc2Nvbm5lY3RDb21wbGV0ZWQobURpc2Nvbm5lY3RQYXJhbXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03NTEsNyArNzU1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJEY0luYWN0aXZlU3RhdGUgbm90aGFuZGxlZCBtc2cud2hhdD0iICsgbXNnLndoYXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEY0luYWN0aXZlU3RhdGUgbm90aGFuZGxlZCBtc2cud2hhdD0weCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1zZy53aGF0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gTk9UX0hBTkRMRUQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtODU2LDcgKzg2MywxMCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiRGNBY3RpdmF0aW5nU3RhdGUgbm90IGhhbmRsZWQgbXNnLndoYXQ9IiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGNBY3RpdmF0aW5nU3RhdGUgbm90IGhhbmRsZWQgbXNnLndoYXQ9MHgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhtc2cud2hhdCkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IE5PVF9IQU5ETEVEOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTg3Myw3ICs4ODMsNyBAQAogICAgICAgICBwcml2YXRlIEZhaWxDYXVzZSBtRmFpbENhdXNlID0gbnVsbDsKIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbnRlck5vdGlmaWNhdGlvblBhcmFtcyhDb25uZWN0aW9uUGFyYW1zIGNwLCBGYWlsQ2F1c2UgY2F1c2UpIHsKLSAgICAgICAgICAgIGxvZygiRGNJbmFjdGl2ZVN0YXRlOiBzZXRFbnRlck5vdGljYXRpb25QYXJhbXMgY3AsY2F1c2UiKTsKKyAgICAgICAgICAgIGlmIChWREJHKSBsb2coIkRjSW5hY3RpdmVTdGF0ZTogc2V0RW50ZXJOb3RpY2F0aW9uUGFyYW1zIGNwLGNhdXNlIik7CiAgICAgICAgICAgICBtQ29ubmVjdGlvblBhcmFtcyA9IGNwOwogICAgICAgICAgICAgbUZhaWxDYXVzZSA9IGNhdXNlOwogICAgICAgICB9CkBAIC04ODcsNyArODk3LDcgQEAKICAgICAgICAgICAgICAqIGNhbGwgdG8gaXNBY3RpdmUuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICgobUNvbm5lY3Rpb25QYXJhbXMgIT0gbnVsbCkgJiYgKG1GYWlsQ2F1c2UgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIkRjQWN0aXZlU3RhdGU6IGVudGVyIG5vdGlmeUNvbm5lY3RDb21wbGV0ZWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJEY0FjdGl2ZVN0YXRlOiBlbnRlciBub3RpZnlDb25uZWN0Q29tcGxldGVkIik7CiAgICAgICAgICAgICAgICAgbm90aWZ5Q29ubmVjdENvbXBsZXRlZChtQ29ubmVjdGlvblBhcmFtcywgbUZhaWxDYXVzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTkzMCw3ICs5NDAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkRjQWN0aXZlU3RhdGUgbm90aGFuZGxlZCBtc2cud2hhdD0iICsgbXNnLndoYXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEY0FjdGl2ZVN0YXRlIG5vdCBoYW5kbGVkIG1zZy53aGF0PTB4IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcobXNnLndoYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBOT1RfSEFORExFRDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC05NzIsNyArOTg1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJEY0Rpc2Nvbm5lY3RpbmdTdGF0ZSBub3QgaGFuZGxlZCBtc2cud2hhdD0iICsgbXNnLndoYXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEY0Rpc2Nvbm5lY3RpbmdTdGF0ZSBub3QgaGFuZGxlZCBtc2cud2hhdD0weCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1zZy53aGF0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gTk9UX0hBTkRMRUQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTAxNCw5ICsxMDMwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRjRGlzY29ubmVjdGlvbkVycm9yQ3JlYXRpbmdDb25uZWN0aW9uIG5vdCBoYW5kbGVkIG1zZy53aGF0PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRjRGlzY29ubmVjdGlvbkVycm9yQ3JlYXRpbmdDb25uZWN0aW9uIG5vdCBoYW5kbGVkIG1zZy53aGF0PTB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcobXNnLndoYXQpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBOT1RfSEFORExFRDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25BYy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uQWMuamF2YQppbmRleCBhMGQ5YjBmLi42MmI5MGFlIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25BYy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbkFjLmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKICAqIEFzeW5jQ2hhbm5lbCB0byBhIERhdGFDb25uZWN0aW9uCiAgKi8KIHB1YmxpYyBjbGFzcyBEYXRhQ29ubmVjdGlvbkFjIGV4dGVuZHMgQXN5bmNDaGFubmVsIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKICAgICBwcml2YXRlIFN0cmluZyBtTG9nVGFnOwogCiAgICAgcHVibGljIERhdGFDb25uZWN0aW9uIGRhdGFDb25uZWN0aW9uOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAgICAgICAgIGlmICgocmVzcG9uc2UgIT0gbnVsbCkgJiYgKHJlc3BvbnNlLndoYXQgPT0gUlNQX1JFU0VUKSkgewogICAgICAgICAgICAgaWYgKERCRykgbG9nKCJyZXN0U3luYyBvayIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJyZXN0U3luYyBlcnJvciByZXNwb25zZT0iICsgcmVzcG9uc2UpOworICAgICAgICAgICAgbG9nKCJyZXN0U3luYyBlcnJvciByZXNwb25zZT0iICsgcmVzcG9uc2UpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKaW5kZXggNWRkZmNkMS4uMmMyNmY2MiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtMzA0LDcgKzMwNCw3IEBACiAgICAgICAgICAgICAgICAgbUlzU2NyZWVuT24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICBzdG9wTmV0U3RhdFBvbGwoKTsKICAgICAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoZ2V0QWN0aW9uSW50ZW50UmVjb25uZWN0QWxhcm0oKSkpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnN0YXJ0c1dpdGgoZ2V0QWN0aW9uSW50ZW50UmVjb25uZWN0QWxhcm0oKSkpIHsKICAgICAgICAgICAgICAgICBsb2coIlJlY29ubmVjdCBhbGFybS4gUHJldmlvdXMgc3RhdGUgd2FzICIgKyBtU3RhdGUpOwogICAgICAgICAgICAgICAgIG9uQWN0aW9uSW50ZW50UmVjb25uZWN0QWxhcm0oaW50ZW50KTsKIApAQCAtNTA5LDcgKzUwOSw2IEBACiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Wb2ljZUNhbGxFbmRlZCgpOwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uQ2xlYW5VcENvbm5lY3Rpb24oYm9vbGVhbiB0ZWFyRG93biwgaW50IGFwbklkLCBTdHJpbmcgcmVhc29uKTsKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkNsZWFuVXBBbGxDb25uZWN0aW9ucyhTdHJpbmcgY2F1c2UpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzRGF0YVBvc3NpYmxlKCk7CiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNEYXRhUG9zc2libGUoU3RyaW5nIGFwblR5cGUpOwogCiAgICAgQE92ZXJyaWRlCkBAIC03NTIsNyArNzUxLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KFN0cmluZyByZWFzb24pIHsKICAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGVpdGhlciBqdXN0IHR1cm5lZCBhbGwgb2ZmIGJlY2F1c2Ugd2UgbG9zdCBhdmFpbGFiaWxpdHkKICAgICAgICAgLy8gb3IgYWxsIHdlcmUgb2ZmIGFuZCBjb3VsZCBub3cgZ28gb24sIHNvIG9ubHkgaGF2ZSBvZmYgYXBucyB0byB3b3JyeSBhYm91dAotICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBpc0RhdGFQb3NzaWJsZSgpKTsKKyAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgaXNEYXRhUG9zc2libGUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzQXBuVHlwZUVuYWJsZWQoU3RyaW5nIGFwblR5cGUpIHsKQEAgLTk2OCwxMSArOTY3LDcgQEAKICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FueUFjdGl2ZURhdGFDb25uZWN0aW9ucygpIHsKLSAgICAgICAgLy8gVE9ETzogUmVtZW1iZXIgaWYgdGhlcmUgYXJlIGFueSBjb25uZWN0ZWQgb3IKLSAgICAgICAgLy8gbG9vcCBhc2tpbmcgZWFjaCBEQy9BUE4/Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0FueUFjdGl2ZURhdGFDb25uZWN0aW9ucygpOwogCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TZXREYXRhRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewogICAgICAgICBib29sZWFuIHByZXZFbmFibGVkID0gZ2V0QW55RGF0YUVuYWJsZWQoKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCmluZGV4IGRhMjMzY2MuLjE5NDQxY2QgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbApAQCAtMTQ1LDYgKzE0NSwxNSBAQAogICAgIGJvb2xlYW4gc3VwcGx5UGluKFN0cmluZyBwaW4pOwogCiAgICAgLyoqCisgICAgICogU3VwcGx5IHB1ayB0byB1bmxvY2sgdGhlIFNJTSBhbmQgc2V0IFNJTSBwaW4gdG8gbmV3IHBpbi4KKyAgICAgKiAgQmxvY2tzIHVudGlsIGEgcmVzdWx0IGlzIGRldGVybWluZWQuCisgICAgICogQHBhcmFtIHB1ayBUaGUgcHVrIHRvIGNoZWNrLgorICAgICAqICAgICAgICBwaW4gVGhlIG5ldyBwaW4gdG8gYmUgc2V0IGluIFNJTQorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBhIHN1Y2Nlc3MuCisgICAgICovCisgICAgYm9vbGVhbiBzdXBwbHlQdWsoU3RyaW5nIHB1aywgU3RyaW5nIHBpbik7CisKKyAgICAvKioKICAgICAgKiBIYW5kbGVzIFBJTiBNTUkgY29tbWFuZHMgKFBJTi9QSU4yL1BVSy9QVUsyKSwgd2hpY2ggYXJlIGluaXRpYXRlZAogICAgICAqIHdpdGhvdXQgU0VORCAoc28gPGNvZGU+ZGlhbDwvY29kZT4gaXMgbm90IGFwcHJvcHJpYXRlKS4KICAgICAgKgpAQCAtMjU0LDcgKzI2Myw3IEBACiAgICAgICAqIFJldHVybnMgdGhlIG5ldHdvcmsgdHlwZQogICAgICAgKi8KICAgICBpbnQgZ2V0TmV0d29ya1R5cGUoKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIGFuIElDQyBjYXJkIGlzIHByZXNlbnQKICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhCmluZGV4IGE1MTZiNDkuLjVkOGZjNzggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NhcmQuamF2YQpAQCAtNzIyLDUyICs3MjIsODggQEAKICAgICAgICAgICAgIGN1cnJlbnRSYWRpb1N0YXRlID09IFJhZGlvU3RhdGUuUlVJTV9SRUFEWSB8fAogICAgICAgICAgICAgKGN1cnJlbnRSYWRpb1N0YXRlID09IFJhZGlvU3RhdGUuTlZfUkVBRFkgJiYKICAgICAgICAgICAgICAgICAgICAgKG1QaG9uZS5nZXRMdGVPbkNkbWFNb2RlKCkgPT0gUGhvbmUuTFRFX09OX0NETUFfVFJVRSkpKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXg7CisKKyAgICAgICAgICAgIFN0YXRlIGNzaW1TdGF0ZSA9CisgICAgICAgICAgICAgICAgZ2V0QXBwU3RhdGUobUljY0NhcmRTdGF0dXMuZ2V0Q2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4KCkpOworICAgICAgICAgICAgU3RhdGUgdXNpbVN0YXRlID0KKyAgICAgICAgICAgICAgICBnZXRBcHBTdGF0ZShtSWNjQ2FyZFN0YXR1cy5nZXRHc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXgoKSk7CisKKyAgICAgICAgICAgIGlmKG1EYmcpIGxvZygiVVNJTT0iICsgdXNpbVN0YXRlICsgIiBDU0lNPSIgKyBjc2ltU3RhdGUpOworCisgICAgICAgICAgICBpZiAobVBob25lLmdldEx0ZU9uQ2RtYU1vZGUoKSA9PSBQaG9uZS5MVEVfT05fQ0RNQV9UUlVFKSB7CisgICAgICAgICAgICAgICAgLy8gVUlDQyBjYXJkIGNvbnRhaW5zIGJvdGggVVNJTSBhbmQgQ1NJTQorICAgICAgICAgICAgICAgIC8vIFJldHVybiBjb25zb2xpZGF0ZWQgc3RhdHVzCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbnNvbGlkYXRlZFN0YXRlKGNzaW1TdGF0ZSwgdXNpbVN0YXRlLCBjc2ltU3RhdGUpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBjaGVjayBmb3IgQ0RNQSByYWRpbyB0ZWNobm9sb2d5CiAgICAgICAgICAgICBpZiAoY3VycmVudFJhZGlvU3RhdGUgPT0gUmFkaW9TdGF0ZS5SVUlNX0xPQ0tFRF9PUl9BQlNFTlQgfHwKICAgICAgICAgICAgICAgICBjdXJyZW50UmFkaW9TdGF0ZSA9PSBSYWRpb1N0YXRlLlJVSU1fUkVBRFkpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1JY2NDYXJkU3RhdHVzLmdldENkbWFTdWJzY3JpcHRpb25BcHBJbmRleCgpOworICAgICAgICAgICAgICAgIHJldHVybiBjc2ltU3RhdGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1JY2NDYXJkU3RhdHVzLmdldEdzbVVtdHNTdWJzY3JpcHRpb25BcHBJbmRleCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJY2NDYXJkQXBwbGljYXRpb24gYXBwOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBJY2NDYXJkU3RhdHVzLkNBUkRfTUFYX0FQUFMpIHsKLSAgICAgICAgICAgICAgICBhcHAgPSBtSWNjQ2FyZFN0YXR1cy5nZXRBcHBsaWNhdGlvbihpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKG1Mb2dUYWcsICJbSWNjQ2FyZF0gSW52YWxpZCBTdWJzY3JpcHRpb24gQXBwbGljYXRpb24gaW5kZXg6IiArIGluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhcHAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKG1Mb2dUYWcsICJbSWNjQ2FyZF0gU3Vic2NyaXB0aW9uIEFwcGxpY2F0aW9uIGluIG5vdCBwcmVzZW50Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuQUJTRU5UOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBQSU4gcmVxdWlyZWQKLSAgICAgICAgICAgIGlmIChhcHAuYXBwX3N0YXRlLmlzUGluUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLlBJTl9SRVFVSVJFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcHAuYXBwX3N0YXRlLmlzUHVrUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLlBVS19SRVFVSVJFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcHAuYXBwX3N0YXRlLmlzU3Vic2NyaXB0aW9uUGVyc29FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5ORVRXT1JLX0xPQ0tFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcHAuYXBwX3N0YXRlLmlzQXBwUmVhZHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLlJFQURZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFwcC5hcHBfc3RhdGUuaXNBcHBOb3RSZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuTk9UX1JFQURZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuTk9UX1JFQURZOworICAgICAgICAgICAgcmV0dXJuIHVzaW1TdGF0ZTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLkFCU0VOVDsKICAgICB9CiAKKyAgICBwcml2YXRlIFN0YXRlIGdldEFwcFN0YXRlKGludCBhcHBJbmRleCkgeworICAgICAgICBJY2NDYXJkQXBwbGljYXRpb24gYXBwOworICAgICAgICBpZiAoYXBwSW5kZXggPj0gMCAmJiBhcHBJbmRleCA8IEljY0NhcmRTdGF0dXMuQ0FSRF9NQVhfQVBQUykgeworICAgICAgICAgICAgYXBwID0gbUljY0NhcmRTdGF0dXMuZ2V0QXBwbGljYXRpb24oYXBwSW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmUobUxvZ1RhZywgIltJY2NDYXJkXSBJbnZhbGlkIFN1YnNjcmlwdGlvbiBBcHBsaWNhdGlvbiBpbmRleDoiICsgYXBwSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuQUJTRU5UOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFwcCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZShtTG9nVGFnLCAiW0ljY0NhcmRdIFN1YnNjcmlwdGlvbiBBcHBsaWNhdGlvbiBpbiBub3QgcHJlc2VudCIpOworICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuQUJTRU5UOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgaWYgUElOIHJlcXVpcmVkCisgICAgICAgIGlmIChhcHAuYXBwX3N0YXRlLmlzUGluUmVxdWlyZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuUElOX1JFUVVJUkVEOworICAgICAgICB9CisgICAgICAgIGlmIChhcHAuYXBwX3N0YXRlLmlzUHVrUmVxdWlyZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuUFVLX1JFUVVJUkVEOworICAgICAgICB9CisgICAgICAgIGlmIChhcHAuYXBwX3N0YXRlLmlzU3Vic2NyaXB0aW9uUGVyc29FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLk5FVFdPUktfTE9DS0VEOworICAgICAgICB9CisgICAgICAgIGlmIChhcHAuYXBwX3N0YXRlLmlzQXBwUmVhZHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuUkVBRFk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcC5hcHBfc3RhdGUuaXNBcHBOb3RSZWFkeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5OT1RfUkVBRFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuTk9UX1JFQURZOworICAgIH0KKworICAgIHByaXZhdGUgU3RhdGUgZ2V0Q29uc29saWRhdGVkU3RhdGUoU3RhdGUgbGVmdCwgU3RhdGUgcmlnaHQsIFN0YXRlIHByZWZlcnJlZFN0YXRlKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGVpdGhlciBpcyBhYnNlbnQuCisgICAgICAgIGlmIChyaWdodCA9PSBJY2NDYXJkLlN0YXRlLkFCU0VOVCkgcmV0dXJuIGxlZnQ7CisgICAgICAgIGlmIChsZWZ0ID09IEljY0NhcmQuU3RhdGUuQUJTRU5UKSByZXR1cm4gcmlnaHQ7CisKKyAgICAgICAgLy8gT25seSBpZiBib3RoIGFyZSByZWFkeSwgcmV0dXJuIHJlYWR5CisgICAgICAgIGlmICgobGVmdCA9PSBJY2NDYXJkLlN0YXRlLlJFQURZKSAmJiAocmlnaHQgPT0gSWNjQ2FyZC5TdGF0ZS5SRUFEWSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0ZS5SRUFEWTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhc2Ugb25lIGlzIHJlYWR5LCBidXQgdGhlIG90aGVyIGlzIG5vdC4KKyAgICAgICAgaWYgKCgocmlnaHQgPT0gSWNjQ2FyZC5TdGF0ZS5OT1RfUkVBRFkpICYmIChsZWZ0ID09IEljY0NhcmQuU3RhdGUuUkVBRFkpKSB8fAorICAgICAgICAgICAgKChsZWZ0ID09IEljY0NhcmQuU3RhdGUuTk9UX1JFQURZKSAmJiAocmlnaHQgPT0gSWNjQ2FyZC5TdGF0ZS5SRUFEWSkpKSB7CisgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5OT1RfUkVBRFk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgb3RoZXIgc3RhdGUgaXMgYXNzdW1lZCB0byBiZSBvbmUgb2YgbG9ja2VkIHN0YXRlCisgICAgICAgIGlmIChyaWdodCA9PSBJY2NDYXJkLlN0YXRlLk5PVF9SRUFEWSkgcmV0dXJuIGxlZnQ7CisgICAgICAgIGlmIChsZWZ0ID09IEljY0NhcmQuU3RhdGUuTk9UX1JFQURZKSByZXR1cm4gcmlnaHQ7CisKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgRlcgY3VycmVudGx5IGp1c3QgYXNzdW1lcyB0aGUgc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgdGhlIGFwcGxpY2F0aW9ucy4uLgorICAgICAgICByZXR1cm4gcHJlZmVycmVkU3RhdGU7CisgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbk9uSWNjKEljY0NhcmRBcHBsaWNhdGlvbi5BcHBUeXBlIHR5cGUpIHsKICAgICAgICAgaWYgKG1JY2NDYXJkU3RhdHVzID09IG51bGwpIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDb25zdGFudHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDb25zdGFudHMuamF2YQppbmRleCBiNDBmOTQ1Li5jYWZjNzliIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ29uc3RhbnRzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NvbnN0YW50cy5qYXZhCkBAIC01OCw2ICs1OCwxMiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfQ1NUID0gMHg2ZjMyOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfUlVJTV9TUE4gPTB4NkY0MTsKIAorICAgIC8vIEVUU0kgVFMuMTAyLjIyMQorICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfUEwgPSAweDJGMDU7CisgICAgLy8gM0dQUDIgQy5TMDA2NQorICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfQ1NJTV9MSSA9IDB4NkYzQTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEVGX0NTSU1fU1BOID0weDZGNDE7CisKICAgICAvL0lTSU0gYWNjZXNzCiAgICAgc3RhdGljIGZpbmFsIGludCBFRl9JTVBVID0gMHg2ZjA0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfSU1QSSA9IDB4NmYwMjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NGaWxlSGFuZGxlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0ZpbGVIYW5kbGVyLmphdmEKaW5kZXggOTJkZGQyYy4uOTNiOWI3OSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0ZpbGVIYW5kbGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0ZpbGVIYW5kbGVyLmphdmEKQEAgLTUyOSw2ICs1MjksNyBAQAogICAgICAgICAgICAgcmV0dXJuIE1GX1NJTSArIERGX1RFTEVDT007CiAKICAgICAgICAgY2FzZSBFRl9JQ0NJRDoKKyAgICAgICAgY2FzZSBFRl9QTDoKICAgICAgICAgICAgIHJldHVybiBNRl9TSU07CiAgICAgICAgIGNhc2UgRUZfSU1HOgogICAgICAgICAgICAgcmV0dXJuIE1GX1NJTSArIERGX1RFTEVDT00gKyBERl9HUkFQSElDUzsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NQaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDJmMjJkNzQuLjQ1NTYyY2EgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NQaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Bob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAogLyoqCiAgKiBTaW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyIHRvIHByb3ZpZGUgYW4gaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIHRvCkBAIC02MywxNCArNjQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdG90YWwgIiArIHJlY29yZFNpemVbMV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAjcmVjb3JkICIgKyByZWNvcmRTaXplWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UGVuZGluZyhhcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfRE9ORToKICAgICAgICAgICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAoYXIuZXhjZXB0aW9uID09IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlQZW5kaW5nKGFyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0xPQURfRE9ORToKQEAgLTg0LDExICs4NSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlQZW5kaW5nKGFyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBub3RpZnlQZW5kaW5nKEFzeW5jUmVzdWx0IGFyKSB7CisgICAgICAgICAgICBpZiAoYXIudXNlck9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXRvbWljQm9vbGVhbiBzdGF0dXMgPSAoQXRvbWljQm9vbGVhbikgYXIudXNlck9iajsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQodHJ1ZSk7CisgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgfQogICAgIH07CiAKICAgICBwdWJsaWMgSWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlcihQaG9uZUJhc2UgcGhvbmUpIHsKQEAgLTE1MCwxNSArMTYwLDEyIEBACiAgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgewogICAgICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9VUERBVEVfRE9ORSk7CisgICAgICAgICAgICBBdG9taWNCb29sZWFuIHN0YXR1cyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9VUERBVEVfRE9ORSwgc3RhdHVzKTsKICAgICAgICAgICAgIEFkblJlY29yZCBvbGRBZG4gPSBuZXcgQWRuUmVjb3JkKG9sZFRhZywgb2xkUGhvbmVOdW1iZXIpOwogICAgICAgICAgICAgQWRuUmVjb3JkIG5ld0FkbiA9IG5ldyBBZG5SZWNvcmQobmV3VGFnLCBuZXdQaG9uZU51bWJlcik7CiAgICAgICAgICAgICBhZG5DYWNoZS51cGRhdGVBZG5CeVNlYXJjaChlZmlkLCBvbGRBZG4sIG5ld0FkbiwgcGluMiwgcmVzcG9uc2UpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTG9jay53YWl0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZCgiaW50ZXJydXB0ZWQgd2hpbGUgdHJ5aW5nIHRvIHVwZGF0ZSBieSBzZWFyY2giKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdhaXRGb3JSZXN1bHQoc3RhdHVzKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9CkBAIC0xOTcsMTQgKzIwNCwxMSBAQAogICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKICAgICAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gbUJhc2VIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfVVBEQVRFX0RPTkUpOworICAgICAgICAgICAgQXRvbWljQm9vbGVhbiBzdGF0dXMgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gbUJhc2VIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfVVBEQVRFX0RPTkUsIHN0YXR1cyk7CiAgICAgICAgICAgICBBZG5SZWNvcmQgbmV3QWRuID0gbmV3IEFkblJlY29yZChuZXdUYWcsIG5ld1Bob25lTnVtYmVyKTsKICAgICAgICAgICAgIGFkbkNhY2hlLnVwZGF0ZUFkbkJ5SW5kZXgoZWZpZCwgbmV3QWRuLCBpbmRleCwgcGluMiwgcmVzcG9uc2UpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTG9jay53YWl0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZCgiaW50ZXJydXB0ZWQgd2hpbGUgdHJ5aW5nIHRvIHVwZGF0ZSBieSBpbmRleCIpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgd2FpdEZvclJlc3VsdChzdGF0dXMpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KQEAgLTI0MywxNSArMjQ3LDEyIEBACiAKICAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CiAgICAgICAgICAgICBjaGVja1RocmVhZCgpOwotICAgICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG1CYXNlSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX0xPQURfRE9ORSk7CisgICAgICAgICAgICBBdG9taWNCb29sZWFuIHN0YXR1cyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9MT0FEX0RPTkUsIHN0YXR1cyk7CiAgICAgICAgICAgICBhZG5DYWNoZS5yZXF1ZXN0TG9hZEFsbEFkbkxpa2UoZWZpZCwgYWRuQ2FjaGUuZXh0ZW5zaW9uRWZGb3JFZihlZmlkKSwgcmVzcG9uc2UpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTG9jay53YWl0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZCgiaW50ZXJydXB0ZWQgd2hpbGUgdHJ5aW5nIHRvIGxvYWQgZnJvbSB0aGUgU0lNIik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB3YWl0Rm9yUmVzdWx0KHN0YXR1cyk7CiAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZWNvcmRzOworICAgICAgICByZXR1cm4gcmVjb3JkczsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1RocmVhZCgpIHsKQEAgLTI2NSw2ICsyNjYsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JSZXN1bHQoQXRvbWljQm9vbGVhbiBzdGF0dXMpIHsKKyAgICAgICAgd2hpbGUgKCFzdGF0dXMuZ2V0KCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUxvY2sud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ2QoImludGVycnVwdGVkIHdoaWxlIHRyeWluZyB0byB1cGRhdGUgYnkgc2VhcmNoIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGludCB1cGRhdGVFZkZvckljY1R5cGUoaW50IGVmaWQpIHsKICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHRyeWluZyB0byByZWFkIEFETiByZWNvcmRzCiAgICAgICAgIGlmIChlZmlkID09IEljY0NvbnN0YW50cy5FRl9BRE4pIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQppbmRleCBiNzdlMTM0Li5mNzBkNjgwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCkBAIC0xMDIzLDcgKzEwMjMsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCkgewotICAgICAgICByZXR1cm4gKChtRGF0YUNvbm5lY3Rpb25UcmFja2VyICE9IG51bGwpICYmIChtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmlzRGF0YVBvc3NpYmxlKCkpKTsKKyAgICAgICAgcmV0dXJuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKFN0cmluZyBhcG5UeXBlKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQppbmRleCA2OGYxYzVmLi5jMjIxMmRiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKQEAgLTY1NCw3ICs2NTQsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCk7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoU3RyaW5nIGFwblR5cGUpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQppbmRleCAwNjIxY2ZkLi4yYzA0YjMwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCkBAIC0yODg4LDcgKzI4ODgsNyBAQAogCiAgICAgICAgIFN0cmluZyBzID0gcC5yZWFkU3RyaW5nKCk7CiAKLSAgICAgICAgaWYgKFJJTEpfTE9HRCkgcmlsakxvZygiPCBpY2NJTzogIgorICAgICAgICBpZiAoUklMSl9MT0dWKSByaWxqTG9nKCI8IGljY0lPOiAiCiAgICAgICAgICAgICAgICAgKyAiIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoc3cxKQogICAgICAgICAgICAgICAgICsgIiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHN3MikgKyAiICIKICAgICAgICAgICAgICAgICArIHMpOwpAQCAtMzA1MSw3ICszMDUxLDcgQEAKICAgICByZXNwb25zZVNldHVwRGF0YUNhbGwoUGFyY2VsIHApIHsKICAgICAgICAgaW50IHZlciA9IHAucmVhZEludCgpOwogICAgICAgICBpbnQgbnVtID0gcC5yZWFkSW50KCk7Ci0gICAgICAgIGlmIChSSUxKX0xPR0QpIHJpbGpMb2coInJlc3BvbnNlU2V0dXBEYXRhQ2FsbCB2ZXI9IiArIHZlciArICIgbnVtPSIgKyBudW0pOworICAgICAgICBpZiAoUklMSl9MT0dWKSByaWxqTG9nKCJyZXNwb25zZVNldHVwRGF0YUNhbGwgdmVyPSIgKyB2ZXIgKyAiIG51bT0iICsgbnVtKTsKIAogICAgICAgICBEYXRhQ2FsbFN0YXRlIGRhdGFDYWxsOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2VydmljZVN0YXRlVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA2OTU4MDVjLi4wMWI4MDdkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTU0LDYgKzU0LDEyIEBACiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbURlc2lyZWRQb3dlclN0YXRlOwogCiAgICAgLyoqCisgICAgICogIFZhbHVlcyBjb3JyZXNwb25kIHRvIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZXyBkZWZpbml0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1SYWRpb1RlY2hub2xvZ3kgPSAwOworICAgIHByb3RlY3RlZCBpbnQgbU5ld1JhZGlvVGVjaG5vbG9neSA9IDA7CisKKyAgICAvKioKICAgICAgKiBCeSBkZWZhdWx0LCBzdHJlbmd0aCBwb2xsaW5nIGlzIGVuYWJsZWQuICBIb3dldmVyLCBpZiB3ZSdyZQogICAgICAqIGdldHRpbmcgdW5zb2xpY2l0ZWQgc2lnbmFsIHN0cmVuZ3RoIHVwZGF0ZXMgZnJvbSB0aGUgcmFkaW8sIHNldAogICAgICAqIHZhbHVlIHRvIHRydWUgYW5kIGRvbid0IGJvdGhlciBwb2xsaW5nIGFueSBtb3JlLgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQUxURVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BTFRFUGhvbmUuamF2YQppbmRleCA1ODZlNmIzLi5mZTJmY2IyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BTFRFUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BTFRFUGhvbmUuamF2YQpAQCAtNTgsOCArNTgsOSBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGluaXRTc3RJY2MoKSB7CiAgICAgICAgIG1TU1QgPSBuZXcgQ2RtYUx0ZVNlcnZpY2VTdGF0ZVRyYWNrZXIodGhpcyk7Ci0gICAgICAgIG1JY2NSZWNvcmRzID0gbmV3IFNJTVJlY29yZHModGhpcyk7CisgICAgICAgIG1JY2NSZWNvcmRzID0gbmV3IENkbWFMdGVVaWNjUmVjb3Jkcyh0aGlzKTsKICAgICAgICAgbUljY0NhcmQgPSBuZXcgU2ltQ2FyZCh0aGlzLCBMT0dfVEFHLCBEQkcpOworICAgICAgICBtSWNjRmlsZUhhbmRsZXIgPSBuZXcgQ2RtYUx0ZVVpY2NGaWxlSGFuZGxlcih0aGlzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTg3LDcgKzg4LDcgQEAKICAgICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiBjYWxsZWQKIAogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKLSAgICAgICAgfSBlbHNlIGlmIChtU1NULmdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZSgpICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSB7CisgICAgICAgIH0gZWxzZSBpZiAobVNTVC5nZXRDdXJyZW50RGF0YUNvbm5lY3Rpb25TdGF0ZSgpICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQppbmRleCA0ZmEzNjljMy4uYTI4MzA2MiAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEKQEAgLTE1NiwxMyArMTU2LDEzIEBACiAgICAgICAgIG1TU1QgPSBuZXcgQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIodGhpcyk7CiAgICAgICAgIG1JY2NSZWNvcmRzID0gbmV3IFJ1aW1SZWNvcmRzKHRoaXMpOwogICAgICAgICBtSWNjQ2FyZCA9IG5ldyBSdWltQ2FyZCh0aGlzLCBMT0dfVEFHLCBEQkcpOworICAgICAgICBtSWNjRmlsZUhhbmRsZXIgPSBuZXcgUnVpbUZpbGVIYW5kbGVyKHRoaXMpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBQaG9uZU5vdGlmaWVyIG5vdGlmaWVyKSB7CiAgICAgICAgIG1DTS5zZXRQaG9uZVR5cGUoUGhvbmUuUEhPTkVfVFlQRV9DRE1BKTsKICAgICAgICAgbUNUID0gbmV3IENkbWFDYWxsVHJhY2tlcih0aGlzKTsKICAgICAgICAgbVNNUyA9IG5ldyBDZG1hU01TRGlzcGF0Y2hlcih0aGlzKTsKLSAgICAgICAgbUljY0ZpbGVIYW5kbGVyID0gbmV3IFJ1aW1GaWxlSGFuZGxlcih0aGlzKTsKICAgICAgICAgbURhdGFDb25uZWN0aW9uVHJhY2tlciA9IG5ldyBDZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyICh0aGlzKTsKICAgICAgICAgbVJ1aW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyID0gbmV3IFJ1aW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyKHRoaXMpOwogICAgICAgICBtUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIgPSBuZXcgUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIodGhpcywgbVNNUyk7CkBAIC0zMzcsNyArMzM3LDcgQEAKICAgICBwdWJsaWMgRGF0YUFjdGl2aXR5U3RhdGUgZ2V0RGF0YUFjdGl2aXR5U3RhdGUoKSB7CiAgICAgICAgIERhdGFBY3Rpdml0eVN0YXRlIHJldCA9IERhdGFBY3Rpdml0eVN0YXRlLk5PTkU7CiAKLSAgICAgICAgaWYgKG1TU1QuZ2V0Q3VycmVudENkbWFEYXRhQ29ubmVjdGlvblN0YXRlKCkgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UpIHsKKyAgICAgICAgaWYgKG1TU1QuZ2V0Q3VycmVudERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkgewogCiAgICAgICAgICAgICBzd2l0Y2ggKG1EYXRhQ29ubmVjdGlvblRyYWNrZXIuZ2V0QWN0aXZpdHkoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgREFUQUlOOgpAQCAtNjE4LDcgKzYxOCw3IEBACiAgICAgICAgICAgICAgLy8gYWxyZWFkeSBiZWVuIGNhbGxlZAogCiAgICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKLSAgICAgICAgfSBlbHNlIGlmIChtU1NULmdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZSgpICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSB7CisgICAgICAgIH0gZWxzZSBpZiAobVNTVC5nZXRDdXJyZW50RGF0YUNvbm5lY3Rpb25TdGF0ZSgpICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IGUzZTNkNzguLjgwMDYxNWMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTE3NSw3ICsxNzUsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKLSAgICAgICAgaW50IHBzU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0Q3VycmVudENkbWFEYXRhQ29ubmVjdGlvblN0YXRlKCk7CisgICAgICAgIGludCBwc1N0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldEN1cnJlbnREYXRhQ29ubmVjdGlvblN0YXRlKCk7CiAgICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IChtUGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICYmICFnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKTsKICAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOwogCkBAIC0yMTQsMzUgKzIxNCwxNSBAQAogICAgICAgICByZXR1cm4gYWxsb3dlZDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgb25seSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIHdlIHJlcG9ydCB0aGF0IGRhdGEgY29ubmVjdGl2aXR5IGlzIG5vdAotICAgICAqIHBvc3NpYmxlIGFyZQotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YSBpcyBkaXNhbGxvd2VkIChyb2FtaW5nLCBwb3dlciBzdGF0ZSwgdm9pY2UgY2FsbCwgZXRjKS48L2xpPgotICAgICAqIDxsaT5UaGUgY3VycmVudCBkYXRhIHN0YXRlIGlzIHtAY29kZSBESVNDT05ORUNURUR9IGZvciBhIHJlYXNvbiBvdGhlciB0aGFuCi0gICAgICogaGF2aW5nIGV4cGxpY2l0bHkgZGlzYWJsZWQgY29ubmVjdGl2aXR5LiBJbiBvdGhlciB3b3JkcywgZGF0YSBpcyBub3QgYXZhaWxhYmxlCi0gICAgICogYmVjYXVzZSB0aGUgcGhvbmUgaXMgb3V0IG9mIGNvdmVyYWdlIG9yIHNvbWUgbGlrZSByZWFzb24uPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGRhdGEgY29ubmVjdGl2aXR5IGlzIHBvc3NpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFQb3NzaWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBkYXRhQWxsb3dlZCA9IGlzRGF0YUFsbG93ZWQoKTsKLSAgICAgICAgYm9vbGVhbiBhbnlEYXRhRW5hYmxlZCA9IGdldEFueURhdGFFbmFibGVkKCk7Ci0gICAgICAgIGJvb2xlYW4gcG9zc2libGUgPSAoZGF0YUFsbG93ZWQKLSAgICAgICAgICAgICAgICAmJiAhKGFueURhdGFFbmFibGVkICYmIChtU3RhdGUgPT0gU3RhdGUuRkFJTEVEIHx8IG1TdGF0ZSA9PSBTdGF0ZS5JRExFKSkpOwotICAgICAgICBpZiAoIXBvc3NpYmxlICYmIERCRykgewotICAgICAgICAgICAgbG9nKCJpc0RhdGFQb3NzaWJsZSgpICIgKyBwb3NzaWJsZSArICIsIGRhdGFBbGxvd2VkPSIgKyBkYXRhQWxsb3dlZCArCi0gICAgICAgICAgICAgICAgICAgICIgYW55RGF0YUVuYWJsZWQ9IiArIGFueURhdGFFbmFibGVkICsgIiBkYXRhU3RhdGU9IiArIG1TdGF0ZSk7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhUG9zc2libGUoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgYm9vbGVhbiBwb3NzaWJsZSA9IGlzRGF0YUFsbG93ZWQoKSAmJiAhKGdldEFueURhdGFFbmFibGVkKCkgJiYKKyAgICAgICAgICAgICAgICAobVN0YXRlID09IFN0YXRlLkZBSUxFRCB8fCBtU3RhdGUgPT0gU3RhdGUuSURMRSkpOworICAgICAgICBpZiAoIXBvc3NpYmxlICYmIERCRyAmJiBpc0RhdGFBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgcG9zc2libGUuICBObyBjb3ZlcmFnZTogZGF0YVN0YXRlID0gIiArIG1TdGF0ZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBvc3NpYmxlOwogICAgIH0KLSAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFQb3NzaWJsZShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gaXNEYXRhUG9zc2libGUoKTsKLSAgICB9Ci0KIAogICAgIHByaXZhdGUgYm9vbGVhbiB0cnlTZXR1cERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coIioqKnRyeVNldHVwRGF0YSBkdWUgdG8gIiArIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOwpAQCAtMjU4LDcgKzIzOCw3IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBwc1N0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICBpbnQgcHNTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXRDdXJyZW50RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOwogICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBtUGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwogICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hTHRlU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IGQ3OWYwYTFlLi43YmM3Y2EyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hTHRlU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0OwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwpAQCAtNDgsMjIgKzQ5LDM4IEBACiAKICAgICBwdWJsaWMgQ2RtYUx0ZVNlcnZpY2VTdGF0ZVRyYWNrZXIoQ0RNQUxURVBob25lIHBob25lKSB7CiAgICAgICAgIHN1cGVyKHBob25lKTsKKyAgICAgICAgY20ucmVnaXN0ZXJGb3JTSU1SZWFkeSh0aGlzLCBFVkVOVF9TSU1fUkVBRFksIG51bGwpOwogICAgICAgICBtQ2RtYUx0ZVBob25lID0gcGhvbmU7CiAKICAgICAgICAgbUx0ZVNTID0gbmV3IFNlcnZpY2VTdGF0ZSgpOwogICAgICAgICBpZiAoREJHKSBsb2coIkNkbWFMdGVTZXJ2aWNlU3RhdGVUcmFja2VyIENvbnN0cnVjdG9ycyIpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIGNtLnVucmVnaXN0ZXJGb3JTSU1SZWFkeSh0aGlzKTsKKyAgICAgICAgc3VwZXIuZGlzcG9zZSgpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgQXN5bmNSZXN1bHQgYXI7CiAgICAgICAgIGludFtdIGludHM7CiAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3M7Ci0gICAgICAgIGlmIChtc2cud2hhdCA9PSBFVkVOVF9QT0xMX1NUQVRFX0dQUlMpIHsKKyAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICBjYXNlIEVWRU5UX1BPTExfU1RBVEVfR1BSUzoKICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiaGFuZGxlTWVzc2FnZSBFVkVOVF9QT0xMX1NUQVRFX0dQUlMiKTsKICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KW1zZy5vYmo7CiAgICAgICAgICAgICBoYW5kbGVQb2xsU3RhdGVSZXN1bHQobXNnLndoYXQsIGFyKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1NJTV9SRUFEWToKKyAgICAgICAgICAgIGlmIChEQkcpIGxvZygiaGFuZGxlTWVzc2FnZSBFVkVOVF9TSU1fUkVBRFkiKTsKKyAgICAgICAgICAgIGlzU3Vic2NyaXB0aW9uRnJvbVJ1aW0gPSBmYWxzZTsKKyAgICAgICAgICAgIGNtLmdldENETUFTdWJzY3JpcHRpb24oIG9idGFpbk1lc3NhZ2UoRVZFTlRfUE9MTF9TVEFURV9DRE1BX1NVQlNDUklQVElPTikpOworICAgICAgICAgICAgcG9sbFN0YXRlKCk7CisgICAgICAgICAgICAvLyBTaWduYWwgc3RyZW5ndGggcG9sbGluZyBzdG9wcyB3aGVuIHJhZGlvIGlzIG9mZi4KKyAgICAgICAgICAgIHF1ZXVlTmV4dFNpZ25hbFN0cmVuZ3RoUG9sbCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzEsMzkgKzE4OCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBuZXR3b3JrVHlwZVRvU3RyaW5nKGludCB0eXBlKSB7Ci0gICAgICAgIFN0cmluZyByZXQgPSAidW5rbm93biI7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0lTOTVBOgotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9JUzk1QjoKLSAgICAgICAgICAgICAgICByZXQgPSAiQ0RNQSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZXzF4UlRUOgotICAgICAgICAgICAgICAgIHJldCA9ICJDRE1BIC0gMXhSVFQiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPXzA6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIkNETUEgLSBFdkRvIHJldi4gMCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE9fQToKLSAgICAgICAgICAgICAgICByZXQgPSAiQ0RNQSAtIEV2RG8gcmV2LiBBIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET19COgotICAgICAgICAgICAgICAgIHJldCA9ICJDRE1BIC0gRXZEbyByZXYuIEIiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9MVEU6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIkxURSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VIUlBEOgotICAgICAgICAgICAgICAgIHJldCA9ICJDRE1BIC0gZUhSUEQiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzbG9nZSgibmV0d29ya1R5cGVUb1N0cmluZzogV3JvbmcgbmV0d29yaywgY2FuIG5vdCByZXR1cm4gYSBzdHJpbmcuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBwb2xsU3RhdGVEb25lKCkgewogICAgICAgICAvLyBkZXRlcm1pbmUgZGF0YSBOZXR3b3JrVHlwZSBmcm9tIGJvdGggTEVUIGFuZCBDRE1BIFNTCkBAIC0yNjcsMTMgKzI1MSwyMCBAQAogICAgICAgICAgICAgIChuZXdOZXR3b3JrVHlwZSA8PSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPX0EpKTsKIAogICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBsb2coInBvbGxTdGF0ZURvbmU6IGhhc1JlZ2lzdGVyZWQgPSAiCi0gICAgICAgICAgICAgICAgKyBoYXNSZWdpc3RlcmVkICsgIiBoYXNDZG1hRGF0YUNvbm5lY3Rpb25BdHRhY2hlZCA9ICIKLSAgICAgICAgICAgICAgICArIGhhc0NkbWFEYXRhQ29ubmVjdGlvbkF0dGFjaGVkICsgIiBoYXNDZG1hRGF0YUNvbm5lY3Rpb25DaGFuZ2VkID0gIgotICAgICAgICAgICAgICAgICsgaGFzQ2RtYURhdGFDb25uZWN0aW9uQ2hhbmdlZCArICIgaGFzTmV0d29ya1R5cGVDaGFuZ2VkID0gIgotICAgICAgICAgICAgICAgICsgaGFzTmV0d29ya1R5cGVDaGFuZ2VkICsgIiBoYXM0Z0hhbmRvZmYgPSAiICsgaGFzNGdIYW5kb2ZmCi0gICAgICAgICAgICAgICAgKyAiIGhhc011bHRpQXBuU3VwcG9ydCA9ICIgKyBoYXNNdWx0aUFwblN1cHBvcnQgKyAiIGhhc0xvc3RNdWx0aUFwblN1cHBvcnQgPSAiCi0gICAgICAgICAgICAgICAgKyBoYXNMb3N0TXVsdGlBcG5TdXBwb3J0KTsKKyAgICAgICAgICAgIGxvZygicG9sbFN0YXRlRG9uZToiCisgICAgICAgICAgICAgICAgKyAiIGhhc1JlZ2lzdGVyZWQ9IiArIGhhc1JlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICArICIgaGFzRGVlZ2lzdGVyZWQ9IiArIGhhc0RlcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgICsgIiBoYXNDZG1hRGF0YUNvbm5lY3Rpb25BdHRhY2hlZD0iICsgaGFzQ2RtYURhdGFDb25uZWN0aW9uQXR0YWNoZWQKKyAgICAgICAgICAgICAgICArICIgaGFzQ2RtYURhdGFDb25uZWN0aW9uRGV0YWNoZWQ9IiArIGhhc0NkbWFEYXRhQ29ubmVjdGlvbkRldGFjaGVkCisgICAgICAgICAgICAgICAgKyAiIGhhc0NkbWFEYXRhQ29ubmVjdGlvbkNoYW5nZWQ9IiArIGhhc0NkbWFEYXRhQ29ubmVjdGlvbkNoYW5nZWQKKyAgICAgICAgICAgICAgICArICIgaGFzTmV0d29ya1R5cGVDaGFuZ2VkID0gIiArIGhhc05ldHdvcmtUeXBlQ2hhbmdlZAorICAgICAgICAgICAgICAgICsgIiBoYXNDaGFuZ2VkPSIgKyBoYXNDaGFuZ2VkCisgICAgICAgICAgICAgICAgKyAiIGhhc1JvYW1pbmdPbj0iICsgaGFzUm9hbWluZ09uCisgICAgICAgICAgICAgICAgKyAiIGhhc1JvYW1pbmdPZmY9IiArIGhhc1JvYW1pbmdPZmYKKyAgICAgICAgICAgICAgICArICIgaGFzTG9jYXRpb25DaGFuZ2VkPSIgKyBoYXNMb2NhdGlvbkNoYW5nZWQKKyAgICAgICAgICAgICAgICArICIgaGFzNGdIYW5kb2ZmID0gIiArIGhhczRnSGFuZG9mZgorICAgICAgICAgICAgICAgICsgIiBoYXNNdWx0aUFwblN1cHBvcnQ9IiArIGhhc011bHRpQXBuU3VwcG9ydAorICAgICAgICAgICAgICAgICsgIiBoYXNMb3N0TXVsdGlBcG5TdXBwb3J0PSIgKyBoYXNMb3N0TXVsdGlBcG5TdXBwb3J0KTsKICAgICAgICAgfQogICAgICAgICAvLyBBZGQgYW4gZXZlbnQgbG9nIHdoZW4gY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VzCiAgICAgICAgIGlmIChzcy5nZXRTdGF0ZSgpICE9IG5ld1NTLmdldFN0YXRlKCkKQEAgLTMwMSw3ICsyOTIsNyBAQAogICAgICAgICAgICAgICAgICYmIChwaG9uZS5tRGF0YUNvbm5lY3Rpb25UcmFja2VyIGluc3RhbmNlb2YgR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyKSkgewogICAgICAgICAgICAgaWYgKERCRylsb2coIkdzbURhdGFDb25uZWN0aW9uVHJhY2tlciBkaXNwb3NlZCIpOwogICAgICAgICAgICAgcGhvbmUubURhdGFDb25uZWN0aW9uVHJhY2tlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBwaG9uZS5tRGF0YUNvbm5lY3Rpb25UcmFja2VyID0gbmV3IENkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIoKENETUFQaG9uZSlwaG9uZSk7CisgICAgICAgICAgICBwaG9uZS5tRGF0YUNvbm5lY3Rpb25UcmFja2VyID0gbmV3IENkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIocGhvbmUpOwogICAgICAgICB9CiAKICAgICAgICAgQ2RtYUNlbGxMb2NhdGlvbiB0Y2wgPSBjZWxsTG9jOwpAQCAtMzE1LDcgKzMwNiw3IEBACiAKICAgICAgICAgaWYgKGhhc05ldHdvcmtUeXBlQ2hhbmdlZCkgewogICAgICAgICAgICAgcGhvbmUuc2V0U3lzdGVtUHJvcGVydHkoVGVsZXBob255UHJvcGVydGllcy5QUk9QRVJUWV9EQVRBX05FVFdPUktfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgbmV0d29ya1R5cGVUb1N0cmluZyhuZXR3b3JrVHlwZSkpOworICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlU3RhdGUucmFkaW9UZWNobm9sb2d5VG9TdHJpbmcobmV0d29ya1R5cGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNSZWdpc3RlcmVkKSB7CkBAIC0zMzYsNyArMzI3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGVyaVRleHQgPSBwaG9uZS5nZXRDb250ZXh0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5yb2FtaW5nVGV4dFNlYXJjaGluZykudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3Muc2V0Q2RtYUVyaVRleHQoZXJpVGV4dCk7CisgICAgICAgICAgICAgICAgc3Muc2V0T3BlcmF0b3JBbHBoYUxvbmcoZXJpVGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY20uZ2V0U2ltU3RhdGUoKS5pc1NJTVJlYWR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTSU0gaXMgZm91bmQgb24gdGhlIGRldmljZS4gUmVhZCB0aGUgb3BlcmF0b3IgbmFtZSBmcm9tIHRoZSBjYXJkLgorICAgICAgICAgICAgICAgIHNzLnNldE9wZXJhdG9yQWxwaGFMb25nKHBob25lLm1JY2NSZWNvcmRzLmdldFNlcnZpY2VQcm92aWRlck5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBTSU0gY2FyZCBpcyBwcmVzZW50LCBFcmkgd2lsbCBub3QgYmUgdXNlZC4gVHVybiBpdCBvZmYKKyAgICAgICAgICAgICAgICBzcy5zZXRDZG1hRXJpSWNvbkluZGV4KEVyaUluZm8uUk9BTUlOR19JTkRJQ0FUT1JfT0ZGKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nIG9wZXJhdG9yTnVtZXJpYzsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjRmlsZUhhbmRsZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjRmlsZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWVkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYUx0ZVVpY2NGaWxlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ29uc3RhbnRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NGaWxlSGFuZGxlcjsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDZG1hTHRlVWljY0ZpbGVIYW5kbGVyIGV4dGVuZHMgSWNjRmlsZUhhbmRsZXIgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJDRE1BIjsKKworICAgIENkbWFMdGVVaWNjRmlsZUhhbmRsZXIoQ0RNQUxURVBob25lIHBob25lKSB7CisgICAgICAgIHN1cGVyKHBob25lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVGUGF0aChpbnQgZWZpZCkgeworICAgICAgICBzd2l0Y2goZWZpZCkgeworICAgICAgICBjYXNlIEVGX0NTSU1fU1BOOgorICAgICAgICBjYXNlIEVGX0NTSU1fTEk6CisgICAgICAgICAgICByZXR1cm4gTUZfU0lNICsgREZfQ0RNQTsKKyAgICAgICAgY2FzZSBFRl9BRDoKKyAgICAgICAgICAgIHJldHVybiBNRl9TSU0gKyBERl9HU007CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldENvbW1vbkljY0VGUGF0aChlZmlkKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2dkKFN0cmluZyBtc2cpIHsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgIltDZG1hTHRlVWljY0ZpbGVIYW5kbGVyXSAiICsgbXNnKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2dlKFN0cmluZyBtc2cpIHsKKyAgICAgICAgTG9nLmUoTE9HX1RBRywgIltDZG1hTHRlVWljY0ZpbGVIYW5kbGVyXSAiICsgbXNnKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjUmVjb3Jkcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYUx0ZVVpY2NSZWNvcmRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzg4NzlkNgotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjUmVjb3Jkcy5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWE7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXMuUFJPUEVSVFlfSUNDX09QRVJBVE9SX0FMUEhBOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjRmlsZUhhbmRsZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZUJhc2U7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNUmVjb3JkczsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENkbWFMdGVVaWNjUmVjb3JkcyBleHRlbmRzIFNJTVJlY29yZHMgeworICAgIC8vIEZyb20gQ1NJTSBhcHBsaWNhdGlvbgorICAgIHByaXZhdGUgYnl0ZVtdIG1FRnBsID0gbnVsbDsKKyAgICBwcml2YXRlIGJ5dGVbXSBtRUZsaSA9IG51bGw7CisgICAgYm9vbGVhbiBjc2ltU3BuRGlzcGxheUNvbmRpdGlvbiA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9QTF9ET05FID0gQ1NJTV9FVkVOVF9CQVNFOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQ1NJTV9MSV9ET05FID0gQ1NJTV9FVkVOVF9CQVNFICsgMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NTSU1fU1BOX0RPTkUgPSBDU0lNX0VWRU5UX0JBU0UgKyAyOworCisgICAgcHVibGljIENkbWFMdGVVaWNjUmVjb3JkcyhQaG9uZUJhc2UgcCkgeworICAgICAgICBzdXBlcihwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIEFzeW5jUmVzdWx0IGFyOworICAgICAgICBieXRlIGRhdGFbXTsKKworICAgICAgICBib29sZWFuIGlzQ3NpbVJlY29yZExvYWRSZXNwb25zZSA9IGZhbHNlOworCisgICAgICAgIHRyeSB7IHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgRVZFTlRfR0VUX1BMX0RPTkU6CisgICAgICAgICAgICAgICAgLy8gUmVmZXIgdG8gRVRTSSBUUy4xMDIuMjIxCisgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJFRl9HRVRfRUZfUExfRE9ORSIpOworICAgICAgICAgICAgICAgIGlzQ3NpbVJlY29yZExvYWRSZXNwb25zZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBhciA9IChBc3luY1Jlc3VsdCkgbXNnLm9iajsKKworICAgICAgICAgICAgICAgIGlmIChhci5leGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiYXIuZXhjZXB0aW9uID0gIiArIGFyLmV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1FRnBsID0gKGJ5dGVbXSkgYXIucmVzdWx0OworICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiRUZfUEw9IiArIEljY1V0aWxzLmJ5dGVzVG9IZXhTdHJpbmcobUVGcGwpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBFVkVOVF9HRVRfQ1NJTV9MSV9ET05FOgorICAgICAgICAgICAgICAgIC8vIFJlZmVyIHRvIEMuUzAwNjUgNS4yLjI2CisgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJFVkVOVF9HRVRfQ1NJTV9MSV9ET05FIik7CisgICAgICAgICAgICAgICAgaXNDc2ltUmVjb3JkTG9hZFJlc3BvbnNlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KSBtc2cub2JqOworICAgICAgICAgICAgICAgIGlmIChhci5leGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiYXIuZXhjZXB0aW9uID0gIiArIGFyLmV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1FRmxpID0gKGJ5dGVbXSkgYXIucmVzdWx0OworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgY3NpbSBlZmxpIGRhdGEgdG8gaXNvIDYzOSBmb3JtYXQKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FRmxpLmxlbmd0aDsgaSs9MikgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobUVGbGlbaSsxXSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDE6IG1FRmxpW2ldID0gJ2UnOyBtRUZsaVtpKzFdID0gJ24nO2JyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDI6IG1FRmxpW2ldID0gJ2YnOyBtRUZsaVtpKzFdID0gJ3InO2JyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDM6IG1FRmxpW2ldID0gJ2UnOyBtRUZsaVtpKzFdID0gJ3MnO2JyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDQ6IG1FRmxpW2ldID0gJ2onOyBtRUZsaVtpKzFdID0gJ2EnO2JyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDU6IG1FRmxpW2ldID0gJ2snOyBtRUZsaVtpKzFdID0gJ28nO2JyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDY6IG1FRmxpW2ldID0gJ3onOyBtRUZsaVtpKzFdID0gJ2gnO2JyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDc6IG1FRmxpW2ldID0gJ2gnOyBtRUZsaVtpKzFdID0gJ2UnO2JyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBtRUZsaVtpXSA9ICcgJzsgbUVGbGlbaSsxXSA9ICcgJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiRUZfTEk9IiArIEljY1V0aWxzLmJ5dGVzVG9IZXhTdHJpbmcobUVGbGkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVZFTlRfR0VUX0NTSU1fU1BOX0RPTkU6CisgICAgICAgICAgICAgICAgLy8gUmVmZXIgdG8gQy5TMDA2NSA1LjIuMzIKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkVWRU5UX0dFVF9DU0lNX1NQTl9ET05FIik7CisgICAgICAgICAgICAgICAgaXNDc2ltUmVjb3JkTG9hZFJlc3BvbnNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhciA9IChBc3luY1Jlc3VsdCkgbXNnLm9iajsKKworICAgICAgICAgICAgICAgIGlmIChhci5leGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiYXIuZXhjZXB0aW9uPSIgKyBhci5leGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb25HZXRDU2ltU3BuRG9uZShhcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU1lc3NhZ2UobXNnKTsKKyAgICAgICAgfX1jYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFeGNlcHRpb24gcGFyc2luZyBTSU0gcmVjb3JkIiwgZXhjKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpc0NzaW1SZWNvcmRMb2FkUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBvblJlY29yZExvYWRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZWNvcmRMb2FkZWQoKSB7CisgICAgICAgIC8vIE9uZSByZWNvcmQgbG9hZGVkIHN1Y2Nlc3NmdWxseSBvciBmYWlsZWQsIEluIGVpdGhlciBjYXNlCisgICAgICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSByZWNvcmRzVG9Mb2FkIGNvdW50CisgICAgICAgIHJlY29yZHNUb0xvYWQgLT0gMTsKKworICAgICAgICBpZiAocmVjb3Jkc1RvTG9hZCA9PSAwICYmIHJlY29yZHNSZXF1ZXN0ZWQgPT0gdHJ1ZSkgeworICAgICAgICAgICAgb25BbGxSZWNvcmRzTG9hZGVkKCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVjb3Jkc1RvTG9hZCA8IDApIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTSU1SZWNvcmRzOiByZWNvcmRzVG9Mb2FkIDwwLCBwcm9ncmFtbWVyIGVycm9yIHN1c3BlY3RlZCIpOworICAgICAgICAgICAgcmVjb3Jkc1RvTG9hZCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmZXRjaFNpbVJlY29yZHMoKSB7CisgICAgICAgIEljY0ZpbGVIYW5kbGVyIGljY0ZoID0gcGhvbmUuZ2V0SWNjRmlsZUhhbmRsZXIoKTsKKyAgICAgICAgcmVjb3Jkc1JlcXVlc3RlZCA9IHRydWU7CisKKyAgICAgICAgcGhvbmUubUNNLmdldElNU0kob2J0YWluTWVzc2FnZShFVkVOVF9HRVRfSU1TSV9ET05FKSk7CisgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKKworICAgICAgICBpY2NGaC5sb2FkRUZUcmFuc3BhcmVudChFRl9JQ0NJRCwgb2J0YWluTWVzc2FnZShFVkVOVF9HRVRfSUNDSURfRE9ORSkpOworICAgICAgICByZWNvcmRzVG9Mb2FkKys7CisKKyAgICAgICAgaWNjRmgubG9hZEVGVHJhbnNwYXJlbnQoRUZfQUQsIG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0FEX0RPTkUpKTsKKyAgICAgICAgcmVjb3Jkc1RvTG9hZCsrOworCisgICAgICAgIGljY0ZoLmxvYWRFRlRyYW5zcGFyZW50KEVGX1BMLCBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9QTF9ET05FKSk7CisgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKKworICAgICAgICBpY2NGaC5sb2FkRUZUcmFuc3BhcmVudChFRl9DU0lNX0xJLCBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9DU0lNX0xJX0RPTkUpKTsKKyAgICAgICAgcmVjb3Jkc1RvTG9hZCsrOworCisgICAgICAgIGljY0ZoLmxvYWRFRlRyYW5zcGFyZW50KEVGX0NTSU1fU1BOLCBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9DU0lNX1NQTl9ET05FKSk7CisgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25HZXRDU2ltU3BuRG9uZShBc3luY1Jlc3VsdCBhcikgeworICAgICAgICBieXRlW10gZGF0YSA9IChieXRlW10pIGFyLnJlc3VsdDsKKyAgICAgICAgaWYgKERCRykgbG9nKCJDU0lNX1NQTj0iICsKKyAgICAgICAgICAgICAgICAgICAgIEljY1V0aWxzLmJ5dGVzVG9IZXhTdHJpbmcoZGF0YSkpOworCisgICAgICAgIC8vIEMuUzAwNjUgZm9yIEVGX1NQTiBkZWNvZGluZworICAgICAgICBjc2ltU3BuRGlzcGxheUNvbmRpdGlvbiA9ICgoMHgwMiAmIGRhdGFbMF0pID4gMCk/dHJ1ZTpmYWxzZTsKKworICAgICAgICBpbnQgZW5jb2RpbmcgPSBkYXRhWzFdOworICAgICAgICBpbnQgbGFuZ3VhZ2UgPSBkYXRhWzJdOworICAgICAgICBieXRlW10gc3BuRGF0YSA9IG5ldyBieXRlWzMyXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAzLCBzcG5EYXRhLCAwLCAoZGF0YS5sZW5ndGggPCAzMik/ZGF0YS5sZW5ndGg6MzIpOworCisgICAgICAgIGludCBudW1CeXRlczsKKyAgICAgICAgZm9yIChudW1CeXRlcyA9IDA7IG51bUJ5dGVzIDwgc3BuRGF0YS5sZW5ndGg7IG51bUJ5dGVzKyspIHsKKyAgICAgICAgICAgIGlmICgoc3BuRGF0YVtudW1CeXRlc10gJiAweEZGKSA9PSAweEZGKSBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1CeXRlcyA9PSAwKSB7CisgICAgICAgICAgICBzcG4gPSAiIjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZykgeworICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19PQ1RFVDoKKyAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfTEFUSU46CisgICAgICAgICAgICAgICAgc3BuID0gbmV3IFN0cmluZyhzcG5EYXRhLCAwLCBudW1CeXRlcywgIklTTy04ODU5LTEiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfSUE1OgorICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19HU01fN0JJVF9BTFBIQUJFVDoKKyAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfN0JJVF9BU0NJSToKKyAgICAgICAgICAgICAgICBzcG4gPSBHc21BbHBoYWJldC5nc203Qml0UGFja2VkVG9TdHJpbmcoc3BuRGF0YSwgMCwgKG51bUJ5dGVzKjgpLzcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19VTklDT0RFXzE2OgorICAgICAgICAgICAgICAgIHNwbiA9ICBuZXcgU3RyaW5nKHNwbkRhdGEsIDAsIG51bUJ5dGVzLCAidXRmLTE2Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGxvZygiU1BOIGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJzcG4gZGVjb2RlIGVycm9yOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgbG9nKCJzcG49IiArIHNwbik7CisgICAgICAgIGlmIChEQkcpIGxvZygic3BuQ29uZGl0aW9uPSIgKyBjc2ltU3BuRGlzcGxheUNvbmRpdGlvbik7CisgICAgICAgIHBob25lLnNldFN5c3RlbVByb3BlcnR5KFBST1BFUlRZX0lDQ19PUEVSQVRPUl9BTFBIQSwgc3BuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldFByZWZlcnJlZExhbmd1YWdlKCkgeworICAgICAgICByZXR1cm4gbUVGcGw7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRMYW5ndWFnZUluZGljYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtRUZsaTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAzNWE5OGVkLi5lYWQ2YmNhIDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNaW5JbmZvUmVhZHkgPSBmYWxzZTsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc0VyaVRleHRMb2FkZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdWJzY3JpcHRpb25Gcm9tUnVpbSA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3Vic2NyaXB0aW9uRnJvbVJ1aW0gPSBmYWxzZTsKIAogICAgIC8qIFVzZWQgb25seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAqLwogICAgIHByaXZhdGUgU3RyaW5nIG1SZWdpc3RyYXRpb25EZW5pZWRSZWFzb247CkBAIC0yNTMsNiArMjUzLDcgQEAKIAogICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CiAgICAgICAgIGNhc2UgRVZFTlRfUkFESU9fQVZBSUxBQkxFOgorICAgICAgICAgICAgaWYgKERCRykgbG9nKCJoYW5kbGVNZXNzYWdlOiBFVkVOVF9SQURJT19BVkFJTEFCTEUiKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRVZFTlRfUlVJTV9SRUFEWToKQEAgLTI2Niw3ICsyNjcsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjbS5nZXRDRE1BU3Vic2NyaXB0aW9uKG9idGFpbk1lc3NhZ2UoRVZFTlRfUE9MTF9TVEFURV9DRE1BX1NVQlNDUklQVElPTikpOwotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJSZWNlaXZlIEVWRU5UX1JVSU1fUkVBRFkgYW5kIFNlbmQgUmVxdWVzdCBnZXRDRE1BU3Vic2NyaXB0aW9uLiIpOworICAgICAgICAgICAgaWYgKERCRykgbG9nKCJoYW5kbGVNZXNzYWdlOiBFVkVOVF9SVUlNX1JFQURZLCBTZW5kIFJlcXVlc3QgZ2V0Q0RNQVN1YnNjcmlwdGlvbi4iKTsKIAogICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgbmV0d29yayBzZWxlY3Rpb24uCiAgICAgICAgICAgICBwb2xsU3RhdGUoKTsKQEAgLTI4MCw2ICsyODEsNyBAQAogICAgICAgICAgICAgLy8gRm9yIE5vbi1SVUlNIHBob25lcywgdGhlIHN1YnNjcmlwdGlvbiBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4KICAgICAgICAgICAgIC8vIE5vbiBWb2xhdGlsZS4gSGVyZSB3aGVuIE5vbi1Wb2xhdGlsZSBpcyByZWFkeSwgd2UgY2FuIHBvbGwgdGhlIENETUEKICAgICAgICAgICAgIC8vIHN1YnNjcmlwdGlvbiBpbmZvLgorICAgICAgICAgICAgaWYgKERCRykgbG9nKCJoYW5kbGVNZXNzYWdlOiBFVkVOVF9OVl9SRUFEWSwgU2VuZCBSZXF1ZXN0IGdldENETUFTdWJzY3JpcHRpb24uIik7CiAgICAgICAgICAgICBjbS5nZXRDRE1BU3Vic2NyaXB0aW9uKCBvYnRhaW5NZXNzYWdlKEVWRU5UX1BPTExfU1RBVEVfQ0RNQV9TVUJTQ1JJUFRJT04pKTsKICAgICAgICAgICAgIHBvbGxTdGF0ZSgpOwogICAgICAgICAgICAgLy8gU2lnbmFsIHN0cmVuZ3RoIHBvbGxpbmcgc3RvcHMgd2hlbiByYWRpbyBpcyBvZmYuCkBAIC04NzEsMzYgKzg3Myw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBuZXR3b3JrVHlwZVRvU3RyaW5nKGludCB0eXBlKSB7Ci0gICAgICAgIFN0cmluZyByZXQgPSAidW5rbm93biI7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfSVM5NUE6Ci0gICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfSVM5NUI6Ci0gICAgICAgICAgICByZXQgPSAiQ0RNQSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV8xeFJUVDoKLSAgICAgICAgICAgIHJldCA9ICJDRE1BIC0gMXhSVFQiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET18wOgotICAgICAgICAgICAgcmV0ID0gIkNETUEgLSBFdkRvIHJldi4gMCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPX0E6Ci0gICAgICAgICAgICByZXQgPSAiQ0RNQSAtIEV2RG8gcmV2LiBBIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE9fQjoKLSAgICAgICAgICAgIHJldCA9ICJDRE1BIC0gRXZEbyByZXYuIEIiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgc2xvZygiV3JvbmcgbmV0d29yay4gQ2FuIG5vdCByZXR1cm4gYSBzdHJpbmcuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KICAgICBwcm90ZWN0ZWQgdm9pZCBmaXhUaW1lWm9uZShTdHJpbmcgaXNvQ291bnRyeUNvZGUpIHsKICAgICAgICAgVGltZVpvbmUgem9uZSA9IG51bGw7CiAgICAgICAgIC8vIElmIHRoZSBvZmZzZXQgaXMgKDAsIGZhbHNlKSBhbmQgdGhlIHRpbWUgem9uZSBwcm9wZXJ0eQpAQCAtOTk4LDcgKzk3MCw3IEBACiAKICAgICAgICAgaWYgKGhhc05ldHdvcmtUeXBlQ2hhbmdlZCkgewogICAgICAgICAgICAgcGhvbmUuc2V0U3lzdGVtUHJvcGVydHkoVGVsZXBob255UHJvcGVydGllcy5QUk9QRVJUWV9EQVRBX05FVFdPUktfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgbmV0d29ya1R5cGVUb1N0cmluZyhuZXR3b3JrVHlwZSkpOworICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlU3RhdGUucmFkaW9UZWNobm9sb2d5VG9TdHJpbmcobmV0d29ya1R5cGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNSZWdpc3RlcmVkKSB7CkBAIC0xMDE3LDcgKzk4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVyaVRleHQgPSBwaG9uZS5nZXRDb250ZXh0KCkuZ2V0VGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5yb2FtaW5nVGV4dFNlYXJjaGluZykudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3Muc2V0Q2RtYUVyaVRleHQoZXJpVGV4dCk7CisgICAgICAgICAgICAgICAgc3Muc2V0T3BlcmF0b3JBbHBoYUxvbmcoZXJpVGV4dCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZyBvcGVyYXRvck51bWVyaWM7CkBAIC0xMTIwLDcgKzEwOTIsNyBAQAogICAgICAqIFRoaXMgY29kZSBzaG91bGQgcHJvYmFibHkgYmUgaG9pc3RlZCB0byB0aGUgYmFzZSBjbGFzcyBzbwogICAgICAqIHRoZSBmaXgsIHdoZW4gYWRkZWQsIHdvcmtzIGZvciBib3RoLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZAorICAgIHByb3RlY3RlZCB2b2lkCiAgICAgcXVldWVOZXh0U2lnbmFsU3RyZW5ndGhQb2xsKCkgewogICAgICAgICBpZiAoZG9udFBvbGxTaWduYWxTdHJlbmd0aCB8fCAoY20uZ2V0UmFkaW9TdGF0ZSgpLmlzR3NtKCkpKSB7CiAgICAgICAgICAgICAvLyBUaGUgcmFkaW8gaXMgdGVsbGluZyB1cyBhYm91dCBzaWduYWwgc3RyZW5ndGggY2hhbmdlcwpAQCAtMTIxNywxOCArMTE4OSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IENETUEgZGF0YSBjb25uZWN0aW9uIHN0YXRlLiBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV8xeFJUVCBvcgotICAgICAqIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE8gaXMgdGhlIHNhbWUgYXMgImF0dGFjaGVkIiBhbmQKLSAgICAgKiBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9VTktOT1dOIGlzIHRoZSBzYW1lIGFzIGRldGFjaGVkLgotICAgICAqLwotICAgIC8qcGFja2FnZSovIGludCBnZXRDdXJyZW50Q2RtYURhdGFDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb25TdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFRPRE86IEluIHRoZSBmdXR1cmUsIHdlIG5lZWQgcmVtb3ZlIGdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZQotICAgICovCiAgICAgcHVibGljIGludCBnZXRDdXJyZW50RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvblN0YXRlOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IGNlMzMwNjYuLjA0ZWUyZGQ4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYTsKIAoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTU2LDE0ICs1OCwxMSBAQAogICAgICAgICAgICAgcmVjb3JkU2l6ZSA9IG5ldyBpbnRbM107CiAKICAgICAgICAgICAgIC8vVXNpbmcgbUJhc2VIYW5kbGVyLCBubyBkaWZmZXJlbmNlIGluIEVWRU5UX0dFVF9TSVpFX0RPTkUgaGFuZGxpbmcKLSAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9HRVRfU0laRV9ET05FKTsKKyAgICAgICAgICAgIEF0b21pY0Jvb2xlYW4gc3RhdHVzID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG1CYXNlSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9TSVpFX0RPTkUsIHN0YXR1cyk7CiAKICAgICAgICAgICAgIHBob25lLmdldEljY0ZpbGVIYW5kbGVyKCkuZ2V0RUZMaW5lYXJSZWNvcmRTaXplKGVmaWQsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUxvY2sud2FpdCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZ2QoImludGVycnVwdGVkIHdoaWxlIHRyeWluZyB0byBsb2FkIGZyb20gdGhlIFJVSU0iKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdhaXRGb3JSZXN1bHQoc3RhdHVzKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZWNvcmRTaXplOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCmluZGV4IDNmNGNkNjcuLmJlNWM2MTYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CkBAIC04MDYsNyArODA3LDEyIEBACiAgICAgICAgICAqIG1lY2hhbmlzbSwgYW5kIGF2b2lkIG51bGwgcG9pbnRlciBleGNlcHRpb25zLgogICAgICAgICAgKi8KIAotICAgICAgICBDZG1hU21zQWRkcmVzcyBkZXN0QWRkciA9IENkbWFTbXNBZGRyZXNzLnBhcnNlKGRlc3RBZGRyU3RyKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vcnRoIEFtZXJpY2EgUGx1cyBDb2RlIDoKKyAgICAgICAgICogQ29udmVydCArIGNvZGUgdG8gMDExIGFuZCBkaWFsIG91dCBmb3IgaW50ZXJuYXRpb25hbCBTTVMKKyAgICAgICAgICovCisgICAgICAgIENkbWFTbXNBZGRyZXNzIGRlc3RBZGRyID0gQ2RtYVNtc0FkZHJlc3MucGFyc2UoCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoZGVzdEFkZHJTdHIpKTsKICAgICAgICAgaWYgKGRlc3RBZGRyID09IG51bGwpIHJldHVybiBudWxsOwogCiAgICAgICAgIEJlYXJlckRhdGEgYmVhcmVyRGF0YSA9IG5ldyBCZWFyZXJEYXRhKCk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCBlMWE2ZmVmLi5kYjJiNDkwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKQEAgLTIwNCwyOCArMjA1LDYgQEAKICAgICAgICAgcmV0dXJuIChhcG5Db250ZXh0LmdldERhdGFDb25uZWN0aW9uKCkgIT0gbnVsbCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogVGhlIG9ubHkgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB3ZSByZXBvcnQgdGhhdCBkYXRhIGNvbm5lY3Rpdml0eSBpcyBub3QKLSAgICAgKiBwb3NzaWJsZSBhcmUKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkRhdGEgaXMgZGlzYWxsb3dlZCAocm9hbWluZywgcG93ZXIgc3RhdGUsIHZvaWNlIGNhbGwsIGV0YykuPC9saT4KLSAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBpcyB7QGNvZGUgRElTQ09OTkVDVEVEfSBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgotICAgICAqIGhhdmluZyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbm5lY3Rpdml0eS4gSW4gb3RoZXIgd29yZHMsIGRhdGEgaXMgbm90IGF2YWlsYWJsZQotICAgICAqIGJlY2F1c2UgdGhlIHBob25lIGlzIG91dCBvZiBjb3ZlcmFnZSBvciBzb21lIGxpa2UgcmVhc29uLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICogVE9ETyAtIGRvIHBlci1hcG4gbm90aWZpY2F0aW9ucyBvZiBhdmFpbGFiaWxpdHkgdXNpbmcgZGVwZW5kZW5jeU1ldCB2YWx1ZXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhUG9zc2libGUoKSB7Ci0gICAgICAgIGJvb2xlYW4gcG9zc2libGUgPSAoaXNEYXRhQWxsb3dlZCgpCi0gICAgICAgICAgICAgICAgJiYgIShnZXRBbnlEYXRhRW5hYmxlZCgpICYmIChnZXRPdmVyYWxsU3RhdGUoKSA9PSBTdGF0ZS5GQUlMRUQpKSk7Ci0gICAgICAgIGlmICghcG9zc2libGUgJiYgREJHICYmIGlzRGF0YUFsbG93ZWQoKSkgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJEYXRhIG5vdCBwb3NzaWJsZS4gIE5vIGNvdmVyYWdlOiBkYXRhU3RhdGUgPSAiICsgZ2V0T3ZlcmFsbFN0YXRlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3NzaWJsZTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFQb3NzaWJsZShTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICBBcG5Db250ZXh0IGFwbkNvbnRleHQgPSBtQXBuQ29udGV4dHMuZ2V0KGFwblR5cGUpOwpAQCAtNjA3LDMzICs1ODYsNiBAQAogICAgICAgICByZXR1cm4gYWxsb3dlZDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZSBhcG5Db250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXBuQ29udGV4dAotICAgICAqIEBwYXJhbSB0ZWFyRG93bgotICAgICAqIEByZXR1cm4gbm9uZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQXBuQ29udGV4dChBcG5Db250ZXh0IGFwbkNvbnRleHQsIGJvb2xlYW4gdGVhckRvd24pIHsKLSAgICAgICAgaWYgKGFwbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERCRykgbG9nZSgicmVsZWFzZUFwbkNvbnRleHQ6IGFwbkNvbnRleHQgbnVsbCBzaG91bGQgbm90IGhhcHBlbiwgaWdub3JlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRGF0YUNvbm5lY3Rpb24gZGMgPSBhcG5Db250ZXh0LmdldERhdGFDb25uZWN0aW9uKCk7Ci0gICAgICAgIGlmIChkYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2dlKCJyZWxlYXNlQXBuQ29udGV4dDogYXBuQ29udGV4dCBkYyA9PSBudWxsIHNob3VsZCBub3QgaGFwcGVuLCBpZ25vcmUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAodGVhckRvd24pIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygicmVsZWFzZUFwbkNvbnRleHQ6IHRlYXJpbmcgZG93biIpOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKEVWRU5UX0RJU0NPTk5FQ1RfRE9ORSwgYXBuQ29udGV4dCk7Ci0gICAgICAgICAgICBhcG5Db250ZXh0LmdldERhdGFDb25uZWN0aW9uKCkudGVhckRvd24oYXBuQ29udGV4dC5nZXRSZWFzb24oKSwgbXNnKTsKLSAgICAgICAgfQotICAgICAgICBhcG5Db250ZXh0LnNldERhdGFDb25uZWN0aW9uKG51bGwpOwotICAgICAgICBhcG5Db250ZXh0LnNldERhdGFDb25uZWN0aW9uQWMobnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgc2V0dXBEYXRhT25SZWFkeUFwbnMoU3RyaW5nIHJlYXNvbikgewogICAgICAgICAvLyBPbmx5IGNoZWNrIGZvciBkZWZhdWx0IEFQTiBzdGF0ZQogICAgICAgICBmb3IgKEFwbkNvbnRleHQgYXBuQ29udGV4dCA6IG1BcG5Db250ZXh0cy52YWx1ZXMoKSkgewpAQCAtODAyLDE3ICs3NTQsMTcgQEAKICAgICAgICAgfQogCiAgICAgICAgIERhdGFDb25uZWN0aW9uQWMgZGNhYyA9IGFwbkNvbnRleHQuZ2V0RGF0YUNvbm5lY3Rpb25BYygpOwotICAgICAgICBpZiAoZGNhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGVhckRvd24pIHsKLSAgICAgICAgICAgICAgICBhcG5Db250ZXh0LnNldFN0YXRlKFN0YXRlLkRJU0NPTk5FQ1RJTkcpOwotICAgICAgICAgICAgICAgIHJlbGVhc2VBcG5Db250ZXh0KGFwbkNvbnRleHQsIHRlYXJEb3duKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGNhYy5yZXNldFN5bmMoKTsKLSAgICAgICAgICAgICAgICBhcG5Db250ZXh0LnNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICAgICAgICAgIG1QaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihhcG5Db250ZXh0LmdldFJlYXNvbigpLCBhcG5Db250ZXh0LmdldEFwblR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgYXBuQ29udGV4dC5zZXREYXRhQ29ubmVjdGlvbihudWxsKTsKLSAgICAgICAgICAgICAgICBhcG5Db250ZXh0LnNldERhdGFDb25uZWN0aW9uQWMobnVsbCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmICh0ZWFyRG93biAmJiAoZGNhYyAhPSBudWxsKSkgeworICAgICAgICAgICAgaWYgKERCRykgbG9nKCJjbGVhblVwQ29ubmVjdGlvbjogdGVhcmluZyBkb3duIik7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfRElTQ09OTkVDVF9ET05FLCBhcG5Db250ZXh0KTsKKyAgICAgICAgICAgIGFwbkNvbnRleHQuZ2V0RGF0YUNvbm5lY3Rpb24oKS50ZWFyRG93bihhcG5Db250ZXh0LmdldFJlYXNvbigpLCBtc2cpOworICAgICAgICAgICAgYXBuQ29udGV4dC5zZXRTdGF0ZShTdGF0ZS5ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkY2FjICE9IG51bGwpIGRjYWMucmVzZXRTeW5jKCk7CisgICAgICAgICAgICBhcG5Db250ZXh0LnNldFN0YXRlKFN0YXRlLklETEUpOworICAgICAgICAgICAgbVBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKGFwbkNvbnRleHQuZ2V0UmVhc29uKCksIGFwbkNvbnRleHQuZ2V0QXBuVHlwZSgpKTsKKyAgICAgICAgICAgIGFwbkNvbnRleHQuc2V0RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICBhcG5Db250ZXh0LnNldERhdGFDb25uZWN0aW9uQWMobnVsbCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0MjcsNyArMTM3OSwxMyBAQAogCiAgICAgICAgIEFsYXJtTWFuYWdlciBhbSA9CiAgICAgICAgICAgICAoQWxhcm1NYW5hZ2VyKSBtUGhvbmUuZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSU5URU5UX1JFQ09OTkVDVF9BTEFSTSk7CisKKyAgICAgICAgLy8gVE9ETyA6IFJlZ2lzdGVyIHRoZSByZWNlaXZlciBvbmx5IG9uY2UgbWF5YmUgaW4gYmFzZWNsYXNzLgorICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKElOVEVOVF9SRUNPTk5FQ1RfQUxBUk0gKyAnLicrYXBuQ29udGV4dC5nZXRBcG5UeXBlKCkpOworICAgICAgICBtUGhvbmUuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobUludGVudFJlY2VpdmVyLCBmaWx0ZXIsIG51bGwsIG1QaG9uZSk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSU5URU5UX1JFQ09OTkVDVF9BTEFSTSArICcuJyArIGFwbkNvbnRleHQuZ2V0QXBuVHlwZSgpKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKElOVEVOVF9SRUNPTk5FQ1RfQUxBUk1fRVhUUkFfUkVBU09OLCBhcG5Db250ZXh0LmdldFJlYXNvbigpKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKElOVEVOVF9SRUNPTk5FQ1RfQUxBUk1fRVhUUkFfVFlQRSwgYXBuQ29udGV4dC5nZXRBcG5UeXBlKCkpOwogICAgICAgICBhcG5Db250ZXh0LnNldFJlY29ubmVjdEludGVudChQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCAoCkBAIC0xNjk3LDcgKzE2NTUsOCBAQAogICAgICAgICAgICAgICAgICAgICBhcG5Db250ZXh0LnNldFN0YXRlKFN0YXRlLkZBSUxFRCk7CiAgICAgICAgICAgICAgICAgICAgIG1QaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCwgYXBuQ29udGV4dC5nZXRBcG5UeXBlKCkpOwogCi0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VBcG5Db250ZXh0KGFwbkNvbnRleHQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYXBuQ29udGV4dC5zZXREYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYXBuQ29udGV4dC5zZXREYXRhQ29ubmVjdGlvbkFjKG51bGwpOwogICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIm9uRGF0YVNldHVwQ29tcGxldGU6IHBlcm1hbmVudCBlcnJvciBhcG49JXMiICsgYXBuU3RyaW5nICk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE3MzIsNiArMTY5MSw4IEBACiAKICAgICAgICAgYXBuQ29udGV4dC5zZXRTdGF0ZShTdGF0ZS5JRExFKTsKICAgICAgICAgYXBuQ29udGV4dC5zZXRBcG5TZXR0aW5nKG51bGwpOworICAgICAgICBhcG5Db250ZXh0LnNldERhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICBhcG5Db250ZXh0LnNldERhdGFDb25uZWN0aW9uQWMobnVsbCk7CiAKICAgICAgICAgbVBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKGFwbkNvbnRleHQuZ2V0UmVhc29uKCksIGFwbkNvbnRleHQuZ2V0QXBuVHlwZSgpKTsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA0MzUyODMxLi45M2Y0YjRlIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtODQsMTIgKzg0LDYgQEAKICAgICBwcml2YXRlIGludCBtTmV3UmVhc29uRGF0YURlbmllZCA9IC0xOwogCiAgICAgLyoqCi0gICAgICogIFZhbHVlcyBjb3JyZXNwb25kIHRvIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZXyBkZWZpbml0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBuZXR3b3JrVHlwZSA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbmV3TmV0d29ya1R5cGUgPSAwOwotCi0gICAgLyoqCiAgICAgICogR1NNIHJvYW1pbmcgc3RhdHVzIHNvbGVseSBiYXNlZCBvbiBUUyAyNy4wMDcgNy4yIENSRUcuIE9ubHkgdXNlZCBieQogICAgICAqIGhhbmRsZVBvbGxTdGF0ZVJlc3VsdCB0byBzdG9yZSBDUkVHIHJvYW1pbmcgcmVzdWx0LgogICAgICAqLwpAQCAtNjI4LDcgKzYyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbmV3R1BSU1N0YXRlID0gcmVnQ29kZVRvU2VydmljZVN0YXRlKHJlZ1N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgbURhdGFSb2FtaW5nID0gcmVnQ29kZUlzUm9hbWluZyhyZWdTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld05ldHdvcmtUeXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgbU5ld1JhZGlvVGVjaG5vbG9neSA9IHR5cGU7CiAgICAgICAgICAgICAgICAgICAgIG5ld1NTLnNldFJhZGlvVGVjaG5vbG9neSh0eXBlKTsKICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNzQ4LDM3ICs3NDIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5ldHdvcmtUeXBlVG9TdHJpbmcoaW50IHR5cGUpIHsKLSAgICAgICAgLy9OZXR3b3JrIFR5cGUgZnJvbSBHUFJTX1JFR0lTVFJBVElPTl9TVEFURQotICAgICAgICBTdHJpbmcgcmV0ID0gInVua25vd24iOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9HUFJTOgotICAgICAgICAgICAgICAgIHJldCA9ICJHUFJTIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRURHRToKLSAgICAgICAgICAgICAgICByZXQgPSAiRURHRSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX1VNVFM6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIlVNVFMiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9IU0RQQToKLSAgICAgICAgICAgICAgICByZXQgPSAiSFNEUEEiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9IU1VQQToKLSAgICAgICAgICAgICAgICByZXQgPSAiSFNVUEEiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9IU1BBOgotICAgICAgICAgICAgICAgIHJldCA9ICJIU1BBIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc2xvZ2UoIldyb25nIG5ldHdvcmsgdHlwZTogIiArIEludGVnZXIudG9TdHJpbmcodHlwZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgcG9sbFN0YXRlRG9uZSgpIHsKICAgICAgICAgaWYgKERCRykgewogICAgICAgICAgICAgbG9nKCJQb2xsIFNlcnZpY2VTdGF0ZSBkb25lOiAiICsKQEAgLTc4OCw4ICs3NTEsOCBAQAogICAgICAgICAgICAgICAgICIgbU5ld01heERhdGFDYWxscz0iICsgbU5ld01heERhdGFDYWxscyArCiAgICAgICAgICAgICAgICAgIiBvbGRSZWFzb25EYXRhRGVuaWVkPSIgKyBtUmVhc29uRGF0YURlbmllZCArCiAgICAgICAgICAgICAgICAgIiBtTmV3UmVhc29uRGF0YURlbmllZD0iICsgbU5ld1JlYXNvbkRhdGFEZW5pZWQgKwotICAgICAgICAgICAgICAgICIgb2xkVHlwZT0iICsgbmV0d29ya1R5cGVUb1N0cmluZyhuZXR3b3JrVHlwZSkgKwotICAgICAgICAgICAgICAgICIgbmV3VHlwZT0iICsgbmV0d29ya1R5cGVUb1N0cmluZyhuZXdOZXR3b3JrVHlwZSkpOworICAgICAgICAgICAgICAgICIgb2xkVHlwZT0iICsgU2VydmljZVN0YXRlLnJhZGlvVGVjaG5vbG9neVRvU3RyaW5nKG1SYWRpb1RlY2hub2xvZ3kpICsKKyAgICAgICAgICAgICAgICAiIG5ld1R5cGU9IiArIFNlcnZpY2VTdGF0ZS5yYWRpb1RlY2hub2xvZ3lUb1N0cmluZyhtTmV3UmFkaW9UZWNobm9sb2d5KSk7CiAgICAgICAgIH0KIAogICAgICAgICBib29sZWFuIGhhc1JlZ2lzdGVyZWQgPQpAQCAtODA4LDcgKzc3MSw3IEBACiAgICAgICAgICAgICAgICAgZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFCiAgICAgICAgICAgICAgICAgJiYgbmV3R1BSU1N0YXRlICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFOwogCi0gICAgICAgIGJvb2xlYW4gaGFzTmV0d29ya1R5cGVDaGFuZ2VkID0gbmV0d29ya1R5cGUgIT0gbmV3TmV0d29ya1R5cGU7CisgICAgICAgIGJvb2xlYW4gaGFzUmFkaW9UZWNobm9sb2d5Q2hhbmdlZCA9IG1SYWRpb1RlY2hub2xvZ3kgIT0gbU5ld1JhZGlvVGVjaG5vbG9neTsKIAogICAgICAgICBib29sZWFuIGhhc0NoYW5nZWQgPSAhbmV3U1MuZXF1YWxzKHNzKTsKIApAQCAtODM4LDMwICs4MDEsMzIgQEAKICAgICAgICAgLy8gQWRkIGFuIGV2ZW50IGxvZyB3aGVuIG5ldHdvcmsgdHlwZSBzd2l0Y2hlZAogICAgICAgICAvLyBUT0RPOiB3ZSBtYXkgYWRkIGZpbHRlcmluZyB0byByZWR1Y2UgdGhlIGV2ZW50IGxvZ2dlZCwKICAgICAgICAgLy8gaS5lLiBjaGVjayBwcmVmZXJyZWQgbmV0d29yayBzZXR0aW5nLCBvbmx5IHN3aXRjaCB0byAyRywgZXRjCi0gICAgICAgIGlmIChoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKKyAgICAgICAgaWYgKGhhc1JhZGlvVGVjaG5vbG9neUNoYW5nZWQpIHsKICAgICAgICAgICAgIGludCBjaWQgPSAtMTsKICAgICAgICAgICAgIEdzbUNlbGxMb2NhdGlvbiBsb2MgPSAoKEdzbUNlbGxMb2NhdGlvbilwaG9uZS5nZXRDZWxsTG9jYXRpb24oKSk7CiAgICAgICAgICAgICBpZiAobG9jICE9IG51bGwpIGNpZCA9IGxvYy5nZXRDaWQoKTsKLSAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRXZlbnRMb2dUYWdzLkdTTV9SQVRfU1dJVENIRUQsIGNpZCwgbmV0d29ya1R5cGUsIG5ld05ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRXZlbnRMb2dUYWdzLkdTTV9SQVRfU1dJVENIRUQsIGNpZCwgbVJhZGlvVGVjaG5vbG9neSwKKyAgICAgICAgICAgICAgICAgICAgbU5ld1JhZGlvVGVjaG5vbG9neSk7CiAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJSQVQgc3dpdGNoZWQgIiArIG5ldHdvcmtUeXBlVG9TdHJpbmcobmV0d29ya1R5cGUpICsgIiAtPiAiCi0gICAgICAgICAgICAgICAgICAgICsgbmV0d29ya1R5cGVUb1N0cmluZyhuZXdOZXR3b3JrVHlwZSkgKyAiIGF0IGNlbGwgIiArIGNpZCk7CisgICAgICAgICAgICAgICAgbG9nKCJSQVQgc3dpdGNoZWQgIiArIFNlcnZpY2VTdGF0ZS5yYWRpb1RlY2hub2xvZ3lUb1N0cmluZyhtUmFkaW9UZWNobm9sb2d5KSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIC0+ICIgKyBTZXJ2aWNlU3RhdGUucmFkaW9UZWNobm9sb2d5VG9TdHJpbmcobU5ld1JhZGlvVGVjaG5vbG9neSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBhdCBjZWxsICIgKyBjaWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZ3Byc1N0YXRlID0gbmV3R1BSU1N0YXRlOwogICAgICAgICBtUmVhc29uRGF0YURlbmllZCA9IG1OZXdSZWFzb25EYXRhRGVuaWVkOwogICAgICAgICBtTWF4RGF0YUNhbGxzID0gbU5ld01heERhdGFDYWxsczsKLSAgICAgICAgbmV0d29ya1R5cGUgPSBuZXdOZXR3b3JrVHlwZTsKKyAgICAgICAgbVJhZGlvVGVjaG5vbG9neSA9IG1OZXdSYWRpb1RlY2hub2xvZ3k7CiAgICAgICAgIC8vIHRoaXMgbmV3IHN0YXRlIGhhcyBiZWVuIGFwcGxpZWQgLSBmb3JnZXQgaXQgdW50aWwgd2UgZ2V0IGEgbmV3IG5ldyBzdGF0ZQotICAgICAgICBuZXdOZXR3b3JrVHlwZSA9IDA7CisgICAgICAgIG1OZXdSYWRpb1RlY2hub2xvZ3kgPSAwOwogCiAKICAgICAgICAgbmV3U1Muc2V0U3RhdGVPdXRPZlNlcnZpY2UoKTsgLy8gY2xlYW4gc2xhdGUgZm9yIG5leHQgdGltZQogCi0gICAgICAgIGlmIChoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKKyAgICAgICAgaWYgKGhhc1JhZGlvVGVjaG5vbG9neUNoYW5nZWQpIHsKICAgICAgICAgICAgIHBob25lLnNldFN5c3RlbVByb3BlcnR5KFRlbGVwaG9ueVByb3BlcnRpZXMuUFJPUEVSVFlfREFUQV9ORVRXT1JLX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIG5ldHdvcmtUeXBlVG9TdHJpbmcobmV0d29ya1R5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZVN0YXRlLnJhZGlvVGVjaG5vbG9neVRvU3RyaW5nKG1SYWRpb1RlY2hub2xvZ3kpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNSZWdpc3RlcmVkKSB7CkBAIC05NDksNyArOTE0LDcgQEAKICAgICAgICAgICAgIG1EZXRhY2hlZFJlZ2lzdHJhbnRzLm5vdGlmeVJlZ2lzdHJhbnRzKCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaGFzTmV0d29ya1R5cGVDaGFuZ2VkKSB7CisgICAgICAgIGlmIChoYXNSYWRpb1RlY2hub2xvZ3lDaGFuZ2VkKSB7CiAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fTldfVFlQRV9DSEFOR0VELCBQaG9uZS5BUE5fVFlQRV9BTEwpOwogICAgICAgICB9CiAKQEAgLTEyODUsNyArMTI1MCw3IEBACiAgICAgICogdGhhdCBjb3VsZCBzdXBwb3J0IHZvaWNlIGFuZCBkYXRhIHNpbXVsdGFuZW91c2x5LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29uY3VycmVudFZvaWNlQW5kRGF0YUFsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobmV0d29ya1R5cGUgPj0gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfVU1UUyk7CisgICAgICAgIHJldHVybiAobVJhZGlvVGVjaG5vbG9neSA+PSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9VTVRTKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNUmVjb3Jkcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1SZWNvcmRzLmphdmEKaW5kZXggODkxYzdjYi4uYjBiYWQ1NiAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1SZWNvcmRzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1SZWNvcmRzLmphdmEKQEAgLTQ1LDEyICs0NSwxMiBAQAogLyoqCiAgKiB7QGhpZGV9CiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTSU1SZWNvcmRzIGV4dGVuZHMgSWNjUmVjb3JkcyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkdTTSI7CitwdWJsaWMgY2xhc3MgU0lNUmVjb3JkcyBleHRlbmRzIEljY1JlY29yZHMgeworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiR1NNIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ1JBU0hfUklMID0gZmFsc2U7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CiAKICAgICAvLyAqKioqKiBJbnN0YW5jZSBWYXJpYWJsZXMKIApAQCAtMTIwLDEzICsxMjAsMTMgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TSU1fUkVBRFkgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SQURJT19PRkZfT1JfTk9UX0FWQUlMQUJMRSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9JTVNJX0RPTkUgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfSUNDSURfRE9ORSA9IDQ7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0lNU0lfRE9ORSA9IDM7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0lDQ0lEX0RPTkUgPSA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfTUJJX0RPTkUgPSA1OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfTUJETl9ET05FID0gNjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX01XSVNfRE9ORSA9IDc7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9WT0lDRV9NQUlMX0lORElDQVRPUl9DUEhTX0RPTkUgPSA4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQURfRE9ORSA9IDk7IC8vIEFkbWluIGRhdGEgb24gU0lNCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0FEX0RPTkUgPSA5OyAvLyBBZG1pbiBkYXRhIG9uIFNJTQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfTVNJU0ROX0RPTkUgPSAxMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NQSFNfTUFJTEJPWF9ET05FID0gMTE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9TUE5fRE9ORSA9IDEyOwpAQCAtMTQ3LDYgKzE0Nyw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9DRklTX0RPTkUgPSAzMjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NTUF9DUEhTX0RPTkUgPSAzMzsKIAorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENTSU1fRVZFTlRfQkFTRSA9IDEwMDsKKwogICAgIC8vIExvb2t1cCB0YWJsZSBmb3IgY2FycmllcnMga25vd24gdG8gcHJvZHVjZSBTSU1zIHdoaWNoIGluY29ycmVjdGx5IGluZGljYXRlIE1OQyBsZW5ndGguCiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNQ0NNTkNfQ09ERVNfSEFWSU5HXzNESUdJVFNfTU5DID0gewpAQCAtMTgxLDggKzE4MywxMSBAQAogICAgICAgICAvLyByZWNvcmRzVG9Mb2FkIGlzIHNldCB0byAwIGJlY2F1c2Ugbm8gcmVxdWVzdHMgYXJlIG1hZGUgeWV0CiAgICAgICAgIHJlY29yZHNUb0xvYWQgPSAwOwogCi0KLSAgICAgICAgcC5tQ00ucmVnaXN0ZXJGb3JTSU1SZWFkeSh0aGlzLCBFVkVOVF9TSU1fUkVBRFksIG51bGwpOworICAgICAgICAvLyBTSU1SZWNvcmQgaXMgdXNlZCBieSBDRE1BK0xURSBtb2RlLCBhbmQgU0lNX1JFQURZIGV2ZW50CisgICAgICAgIC8vIHdpbGwgYmUgc3Vic2NyaWJlZCBieSBDZG1hTHRlU2VydmljZVN0YXRlVHJhY2tlci4KKyAgICAgICAgaWYgKHBob25lLmdldEx0ZU9uQ2RtYU1vZGUoKSAhPSBQaG9uZS5MVEVfT05fQ0RNQV9UUlVFKSB7CisgICAgICAgICAgICBwLm1DTS5yZWdpc3RlckZvclNJTVJlYWR5KHRoaXMsIEVWRU5UX1NJTV9SRUFEWSwgbnVsbCk7CisgICAgICAgIH0KICAgICAgICAgcC5tQ00ucmVnaXN0ZXJGb3JPZmZPck5vdEF2YWlsYWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIEVWRU5UX1JBRElPX09GRl9PUl9OT1RfQVZBSUxBQkxFLCBudWxsKTsKICAgICAgICAgcC5tQ00uc2V0T25TbXNPblNpbSh0aGlzLCBFVkVOVF9TTVNfT05fU0lNLCBudWxsKTsKQEAgLTE5Niw3ICsyMDEsOSBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAgICAgICAgIC8vVW5yZWdpc3RlciBmb3IgYWxsIGV2ZW50cwotICAgICAgICBwaG9uZS5tQ00udW5yZWdpc3RlckZvclNJTVJlYWR5KHRoaXMpOworICAgICAgICBpZiAocGhvbmUuZ2V0THRlT25DZG1hTW9kZSgpICE9IFBob25lLkxURV9PTl9DRE1BX1RSVUUpIHsKKyAgICAgICAgICAgIHBob25lLm1DTS51bnJlZ2lzdGVyRm9yU0lNUmVhZHkodGhpcyk7CisgICAgICAgIH0KICAgICAgICAgcGhvbmUubUNNLnVucmVnaXN0ZXJGb3JPZmZPck5vdEF2YWlsYWJsZSggdGhpcyk7CiAgICAgICAgIHBob25lLm1DTS51bnJlZ2lzdGVyRm9ySWNjUmVmcmVzaCh0aGlzKTsKICAgICB9CkBAIC0xMjgwLDcgKzEyODcsNyBAQAogICAgICAgICBmZXRjaFNpbVJlY29yZHMoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZmV0Y2hTaW1SZWNvcmRzKCkgeworICAgIHByb3RlY3RlZCB2b2lkIGZldGNoU2ltUmVjb3JkcygpIHsKICAgICAgICAgcmVjb3Jkc1JlcXVlc3RlZCA9IHRydWU7CiAgICAgICAgIEljY0ZpbGVIYW5kbGVyIGljY0ZoID0gcGhvbmUuZ2V0SWNjRmlsZUhhbmRsZXIoKTsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCAzNzdmOGYwLi4zNWJhMGQxIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc207CiAKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC01NiwxNCArNTgsMTEgQEAKICAgICAgICAgICAgIHJlY29yZFNpemUgPSBuZXcgaW50WzNdOwogCiAgICAgICAgICAgICAvL1VzaW5nIG1CYXNlSGFuZGxlciwgbm8gZGlmZmVyZW5jZSBpbiBFVkVOVF9HRVRfU0laRV9ET05FIGhhbmRsaW5nCi0gICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gbUJhc2VIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX1NJWkVfRE9ORSk7CisgICAgICAgICAgICBBdG9taWNCb29sZWFuIHN0YXR1cyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9HRVRfU0laRV9ET05FLCBzdGF0dXMpOwogCiAgICAgICAgICAgICBwaG9uZS5nZXRJY2NGaWxlSGFuZGxlcigpLmdldEVGTGluZWFyUmVjb3JkU2l6ZShlZmlkLCByZXNwb25zZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Mb2NrLndhaXQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2dkKCJpbnRlcnJ1cHRlZCB3aGlsZSB0cnlpbmcgdG8gbG9hZCBmcm9tIHRoZSBTSU0iKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdhaXRGb3JSZXN1bHQoc3RhdHVzKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZWNvcmRTaXplOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNDYkhlYWRlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNDYkhlYWRlci5qYXZhCmluZGV4IDVmMjdjZmMuLjA5NDVhMzggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zQ2JIZWFkZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc0NiSGVhZGVyLmphdmEKQEAgLTE3LDggKzE3LDMxIEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc207CiAKIHB1YmxpYyBjbGFzcyBTbXNDYkhlYWRlciB7CisgICAgLyoqCisgICAgICogTGVuZ3RoIG9mIFNNUy1DQiBoZWFkZXIKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRFVfSEVBREVSX0xFTkdUSCA9IDY7CiAKKyAgICAvKioKKyAgICAgKiBHU00gcGR1IGZvcm1hdCwgYXMgZGVmaW5lZCBpbiAzZ3BwIFRTIDIzLjA0MSwgc2VjdGlvbiA5LjQuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9HU00gPSAxOworCisgICAgLyoqCisgICAgICogVU1UUyBwZHUgZm9ybWF0LCBhcyBkZWZpbmVkIGluIDNncHAgVFMgMjMuMDQxLCBzZWN0aW9uIDkuNC4yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VNVFMgPSAyOworCisgICAgLyoqCisgICAgICogTWVzc2FnZSB0eXBlIHZhbHVlIGFzIGRlZmluZWQgaW4gM2dwcCBUUyAyNS4zMjQsIHNlY3Rpb24gMTEuMS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9UWVBFX0NCU19NRVNTQUdFID0gMTsKKworICAgIC8qKgorICAgICAqIExlbmd0aCBvZiBHU00gcGR1cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfTEVOR1RIX0dTTSA9IDg4OworCiAgICAgcHVibGljIGZpbmFsIGludCBnZW9ncmFwaGljYWxTY29wZTsKIAogICAgIHB1YmxpYyBmaW5hbCBpbnQgbWVzc2FnZUNvZGU7CkBAIC0zMywyNyArNTYsNTUgQEAKIAogICAgIHB1YmxpYyBmaW5hbCBpbnQgbnJPZlBhZ2VzOwogCisgICAgcHVibGljIGZpbmFsIGludCBmb3JtYXQ7CisKICAgICBwdWJsaWMgU21zQ2JIZWFkZXIoYnl0ZVtdIHBkdSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwZHUgPT0gbnVsbCB8fCBwZHUubGVuZ3RoIDwgUERVX0hFQURFUl9MRU5HVEgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgUERVIik7CiAgICAgICAgIH0KIAotICAgICAgICBnZW9ncmFwaGljYWxTY29wZSA9IChwZHVbMF0gJiAweGMwKSA+PiA2OwotICAgICAgICBtZXNzYWdlQ29kZSA9ICgocGR1WzBdICYgMHgzZikgPDwgNCkgfCAoKHBkdVsxXSAmIDB4ZjApID4+IDQpOwotICAgICAgICB1cGRhdGVOdW1iZXIgPSBwZHVbMV0gJiAweDBmOwotICAgICAgICBtZXNzYWdlSWRlbnRpZmllciA9IChwZHVbMl0gPDwgOCkgfCBwZHVbM107Ci0gICAgICAgIGRhdGFDb2RpbmdTY2hlbWUgPSBwZHVbNF07CisgICAgICAgIGlmIChwZHUubGVuZ3RoIDw9IFBEVV9MRU5HVEhfR1NNKSB7CisgICAgICAgICAgICAvLyBHU00gcGR1cyBhcmUgbm8gbW9yZSB0aGFuIDg4IGJ5dGVzCisgICAgICAgICAgICBmb3JtYXQgPSBGT1JNQVRfR1NNOworICAgICAgICAgICAgZ2VvZ3JhcGhpY2FsU2NvcGUgPSAocGR1WzBdICYgMHhjMCkgPj4gNjsKKyAgICAgICAgICAgIG1lc3NhZ2VDb2RlID0gKChwZHVbMF0gJiAweDNmKSA8PCA0KSB8ICgocGR1WzFdICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICB1cGRhdGVOdW1iZXIgPSBwZHVbMV0gJiAweDBmOworICAgICAgICAgICAgbWVzc2FnZUlkZW50aWZpZXIgPSAoKHBkdVsyXSAmIDB4ZmYpIDw8IDgpIHwgKHBkdVszXSAmIDB4ZmYpOworICAgICAgICAgICAgZGF0YUNvZGluZ1NjaGVtZSA9IHBkdVs0XSAmIDB4ZmY7CiAKLSAgICAgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgcGFnZSBwYXJhbWV0ZXIKLSAgICAgICAgaW50IHBhZ2VJbmRleCA9IChwZHVbNV0gJiAweGYwKSA+PiA0OwotICAgICAgICBpbnQgbnJPZlBhZ2VzID0gcGR1WzVdICYgMHgwZjsKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHBhZ2UgcGFyYW1ldGVyCisgICAgICAgICAgICBpbnQgcGFnZUluZGV4ID0gKHBkdVs1XSAmIDB4ZjApID4+IDQ7CisgICAgICAgICAgICBpbnQgbnJPZlBhZ2VzID0gcGR1WzVdICYgMHgwZjsKIAotICAgICAgICBpZiAocGFnZUluZGV4ID09IDAgfHwgbnJPZlBhZ2VzID09IDAgfHwgcGFnZUluZGV4ID4gbnJPZlBhZ2VzKSB7CisgICAgICAgICAgICBpZiAocGFnZUluZGV4ID09IDAgfHwgbnJPZlBhZ2VzID09IDAgfHwgcGFnZUluZGV4ID4gbnJPZlBhZ2VzKSB7CisgICAgICAgICAgICAgICAgcGFnZUluZGV4ID0gMTsKKyAgICAgICAgICAgICAgICBuck9mUGFnZXMgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDsKKyAgICAgICAgICAgIHRoaXMubnJPZlBhZ2VzID0gbnJPZlBhZ2VzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVU1UUyBwZHVzIGFyZSBhbHdheXMgYXQgbGVhc3QgOTAgYnl0ZXMgc2luY2UgdGhlIHBheWxvYWQgaW5jbHVkZXMKKyAgICAgICAgICAgIC8vIGEgbnVtYmVyLW9mLXBhZ2VzIG9jdGV0IGFuZCBhbHNvIG9uZSBsZW5ndGggb2N0ZXQgcGVyIHBhZ2UKKyAgICAgICAgICAgIGZvcm1hdCA9IEZPUk1BVF9VTVRTOworCisgICAgICAgICAgICBpbnQgbWVzc2FnZVR5cGUgPSBwZHVbMF07CisKKyAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSAhPSBNRVNTQUdFX1RZUEVfQ0JTX01FU1NBR0UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgIiArIG1lc3NhZ2VUeXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVzc2FnZUlkZW50aWZpZXIgPSAoKHBkdVsxXSAmIDB4ZmYpIDw8IDgpIHwgcGR1WzJdICYgMHhmZjsKKyAgICAgICAgICAgIGdlb2dyYXBoaWNhbFNjb3BlID0gKHBkdVszXSAmIDB4YzApID4+IDY7CisgICAgICAgICAgICBtZXNzYWdlQ29kZSA9ICgocGR1WzNdICYgMHgzZikgPDwgNCkgfCAoKHBkdVs0XSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgdXBkYXRlTnVtYmVyID0gcGR1WzRdICYgMHgwZjsKKyAgICAgICAgICAgIGRhdGFDb2RpbmdTY2hlbWUgPSBwZHVbNV0gJiAweGZmOworCisgICAgICAgICAgICAvLyBXZSB3aWxsIGFsd2F5cyBjb25zaWRlciBhIFVNVFMgbWVzc2FnZSBhcyBoYXZpbmcgb25lIHNpbmdsZSBwYWdlCisgICAgICAgICAgICAvLyBzaW5jZSB0aGVyZSdzIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBoZWFkZXIsIGV2ZW4gdGhvdWdoIHRoZQorICAgICAgICAgICAgLy8gYWN0dWFsIHBheWxvYWQgbWF5IGNvbnRhaW4gc2V2ZXJhbCBwYWdlcy4KICAgICAgICAgICAgIHBhZ2VJbmRleCA9IDE7CiAgICAgICAgICAgICBuck9mUGFnZXMgPSAxOwogICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7Ci0gICAgICAgIHRoaXMubnJPZlBhZ2VzID0gbnJPZlBhZ2VzOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc0NiVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zQ2JUZXN0LmphdmEKaW5kZXggNzEzNmVhMC4uYjEzMWEwMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zQ2JUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zQ2JUZXN0LmphdmEKQEAgLTY5LDYgKzY5LDM2IEBACiAgICAgICAgIGRvVGVzdEdlb2dyYXBoaWNhbFNjb3BlVmFsdWUocGR1LCAoYnl0ZSkweEMwLCBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0NFTExfV0lERSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEdldEdlb2dyYXBoaWNhbFNjb3BlVW10cygpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwKKworICAgICAgICAgICAgICAgIChieXRlKTB4NDEsIChieXRlKTB4RDAsIChieXRlKTB4NzEsIChieXRlKTB4REEsIChieXRlKTB4MDQsIChieXRlKTB4OTEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNiwgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg5RCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHgwNywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDg1LCAoYnl0ZSkweEQ5LCAoYnl0ZSkweDcwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDU4LCAoYnl0ZSkweDVDLAorICAgICAgICAgICAgICAgIChieXRlKTB4QTYsIChieXRlKTB4ODMsIChieXRlKTB4REEsIChieXRlKTB4RTUsIChieXRlKTB4RjksIChieXRlKTB4M0MsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3QywgKGJ5dGUpMHgyRSwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhFRSwgKGJ5dGUpMHg2OSwgKGJ5dGUpMHgzQSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDFBLCAoYnl0ZSkweDM0LCAoYnl0ZSkweDBFLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU1LCAoYnl0ZSkweEU5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjAsIChieXRlKTB4QjksIChieXRlKTB4MEMsIChieXRlKTB4OTIsIChieXRlKTB4OTcsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NSwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgxQiwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgwRiwgKGJ5dGUpMHg5MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEM5LCAoYnl0ZSkweDY5LCAoYnl0ZSkweEY3LCAoYnl0ZSkweEI5LCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LAorICAgICAgICAgICAgICAgIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LAorICAgICAgICAgICAgICAgIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MzQKKyAgICAgICAgfTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZ2VvZ3JhcGhpY2FsIHNjb3BlIGRlY29kZWQiLAorICAgICAgICAgICAgICAgIFNtc0NiTWVzc2FnZS5HRU9HUkFQSElDQUxfU0NPUEVfQ0VMTF9XSURFLCBtc2cuZ2V0R2VvZ3JhcGhpY2FsU2NvcGUoKSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5N0JpdCgpIHsKICAgICAgICAgYnl0ZVtdIHBkdSA9IHsKICAgICAgICAgICAgICAgICAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDQwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDQxLApAQCAtOTIsNiArMTIyLDgzIEBACiAgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXRVbXRzKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4NDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MSwgKGJ5dGUpMHhEMCwgKGJ5dGUpMHg3MSwgKGJ5dGUpMHhEQSwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg5MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LCAoYnl0ZSkweDcwLCAoYnl0ZSkweDlELCAoYnl0ZSkweDRELCAoYnl0ZSkweDA3LAorICAgICAgICAgICAgICAgIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4NUMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhGOSwgKGJ5dGUpMHgzQywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LCAoYnl0ZSkweDNBLAorICAgICAgICAgICAgICAgIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc1LCAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLAorICAgICAgICAgICAgICAgIChieXRlKTB4QzksIChieXRlKTB4NjksIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNAorICAgICAgICB9OworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgNy1iaXQgc3RyaW5nIGRlY29kZWQiLAorICAgICAgICAgICAgICAgICJBIEdTTSBkZWZhdWx0IGFscGhhYmV0IG1lc3NhZ2Ugd2l0aCBjYXJyaWFnZSByZXR1cm4gcGFkZGluZyIsCisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXRNdWx0aXBhZ2VVbXRzKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4NDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAyLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDNiwgKGJ5dGUpMHhCNCwgKGJ5dGUpMHg3QywgKGJ5dGUpMHg0RSwgKGJ5dGUpMHgwNywgKGJ5dGUpMHhDMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEMzLCAoYnl0ZSkweEU3LCAoYnl0ZSkweEYyLCAoYnl0ZSkweEFBLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LAorICAgICAgICAgICAgICAgIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LAorICAgICAgICAgICAgICAgIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LAorICAgICAgICAgICAgICAgIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwQSwKKworICAgICAgICAgICAgICAgIChieXRlKTB4RDMsIChieXRlKTB4RjIsIChieXRlKTB4RjgsIChieXRlKTB4RUQsIChieXRlKTB4MjYsIChieXRlKTB4ODMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhFMCwgKGJ5dGUpMHhFMSwgKGJ5dGUpMHg3MywgKGJ5dGUpMHhCOSwgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LAorICAgICAgICAgICAgICAgIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LAorICAgICAgICAgICAgICAgIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MEEKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG11bHRpcGFnZSA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkZpcnN0IHBhZ2UrU2Vjb25kIHBhZ2UiLAorICAgICAgICAgICAgICAgIG1zZy5nZXRNZXNzYWdlQm9keSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHk3Qml0RnVsbCgpIHsKICAgICAgICAgYnl0ZVtdIHBkdSA9IHsKICAgICAgICAgICAgICAgICAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDQwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDQxLApAQCAtMTE3LDYgKzIyNCwzOCBAQAogICAgICAgICAgICAgICAgIG1zZy5nZXRNZXNzYWdlQm9keSgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHk3Qml0RnVsbFVtdHMoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQxLCAoYnl0ZSkweEQwLCAoYnl0ZSkweDcxLCAoYnl0ZSkweERBLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDkxLAorICAgICAgICAgICAgICAgIChieXRlKTB4Q0IsIChieXRlKTB4RTYsIChieXRlKTB4NzAsIChieXRlKTB4OUQsIChieXRlKTB4NEQsIChieXRlKTB4MDcsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg4NSwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHg1QywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEE2LCAoYnl0ZSkweDgzLCAoYnl0ZSkweERBLCAoYnl0ZSkweEU1LCAoYnl0ZSkweEY5LCAoYnl0ZSkweDNDLAorICAgICAgICAgICAgICAgIChieXRlKTB4N0MsIChieXRlKTB4MkUsIChieXRlKTB4ODMsIChieXRlKTB4QzQsIChieXRlKTB4RTUsIChieXRlKTB4QjQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGQiwgKGJ5dGUpMHgwQywgKGJ5dGUpMHgyQSwgKGJ5dGUpMHhFMywgKGJ5dGUpMHhDMywgKGJ5dGUpMHg2MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDNBLCAoYnl0ZSkweDNCLCAoYnl0ZSkweDBGLCAoYnl0ZSkweENBLCAoYnl0ZSkweENELCAoYnl0ZSkweDQwLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjMsIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4MUUsIChieXRlKTB4MUUsIChieXRlKTB4RDMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhGMiwgKGJ5dGUpMHgzOSwgKGJ5dGUpMHg4OCwgKGJ5dGUpMHhGRCwgKGJ5dGUpMHg3NiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDlGLCAoYnl0ZSkweDU5LCAoYnl0ZSkweEEwLCAoYnl0ZSkweDc2LCAoYnl0ZSkweDM5LCAoYnl0ZSkweEVDLAorICAgICAgICAgICAgICAgIChieXRlKTB4NEUsIChieXRlKTB4QkIsIChieXRlKTB4Q0YsIChieXRlKTB4MjAsIChieXRlKTB4M0EsIChieXRlKTB4QkEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgyQywgKGJ5dGUpMHgyRiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEMiwgKGJ5dGUpMHg3MywgKGJ5dGUpMHg5MCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEZCLCAoYnl0ZSkweDBELCAoYnl0ZSkweDgyLCAoYnl0ZSkweDg3LCAoYnl0ZSkweEM5LCAoYnl0ZSkweEU0LAorICAgICAgICAgICAgICAgIChieXRlKTB4QjQsIChieXRlKTB4RkIsIChieXRlKTB4MUMsIChieXRlKTB4MDIsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDUyCisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkEgR1NNIGRlZmF1bHQgYWxwaGFiZXQgbWVzc2FnZSBiZWluZyBleGFjdGx5IDkzIGNoYXJhY3RlcnMgbG9uZywgIiArCisgICAgICAgICAgICAgICAgIm1lYW5pbmcgdGhlcmUgaXMgbm8gcGFkZGluZyEiLAorICAgICAgICAgICAgICAgIG1zZy5nZXRNZXNzYWdlQm9keSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHk3Qml0V2l0aExhbmd1YWdlKCkgewogICAgICAgICBieXRlW10gcGR1ID0gewogICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4MDQsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCkBAIC0xNjcsNiArMzA2LDM4IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBsYW5ndWFnZSBpbmRpY2F0b3IgZGVjb2RlZCIsICJzdiIsIG1zZy5nZXRMYW5ndWFnZUNvZGUoKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5N0JpdFdpdGhMYW5ndWFnZUluQm9keVVtdHMoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDczLCAoYnl0ZSkweDdCLCAoYnl0ZSkweDIzLCAoYnl0ZSkweDA4LCAoYnl0ZSkweDNBLCAoYnl0ZSkweDRFLAorICAgICAgICAgICAgICAgIChieXRlKTB4OUIsIChieXRlKTB4MjAsIChieXRlKTB4NzIsIChieXRlKTB4RDksIChieXRlKTB4MUMsIChieXRlKTB4QUUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhCMywgKGJ5dGUpMHhFOSwgKGJ5dGUpMHhBMCwgKGJ5dGUpMHgzMCwgKGJ5dGUpMHgxQiwgKGJ5dGUpMHg4RSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBFLCAoYnl0ZSkweDhCLCAoYnl0ZSkweENCLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDUwLCAoYnl0ZSkweEJCLAorICAgICAgICAgICAgICAgIChieXRlKTB4M0MsIChieXRlKTB4OUYsIChieXRlKTB4ODcsIChieXRlKTB4Q0YsIChieXRlKTB4NjUsIChieXRlKTB4RDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzRCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHg0NywgKGJ5dGUpMHg4MywgKGJ5dGUpMHhDNiwgKGJ5dGUpMHg2MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEI5LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDFELCAoYnl0ZSkweDNFLCAoYnl0ZSkweDk3LCAoYnl0ZSkweDQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4RjIsIChieXRlKTB4MzIsIChieXRlKTB4QkQsIChieXRlKTB4MkUsIChieXRlKTB4NzcsIChieXRlKTB4ODMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhFMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgzOSwgKGJ5dGUpMHhFRCwgKGJ5dGUpMHgzRSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM3LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4MDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM3CisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkEgR1NNIGRlZmF1bHQgYWxwaGFiZXQgbWVzc2FnZSB3aXRoIGNhcnJpYWdlIHJldHVybiBwYWRkaW5nIiwKKyAgICAgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGxhbmd1YWdlIGluZGljYXRvciBkZWNvZGVkIiwgInN2IiwgbXNnLmdldExhbmd1YWdlQ29kZSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHk4Qml0KCkgewogICAgICAgICBieXRlW10gcGR1ID0gewogICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4NDQsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCkBAIC0yMTAsNiArMzgxLDgxIEBACiAgICAgICAgICAgICAgICAgIkEgVUNTMiBtZXNzYWdlIGNvbnRhaW5pbmcgYSBcdTA0MzQgY2hhcmFjdGVyIiwgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keVVjczJVbXRzKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4NDgsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg1NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDUzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4MjAsIChieXRlKTB4MDAsIChieXRlKTB4NkQsIChieXRlKTB4MDAsIChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDY3LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjMsIChieXRlKTB4MDAsIChieXRlKTB4NkYsIChieXRlKTB4MDAsIChieXRlKTB4NkUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2OSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDZFLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY5LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDZFLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjcsIChieXRlKTB4MDAsIChieXRlKTB4MjAsIChieXRlKTB4MDAsIChieXRlKTB4NjEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDYzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NzIsIChieXRlKTB4MDAsIChieXRlKTB4NjEsIChieXRlKTB4MDAsIChieXRlKTB4NjMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3MiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDBELCAoYnl0ZSkweDAwLCAoYnl0ZSkweDBELAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0RQorICAgICAgICB9OworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgNy1iaXQgc3RyaW5nIGRlY29kZWQiLAorICAgICAgICAgICAgICAgICJBIFVDUzIgbWVzc2FnZSBjb250YWluaW5nIGEgXHUwNDM0IGNoYXJhY3RlciIsIG1zZy5nZXRNZXNzYWdlQm9keSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHlVY3MyTXVsdGlwYWdlVW10cygpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQ4LAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMiwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NDEsIChieXRlKTB4MDAsIChieXRlKTB4NDEsIChieXRlKTB4MDAsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDYsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDQyLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQyLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQyLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDA2CisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtdWx0aXBhZ2UgVUNTMiBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkFBQUJCQiIsIG1zZy5nZXRNZXNzYWdlQm9keSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHlVY3MyV2l0aExhbmd1YWdlSW5Cb2R5KCkgewogICAgICAgICBieXRlW10gcGR1ID0gewogICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4NzgsCkBAIC0yMzQsNiArNDgwLDM3IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBsYW5ndWFnZSBpbmRpY2F0b3IgZGVjb2RlZCIsICJ4eCIsIG1zZy5nZXRMYW5ndWFnZUNvZGUoKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5VWNzMldpdGhMYW5ndWFnZUluQm9keVVtdHMoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMSwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc4LCAoYnl0ZSkweDNDLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NTUsIChieXRlKTB4MDAsIChieXRlKTB4NDMsIChieXRlKTB4MDAsIChieXRlKTB4NTMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDY1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDczLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDczLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjEsIChieXRlKTB4MDAsIChieXRlKTB4NjcsIChieXRlKTB4MDAsIChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDZFLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjksIChieXRlKTB4MDAsIChieXRlKTB4NkUsIChieXRlKTB4MDAsIChieXRlKTB4NjksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDM0LAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4MjAsIChieXRlKTB4MDAsIChieXRlKTB4NjMsIChieXRlKTB4MDAsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3MiwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDYzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY1LAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NzIsIChieXRlKTB4MDAsIChieXRlKTB4MEQsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDUwCisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkEgVUNTMiBtZXNzYWdlIGNvbnRhaW5pbmcgYSBcdTA0MzQgY2hhcmFjdGVyIiwgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBsYW5ndWFnZSBpbmRpY2F0b3IgZGVjb2RlZCIsICJ4eCIsIG1zZy5nZXRMYW5ndWFnZUNvZGUoKSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VJZGVudGlmaWVyKCkgewogICAgICAgICBieXRlW10gcGR1ID0gewogICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MzAsIChieXRlKTB4MzksIChieXRlKTB4NDAsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCkBAIC0yNTYsNiArNTMzLDM1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGlkZW50aWZpZXIgZGVjb2RlZCIsIDEyMzQ1LCBtc2cuZ2V0TWVzc2FnZUlkZW50aWZpZXIoKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VJZGVudGlmaWVyVW10cygpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLCAoYnl0ZSkweDMwLCAoYnl0ZSkweDM5LCAoYnl0ZSkweDJBLCAoYnl0ZSkweEE1LCAoYnl0ZSkweDQwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwKKworICAgICAgICAgICAgICAgIChieXRlKTB4NDEsIChieXRlKTB4RDAsIChieXRlKTB4NzEsIChieXRlKTB4REEsIChieXRlKTB4MDQsIChieXRlKTB4OTEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNiwgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg5RCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHgwNywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDg1LCAoYnl0ZSkweEQ5LCAoYnl0ZSkweDcwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDU4LCAoYnl0ZSkweDVDLAorICAgICAgICAgICAgICAgIChieXRlKTB4QTYsIChieXRlKTB4ODMsIChieXRlKTB4REEsIChieXRlKTB4RTUsIChieXRlKTB4RjksIChieXRlKTB4M0MsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3QywgKGJ5dGUpMHgyRSwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhFRSwgKGJ5dGUpMHg2OSwgKGJ5dGUpMHgzQSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDFBLCAoYnl0ZSkweDM0LCAoYnl0ZSkweDBFLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU1LCAoYnl0ZSkweEU5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjAsIChieXRlKTB4QjksIChieXRlKTB4MEMsIChieXRlKTB4OTIsIChieXRlKTB4OTcsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NSwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgxQiwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgwRiwgKGJ5dGUpMHg5MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEM5LCAoYnl0ZSkweDY5LCAoYnl0ZSkweEY3LCAoYnl0ZSkweEI5LCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LAorICAgICAgICAgICAgICAgIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LAorICAgICAgICAgICAgICAgIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MzQKKyAgICAgICAgfTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBpZGVudGlmaWVyIGRlY29kZWQiLCAxMjM0NSwgbXNnLmdldE1lc3NhZ2VJZGVudGlmaWVyKCkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQ29kZSgpIHsKICAgICAgICAgYnl0ZVtdIHBkdSA9IHsKICAgICAgICAgICAgICAgICAoYnl0ZSkweDJBLCAoYnl0ZSkweEE1LCAoYnl0ZSkweDMwLCAoYnl0ZSkweDM5LCAoYnl0ZSkweDQwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDQxLApAQCAtMjc4LDYgKzU4NCwzNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjb2RlIGRlY29kZWQiLCA2ODIsIG1zZy5nZXRNZXNzYWdlQ29kZSgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUNvZGVVbXRzKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsIChieXRlKTB4MzAsIChieXRlKTB4MzksIChieXRlKTB4MkEsIChieXRlKTB4QTUsIChieXRlKTB4NDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MSwgKGJ5dGUpMHhEMCwgKGJ5dGUpMHg3MSwgKGJ5dGUpMHhEQSwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg5MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LCAoYnl0ZSkweDcwLCAoYnl0ZSkweDlELCAoYnl0ZSkweDRELCAoYnl0ZSkweDA3LAorICAgICAgICAgICAgICAgIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4NUMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhGOSwgKGJ5dGUpMHgzQywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LCAoYnl0ZSkweDNBLAorICAgICAgICAgICAgICAgIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc1LCAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLAorICAgICAgICAgICAgICAgIChieXRlKTB4QzksIChieXRlKTB4NjksIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNAorICAgICAgICB9OworCisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNvZGUgZGVjb2RlZCIsIDY4MiwgbXNnLmdldE1lc3NhZ2VDb2RlKCkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGVOdW1iZXIoKSB7CiAgICAgICAgIGJ5dGVbXSBwZHUgPSB7CiAgICAgICAgICAgICAgICAgKGJ5dGUpMHgyQSwgKGJ5dGUpMHhBNSwgKGJ5dGUpMHgzMCwgKGJ5dGUpMHgzOSwgKGJ5dGUpMHg0MCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKQEAgLTI5OSw0ICs2MzQsMzMgQEAKIAogICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdXBkYXRlIG51bWJlciBkZWNvZGVkIiwgNSwgbXNnLmdldFVwZGF0ZU51bWJlcigpKTsKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VXBkYXRlTnVtYmVyVW10cygpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLCAoYnl0ZSkweDMwLCAoYnl0ZSkweDM5LCAoYnl0ZSkweDJBLCAoYnl0ZSkweEE1LCAoYnl0ZSkweDQwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwKKworICAgICAgICAgICAgICAgIChieXRlKTB4NDEsIChieXRlKTB4RDAsIChieXRlKTB4NzEsIChieXRlKTB4REEsIChieXRlKTB4MDQsIChieXRlKTB4OTEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNiwgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg5RCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHgwNywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDg1LCAoYnl0ZSkweEQ5LCAoYnl0ZSkweDcwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDU4LCAoYnl0ZSkweDVDLAorICAgICAgICAgICAgICAgIChieXRlKTB4QTYsIChieXRlKTB4ODMsIChieXRlKTB4REEsIChieXRlKTB4RTUsIChieXRlKTB4RjksIChieXRlKTB4M0MsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3QywgKGJ5dGUpMHgyRSwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhFRSwgKGJ5dGUpMHg2OSwgKGJ5dGUpMHgzQSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDFBLCAoYnl0ZSkweDM0LCAoYnl0ZSkweDBFLCAoYnl0ZSkweENCLCAoYnl0ZSkweEU1LCAoYnl0ZSkweEU5LAorICAgICAgICAgICAgICAgIChieXRlKTB4RjAsIChieXRlKTB4QjksIChieXRlKTB4MEMsIChieXRlKTB4OTIsIChieXRlKTB4OTcsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3NSwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgxQiwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgwRiwgKGJ5dGUpMHg5MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEM5LCAoYnl0ZSkweDY5LCAoYnl0ZSkweEY3LCAoYnl0ZSkweEI5LCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LAorICAgICAgICAgICAgICAgIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LAorICAgICAgICAgICAgICAgIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MzQKKyAgICAgICAgfTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdXBkYXRlIG51bWJlciBkZWNvZGVkIiwgNSwgbXNnLmdldFVwZGF0ZU51bWJlcigpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0J1bmRsZVByaW50ZXIuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvQnVuZGxlUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQ3Mzc5Li4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvQnVuZGxlUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5ydW5uZXIuQmFzZVRlc3RSdW5uZXI7Ci1pbXBvcnQganVuaXQudGV4dHVpLlJlc3VsdFByaW50ZXI7Ci0KLQotLyoqCi0gKiBTdWJjbGFzcyBvZiBSZXN1bHRQcmludGVyIHRoYXQgYWRkcyB0ZXN0IGNhc2UgcmVzdWx0cyB0byBhIGJ1bmRsZS4KLSAqIAotICoge0BoaWRlfSAtIFRoaXMgY2xhc3MgaXMgZGVwcmVjYXRlZCwgYW5kIHdpbGwgYmUgZ29pbmcgYXdheS4gIFBsZWFzZSBkb24ndCB1c2UgaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVQcmludGVyIGV4dGVuZHMgUmVzdWx0UHJpbnRlciB7Ci0KLSAgICBwcml2YXRlIEJ1bmRsZSBtUmVzdWx0czsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZhaWx1cmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FcnJvcjsKLSAgICAKLSAgICBwdWJsaWMgQnVuZGxlUHJpbnRlcihQcmludFN0cmVhbSB3cml0ZXIsIEJ1bmRsZSByZXN1bHQpIHsKLSAgICAgICAgc3VwZXIod3JpdGVyKTsKLSAgICAgICAgbVJlc3VsdHMgPSByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgbVJlc3VsdHMucHV0U3RyaW5nKGdldENvbWJvTmFtZSh0ZXN0KSwgQmFzZVRlc3RSdW5uZXIuZ2V0RmlsdGVyZWRUcmFjZSh0KSk7Ci0gICAgICAgIG1GYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgc3VwZXIuYWRkRXJyb3IodGVzdCwgdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKLSAgICAgICAgbVJlc3VsdHMucHV0U3RyaW5nKGdldENvbWJvTmFtZSh0ZXN0KSwgQmFzZVRlc3RSdW5uZXIuZ2V0RmlsdGVyZWRUcmFjZSh0KSk7Ci0gICAgICAgIG1FcnJvciA9IHRydWU7Ci0gICAgICAgIHN1cGVyLmFkZEZhaWx1cmUodGVzdCwgdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKLSAgICAgICAgaWYgKCFtRmFpbHVyZSAmJiAhbUVycm9yKSB7Ci0gICAgICAgICAgICBtUmVzdWx0cy5wdXRTdHJpbmcoZ2V0Q29tYm9OYW1lKHRlc3QpLCAicGFzc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZW5kVGVzdCh0ZXN0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIG1GYWlsdXJlID0gZmFsc2U7Ci0gICAgICAgIG1FcnJvciA9IGZhbHNlOwotICAgICAgICBzdXBlci5zdGFydFRlc3QodGVzdCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldENvbWJvTmFtZShUZXN0IHRlc3QpIHsKLSAgICAgICAgcmV0dXJuIHRlc3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiIgKyAoKFRlc3RDYXNlKSB0ZXN0KS5nZXROYW1lKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9CdW5kbGVUZXN0TGlzdGVuZXIuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvQnVuZGxlVGVzdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjcxM2YuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9CdW5kbGVUZXN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5ydW5uZXIuQmFzZVRlc3RSdW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogQSB7QGxpbmsgVGVzdExpc3RlbmVyfSB0aGF0IGFkZHMgdGVzdCBjYXNlIHJlc3VsdHMgdG8gYSBidW5kbGUuCi0gKiAKLSAqIHtAaGlkZX0gLSBUaGlzIGNsYXNzIGlzIGRlcHJlY2F0ZWQsIGFuZCB3aWxsIGJlIGdvaW5nIGF3YXkuICBQbGVhc2UgZG9uJ3QgdXNlIGl0LgotICovCi1wdWJsaWMgY2xhc3MgQnVuZGxlVGVzdExpc3RlbmVyIGltcGxlbWVudHMgVGVzdExpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgQnVuZGxlIG1CdW5kbGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1GYWlsZWQ7Ci0KLSAgICBwdWJsaWMgQnVuZGxlVGVzdExpc3RlbmVyKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoZ2V0Q29tYm9OYW1lKHRlc3QpLCBCYXNlVGVzdFJ1bm5lci5nZXRGaWx0ZXJlZFRyYWNlKHQpKTsKLSAgICAgICAgbUZhaWxlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7Ci0gICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKGdldENvbWJvTmFtZSh0ZXN0KSwgQmFzZVRlc3RSdW5uZXIuZ2V0RmlsdGVyZWRUcmFjZSh0KSk7Ci0gICAgICAgIG1GYWlsZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIGlmICghbUZhaWxlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoZ2V0Q29tYm9OYW1lKHRlc3QpLCAicGFzc2VkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIG1GYWlsZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDb21ib05hbWUoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIHJldHVybiB0ZXN0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjoiICsgKChUZXN0Q2FzZSkgdGVzdCkuZ2V0TmFtZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9TZXJ2aWNlTG9jYXRvci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9TZXJ2aWNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzI0MDA4Li4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvU2VydmljZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotLyoqCi0gKiBAaGlkZSAtIFRoaXMgaXMgcGFydCBvZiBhIGZyYW1ld29yayB0aGF0IGlzIHVuZGVyIGRldmVsb3BtZW50IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yCi0gKiBhY3RpdmUgZGV2ZWxvcG1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlTG9jYXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUZXN0QnJvd3NlckNvbnRyb2xsZXIgbVRlc3RCcm93c2VyQ29udHJvbGxlciA9Ci0gICAgICAgICAgICBuZXcgVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbCgpOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0QnJvd3NlckNvbnRyb2xsZXIgZ2V0VGVzdEJyb3dzZXJDb250cm9sbGVyKCkgewotICAgICAgICByZXR1cm4gbVRlc3RCcm93c2VyQ29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZXRUZXN0QnJvd3NlckNvbnRyb2xsZXIoVGVzdEJyb3dzZXJDb250cm9sbGVyIHRlc3RCcm93c2VyQ29udHJvbGxlcikgewotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyID0gdGVzdEJyb3dzZXJDb250cm9sbGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJBY3Rpdml0eS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWY5MWUuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAaGlkZSAtIFRoaXMgaXMgcGFydCBvZiBhIGZyYW1ld29yayB0aGF0IGlzIHVuZGVyIGRldmVsb3BtZW50IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yCi0gKiBhY3RpdmUgZGV2ZWxvcG1lbnQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0QnJvd3NlckFjdGl2aXR5IGV4dGVuZHMgTGlzdEFjdGl2aXR5Ci0gICAgICAgIGltcGxlbWVudHMgYW5kcm9pZC50ZXN0LlRlc3RCcm93c2VyVmlldywgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciwKLSAgICAgICAgVGVzdFN1aXRlUHJvdmlkZXIgewotCi0gICAgcHJpdmF0ZSBUZXN0QnJvd3NlckNvbnRyb2xsZXIgbVRlc3RCcm93c2VyQ29udHJvbGxlcjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfRVhUUkFfUEFDS0FHRSA9ICJwYWNrYWdlIjsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBnZXRMaXN0VmlldygpLnNldE9uSXRlbUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlciA9IFNlcnZpY2VMb2NhdG9yLmdldFRlc3RCcm93c2VyQ29udHJvbGxlcigpOwotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyLnNldFRhcmdldFBhY2thZ2VOYW1lKGdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyLnJlZ2lzdGVyVmlldyh0aGlzKTsKLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlci5zZXRUYXJnZXRCcm93c2VyQWN0aXZpdHlDbGFzc05hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gQXBrIHBhdGhzIHVzZWQgdG8gc2VhcmNoIGZvciB0ZXN0IGNsYXNzZXMgd2hlbiB1c2luZyBUZXN0U3VpdGVCdWlsZGVycy4KLSAgICAgICAgU3RyaW5nW10gYXBrUGF0aHMgPSB7Z2V0UGFja2FnZUNvZGVQYXRoKCl9OwotICAgICAgICBDbGFzc1BhdGhQYWNrYWdlSW5mb1NvdXJjZS5zZXRBcGtQYXRocyhhcGtQYXRocyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgc3VwZXIub25TdGFydCgpOwotICAgICAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gZ2V0VGVzdFN1aXRlVG9Ccm93c2UoKTsKLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlci5zZXRUZXN0U3VpdGUodGVzdFN1aXRlKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lID0gdGVzdFN1aXRlLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0VGl0bGUobmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3ViY2xhc3NlcyB3aWxsIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gdGhlIFRlc3RTdWl0ZSBzcGVjaWZpYyB0byB0aGVpciAuYXBrLgotICAgICAqIFdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCBkdWUgdG8gYW4gaW50ZW50IGZpcmVkIGZyb20KLSAgICAgKiB7QGxpbmsgI29uSXRlbUNsaWNrKGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3LCBhbmRyb2lkLnZpZXcuVmlldywgaW50LCBsb25nKX0gdGhlbiBnZXQgdGhlCi0gICAgICogdGFyZ2V0ZWQgVGVzdFN1aXRlIGZyb20gdGhlIGludGVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGVzdFN1aXRlIHRvIGJyb3dzZQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgVGVzdFN1aXRlIGdldFRlc3RTdWl0ZVRvQnJvd3NlKCkgewotICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7Ci0gICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1JVTi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgU3RyaW5nIHRlc3RDbGFzc05hbWUgPSBpbnRlbnQuZ2V0RGF0YSgpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8VGVzdD4gdGVzdENsYXNzID0gKENsYXNzPFRlc3Q+KSBnZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyh0ZXN0Q2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VVdGlsLmNyZWF0ZVRlc3RTdWl0ZSh0ZXN0Q2xhc3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoIlRlc3RCcm93c2VyQWN0aXZpdHkiLCAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBmb3IgIiArIHRlc3RDbGFzc05hbWUsIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoIlRlc3RCcm93c2VyQWN0aXZpdHkiLCAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBmb3IgIiArIHRlc3RDbGFzc05hbWUsIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoIlRlc3RCcm93c2VyQWN0aXZpdHkiLCAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBmb3IgIiArIHRlc3RDbGFzc05hbWUsIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZ2V0IHRlc3QgY2xhc3NlcyB0byBicm93d2VzIGZyb20gc3ViY2xhc3MKLSAgICAgICAgICAgIHJldHVybiBnZXRUb3BUZXN0U3VpdGUoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFRlc3RTdWl0ZSBnZXRUZXN0U3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUb3BUZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgVGVzdFN1aXRlIHRoYXQgc2hvdWxkIGJlIHJ1biBmb3IgYSBnaXZlbiBhcHBsaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgVGVzdFN1aXRlIGdldFRvcFRlc3RTdWl0ZSgpOwotCi0gICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbVRlc3RCcm93c2VyQ29udHJvbGxlci5nZXRJbnRlbnRGb3JUZXN0QXQocG9zaXRpb24pOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQlVORExFX0VYVFJBX1BBQ0tBR0UsIGdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdE5hbWVzKExpc3Q8U3RyaW5nPiB0ZXN0TmFtZXMpIHsKLSAgICAgICAgQXJyYXlBZGFwdGVyPFN0cmluZz4gYXJyYXlBZGFwdGVyID0gbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KHRoaXMsCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQudGVzdF9saXN0X2l0ZW0sIHRlc3ROYW1lcyk7Ci0gICAgICAgIHNldExpc3RBZGFwdGVyKGFycmF5QWRhcHRlcik7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQ29udHJvbGxlci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0ZTM5Zi4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBoaWRlIC0gVGhpcyBpcyBwYXJ0IG9mIGEgZnJhbWV3b3JrIHRoYXQgaXMgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IKLSAqIGFjdGl2ZSBkZXZlbG9wbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUZXN0QnJvd3NlckNvbnRyb2xsZXIgewotICAgIFN0cmluZyBCVU5ETEVfRVhUUkFfVEVTVF9NRVRIT0RfTkFNRSA9ICJ0ZXN0TWV0aG9kTmFtZSI7Ci0KLSAgICBJbnRlbnQgZ2V0SW50ZW50Rm9yVGVzdEF0KGludCBwb3NpdGlvbik7Ci0KLSAgICB2b2lkIHNldFRlc3RTdWl0ZShUZXN0U3VpdGUgdGVzdFN1aXRlKTsKLQotICAgIHZvaWQgcmVnaXN0ZXJWaWV3KFRlc3RCcm93c2VyVmlldyB0ZXN0QnJvd3NlclZpZXcpOwotCi0gICAgdm9pZCBzZXRUYXJnZXRCcm93c2VyQWN0aXZpdHlDbGFzc05hbWUoU3RyaW5nIHRhcmdldEJyb3dzZXJBY3Rpdml0eUNsYXNzTmFtZSk7Ci0KLSAgICB2b2lkIHNldFRhcmdldFBhY2thZ2VOYW1lKFN0cmluZyB0YXJnZXRQYWNrYWdlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQ29udHJvbGxlckltcGwuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGY4OTc1Li4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lkxpc3RzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGhpZGUgLSBUaGlzIGlzIHBhcnQgb2YgYSBmcmFtZXdvcmsgdGhhdCBpcyB1bmRlciBkZXZlbG9wbWVudCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvcgotICogYWN0aXZlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbCBpbXBsZW1lbnRzIFRlc3RCcm93c2VyQ29udHJvbGxlciB7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUlVOTkVSX0FDVElWSVRZX0NMQVNTX05BTUUgPQotICAgICAgICAgICAiY29tLmFuZHJvaWQudGVzdGhhcm5lc3MuVGVzdFJ1bm5lckFjdGl2aXR5IjsKLQotICAgIHByaXZhdGUgVGVzdFN1aXRlIG1UZXN0U3VpdGU7Ci0gICAgcHJpdmF0ZSBUZXN0QnJvd3NlclZpZXcgbVRlc3RCcm93c2VyVmlldzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0FMTF9JTkRFWCA9IDA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhcmdldEJyb3dzZXJBY3Rpdml0eUNsYXNzTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtVGFyZ2V0UGFja2FnZU5hbWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRQYWNrYWdlTmFtZShTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUpIHsKLSAgICAgICAgbVRhcmdldFBhY2thZ2VOYW1lID0gdGFyZ2V0UGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVudCBnZXRJbnRlbnRGb3JUZXN0QXQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOwotICAgICAgICAvLyBXZSBtdXN0IGFkZCB0aGUgZm9sbG93aW5nIHR3byBmbGFncyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBjcmVhdGUgYSBuZXcgYWN0aXZpdHkgd2hlbgotICAgICAgICAvLyB3ZSBicm93c2UgbmVzdGVkIHRlc3Qgc3VpdGVzLgotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSyk7Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0RGVmYXVsdFBhY2thZ2VOYW1lRm9yVGVzdFJ1bm5lcigpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gIiI7Ci0gICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9ICIiOwotICAgICAgICBpZiAoc2hvdWxkQWxsVGVzdHNCZVJ1bihwb3NpdGlvbikpIHsKLSAgICAgICAgICAgIHRlc3ROYW1lID0gbVRlc3RTdWl0ZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBURVNUX1JVTk5FUl9BQ1RJVklUWV9DTEFTU19OQU1FOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVGVzdCB0ZXN0ID0gVGVzdENhc2VVdGlsLmdldFRlc3RBdEluZGV4KG1UZXN0U3VpdGUsIHBvc2l0aW9uIC0gMSk7Ci0gICAgICAgICAgICBpZiAoVGVzdFN1aXRlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdC5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSAoVGVzdFN1aXRlKSB0ZXN0OwotICAgICAgICAgICAgICAgIHRlc3ROYW1lID0gdGVzdFN1aXRlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBtVGFyZ2V0QnJvd3NlckFjdGl2aXR5Q2xhc3NOYW1lOwotICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gbVRhcmdldFBhY2thZ2VOYW1lOwotICAgICAgICAgICAgfSBlbHNlIGlmIChUZXN0Q2FzZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3QuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZSB0ZXN0Q2FzZSA9IChUZXN0Q2FzZSkgdGVzdDsKLSAgICAgICAgICAgICAgICB0ZXN0TmFtZSA9IHRlc3RDYXNlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IFRFU1RfUlVOTkVSX0FDVElWSVRZX0NMQVNTX05BTUU7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRlc3RNZXRob2ROYW1lID0gdGVzdENhc2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShCVU5ETEVfRVhUUkFfVEVTVF9NRVRIT0RfTkFNRSwgdGVzdE1ldGhvZE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKTsKLSAgICAgICAgaW50ZW50LnNldERhdGEoVXJpLnBhcnNlKHRlc3ROYW1lKSk7Ci0KLSAgICAgICAgcmV0dXJuIGludGVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UGFja2FnZU5hbWVGb3JUZXN0UnVubmVyKCkgewotICAgICAgICByZXR1cm4gVEVTVF9SVU5ORVJfQUNUSVZJVFlfQ0xBU1NfTkFNRS5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICBURVNUX1JVTk5FUl9BQ1RJVklUWV9DTEFTU19OQU1FLmxhc3RJbmRleE9mKCIuIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRBbGxUZXN0c0JlUnVuKGludCBwb3NpdGlvbikgewotICAgICAgICByZXR1cm4gcG9zaXRpb24gPT0gUlVOX0FMTF9JTkRFWDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0U3VpdGUoVGVzdFN1aXRlIHRlc3RTdWl0ZSkgewotICAgICAgICBtVGVzdFN1aXRlID0gdGVzdFN1aXRlOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiB0ZXN0Q2FzZU5hbWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RDYXNlTmFtZXMuYWRkKCJSdW4gQWxsIik7Ci0gICAgICAgIHRlc3RDYXNlTmFtZXMuYWRkQWxsKFRlc3RDYXNlVXRpbC5nZXRUZXN0Q2FzZU5hbWVzKHRlc3RTdWl0ZSwgZmFsc2UpKTsKLQotICAgICAgICBtVGVzdEJyb3dzZXJWaWV3LnNldFRlc3ROYW1lcyh0ZXN0Q2FzZU5hbWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclZpZXcoVGVzdEJyb3dzZXJWaWV3IHRlc3RCcm93c2VyVmlldykgewotICAgICAgICBtVGVzdEJyb3dzZXJWaWV3ID0gdGVzdEJyb3dzZXJWaWV3OwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0QnJvd3NlckFjdGl2aXR5Q2xhc3NOYW1lKFN0cmluZyB0YXJnZXRCcm93c2VyQWN0aXZpdHlDbGFzc05hbWUpIHsKLSAgICAgICAgbVRhcmdldEJyb3dzZXJBY3Rpdml0eUNsYXNzTmFtZSA9IHRhcmdldEJyb3dzZXJBY3Rpdml0eUNsYXNzTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyVmlldy5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlclZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5OWYxOS4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGhpZGUgLSBUaGlzIGlzIHBhcnQgb2YgYSBmcmFtZXdvcmsgdGhhdCBpcyB1bmRlciBkZXZlbG9wbWVudCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvcgotICogYWN0aXZlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RCcm93c2VyVmlldyB7Ci0gICAgdm9pZCBzZXRUZXN0TmFtZXMoTGlzdDxTdHJpbmc+IHRlc3ROYW1lcyk7Ci19CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RMaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdExpc3RBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDc2YTcwLi4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdExpc3RBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuTWF0cml4Q3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBBY3Rpdml0eSBiYXNlIGNsYXNzIHRvIHVzZSB0byBpbXBsZW1lbnQgeW91ciBhcHBsaWNhdGlvbidzIHRlc3RzLgotICoKLSAqIDxwPkltcGxlbWVudCB0aGUgZ2V0VGVzdFN1aXRlKCkgbWV0aG9kIHRvIHJldHVybiB0aGUgbmFtZSBvZiB5b3VyCi0gKiB0ZXN0IHN1aXRlIGNsYXNzLgotICoKLSAqIDxwPlNlZSB0aGUgYW5kcm9pZC50ZXN0IHBhY2thZ2UgZG9jdW1lbnRhdGlvbiAoY2xpY2sgdGhlIG1vcmUuLi4gbGluaykKLSAqIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24KLSAqIAotICoge0BoaWRlfSBOb3QgbmVlZGVkIGZvciBTREsKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RMaXN0QWN0aXZpdHkgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgewotICAgIC8qKiBTdXBwbGllZCBpbiB0aGUgaW50ZW50IGV4dHJhcyBpZiB3ZSBhcmUgcnVubmluZyBwZXJmb3JtYW5jZSB0ZXN0cy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJGT1JNQU5DRV9URVNUUyA9ICJhbmRyb2lkLnRlc3QucGVyZm9ybWFuY2UiOwotCi0gICAgLyoqICJNb2RlIiBncm91cCBpbiB0aGUgbWVudS4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE1PREVfR1JPVVAgPSBNZW51LkZJUlNUOwotCi0gICAgLyoqIE91ciBzdWl0ZSAqLwotICAgIFN0cmluZyBtU3VpdGU7Ci0KLSAgICAvKiogT3VyIGNoaWxkcmVuIHRlc3RzICovCi0gICAgU3RyaW5nW10gbVRlc3RzOwotCi0gICAgLyoqIHdoaWNoIG1vZGUsIFJFR1JFU1NJT04sIFBFUkZPUk1BTkNFIG9yIFBST0ZJTElORyAqLwotICAgIHByaXZhdGUgaW50IG1Nb2RlID0gVGVzdFJ1bm5lci5SRUdSRVNTSU9OOwotCi0gICAgLyoqICJSZWdyZXNzaW9uIiBtZW51IGl0ZW0gKi8KLSAgICBwcml2YXRlIE1lbnVJdGVtIG1SZWdyZXNzaW9uSXRlbTsKLQotICAgIC8qKiAiUGVyZm9ybWFuY2UiIG1lbnUgaXRlbSAqLwotICAgIHByaXZhdGUgTWVudUl0ZW0gbVBlcmZvcm1hbmNlSXRlbTsKLQotICAgIC8qKiAiUHJvZmlsaW5nIiBtZW51IGl0ZW0gKi8KLSAgICBwcml2YXRlIE1lbnVJdGVtIG1Qcm9maWxpbmdJdGVtOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gc0NvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IGNvbXBhcmUoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0gICAgICAgICAgICBTdHJpbmcgczEgPSBtYWtlQ29tcGFyZU5hbWUoYSk7Ci0gICAgICAgICAgICBTdHJpbmcgczIgPSBtYWtlQ29tcGFyZU5hbWUoYik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGRvZXNuJ3QgZG8gbXVjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdExpc3RBY3Rpdml0eSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyB0byByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBjbGFzc2VzCi0gICAgICogb2YgdGhlaXIgdGVzdHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRlc3Qgc3VpdGUgY2xhc3MgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGVzdFN1aXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUeXBpY2FsIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7Ci0KLSAgICAgICAgbU1vZGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoVGVzdExpc3RBY3Rpdml0eS5QRVJGT1JNQU5DRV9URVNUUywgbU1vZGUpOwotCi0KLSAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9NQUlOKSkgewotICAgICAgICAgICAgLy8gaWYgd2Ugd2VyZSBjYWxsZWQgYXMgTUFJTiwgZ2V0IHRoZSB0ZXN0IHN1aXRlcywKLSAgICAgICAgICAgIG1TdWl0ZSA9IGdldFRlc3RTdWl0ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9SVU4pKSB7Ci0gICAgICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBiZWVuIHByb3ZpZGVkIGEgc3RhdHVzIGNoYW5uZWwuICBCYWlsIG91dCBhbmQKLSAgICAgICAgICAgIC8vIHJ1biB0aGUgdGVzdCBpbnN0ZWFkLiAgVGhpcyBpcyBob3cgdGhlIFRlc3RIYXJuZXNzIGdldHMgdXMKLSAgICAgICAgICAgIC8vIGxvYWRlZCBpbiBvdXIgcHJvY2VzcyBmb3IgIlJ1biBBbGwgVGVzdHMuIgotICAgICAgICAgICAgSW50ZW50IG50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1JVTiwKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldERhdGEoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnRlbnQuZ2V0RGF0YSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBVcmkucGFyc2UoZ2V0VGVzdFN1aXRlKCkpKTsKLSAgICAgICAgICAgIG50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQudGVzdGhhcm5lc3MiLAotICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQudGVzdGhhcm5lc3MuUnVuVGVzdCIpOwotICAgICAgICAgICAgbnRlbnQucHV0RXh0cmFzKGludGVudCk7Ci0gICAgICAgICAgICBudGVudC5wdXRFeHRyYSgicGFja2FnZSIsIGdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShudGVudCk7Ci0gICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fVklFVykpIHsKLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIG9uZSBpbiB0aGUgaW50ZW50Ci0gICAgICAgICAgICBtU3VpdGUgPSBpbnRlbnQuZ2V0RGF0YSgpICE9IG51bGwgPyBpbnRlbnQuZ2V0RGF0YSgpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gY2hpbGRyZW4gPSBUZXN0UnVubmVyLmdldENoaWxkcmVuKHRoaXMsIG1TdWl0ZSk7Ci0KLSAgICAgICAgQXJyYXlzLnNvcnQoY2hpbGRyZW4sIHNDb21wYXJhdG9yKTsKLQotICAgICAgICBpbnQgbGVuID0gY2hpbGRyZW4ubGVuZ3RoOwotICAgICAgICBtVGVzdHMgPSBuZXcgU3RyaW5nW2xlbl07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2hpbGRyZW4sIDAsIG1UZXN0cywgMCwgbGVuKTsKLQotICAgICAgICBzZXRUaXRsZShUZXN0UnVubmVyLmdldFRpdGxlKG1TdWl0ZSkpOwotCi0gICAgICAgIE1hdHJpeEN1cnNvciBjdXJzb3IgPSBuZXcgTWF0cml4Q3Vyc29yKG5ldyBTdHJpbmdbXSB7ICJuYW1lIiwgIl9pZCIgfSk7Ci0gICAgICAgIGFkZFRlc3RSb3dzKGN1cnNvcik7Ci0KLSAgICAgICAgQ3Vyc29yQWRhcHRlciBhZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIoCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsCi0gICAgICAgICAgICAgICAgY3Vyc29yLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Im5hbWUifSwKLSAgICAgICAgICAgICAgICBuZXcgaW50W10ge2NvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dDF9KTsKLSAgICAgICAgCi0gICAgICAgIHNldExpc3RBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRUZXN0Um93cyhNYXRyaXhDdXJzb3IgY3Vyc29yKSB7Ci0gICAgICAgIGludCBpZCA9IDA7Ci0gICAgICAgIGN1cnNvci5uZXdSb3coKS5hZGQoIlJ1biBBbGwiKS5hZGQoaWQrKyk7ICAgICAgIAotICAgICAgICBmb3IgKFN0cmluZyB0ZXN0IDogbVRlc3RzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBUZXN0UnVubmVyLmdldFRpdGxlKHRlc3QpOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IFRlc3RSdW5uZXIuaXNUZXN0U3VpdGUodGhpcywgdGVzdCkKLSAgICAgICAgICAgICAgICAgICAgPyAiQnJvd3NlICIgOiAiUnVuICI7Ci0KLSAgICAgICAgICAgIC8vIEknZCByYXRoZXIgZG8gdGhpcyB3aXRoIGFuIGljb24gY29sdW1uLCBidXQgSSBkb24ndCBrbm93IGhvdwotICAgICAgICAgICAgY3Vyc29yLm5ld1JvdygpLmFkZChwcmVmaXggKyB0aXRsZSkuYWRkKGlkKyspOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKLSAgICAgICAgbVJlZ3Jlc3Npb25JdGVtID0gbWVudS5hZGQoTU9ERV9HUk9VUCwgLTEsIDAsICJSZWdyZXNzaW9uIE1vZGUiKTsKLSAgICAgICAgbVBlcmZvcm1hbmNlSXRlbSA9IG1lbnUuYWRkKE1PREVfR1JPVVAsIC0xLCAwLCAiUGVyZm9ybWFuY2UgTW9kZSIpOwotICAgICAgICBtUHJvZmlsaW5nSXRlbSA9IG1lbnUuYWRkKE1PREVfR1JPVVAsIC0xLCAwLCAiUHJvZmlsaW5nIE1vZGUiKTsKLSAgICAgICAgbWVudS5zZXRHcm91cENoZWNrYWJsZShNT0RFX0dST1VQLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbVJlZ3Jlc3Npb25JdGVtKSB7Ci0gICAgICAgICAgICBtTW9kZSA9IFRlc3RSdW5uZXIuUkVHUkVTU0lPTjsKLSAgICAgICAgfSBlbHNlIGlmIChpdGVtID09IG1QZXJmb3JtYW5jZUl0ZW0pIHsKLSAgICAgICAgICAgIG1Nb2RlID0gVGVzdFJ1bm5lci5QRVJGT1JNQU5DRTsKLSAgICAgICAgfSBlbHNlIGlmIChpdGVtID09IG1Qcm9maWxpbmdJdGVtKSB7Ci0gICAgICAgICAgICBtTW9kZSA9IFRlc3RSdW5uZXIuUFJPRklMSU5HOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAgICAgICAgc3VwZXIub25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7Ci0gICAgICAgIHN3aXRjaCAobU1vZGUpIHsKLSAgICAgICAgY2FzZSBUZXN0UnVubmVyLlJFR1JFU1NJT046Ci0gICAgICAgICAgICBtUmVncmVzc2lvbkl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVGVzdFJ1bm5lci5QRVJGT1JNQU5DRToKLSAgICAgICAgICAgIG1QZXJmb3JtYW5jZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVGVzdFJ1bm5lci5QUk9GSUxJTkc6Ci0gICAgICAgICAgICBtUHJvZmlsaW5nSXRlbS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0KLSAgICAgICAgaWYgKHBvc2l0aW9uID09IDApIHsKLSAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLnRlc3RoYXJuZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC50ZXN0aGFybmVzcy5SdW5BbGwiKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInRlc3RzIiwgbmV3IFN0cmluZ1tde21TdWl0ZX0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC50ZXN0aGFybmVzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQudGVzdGhhcm5lc3MuUnVuVGVzdCIpOwotICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOwotICAgICAgICAgICAgICAgIGludGVudC5zZXREYXRhKFVyaS5wYXJzZShtU3VpdGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXN0ID0gbVRlc3RzW3Bvc2l0aW9uIC0gMV07Ci0gICAgICAgICAgICBpZiAoVGVzdFJ1bm5lci5pc1Rlc3RTdWl0ZSh0aGlzLCB0ZXN0KSkgewotICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoZ2V0UGFja2FnZU5hbWUoKSwgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1ZJRVcpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC50ZXN0aGFybmVzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQudGVzdGhhcm5lc3MuUnVuVGVzdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZW50LnNldERhdGEoVXJpLnBhcnNlKHRlc3QpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVudC5wdXRFeHRyYShQRVJGT1JNQU5DRV9URVNUUywgbU1vZGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoInBhY2thZ2UiLCBnZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG1ha2VDb21wYXJlTmFtZShTdHJpbmcgcykgewotICAgICAgICBpbnQgaW5kZXggPSBzLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RSZWNvcmRlci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0UmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzNjhhMC4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RSZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwotaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LlRlc3RSdW5uZXIuSW50ZXJtZWRpYXRlVGltZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0TGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIHtAaGlkZX0gTm90IG5lZWRlZCBmb3IgMS4wIFNESy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RSZWNvcmRlciBpbXBsZW1lbnRzIFRlc3RSdW5uZXIuTGlzdGVuZXIsIFRlc3RMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFCQVNFX1ZFUlNJT04gPSAxOwotICAgIHByaXZhdGUgc3RhdGljIFNRTGl0ZURhdGFiYXNlIHNEYjsKLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1GYWlsZWRUZXN0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFNRTGl0ZURhdGFiYXNlIGdldERhdGFiYXNlKCkgewotICAgICAgICBpZiAoc0RiID09IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoRW52aXJvbm1lbnQuZ2V0RGF0YURpcmVjdG9yeSgpLCAidGVzdF9yZXN1bHRzIik7Ci0KLSAgICAgICAgICAgIC8qIFRPRE86IGFkZCBhIERCIHZlcnNpb24gbnVtYmVyIGFuZCBib290c3RyYXAvdXBncmFkZSBtZXRob2RzCi0gICAgICAgICAgICAqIGlmIHRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlIGNoYW5nZXMuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGRiTmFtZSA9ICJUZXN0SGFybmVzcy5kYiI7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGRiTmFtZSk7Ci0gICAgICAgICAgICBzRGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShmaWxlLmdldFBhdGgoKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzRGIuZ2V0VmVyc2lvbigpID09IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgY29kZSA9IEZpbGVVdGlscy5zZXRQZXJtaXNzaW9ucyhmaWxlLmdldFBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5TX0lSVVNSIHwgRmlsZVV0aWxzLlNfSVdVU1IgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuU19JUkdSUCB8IEZpbGVVdGlscy5TX0lXR1JQIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLlNfSVJPVEggfCBGaWxlVXRpbHMuU19JV09USCwgLTEsIC0xKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KCJUZXN0UmVjb3JkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgcGVybWlzc2lvbnMgZm9yICIgKyBmaWxlLmdldFBhdGgoKSArICIgcmV0dXJuZWQgPSAiICsgY29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNEYi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0ZXN0cyAoX2lkIElOVCBQUklNQVJZIEtFWSwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSBURVhULCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bHQgVEVYVCwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIFRFWFQsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0ZWQgSU5URUdFUiwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluaXNoZWQgSU5URUdFUiwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZSBJTlRFR0VSLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRpb25zIElOVEVHRVIsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsbG9jYXRpb25zIElOVEVHRVIsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudCBJTlRFR0VSKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgc0RiLnNldFZlcnNpb24oREFUQUJBU0VfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlRlc3RSZWNvcmRlciIsICJmYWlsZWQgdG8gY3JlYXRlIHRhYmxlICd0ZXN0cyciLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgc0RiID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc0RiOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0UmVjb3JkZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRlZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoMik7Ci0gICAgICAgIG1hcC5wdXQoIm5hbWUiLCBjbGFzc05hbWUpOwotICAgICAgICBtYXAucHV0KCJzdGFydGVkIiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCi0gICAgICAgIC8vIHRyeSB0byB1cGRhdGUgdGhlIHJvdyBmaXJzdCBpbiBjYXNlIHdlJ3ZlIHJhbiB0aGlzIHRlc3QgYmVmb3JlLgotICAgICAgICBpbnQgcm93c0FmZmVjdGVkID0gZ2V0RGF0YWJhc2UoKS51cGRhdGUoInRlc3RzIiwgbWFwLCAibmFtZSA9ICciICsgY2xhc3NOYW1lICsgIiciLCBudWxsKTsKLQotICAgICAgICBpZiAocm93c0FmZmVjdGVkID09IDApIHsKLSAgICAgICAgICAgIGdldERhdGFiYXNlKCkuaW5zZXJ0KCJ0ZXN0cyIsIG51bGwsIG1hcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoMSk7Ci0gICAgICAgIG1hcC5wdXQoImZpbmlzaGVkIiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCi0gICAgICAgIGdldERhdGFiYXNlKCkudXBkYXRlKCJ0ZXN0cyIsIG1hcCwgIm5hbWUgPSAnIiArIGNsYXNzTmFtZSArICInIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybWFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgbG9uZyBpdGVtVGltZU5TLCBpbnQgaXRlcmF0aW9ucywgTGlzdDxJbnRlcm1lZGlhdGVUaW1lPiBpbnRlcm1lZGlhdGVzKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbWFwLnB1dCgidGltZSIsIGl0ZW1UaW1lTlMpOwotICAgICAgICBtYXAucHV0KCJpdGVyYXRpb25zIiwgaXRlcmF0aW9ucyk7Ci0KLSAgICAgICAgZ2V0RGF0YWJhc2UoKS51cGRhdGUoInRlc3RzIiwgbWFwLCAibmFtZSA9ICciICsgY2xhc3NOYW1lICsgIiciLCBudWxsKTsKLQotICAgICAgICBpZiAoaW50ZXJtZWRpYXRlcyAhPSBudWxsICYmIGludGVybWVkaWF0ZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgaW50IG4gPSBpbnRlcm1lZGlhdGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVGVzdFJ1bm5lci5JbnRlcm1lZGlhdGVUaW1lIHRpbWUgPSBpbnRlcm1lZGlhdGVzLmdldChpKTsKLQotICAgICAgICAgICAgICAgIGdldERhdGFiYXNlKCkuZXhlY1NRTCgiSU5TRVJUIElOVE8gdGVzdHMgKG5hbWUsIHRpbWUsIHBhcmVudCkgVkFMVUVTICgnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lLm5hbWUgKyAiJywgIiArIHRpbWUudGltZUluTlMgKyAiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIoU0VMRUNUIF9pZCBGUk9NIHRlc3RzIFdIRVJFIG5hbWUgPSAnIiArIGNsYXNzTmFtZSArICInKSk7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXNzZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1hcC5wdXQoInJlc3VsdCIsICJwYXNzZWQiKTsKLQotICAgICAgICBnZXREYXRhYmFzZSgpLnVwZGF0ZSgidGVzdHMiLCBtYXAsICJuYW1lID0gJyIgKyBjbGFzc05hbWUgKyAiJyIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZhaWxlZChTdHJpbmcgY2xhc3NOYW1lLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHByaW50V3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtYXAucHV0KCJyZXN1bHQiLCAiZmFpbGVkIik7Ci0gICAgICAgIG1hcC5wdXQoImV4Y2VwdGlvbiIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKLQotICAgICAgICBnZXREYXRhYmFzZSgpLnVwZGF0ZSgidGVzdHMiLCBtYXAsICJuYW1lID0gJyIgKyBjbGFzc05hbWUgKyAiJyIsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydHMgYSB0ZXN0IGNhc2UgZmFpbHVyZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgTmFtZSBvZiB0aGUgY2xhc3MvdGVzdC4KLSAgICAgKiBAcGFyYW0gcmVhc29uICAgIFJlYXNvbiBmb3IgZmFpbHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYWlsZWQoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHJlYXNvbikgewotICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1hcC5wdXQoInJlc3VsdCIsICJmYWlsZWQiKTsKLSAgICAgICAgLy8gVGhlIHJlYXNvbiBpcyBwdXQgYXMgdGhlIGV4Y2VwdGlvbi4KLSAgICAgICAgbWFwLnB1dCgiZXhjZXB0aW9uIiwgcmVhc29uKTsKLSAgICAgICAgZ2V0RGF0YWJhc2UoKS51cGRhdGUoInRlc3RzIiwgbWFwLCAibmFtZSA9ICciICsgY2xhc3NOYW1lICsgIiciLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIG1GYWlsZWRUZXN0cy5hZGQodGVzdC50b1N0cmluZygpKTsKLSAgICAgICAgZmFpbGVkKHRlc3QudG9TdHJpbmcoKSwgdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7Ci0gICAgICAgIG1GYWlsZWRUZXN0cy5hZGQodGVzdC50b1N0cmluZygpKTsKLSAgICAgICAgZmFpbGVkKHRlc3QudG9TdHJpbmcoKSwgdC5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIGZpbmlzaGVkKHRlc3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmICghbUZhaWxlZFRlc3RzLmNvbnRhaW5zKHRlc3QudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIHBhc3NlZCh0ZXN0LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIG1GYWlsZWRUZXN0cy5yZW1vdmUodGVzdC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIHN0YXJ0ZWQodGVzdC50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RSdW5uZXJWaWV3LmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RSdW5uZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTA5NTEuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0UnVubmVyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGhpZGUgLSBUaGlzIGlzIHBhcnQgb2YgYSBmcmFtZXdvcmsgdGhhdCBpcyB1bmRlciBkZXZlbG9wbWVudCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvcgotICogYWN0aXZlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RSdW5uZXJWaWV3IHsKLSAgICB2b2lkIHNldFRlc3ROYW1lcyhMaXN0PFN0cmluZz4gdGVzdE5hbWVzKTsKLQotICAgIHZvaWQgc2V0SXRlbUNvbG9yQXQoaW50IHBvc2l0aW9uLCBpbnQgY29sb3IpOwotCi0gICAgdm9pZCBzZXRGYWlsdXJlQ291bnQoaW50IGZhaWx1cmVDb3VudCk7Ci0KLSAgICB2b2lkIHNldFJ1bkNvdW50KGludCBydW5Db3VudCk7Ci0KLSAgICB2b2lkIHNldEVycm9yQ291bnQoaW50IGVycm9yQ291bnQpOwotCi0gICAgdm9pZCBzZXRUb3RhbENvdW50KGludCB0b3RhbENvdW50KTsKLQotICAgIHZvaWQgc2V0UHJvZ3Jlc3NCYXJDb2xvcihpbnQgY29sb3IpOwotCi0gICAgdm9pZCB0ZXN0c0NvbXBsZXRlZCgpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2p1bml0L3J1bm5lci9sb2dvLmdpZiBiL3Rlc3QtcnVubmVyL3NyYy9qdW5pdC9ydW5uZXIvbG9nby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTE1NDcuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2p1bml0L3J1bm5lci9sb2dvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9qdW5pdC9ydW5uZXIvc21hbGxsb2dvLmdpZiBiL3Rlc3QtcnVubmVyL3NyYy9qdW5pdC9ydW5uZXIvc21hbGxsb2dvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyNWVhZjYuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2p1bml0L3J1bm5lci9zbWFsbGxvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9TdHViVGVzdEJyb3dzZXJBY3Rpdml0eS5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9TdHViVGVzdEJyb3dzZXJBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2VkM2NlLi4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3QvU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHViVGVzdEJyb3dzZXJBY3Rpdml0eSBleHRlbmRzIFRlc3RCcm93c2VyQWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGVzdFN1aXRlIG1UZXN0U3VpdGU7Ci0KLSAgICBzdGF0aWMgdm9pZCBzZXRUb3BUZXN0U3VpdGUoVGVzdFN1aXRlIHRlc3RTdWl0ZSkgewotICAgICAgICBtVGVzdFN1aXRlID0gdGVzdFN1aXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0VG9wVGVzdFN1aXRlKCkgewotICAgICAgICByZXR1cm4gbVRlc3RTdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQWN0aXZpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTQwOWUuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckFjdGl2aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lkxpc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFRlc3RCcm93c2VyQWN0aXZpdHlUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBUZXN0QnJvd3NlckFjdGl2aXR5IG1UZXN0QnJvd3NlckFjdGl2aXR5OwotICAgIHByaXZhdGUgU3R1YlRlc3RCcm93c2VyQ29udHJvbGxlciBtVGVzdEJyb3dzZXJDb250cm9sbGVyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuc2V0VG9wVGVzdFN1aXRlKG51bGwpOwotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyID0gbmV3IFN0dWJUZXN0QnJvd3NlckNvbnRyb2xsZXIoKTsKLSAgICAgICAgU2VydmljZUxvY2F0b3Iuc2V0VGVzdEJyb3dzZXJDb250cm9sbGVyKG1UZXN0QnJvd3NlckNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtVGVzdEJyb3dzZXJBY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdEJyb3dzZXJBY3Rpdml0eS5maW5pc2goKTsKLSAgICAgICAgfQotICAgICAgICBtVGVzdEJyb3dzZXJBY3Rpdml0eSA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5TGlzdENvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuc2V0VG9wVGVzdFN1aXRlKG5ldyBUZXN0U3VpdGUoKSk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQWN0aXZpdHkgPSBjcmVhdGVBY3Rpdml0eSgpOwotCi0gICAgICAgIExpc3RWaWV3IGxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKLSAgICAgICAgLy8gVGhlcmUgaXMgYWx3YXlzIGFuIGl0ZW0gb24gdGhlIGxpc3QgZm9yIHJ1bm5pbmcgYWxsIHRlc3RzLgotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGl0ZW1zIG9uIGxpc3Qgdmlldy4iLCAxLCBsaXN0Vmlldy5nZXRDb3VudCgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlN0dWJiZWQgVGVzdCBCcm93c2VyIiwgbVRlc3RCcm93c2VyQWN0aXZpdHkuZ2V0VGl0bGUoKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lTGlzdENvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHRlc3RDYXNlTmFtZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoIkFsbFRlc3RzIik7Ci0gICAgICAgIFN0dWJUZXN0QnJvd3NlckFjdGl2aXR5LnNldFRvcFRlc3RTdWl0ZShjcmVhdGVUZXN0U3VpdGUodGVzdENhc2VOYW1lcykpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckFjdGl2aXR5ID0gY3JlYXRlQWN0aXZpdHkoKTsKLQotICAgICAgICBMaXN0VmlldyBsaXN0VmlldyA9IGdldExpc3RWaWV3KCk7Ci0gICAgICAgIGFzc2VydExpc3RWaWV3Q29udGVudHModGVzdENhc2VOYW1lcywgbGlzdFZpZXcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0V2l0aFRlc3RDYXNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gdGVzdENhc2VOYW1lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgiQWxsVGVzdHMiLCAiQXBwbGVzIiwgIkJhbmFuYXMiLCAiT3JhbmdlcyIpOwotICAgICAgICBTdHViVGVzdEJyb3dzZXJBY3Rpdml0eS5zZXRUb3BUZXN0U3VpdGUoY3JlYXRlVGVzdFN1aXRlKHRlc3RDYXNlTmFtZXMpKTsKLQotICAgICAgICBtVGVzdEJyb3dzZXJBY3Rpdml0eSA9IGNyZWF0ZUFjdGl2aXR5KCk7Ci0KLSAgICAgICAgTGlzdFZpZXcgbGlzdFZpZXcgPSBnZXRMaXN0VmlldygpOwotICAgICAgICBhc3NlcnRMaXN0Vmlld0NvbnRlbnRzKHRlc3RDYXNlTmFtZXMsIGxpc3RWaWV3KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFdpdGhUZXN0U3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHRlc3RDYXNlTmFtZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoT25lVGVzdFRlc3RDYXNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIFN0dWJUZXN0QnJvd3NlckFjdGl2aXR5LnNldFRvcFRlc3RTdWl0ZShuZXcgT25lVGVzdEluVGVzdFN1aXRlKCkpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckFjdGl2aXR5ID0gY3JlYXRlQWN0aXZpdHkoKTsKLQotICAgICAgICBMaXN0VmlldyBsaXN0VmlldyA9IGdldExpc3RWaWV3KCk7Ci0gICAgICAgIGFzc2VydExpc3RWaWV3Q29udGVudHModGVzdENhc2VOYW1lcywgbGlzdFZpZXcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RBVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHRlc3RDYXNlTmFtZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoIkFsbFRlc3RzIik7Ci0gICAgICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBjcmVhdGVUZXN0U3VpdGUodGVzdENhc2VOYW1lcyk7Ci0gICAgICAgIFN0dWJUZXN0QnJvd3NlckFjdGl2aXR5LnNldFRvcFRlc3RTdWl0ZSh0ZXN0U3VpdGUpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuc2V0VGVzdENhc2UoT25lVGVzdFRlc3RDYXNlLmNsYXNzKTsKLSAgICAgICAgbVRlc3RCcm93c2VyQWN0aXZpdHkgPSBjcmVhdGVBY3Rpdml0eSgpOwotCi0gICAgICAgIEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eU1vbml0b3IgYWN0aXZpdHlNb25pdG9yID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuYWRkTW9uaXRvcigKLSAgICAgICAgICAgICAgICBUZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsLlRFU1RfUlVOTkVSX0FDVElWSVRZX0NMQVNTX05BTUUsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhY3Rpdml0eU1vbml0b3IuZ2V0SGl0cygpKTsKLQotICAgICAgICAgICAgTGlzdFZpZXcgbGlzdFZpZXcgPSBnZXRMaXN0VmlldygpOwotICAgICAgICAgICAgaW50IGludm9rZWRUZXN0Q2FzZUluZGV4ID0gMDsKLSAgICAgICAgICAgIGxpc3RWaWV3LnBlcmZvcm1JdGVtQ2xpY2sobGlzdFZpZXcsIGludm9rZWRUZXN0Q2FzZUluZGV4LCAwKTsKLQotICAgICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBhY3Rpdml0eU1vbml0b3Iud2FpdEZvckFjdGl2aXR5V2l0aFRpbWVvdXQoMjAwMCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFjdGl2aXR5KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFjdGl2aXR5TW9uaXRvci5nZXRIaXRzKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbnZva2VkVGVzdENhc2VJbmRleCwgbVRlc3RCcm93c2VyQ29udHJvbGxlci5nZXRMYXN0UG9zaXRpb24oKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGFjdGl2aXR5LmZpbmlzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucmVtb3ZlTW9uaXRvcihhY3Rpdml0eU1vbml0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUZyb21JbnRlbnRXaXRoT25lVGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gdGVzdENhc2VOYW1lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgidGVzdE9uZSIpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckFjdGl2aXR5ID0gbGF1bmNoVGVzdEJyb3dzZXJBY3Rpdml0eShuZXcgVGVzdFN1aXRlKE9uZVRlc3RUZXN0Q2FzZS5jbGFzcykpOwotCi0gICAgICAgIExpc3RWaWV3IGxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKLSAgICAgICAgYXNzZXJ0TGlzdFZpZXdDb250ZW50cyh0ZXN0Q2FzZU5hbWVzLCBsaXN0Vmlldyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUxpc3RPblN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0dWJUZXN0QnJvd3NlckFjdGl2aXR5LnNldFRvcFRlc3RTdWl0ZShuZXcgVGVzdFN1aXRlKCkpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckFjdGl2aXR5ID0gY3JlYXRlQWN0aXZpdHkoKTsKLQotICAgICAgICBMaXN0VmlldyBsaXN0VmlldyA9IGdldExpc3RWaWV3KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgaXRlbXMgb24gbGlzdCB2aWV3LiIsIDEsIGxpc3RWaWV3LmdldENvdW50KCkpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiB0ZXN0Q2FzZU5hbWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCJBbGxUZXN0cyIpOwotICAgICAgICBTdHViVGVzdEJyb3dzZXJBY3Rpdml0eS5zZXRUb3BUZXN0U3VpdGUoY3JlYXRlVGVzdFN1aXRlKHRlc3RDYXNlTmFtZXMpKTsKLQotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAoKFN0dWJUZXN0QnJvd3NlckFjdGl2aXR5KSBtVGVzdEJyb3dzZXJBY3Rpdml0eSkub25TdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsaXN0VmlldyA9IGdldExpc3RWaWV3KCk7Ci0gICAgICAgIGFzc2VydExpc3RWaWV3Q29udGVudHModGVzdENhc2VOYW1lcywgbGlzdFZpZXcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUaXRsZUhhc1Rlc3RTdWl0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RTdWl0ZU5hbWUgPSAiY29tLmFuZHJvaWQuVGVzdFN1aXRlIjsKLSAgICAgICAgU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuc2V0VG9wVGVzdFN1aXRlKG5ldyBUZXN0U3VpdGUodGVzdFN1aXRlTmFtZSkpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckFjdGl2aXR5ID0gY3JlYXRlQWN0aXZpdHkoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3RTdWl0ZSIsIG1UZXN0QnJvd3NlckFjdGl2aXR5LmdldFRpdGxlKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgVGVzdFN1aXRlIGNyZWF0ZVRlc3RTdWl0ZShMaXN0PFN0cmluZz4gdGVzdENhc2VOYW1lcykgewotICAgICAgICByZXR1cm4gY3JlYXRlVGVzdFN1aXRlKHRlc3RDYXNlTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3Rlc3RDYXNlTmFtZXMuc2l6ZSgpXSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgVGVzdFN1aXRlIGNyZWF0ZVRlc3RTdWl0ZShTdHJpbmcuLi4gdGVzdENhc2VOYW1lcykgewotICAgICAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBmb3IgKFN0cmluZyB0ZXN0Q2FzZU5hbWUgOiB0ZXN0Q2FzZU5hbWVzKSB7Ci0gICAgICAgICAgICB0ZXN0U3VpdGUuYWRkVGVzdChuZXcgRmFrZVRlc3RDYXNlKHRlc3RDYXNlTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRlc3RTdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZha2VUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAgICAgcHVibGljIEZha2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9uZVRlc3RUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE9uZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBPbmVUZXN0SW5UZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotICAgICAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKE9uZVRlc3RJblRlc3RTdWl0ZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE9uZVRlc3RUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TGlzdFZpZXdDb250ZW50cyhMaXN0PFN0cmluZz4gZXhwZWN0ZWRUZXN0Q2FzZU5hbWVzLCBMaXN0VmlldyBsaXN0VmlldykgewotICAgICAgICBhc3NlcnRFcXVhbHMoIlJ1biBBbGwiLCBsaXN0Vmlldy5nZXRJdGVtQXRQb3NpdGlvbigwKS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBpdGVtcyBvbiBsaXN0IHZpZXcuIiwKLSAgICAgICAgICAgICAgICBleHBlY3RlZFRlc3RDYXNlTmFtZXMuc2l6ZSgpICsgMSwgbGlzdFZpZXcuZ2V0Q291bnQoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUZXN0Q2FzZU5hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUZXN0Q2FzZU5hbWUgPSBleHBlY3RlZFRlc3RDYXNlTmFtZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFRlc3RDYXNlTmFtZSA9IGxpc3RWaWV3LmdldEl0ZW1BdFBvc2l0aW9uKGkgKyAxKS50b1N0cmluZygpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHRlc3QgY2FzZSBuYW1lLiBJbmRleDogIiArIGksCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVGVzdENhc2VOYW1lLCBhY3R1YWxUZXN0Q2FzZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKLSAgICAgICAgcmV0dXJuIG1UZXN0QnJvd3NlckFjdGl2aXR5LmdldExpc3RWaWV3KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUZXN0QnJvd3NlckFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBsYXVuY2hBY3Rpdml0eShnZXRBbmRyb2lkUGFja2FnZU5hbWUoKSwgU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuY2xhc3MsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgSW50ZW50IGNyZWF0ZUludGVudChUZXN0U3VpdGUgdGVzdFN1aXRlKSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fUlVOKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFN0dWJUZXN0QnJvd3NlckFjdGl2aXR5LmNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0QW5kcm9pZFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIGludGVudC5zZXRDbGFzc05hbWUocGFja2FnZU5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgICAgIGludGVudC5zZXREYXRhKFVyaS5wYXJzZSh0ZXN0U3VpdGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIHJldHVybiBpbnRlbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QW5kcm9pZFBhY2thZ2VOYW1lKCkgewotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgVGVzdEJyb3dzZXJBY3Rpdml0eSBsYXVuY2hUZXN0QnJvd3NlckFjdGl2aXR5KFRlc3RTdWl0ZSB0ZXN0U3VpdGUpCi0gICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuc2V0SW5Ub3VjaE1vZGUoZmFsc2UpOwotCi0gICAgICAgIFRlc3RCcm93c2VyQWN0aXZpdHkgYWN0aXZpdHkgPQotICAgICAgICAgICAgICAgIChUZXN0QnJvd3NlckFjdGl2aXR5KSBnZXRJbnN0cnVtZW50YXRpb24oKS5zdGFydEFjdGl2aXR5U3luYygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUludGVudCh0ZXN0U3VpdGUpKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIHJldHVybiBhY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHViVGVzdEJyb3dzZXJDb250cm9sbGVyIGV4dGVuZHMgVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbCB7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Qb3NpdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+IG1UZXN0Q2FzZUNsYXNzOwotCi0gICAgICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50Rm9yVGVzdEF0KGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgbVBvc2l0aW9uID0gcG9zaXRpb247Ci0KLSAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fUlVOKTsKLQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFRlc3RCcm93c2VyQ29udHJvbGxlckltcGwuVEVTVF9SVU5ORVJfQUNUSVZJVFlfQ0xBU1NfTkFNRTsKLSAgICAgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IG1UZXN0Q2FzZUNsYXNzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKLSAgICAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUocGFja2FnZU5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShVcmkucGFyc2UodGVzdE5hbWUpKTsKLQotICAgICAgICAgICAgcmV0dXJuIGludGVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRlc3RDYXNlKENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4gdGVzdENhc2VDbGFzcykgewotICAgICAgICAgICAgbVRlc3RDYXNlQ2xhc3MgPSB0ZXN0Q2FzZUNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRMYXN0UG9zaXRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvc2l0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzE1NjA2Li4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnRlc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBUZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsIG1UZXN0QnJvd3NlckNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBUZXN0QnJvd3NlclZpZXdTdHViIG1UZXN0QnJvd3NlclZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyID0gbmV3IFRlc3RCcm93c2VyQ29udHJvbGxlckltcGwoKTsKLSAgICAgICAgbVRlc3RCcm93c2VyVmlldyA9IG5ldyBUZXN0QnJvd3NlclZpZXdTdHViKCk7Ci0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIucmVnaXN0ZXJWaWV3KG1UZXN0QnJvd3NlclZpZXcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUZXN0U3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgdGVzdFN1aXRlLmFkZFRlc3RTdWl0ZShEdW1teVRlc3RDYXNlLmNsYXNzKTsKLQotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyLnNldFRlc3RTdWl0ZSh0ZXN0U3VpdGUpOwotCi0gICAgICAgIHZlcmlmeVRlc3ROYW1lcyhBcnJheXMuYXNMaXN0KCJSdW4gQWxsIiwgRHVtbXlUZXN0Q2FzZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpLAotICAgICAgICAgICAgICAgIG1UZXN0QnJvd3NlclZpZXcuZ2V0VGVzdE5hbWVzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5VGVzdE5hbWVzKExpc3Q8U3RyaW5nPiBleHBlY3RlZFRlc3ROYW1lcywKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhY3R1YWxUZXN0TmFtZXMpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVGVzdE5hbWVzLnNpemUoKSwgYWN0dWFsVGVzdE5hbWVzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gV2UgdXNlIGVuZHNXaXRoIGluc3RlYWQgb2YgZXF1YWxzIGJlY2F1c2UgdGhlIHJldHVybiB2YWx1ZSBvZgotICAgICAgICAvLyBjbGFzcy5nZXRTaW1wbGVOYW1lKCksIHdoZW4gY2FsbGVkIG9uIGFuIGlubmVyIGNsYXNzLCB2YXJpZXMKLSAgICAgICAgLy8gZnJvbSBvbmUgdm0gdG8gYW5vdGhlci4KLSAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHRlc3QgdG8gcGFzcyBpbiBtdWx0aXBsZSBlbnZpcm9ubWVudHMuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUZXN0TmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYWN0dWFsVGVzdE5hbWVzLmdldChpKS5lbmRzV2l0aChleHBlY3RlZFRlc3ROYW1lcy5nZXQoaSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlbnRGb3JUZXN0U3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgdGVzdFN1aXRlLmFkZFRlc3RTdWl0ZShEdW1teVRlc3RDYXNlLmNsYXNzKTsKLQotICAgICAgICBTdHJpbmcgdGFyZ2V0QnJvd3NlckFjdHZpdHlDbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuYm9ndXMuRHVtbXlBY3Rpdml0eSI7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFRhcmdldFBhY2thZ2VOYW1lID0gImNvbS5hbmRyb2lkLmJvZ3VzIjsKLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlci5zZXRUYXJnZXRCcm93c2VyQWN0aXZpdHlDbGFzc05hbWUodGFyZ2V0QnJvd3NlckFjdHZpdHlDbGFzc05hbWUpOwotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyLnNldFRlc3RTdWl0ZSh0ZXN0U3VpdGUpOwotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyLnNldFRhcmdldFBhY2thZ2VOYW1lKGV4cGVjdGVkVGFyZ2V0UGFja2FnZU5hbWUpOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbVRlc3RCcm93c2VyQ29udHJvbGxlci5nZXRJbnRlbnRGb3JUZXN0QXQoMSk7Ci0gICAgICAgIHZlcmlmeUludGVudChpbnRlbnQsIER1bW15VGVzdENhc2UuY2xhc3MsIGV4cGVjdGVkVGFyZ2V0UGFja2FnZU5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHModGFyZ2V0QnJvd3NlckFjdHZpdHlDbGFzc05hbWUsIGludGVudC5nZXRDb21wb25lbnQoKS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEludGVudEZvclRlc3RDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHRlc3RTdWl0ZS5hZGRUZXN0KG5ldyBEdW1teVRlc3RDYXNlKCkpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuc2V0VGVzdFN1aXRlKHRlc3RTdWl0ZSk7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBtVGVzdEJyb3dzZXJDb250cm9sbGVyLmdldEludGVudEZvclRlc3RBdCgxKTsKLSAgICAgICAgdmVyaWZ5SW50ZW50KGludGVudCwgRHVtbXlUZXN0Q2FzZS5jbGFzcywgImNvbS5hbmRyb2lkLnRlc3RoYXJuZXNzIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsLlRFU1RfUlVOTkVSX0FDVElWSVRZX0NMQVNTX05BTUUsCi0gICAgICAgICAgICAgICAgaW50ZW50LmdldENvbXBvbmVudCgpLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0RHVtbXlUZXN0IiwKLSAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoVGVzdEJyb3dzZXJDb250cm9sbGVyLkJVTkRMRV9FWFRSQV9URVNUX01FVEhPRF9OQU1FKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEludGVudEZvclJ1bkFsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IER1bW15VGVzdFN1aXRlKCk7Ci0gICAgICAgIHRlc3RTdWl0ZS5hZGRUZXN0U3VpdGUoRHVtbXlUZXN0Q2FzZS5jbGFzcyk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlci5zZXRUZXN0U3VpdGUodGVzdFN1aXRlKTsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuZ2V0SW50ZW50Rm9yVGVzdEF0KDApOwotICAgICAgICB2ZXJpZnlJbnRlbnQoaW50ZW50LCBEdW1teVRlc3RTdWl0ZS5jbGFzcywgImNvbS5hbmRyb2lkLnRlc3RoYXJuZXNzIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlJbnRlbnQoSW50ZW50IGludGVudCwgQ2xhc3MgdGVzdENsYXNzLCBTdHJpbmcgZXhwZWN0ZWRQYWNrYWdlTmFtZSkgewotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZW50LkFDVElPTl9SVU4sIGludGVudC5nZXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSywKLSAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0RmxhZ3MoKSAmIEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVudC5GTEFHX0FDVElWSVRZX01VTFRJUExFX1RBU0ssCi0gICAgICAgICAgICAgICAgaW50ZW50LmdldEZsYWdzKCkgJiBJbnRlbnQuRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RDbGFzcy5nZXROYW1lKCksIGludGVudC5nZXREYXRhKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFBhY2thZ2VOYW1lLCBpbnRlbnQuZ2V0Q29tcG9uZW50KCkuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHVtbXlUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotICAgICAgICBwcml2YXRlIER1bW15VGVzdFN1aXRlKCkgewotICAgICAgICAgICAgc3VwZXIoRHVtbXlUZXN0U3VpdGUuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIER1bW15VGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgICAgIHByaXZhdGUgRHVtbXlUZXN0Q2FzZSgpIHsKLSAgICAgICAgICAgIHN1cGVyKCJ0ZXN0RHVtbXlUZXN0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVtbXlUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFRlc3RCcm93c2VyVmlld1N0dWIgaW1wbGVtZW50cyBUZXN0QnJvd3NlclZpZXcgewotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGVzdE5hbWVzOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRlc3ROYW1lcyhMaXN0PFN0cmluZz4gdGVzdE5hbWVzKSB7Ci0gICAgICAgICAgICBtVGVzdE5hbWVzID0gdGVzdE5hbWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUZXN0TmFtZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVRlc3ROYW1lczsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJUZXN0cy5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNWUyZjguLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLQotcGFja2FnZSBhbmRyb2lkLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgVGVzdEJyb3dzZXJUZXN0cyBleHRlbmRzIFRlc3RCcm93c2VyQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRlc3RTdWl0ZSBnZXRUb3BUZXN0U3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBzdWl0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IFRlc3RTdWl0ZShUZXN0QnJvd3NlclRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHRlc3RTdWl0ZS5hZGRUZXN0U3VpdGUoVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbFRlc3QuY2xhc3MpOwotICAgICAgICB0ZXN0U3VpdGUuYWRkVGVzdFN1aXRlKFRlc3RDYXNlVXRpbFRlc3QuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiB0ZXN0U3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9CaURpVGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4YTc3NTE5Li5hZDI3YTYyIDEwMDY0NAotLS0gYS90ZXN0cy9CaURpVGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9CaURpVGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTksNyArMTksNyBAQAogICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCiAgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIj4KIAotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJCaURpVGVzdHMiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJCaURpVGVzdHMiIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0idHJ1ZSI+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJpRGlUZXN0QWN0aXZpdHkiCiAgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlQWx3YXlzSGlkZGVuIj4KQEAgLTU3LDYgKzU3LDYyIEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJpRGlUZXN0RnJhbWVMYXlvdXRMdHJBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0ic3RhdGVBbHdheXNIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5CaURpVGVzdEZyYW1lTGF5b3V0UnRsQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlQWx3YXlzSGlkZGVuIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQmlEaVRlc3RSZWxhdGl2ZUxheW91dEx0ckFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZUFsd2F5c0hpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJpRGlUZXN0UmVsYXRpdmVMYXlvdXRSdGxBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0ic3RhdGVBbHdheXNIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5CaURpVGVzdFJlbGF0aXZlTGF5b3V0THRyQWN0aXZpdHkyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZUFsd2F5c0hpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJpRGlUZXN0UmVsYXRpdmVMYXlvdXRSdGxBY3Rpdml0eTIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlQWx3YXlzSGlkZGVuIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQmlEaVRlc3RUYWJsZUxheW91dEx0ckFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZUFsd2F5c0hpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJpRGlUZXN0VGFibGVMYXlvdXRSdGxBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0ic3RhdGVBbHdheXNIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvYmFzaWMueG1sIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvYmFzaWMueG1sCmluZGV4IGM0ODA3ZmYuLmYyNTRlM2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2Jhc2ljLnhtbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9iYXNpYy54bWwKQEAgLTI3LDIyICsyNywyMSBAQAogICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idXR0b24iCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uQnV0dG9uQ2xpY2siCiAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX3RleHQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKICAgICAgICAgLz4KIAogICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZWRpdHRleHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgogICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9jYW52YXMueG1sIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvY2FudmFzLnhtbAppbmRleCAzNzFjYzIzLi43NzAwN2FmMyAxMDA2NDQKLS0tIGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvY2FudmFzLnhtbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9jYW52YXMueG1sCkBAIC0zMSw0ICszMSw0IEBACiAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMCIKICAgICAvPgogCi08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2ZyYW1lX2xheW91dF9sdHIueG1sIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvZnJhbWVfbGF5b3V0X2x0ci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMjRlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2ZyYW1lX2xheW91dF9sdHIueG1sCkBAIC0wLDAgKzEsODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9mcmFtZV9sYXlvdXRfbHRyIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpob3Jpem9udGFsRGlyZWN0aW9uPSJsdHIiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiPgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkYwMDAwIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJsZWZ0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDBGRjAwIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDBGRiI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMEZGRkYiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxiZWZvcmUiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkZGRiI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGFmdGVyIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGMDAiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxiZWZvcmUiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkZGRiI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGFmdGVyIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGMDAiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsfGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGODg4ODg4Ij4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworPC9GcmFtZUxheW91dD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvZnJhbWVfbGF5b3V0X3J0bC54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9mcmFtZV9sYXlvdXRfcnRsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTRmNWUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvZnJhbWVfbGF5b3V0X3J0bC54bWwKQEAgLTAsMCArMSw4OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2ZyYW1lX2xheW91dF9sdHIiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249InJ0bCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCI+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRjAwMDAiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImxlZnR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMEZGMDAiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMEZGIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkZGRiI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGJlZm9yZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRkZGIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8YWZ0ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkYwMCI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGJlZm9yZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRkZGIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218YWZ0ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkYwMCI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX2hvcml6b250YWx8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkY4ODg4ODgiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCis8L0ZyYW1lTGF5b3V0PgorCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9saW5lYXJfbGF5b3V0X2x0ci54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9saW5lYXJfbGF5b3V0X2x0ci54bWwKaW5kZXggYTk1ZmIwZS4uYzVhOGQ0NyAxMDA2NDQKLS0tIGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvbGluZWFyX2xheW91dF9sdHIueG1sCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2xpbmVhcl9sYXlvdXRfbHRyLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGF5b3V0dGVzdCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2xpbmVhcl9sYXlvdXRfbHRyIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCkBAIC0yNCwyNiArMjQsNTIgQEAKICAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0iaW5oZXJpdCI+CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KIAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0iaW5oZXJpdCI+CisKKyAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC01NywyMCArODMsMjAgQEAKICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAvPgogCiAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgogICAgICAgICAvPgogCiAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgLz4KIAogICAgIDwvTGluZWFyTGF5b3V0PgpAQCAtODQsMjAgKzExMCwyMCBAQAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC0xMTEsMjAgKzEzNywyMCBAQAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC0xMzgsMjAgKzE2NCwyMCBAQAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC0xNjUsMjAgKzE5MSwyMCBAQAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9saW5lYXJfbGF5b3V0X3J0bC54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9saW5lYXJfbGF5b3V0X3J0bC54bWwKaW5kZXggMGQ2MDk1MC4uMTQ5NGZlYyAxMDA2NDQKLS0tIGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvbGluZWFyX2xheW91dF9ydGwueG1sCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2xpbmVhcl9sYXlvdXRfcnRsLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGF5b3V0dGVzdCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2xpbmVhcl9sYXlvdXRfcnRsIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCkBAIC0yNCwyNiArMjQsNTIgQEAKICAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0iaW5oZXJpdCI+CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KIAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0iaW5oZXJpdCI+CisKKyAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC01NywyMCArODMsMjAgQEAKICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAvPgogCiAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgogICAgICAgICAvPgogCiAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgLz4KIAogICAgIDwvTGluZWFyTGF5b3V0PgpAQCAtODQsMjAgKzExMCwyMCBAQAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC0xMTEsMjAgKzEzNywyMCBAQAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC0xMzgsMjAgKzE2NCwyMCBAQAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC0xNjUsMjAgKzE5MSwyMCBAQAogICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgorICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgIC8+CiAKICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCiAgICAgICAgIC8+CiAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCiAgICAgICAgICAvPgogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfbHRyLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3JlbGF0aXZlX2xheW91dF9sdHIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYWU3YzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfbHRyLnhtbApAQCAtMCwwICsxLDg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnJhbWVfbGF5b3V0X2x0ciIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0ibHRyIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIj4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGMDAwMCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0ibGVmdHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkYwMCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwRkYiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDBGRkZGIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8YmVmb3JlIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGRkYiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxhZnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRjAwIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218YmVmb3JlIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGRkYiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxhZnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRjAwIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjg4ODg4OCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKzwvRnJhbWVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3JlbGF0aXZlX2xheW91dF9sdHJfMi54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfbHRyXzIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDFiNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfbHRyXzIueG1sCkBAIC0wLDAgKzEsMTU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3JlbGF0aXZlX2xheW91dF9sdHIiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249Imx0ciI+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCI+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWxfMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJUeXBlIGhlcmU6IiAvPgorCisgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VudHJ5XzEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbGFiZWxfMSIgLz4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvb2tfMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZW50cnlfMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPSyIgLz4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9va18xIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduVG9wPSJAaWQvb2tfMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCIgLz4KKworICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0ibHRyIj4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYWJlbF8yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlR5cGUgaGVyZToiIC8+CisKKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZW50cnlfMiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sYWJlbF8yIiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9va18yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9lbnRyeV8yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9LIiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL29rXzIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9va18yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIiAvPgorCisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMHB4IgorICAgICAgICAgICAgYW5kcm9pZDpob3Jpem9udGFsRGlyZWN0aW9uPSJpbmhlcml0Ij4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYWJlbF8zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlR5cGUgaGVyZToiIC8+CisKKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZW50cnlfMyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sYWJlbF8zIiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9va18zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9lbnRyeV8zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9LIiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL29rXzMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9va18zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIiAvPgorCisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMHB4IgorICAgICAgICAgICAgYW5kcm9pZDpob3Jpem9udGFsRGlyZWN0aW9uPSJydGwiPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsXzQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVHlwZSBoZXJlOiIgLz4KKworICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9lbnRyeV80IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xhYmVsXzQiIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29rXzQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2VudHJ5XzQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMHB4IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT0siIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvb2tfNCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL29rXzQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwiIC8+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfcnRsLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3JlbGF0aXZlX2xheW91dF9ydGwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiODc3NTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfcnRsLnhtbApAQCAtMCwwICsxLDg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnJhbWVfbGF5b3V0X3J0bCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0icnRsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIj4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGMDAwMCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0ibGVmdHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkYwMCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwRkYiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDBGRkZGIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8YmVmb3JlIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGRkYiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxhZnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRjAwIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218YmVmb3JlIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGRkYiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxhZnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRjAwIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjg4ODg4OCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKzwvRnJhbWVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3JlbGF0aXZlX2xheW91dF9ydGxfMi54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfcnRsXzIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MThlNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfcnRsXzIueG1sCkBAIC0wLDAgKzEsMTU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3JlbGF0aXZlX2xheW91dF9sdHIiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249InJ0bCI+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCI+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWxfMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJUeXBlIGhlcmU6IiAvPgorCisgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VudHJ5XzEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbGFiZWxfMSIgLz4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvb2tfMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZW50cnlfMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPSyIgLz4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9va18xIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduVG9wPSJAaWQvb2tfMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCIgLz4KKworICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0ibHRyIj4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYWJlbF8yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlR5cGUgaGVyZToiIC8+CisKKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZW50cnlfMiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sYWJlbF8yIiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9va18yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9lbnRyeV8yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9LIiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL29rXzIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9va18yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIiAvPgorCisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMHB4IgorICAgICAgICAgICAgYW5kcm9pZDpob3Jpem9udGFsRGlyZWN0aW9uPSJpbmhlcml0Ij4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYWJlbF8zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlR5cGUgaGVyZToiIC8+CisKKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZW50cnlfMyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sYWJlbF8zIiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9va18zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9lbnRyeV8zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9LIiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL29rXzMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9va18zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIiAvPgorCisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMHB4IgorICAgICAgICAgICAgYW5kcm9pZDpob3Jpem9udGFsRGlyZWN0aW9uPSJydGwiPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsXzQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVHlwZSBoZXJlOiIgLz4KKworICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9lbnRyeV80IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xhYmVsXzQiIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29rXzQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2VudHJ5XzQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMHB4IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT0siIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvb2tfNCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL29rXzQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwiIC8+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC90YWJsZV9sYXlvdXRfbHRyLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3RhYmxlX2xheW91dF9sdHIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NGRlOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC90YWJsZV9sYXlvdXRfbHRyLnhtbApAQCAtMCwwICsxLDIxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9saW5lYXJfbGF5b3V0X2x0ciIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0ibHRyIj4KKworICAgIDxUYWJsZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnN0cmV0Y2hDb2x1bW5zPSIxLDIiPgorCisgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX3JpZ2h0X3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImFmdGVyIgorICAgICAgICAgICAgIC8+CisgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fbGVmdF90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2JlZm9yZV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJiZWZvcmUiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9UYWJsZVJvdz4KKworICAgIDwvVGFibGVMYXlvdXQ+CisKKyAgICA8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIgorICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249ImluaGVyaXQiPgorCisgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX3JpZ2h0X3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImFmdGVyIgorICAgICAgICAgICAgIC8+CisgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fbGVmdF90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2JlZm9yZV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJiZWZvcmUiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9UYWJsZVJvdz4KKworICAgIDwvVGFibGVMYXlvdXQ+CisKKyAgICA8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIgorICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249Imx0ciI+CisKKyAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fcmlnaHRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYWZ0ZXJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYWZ0ZXIiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9UYWJsZVJvdz4KKworICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9sZWZ0X3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYmVmb3JlX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJlZm9yZSIKKyAgICAgICAgICAgICAvPgorICAgICAgICA8L1RhYmxlUm93PgorCisgICAgPC9UYWJsZUxheW91dD4KKworICAgIDxUYWJsZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnN0cmV0Y2hDb2x1bW5zPSIxLDIiCisgICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0icnRsIj4KKworICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9yaWdodF90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9hZnRlcl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJhZnRlciIKKyAgICAgICAgICAgICAvPgorICAgICAgICA8L1RhYmxlUm93PgorCisgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2xlZnRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9iZWZvcmVfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYmVmb3JlIgorICAgICAgICAgICAgIC8+CisgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICA8L1RhYmxlTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC90YWJsZV9sYXlvdXRfcnRsLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3RhYmxlX2xheW91dF9ydGwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MjcwYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC90YWJsZV9sYXlvdXRfcnRsLnhtbApAQCAtMCwwICsxLDIxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9saW5lYXJfbGF5b3V0X2x0ciIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0icnRsIj4KKworICAgIDxUYWJsZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnN0cmV0Y2hDb2x1bW5zPSIxLDIiPgorCisgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX3JpZ2h0X3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImFmdGVyIgorICAgICAgICAgICAgIC8+CisgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fbGVmdF90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2JlZm9yZV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJiZWZvcmUiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9UYWJsZVJvdz4KKworICAgIDwvVGFibGVMYXlvdXQ+CisKKyAgICA8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIgorICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249ImluaGVyaXQiPgorCisgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX3JpZ2h0X3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImFmdGVyIgorICAgICAgICAgICAgIC8+CisgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fbGVmdF90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2JlZm9yZV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJiZWZvcmUiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9UYWJsZVJvdz4KKworICAgIDwvVGFibGVMYXlvdXQ+CisKKyAgICA8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIgorICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249Imx0ciI+CisKKyAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fcmlnaHRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYWZ0ZXJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYWZ0ZXIiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9UYWJsZVJvdz4KKworICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9sZWZ0X3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYmVmb3JlX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJlZm9yZSIKKyAgICAgICAgICAgICAvPgorICAgICAgICA8L1RhYmxlUm93PgorCisgICAgPC9UYWJsZUxheW91dD4KKworICAgIDxUYWJsZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnN0cmV0Y2hDb2x1bW5zPSIxLDIiCisgICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0icnRsIj4KKworICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9yaWdodF90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9hZnRlcl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJhZnRlciIKKyAgICAgICAgICAgICAvPgorICAgICAgICA8L1RhYmxlUm93PgorCisgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2xlZnRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9iZWZvcmVfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYmVmb3JlIgorICAgICAgICAgICAgIC8+CisgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICA8L1RhYmxlTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDM3OTVkNGIuLmQwNjdlN2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xNiw2ICsxNiwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX3RleHQiPkJ1dHRvbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uMV90ZXh0Ij5CdXR0b24xPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJidXR0b24yX3RleHQiPkJ1dHRvbjI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbjNfdGV4dCI+QnV0dG9uMzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uNF90ZXh0Ij5CdXR0b240PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b25fcmlnaHRfdGV4dCI+UmlnaHQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9hZnRlcl90ZXh0Ij5FbmQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9sZWZ0X3RleHQiPkxlZnQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9iZWZvcmVfdGV4dCI+U3RhcnQ8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9yZXF1ZXN0bGF5b3V0X3RleHQiPlJlcXVlc3QgTGF5b3V0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXh0dmlld190ZXh0Ij5UaGlzIGlzIGEgdGV4dCBmb3IgYSBUZXh0Vmlldzwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWRpdHRleHRfdGV4dCI+bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tPC9zdHJpbmc+CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0QWN0aXZpdHkuamF2YQppbmRleCAwZDliNGY3Li4yNjYyNjgzIDEwMDY0NAotLS0gYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEFjdGl2aXR5LmphdmEKQEAgLTM3LDIwICszNyw2NCBAQAogICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KCkuc2V0Q2xhc3ModGhpcywgQmlEaVRlc3RCYXNpY0FjdGl2aXR5LmNsYXNzKTsKIAogICAgICAgICAvLyBJbml0aWFsaXplIGEgVGFiU3BlYyBmb3IgZWFjaCB0YWIgYW5kIGFkZCBpdCB0byB0aGUgVGFiSG9zdAotICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJiYXNpYyIpLnNldEluZGljYXRvcigiQmFzaWMiKS5zZXRDb250ZW50KGludGVudCk7CisgICAgICAgIHNwZWMgPSB0YWJIb3N0Lm5ld1RhYlNwZWMoImJhc2ljIikuc2V0SW5kaWNhdG9yKCJCYXNpYyIpLgorICAgICAgICAgICAgc2V0Q29udGVudChpbnRlbnQpOwogICAgICAgICB0YWJIb3N0LmFkZFRhYihzcGVjKTsKIAogICAgICAgICAvLyBEbyB0aGUgc2FtZSBmb3IgdGhlIG90aGVyIHRhYnMKICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudCgpLnNldENsYXNzKHRoaXMsIEJpRGlUZXN0Q2FudmFzQWN0aXZpdHkuY2xhc3MpOwotICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJjYW52YXMiKS5zZXRJbmRpY2F0b3IoIkNhbnZhcyIpLnNldENvbnRlbnQoaW50ZW50KTsKKyAgICAgICAgc3BlYyA9IHRhYkhvc3QubmV3VGFiU3BlYygiY2FudmFzIikuc2V0SW5kaWNhdG9yKCJDYW52YXMiKS4KKyAgICAgICAgICAgIHNldENvbnRlbnQoaW50ZW50KTsKICAgICAgICAgdGFiSG9zdC5hZGRUYWIoc3BlYyk7CiAKICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudCgpLnNldENsYXNzKHRoaXMsIEJpRGlUZXN0TGluZWFyTGF5b3V0THRyQWN0aXZpdHkuY2xhc3MpOwotICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJsYXlvdXQtbHRyIikuc2V0SW5kaWNhdG9yKCJMaW5lYXJMYXlvdXQgTFRSIikuc2V0Q29udGVudChpbnRlbnQpOworICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJsaW5lYXItbGF5b3V0LWx0ciIpLnNldEluZGljYXRvcigiTGluZWFyIExUUiIpLgorICAgICAgICAgICAgc2V0Q29udGVudChpbnRlbnQpOwogICAgICAgICB0YWJIb3N0LmFkZFRhYihzcGVjKTsKIAogICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KCkuc2V0Q2xhc3ModGhpcywgQmlEaVRlc3RMaW5lYXJMYXlvdXRSdGxBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIHNwZWMgPSB0YWJIb3N0Lm5ld1RhYlNwZWMoImxheW91dC1ydGwiKS5zZXRJbmRpY2F0b3IoIkxpbmVhckxheW91dCBSVEwiKS5zZXRDb250ZW50KGludGVudCk7CisgICAgICAgIHNwZWMgPSB0YWJIb3N0Lm5ld1RhYlNwZWMoImxpbmVhci1sYXlvdXQtcnRsIikuc2V0SW5kaWNhdG9yKCJMaW5lYXIgUlRMIikuCisgICAgICAgICAgICBzZXRDb250ZW50KGludGVudCk7CisgICAgICAgIHRhYkhvc3QuYWRkVGFiKHNwZWMpOworCisgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoKS5zZXRDbGFzcyh0aGlzLCBCaURpVGVzdEZyYW1lTGF5b3V0THRyQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJmcmFtZS1sYXlvdXQtbHRyIikuc2V0SW5kaWNhdG9yKCJGcmFtZSBMVFIiKS4KKyAgICAgICAgICAgIHNldENvbnRlbnQoaW50ZW50KTsKKyAgICAgICAgdGFiSG9zdC5hZGRUYWIoc3BlYyk7CisKKyAgICAgICAgaW50ZW50ID0gbmV3IEludGVudCgpLnNldENsYXNzKHRoaXMsIEJpRGlUZXN0RnJhbWVMYXlvdXRSdGxBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIHNwZWMgPSB0YWJIb3N0Lm5ld1RhYlNwZWMoImZyYW1lLWxheW91dC1ydGwiKS5zZXRJbmRpY2F0b3IoIkZyYW1lIFJUTCIpLgorICAgICAgICAgICAgc2V0Q29udGVudChpbnRlbnQpOworICAgICAgICB0YWJIb3N0LmFkZFRhYihzcGVjKTsKKworICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KCkuc2V0Q2xhc3ModGhpcywgQmlEaVRlc3RSZWxhdGl2ZUxheW91dEx0ckFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgc3BlYyA9IHRhYkhvc3QubmV3VGFiU3BlYygicmVsYXRpdmUtbGF5b3V0LWx0ciIpLnNldEluZGljYXRvcigiUmVsYXRpdmUgTFRSIikuCisgICAgICAgICAgICBzZXRDb250ZW50KGludGVudCk7CisgICAgICAgIHRhYkhvc3QuYWRkVGFiKHNwZWMpOworCisgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoKS5zZXRDbGFzcyh0aGlzLCBCaURpVGVzdFJlbGF0aXZlTGF5b3V0UnRsQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJyZWxhdGl2ZS1sYXlvdXQtcnRsIikuc2V0SW5kaWNhdG9yKCJSZWxhdGl2ZSBSVEwiKS4KKyAgICAgICAgICAgIHNldENvbnRlbnQoaW50ZW50KTsKKyAgICAgICAgdGFiSG9zdC5hZGRUYWIoc3BlYyk7CisKKyAgICAgICAgaW50ZW50ID0gbmV3IEludGVudCgpLnNldENsYXNzKHRoaXMsIEJpRGlUZXN0UmVsYXRpdmVMYXlvdXRMdHJBY3Rpdml0eTIuY2xhc3MpOworICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJyZWxhdGl2ZS1sYXlvdXQtbHRyLTIiKS5zZXRJbmRpY2F0b3IoIlJlbGF0aXZlMiBMVFIiKS4KKyAgICAgICAgICAgIHNldENvbnRlbnQoaW50ZW50KTsKKyAgICAgICAgdGFiSG9zdC5hZGRUYWIoc3BlYyk7CisKKyAgICAgICAgaW50ZW50ID0gbmV3IEludGVudCgpLnNldENsYXNzKHRoaXMsIEJpRGlUZXN0UmVsYXRpdmVMYXlvdXRSdGxBY3Rpdml0eTIuY2xhc3MpOworICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJyZWxhdGl2ZS1sYXlvdXQtcnRsLTIiKS5zZXRJbmRpY2F0b3IoIlJlbGF0aXZlMiBSVEwiKS4KKyAgICAgICAgICAgIHNldENvbnRlbnQoaW50ZW50KTsKKyAgICAgICAgdGFiSG9zdC5hZGRUYWIoc3BlYyk7CisKKyAgICAgICAgaW50ZW50ID0gbmV3IEludGVudCgpLnNldENsYXNzKHRoaXMsIEJpRGlUZXN0VGFibGVMYXlvdXRMdHJBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIHNwZWMgPSB0YWJIb3N0Lm5ld1RhYlNwZWMoInRhYmxlLWxheW91dC1sdHIiKS5zZXRJbmRpY2F0b3IoIlRhYmxlIExUUiIpLgorICAgICAgICAgICAgc2V0Q29udGVudChpbnRlbnQpOworICAgICAgICB0YWJIb3N0LmFkZFRhYihzcGVjKTsKKworICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KCkuc2V0Q2xhc3ModGhpcywgQmlEaVRlc3RUYWJsZUxheW91dFJ0bEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgc3BlYyA9IHRhYkhvc3QubmV3VGFiU3BlYygidGFibGUtbGF5b3V0LXJ0bCIpLnNldEluZGljYXRvcigiVGFibGUgUlRMIikuCisgICAgICAgICAgICBzZXRDb250ZW50KGludGVudCk7CiAgICAgICAgIHRhYkhvc3QuYWRkVGFiKHNwZWMpOwogCiAgICAgICAgIHRhYkhvc3Quc2V0Q3VycmVudFRhYigwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEZyYW1lTGF5b3V0THRyQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEZyYW1lTGF5b3V0THRyQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2U0ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0RnJhbWVMYXlvdXRMdHJBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIEJpRGlUZXN0RnJhbWVMYXlvdXRMdHJBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFtZV9sYXlvdXRfbHRyKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEZyYW1lTGF5b3V0UnRsQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEZyYW1lTGF5b3V0UnRsQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDEyYTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0RnJhbWVMYXlvdXRSdGxBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIEJpRGlUZXN0RnJhbWVMYXlvdXRSdGxBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFtZV9sYXlvdXRfcnRsKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdExpbmVhckxheW91dEx0ckFjdGl2aXR5LmphdmEgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RMaW5lYXJMYXlvdXRMdHJBY3Rpdml0eS5qYXZhCmluZGV4IDZkOGYxMWQuLjI4MGFmNmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdExpbmVhckxheW91dEx0ckFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0TGluZWFyTGF5b3V0THRyQWN0aXZpdHkuamF2YQpAQCAtMTgsMTggKzE4LDEzIEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiAKIHB1YmxpYyBjbGFzcyBCaURpVGVzdExpbmVhckxheW91dEx0ckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewogCi0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbGF5b3V0OwotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxpbmVhcl9sYXlvdXRfbHRyKTsKLQotICAgICAgICBsYXlvdXQgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5sYXlvdXR0ZXN0KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RMaW5lYXJMYXlvdXRSdGxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0TGluZWFyTGF5b3V0UnRsQWN0aXZpdHkuamF2YQppbmRleCAwMTMwNzkzLi43MTIxYTYyIDEwMDY0NAotLS0gYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RMaW5lYXJMYXlvdXRSdGxBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdExpbmVhckxheW91dFJ0bEFjdGl2aXR5LmphdmEKQEAgLTE4LDE4ICsxOCwxMyBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCiBwdWJsaWMgY2xhc3MgQmlEaVRlc3RMaW5lYXJMYXlvdXRSdGxBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKIAotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IGxheW91dDsKLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5saW5lYXJfbGF5b3V0X3J0bCk7Ci0KLSAgICAgICAgbGF5b3V0ID0gKExpbmVhckxheW91dCkgZmluZFZpZXdCeUlkKFIuaWQubGF5b3V0dGVzdCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXRMdHJBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXRMdHJBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjhkMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RSZWxhdGl2ZUxheW91dEx0ckFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RSZWxhdGl2ZUxheW91dEx0ckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJlbGF0aXZlX2xheW91dF9sdHIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXRMdHJBY3Rpdml0eTIuamF2YSBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFJlbGF0aXZlTGF5b3V0THRyQWN0aXZpdHkyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2Mzc1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFJlbGF0aXZlTGF5b3V0THRyQWN0aXZpdHkyLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RSZWxhdGl2ZUxheW91dEx0ckFjdGl2aXR5MiBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5yZWxhdGl2ZV9sYXlvdXRfbHRyXzIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXRSdGxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXRSdGxBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2I3YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RSZWxhdGl2ZUxheW91dFJ0bEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RSZWxhdGl2ZUxheW91dFJ0bEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJlbGF0aXZlX2xheW91dF9ydGwpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXRSdGxBY3Rpdml0eTIuamF2YSBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFJlbGF0aXZlTGF5b3V0UnRsQWN0aXZpdHkyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyYWY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFJlbGF0aXZlTGF5b3V0UnRsQWN0aXZpdHkyLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RSZWxhdGl2ZUxheW91dFJ0bEFjdGl2aXR5MiBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5yZWxhdGl2ZV9sYXlvdXRfcnRsXzIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0VGFibGVMYXlvdXRMdHJBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0VGFibGVMYXlvdXRMdHJBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MTlkYWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RUYWJsZUxheW91dEx0ckFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RUYWJsZUxheW91dEx0ckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRhYmxlX2xheW91dF9sdHIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0VGFibGVMYXlvdXRSdGxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0VGFibGVMYXlvdXRSdGxBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NTNlZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RUYWJsZUxheW91dFJ0bEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RUYWJsZUxheW91dFJ0bEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRhYmxlX2xheW91dF9ydGwpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvRHBpVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvZHBpL0RwaVRlc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHBpVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvZHBpL0RwaVRlc3RBY3Rpdml0eS5qYXZhCmluZGV4IDJhNDBjNTcuLjAxYzFjNzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0RwaVRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2RwaS9EcGlUZXN0QWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9EcGlUZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9kcGkvRHBpVGVzdEFjdGl2aXR5LmphdmEKQEAgLTYzLDcgKzYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgfCBBcHBsaWNhdGlvbkluZm8uRkxBR19SRVNJWkVBQkxFX0ZPUl9TQ1JFRU5TCiAgICAgICAgICAgICAgICAgICAgIHwgQXBwbGljYXRpb25JbmZvLkZMQUdfU1VQUE9SVFNfU0NSRUVOX0RFTlNJVElFUzsKICAgICAgICAgICAgICAgICBhcHAuZ2V0UmVzb3VyY2VzKCkuc2V0Q29tcGF0aWJpbGl0eUluZm8obmV3IENvbXBhdGliaWxpdHlJbmZvKGFpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnNjcmVlbkxheW91dCwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS5zY3JlZW5MYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkuc21hbGxlc3RTY3JlZW5XaWR0aERwLCBmYWxzZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm91Y2giLCBlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDUzY2E0Y2UuLjFiNzIzNTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvR3JpZExheW91dFRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNzYsNiArNzYsMjcgQEAKICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkFsaWdubWVudFRlc3QiIGFuZHJvaWQ6bGFiZWw9IkFsaWdubWVudFRlc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJMaW5lYXJMYXlvdXRUZXN0IiBhbmRyb2lkOmxhYmVsPSJMaW5lYXJMYXlvdXRUZXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR3JpZExheW91dFRlc3QiIGFuZHJvaWQ6bGFiZWw9IkdyaWRMYXlvdXRUZXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogCmRpZmYgLS1naXQgYS90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvQWJzdHJhY3RMYXlvdXRUZXN0LmphdmEgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvQWJzdHJhY3RMYXlvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3ZWFjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9BYnN0cmFjdExheW91dFRlc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0LmxheW91dDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGF5b3V0VGVzdCBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSE9SSVpPTlRBTF9OQU1FUyA9IG5ldyBTdHJpbmdbXSB7ICJMRUZUIiwgImNlbnRlciIsICJlYXN0IiwgImZpbGwiIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBIT1JJWk9OVEFMX0FMSUdOTUVOVFMgPSBuZXcgaW50W10geyBHcmF2aXR5LkxFRlQsIEdyYXZpdHkuQ0VOVEVSLCBHcmF2aXR5LlJJR0hULCBHcmF2aXR5LkZJTEwgfTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZFUlRJQ0FMX05BTUVTID0gbmV3IFN0cmluZ1tdIHsgIm5vcnRoIiwgImNlbnRlciIsICJiYXNlbGluZSIsICJzb3V0aCIsICJmaWxsIiB9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVkVSVElDQUxfQUxJR05NRU5UUyA9IG5ldyBpbnRbXSB7IEdyYXZpdHkuVE9QLCBHcmF2aXR5LkNFTlRFUiwgR3Jhdml0eS5OT19HUkFWSVRZLCBHcmF2aXR5LkJPVFRPTSwgR3Jhdml0eS5GSUxMIH07CisKKyAgICBwdWJsaWMgVmlldyBjcmVhdGUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgaW50IHNpemUpIHsKKyAgICAgICAgQnV0dG9uIHJlc3VsdCA9IG5ldyBCdXR0b24oY29udGV4dCk7CisgICAgICAgIHJlc3VsdC5zZXRUZXh0KG5hbWUpOworICAgICAgICByZXN1bHQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZSh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IFZpZXdHcm91cCBjcmVhdGUoQ29udGV4dCBjb250ZXh0KTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRhZygpOworCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZShWaWV3IHYpIHsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpbnQgTiA9IDEwMDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBWaWV3R3JvdXAuTWFyZ2luTGF5b3V0UGFyYW1zIGxwID0gKFZpZXdHcm91cC5NYXJnaW5MYXlvdXRQYXJhbXMpIHYuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBscC50b3BNYXJnaW4gPSAobHAudG9wTWFyZ2luICsgMSkgJSAzMTsKKyAgICAgICAgICAgIGxwLmxlZnRNYXJnaW4gPSAobHAubGVmdE1hcmdpbiArIDEpICUgMzE7CisKKyAgICAgICAgICAgIHYucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgdi5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBWaWV3R3JvdXAgcCA9IChWaWV3R3JvdXApIHYuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBwLmxheW91dCgwLCAwLCAxMDAwICsgKGkgJSAyKSwgNTAwICsgKGkgJSAyKSk7CisgICAgICAgIH0KKyAgICAgICAgTG9nLmQodGFnKCksICJUaW1lOiAiICsgKGZsb2F0KSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkgLyBOICogMTAwMCArICJtaWNzIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhjcmVhdGUoZ2V0QmFzZUNvbnRleHQoKSkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9BY3Rpdml0eTIuamF2YSBiL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9BY3Rpdml0eTIuamF2YQppbmRleCA2MzU5OTAzLi41ZTI5Y2YxIDEwMDY0NAotLS0gYS90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvQWN0aXZpdHkyLmphdmEKKysrIGIvdGVzdHMvR3JpZExheW91dFRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvbGF5b3V0L0FjdGl2aXR5Mi5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiAgICAgcHVibGljIHN0YXRpYyBWaWV3IGNyZWF0ZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgR3JpZExheW91dCB2ZyA9IG5ldyBHcmlkTGF5b3V0KGNvbnRleHQpOwogICAgICAgICB2Zy5zZXRVc2VEZWZhdWx0TWFyZ2lucyh0cnVlKTsKKyAgICAgICAgdmcuc2V0TWFyZ2luc0luY2x1ZGVkSW5BbGlnbm1lbnQoZmFsc2UpOwogCiAgICAgICAgIEdyb3VwIHJvdzEgPSBuZXcgR3JvdXAoMSwgQ0VOVEVSKTsKICAgICAgICAgR3JvdXAgcm93MiA9IG5ldyBHcm91cCgyLCBDRU5URVIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvR3JpZExheW91dFRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvbGF5b3V0L0FsaWdubWVudFRlc3QuamF2YSBiL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9BbGlnbm1lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzZmMzkwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9BbGlnbm1lbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QubGF5b3V0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0Lio7CisKK3B1YmxpYyBjbGFzcyBBbGlnbm1lbnRUZXN0ICBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSE9SSVpPTlRBTF9OQU1FUyA9IG5ldyBTdHJpbmdbXXsiTEVGVCIsICJjZW50ZXIiLCAiZWFzdCIsICJmaWxsIn07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbGlnbm1lbnRbXSBIT1JJWk9OVEFMX0FMSUdOTUVOVFMgPSBuZXcgQWxpZ25tZW50W117TEVGVCwgQ0VOVEVSLCBSSUdIVCwgRklMTH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRVJUSUNBTF9OQU1FUyA9IG5ldyBTdHJpbmdbXXsibm9ydGgiLCAiY2VudGVyIiwgImJhc2VsaW5lIiwgInNvdXRoIiwgImZpbGwifTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFsaWdubWVudFtdIFZFUlRJQ0FMX0FMSUdOTUVOVFMgPSBuZXcgQWxpZ25tZW50W117VE9QLCBDRU5URVIsIEJBU0VMSU5FLCBCT1RUT00sIEZJTEx9OworICAgIHByaXZhdGUgc3RhdGljIENvbnRleHQgQ09OVEVYVDsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZpZXdGYWN0b3J5IHsKKyAgICAgICAgVmlldyBjcmVhdGUoU3RyaW5nIG5hbWUsIGludCBzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZpZXdGYWN0b3J5IEJVVFRPTl9GQUNUT1JZID0gbmV3IFZpZXdGYWN0b3J5KCkgeworICAgICAgICBwdWJsaWMgVmlldyBjcmVhdGUoU3RyaW5nIG5hbWUsIGludCBzaXplKSB7CisgICAgICAgICAgICBCdXR0b24gcmVzdWx0ID0gbmV3IEJ1dHRvbihDT05URVhUKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRUZXh0KG5hbWUpOworICAgICAgICAgICByZXN1bHQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGUodik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZpZXdGYWN0b3J5IExBQkVMX0ZBQ1RPUlkgPSBuZXcgVmlld0ZhY3RvcnkoKSB7CisgICAgICAgIHB1YmxpYyBWaWV3IGNyZWF0ZShTdHJpbmcgbmFtZSwgaW50IHNpemUpIHsKKyAgICAgICAgICAgIFRleHRWaWV3IHJlc3VsdCA9IG5ldyBUZXh0VmlldyhDT05URVhUKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRUZXh0KG5hbWUpOworICAgICAgICAgICAgcmVzdWx0LnNldFRleHRTaXplKDQwKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWaWV3RmFjdG9yeSBURVhUX0ZJRUxEX0ZBQ1RPUlkgPSBuZXcgVmlld0ZhY3RvcnkoKSB7CisgICAgICAgIHB1YmxpYyBWaWV3IGNyZWF0ZShTdHJpbmcgbmFtZSwgaW50IHNpemUpIHsKKyAgICAgICAgICAgIEVkaXRUZXh0IHJlc3VsdCA9IG5ldyBFZGl0VGV4dChDT05URVhUKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRUZXh0KG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZpZXdGYWN0b3J5W10gRkFDVE9SSUVTID0gbmV3IFZpZXdGYWN0b3J5W117QlVUVE9OX0ZBQ1RPUlksIExBQkVMX0ZBQ1RPUlksIFRFWFRfRklFTERfRkFDVE9SWX07CisKKyAgICBwdWJsaWMgc3RhdGljIFZpZXdHcm91cCBjcmVhdGUoQ29udGV4dCBjb250ZXh0MSkgeworICAgICAgICBDT05URVhUID0gY29udGV4dDE7CisgICAgICAgIEdyaWRMYXlvdXQgY29udGFpbmVyID0gbmV3IEdyaWRMYXlvdXQoY29udGV4dDEpOworICAgICAgICBjb250YWluZXIuc2V0VXNlRGVmYXVsdE1hcmdpbnModHJ1ZSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWRVJUSUNBTF9BTElHTk1FTlRTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBBbGlnbm1lbnQgdmEgPSBWRVJUSUNBTF9BTElHTk1FTlRTW2ldOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBIT1JJWk9OVEFMX0FMSUdOTUVOVFMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBBbGlnbm1lbnQgaGEgPSBIT1JJWk9OVEFMX0FMSUdOTUVOVFNbal07CisgICAgICAgICAgICAgICAgR3JvdXAgcm93R3JvdXAgPSBuZXcgR3JvdXAoaSwgdmEpOworICAgICAgICAgICAgICAgIEdyb3VwIGNvbEdyb3VwID0gbmV3IEdyb3VwKGosIGhhKTsKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbGF5b3V0UGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhyb3dHcm91cCwgY29sR3JvdXApOworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KEZBQ1RPUklFU1soaSArIGopICUgRkFDVE9SSUVTLmxlbmd0aF0uY3JlYXRlKFZFUlRJQ0FMX05BTUVTW2ldICsgIi0iICsgSE9SSVpPTlRBTF9OQU1FU1tqXSwgMjApLCBsYXlvdXRQYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYW5pbWF0ZShWaWV3IHYpIHsKKworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGludCBOID0gMTAwMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHAgPSB2LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgbHAud2lkdGggKz0gMTsgLy8gd2lkdGg7CisgICAgICAgICAgICBscC5oZWlnaHQgKz0gMTsgLy8gaGVpZ2h0OworICAgICAgICAgICAgdi5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICBHcmlkTGF5b3V0IHAgPSAoR3JpZExheW91dCkgdi5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIHAubGF5b3V0KDAsIDAsIDEwMDAgKyAoaSAlIDIpLCA1MDAgKyAoaSAlIDIpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWU6ICIgKyAoZmxvYXQpIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSAvIE4gKiAxMDAwICsgIm1pY3MiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGNyZWF0ZShnZXRCYXNlQ29udGV4dCgpKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvR3JpZExheW91dFRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvbGF5b3V0L0dyaWRMYXlvdXRUZXN0LmphdmEgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvR3JpZExheW91dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQ1MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvR3JpZExheW91dFRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvbGF5b3V0L0dyaWRMYXlvdXRUZXN0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5sYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQ7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC4qOworCitwdWJsaWMgY2xhc3MgR3JpZExheW91dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdExheW91dFRlc3QgeworICAgIHB1YmxpYyBWaWV3R3JvdXAgY3JlYXRlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBHcmlkTGF5b3V0IGNvbnRhaW5lciA9IG5ldyBHcmlkTGF5b3V0KGNvbnRleHQpOworICAgICAgICBjb250YWluZXIuc2V0T3JpZW50YXRpb24oVkVSVElDQUwpOworLy8gICAgICAgIGNvbnRhaW5lci5zZXRVc2VEZWZhdWx0TWFyZ2lucyh0cnVlKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZFUlRJQ0FMX0FMSUdOTUVOVFMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YSA9IFZFUlRJQ0FMX0FMSUdOTUVOVFNbaV07CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEhPUklaT05UQUxfQUxJR05NRU5UUy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGludCBoYSA9IEhPUklaT05UQUxfQUxJR05NRU5UU1tqXTsKKyAgICAgICAgICAgICAgICBHcmlkTGF5b3V0Lkdyb3VwIHJvd0dyb3VwID0gbmV3IEdyaWRMYXlvdXQuR3JvdXAoVU5ERUZJTkVELCBudWxsKTsKKyAgICAgICAgICAgICAgICBHcmlkTGF5b3V0Lkdyb3VwIGNvbEdyb3VwID0gbmV3IEdyaWRMYXlvdXQuR3JvdXAoVU5ERUZJTkVELCBudWxsKTsKKyAgICAgICAgICAgICAgICBHcmlkTGF5b3V0LkxheW91dFBhcmFtcyBscCA9IG5ldyBHcmlkTGF5b3V0LkxheW91dFBhcmFtcyhyb3dHcm91cCwgY29sR3JvdXApOworICAgICAgICAgICAgICAgIGxwLnNldEdyYXZpdHkodmEgfCBoYSk7CisvLyAgICAgICAgICAgICAgICBWaWV3IHYgPSBjcmVhdGUoVkVSVElDQUxfTkFNRVNbaV0gKyAiLSIgKyBIT1JJWk9OVEFMX05BTUVTW2pdLCAyMCk7CisgICAgICAgICAgICAgICAgVmlldyB2ID0gY3JlYXRlKGNvbnRleHQsIFZFUlRJQ0FMX05BTUVTW2ldICsgIi0iICsgSE9SSVpPTlRBTF9OQU1FU1tqXSwgMjApOworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KHYsIGxwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0YWcoKSB7CisgICAgICAgIHJldHVybiBHcmlkTGF5b3V0VGVzdC5jbGFzcy5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvR3JpZExheW91dFRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvbGF5b3V0L0xpbmVhckxheW91dFRlc3QuamF2YSBiL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9MaW5lYXJMYXlvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkMTIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9MaW5lYXJMYXlvdXRUZXN0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5sYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQuKjsKKworcHVibGljIGNsYXNzIExpbmVhckxheW91dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdExheW91dFRlc3QgeworICAgIHB1YmxpYyBWaWV3R3JvdXAgY3JlYXRlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gbmV3IExpbmVhckxheW91dChjb250ZXh0KTsKKyAgICAgICAgY29udGFpbmVyLnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisvLyAgICAgICAgY29udGFpbmVyLnNldFVzZURlZmF1bHRNYXJnaW5zKHRydWUpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkVSVElDQUxfQUxJR05NRU5UUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50IHZhID0gVkVSVElDQUxfQUxJR05NRU5UU1tpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgSE9SSVpPTlRBTF9BTElHTk1FTlRTLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGhhID0gSE9SSVpPTlRBTF9BTElHTk1FTlRTW2pdOworICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9IHZhIHwgaGE7CisvLyAgICAgICAgICAgICAgICBWaWV3IHYgPSBjcmVhdGUoVkVSVElDQUxfTkFNRVNbaV0gKyAiLSIgKyBIT1JJWk9OVEFMX05BTUVTW2pdLCAyMCk7CisgICAgICAgICAgICAgICAgVmlldyB2ID0gY3JlYXRlKGNvbnRleHQsIFZFUlRJQ0FMX05BTUVTW2ldICsgIi0iICsgSE9SSVpPTlRBTF9OQU1FU1tqXSwgMjApOworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KHYsIGxwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0YWcoKSB7CisgICAgICAgIHJldHVybiBMaW5lYXJMYXlvdXRUZXN0LmNsYXNzLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9DbGVhckFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9DbGVhckFjdGl2aXR5LmphdmEKaW5kZXggMWQ3ZmYwZi4uYjQ5ZGI3YzUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0NsZWFyQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9DbGVhckFjdGl2aXR5LmphdmEKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgICAgIG1DbGVhclBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICBtQ2xlYXJQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5DTEVBUikpOwogICAgICAgICAgICAgbUNsZWFyUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOwotICAgICAgICAgICAgbUNsZWFyUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtQ2xlYXJQYWludC5zZXRDb2xvcigweDAwMDBmZjAwKTsKICAgICAgICAgICAgIG1DbGVhclBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKICAgICAgICAgICAgIG1DbGVhclBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOwogICAgICAgICAgICAgbUNsZWFyUGFpbnQuc2V0VGV4dFNpemUoMzIuMGYpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZTVlNDQ5YjMuLjU3ZWM0ZmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMyw3ICszLDggQEAKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tb2RlbHZpZXdlciI+CiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9Ik1vZGVsVmlld2VyIj4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU2ltcGxlTW9kZWwiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJTaW1wbGVNb2RlbCI+CisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJTaW1wbGVNb2RlbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249Im5vc2Vuc29yIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL01vZGVsVmlld2VyL3Jlcy9tZW51L2xvYWRlcl9tZW51LnhtbCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL01vZGVsVmlld2VyL3Jlcy9tZW51L2xvYWRlcl9tZW51LnhtbAppbmRleCAzYzM0MDIzLi4yYTg3NTljIDEwMDY0NAotLS0gYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Nb2RlbFZpZXdlci9yZXMvbWVudS9sb2FkZXJfbWVudS54bWwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvcmVzL21lbnUvbG9hZGVyX21lbnUueG1sCkBAIC0yMiw0ICsyMiw2IEBACiAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9sb2FkX21vZGVsIiAvPgogICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZGlzcGxheV9vcHRpb25zIgogICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvZGlzcGxheV9vcHRpb25zIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2Vuc29yIgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvc2Vuc29yIiAvPgogPC9tZW51PgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL01vZGVsVmlld2VyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggOGUxNjczZi4uYTVjOGYyMiAxMDA2NDQKLS0tIGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Nb2RlbFZpZXdlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0yMSw0ICsyMSw1IEBACiAgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImxvYWRfbW9kZWwiPkxvYWQgTW9kZWw8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpc3BsYXlfb3B0aW9ucyI+RGlzcGxheSBPcHRpb25zPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZW5zb3IiPlRvZ2dsZSBTZW5zb3I8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YQppbmRleCAwMGU4YTVlLi4yYjI5ZmY0IDEwMDY0NAotLS0gYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YQorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YQpAQCAtODUsNiArODUsOSBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgUi5pZC5kaXNwbGF5X29wdGlvbnM6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBSLmlkLnNlbnNvcjoKKyAgICAgICAgICAgIG1WaWV3LnRvZ2dsZVNlbnNvcigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxSUy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsUlMuamF2YQppbmRleCA2M2VmNDY2Li41ZmEzYTllIDEwMDY0NAotLS0gYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxSUy5qYXZhCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFJTLmphdmEKQEAgLTcwLDYgKzcwLDEwIEBACiAgICAgICAgIG1TY3JpcHQuaW52b2tlX29uQWN0aW9uTW92ZSh4LCB5KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBvblBvc3R1cmVDaGFuZ2VkKE1hdHJpeDRmIHBvc3R1cmUpIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Bvc3R1cmVNYXRyaXgocG9zdHVyZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7CiAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTKTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsVmlldy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsVmlldy5qYXZhCmluZGV4IDlhYjBmMjIuLjRiNzgzNmIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFZpZXcuamF2YQorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxWaWV3LmphdmEKQEAgLTE2LDI5ICsxNiw0NiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOwogCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWF0cml4NGY7CiBpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlNjYWxlR2VzdHVyZURldGVjdG9yOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLXB1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKK3B1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IGltcGxlbWVudHMgU2Vuc29yRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKICAgICBwcml2YXRlIFNpbXBsZU1vZGVsUlMgbVJlbmRlcjsKIAogICAgIHByaXZhdGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgbVNjYWxlRGV0ZWN0b3I7CiAKKyAgICBwcml2YXRlIFNlbnNvck1hbmFnZXIgbVNlbnNvck1hbmFnZXI7CisgICAgcHJpdmF0ZSBTZW5zb3IgbVJvdGF0aW9uVmVjdG9yU2Vuc29yOworICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtUm90YXRpb25NYXRyaXggPSBuZXcgZmxvYXRbMTZdOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUl9JRCA9IC0xOwogICAgIHByaXZhdGUgaW50IG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVJfSUQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VTZW5zb3IgPSBmYWxzZTsKKyAgICBwcml2YXRlIE1hdHJpeDRmIG1JZGVudGl0eU1hdHJpeCA9IG5ldyBNYXRyaXg0ZigpOwogCiAgICAgcHVibGljIFNpbXBsZU1vZGVsVmlldyhDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCk7CiAgICAgICAgIGVuc3VyZVJlbmRlclNjcmlwdCgpOwogICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG5ldyBTY2FsZUdlc3R1cmVEZXRlY3Rvcihjb250ZXh0LCBuZXcgU2NhbGVMaXN0ZW5lcigpKTsKKyAgICAgICAgLy8gR2V0IGFuIGluc3RhbmNlIG9mIHRoZSBTZW5zb3JNYW5hZ2VyCisgICAgICAgIG1TZW5zb3JNYW5hZ2VyID0gKFNlbnNvck1hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5TRU5TT1JfU0VSVklDRSk7CisgICAgICAgIC8vIGZpbmQgdGhlIHJvdGF0aW9uLXZlY3RvciBzZW5zb3IKKyAgICAgICAgbVJvdGF0aW9uVmVjdG9yU2Vuc29yID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcigKKyAgICAgICAgICAgICAgICBTZW5zb3IuVFlQRV9ST1RBVElPTl9WRUNUT1IpOworICAgICAgICBtSWRlbnRpdHlNYXRyaXgubG9hZElkZW50aXR5KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJlbmRlclNjcmlwdCgpIHsKQEAgLTUyLDYgKzY5LDE2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzdW1lKCkgeworICAgICAgICBtU2Vuc29yTWFuYWdlci5yZWdpc3Rlckxpc3RlbmVyKHRoaXMsIG1Sb3RhdGlvblZlY3RvclNlbnNvciwgMTAwMDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBhdXNlKCkgeworICAgICAgICBtU2Vuc29yTWFuYWdlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewogICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKICAgICAgICAgZW5zdXJlUmVuZGVyU2NyaXB0KCk7CkBAIC0xMzksNiArMTY2LDMyIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU2Vuc29yQ2hhbmdlZChTZW5zb3JFdmVudCBldmVudCkgeworICAgICAgICAvLyB3ZSByZWNlaXZlZCBhIHNlbnNvciBldmVudC4gaXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGNoZWNrCisgICAgICAgIC8vIHRoYXQgd2UgcmVjZWl2ZWQgdGhlIHByb3BlciBldmVudAorICAgICAgICBpZiAobVVzZVNlbnNvcikgeworICAgICAgICAgICAgaWYgKGV2ZW50LnNlbnNvci5nZXRUeXBlKCkgPT0gU2Vuc29yLlRZUEVfUk9UQVRJT05fVkVDVE9SKSB7CisgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgcm90YXRpb24tdmVjdG9yIHRvIGEgNHg0IG1hdHJpeC4gdGhlIG1hdHJpeAorICAgICAgICAgICAgICAgIC8vIGlzIGludGVycHJldGVkIGJ5IE9wZW4gR0wgYXMgdGhlIGludmVyc2Ugb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gcm90YXRpb24tdmVjdG9yLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuCisgICAgICAgICAgICAgICAgU2Vuc29yTWFuYWdlci5nZXRSb3RhdGlvbk1hdHJpeEZyb21WZWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBtUm90YXRpb25NYXRyaXggLCBldmVudC52YWx1ZXMpOworCisgICAgICAgICAgICAgICAgaWYgKG1SZW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyLm9uUG9zdHVyZUNoYW5nZWQobmV3IE1hdHJpeDRmKG1Sb3RhdGlvbk1hdHJpeCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvZ2dsZVNlbnNvcigpIHsKKyAgICAgICAgbVVzZVNlbnNvciA9ICFtVXNlU2Vuc29yOworICAgICAgICBpZiAobVVzZVNlbnNvciA9PSBmYWxzZSkgeworICAgICAgICAgICAgbVJlbmRlci5vblBvc3R1cmVDaGFuZ2VkKG1JZGVudGl0eU1hdHJpeCk7CisgICAgICAgIH0KKyAgICB9CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCmluZGV4IDgwOWYwMmMuLjhjZWM0MDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zaW1wbGVtb2RlbC5ycworKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2ltcGxlbW9kZWwucnMKQEAgLTI4LDYgKzI4LDggQEAKIHJzX2ZvbnQgZ0l0YWxpYzsKIHJzX2FsbG9jYXRpb24gZ1RleHRBbGxvYzsKIAorcnNfbWF0cml4NHg0IGdQb3N0dXJlTWF0cml4OworCiB0eXBlZGVmIHN0cnVjdCBNZXNoSW5mbyB7CiAgICAgcnNfbWVzaCBtTWVzaDsKICAgICBpbnQgbU51bUluZGV4U2V0czsKQEAgLTg5LDYgKzkxLDcgQEAKICAgICBnUm90YXRlWSA9IDAuMGY7CiAgICAgZ1pvb20gPSA1MC4wZjsKICAgICBnTG9va0F0ID0gMC4wZjsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmZ1Bvc3R1cmVNYXRyaXgpOwogfQogCiB2b2lkIHVwZGF0ZU1lc2hJbmZvKCkgewpAQCAtMTQ5LDggKzE1MiwxMCBAQAogICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOwogICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbHMgb24gdGhlIHNjcmVlbgogICAgIHJzTWF0cml4VHJhbnNsYXRlKCZtYXRyaXgsIGdMb29rQXQueCwgZ0xvb2tBdC55LCBnTG9va0F0LnogLSBnWm9vbSk7CisgICAgcnNNYXRyaXhNdWx0aXBseSgmbWF0cml4LCAmZ1Bvc3R1cmVNYXRyaXgpOwogICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGdSb3RhdGVYLCAxLjBmLCAwLjBmLCAwLjBmKTsKICAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCBnUm90YXRlWSwgMC4wZiwgMS4wZiwgMC4wZik7CisgICAgCiAgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKIAogICAgIHJlbmRlckFsbE1lc2hlcygpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YSBiL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEKaW5kZXggMDEyOTExNC4uYjIxMjUzMyAxMDA2NDQKLS0tIGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YQorKysgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvU3RhdHVzQmFyVGVzdC5qYXZhCkBAIC0xNDUsMTMgKzE0NSwxMCBAQAogICAgICAgICB9LAogICAgICAgICBuZXcgVGVzdCgiUHJpb3JpdHkgbm90aWZpY2F0aW9uIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3QgPSBuZXcgTm90aWZpY2F0aW9uKFN0YXR1c0JhclRlc3QudGhpcywKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90ID0gbmV3IE5vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5zdGF0X3N5c19waG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29taW5nIGNhbGwgZnJvbTogSW1wZXJpb3VzIExlYWRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLSgxMDAwKjYwKjYwKjI0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltcGVyaW91cyBMZWFkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDg4OCkgNTU1LTUwMzgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLSgxMDAwKjYwKjYwKjI0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIG5vdC5mbGFncyB8PSBOb3RpZmljYXRpb24uRkxBR19ISUdIX1BSSU9SSVRZOwogICAgICAgICAgICAgICAgIEludGVudCBmdWxsU2NyZWVuSW50ZW50ID0gbmV3IEludGVudChTdGF0dXNCYXJUZXN0LnRoaXMsIFRlc3RBbGVydEFjdGl2aXR5LmNsYXNzKTsKQEAgLTI0OCwxMiArMjQ1LDEwIEBACiAgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeSgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbihTdGF0dXNCYXJUZXN0LnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGljayB0aWNrIHRpY2siLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS0oMTAwMCo2MCo2MCoyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNDUzKSAxMjMtMjMyOCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLSgxMDAwKjYwKjYwKjI0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSwgMzAwMCk7CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJtaXNzaW9uL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmsvcGVybWlzc2lvbi90ZXN0cy9XaW5kb3dNYW5hZ2VyUGVybWlzc2lvblRlc3RzLmphdmEgYi90ZXN0cy9wZXJtaXNzaW9uL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmsvcGVybWlzc2lvbi90ZXN0cy9XaW5kb3dNYW5hZ2VyUGVybWlzc2lvblRlc3RzLmphdmEKaW5kZXggZTBmMGYwNS4uZjAxNTM3OCAxMDA2NDQKLS0tIGEvdGVzdHMvcGVybWlzc2lvbi9zcmMvY29tL2FuZHJvaWQvZnJhbWV3b3JrL3Blcm1pc3Npb24vdGVzdHMvV2luZG93TWFuYWdlclBlcm1pc3Npb25UZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2NvbS9hbmRyb2lkL2ZyYW1ld29yay9wZXJtaXNzaW9uL3Rlc3RzL1dpbmRvd01hbmFnZXJQZXJtaXNzaW9uVGVzdHMuamF2YQpAQCAtMTY0LDcgKzE2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtV20uc2V0QXBwU3RhcnRpbmdXaW5kb3cobnVsbCwgImZvbyIsIDAsIG51bGwsIDAsIDAsIDAsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIG1XbS5zZXRBcHBTdGFydGluZ1dpbmRvdyhudWxsLCAiZm9vIiwgMCwgbnVsbCwgbnVsbCwgMCwgMCwgMCwgbnVsbCwgZmFsc2UpOwogICAgICAgICAgICAgZmFpbCgiSVdpbmRvd01hbmFnZXIuc2V0QXBwU3RhcnRpbmdXaW5kb3cgZGlkIG5vdCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiBhcyIKICAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGVjdGVkIik7CiAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvQWFwdEFzc2V0cy5jcHAgYi90b29scy9hYXB0L0FhcHRBc3NldHMuY3BwCmluZGV4IDQ4OTQxOTYuLjI5ZDJiODcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvQWFwdEFzc2V0cy5jcHAKKysrIGIvdG9vbHMvYWFwdC9BYXB0QXNzZXRzLmNwcApAQCAtOTY5LDYgKzk2OSwxMSBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgCisgICAgaWYgKHN0cmNtcChuYW1lLCAidHZkcGkiKSA9PSAwKSB7CisgICAgICAgIGlmIChvdXQpIG91dC0+ZGVuc2l0eSA9IFJlc1RhYmxlX2NvbmZpZzo6REVOU0lUWV9UVjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAogICAgIGlmIChzdHJjbXAobmFtZSwgImhkcGkiKSA9PSAwKSB7CiAgICAgICAgIGlmIChvdXQpIG91dC0+ZGVuc2l0eSA9IFJlc1RhYmxlX2NvbmZpZzo6REVOU0lUWV9ISUdIOwogICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZS5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvU3VwcGxpY2FudFN0YXRlLmphdmEKaW5kZXggNmI3OTIxMC4uOTFlNjg1ZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvU3VwcGxpY2FudFN0YXRlLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvU3VwcGxpY2FudFN0YXRlLmphdmEKQEAgLTM5LDYgKzM5LDE1IEBACiAgICAgRElTQ09OTkVDVEVELAogCiAgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGlzIGRpc2FibGVkCisgICAgICogPHAvPgorICAgICAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBpZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgaXMgZGlzYWJsZWQuCisgICAgICogd3BhX3N1cHBsaWNhbnQgcmVmdXNlcyBhbnkgbmV3IG9wZXJhdGlvbnMgdGhhdCB3b3VsZAorICAgICAqIHVzZSB0aGUgcmFkaW8gdW50aWwgdGhlIGludGVyZmFjZSBoYXMgYmVlbiBlbmFibGVkLgorICAgICAqLworICAgIElOVEVSRkFDRV9ESVNBQkxFRCwKKworICAgIC8qKgogICAgICAqIEluYWN0aXZlIHN0YXRlICh3cGFfc3VwcGxpY2FudCBkaXNhYmxlZCkuCiAgICAgICogPHAvPgogICAgICAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBpZiB0aGVyZSBhcmUgbm8gZW5hYmxlZCBuZXR3b3JrcyBpbiB0aGUKQEAgLTU3LDYgKzY2LDE1IEBACiAgICAgU0NBTk5JTkcsCiAKICAgICAvKioKKyAgICAgKiBUcnlpbmcgdG8gYXV0aGVudGljYXRlIHdpdGggYSBCU1MvU1NJRAorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgd2hlbiB3cGFfc3VwcGxpY2FudCBoYXMgZm91bmQgYSBzdWl0YWJsZSBCU1MKKyAgICAgKiB0byBhdXRoZW50aWNhdGUgd2l0aCBhbmQgdGhlIGRyaXZlciBpcyBjb25maWd1cmVkIHRvIHRyeSB0bworICAgICAqIGF1dGhlbnRpY2F0ZSB3aXRoIHRoaXMgQlNTLgorICAgICAqLworICAgIEFVVEhFTlRJQ0FUSU5HLAorCisgICAgLyoqCiAgICAgICogVHJ5aW5nIHRvIGFzc29jaWF0ZSB3aXRoIGEgQlNTL1NTSUQuCiAgICAgICogPHAvPgogICAgICAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCB3aGVuIHdwYV9zdXBwbGljYW50IGhhcyBmb3VuZCBhIHN1aXRhYmxlIEJTUwpAQCAtMTUyLDggKzE3MCwzMyBAQAogICAgICAgICByZXR1cm4gc3RhdGUgIT0gVU5JTklUSUFMSVpFRCAmJiBzdGF0ZSAhPSBJTlZBTElEOwogICAgIH0KIAorCisgICAgLyogU3VwcGxpY2FudCBhc3NvY2lhdGluZyBvciBhdXRoZW50aWNhdGluZyBpcyBjb25zaWRlcmVkIGEgaGFuZHNoYWtlIHN0YXRlICovCisgICAgc3RhdGljIGJvb2xlYW4gaXNIYW5kc2hha2VTdGF0ZShTdXBwbGljYW50U3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc3dpdGNoKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEFVVEhFTlRJQ0FUSU5HOgorICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVElORzoKKyAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRFRDoKKyAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgorICAgICAgICAgICAgY2FzZSBHUk9VUF9IQU5EU0hBS0U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIENPTVBMRVRFRDoKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfRElTQUJMRUQ6CisgICAgICAgICAgICBjYXNlIElOQUNUSVZFOgorICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKKyAgICAgICAgICAgIGNhc2UgRE9STUFOVDoKKyAgICAgICAgICAgIGNhc2UgVU5JTklUSUFMSVpFRDoKKyAgICAgICAgICAgIGNhc2UgSU5WQUxJRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gc3VwcGxpY2FudCBzdGF0ZSIpOworICAgICAgICB9CisgICAgfQorCiAgICAgc3RhdGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZSkgewogICAgICAgICBzd2l0Y2goc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQVVUSEVOVElDQVRJTkc6CiAgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgogICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVEVEOgogICAgICAgICAgICAgY2FzZSBGT1VSX1dBWV9IQU5EU0hBS0U6CkBAIC0xNjEsNiArMjA0LDcgQEAKICAgICAgICAgICAgIGNhc2UgQ09NUExFVEVEOgogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICBjYXNlIElOVEVSRkFDRV9ESVNBQkxFRDoKICAgICAgICAgICAgIGNhc2UgSU5BQ1RJVkU6CiAgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgogICAgICAgICAgICAgY2FzZSBET1JNQU5UOgpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvU3VwcGxpY2FudFN0YXRlVHJhY2tlci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvU3VwcGxpY2FudFN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDlhZTI2ZGEuLjBjNGY5ZjYgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9TdXBwbGljYW50U3RhdGVUcmFja2VyLmphdmEKQEAgLTk4LDEyICs5OCwxNiBAQAogICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJTdXBwbGljYW50IHN0YXRlOiAiICsgc3VwU3RhdGUudG9TdHJpbmcoKSArICJcbiIpOwogCiAgICAgICAgIHN3aXRjaCAoc3VwU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RTdGF0ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOVEVSRkFDRV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAvL3dlIHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgZGlzY29ubmVjdGlvbiBhbHJlYWR5LCBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgogICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU2NhblN0YXRlKTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVVUSEVOVElDQVRJTkc6CiAgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgogICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVEVEOgogICAgICAgICAgICAgY2FzZSBGT1VSX1dBWV9IQU5EU0hBS0U6CkBAIC0yNTAsMTAgKzI1NCw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBXaWZpU3RhdGVNYWNoaW5lLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgogICAgICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CiAgICAgICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZSA9IHN0YXRlQ2hhbmdlUmVzdWx0LnN0YXRlOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFUSU5HIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRk9VUl9XQVlfSEFORFNIQUtFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkdST1VQX0hBTkRTSEFLRSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoU3VwcGxpY2FudFN0YXRlLmlzSGFuZHNoYWtlU3RhdGUoc3RhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxvb3BEZXRlY3RJbmRleCA+IHN0YXRlLm9yZGluYWwoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wRGV0ZWN0Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTI5NiwxMiArMjk3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKICAgICAgICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN0YXRlID0gc3RhdGVDaGFuZ2VSZXN1bHQuc3RhdGU7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlLCBtQXV0aEZhaWx1cmVJblN1cHBsaWNhbnRCcm9hZGNhc3QpOwotICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgYSByZS1hdXRoIGluIGNvbXBsZXRlZCBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFUSU5HIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRk9VUl9XQVlfSEFORFNIQUtFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkdST1VQX0hBTkRTSEFLRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlIGFueSBjb25uZWN0aW5nIHN0YXRlIGluIGNvbXBsZXRlZCBzdGF0ZS4gR3JvdXAgcmUta2V5aW5nCisgICAgICAgICAgICAgICAgICAgICAqIGV2ZW50cyBhbmQgb3RoZXIgYXV0aCBldmVudHMgdGhhdCBkbyBub3QgYWZmZWN0IGNvbm5lY3Rpdml0eSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICogaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFN1cHBsaWNhbnRTdGF0ZS5pc0Nvbm5lY3Rpbmcoc3RhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uT25TdXBwbGljYW50U3RhdGVDaGFuZ2Uoc3RhdGVDaGFuZ2VSZXN1bHQpOwpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUluZm8uamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlJbmZvLmphdmEKaW5kZXggZjYwYWU0OC4uZTM2NjFiZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUluZm8uamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpSW5mby5qYXZhCkBAIC00MSw4ICs0MSwxMCBAQAogCiAgICAgc3RhdGljIHsKICAgICAgICAgc3RhdGVNYXAucHV0KFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQsIERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICAgICAgc3RhdGVNYXAucHV0KFN1cHBsaWNhbnRTdGF0ZS5JTlRFUkZBQ0VfRElTQUJMRUQsIERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKTsKICAgICAgICAgc3RhdGVNYXAucHV0KFN1cHBsaWNhbnRTdGF0ZS5JTkFDVElWRSwgRGV0YWlsZWRTdGF0ZS5JRExFKTsKICAgICAgICAgc3RhdGVNYXAucHV0KFN1cHBsaWNhbnRTdGF0ZS5TQ0FOTklORywgRGV0YWlsZWRTdGF0ZS5TQ0FOTklORyk7CisgICAgICAgIHN0YXRlTWFwLnB1dChTdXBwbGljYW50U3RhdGUuQVVUSEVOVElDQVRJTkcsIERldGFpbGVkU3RhdGUuQ09OTkVDVElORyk7CiAgICAgICAgIHN0YXRlTWFwLnB1dChTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRJTkcsIERldGFpbGVkU3RhdGUuQ09OTkVDVElORyk7CiAgICAgICAgIHN0YXRlTWFwLnB1dChTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRFRCwgRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HKTsKICAgICAgICAgc3RhdGVNYXAucHV0KFN1cHBsaWNhbnRTdGF0ZS5GT1VSX1dBWV9IQU5EU0hBS0UsIERldGFpbGVkU3RhdGUuQVVUSEVOVElDQVRJTkcpOwo=